theme-o-rama
Version:
A TypeScript library for dynamic theme management in react + shadcn + tailwind applications
903 lines (799 loc) • 27.6 kB
CSS
:root {
/* Default light theme - these will be overridden by the theme system */
--theme-color: hsl(0, 0%, 100%);
--background: transparent;
--foreground: hsl(0 0% 3.9%);
--card: transparent;
--card-foreground: hsl(0 0% 3.9%);
--popover: transparent;
--popover-foreground: hsl(0 0% 3.9%);
--primary: hsl(0 0% 9%);
--primary-foreground: hsl(0 0% 98%);
--secondary: hsl(0 0% 96.1%);
--secondary-foreground: hsl(0 0% 9%);
--muted: hsl(0 0% 96.1%);
--muted-foreground: hsl(0 0% 45.1%);
--accent: hsl(0 0% 96.1%);
--accent-foreground: hsl(0 0% 9%);
--destructive: hsl(0 84.2% 60.2%);
--destructive-foreground: hsl(0 0% 98%);
--border: hsl(0 0% 89.8%);
--input: hsl(0 0% 89.8%);
--input-background: hsl(0 0% 100%);
--ring: hsl(0 0% 3.9%);
--radius: 0.5rem;
/* Default font families */
--font-sans: Inter, system-ui, sans-serif;
--font-serif: Georgia, serif;
--font-mono:
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono,
Courier New, monospace;
--font-heading: Inter, system-ui, sans-serif;
--font-body: Inter, system-ui, sans-serif;
/* Default corner radius values */
--corner-none: 0px;
--corner-sm: 0.125rem;
--corner-md: 0.375rem;
--corner-lg: 0.5rem;
--corner-xl: 0.75rem;
--corner-full: 9999px;
/* Default shadow values */
--shadow-none: none;
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--shadow-lg:
0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--shadow-xl:
0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
--shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
--shadow-card: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--shadow-button: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-dropdown:
0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
/* Default backdrop-filter values */
--card-backdrop-filter: none;
--popover-backdrop-filter: none;
--input-backdrop-filter: none;
--table-header-backdrop-filter: none;
--table-row-backdrop-filter: none;
--table-footer-backdrop-filter: none;
/* Button-specific CSS variables with defaults */
--btn-default-background: var(--primary);
--btn-default-color: var(--primary-foreground);
--btn-default-border: none;
--btn-default-border-style: solid;
--btn-default-border-width: 0;
--btn-default-border-color: transparent;
--btn-default-radius: var(--radius);
--btn-default-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-default-backdrop-filter: none;
--btn-default-hover-background: var(--primary);
--btn-default-hover-color: var(--primary-foreground);
--btn-default-hover-transform: none;
--btn-default-hover-border-style: solid;
--btn-default-hover-border-color: transparent;
--btn-default-hover-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-default-active-background: var(--primary);
--btn-default-active-color: var(--primary-foreground);
--btn-default-active-transform: none;
--btn-default-active-border-style: solid;
--btn-default-active-border-color: transparent;
--btn-default-active-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-outline-background: transparent;
--btn-outline-color: var(--foreground);
--btn-outline-border: 1px solid var(--border);
--btn-outline-border-style: solid;
--btn-outline-border-width: 1px;
--btn-outline-border-color: var(--border);
--btn-outline-radius: var(--radius);
--btn-outline-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-outline-backdrop-filter: none;
--btn-outline-hover-background: var(--accent);
--btn-outline-hover-color: var(--accent-foreground);
--btn-outline-hover-transform: none;
--btn-outline-hover-border-style: solid;
--btn-outline-hover-border-color: var(--border);
--btn-outline-hover-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-outline-active-background: var(--accent);
--btn-outline-active-color: var(--accent-foreground);
--btn-outline-active-transform: none;
--btn-outline-active-border-style: solid;
--btn-outline-active-border-color: var(--border);
--btn-outline-active-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-secondary-background: var(--secondary);
--btn-secondary-color: var(--secondary-foreground);
--btn-secondary-border: none;
--btn-secondary-border-style: solid;
--btn-secondary-border-width: 0;
--btn-secondary-border-color: transparent;
--btn-secondary-radius: var(--radius);
--btn-secondary-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-secondary-backdrop-filter: none;
--btn-secondary-hover-background: var(--secondary);
--btn-secondary-hover-color: var(--secondary-foreground);
--btn-secondary-hover-transform: none;
--btn-secondary-hover-border-style: solid;
--btn-secondary-hover-border-color: transparent;
--btn-secondary-hover-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-secondary-active-background: var(--secondary);
--btn-secondary-active-color: var(--secondary-foreground);
--btn-secondary-active-transform: none;
--btn-secondary-active-border-style: solid;
--btn-secondary-active-border-color: transparent;
--btn-secondary-active-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-destructive-background: var(--destructive);
--btn-destructive-color: var(--destructive-foreground);
--btn-destructive-border: none;
--btn-destructive-border-style: solid;
--btn-destructive-border-width: 0;
--btn-destructive-border-color: transparent;
--btn-destructive-radius: var(--radius);
--btn-destructive-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-destructive-hover-background: var(--destructive);
--btn-destructive-hover-color: var(--destructive-foreground);
--btn-destructive-hover-transform: none;
--btn-destructive-hover-border-style: solid;
--btn-destructive-hover-border-color: transparent;
--btn-destructive-hover-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-destructive-active-background: var(--destructive);
--btn-destructive-active-color: var(--destructive-foreground);
--btn-destructive-active-transform: none;
--btn-destructive-active-border-style: solid;
--btn-destructive-active-border-color: transparent;
--btn-destructive-active-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--btn-ghost-background: transparent;
--btn-ghost-color: var(--foreground);
--btn-ghost-border: none;
--btn-ghost-border-style: solid;
--btn-ghost-border-width: 0;
--btn-ghost-border-color: transparent;
--btn-ghost-radius: var(--radius);
--btn-ghost-shadow: none;
--btn-ghost-hover-background: var(--accent);
--btn-ghost-hover-color: var(--accent-foreground);
--btn-ghost-hover-transform: none;
--btn-ghost-hover-border-style: solid;
--btn-ghost-hover-border-color: transparent;
--btn-ghost-hover-shadow: none;
--btn-ghost-active-background: var(--accent);
--btn-ghost-active-color: var(--accent-foreground);
--btn-ghost-active-transform: none;
--btn-ghost-active-border-style: solid;
--btn-ghost-active-border-color: transparent;
--btn-ghost-active-shadow: none;
--btn-link-background: transparent;
--btn-link-color: var(--primary);
--btn-link-border: none;
--btn-link-border-style: solid;
--btn-link-border-width: 0;
--btn-link-border-color: transparent;
--btn-link-radius: var(--radius);
--btn-link-shadow: none;
--btn-link-hover-background: transparent;
--btn-link-hover-color: var(--primary);
--btn-link-hover-transform: none;
--btn-link-hover-border-style: solid;
--btn-link-hover-border-color: transparent;
--btn-link-hover-shadow: none;
--btn-link-active-background: transparent;
--btn-link-active-color: var(--primary);
--btn-link-active-transform: none;
--btn-link-active-border-style: solid;
--btn-link-active-border-color: transparent;
--btn-link-active-shadow: none;
--btn-destructive-backdrop-filter: none;
--btn-ghost-backdrop-filter: none;
--btn-link-backdrop-filter: none;
/* Theme-specific button style flags */
--theme-has-gradient-buttons: 0;
--theme-has-shimmer-effects: 0;
--theme-has-pixel-art: 0;
--theme-has-3d-effects: 0;
--theme-has-rounded-buttons: 0;
/* Navigation active background */
--nav-active-background: color-mix(
in srgb,
var(--primary, hsl(0 0% 9%)) 10%,
transparent
);
--outline-button-background: transparent;
/* Sidebar styling variables with defaults */
--sidebar-background: transparent;
--sidebar-backdrop-filter: none;
--sidebar-border: var(--border);
/* Table styling variables with defaults */
--table-background: transparent;
--table-border: 1px solid var(--border);
--table-box-shadow: var(--shadow-sm);
--table-header-background: transparent;
--table-header-color: var(--muted-foreground);
--table-header-font-weight: 500;
--table-header-font-size: 0.875rem;
--table-header-padding: 0.15rem 0.5rem;
--table-row-background: transparent;
--table-row-color: var(--foreground);
--table-row-border: 1px solid var(--border);
--table-row-hover-background: var(--muted);
--table-row-hover-color: var(--foreground);
--table-row-selected-background: var(--accent);
--table-row-selected-color: var(--accent-foreground);
--table-cell-padding: 0.5rem;
--table-cell-border: none;
--table-cell-font-size: 0.875rem;
--table-footer-background: var(--muted);
--table-footer-color: var(--muted-foreground);
--table-footer-border: 1px solid var(--border);
/* Switch styling variables with defaults */
--switch-checked-background: var(--primary);
--switch-unchecked-background: var(--input);
--switch-thumb-background: hsl(0 0% 100%);
}
/* Smooth theme transitions */
:root {
/* Transition duration - can be overridden by themes */
--theme-transition-duration: 300ms;
--theme-transition-timing: ease-in-out;
}
/* Respect user's motion preferences for accessibility */
@media (prefers-reduced-motion: reduce) {
:root {
--theme-transition-duration: 0ms;
}
}
/* Apply transitions to elements that use theme colors */
* {
border-color: var(--border);
transition:
background-color var(--theme-transition-duration)
var(--theme-transition-timing),
color var(--theme-transition-duration) var(--theme-transition-timing),
border-color var(--theme-transition-duration) var(--theme-transition-timing),
box-shadow var(--theme-transition-duration) var(--theme-transition-timing),
opacity var(--theme-transition-duration) var(--theme-transition-timing);
}
/* Disable transitions for certain elements that should be instant */
*:where(
input,
textarea,
select,
button:active,
[data-no-transition],
.no-transition
) {
transition-duration: 0ms ;
}
/* Special handling for background images - fade in/out */
body {
background-color: var(--background);
color: var(--foreground);
transition:
background-color var(--theme-transition-duration)
var(--theme-transition-timing),
color var(--theme-transition-duration) var(--theme-transition-timing);
}
html.has-background-image {
background-image: var(--background-image);
background-size: var(--background-size, cover);
background-position: var(--background-position, center);
background-repeat: var(--background-repeat, no-repeat);
transition: background-image var(--theme-transition-duration)
var(--theme-transition-timing);
}
/* Theme cards with background images */
.has-background-image.bg-card {
background-color: var(--card);
}
/* Ensure cards and popovers transition smoothly */
.bg-card,
.bg-popover {
transition:
background-color var(--theme-transition-duration)
var(--theme-transition-timing),
color var(--theme-transition-duration) var(--theme-transition-timing),
border-color var(--theme-transition-duration) var(--theme-transition-timing);
}
/* Dynamic outline button styling for all themes */
.outline-btn {
background-color: var(--outline-button-background);
}
/* Dynamic theme-specific button variant overrides */
/* Gradient buttons - applied when theme has gradient flag */
.btn-variant-default[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-default-background),
var(--btn-default-hover-background)
);
color: var(--btn-default-color);
border: var(--btn-default-border);
}
.btn-variant-outline[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-outline-background),
var(--btn-outline-hover-background)
);
color: var(--btn-outline-color);
border: var(--btn-outline-border);
}
.btn-variant-secondary[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-secondary-background),
var(--btn-secondary-hover-background)
);
color: var(--btn-secondary-color);
border: var(--btn-secondary-border);
}
/* Shimmer effects - applied when theme has shimmer flag */
.btn-variant-default[data-theme-style*="shimmer"] {
background: var(--btn-default-background);
border: var(--btn-default-border);
color: var(--btn-default-color);
position: relative;
overflow: hidden;
opacity: 0.8;
}
.btn-variant-outline[data-theme-style*="shimmer"] {
background: var(--btn-outline-background);
border: var(--btn-outline-border);
color: var(--btn-outline-color);
position: relative;
overflow: hidden;
opacity: 0.8;
}
.btn-variant-secondary[data-theme-style*="shimmer"] {
background: var(--btn-secondary-background);
border: var(--btn-secondary-border);
color: var(--btn-secondary-color);
position: relative;
overflow: hidden;
opacity: 0.8;
}
.btn-variant-default[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-default-hover-color),
transparent
);
opacity: 0.2;
transition: left 0.3s ease;
}
.btn-variant-default[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
.btn-variant-outline[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-outline-hover-color),
transparent
);
opacity: 0.2;
transition: left 0.3s ease;
}
.btn-variant-outline[data-theme-style*="shimmer"]:hover {
border-color: var(--btn-outline-hover-border-color);
color: var(--btn-outline-hover-color);
opacity: 1;
}
.btn-variant-outline[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
.btn-variant-secondary[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-secondary-hover-color),
transparent
);
opacity: 0.2;
transition: left 0.3s ease;
}
.btn-variant-secondary[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
/* Pixel art style - applied when theme has pixel-art flag */
.btn-variant-default[data-theme-style*="pixel-art"] {
background: var(--btn-default-background);
color: var(--btn-default-color);
border: var(--btn-default-border);
box-shadow: var(--btn-default-shadow);
}
.btn-variant-default[data-theme-style*="pixel-art"]:hover {
transform: var(--btn-default-hover-transform);
box-shadow: var(--btn-default-hover-shadow);
}
.btn-variant-outline[data-theme-style*="pixel-art"] {
background: var(--btn-outline-background);
border: var(--btn-outline-border);
color: var(--btn-outline-color);
box-shadow: var(--btn-outline-shadow);
}
.btn-variant-secondary[data-theme-style*="pixel-art"] {
background: var(--btn-secondary-background);
border: var(--btn-secondary-border);
color: var(--btn-secondary-color);
box-shadow: var(--btn-secondary-shadow);
}
/* 3D effects - applied when theme has 3d-effects flag */
.btn-variant-default[data-theme-style*="3d-effects"] {
background: var(--btn-default-background);
color: var(--btn-default-color);
border: var(--btn-default-border);
box-shadow: var(--btn-default-shadow);
}
.btn-variant-default[data-theme-style*="3d-effects"]:active {
border-style: var(--btn-default-active-border-style);
box-shadow: var(--btn-default-active-shadow);
}
.btn-variant-outline[data-theme-style*="3d-effects"] {
background: var(--btn-outline-background);
border: var(--btn-outline-border);
color: var(--btn-outline-color);
}
.btn-variant-secondary[data-theme-style*="3d-effects"] {
background: var(--btn-secondary-background);
border: var(--btn-secondary-border);
color: var(--btn-secondary-color);
}
.btn-variant-primary[data-theme-style*="3d-effects"] {
background: var(--btn-primary-background);
color: var(--btn-primary-color);
border: var(--btn-primary-border);
box-shadow: var(--btn-primary-shadow);
}
.btn-variant-primary[data-theme-style*="3d-effects"]:active {
border-style: var(--btn-primary-active-border-style);
box-shadow: var(--btn-primary-active-shadow);
}
/* Rounded buttons - applied when theme has rounded-buttons flag */
.btn-variant-default[data-theme-style*="rounded-buttons"] {
background: var(--btn-default-background);
color: var(--btn-default-color);
border-radius: var(--btn-default-radius);
border: var(--btn-default-border);
box-shadow: var(--btn-default-shadow);
}
.btn-variant-outline[data-theme-style*="rounded-buttons"] {
background: var(--btn-outline-background);
color: var(--btn-outline-color);
border: var(--btn-outline-border);
border-radius: var(--btn-outline-radius);
}
.btn-variant-secondary[data-theme-style*="rounded-buttons"] {
background: var(--btn-secondary-background);
color: var(--btn-secondary-color);
border: var(--btn-secondary-border);
border-radius: var(--btn-secondary-radius);
}
/* Destructive button variant theme support */
.btn-variant-destructive[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-destructive-background),
var(--btn-destructive-hover-background)
);
color: var(--btn-destructive-color);
border: var(--btn-destructive-border);
}
.btn-variant-destructive[data-theme-style*="shimmer"] {
background: var(--btn-destructive-background);
border: var(--btn-destructive-border);
color: var(--btn-destructive-color);
position: relative;
overflow: hidden;
opacity: 0.9;
}
.btn-variant-destructive[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-destructive-hover-color),
transparent
);
opacity: 0.2;
transition: left 0.3s ease;
}
.btn-variant-destructive[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
.btn-variant-destructive[data-theme-style*="shimmer"]:hover {
opacity: 1;
}
.btn-variant-destructive[data-theme-style*="pixel-art"] {
background: var(--btn-destructive-background);
color: var(--btn-destructive-color);
border: var(--btn-destructive-border);
box-shadow: var(--btn-destructive-shadow);
}
.btn-variant-destructive[data-theme-style*="pixel-art"]:hover {
transform: var(--btn-destructive-hover-transform);
box-shadow: var(--btn-destructive-hover-shadow);
}
.btn-variant-destructive[data-theme-style*="3d-effects"] {
background: var(--btn-destructive-background);
color: var(--btn-destructive-color);
border: var(--btn-destructive-border);
box-shadow: var(--btn-destructive-shadow);
}
.btn-variant-destructive[data-theme-style*="3d-effects"]:active {
border-style: var(--btn-destructive-active-border-style);
box-shadow: var(--btn-destructive-active-shadow);
}
.btn-variant-destructive[data-theme-style*="rounded-buttons"] {
background: var(--btn-destructive-background);
color: var(--btn-destructive-color);
border-radius: var(--btn-destructive-radius);
border: var(--btn-destructive-border);
box-shadow: var(--btn-destructive-shadow);
}
/* Ghost button variant theme support */
.btn-variant-ghost[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-ghost-background),
var(--btn-ghost-hover-background)
);
color: var(--btn-ghost-color);
border: var(--btn-ghost-border);
}
.btn-variant-ghost[data-theme-style*="shimmer"] {
background: var(--btn-ghost-background);
border: var(--btn-ghost-border);
color: var(--btn-ghost-color);
position: relative;
overflow: hidden;
opacity: 0.8;
}
.btn-variant-ghost[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-ghost-hover-color),
transparent
);
opacity: 0.2;
transition: left 0.3s ease;
}
.btn-variant-ghost[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
.btn-variant-ghost[data-theme-style*="pixel-art"] {
background: var(--btn-ghost-background);
color: var(--btn-ghost-color);
border: var(--btn-ghost-border);
box-shadow: var(--btn-ghost-shadow);
}
.btn-variant-ghost[data-theme-style*="pixel-art"]:hover {
transform: var(--btn-ghost-hover-transform);
box-shadow: var(--btn-ghost-hover-shadow);
}
.btn-variant-ghost[data-theme-style*="3d-effects"] {
background: var(--btn-ghost-background);
color: var(--btn-ghost-color);
border: var(--btn-ghost-border);
}
.btn-variant-ghost[data-theme-style*="rounded-buttons"] {
background: var(--btn-ghost-background);
color: var(--btn-ghost-color);
border: var(--btn-ghost-border);
border-radius: var(--btn-ghost-radius);
}
/* Link button variant theme support */
.btn-variant-link[data-theme-style*="gradient"] {
background: linear-gradient(
135deg,
var(--btn-link-background),
var(--btn-link-hover-background)
);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.btn-variant-link[data-theme-style*="shimmer"] {
color: var(--btn-link-color);
position: relative;
overflow: hidden;
}
.btn-variant-link[data-theme-style*="shimmer"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
var(--btn-link-hover-color),
transparent
);
opacity: 0.3;
transition: left 0.3s ease;
}
.btn-variant-link[data-theme-style*="shimmer"]:hover::before {
left: 100%;
}
.btn-variant-link[data-theme-style*="pixel-art"] {
color: var(--btn-link-color);
text-shadow: 1px 1px 0 var(--foreground);
}
.btn-variant-link[data-theme-style*="3d-effects"] {
color: var(--btn-link-color);
text-shadow:
1px 1px 0 var(--background),
-1px -1px 0 var(--muted-foreground);
}
.btn-variant-link[data-theme-style*="rounded-buttons"] {
color: var(--btn-link-color);
padding: 4px 8px;
border-radius: var(--btn-link-radius);
background: var(--btn-link-background);
}
/* Custom switch styling */
.switch-component.peer[data-state="checked"] {
background-color: var(--switch-checked-background);
}
.switch-component.peer[data-state="unchecked"] {
background-color: var(--switch-unchecked-background);
}
/* Alternative selectors for when data-state is on child elements */
.switch-component.peer:has([data-state="checked"]) {
background-color: var(--switch-checked-background);
}
.switch-component.peer:has([data-state="unchecked"]) {
background-color: var(--switch-unchecked-background);
}
/* Ensure switches are always visible, even with background images */
body.has-background-image .switch-component.peer[data-state="checked"] {
background-color: var(--switch-checked-background);
opacity: 1;
}
body.has-background-image .switch-component.peer[data-state="unchecked"] {
background-color: var(--switch-unchecked-background);
opacity: 1;
}
body.has-background-image .switch-component.peer:has([data-state="checked"]) {
background-color: var(--switch-checked-background);
opacity: 1;
}
body.has-background-image .switch-component.peer:has([data-state="unchecked"]) {
background-color: var(--switch-unchecked-background);
opacity: 1;
}
/* Ensure switch thumb is always visible */
.switch-component.peer span {
background-color: var(--switch-thumb-background, hsl(0 0% 100%));
}
/* Override for background image themes */
body.has-background-image .switch-component.peer span {
background-color: var(--switch-thumb-background, hsl(0 0% 100%));
}
/* Theme card isolation - prevent inheritance from ambient theme */
.theme-card-isolated {
/* Create a new stacking context to isolate CSS variables */
isolation: isolate;
/* Ensure the theme variables don't inherit from parent */
contain: style;
}
/* Theme-aware table styling */
.table-theme {
background: var(--table-background);
border: var(--table-border);
box-shadow: var(--table-box-shadow);
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
.table-theme thead tr {
background: var(--table-header-background);
-webkit-backdrop-filter: var(--table-header-backdrop-filter-webkit);
backdrop-filter: var(--table-header-backdrop-filter);
}
.table-theme thead th {
color: var(--table-header-color);
border: var(--table-header-border);
font-weight: var(--table-header-font-weight);
font-size: var(--table-header-font-size);
padding: var(--table-header-padding);
background: transparent;
}
.table-theme tbody tr {
background: var(--table-row-background);
color: var(--table-row-color);
border: var(--table-row-border);
-webkit-backdrop-filter: var(--table-row-backdrop-filter-webkit);
backdrop-filter: var(--table-row-backdrop-filter);
}
.table-theme tbody tr:hover {
background: var(--table-row-hover-background);
color: var(--table-row-hover-color);
}
.table-theme tbody tr[data-state="selected"] {
background: var(--table-row-selected-background);
color: var(--table-row-selected-color);
}
.table-theme tbody td {
padding: var(--table-cell-padding);
border: var(--table-cell-border);
font-size: var(--table-cell-font-size);
}
.table-theme tfoot th {
background: var(--table-footer-background);
color: var(--table-footer-color);
border: var(--table-footer-border);
-webkit-backdrop-filter: var(--table-footer-backdrop-filter-webkit);
backdrop-filter: var(--table-footer-backdrop-filter);
}
/* Backdrop filter utility classes */
.backdrop-blur-card {
-webkit-backdrop-filter: var(--card-backdrop-filter);
backdrop-filter: var(--card-backdrop-filter);
}
.backdrop-blur-popover {
-webkit-backdrop-filter: var(--popover-backdrop-filter);
backdrop-filter: var(--popover-backdrop-filter);
}
.backdrop-blur-input {
-webkit-backdrop-filter: var(--input-backdrop-filter);
backdrop-filter: var(--input-backdrop-filter);
}
/* Apply backdrop filters to existing components */
.bg-card {
background-color: var(--card);
-webkit-backdrop-filter: var(--card-backdrop-filter);
backdrop-filter: var(--card-backdrop-filter);
}
.bg-popover {
background-color: var(--popover);
-webkit-backdrop-filter: var(--popover-backdrop-filter);
backdrop-filter: var(--popover-backdrop-filter);
}
.bg-input,
input[type="text"],
input[type="password"],
input[type="email"],
input[type="number"],
textarea,
select {
-webkit-backdrop-filter: var(--input-backdrop-filter);
backdrop-filter: var(--input-backdrop-filter);
}
/* Table header backdrop filter is now applied via thead::before */
.table-theme tfoot th,
.table-theme tfoot td {
-webkit-backdrop-filter: var(--table-footer-backdrop-filter-webkit);
backdrop-filter: var(--table-footer-backdrop-filter);
}