Add glass UI with backdrop blur and fix primary button colors

Apply glassmorphism to sidebar, cards, tables, modals, dropdowns,
and dialogs with semi-transparent backgrounds, backdrop-blur, and
white/15 borders. Add subtle gradient body background for the blur
to work against. Add dedicated btn-primary color tokens so primary
buttons stay bold in dark mode instead of using the brightened text
palette. Use shadow-sm to avoid heavy halos in light mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Darko Gjorgjijoski
2026-04-04 03:30:00 +02:00
parent 7e15eb7c7a
commit 9c8e4ae558
10 changed files with 36 additions and 13 deletions

View File

@@ -41,6 +41,8 @@
--color-hover-strong: var(--color-hover-strong); --color-hover-strong: var(--color-hover-strong);
--color-header-from: var(--color-header-from); --color-header-from: var(--color-header-from);
--color-header-to: var(--color-header-to); --color-header-to: var(--color-header-to);
--color-btn-primary: var(--color-btn-primary);
--color-btn-primary-hover: var(--color-btn-primary-hover);
/* Status badge text */ /* Status badge text */
--color-status-yellow: var(--color-status-yellow); --color-status-yellow: var(--color-status-yellow);
@@ -63,6 +65,19 @@
--font-base: Poppins, sans-serif; --font-base: Poppins, sans-serif;
} }
/* Glass UI background gradient */
@utility bg-glass-gradient {
background-image: linear-gradient(
135deg,
var(--color-surface-tertiary) 0%,
color-mix(in srgb, var(--color-primary-500) 8%, var(--color-surface-tertiary)) 30%,
var(--color-surface-tertiary) 50%,
color-mix(in srgb, var(--color-primary-400) 6%, var(--color-surface-tertiary)) 70%,
var(--color-surface-tertiary) 100%
);
background-attachment: fixed;
}
@utility bg-multiselect-caret { @utility bg-multiselect-caret {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z' clip-rule='evenodd'/%3E%3C/svg%3E"); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z' clip-rule='evenodd'/%3E%3C/svg%3E");
} }

View File

@@ -36,6 +36,10 @@
--color-header-from: rgb(74, 61, 255); --color-header-from: rgb(74, 61, 255);
--color-header-to: rgb(118, 117, 255); --color-header-to: rgb(118, 117, 255);
/* Button colors (fixed, always bold) */
--color-btn-primary: rgb(74, 61, 255);
--color-btn-primary-hover: rgb(51, 22, 255);
/* Status badge text */ /* Status badge text */
--color-status-yellow: rgb(113, 63, 18); --color-status-yellow: rgb(113, 63, 18);
--color-status-green: rgb(20, 83, 45); --color-status-green: rgb(20, 83, 45);
@@ -93,6 +97,10 @@
--color-header-from: rgb(51, 22, 255); --color-header-from: rgb(51, 22, 255);
--color-header-to: rgb(74, 61, 255); --color-header-to: rgb(74, 61, 255);
/* Button colors (slightly brighter in dark for contrast) */
--color-btn-primary: rgb(88, 75, 255);
--color-btn-primary-hover: rgb(74, 61, 255);
/* Primary adjustments for dark mode */ /* Primary adjustments for dark mode */
--color-primary-50: rgba(167, 170, 255, 0.15); --color-primary-50: rgba(167, 170, 255, 0.15);
--color-primary-100: rgba(167, 170, 255, 0.25); --color-primary-100: rgba(167, 170, 255, 0.25);

View File

@@ -124,8 +124,8 @@
h-screen h-screen
pb-32 pb-32
overflow-y-auto overflow-y-auto
bg-surface bg-surface/80 backdrop-blur-xl
border-r border-line-default border-solid border-r border-white/10
xl:w-64 xl:w-64
md:fixed md:flex md:flex-col md:inset-y-0 md:fixed md:flex md:flex-col md:inset-y-0
pt-16 pt-16

View File

@@ -81,7 +81,7 @@ const placeHolderSize = computed(() => {
const variantClass = computed(() => { const variantClass = computed(() => {
return { return {
'border-transparent shadow-xs text-white bg-primary-600 hover:bg-primary-700 focus:ring-primary-500': 'border-transparent shadow-xs text-white bg-btn-primary hover:bg-btn-primary-hover focus:ring-primary-500':
props.variant === 'primary', props.variant === 'primary',
'border-transparent text-primary-700 bg-primary-100 hover:bg-primary-200 focus:ring-primary-500': 'border-transparent text-primary-700 bg-primary-100 hover:bg-primary-200 focus:ring-primary-500':
props.variant === 'secondary', props.variant === 'secondary',

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="bg-surface rounded-xl shadow border border-line-light"> <div class="bg-surface/70 backdrop-blur-lg rounded-xl shadow-sm border border-white/15">
<div <div
v-if="hasHeaderSlot" v-if="hasHeaderSlot"
class="px-5 py-4 text-heading border-b border-line-light border-solid" class="px-5 py-4 text-heading border-b border-line-light border-solid"

View File

@@ -59,8 +59,8 @@
text-left text-left
align-bottom align-bottom
transition-all transition-all
bg-surface bg-surface/80 backdrop-blur-2xl
rounded-lg rounded-xl border border-white/15
shadow-xl shadow-xl
sm:my-8 sm:align-middle sm:w-full sm:p-6 sm:my-8 sm:align-middle sm:w-full sm:p-6
relative relative

View File

@@ -69,7 +69,7 @@ const props = defineProps({
}) })
const containerClasses = computed(() => { const containerClasses = computed(() => {
const baseClass = `origin-top-right rounded-md shadow-lg bg-surface ring-1 ring-black/5 divide-y divide-line-light focus:outline-hidden` const baseClass = `origin-top-right rounded-xl shadow-xl bg-surface/80 backdrop-blur-xl border border-white/15 divide-y divide-line-light focus:outline-hidden`
return `${baseClass} ${props.containerClass}` return `${baseClass} ${props.containerClass}`
}) })

View File

@@ -51,8 +51,8 @@
<div <div
:class="`inline-block :class="`inline-block
align-middle align-middle
bg-surface bg-surface/80 backdrop-blur-2xl
rounded-lg rounded-xl border border-white/15
text-left text-left
overflow-hidden overflow-hidden
relative relative

View File

@@ -6,9 +6,9 @@
class=" class="
relative relative
overflow-hidden overflow-hidden
bg-surface bg-surface/70 backdrop-blur-lg
border border-line-light border border-white/15
shadow shadow-sm
rounded-xl rounded-xl
" "
> >

View File

@@ -34,7 +34,7 @@
</head> </head>
<body <body
class="h-full overflow-hidden bg-surface-tertiary font-base class="h-full overflow-hidden bg-surface-tertiary bg-glass-gradient font-base
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'invoiceshelf'}} @endif "> @if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'invoiceshelf'}} @endif ">
<!-- Module Scripts --> <!-- Module Scripts -->