diff --git a/frontend/.gitignore b/frontend/.gitignore index b482045..5fd4f20 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -4,3 +4,6 @@ dist/ *.local dev-server*.log +# Image-generation source files retained locally for asset iteration. +/src/assets/img/weather-icons/source/ + diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 97b52bb..8830222 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -116,6 +116,7 @@ type CalendarReminderData = { const REFERENCE_VIEWPORT_WIDTH = 1920 const REFERENCE_VIEWPORT_HEIGHT = 1080 const PHONE_BASE_SCALE = 0.69 +const DEVELOPMENT_PHONE_SCALE = 1.25 const isDevelopment = import.meta.env.DEV const phone = usePhoneStore() @@ -145,7 +146,10 @@ const controlCenterOpened = ref(false) const simPicker = ref(null) const systemColorScheme = window.matchMedia('(prefers-color-scheme: dark)') const viewportScale = ref(getViewportScale()) -const phoneBaseZoom = computed(() => viewportScale.value * PHONE_BASE_SCALE) +const phoneBaseZoom = computed(() => + viewportScale.value * + (isDevelopment ? DEVELOPMENT_PHONE_SCALE : PHONE_BASE_SCALE), +) const phoneResolutionStyle = computed(() => ({ '--phone-edge-gap': `${24 * viewportScale.value}px`, '--phone-stack-gap': `${16 * viewportScale.value}px`, diff --git a/frontend/src/assets/img/app-icons/garage.svg b/frontend/src/assets/img/app-icons/garage.svg new file mode 100644 index 0000000..85e2abb --- /dev/null +++ b/frontend/src/assets/img/app-icons/garage.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/img/weather-icons/clear.webp b/frontend/src/assets/img/weather-icons/clear.webp new file mode 100644 index 0000000..ea4240c Binary files /dev/null and b/frontend/src/assets/img/weather-icons/clear.webp differ diff --git a/frontend/src/assets/img/weather-icons/cloudy.webp b/frontend/src/assets/img/weather-icons/cloudy.webp new file mode 100644 index 0000000..3f2bc55 Binary files /dev/null and b/frontend/src/assets/img/weather-icons/cloudy.webp differ diff --git a/frontend/src/assets/img/weather-icons/fog.webp b/frontend/src/assets/img/weather-icons/fog.webp new file mode 100644 index 0000000..c8b0c59 Binary files /dev/null and b/frontend/src/assets/img/weather-icons/fog.webp differ diff --git a/frontend/src/assets/img/weather-icons/partly_cloudy.webp b/frontend/src/assets/img/weather-icons/partly_cloudy.webp new file mode 100644 index 0000000..4015ca9 Binary files /dev/null and b/frontend/src/assets/img/weather-icons/partly_cloudy.webp differ diff --git a/frontend/src/assets/img/weather-icons/rain.webp b/frontend/src/assets/img/weather-icons/rain.webp new file mode 100644 index 0000000..93b3116 Binary files /dev/null and b/frontend/src/assets/img/weather-icons/rain.webp differ diff --git a/frontend/src/assets/img/weather-icons/snow.webp b/frontend/src/assets/img/weather-icons/snow.webp new file mode 100644 index 0000000..2579ced Binary files /dev/null and b/frontend/src/assets/img/weather-icons/snow.webp differ diff --git a/frontend/src/assets/img/weather-icons/sunny.webp b/frontend/src/assets/img/weather-icons/sunny.webp new file mode 100644 index 0000000..d5a8ab3 Binary files /dev/null and b/frontend/src/assets/img/weather-icons/sunny.webp differ diff --git a/frontend/src/assets/img/weather-icons/thunder.webp b/frontend/src/assets/img/weather-icons/thunder.webp new file mode 100644 index 0000000..a61da1e Binary files /dev/null and b/frontend/src/assets/img/weather-icons/thunder.webp differ diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index 7d21444..cc0bbb3 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -1736,8 +1736,9 @@ button { height: 100%; overflow: hidden; background: - radial-gradient(circle at 92% 4%, rgb(45 118 255 / 28%), transparent 32%), - linear-gradient(160deg, #0c1834 0%, #080d1d 44%, #050710 100%) !important; + radial-gradient(ellipse at 50% -8%, rgb(26 185 187 / 34%), transparent 42%), + radial-gradient(circle at 92% 18%, rgb(45 118 255 / 24%), transparent 34%), + linear-gradient(180deg, #071a2a 0%, #081220 40%, #060910 100%) !important; color: #fff; isolation: isolate; } @@ -1746,25 +1747,26 @@ button { position: absolute; z-index: -1; inset: 0; - background-image: - linear-gradient(rgb(255 255 255 / 2.4%) 1px, transparent 1px), - linear-gradient(90deg, rgb(255 255 255 / 2.4%) 1px, transparent 1px); - background-size: 42px 42px; + background: + radial-gradient(circle at 8% 54%, rgb(28 210 183 / 10%), transparent 31%), + radial-gradient(circle at 78% 72%, rgb(77 75 255 / 9%), transparent 30%), + linear-gradient(180deg, rgb(255 255 255 / 2.5%), transparent 32%); content: ''; - mask-image: linear-gradient(to bottom, #000, transparent 66%); + pointer-events: none; } .banking-app__aurora { position: absolute; z-index: -1; - width: 240px; - height: 180px; - top: 160px; - left: -145px; + width: 270px; + height: 210px; + top: 92px; + right: -178px; border-radius: 50%; - background: #215dea; - filter: blur(78px); - opacity: 0.2; + background: #2c8cff; + filter: blur(88px); + opacity: 0.18; + pointer-events: none; } .banking-navbar { @@ -1913,7 +1915,8 @@ button { color: #fff; } -.banking-action--primary svg:last-child { +.banking-action--primary > .lucide-chevron-right { + flex: 0 0 auto; margin-left: auto; opacity: 0.78; } @@ -2112,6 +2115,29 @@ button { .banking-form-list { margin: 12px 0 0 !important; } +.banking-contact-picker { + margin-top: 12px; +} + +.banking-contact-picker > span { + display: block; + margin: 0 4px 6px; + color: rgb(213 225 248 / 52%); + font-size: 9px; +} + +.banking-contact-picker > div { + max-height: 118px; + margin: 0 !important; + overflow-y: auto; +} + +.banking-contact-picker > p { + margin: 0 4px; + color: rgb(213 225 248 / 42%); + font-size: 9px; +} + .banking-sheet__content .banking-form-error { margin: 10px 3px 0; color: #ff8b98; @@ -2274,7 +2300,8 @@ button { font-size: 11px; font-weight: 650; } -.weather-hour svg { +.weather-hour svg, +.weather-hour img { margin: 5px 0; } .weather-hour small { @@ -2287,52 +2314,6 @@ button { margin-top: auto; font-size: 15px; } -.weather-day { - display: grid; - align-items: center; - grid-template-columns: 55px 45px 28px 1fr 28px; - min-height: 48px; - margin: 0 12px; - border-bottom: 1px solid #ffffff18; - font-size: 13px; -} -.weather-day:last-child { - border-bottom: 0; -} -.weather-day > strong { - font-weight: 650; -} -.weather-day__condition { - position: relative; - display: grid; - place-items: center; -} -.weather-day__condition small { - position: absolute; - top: 29px; - color: #66d2ff; - font-size: 8px; - font-weight: 700; -} -.weather-day__low { - color: #ffffff7d; -} -.weather-day__range { - position: relative; - height: 4px; - margin: 0 4px; - overflow: hidden; - border-radius: 999px; - background: #07122755; -} -.weather-day__range i { - position: absolute; - left: var(--range-left); - width: var(--range-width); - height: 100%; - border-radius: inherit; - background: linear-gradient(90deg, #68d8ff, #7de4b7 55%, #ffd55e); -} .weather-empty { position: absolute; inset: 90px 20px 25px; @@ -2344,7 +2325,8 @@ button { color: #ffffffd9; text-align: center; } -.weather-empty > svg { +.weather-empty > svg, +.weather-empty > img { opacity: 0.75; } .weather-spin { diff --git a/frontend/src/components/PhoneHomeIndicator.vue b/frontend/src/components/PhoneHomeIndicator.vue index 9618d40..823d2ae 100644 --- a/frontend/src/components/PhoneHomeIndicator.vue +++ b/frontend/src/components/PhoneHomeIndicator.vue @@ -6,17 +6,23 @@ import { usePhoneStore } from '@/stores/phone' const route = useRoute() const router = useRouter() const phone = usePhoneStore() -const isApp = computed(() => route.name === 'app') +const HOME_PAGE = 1 +const canGoHome = computed( + () => route.name !== 'home' || phone.currentPage !== HOME_PAGE, +) function goHome(): void { - if (isApp.value) void router.push('/') + if (!canGoHome.value) return + + phone.setCurrentPage(HOME_PAGE) + if (route.name !== 'home') void router.push('/') }