diff --git a/app/assets/css/app.css b/app/assets/css/app.css index ba86926a..24c32f14 100644 --- a/app/assets/css/app.css +++ b/app/assets/css/app.css @@ -12,6 +12,8 @@ --font-mono-jetbrains: JetbrainsMono; --radius-control: 0.375rem; + --radius-menu-item: 0.625rem; + --radius-popup: 1rem; --radius-surface: 0.625rem; --radius-dialog: 0.875rem; --radius-emphasis: 0.75rem; diff --git a/app/assets/css/interface.css b/app/assets/css/interface.css index e4c978de..a9b829a2 100644 --- a/app/assets/css/interface.css +++ b/app/assets/css/interface.css @@ -3,6 +3,8 @@ --ui-chrome: #f5f5f6; --ui-panel: #fafafa; --ui-popup: #fff; + --ui-popup-surface: var(--ui-popup); + --ui-popup-filter: none; --ui-field: #fff; --ui-hover: #e8e8eb; --ui-selected: #dedee3; @@ -55,6 +57,7 @@ --ui-chrome: #202020; --ui-panel: #242424; --ui-popup: #2b2b2b; + --ui-popup-surface: var(--ui-popup); --ui-field: #303030; --ui-hover: #383838; --ui-selected: #424242; @@ -67,7 +70,126 @@ --ui-shadow: 0 12px 36px rgb(0 0 0 / 30%), 0 2px 6px rgb(0 0 0 / 20%); } +@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) { + :root, + .dark { + --ui-popup-surface: color-mix(in srgb, var(--ui-popup) 55%, transparent); + --ui-popup-filter: blur(24px) saturate(140%); + } +} + +@media (prefers-reduced-transparency: reduce) { + :root, + .dark { + --ui-popup-surface: var(--ui-popup); + --ui-popup-filter: none; + } +} + @layer components { + .preview-card { + min-width: 0; + cursor: pointer; + border: 1px solid transparent; + border-radius: var(--radius-popup); + background-color: transparent; + color: var(--ui-muted); + transition: + background-color 120ms ease, + border-color 120ms ease, + color 120ms ease; + } + + .preview-card:hover { + background-color: var(--ui-hover); + color: var(--ui-text); + } + + .preview-card[aria-pressed='true'] { + border-color: var(--ui-focus); + background-color: var(--ui-selected); + color: var(--ui-text); + } + + .preview-card:focus-visible { + outline: 2px solid var(--ui-focus); + outline-offset: 2px; + } + + .preview-thumbnail { + isolation: isolate; + width: 100%; + overflow: hidden; + border: 1px solid var(--ui-line); + border-radius: 10px; + } + + .preview-caption { + display: block; + width: 100%; + overflow: hidden; + padding: 0 4px 2px; + font-size: 12px; + font-weight: 400; + line-height: 18px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + } + + .preview-selection, + .preview-action { + border: 1px solid var(--ui-line); + background: var(--ui-popup-surface); + -webkit-backdrop-filter: var(--ui-popup-filter); + backdrop-filter: var(--ui-popup-filter); + color: var(--ui-text); + box-shadow: 0 2px 6px rgb(0 0 0 / 12%); + } + + .preview-selection { + position: absolute; + top: 6px; + right: 6px; + z-index: 3; + display: flex; + width: 20px; + height: 20px; + align-items: center; + justify-content: center; + border-radius: 9999px; + pointer-events: none; + } + + .preview-swatch { + border-color: var(--ui-line); + border-radius: 12px; + } + + .preview-swatch:hover { + outline: 1px solid var(--ui-muted); + outline-offset: 2px; + } + + .preview-swatch[aria-pressed='true'] { + outline: 2px solid var(--ui-focus); + outline-offset: 2px; + } + + .preview-action { + cursor: pointer; + } + + @media (hover: none) { + .preview-action { + opacity: 1; + } + } + + .preview-action:hover { + background: var(--ui-hover); + } + .ui-navbar-button { display: flex; width: 32px; @@ -145,14 +267,16 @@ .ui-popup, .ui-dialog { border: 1px solid var(--ui-line); - background: var(--ui-popup); + background: var(--ui-popup-surface); + -webkit-backdrop-filter: var(--ui-popup-filter); + backdrop-filter: var(--ui-popup-filter); color: var(--ui-text); box-shadow: var(--ui-shadow); outline: none; } .ui-popup { - border-radius: var(--radius-surface); + border-radius: var(--radius-popup); transform-origin: var(--reka-popper-transform-origin, center); } @@ -166,7 +290,6 @@ .ui-dialog { border-radius: var(--radius-dialog); - background: var(--ui-panel); } .ui-dialog[data-state='open'] { @@ -216,7 +339,7 @@ .ui-menu-item { min-height: 28px; - border-radius: var(--radius-control); + border-radius: var(--radius-menu-item); color: var(--ui-text); outline: none; } @@ -237,6 +360,12 @@ opacity: 0.4; } + .ui-menu-separator { + height: 1px; + margin: 6px 8px; + background: var(--ui-line); + } + .ui-close { display: inline-flex; width: 28px; diff --git a/app/components/ButtonBackground.vue b/app/components/ButtonBackground.vue index d5c8d4bf..f03e9add 100644 --- a/app/components/ButtonBackground.vue +++ b/app/components/ButtonBackground.vue @@ -1,10 +1,10 @@ diff --git a/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue index ccac875c..00acf0e7 100644 --- a/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue +++ b/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -13,8 +13,5 @@ const delegatedProps = reactiveOmit(props, 'class'); diff --git a/app/components/ui/select/SelectSeparator.vue b/app/components/ui/select/SelectSeparator.vue index 2f862b9d..37cf3655 100644 --- a/app/components/ui/select/SelectSeparator.vue +++ b/app/components/ui/select/SelectSeparator.vue @@ -13,8 +13,5 @@ const delegatedProps = reactiveOmit(props, 'class'); diff --git a/app/components/ui/sonner/Sonner.vue b/app/components/ui/sonner/Sonner.vue index e5783c0a..46e847f0 100644 --- a/app/components/ui/sonner/Sonner.vue +++ b/app/components/ui/sonner/Sonner.vue @@ -15,8 +15,13 @@ const props = defineProps({ :rich-colors="props.richColors" class="toaster group" :toast-options="{ + style: { + background: 'var(--ui-popup-surface)', + backdropFilter: 'var(--ui-popup-filter)', + WebkitBackdropFilter: 'var(--ui-popup-filter)', + }, classes: { - toast: 'group toast group-[.toaster]:bg-white group-[.toaster]:text-zinc-950 group-[.toaster]:border-zinc-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-zinc-950 dark:group-[.toaster]:text-zinc-50 dark:group-[.toaster]:border-zinc-800', + toast: 'group toast group-[.toaster]:text-ui-text group-[.toaster]:border-ui-line group-[.toaster]:shadow-lg', description: 'group-[.toast]:text-zinc-500 dark:group-[.toast]:text-zinc-400', actionButton: 'group-[.toast]:bg-zinc-900 group-[.toast]:text-zinc-50 dark:group-[.toast]:bg-zinc-50 dark:group-[.toast]:text-zinc-900', diff --git a/app/components/ui/sonner/Toaster.vue b/app/components/ui/sonner/Toaster.vue index e5783c0a..46e847f0 100644 --- a/app/components/ui/sonner/Toaster.vue +++ b/app/components/ui/sonner/Toaster.vue @@ -15,8 +15,13 @@ const props = defineProps({ :rich-colors="props.richColors" class="toaster group" :toast-options="{ + style: { + background: 'var(--ui-popup-surface)', + backdropFilter: 'var(--ui-popup-filter)', + WebkitBackdropFilter: 'var(--ui-popup-filter)', + }, classes: { - toast: 'group toast group-[.toaster]:bg-white group-[.toaster]:text-zinc-950 group-[.toaster]:border-zinc-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-zinc-950 dark:group-[.toaster]:text-zinc-50 dark:group-[.toaster]:border-zinc-800', + toast: 'group toast group-[.toaster]:text-ui-text group-[.toaster]:border-ui-line group-[.toaster]:shadow-lg', description: 'group-[.toast]:text-zinc-500 dark:group-[.toast]:text-zinc-400', actionButton: 'group-[.toast]:bg-zinc-900 group-[.toast]:text-zinc-50 dark:group-[.toast]:bg-zinc-50 dark:group-[.toast]:text-zinc-900', diff --git a/app/pages/index.vue b/app/pages/index.vue index 4c3e80bc..21314ece 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -828,33 +828,31 @@ html.dark, } .v-popper--theme-tooltip .v-popper__inner { - @apply rounded-control bg-zinc-900 px-2 py-1 text-[10px] leading-tight font-medium text-zinc-100 shadow-sm; -} - -.dark .v-popper--theme-tooltip .v-popper__inner { - @apply bg-zinc-100 text-zinc-900; + @apply rounded-control px-2 py-1 text-[10px] leading-tight font-medium shadow-sm; } .v-popper--theme-tooltip .v-popper__arrow-outer { - @apply border-zinc-900; -} - -.dark .v-popper--theme-tooltip .v-popper__arrow-outer { - @apply border-zinc-100; + border-color: var(--ui-popup-surface); } .v-popper--theme-tooltip .v-popper__arrow-inner { @apply hidden; } -.v-popper--theme-dropdown .v-popper__inner { +.v-popper--theme-dropdown .v-popper__inner, +.v-popper--theme-tooltip .v-popper__inner { border: 1px solid var(--ui-line); - border-radius: var(--radius-surface); - background: var(--ui-popup); + background: var(--ui-popup-surface); + -webkit-backdrop-filter: var(--ui-popup-filter); + backdrop-filter: var(--ui-popup-filter); color: var(--ui-text); box-shadow: var(--ui-shadow); } +.v-popper--theme-dropdown .v-popper__inner { + border-radius: var(--radius-popup); +} + .v-popper--theme-dropdown .v-popper__arrow-container { display: none; }