From 1071b4bde7748e8ec38f2af69eff1877bda67938 Mon Sep 17 00:00:00 2001 From: "Leon.Schmidt" Date: Sun, 16 Aug 2026 15:23:21 +0200 Subject: [PATCH] feat: unify phone apps with Sky UI --- frontend/src/App.vue | 44 +- frontend/src/assets/img/app-icons/feather.svg | 15 + .../src/assets/img/app-icons/local-pages.webp | Bin 0 -> 15920 bytes .../src/assets/img/weather-icons/clear.webp | Bin 0 -> 16000 bytes frontend/src/assets/main.css | 144 +- frontend/src/components/AlarmEditor.vue | 37 +- frontend/src/components/AlarmSoundMenu.vue | 7 +- frontend/src/components/AppIcon.vue | 15 +- frontend/src/components/CustomAppFrame.vue | 9 +- .../account/AccountLogoutDialog.vue | 6 +- .../src/components/account/AppProfileAuth.vue | 22 +- .../src/components/account/IfruitAppAuth.vue | 35 +- .../components/citymarkt/CityMarktSelect.vue | 2 +- .../components/feather/FeatherPostCard.vue | 10 +- frontend/src/ui/SkyAppPage.vue | 13 +- frontend/src/ui/SkyNavbar.test.ts | 22 + frontend/src/ui/SkyNavbar.vue | 39 +- frontend/src/ui/SkyTabBar.test.ts | 15 + frontend/src/ui/SkyTabBar.vue | 27 +- frontend/src/ui/controls.css | 4 +- frontend/src/ui/controls/SkyLink.vue | 6 +- .../src/ui/controls/SkyNavbarBackLink.vue | 11 +- frontend/src/ui/controls/SkySearchbar.vue | 5 +- frontend/src/ui/controls/SkyTabButton.vue | 36 +- frontend/src/ui/foundation.css | 21 + .../src/views/apps/AppTheme.contract.test.ts | 53 + .../views/apps/BankingApp.contract.test.ts | 40 + frontend/src/views/apps/BankingApp.vue | 282 +- .../views/apps/BillingApp.contract.test.ts | 42 + frontend/src/views/apps/BillingApp.vue | 364 ++- frontend/src/views/apps/CalculatorApp.vue | 38 +- frontend/src/views/apps/CalendarApp.vue | 98 +- .../src/views/apps/CameraApp.contract.test.ts | 5 +- frontend/src/views/apps/CameraApp.vue | 59 +- frontend/src/views/apps/CityMarktApp.vue | 2339 +++++++++++++++-- .../src/views/apps/ClockApp.contract.test.ts | 17 +- frontend/src/views/apps/ClockApp.vue | 208 +- frontend/src/views/apps/CrewLinkApp.vue | 509 ++-- frontend/src/views/apps/DarkChatApp.vue | 2 +- frontend/src/views/apps/FeatherApp.vue | 613 ++--- frontend/src/views/apps/FlareApp.vue | 498 ++-- frontend/src/views/apps/FlipTokApp.vue | 2 +- frontend/src/views/apps/GalleryApp.vue | 241 +- frontend/src/views/apps/HealthApp.vue | 44 +- frontend/src/views/apps/HouseApp.vue | 204 +- frontend/src/views/apps/LocalPagesApp.vue | 147 +- frontend/src/views/apps/MailApp.vue | 243 +- frontend/src/views/apps/MapApp.vue | 276 +- frontend/src/views/apps/MusicApp.vue | 852 +++--- .../views/apps/NotesApp.menu.contract.test.ts | 4 +- frontend/src/views/apps/NotesApp.vue | 68 +- .../src/views/apps/PhoneApp.contract.test.ts | 6 + frontend/src/views/apps/PhoneApp.vue | 555 ++-- .../src/views/apps/SkyUiApps.contract.test.ts | 86 + frontend/src/views/apps/WeatherApp.vue | 54 +- frontend/src/views/apps/weazel-news-app.vue | 271 +- sky_phone/source/client/camera.lua | 26 +- sky_phone/source/client/focus.lua | 23 +- sky_phone/source/client/main.lua | 19 +- sky_phone/source/server/notes.lua | 2 +- tests/client_camera.lua | 125 + tests/client_focus.lua | 47 +- 62 files changed, 5658 insertions(+), 3349 deletions(-) create mode 100644 frontend/src/views/apps/AppTheme.contract.test.ts create mode 100644 frontend/src/views/apps/BankingApp.contract.test.ts create mode 100644 frontend/src/views/apps/BillingApp.contract.test.ts create mode 100644 frontend/src/views/apps/SkyUiApps.contract.test.ts create mode 100644 tests/client_camera.lua diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 9bf21f7..c980f76 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -10,6 +10,7 @@ import { } from 'vue' import { useRoute, useRouter } from 'vue-router' +import { SkyProvider } from '@/ui' import PhoneHomeIndicator from '@/components/PhoneHomeIndicator.vue' import PhoneControlCenter from '@/components/PhoneControlCenter.vue' import PhoneMediaCapture from '@/components/PhoneMediaCapture.vue' @@ -293,7 +294,6 @@ const activeAppId = computed(() => const WHITE_STATUS_BAR_APP_IDS = new Set([ 'calculator', 'camera', - 'darkchat', 'fliptok', 'neon-drop', 'sky-flappy', @@ -331,9 +331,7 @@ const activitySuspended = ref(false) const simPicker = ref(null) const setupRequired = computed( () => - !( - isDevelopment && setupDevelopmentSkipped.value - ) && + !(isDevelopment && setupDevelopmentSkipped.value) && (!phone.preferences.settings.setupCompleted || (isDevelopment && developmentParameters.has('setupPreview') && @@ -494,7 +492,10 @@ async function bootstrapUnlockedPhoneData(): Promise { try { await task() } catch (error) { - console.error('[sky_phone] Failed to bootstrap unlocked phone data.', error) + console.error( + '[sky_phone] Failed to bootstrap unlocked phone data.', + error, + ) } } } @@ -1476,7 +1477,6 @@ onBeforeUnmount(() => { :style="phoneDisplayStyle" :class="{ dark: phone.isDarkMode, - 'phone-app--darkchat': route.params.appId === 'darkchat', 'phone-app--light': !phone.isDarkMode, 'phone-app--messages': route.params.appId === 'messages', 'phone-app--status-light': @@ -1498,19 +1498,25 @@ onBeforeUnmount(() => { @lock="lockPhone" /> - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/img/app-icons/local-pages.webp b/frontend/src/assets/img/app-icons/local-pages.webp index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..91bd3b1a9ccad271768c125f5f3ca06f56fbe19f 100644 GIT binary patch literal 15920 zcmV-0KF`5YNk&E}J^%n$MM6+kP&gnQJ^%o4$^e}KDgXfh0X`iJg+ZYOHdmbl0C6n< z-yFac7mu!i=|3sIF1}dnpWHvW{%ZdL{}cS*;PyPdkNY1rj#>Xh{mcBf{U7n4|NfVM zt^cL|Z{26-U-%#4egOYU|HprB{~`Z7{Ad6Fn*Z1jdf(l@-F{Vk3;vt^xBj2`FW(=T z&+`B9Kgs)~{|EkO{onaN_WvLs)IYob!~E^|!}clt)b<1ZW&P*=$F0x*FZ4eNAJjkB z|K|Tm`~UPo{RjK6{ol|3kPrUepda>qKs?>}=jiw1f6afF{_Fce=uhKcRsH+&ll$NP z{sF)4y$Jq6_)qfR;s0gt>X{mKf3?N{}cPI@Dcd0^Iz}(+`nqSy8h+;5PQGu zSD5C_{(Jt1`2S$PXTFpEkNijN|M-vG53WCn|1;>%^WWyb*n5G0NdC3{Tl=T(FYo`o zPlb1@`vCtq{?GoS{IBl^`Jbl0=zr_~r2k#}OYWcY@9>}Wzr}y9{iXX5{!#sN{YUs8 z@qhP!#{d8S<@aywXZEw%YxR%*vv8TN7SU-$vM#s;r2-y>=Q8-Q{l47BHYOGg^)N2C zc;M(RQ?~0|%-UbznS%I9YtZV)j9_H{ziy)N^=J~I_#_hIFoHaD-MSeHs zFBW2q1Vsi!n7-NtdMl393P}22N3{OHw@PWJpE(hOgU6&S1`4R=_x!Dc>t(y3pS^T{ zu{=u7nT+Z!neVxn+lS9J!+ZMzA`N3M(e^-NPe!S^oD#-M=>_pMpF{wd&Y)5R>~n%+ zS2b4Z7pfs^pGkVVu0Af#Xv4mCwT5-?7C<>Du11M_Z@DuHH_#bJe|)C)Qe-|aH5^`Y zr`JBN6lZj})k@%$4-iHKe+mb7g!ZZa#d+jucKm#(*AkMT1?U;MN57fii}f-}QJY4F z|2*Xjb7K`v=~Y>WBdd4%zq$VYy+6=+)eJ(lm4q(J@C~=F@(W=*qo5{P%r9@3|8Mjz z!cv{v$%Vd_Hi&)_B_tL}R+XXze4qoKS(ewfE{uH?=rVb>;?*vwECEp6U{kF3X*Ll^ zi9bhZ7p7*y#*~voL)EIu0S01XH#pzlMn*uATPipQc96>P1>}>gMQufZ&-?>((gq8% za-(9M`#FiKVcRG@xh``3ex3n!8!X*~wY2C$aWI)j&#Ui7y}G}rtZw?ypaWx4X2LZ# zn(8BmEcxO4kMd@e7eJ;OWTrn-NcPa(7m8zT&r`WwQX*+hd|@|FUhsQt zvUc|+y0@e6Sg=*0^`QWA-j(eB5hUt>0d#-W_zqe@n|Xp47FM5c_^{*Y|bE%sp|vrr^@i98o$~CPPv7@)&4EI-XV68P4ppwE2NE`DA#OzZcx+) z-O$OnNmP9iC32NX;dhqReqi-Vy2W3_)el%i)2e-%nFHb0$BOP#-rkR1IA*{OflLpa zuAF?!iG~)yz2kolDUleHCP(Wd=*)hFsCPpRWnJtmiMR9Sovf!|R{?s;1bs3V5uRS$ zq9}T6doFXx#Jt_Ag(Og$Wt~?j9)o`^`6+?j %mK1n{0wanLjx~j~Y(xKqLIZVV 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/weather-icons/clear.webp b/frontend/src/assets/img/weather-icons/clear.webp index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ea4240c7b636a89268d9fc6136bf5ecb9b18a354 100644 GIT binary patch literal 16000 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index 84d8af8..4e2c2cf 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -347,6 +347,10 @@ button { color-scheme: light; } +.phone-app-theme { + display: contents; +} + /* FiveM CEF blur-free glass fallback. Ultimate keeps the native effects. */ .phone-app--performance { --phone-performance-glass: rgb(28 28 31 / 96%); @@ -390,12 +394,7 @@ button { --tw-scale-x: 1 !important; --tw-scale-y: 1 !important; --tw-scale-z: 1 !important; - transform: - translate3d( - var(--tw-translate-x, 0), - var(--tw-translate-y, 0), - 0 - ) + transform: translate3d(var(--tw-translate-x, 0), var(--tw-translate-y, 0), 0) scale(1) !important; } .phone-app--performance .k-glass { @@ -403,8 +402,7 @@ button { } /* Konsta's default background utility is the solid-surface opt-in marker. Custom color utilities replace it, so semantic Glass colors stay intact. */ -.phone-app--performance - .k-glass:where([class~='bg-ios-light-glass']) { +.phone-app--performance .k-glass:where([class~='bg-ios-light-glass']) { background: var(--phone-performance-glass) !important; } .phone-app--performance @@ -1402,17 +1400,6 @@ button { } } -/* DarkChat is intentionally independent from the phone appearance setting. */ -.phone-app--darkchat, -.phone-app--darkchat .phone-app-window, -.phone-app--darkchat .phone-app-window__content { - background: #000 !important; - color-scheme: dark; -} -.phone-app--darkchat .phone-status-bar { - color: #fff !important; - --status-bar-color: #fff; -} .app-icon--darkchat { background: #050507; } @@ -2847,6 +2834,8 @@ button { padding: 0; border: 1px solid #ffffff73; box-shadow: 0 1px 4px #0009; + background: #8e8e93; + color: #000; } .app-icon-item--editing:not(.app-icon-item--dragging) .app-icon-button { animation: app-icon-wobble 0.15s ease-in-out infinite alternate; @@ -3412,8 +3401,8 @@ button { padding-top: 46px; padding-bottom: 25px; overflow: hidden; - background: #000; - color: #fff; + background: var(--sky-bg); + color: var(--sky-text); } .weather-app { @@ -3564,7 +3553,12 @@ button { infinite; } .weather-app__sun-glow { - background: radial-gradient(circle at 74% 18%, #ffe6a766 0 5%, #ffcb6c28 14%, transparent 31%); + background: radial-gradient( + circle at 74% 18%, + #ffe6a766 0 5%, + #ffcb6c28 14%, + transparent 31% + ); } .weather-app__stars { background: @@ -3721,7 +3715,7 @@ button { } .banking-navbar { - --k-safe-area-top: 46px; + --sky-navbar-safe-area-top: 46px; position: absolute; z-index: 5; top: 0; @@ -3774,6 +3768,14 @@ button { text-align: center; } +.banking-empty { + min-height: 0; + margin: 0; + padding: 24px; + border: 0; + background: transparent; +} + .banking-empty p { margin: 0 0 8px; color: rgb(208 220 248 / 58%); @@ -4124,15 +4126,63 @@ button { line-height: 1.4; } -.banking-sheet__content > button:last-child { - margin-top: 15px; -} - -.banking-sheet__content > button:last-child > span { +.banking-sheet__content > .sky-button:last-child { display: flex; align-items: center; justify-content: center; gap: 8px; + margin-top: 15px; +} + +.phone-app--light .banking-app { + --bank-green: #168b5b; + background: + radial-gradient(ellipse at 50% -8%, rgb(65 203 205 / 24%), transparent 42%), + radial-gradient(circle at 92% 18%, rgb(45 118 255 / 16%), transparent 34%), + linear-gradient(180deg, #edf9fb 0%, #f4f7fc 42%, #eef1f7 100%) !important; + color: var(--sky-text); +} + +.phone-app--light .banking-app::before { + background: + radial-gradient(circle at 8% 54%, rgb(28 170 153 / 8%), transparent 31%), + radial-gradient(circle at 78% 72%, rgb(77 75 255 / 6%), transparent 30%), + linear-gradient(180deg, rgb(255 255 255 / 38%), transparent 32%); +} + +.phone-app--light .banking-navbar { + color: var(--sky-text); +} + +.phone-app--light .banking-loading, +.phone-app--light .banking-empty, +.phone-app--light .banking-empty p, +.phone-app--light .banking-balance__label, +.phone-app--light .banking-balance__trend, +.phone-app--light .banking-action, +.phone-app--light .banking-section-title > svg, +.phone-app--light .banking-no-transactions, +.phone-app--light .banking-activity-hero span, +.phone-app--light .banking-activity-hero small, +.phone-app--light .banking-chart-legend, +.phone-app--light .banking-chart__day span, +.phone-app--light .banking-modal__close, +.phone-app--light .banking-sheet__content > p, +.phone-app--light .banking-contact-picker > span, +.phone-app--light .banking-contact-picker > p { + color: var(--sky-muted); +} + +.phone-app--light .banking-balance__label small, +.phone-app--light .banking-no-transactions, +.phone-app--light .banking-modal__close { + border-color: var(--sky-hairline); + background: rgb(255 255 255 / 52%); +} + +.phone-app--light .banking-action--primary, +.phone-app--light .banking-action--primary .banking-action__icon { + color: #ffffff; } .weather-scroll { z-index: 1; @@ -4146,7 +4196,9 @@ button { justify-content: center; margin-top: -56px; opacity: 0; - transition: opacity 160ms ease, transform 160ms ease; + transition: + opacity 160ms ease, + transform 160ms ease; pointer-events: none; } .weather-pull-refresh.is-visible { @@ -4237,9 +4289,15 @@ button { margin-top: 2px; color: #b7d9ec; } -.weather-detail-card:nth-child(1) svg { color: var(--weather-accent-gold); } -.weather-detail-card:nth-child(3) svg { color: #79d8d0; } -.weather-detail-card:nth-child(4) svg { color: var(--weather-accent-cyan); } +.weather-detail-card:nth-child(1) svg { + color: var(--weather-accent-gold); +} +.weather-detail-card:nth-child(3) svg { + color: #79d8d0; +} +.weather-detail-card:nth-child(4) svg { + color: var(--weather-accent-cyan); +} .weather-detail-card span { color: var(--weather-muted); font-size: 9px; @@ -4253,7 +4311,9 @@ button { font-weight: 680; line-height: 1.1; } -.weather-detail-card:nth-child(4) strong { color: var(--weather-accent-cyan); } +.weather-detail-card:nth-child(4) strong { + color: var(--weather-accent-cyan); +} .weather-panel { margin: 0; overflow: hidden; @@ -4270,7 +4330,10 @@ button { font-weight: 650; letter-spacing: -0.01em; } -.weather-panel h2 svg { color: var(--weather-accent-cyan); opacity: 0.8; } +.weather-panel h2 svg { + color: var(--weather-accent-cyan); + opacity: 0.8; +} .weather-hourly { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); @@ -4387,10 +4450,14 @@ button { min-height: 0; flex: 1; overflow-y: auto; - padding: 0; + padding: 0 0 + calc(var(--sky-tabbar-height) + var(--sky-safe-area-bottom) + 16px); } -.clock-navbar__empty-inner { - height: 0; +.clock-navbar.sky-navbar--no-navigation { + min-height: calc( + var(--sky-navbar-safe-area-top) + var(--sky-navbar-large-title-height) + ); + padding-top: var(--sky-navbar-safe-area-top); } .phone-call-content { min-height: 0; @@ -4564,6 +4631,9 @@ button { width: calc(100% - 32px); margin: 18px 16px 0; } +.clock-alarm-save.sky-link { + color: #ff9f0a; +} .clock-tool { margin: 0; padding: 0 16px; diff --git a/frontend/src/components/AlarmEditor.vue b/frontend/src/components/AlarmEditor.vue index 3c95e3a..0e63097 100644 --- a/frontend/src/components/AlarmEditor.vue +++ b/frontend/src/components/AlarmEditor.vue @@ -1,25 +1,21 @@ diff --git a/frontend/src/ui/SkyTabBar.test.ts b/frontend/src/ui/SkyTabBar.test.ts index 280ccee..ca12d1b 100644 --- a/frontend/src/ui/SkyTabBar.test.ts +++ b/frontend/src/ui/SkyTabBar.test.ts @@ -51,6 +51,21 @@ describe('SkyTabBar', () => { expect(html).toContain('sky-tabbar--labels') }) + it('keeps migrated component and styling hooks on their intended layers', async () => { + const html = await renderToString( + createSSRApp(SkyTabBar, { + bgClass: 'custom-background', + component: 'footer', + innerClass: 'custom-inner', + label: 'Navigation', + }), + ) + + expect(html).toMatch(/^