diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 20121d0..c97b84c 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -353,6 +353,7 @@ function onMessage(event: MessageEvent): void { appId: 'calendar', subtitle: new Intl.DateTimeFormat(phone.lang, { hour: '2-digit', + hourCycle: 'h23', minute: '2-digit', }).format(startsAt), text: @@ -747,10 +748,21 @@ onBeforeUnmount(() => { v-if="phone.isOpen || notifications.current" class="phone-resolution-wrapper phone-resolution-wrapper--primary" > -
+
{ :class="{ dark: phone.isDarkMode, 'phone-app--light': !phone.isDarkMode, + [`phone-app--${phone.preferences.settings.graphicsMode}`]: true, 'phone-app--unlocking': isUnlocking, }" > diff --git a/frontend/src/assets/img/frames/cyan.webp b/frontend/src/assets/img/frames/cyan.webp new file mode 100644 index 0000000..68dec4b Binary files /dev/null and b/frontend/src/assets/img/frames/cyan.webp differ diff --git a/frontend/src/assets/img/frames/gold.webp b/frontend/src/assets/img/frames/gold.webp new file mode 100644 index 0000000..6ea434b Binary files /dev/null and b/frontend/src/assets/img/frames/gold.webp differ diff --git a/frontend/src/assets/img/frames/lime.webp b/frontend/src/assets/img/frames/lime.webp new file mode 100644 index 0000000..10a8a37 Binary files /dev/null and b/frontend/src/assets/img/frames/lime.webp differ diff --git a/frontend/src/assets/img/frames/orange.webp b/frontend/src/assets/img/frames/orange.webp new file mode 100644 index 0000000..7449ee7 Binary files /dev/null and b/frontend/src/assets/img/frames/orange.webp differ diff --git a/frontend/src/assets/img/frames/pink.webp b/frontend/src/assets/img/frames/pink.webp new file mode 100644 index 0000000..be98b42 Binary files /dev/null and b/frontend/src/assets/img/frames/pink.webp differ diff --git a/frontend/src/assets/img/frames/purple.webp b/frontend/src/assets/img/frames/purple.webp new file mode 100644 index 0000000..4eaa3cc Binary files /dev/null and b/frontend/src/assets/img/frames/purple.webp differ diff --git a/frontend/src/assets/img/frames/red.webp b/frontend/src/assets/img/frames/red.webp index 7b37070..d463da5 100644 Binary files a/frontend/src/assets/img/frames/red.webp and b/frontend/src/assets/img/frames/red.webp differ diff --git a/frontend/src/assets/img/frames/rgb.webp b/frontend/src/assets/img/frames/rgb.webp new file mode 100644 index 0000000..4762a9e Binary files /dev/null and b/frontend/src/assets/img/frames/rgb.webp differ diff --git a/frontend/src/assets/img/frames/teal.webp b/frontend/src/assets/img/frames/teal.webp new file mode 100644 index 0000000..d9bd72e Binary files /dev/null and b/frontend/src/assets/img/frames/teal.webp differ diff --git a/frontend/src/assets/img/frames/yellow.webp b/frontend/src/assets/img/frames/yellow.webp new file mode 100644 index 0000000..f4bc686 Binary files /dev/null and b/frontend/src/assets/img/frames/yellow.webp differ diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index ed8945a..8e0c5ea 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -324,6 +324,81 @@ button { .phone-app--light { color-scheme: light; } + +/* FiveM CEF blur-free glass fallback. Ultimate keeps the native effects. */ +.phone-app--performance { + --phone-performance-glass: rgb(28 28 31 / 96%); +} +.phone-app--performance.phone-app--light { + --phone-performance-glass: rgb(245 245 248 / 97%); +} +.phone-device.phone-app--performance { + filter: none; +} +.phone-app--performance, +.phone-app--performance *, +.phone-app--performance *::before, +.phone-app--performance *::after { + backdrop-filter: none !important; + -webkit-backdrop-filter: none !important; +} +.phone-app--performance .k-glass { + background-color: var(--phone-performance-glass) !important; +} +.phone-app--performance .control-center__backdrop { + background: rgb(20 20 24 / 92%); +} +.phone-app--performance .app-dock { + background-color: rgb(38 38 46 / 92%); +} +.phone-app--performance .widget { + background-color: rgb(21 24 34 / 95%); +} +.phone-app--performance .app-library-search, +.phone-app--performance .app-search, +.phone-app--performance .app-library-group__icons { + background-color: rgb(18 18 25 / 92%); +} +.phone-app--performance .app-library-all { + background-color: rgb(9 9 16 / 97%); +} +.phone-screen--app .phone-app--performance .springboard, +.phone-app--performance .lock-screen__time, +.phone-app--performance .lock-screen-leave-to, +.phone-app--performance .minesweeper-marker-drop__trail, +.phone-app--performance .flappy-clouds i::after { + filter: none !important; +} +.phone-app--performance .springboard { + transition-property: transform !important; +} +.phone-app--performance .lock-screen { + will-change: transform, opacity; +} +.phone-app--performance .lock-screen-leave-active { + transition-property: transform, opacity !important; +} +.phone-app--performance .sim-picker__glow, +.phone-app--performance .banking-app__aurora { + display: none; +} + +/* Chromium 103 cannot resolve color-mix() when the mixed color is a variable. */ +@supports not (color: color-mix(in srgb, white, black)) { + .flappy-menu__tower, + .flappy-obstacle span { + background: var(--tower); + } + + .flappy-menu__tower::after { + border: 3px solid var(--tower); + background: var(--tower); + } + + .flappy-obstacle span::after { + background: var(--tower); + } +} .phone-display-dimmer { position: absolute; z-index: 99; @@ -369,7 +444,7 @@ button { color: #fff; display: flex; justify-content: space-between; - align-items: flex-start; + align-items: center; font-size: 17px; font-weight: 600; line-height: 20px; @@ -377,6 +452,12 @@ button { text-shadow: 0 1px 3px #0009; pointer-events: none; } +.phone-status-bar__time { + position: absolute; + left: 0; + width: calc(50% - 70px); + text-align: center; +} .phone-status-bar__indicators { position: absolute; top: 0; @@ -483,13 +564,13 @@ button { .lock-screen__status { position: absolute; z-index: 1; - top: 11px; - right: 26px; - left: 26px; + top: 17px; + right: 30px; + left: 30px; display: flex; align-items: center; justify-content: flex-end; - min-height: 18px; + min-height: 26px; filter: drop-shadow(0 1px 2px #0009); } .lock-screen__lock { @@ -505,7 +586,7 @@ button { right: 0; display: flex; align-items: center; - gap: 3px; + gap: 6px; } .lock-screen__content { position: relative; @@ -5987,6 +6068,7 @@ button { } .messages-inbox-page .messages-conversation:active, .messages-inbox-page .messages-conversation--selected { + background: var(--messages-inbox-control); background: color-mix( in srgb, var(--messages-inbox-control) 86%, diff --git a/frontend/src/components/NotificationPhonePreview.vue b/frontend/src/components/NotificationPhonePreview.vue index 342f9b6..2033906 100644 --- a/frontend/src/components/NotificationPhonePreview.vue +++ b/frontend/src/components/NotificationPhonePreview.vue @@ -37,9 +37,19 @@ const wrapperStyle = computed(() => ({ zoom: props.zoom })) >
-
+
(() => ({ zoom: props.zoom })) :class="{ dark: isDarkMode, 'phone-app--light': !isDarkMode, + [`phone-app--${preferences.settings.graphicsMode}`]: true, }" >
import { kFab } from 'konsta/vue' -import { - BatteryMedium, - Camera, - Flashlight, - LockKeyhole, - Signal, - Wifi, -} from 'lucide-vue-next' +import { Camera, Flashlight, LockKeyhole } from 'lucide-vue-next' import { computed, onBeforeUnmount, onMounted, ref } from 'vue' +import PhoneStatusIndicators from '@/components/PhoneStatusIndicators.vue' import { usePhoneStore } from '@/stores/phone' import { nuiCall } from '@/utils/nui' @@ -41,7 +35,8 @@ const date = computed(() => ) const time = computed(() => new Intl.DateTimeFormat(phone.lang, { - hour: 'numeric', + hour: '2-digit', + hourCycle: 'h23', minute: '2-digit', }) .formatToParts(now.value) @@ -140,11 +135,7 @@ onBeforeUnmount(() => {
- +
-import { BatteryMedium, Plane, Signal, Wifi } from 'lucide-vue-next' import { onBeforeUnmount, onMounted, ref } from 'vue' +import PhoneStatusIndicators from '@/components/PhoneStatusIndicators.vue' import { usePhoneStore } from '@/stores/phone' const phone = usePhoneStore() @@ -13,7 +13,8 @@ let intervalId: number | undefined function updateTime(): void { time.value = new Intl.DateTimeFormat([], { - hour: 'numeric', + hour: '2-digit', + hourCycle: 'h23', minute: '2-digit', }).format(new Date()) } @@ -30,7 +31,7 @@ onBeforeUnmount(() => { diff --git a/frontend/src/components/PhoneStatusIndicators.vue b/frontend/src/components/PhoneStatusIndicators.vue new file mode 100644 index 0000000..ea093bd --- /dev/null +++ b/frontend/src/components/PhoneStatusIndicators.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/frontend/src/components/SimPhonePicker.vue b/frontend/src/components/SimPhonePicker.vue index 23f5bb3..f5e0a4e 100644 --- a/frontend/src/components/SimPhonePicker.vue +++ b/frontend/src/components/SimPhonePicker.vue @@ -48,7 +48,11 @@ function close(): void {