@teseor/css 1.15.7 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/compiled.css +1 -1
  2. package/dist/index.css +7 -8
  3. package/package.json +1 -1
  4. package/src/components/content/divider/docs.html +1 -1
  5. package/src/components/content/scroll-area/docs.html +2 -2
  6. package/src/components/data-display/status/docs.html +2 -2
  7. package/src/components/feedback/skeleton/docs.html +2 -2
  8. package/src/components/feedback/toast/docs.html +12 -12
  9. package/src/components/forms/checkbox/docs.html +1 -1
  10. package/src/components/forms/radio/docs.html +5 -5
  11. package/src/components/forms/toggle/docs.html +3 -3
  12. package/src/components/navigation/dropdown-menu/docs.html +1 -1
  13. package/src/components/overlays/dialog/docs.html +6 -6
  14. package/src/components/overlays/drawer/docs.html +17 -17
  15. package/src/components/overlays/modal/docs.html +12 -12
  16. package/src/components/overlays/overlay/docs.html +8 -8
  17. package/src/components/overlays/popover/docs.html +6 -6
  18. package/src/components/overlays/tooltip/docs.html +10 -10
  19. package/src/config/guides/getting-started.docs.html +1 -1
  20. package/src/config/guides/theming.docs.html +11 -11
  21. package/src/config/tokens/_variables.scss +30 -23
  22. package/src/config/tokens/colors/index.scss +18 -0
  23. package/src/config/tokens/docs.html +0 -11
  24. package/src/config/tokens/index.scss +0 -1
  25. package/src/config/tokens/radius.scss +5 -4
  26. package/src/config/tokens/shadows.scss +4 -3
  27. package/src/debug/docs.html +3 -3
  28. package/src/debug/index.scss +4 -5
  29. package/src/layout/aspect-ratio/docs.html +7 -7
  30. package/src/layout/center/docs.html +3 -3
  31. package/src/layout/footer/index.scss +2 -2
  32. package/src/layout/main/docs.html +3 -3
  33. package/src/layout/nav-rail/docs.html +1 -1
  34. package/src/layout/sidebar/docs.html +3 -3
  35. package/src/layout/sidebar-nav/docs.html +6 -6
  36. package/src/utilities/position/api.json +6 -0
  37. package/src/utilities/position/docs.html +29 -0
  38. package/src/utilities/position/position.scss +74 -0
  39. package/src/utilities/scroll-animation/docs.html +1 -1
  40. package/src/utilities/scroll-snap/docs.html +33 -33
  41. package/src/utilities/text/docs.html +5 -5
  42. package/src/config/tokens/semantic-spacing.scss +0 -12
package/dist/index.css CHANGED
@@ -1,16 +1,15 @@
1
1
  @layer reset, tokens, base, primitives, components.styles, components.tokens, utilities, themes;
2
- @layer tokens{:root{--ui-color-primary: oklch(55% 0.22 250);--ui-color-success: oklch(60% 0.18 145);--ui-color-warning: oklch(75% 0.18 70);--ui-color-danger: oklch(60% 0.22 25);--ui-color-neutral: oklch(50% 0.02 250);--ui-color-primary-light: color-mix(in oklch, var(--ui-color-primary) 50%, white);--ui-color-primary-dark: color-mix(in oklch, var(--ui-color-primary) 75%, black);--ui-color-primary-subtle: color-mix(in oklch, var(--ui-color-primary) 12%, white);--ui-color-primary-hover: color-mix(in oklch, var(--ui-color-primary) 85%, black);--ui-color-neutral-50: color-mix(in oklch, var(--ui-color-neutral) 3%, white);--ui-color-neutral-100: color-mix(in oklch, var(--ui-color-neutral) 6%, white);--ui-color-neutral-200: color-mix(in oklch, var(--ui-color-neutral) 12%, white);--ui-color-neutral-300: color-mix(in oklch, var(--ui-color-neutral) 25%, white);--ui-color-neutral-400: color-mix(in oklch, var(--ui-color-neutral) 50%, white);--ui-color-neutral-500: var(--ui-color-neutral);--ui-color-neutral-600: color-mix(in oklch, var(--ui-color-neutral) 85%, black);--ui-color-neutral-700: color-mix(in oklch, var(--ui-color-neutral) 70%, black);--ui-color-neutral-800: color-mix(in oklch, var(--ui-color-neutral) 50%, black);--ui-color-neutral-900: color-mix(in oklch, var(--ui-color-neutral) 35%, black)}}
2
+ @layer tokens{:root{--ui-color-primary: oklch(55% 0.22 250);--ui-color-success: oklch(60% 0.18 145);--ui-color-warning: oklch(75% 0.18 70);--ui-color-danger: oklch(60% 0.22 25);--ui-color-neutral: oklch(50% 0.02 250);--ui-color-primary-light: color-mix(in oklch, var(--ui-color-primary) 50%, white);--ui-color-primary-dark: color-mix(in oklch, var(--ui-color-primary) 75%, black);--ui-color-primary-subtle: color-mix(in oklch, var(--ui-color-primary) 12%, white);--ui-color-primary-hover: color-mix(in oklch, var(--ui-color-primary) 85%, black);--ui-color-success-light: color-mix(in oklch, var(--ui-color-success) 50%, white);--ui-color-success-dark: color-mix(in oklch, var(--ui-color-success) 75%, black);--ui-color-success-subtle: color-mix(in oklch, var(--ui-color-success) 12%, white);--ui-color-success-hover: color-mix(in oklch, var(--ui-color-success) 85%, black);--ui-color-warning-light: color-mix(in oklch, var(--ui-color-warning) 50%, white);--ui-color-warning-dark: color-mix(in oklch, var(--ui-color-warning) 75%, black);--ui-color-warning-subtle: color-mix(in oklch, var(--ui-color-warning) 12%, white);--ui-color-warning-hover: color-mix(in oklch, var(--ui-color-warning) 85%, black);--ui-color-danger-light: color-mix(in oklch, var(--ui-color-danger) 50%, white);--ui-color-danger-dark: color-mix(in oklch, var(--ui-color-danger) 75%, black);--ui-color-danger-subtle: color-mix(in oklch, var(--ui-color-danger) 12%, white);--ui-color-danger-hover: color-mix(in oklch, var(--ui-color-danger) 85%, black);--ui-color-neutral-50: color-mix(in oklch, var(--ui-color-neutral) 3%, white);--ui-color-neutral-100: color-mix(in oklch, var(--ui-color-neutral) 6%, white);--ui-color-neutral-200: color-mix(in oklch, var(--ui-color-neutral) 12%, white);--ui-color-neutral-300: color-mix(in oklch, var(--ui-color-neutral) 25%, white);--ui-color-neutral-400: color-mix(in oklch, var(--ui-color-neutral) 50%, white);--ui-color-neutral-500: var(--ui-color-neutral);--ui-color-neutral-600: color-mix(in oklch, var(--ui-color-neutral) 85%, black);--ui-color-neutral-700: color-mix(in oklch, var(--ui-color-neutral) 70%, black);--ui-color-neutral-800: color-mix(in oklch, var(--ui-color-neutral) 50%, black);--ui-color-neutral-900: color-mix(in oklch, var(--ui-color-neutral) 35%, black)}}
3
3
  @layer tokens{:root{--ui-space-px: calc(var(--ui-unit) * 0.125);--ui-space-quarter: calc(var(--ui-unit) * 0.25);--ui-space-half: calc(var(--ui-unit) * 0.5);--ui-space-0: calc(var(--ui-unit) * 0.5);--ui-space-1: var(--ui-unit);--ui-space-2: calc(var(--ui-unit) * 2);--ui-space-3: calc(var(--ui-unit) * 3);--ui-space-4: calc(var(--ui-unit) * 4);--ui-space-6: calc(var(--ui-unit) * 6);--ui-space-8: calc(var(--ui-unit) * 8)}}
4
4
  @layer tokens{:root{--ui-font-sans: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif;--ui-font-mono: ui-monospace, sfmono-regular, "SF Mono", menlo, consolas, "Liberation Mono", monospace;--ui-font-size-xs: 0.75rem;--ui-font-size-sm: 0.875rem;--ui-font-size-md: 1rem;--ui-font-size-lg: 1.25rem;--ui-font-size-xl: 1.5rem;--ui-font-size-2xl: 1.75rem;--ui-font-size-3xl: 2rem;--ui-font-size-4xl: 2.5rem;--ui-leading-tight-xs: var(--ui-row-1);--ui-leading-tight-sm: var(--ui-row-1);--ui-leading-tight-md: calc(var(--ui-unit) * 3);--ui-leading-tight-lg: calc(var(--ui-unit) * 3);--ui-leading-xs: var(--ui-row-1);--ui-leading-sm: calc(var(--ui-unit) * 3);--ui-leading-md: calc(var(--ui-unit) * 3);--ui-leading-lg: var(--ui-row-2);--ui-leading-xl: var(--ui-row-2);--ui-leading-2xl: var(--ui-row-2);--ui-leading-3xl: calc(var(--ui-unit) * 5);--ui-leading-4xl: calc(var(--ui-unit) * 6);--ui-weight-normal: 400;--ui-weight-medium: 500;--ui-weight-semibold: 600;--ui-weight-bold: 700;--ui-tracking-display: -0.02em;--ui-tracking-body: 0;--ui-tracking-caps: 0.08em;--ui-heading-1-size: var(--ui-font-size-4xl);--ui-heading-1-line-height: var(--ui-leading-4xl);--ui-heading-1-weight: var(--ui-weight-bold);--ui-heading-1-tracking: var(--ui-tracking-display);--ui-heading-2-size: var(--ui-font-size-3xl);--ui-heading-2-line-height: var(--ui-leading-3xl);--ui-heading-2-weight: var(--ui-weight-bold);--ui-heading-2-tracking: -0.01em;--ui-heading-3-size: var(--ui-font-size-2xl);--ui-heading-3-line-height: var(--ui-leading-2xl);--ui-heading-3-weight: var(--ui-weight-semibold);--ui-heading-3-tracking: var(--ui-tracking-body);--ui-heading-4-size: var(--ui-font-size-xl);--ui-heading-4-line-height: var(--ui-leading-xl);--ui-heading-4-weight: var(--ui-weight-semibold);--ui-heading-4-tracking: var(--ui-tracking-body);--ui-heading-5-size: var(--ui-font-size-lg);--ui-heading-5-line-height: var(--ui-leading-sm);--ui-heading-5-weight: var(--ui-weight-medium);--ui-heading-5-tracking: var(--ui-tracking-body);--ui-body-size: var(--ui-font-size-md);--ui-body-line-height: var(--ui-leading-md);--ui-body-weight: var(--ui-weight-normal);--ui-body-tracking: var(--ui-tracking-body);--ui-body-sm-size: var(--ui-font-size-sm);--ui-body-sm-line-height: var(--ui-leading-sm);--ui-body-sm-weight: var(--ui-weight-normal);--ui-body-sm-tracking: var(--ui-tracking-body);--ui-caption-size: var(--ui-font-size-xs);--ui-caption-line-height: var(--ui-leading-xs);--ui-caption-weight: var(--ui-weight-normal);--ui-caption-tracking: 0.01em;--ui-lead-size: var(--ui-font-size-lg);--ui-lead-line-height: var(--ui-leading-lg);--ui-lead-weight: var(--ui-weight-normal);--ui-lead-tracking: var(--ui-tracking-body);--ui-eyebrow-size: var(--ui-font-size-xs);--ui-eyebrow-line-height: var(--ui-leading-xs);--ui-eyebrow-weight: var(--ui-weight-semibold);--ui-eyebrow-tracking: var(--ui-tracking-caps)}}
5
5
  @layer tokens{:root{--ui-unit: 8px;--ui-row: calc(var(--ui-unit) * 2);--ui-row-1: var(--ui-row);--ui-row-2: calc(var(--ui-row) * 2);--ui-row-3: calc(var(--ui-row) * 3);--ui-row-4: calc(var(--ui-row) * 4);--ui-row-5: calc(var(--ui-row) * 5);--ui-row-6: calc(var(--ui-row) * 6)}}
6
- @layer tokens{:root{--ui-radius-sm: calc(var(--ui-unit) * 0.5);--ui-radius-md: var(--ui-unit);--ui-radius-lg: calc(var(--ui-unit) * 2);--ui-radius-full: 9999px}}
6
+ @layer tokens{:root{--ui-radius-base: var(--ui-unit);--ui-radius-sm: calc(var(--ui-radius-base) * 0.5);--ui-radius-md: var(--ui-radius-base);--ui-radius-lg: calc(var(--ui-radius-base) * 2);--ui-radius-full: 9999px}}
7
7
  @layer tokens{:root{--ui-border-width-sm: calc(var(--ui-unit) * 0.125);--ui-border-width-md: calc(var(--ui-unit) * 0.25);--ui-border-width-lg: calc(var(--ui-unit) * 0.5)}}
8
- @layer tokens{:root{--ui-shadow-sm: 0 1px 2px hsl(var(--ui-hue-primary, 220) 10% 20% / 0.05);--ui-shadow-md: 0 4px 6px hsl(var(--ui-hue-primary, 220) 10% 20% / 0.1);--ui-shadow-lg: 0 10px 15px hsl(var(--ui-hue-primary, 220) 10% 20% / 0.15)}}
8
+ @layer tokens{:root{--ui-shadow-sm: 0 1px 2px color-mix(in oklch, var(--ui-color-neutral) 20%, transparent);--ui-shadow-md: 0 4px 6px color-mix(in oklch, var(--ui-color-neutral) 15%, transparent);--ui-shadow-lg: 0 10px 15px color-mix(in oklch, var(--ui-color-neutral) 12%, transparent)}}
9
9
  @layer tokens{:root{--ui-z-base: 0;--ui-z-sticky: 100;--ui-z-dropdown: 200;--ui-z-overlay: 300;--ui-z-modal: 400;--ui-z-popover: 500;--ui-z-tooltip: 600;--ui-z-toast: 700;--ui-z-drawer: 800;--ui-z-debug: 9999}}
10
10
  @layer tokens{:root{--ui-duration-instant: 50ms;--ui-duration-fast: 100ms;--ui-duration-base: 150ms;--ui-duration-normal: 200ms;--ui-duration-slow: 250ms;--ui-duration-slower: 400ms;--ui-ease-default: cubic-bezier(0.4, 0, 0.2, 1);--ui-ease-in: cubic-bezier(0.4, 0, 1, 1);--ui-ease-out: cubic-bezier(0, 0, 0.2, 1);--ui-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1)}@media(prefers-reduced-motion: reduce){:root{--ui-duration-instant: 0ms;--ui-duration-fast: 0ms;--ui-duration-base: 0ms;--ui-duration-normal: 0ms;--ui-duration-slow: 0ms;--ui-duration-slower: 0ms}}}
11
11
  @layer tokens{:root{color-scheme:light dark;--ui-color-text: light-dark(var(--ui-color-neutral-900), var(--ui-color-neutral-100));--ui-color-text-muted: light-dark(var(--ui-color-neutral-500), var(--ui-color-neutral-400));--ui-color-text-inverse: light-dark(var(--ui-color-neutral-50), var(--ui-color-neutral-900));--ui-color-bg: light-dark(var(--ui-color-neutral-50), var(--ui-color-neutral-900));--ui-color-bg-subtle: light-dark(var(--ui-color-neutral-100), var(--ui-color-neutral-800));--ui-color-bg-muted: light-dark(var(--ui-color-neutral-200), var(--ui-color-neutral-700));--ui-color-border: light-dark(var(--ui-color-neutral-200), var(--ui-color-neutral-700));--ui-color-border-strong: light-dark(var(--ui-color-neutral-300), var(--ui-color-neutral-600));--ui-color-interactive: var(--ui-color-primary);--ui-color-interactive-hover: var(--ui-color-primary-dark);--ui-color-focus: var(--ui-color-primary-light);--ui-opacity-disabled: 0.5;--ui-opacity-loading: 0.7;--ui-overlay-bg: rgb(0 0 0 / 0.5);--ui-overlay-bg-light: rgb(255 255 255 / 0.7);--ui-overlay-bg-blur: rgb(0 0 0 / 0.3);--ui-overlay-bg-subtle: rgb(0 0 0 / 0.1)}}
12
12
  @layer themes{[data-theme=light]{color-scheme:light}[data-theme=dark]{color-scheme:dark}@media(forced-colors: active){:root{--ui-color-focus: Highlight}}@media(prefers-contrast: more){:root{--ui-color-border: light-dark(var(--ui-color-neutral-400), var(--ui-color-neutral-400));--ui-color-border-strong: light-dark(var(--ui-color-neutral-600), var(--ui-color-neutral-300));--ui-color-text-muted: light-dark(var(--ui-color-neutral-600), var(--ui-color-neutral-300));--ui-color-bg-subtle: light-dark(var(--ui-color-neutral-200), var(--ui-color-neutral-700))}}@media(prefers-contrast: less){:root{--ui-color-border: var(--ui-color-neutral-150);--ui-color-border-strong: var(--ui-color-neutral-200)}}}
13
- @layer tokens{:root{--ui-spacing-xs: var(--ui-space-1);--ui-spacing-sm: var(--ui-space-2);--ui-spacing-md: var(--ui-space-4);--ui-spacing-lg: var(--ui-space-6);--ui-spacing-xl: var(--ui-space-8);--ui-spacing-gutter: var(--ui-space-4);--ui-spacing-section: var(--ui-space-8)}}
14
13
  @layer tokens{:root{--ui-input-height: var(--ui-row-2);--ui-input-padding-x: var(--ui-space-2);--ui-input-padding-y: var(--ui-space-1);--ui-input-radius: var(--ui-radius-md);--ui-input-border-width: var(--ui-border-width-sm);--ui-input-bg: var(--ui-color-bg);--ui-input-border: var(--ui-color-border);--ui-input-border-focus: var(--ui-color-interactive);--ui-input-text: var(--ui-color-text);--ui-input-placeholder: var(--ui-color-text-muted)}}
15
14
  @layer reset{*,*::before,*::after{box-sizing:border-box;margin:0}}
16
15
  @layer base{.ui-root{font-family:var(--ui-font-sans, system-ui, -apple-system, blinkmacsystemfont, Segoe UI, roboto, Helvetica Neue, arial, sans-serif);font-size:var(--ui-font-size-md, 1rem);line-height:var(--ui-leading-md, calc(0.5rem * 3));color:var(--ui-color-text, hsl(220, 10%, 10%));background:var(--ui-color-bg, hsl(220, 10%, 98%))}}
@@ -22,7 +21,7 @@
22
21
  @layer primitives{.ui-column{--ui-_space-2: var(--ui-space-2);--ui-_space-1: var(--ui-space-1);--ui-_space-4: var(--ui-space-4);--ui-_space-6: var(--ui-space-6);--ui-_space-8: var(--ui-space-8);display:flex;flex-direction:column;gap:var(--ui-column-gap, var(--ui-_space-2))}.ui-column--xs{--ui-column-gap: var(--ui-_space-1)}.ui-column--sm{--ui-column-gap: var(--ui-_space-2)}.ui-column--md{--ui-column-gap: var(--ui-_space-4)}.ui-column--lg{--ui-column-gap: var(--ui-_space-6)}.ui-column--xl{--ui-column-gap: var(--ui-_space-8)}}
23
22
  @layer primitives{.ui-container{--ui-_unit: var(--ui-unit);--ui-_space-4: var(--ui-space-4);max-inline-size:var(--ui-container-width, calc(var(--ui-_unit) * 120));padding-inline:var(--ui-_space-4)}.ui-container--center{margin-inline:auto}.ui-container--sm{--ui-container-width: calc(var(--ui-_unit) * 80)}.ui-container--md{--ui-container-width: calc(var(--ui-_unit) * 100)}.ui-container--lg{--ui-container-width: calc(var(--ui-_unit) * 120)}.ui-container--xl{--ui-container-width: calc(var(--ui-_unit) * 160)}.ui-container--full{max-inline-size:none}}
24
23
  @layer primitives{.ui-content{--ui-_unit: var(--ui-unit);--ui-_padding-block: var(--ui-content-padding-block, var(--ui-space-4));--ui-_padding-inline: var(--ui-content-padding-inline, var(--ui-space-4));--ui-_gap: var(--ui-content-gap, var(--ui-space-3));display:flex;flex-direction:column;gap:var(--ui-_gap);padding-block:var(--ui-_padding-block);padding-inline:var(--ui-_padding-inline)}.ui-content--prose{max-inline-size:calc(var(--ui-_unit)*80)}.ui-content--flush{padding-block:0;padding-inline:0}}
25
- @layer primitives{.ui-footer{--ui-_space-2: var(--ui-space-2);--ui-_border-width-sm: var(--ui-border-width-sm);--ui-_hue-primary: var(--ui-hue-primary, 220);--ui-_height: var(--ui-footer-height, var(--ui-row-3));--ui-_bg: var(--ui-footer-bg, var(--ui-color-bg));--ui-_padding-inline: var(--ui-footer-padding-inline, var(--ui-space-3));--ui-_border-color: var(--ui-footer-border-color, var(--ui-color-border));--ui-_z: var(--ui-footer-z, var(--ui-z-sticky));display:flex;align-items:center;z-index:var(--ui-_z);block-size:var(--ui-_height);padding-inline:var(--ui-_padding-inline);background:var(--ui-_bg)}.ui-footer__start{display:flex;flex-shrink:0;align-items:center;gap:var(--ui-_space-2)}.ui-footer__center{display:flex;flex:1;align-items:center;justify-content:center;gap:var(--ui-_space-2)}.ui-footer__end{display:flex;flex-shrink:0;align-items:center;gap:var(--ui-_space-2)}.ui-footer--sticky{position:sticky;inset-block-end:0}.ui-footer--fixed{position:fixed;inset-block-end:0;inset-inline:0}.ui-footer--bordered{box-shadow:inset 0 var(--ui-_border-width-sm) 0 0 var(--ui-_border-color)}.ui-footer--raised{box-shadow:0 calc(var(--ui-_border-width-sm)*-1) 6px hsl(var(--ui-_hue-primary), 10%, 20%, 0.08)}}
24
+ @layer primitives{.ui-footer{--ui-_space-2: var(--ui-space-2);--ui-_border-width-sm: var(--ui-border-width-sm);--ui-_shadow-color: color-mix(in oklch, var(--ui-color-neutral, oklch(50% 0.02 250deg)) 8%, transparent);--ui-_height: var(--ui-footer-height, var(--ui-row-3));--ui-_bg: var(--ui-footer-bg, var(--ui-color-bg));--ui-_padding-inline: var(--ui-footer-padding-inline, var(--ui-space-3));--ui-_border-color: var(--ui-footer-border-color, var(--ui-color-border));--ui-_z: var(--ui-footer-z, var(--ui-z-sticky));display:flex;align-items:center;z-index:var(--ui-_z);block-size:var(--ui-_height);padding-inline:var(--ui-_padding-inline);background:var(--ui-_bg)}.ui-footer__start{display:flex;flex-shrink:0;align-items:center;gap:var(--ui-_space-2)}.ui-footer__center{display:flex;flex:1;align-items:center;justify-content:center;gap:var(--ui-_space-2)}.ui-footer__end{display:flex;flex-shrink:0;align-items:center;gap:var(--ui-_space-2)}.ui-footer--sticky{position:sticky;inset-block-end:0}.ui-footer--fixed{position:fixed;inset-block-end:0;inset-inline:0}.ui-footer--bordered{box-shadow:inset 0 var(--ui-_border-width-sm) 0 0 var(--ui-_border-color)}.ui-footer--raised{box-shadow:0 calc(var(--ui-_border-width-sm)*-1) 6px var(--ui-_shadow-color)}}
26
25
  @layer primitives{.ui-grid{--ui-_space-4: var(--ui-space-4, 2rem);display:grid;gap:var(--ui-grid-gap, var(--ui-_space-4));grid-template-columns:repeat(var(--ui-grid-cols, 1), minmax(0, 1fr))}.ui-grid--2{--ui-grid-cols: 2}.ui-grid--3{--ui-grid-cols: 3}.ui-grid--4{--ui-grid-cols: 4}.ui-grid--auto{grid-template-columns:repeat(auto-fit, minmax(var(--ui-grid-min, 16rem), 1fr))}.ui-grid--subgrid{display:grid;grid-template-columns:subgrid}.ui-grid--subgrid-rows{display:grid;grid-template-rows:subgrid}.ui-grid--subgrid-both{display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid}.ui-grid-col-span-2{grid-column:span 2}.ui-grid-col-span-3{grid-column:span 3}.ui-grid-col-span-4{grid-column:span 4}.ui-grid-col-span-full{grid-column:1/-1}.ui-grid-row-span-2{grid-row:span 2}.ui-grid-row-span-3{grid-row:span 3}.ui-grid-row-span-full{grid-row:1/-1}}
27
26
  @layer primitives{.ui-main{--ui-_unit: var(--ui-unit);padding-block-start:var(--ui-topbar-height, 0);margin-inline-start:var(--ui-sidebar-width, calc(var(--ui-_unit) * 30))}.ui-main--sidebar-end{margin-inline-start:0;margin-inline-end:var(--ui-sidebar-width, calc(var(--ui-_unit) * 30))}.ui-main--full{margin-inline-start:0;margin-inline-end:0}}
28
27
  @layer primitives{.ui-nav-rail{--ui-_space-2: var(--ui-space-2);--ui-_border-width-sm: var(--ui-border-width-sm);--ui-_width: var(--ui-nav-rail-width, var(--ui-row-4));--ui-_bg: var(--ui-nav-rail-bg, var(--ui-color-bg-subtle));--ui-_border-color: var(--ui-nav-rail-border-color, var(--ui-color-border));--ui-_gap: var(--ui-nav-rail-gap, var(--ui-space-1));--ui-_z: var(--ui-nav-rail-z, var(--ui-z-sticky));display:flex;flex-direction:column;align-items:center;position:fixed;inset-block:var(--ui-topbar-height, 0);inset-inline-start:0;z-index:var(--ui-_z);inline-size:var(--ui-_width);padding-block:var(--ui-_space-2);background:var(--ui-_bg);box-shadow:inset calc(var(--ui-_border-width-sm)*-1) 0 0 0 var(--ui-_border-color)}.ui-nav-rail__items{display:flex;flex:1;flex-direction:column;align-items:center;gap:var(--ui-_gap)}.ui-nav-rail__actions{display:flex;flex-direction:column;align-items:center;gap:var(--ui-_gap);margin-block-start:auto}.ui-nav-rail--end{inset-inline-start:auto;inset-inline-end:0;box-shadow:inset var(--ui-_border-width-sm) 0 0 0 var(--ui-_border-color)}}
@@ -168,10 +167,10 @@
168
167
  @layer utilities{@supports(animation-timeline: scroll()){.ui-scroll-progress{position:fixed;inset-block-start:0;inset-inline-start:0;z-index:var(--ui-z-toast, 700);block-size:var(--ui-scroll-progress-height, var(--ui-space-half, 0.25rem));inline-size:100%;background:var(--ui-scroll-progress-bg, var(--ui-color-primary));transform-origin:inline-start;scale:0 1;animation:scroll-progress-fill auto linear;animation-timeline:scroll()}@keyframes scroll-progress-fill{to{scale:1 1}}.ui-view-fade{animation:view-fade-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-fade-in{from{opacity:0}to{opacity:1}}.ui-view-slide-up{animation:view-slide-up-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-slide-up-in{from{opacity:0;transform:translateY(var(--ui-space-4, 2rem))}to{opacity:1;transform:translateY(0)}}.ui-view-slide-start{animation:view-slide-start-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-slide-start-in{from{opacity:0;transform:translateX(calc(var(--ui-space-4, 2rem) * -1))}to{opacity:1;transform:translateX(0)}}.ui-view-scale{animation:view-scale-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-scale-in{from{opacity:0;scale:.9}to{opacity:1;scale:1}}@media(prefers-reduced-motion: reduce){.ui-scroll-progress,.ui-view-fade,.ui-view-slide-up,.ui-view-slide-start,.ui-view-scale{opacity:1;transform:none;scale:1 1;animation:none}}}}
169
168
  @layer utilities{.ui-container-inline{container-type:inline-size}.ui-container-size{container-type:size}.ui-container-normal{container-type:normal}}
170
169
  .ui-debug-grid,.ui-debug-grid-rows,.ui-debug-baseline{position:relative}
171
- .ui-debug-grid{--ui-debug-color: hsl(var(--ui-hue-primary, 220) 80% 50% / 0.15)}
170
+ .ui-debug-grid{--ui-debug-color: color-mix(in oklch, var(--ui-color-primary, oklch(55% 0.22 250deg)) 15%, transparent)}
172
171
  .ui-debug-grid::after{content:"";position:absolute;inset-block-start:0;inset-inline-start:0;z-index:var(--ui-z-debug);block-size:100%;inline-size:100%;min-block-size:100vh;background-image:linear-gradient(to right, var(--ui-debug-color) 1px, transparent 1px),linear-gradient(to bottom, var(--ui-debug-color) 1px, transparent 1px);pointer-events:none;background-size:var(--ui-unit) var(--ui-unit);background-position:0 0}
173
- .ui-debug-grid-rows{--ui-debug-color: hsl(var(--ui-hue-primary, 220) 80% 50% / 0.1);--ui-debug-color-strong: hsl(var(--ui-hue-primary, 220) 80% 50% / 0.25)}
172
+ .ui-debug-grid-rows{--ui-debug-color: color-mix(in oklch, var(--ui-color-primary, oklch(55% 0.22 250deg)) 10%, transparent);--ui-debug-color-strong: color-mix(in oklch, var(--ui-color-primary, oklch(55% 0.22 250deg)) 25%, transparent)}
174
173
  .ui-debug-grid-rows::after{content:"";position:absolute;inset-block-start:0;inset-inline-start:0;z-index:var(--ui-z-debug);block-size:100%;inline-size:100%;min-block-size:100vh;background-image:linear-gradient(to right, var(--ui-debug-color) 1px, transparent 1px),linear-gradient(to bottom, var(--ui-debug-color) 1px, transparent 1px),linear-gradient(to bottom, var(--ui-debug-color-strong) 1px, transparent 1px);pointer-events:none;background-size:var(--ui-unit) var(--ui-unit),var(--ui-unit) var(--ui-unit),var(--ui-unit) var(--ui-row);background-position:0 0}
175
- .ui-debug-baseline{--ui-debug-color: hsl(var(--ui-hue-danger, 0) 80% 50% / 0.2)}
174
+ .ui-debug-baseline{--ui-debug-color: color-mix(in oklch, var(--ui-color-danger, oklch(60% 0.22 25deg)) 20%, transparent)}
176
175
  .ui-debug-baseline::after{content:"";position:absolute;inset-block-start:0;inset-inline-start:0;z-index:var(--ui-z-debug);block-size:100%;inline-size:100%;min-block-size:100vh;background-image:linear-gradient(to bottom, var(--ui-debug-color) 1px, transparent 1px);pointer-events:none;background-size:100% var(--ui-unit)}
177
176
  .ui-debug-outline *{outline:1px solid rgba(255,0,0,.5)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teseor/css",
3
- "version": "1.15.7",
3
+ "version": "1.16.0",
4
4
  "description": "CSS library - reset, primitives, components, utilities",
5
5
  "license": "MIT",
6
6
  "author": "letanure",
@@ -18,7 +18,7 @@ description: Visual separator between content sections. Supports horizontal/vert
18
18
  <div class="ui-divider ui-divider--dashed" role="separator"></div>
19
19
 
20
20
  <!-- @vertical -->
21
- <div style="display: flex; height: 64px; align-items: center;">
21
+ <div class="ui-flex ui-items-center" style="block-size: 64px">
22
22
  <span>{{ t('left', 'Left') }}</span>
23
23
  <div class="ui-divider ui-divider--vertical" role="separator"></div>
24
24
  <span>{{ t('right', 'Right') }}</span>
@@ -74,12 +74,12 @@ description: Scrollable container with styled scrollbar. Provides overflow contr
74
74
  <!-- @direction | column -->
75
75
  <div class="ui-scroll-area ui-scroll-area--horizontal">
76
76
  <div class="ui-scroll-area__viewport">
77
- <p style="white-space: nowrap">{{ t('scrolls_horizontally_demo', 'This content scrolls horizontally when it overflows the container width. Resize the window to test.') }}</p>
77
+ <p class="ui-nowrap">{{ t('scrolls_horizontally_demo', 'This content scrolls horizontally when it overflows the container width. Resize the window to test.') }}</p>
78
78
  </div>
79
79
  </div>
80
80
  <div class="ui-scroll-area ui-scroll-area--both ui-scroll-area--sm">
81
81
  <div class="ui-scroll-area__viewport">
82
- <p style="white-space: nowrap">{{ t('both_directions_line_1', 'Both directions - Line 1 with long content that overflows horizontally') }}</p>
82
+ <p class="ui-nowrap">{{ t('both_directions_line_1', 'Both directions - Line 1 with long content that overflows horizontally') }}</p>
83
83
  <p>{{ t('line_2', 'Line 2') }}</p>
84
84
  <p>{{ t('line_3', 'Line 3') }}</p>
85
85
  <p>{{ t('line_4', 'Line 4') }}</p>
@@ -28,7 +28,7 @@ description: Visual status indicator with colored dot to show state.
28
28
  </div>
29
29
 
30
30
  <!-- @sizes -->
31
- <div style="display: flex; gap: var(--ui-space-4); align-items: center;">
31
+ <div class="ui-flex ui-gap-4 ui-items-center">
32
32
  <span class="ui-status ui-status--success ui-status--sm">
33
33
  <span class="ui-status__dot"></span>
34
34
  {{ t('small', 'Small') }}
@@ -51,7 +51,7 @@ description: Visual status indicator with colored dot to show state.
51
51
  </span>
52
52
 
53
53
  <!-- @dot_only -->
54
- <div style="display: flex; gap: var(--ui-space-2);">
54
+ <div class="ui-flex ui-gap-2">
55
55
  <span class="ui-status ui-status--success">
56
56
  <span class="ui-status__dot"></span>
57
57
  </span>
@@ -4,14 +4,14 @@ description: Loading placeholder with shimmer animation for content loading stat
4
4
  ---
5
5
 
6
6
  <!-- @text_lines -->
7
- <div style="display: flex; flex-direction: column; gap: var(--ui-space-1);">
7
+ <div class="ui-flex ui-flex-col ui-gap-1">
8
8
  <div class="ui-skeleton ui-skeleton--text"></div>
9
9
  <div class="ui-skeleton ui-skeleton--text" style="width: 80%;"></div>
10
10
  <div class="ui-skeleton ui-skeleton--text" style="width: 60%;"></div>
11
11
  </div>
12
12
 
13
13
  <!-- @shapes -->
14
- <div style="display: flex; gap: var(--ui-space-2); align-items: flex-start;">
14
+ <div class="ui-flex ui-gap-2 ui-items-start">
15
15
  <div class="ui-skeleton ui-skeleton--circle"></div>
16
16
  <div style="flex: 1; display: flex; flex-direction: column; gap: var(--ui-space-1);">
17
17
  <div class="ui-skeleton ui-skeleton--heading"></div>
@@ -50,8 +50,8 @@ title: Toast
50
50
 
51
51
  <!-- @viewport_positions | column -->
52
52
  <!-- Container positions for toast placement -->
53
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
54
- <div class="ui-toast-viewport ui-toast-viewport--top-end" style="position:absolute">
53
+ <div class="demo-container">
54
+ <div class="ui-toast-viewport ui-toast-viewport--top-end ui-absolute">
55
55
  <div class="ui-toast">
56
56
  <div class="ui-toast__content">
57
57
  <p class="ui-toast__title">{{ t('top_end', 'Top End') }}</p>
@@ -59,8 +59,8 @@ title: Toast
59
59
  </div>
60
60
  </div>
61
61
  </div>
62
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
63
- <div class="ui-toast-viewport ui-toast-viewport--bottom-end" style="position:absolute">
62
+ <div class="demo-container">
63
+ <div class="ui-toast-viewport ui-toast-viewport--bottom-end ui-absolute">
64
64
  <div class="ui-toast">
65
65
  <div class="ui-toast__content">
66
66
  <p class="ui-toast__title">{{ t('bottom_end', 'Bottom End') }}</p>
@@ -68,8 +68,8 @@ title: Toast
68
68
  </div>
69
69
  </div>
70
70
  </div>
71
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
72
- <div class="ui-toast-viewport ui-toast-viewport--top-start" style="position:absolute">
71
+ <div class="demo-container">
72
+ <div class="ui-toast-viewport ui-toast-viewport--top-start ui-absolute">
73
73
  <div class="ui-toast">
74
74
  <div class="ui-toast__content">
75
75
  <p class="ui-toast__title">{{ t('top_start', 'Top Start') }}</p>
@@ -77,8 +77,8 @@ title: Toast
77
77
  </div>
78
78
  </div>
79
79
  </div>
80
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
81
- <div class="ui-toast-viewport ui-toast-viewport--top-center" style="position:absolute">
80
+ <div class="demo-container">
81
+ <div class="ui-toast-viewport ui-toast-viewport--top-center ui-absolute">
82
82
  <div class="ui-toast">
83
83
  <div class="ui-toast__content">
84
84
  <p class="ui-toast__title">{{ t('top_center', 'Top Center') }}</p>
@@ -86,8 +86,8 @@ title: Toast
86
86
  </div>
87
87
  </div>
88
88
  </div>
89
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
90
- <div class="ui-toast-viewport ui-toast-viewport--bottom-start" style="position:absolute">
89
+ <div class="demo-container">
90
+ <div class="ui-toast-viewport ui-toast-viewport--bottom-start ui-absolute">
91
91
  <div class="ui-toast">
92
92
  <div class="ui-toast__content">
93
93
  <p class="ui-toast__title">{{ t('bottom_start', 'Bottom Start') }}</p>
@@ -95,8 +95,8 @@ title: Toast
95
95
  </div>
96
96
  </div>
97
97
  </div>
98
- <div style="position:relative;height:200px;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
99
- <div class="ui-toast-viewport ui-toast-viewport--bottom-center" style="position:absolute">
98
+ <div class="demo-container">
99
+ <div class="ui-toast-viewport ui-toast-viewport--bottom-center ui-absolute">
100
100
  <div class="ui-toast">
101
101
  <div class="ui-toast__content">
102
102
  <p class="ui-toast__title">{{ t('bottom_center', 'Bottom Center') }}</p>
@@ -24,7 +24,7 @@ description: Native checkbox input with custom styling. Supports checked, indete
24
24
  <input class="ui-checkbox ui-checkbox--success" type="checkbox" checked></input>
25
25
 
26
26
  <!-- @with_label -->
27
- <label class="ui-row" style="gap: var(--ui-space-1); cursor: pointer;">
27
+ <label class="ui-row " style="gap: var(--ui-space-1); cursor: pointer">
28
28
  <input class="ui-checkbox" type="checkbox"></input>
29
29
  <span>{{ t('accept_terms_and_conditions', 'Accept terms and conditions') }}</span>
30
30
  </label>
@@ -24,24 +24,24 @@ description: Native radio button with custom styling. Use for mutually exclusive
24
24
  <input class="ui-radio ui-radio--success" type="radio" name="success2" checked></input>
25
25
 
26
26
  <!-- @with_label -->
27
- <label class="ui-row" style="gap: var(--ui-space-1); cursor: pointer;">
27
+ <label class="ui-row " style="gap: var(--ui-space-1); cursor: pointer">
28
28
  <input class="ui-radio" type="radio" name="labeled"></input>
29
29
  <span>{{ t('option_one', 'Option one') }}</span>
30
30
  </label>
31
31
 
32
32
  <!-- @radio_group -->
33
- <fieldset style="border: none; padding: 0; margin: 0;">
33
+ <fieldset class="" style="border: none; padding: 0; margin: 0">
34
34
  <legend style="font-weight: 600; margin-block-end: var(--ui-space-1);">{{ t('choose_an_option', 'Choose an option') }}</legend>
35
35
  <div class="ui-column" style="--column-gap: var(--ui-space-1);">
36
- <label class="ui-row" style="gap: var(--ui-space-1); cursor: pointer;">
36
+ <label class="ui-row " style="gap: var(--ui-space-1); cursor: pointer">
37
37
  <input class="ui-radio" type="radio" name="group-demo" checked></input>
38
38
  <span>{{ t('option_a', 'Option A') }}</span>
39
39
  </label>
40
- <label class="ui-row" style="gap: var(--ui-space-1); cursor: pointer;">
40
+ <label class="ui-row " style="gap: var(--ui-space-1); cursor: pointer">
41
41
  <input class="ui-radio" type="radio" name="group-demo"></input>
42
42
  <span>{{ t('option_b', 'Option B') }}</span>
43
43
  </label>
44
- <label class="ui-row" style="gap: var(--ui-space-1); cursor: pointer;">
44
+ <label class="ui-row " style="gap: var(--ui-space-1); cursor: pointer">
45
45
  <input class="ui-radio" type="radio" name="group-demo"></input>
46
46
  <span>{{ t('option_c', 'Option C') }}</span>
47
47
  </label>
@@ -18,7 +18,7 @@ description: Switch control for boolean states. Uses checkbox semantics with rol
18
18
  </label>
19
19
 
20
20
  <!-- @sizes -->
21
- <div style="display: flex; gap: var(--ui-space-2); align-items: center;">
21
+ <div class="ui-flex ui-gap-2 ui-items-center">
22
22
  <label class="ui-toggle ui-toggle--sm">
23
23
  <input class="ui-toggle__input" type="checkbox" role="switch"></input>
24
24
  <span class="ui-toggle__track"></span>
@@ -37,7 +37,7 @@ description: Switch control for boolean states. Uses checkbox semantics with rol
37
37
  </div>
38
38
 
39
39
  <!-- @disabled -->
40
- <div style="display: flex; gap: var(--ui-space-2);">
40
+ <div class="ui-flex ui-gap-2">
41
41
  <label class="ui-toggle">
42
42
  <input class="ui-toggle__input" type="checkbox" role="switch" disabled></input>
43
43
  <span class="ui-toggle__track"></span>
@@ -51,7 +51,7 @@ description: Switch control for boolean states. Uses checkbox semantics with rol
51
51
  </div>
52
52
 
53
53
  <!-- @with_label -->
54
- <div style="display: flex; align-items: center; gap: var(--ui-space-2);">
54
+ <div class="ui-flex ui-items-center ui-gap-2">
55
55
  <label class="ui-toggle">
56
56
  <input class="ui-toggle__input" type="checkbox" role="switch" id="notifications"></input>
57
57
  <span class="ui-toggle__track"></span>
@@ -81,7 +81,7 @@ description: Trigger button with floating menu panel. Reuses the menu component
81
81
  </div>
82
82
 
83
83
  <!-- @align_end -->
84
- <div style="display: flex; justify-content: flex-end">
84
+ <div class="ui-flex ui-justify-end">
85
85
  <div class="ui-dropdown-menu ui-dropdown-menu--open ui-dropdown-menu--align-end">
86
86
  <button class="ui-dropdown-menu__trigger ui-button ui-button--ghost" type="button">⋮</button>
87
87
  <div class="ui-dropdown-menu__panel" role="menu">
@@ -4,8 +4,8 @@ description: Structured modal with header, body, and footer sections. Use with m
4
4
  ---
5
5
 
6
6
  <!-- @default -->
7
- <div style="position: relative; height: 240px; background: var(--ui-color-bg-subtle);">
8
- <div class="ui-modal ui-modal--visible" style="position: absolute;">
7
+ <div class="demo-area" style="--demo-h: 240px">
8
+ <div class="ui-modal ui-modal--visible ui-absolute">
9
9
  <div class="ui-modal__content ui-dialog" style="max-height: 200px;">
10
10
  <header class="ui-dialog__header">
11
11
  <h2 class="ui-dialog__title">{{ t('dialog_title', 'Dialog Title') }}</h2>
@@ -23,8 +23,8 @@ description: Structured modal with header, body, and footer sections. Use with m
23
23
  </div>
24
24
 
25
25
  <!-- @borderless -->
26
- <div style="position: relative; height: 200px; background: var(--ui-color-bg-subtle);">
27
- <div class="ui-modal ui-modal--visible" style="position: absolute;">
26
+ <div class="demo-area">
27
+ <div class="ui-modal ui-modal--visible ui-absolute">
28
28
  <div class="ui-modal__content ui-dialog ui-dialog--borderless" style="max-height: 180px;">
29
29
  <header class="ui-dialog__header">
30
30
  <h2 class="ui-dialog__title">{{ t('simple_dialog', 'Simple Dialog') }}</h2>
@@ -40,8 +40,8 @@ description: Structured modal with header, body, and footer sections. Use with m
40
40
  </div>
41
41
 
42
42
  <!-- @confirmation_dialog -->
43
- <div style="position: relative; height: 200px; background: var(--ui-color-bg-subtle);">
44
- <div class="ui-modal ui-modal--sm ui-modal--visible" style="position: absolute;">
43
+ <div class="demo-area">
44
+ <div class="ui-modal ui-modal--sm ui-modal--visible ui-absolute">
45
45
  <div class="ui-modal__content ui-dialog">
46
46
  <header class="ui-dialog__header">
47
47
  <h2 class="ui-dialog__title">{{ t('delete_item', 'Delete Item?') }}</h2>
@@ -4,9 +4,9 @@ title: Drawer
4
4
 
5
5
  <!-- @default_end -->
6
6
  <!-- Slides in from the end (right in LTR) -->
7
- <div style="position:relative;height:300px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
8
- <div class="ui-drawer-overlay" style="position:absolute"></div>
9
- <div class="ui-drawer ui-drawer--end" style="position:absolute" data-state="open">
7
+ <div class="demo-container demo-container--overflow" style="--demo-h: 300px">
8
+ <div class="ui-drawer-overlay ui-absolute"></div>
9
+ <div class="ui-drawer ui-drawer--end ui-absolute" data-state="open">
10
10
  <div class="ui-drawer__header">
11
11
  <div>
12
12
  <h2 class="ui-drawer__title">{{ t('drawer_title', 'Drawer Title') }}</h2>
@@ -25,8 +25,8 @@ title: Drawer
25
25
  </div>
26
26
 
27
27
  <!-- @positions | column -->
28
- <div style="position:relative;height:200px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
29
- <div class="ui-drawer ui-drawer--start ui-drawer--sm" style="position:absolute" data-state="open">
28
+ <div class="demo-container demo-container--overflow">
29
+ <div class="ui-drawer ui-drawer--start ui-drawer--sm ui-absolute" data-state="open">
30
30
  <div class="ui-drawer__header">
31
31
  <h2 class="ui-drawer__title">{{ t('start', 'Start') }}</h2>
32
32
  </div>
@@ -35,8 +35,8 @@ title: Drawer
35
35
  </div>
36
36
  </div>
37
37
  </div>
38
- <div style="position:relative;height:200px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
39
- <div class="ui-drawer ui-drawer--top" style="position:absolute" data-state="open">
38
+ <div class="demo-container demo-container--overflow">
39
+ <div class="ui-drawer ui-drawer--top ui-absolute" data-state="open">
40
40
  <div class="ui-drawer__header">
41
41
  <h2 class="ui-drawer__title">{{ t('top', 'Top') }}</h2>
42
42
  </div>
@@ -45,8 +45,8 @@ title: Drawer
45
45
  </div>
46
46
  </div>
47
47
  </div>
48
- <div style="position:relative;height:200px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
49
- <div class="ui-drawer ui-drawer--bottom" style="position:absolute" data-state="open">
48
+ <div class="demo-container demo-container--overflow">
49
+ <div class="ui-drawer ui-drawer--bottom ui-absolute" data-state="open">
50
50
  <div class="ui-drawer__header">
51
51
  <h2 class="ui-drawer__title">{{ t('bottom', 'Bottom') }}</h2>
52
52
  </div>
@@ -57,29 +57,29 @@ title: Drawer
57
57
  </div>
58
58
 
59
59
  <!-- @sizes | column -->
60
- <div style="position:relative;height:150px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
61
- <div class="ui-drawer ui-drawer--end ui-drawer--sm" style="position:absolute" data-state="open">
60
+ <div class="demo-container demo-container--overflow" style="--demo-h: 150px">
61
+ <div class="ui-drawer ui-drawer--end ui-drawer--sm ui-absolute" data-state="open">
62
62
  <div class="ui-drawer__body">
63
63
  <p>{{ t('small_drawer', 'Small drawer') }}</p>
64
64
  </div>
65
65
  </div>
66
66
  </div>
67
- <div style="position:relative;height:150px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
68
- <div class="ui-drawer ui-drawer--end" style="position:absolute" data-state="open">
67
+ <div class="demo-container demo-container--overflow" style="--demo-h: 150px">
68
+ <div class="ui-drawer ui-drawer--end ui-absolute" data-state="open">
69
69
  <div class="ui-drawer__body">
70
70
  <p>{{ t('default_drawer', 'Default drawer') }}</p>
71
71
  </div>
72
72
  </div>
73
73
  </div>
74
- <div style="position:relative;height:150px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
75
- <div class="ui-drawer ui-drawer--end ui-drawer--lg" style="position:absolute" data-state="open">
74
+ <div class="demo-container demo-container--overflow" style="--demo-h: 150px">
75
+ <div class="ui-drawer ui-drawer--end ui-drawer--lg ui-absolute" data-state="open">
76
76
  <div class="ui-drawer__body">
77
77
  <p>{{ t('large_drawer', 'Large drawer') }}</p>
78
78
  </div>
79
79
  </div>
80
80
  </div>
81
- <div style="position:relative;height:150px;overflow:hidden;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md)">
82
- <div class="ui-drawer ui-drawer--end ui-drawer--full" style="position:absolute" data-state="open">
81
+ <div class="demo-container demo-container--overflow" style="--demo-h: 150px">
82
+ <div class="ui-drawer ui-drawer--end ui-drawer--full ui-absolute" data-state="open">
83
83
  <div class="ui-drawer__body">
84
84
  <p>{{ t('full_size_drawer', 'Full-size drawer') }}</p>
85
85
  </div>
@@ -4,8 +4,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
4
4
  ---
5
5
 
6
6
  <!-- @default -->
7
- <div style="position: relative; height: 200px; background: var(--ui-color-bg-subtle);">
8
- <div class="ui-modal ui-modal--visible" style="position: absolute;">
7
+ <div class="demo-area">
8
+ <div class="ui-modal ui-modal--visible ui-absolute">
9
9
  <div class="ui-modal__content">
10
10
  <p>{{ t('modal_content_goes_here', 'Modal content goes here') }}</p>
11
11
  </div>
@@ -13,8 +13,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
13
13
  </div>
14
14
 
15
15
  <!-- @sizes -->
16
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
17
- <div class="ui-modal ui-modal--sm ui-modal--visible" style="position: absolute;">
16
+ <div class="demo-area" style="--demo-h: 120px">
17
+ <div class="ui-modal ui-modal--sm ui-modal--visible ui-absolute">
18
18
  <div class="ui-modal__content">
19
19
  <p>{{ t('small_modal', 'Small modal') }}</p>
20
20
  </div>
@@ -22,8 +22,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
22
22
  </div>
23
23
 
24
24
  <!-- @large -->
25
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
26
- <div class="ui-modal ui-modal--lg ui-modal--visible" style="position: absolute;">
25
+ <div class="demo-area" style="--demo-h: 120px">
26
+ <div class="ui-modal ui-modal--lg ui-modal--visible ui-absolute">
27
27
  <div class="ui-modal__content">
28
28
  <p>{{ t('large_modal', 'Large modal') }}</p>
29
29
  </div>
@@ -31,8 +31,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
31
31
  </div>
32
32
 
33
33
  <!-- @full -->
34
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
35
- <div class="ui-modal ui-modal--full ui-modal--visible" style="position: absolute;">
34
+ <div class="demo-area" style="--demo-h: 120px">
35
+ <div class="ui-modal ui-modal--full ui-modal--visible ui-absolute">
36
36
  <div class="ui-modal__content">
37
37
  <p>{{ t('full_screen_modal', 'Full-screen modal') }}</p>
38
38
  </div>
@@ -41,8 +41,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
41
41
 
42
42
  <!-- @entering_animation -->
43
43
  <!-- Apply entering modifier for open transition. -->
44
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
45
- <div class="ui-modal ui-modal--visible ui-modal--entering" style="position: absolute;">
44
+ <div class="demo-area" style="--demo-h: 120px">
45
+ <div class="ui-modal ui-modal--visible ui-modal--entering ui-absolute">
46
46
  <div class="ui-modal__content">
47
47
  <p>{{ t('entering_modal', 'Entering modal') }}</p>
48
48
  </div>
@@ -50,8 +50,8 @@ description: Container for modal dialogs. Use with overlay for backdrop effect.
50
50
  </div>
51
51
 
52
52
  <!-- @with_scrollable_content -->
53
- <div style="position: relative; height: 200px; background: var(--ui-color-bg-subtle);">
54
- <div class="ui-modal ui-modal--visible" style="position: absolute;">
53
+ <div class="demo-area">
54
+ <div class="ui-modal ui-modal--visible ui-absolute">
55
55
  <div class="ui-modal__content" style="max-height: 150px;">
56
56
  <div class="ui-modal__body">
57
57
  <p>{{ t('line_1', 'Line 1') }}</p>
@@ -4,24 +4,24 @@ description: Full viewport backdrop for modals, dialogs, and drawers. Controls v
4
4
  ---
5
5
 
6
6
  <!-- @default -->
7
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
8
- <div class="ui-overlay" style="position: absolute;"></div>
7
+ <div class="demo-area" style="--demo-h: 120px">
8
+ <div class="ui-overlay ui-absolute"></div>
9
9
  <p style="position: relative; padding: var(--ui-space-2);">{{ t('content_behind_overlay', 'Content behind overlay') }}</p>
10
10
  </div>
11
11
 
12
12
  <!-- @light_variant -->
13
- <div style="position: relative; height: 120px; background: var(--ui-color-text);">
14
- <div class="ui-overlay ui-overlay--light" style="position: absolute;"></div>
13
+ <div class="demo-area" style="--demo-h: 120px; background: var(--ui-color-text)">
14
+ <div class="ui-overlay ui-overlay--light ui-absolute"></div>
15
15
  <p style="position: relative; padding: var(--ui-space-2); color: white;">{{ t('dark_content_behind_light_overlay', 'Dark content behind light overlay') }}</p>
16
16
  </div>
17
17
 
18
18
  <!-- @blur_variant -->
19
- <div style="position: relative; height: 120px; background: linear-gradient(45deg, var(--ui-color-primary), var(--ui-color-success));">
20
- <div class="ui-overlay ui-overlay--blur" style="position: absolute;"></div>
19
+ <div class="demo-area" style="--demo-h: 120px; background: linear-gradient(45deg, var(--ui-color-primary), var(--ui-color-success))">
20
+ <div class="ui-overlay ui-overlay--blur ui-absolute"></div>
21
21
  <p style="position: relative; padding: var(--ui-space-2); color: white;">{{ t('blurred_backdrop', 'Blurred backdrop') }}</p>
22
22
  </div>
23
23
 
24
24
  <!-- @with_animation -->
25
- <div style="position: relative; height: 120px; background: var(--ui-color-bg-subtle);">
26
- <div class="ui-overlay ui-overlay--animate ui-overlay--visible" style="position: absolute;"></div>
25
+ <div class="demo-area" style="--demo-h: 120px">
26
+ <div class="ui-overlay ui-overlay--animate ui-overlay--visible ui-absolute"></div>
27
27
  </div>
@@ -4,12 +4,12 @@ description: Floating panel for additional content. Larger than tooltip, can con
4
4
  ---
5
5
 
6
6
  <!-- @default -->
7
- <div class="ui-popover" style="position: relative;">
7
+ <div class="ui-popover ui-relative">
8
8
  <p>{{ t('popover_content', 'Popover content goes here. Can contain multiple paragraphs and other elements.') }}</p>
9
9
  </div>
10
10
 
11
11
  <!-- @with_header -->
12
- <div class="ui-popover" style="position: relative;">
12
+ <div class="ui-popover ui-relative">
13
13
  <header class="ui-popover__header">
14
14
  <h3 class="ui-popover__title">{{ t('popover_title', 'Popover Title') }}</h3>
15
15
  </header>
@@ -18,21 +18,21 @@ description: Floating panel for additional content. Larger than tooltip, can con
18
18
 
19
19
  <!-- @positions -->
20
20
  <div style="padding: var(--ui-space-4);">
21
- <div class="ui-popover ui-popover--top" style="position: relative;">
21
+ <div class="ui-popover ui-popover--top ui-relative">
22
22
  <p>{{ t('top_arrow_down', 'Top (arrow down)') }}</p>
23
23
  </div>
24
24
  </div>
25
25
  <div style="padding: var(--ui-space-4);">
26
- <div class="ui-popover ui-popover--bottom" style="position: relative;">
26
+ <div class="ui-popover ui-popover--bottom ui-relative">
27
27
  <p>{{ t('bottom_arrow_up', 'Bottom (arrow up)') }}</p>
28
28
  </div>
29
29
  </div>
30
30
 
31
31
  <!-- @visibility -->
32
32
  <!-- Control popover visibility and animation. -->
33
- <div class="ui-popover ui-popover--visible ui-popover--animate" style="position: relative;">
33
+ <div class="ui-popover ui-popover--visible ui-popover--animate ui-relative">
34
34
  <p>{{ t('visible_and_animated', 'Visible and animated') }}</p>
35
35
  </div>
36
- <div class="ui-popover ui-popover--hidden" style="position: relative;">
36
+ <div class="ui-popover ui-popover--hidden ui-relative">
37
37
  <p>{{ t('hidden_popover', 'Hidden popover') }}</p>
38
38
  </div>
@@ -4,23 +4,23 @@ description: Small informational popup for additional context. Position via JS.
4
4
  ---
5
5
 
6
6
  <!-- @positions -->
7
- <div style="display: flex; gap: var(--ui-space-4); padding: var(--ui-space-4); flex-wrap: wrap;">
8
- <div style="position: relative;">
9
- <span class="ui-tooltip ui-tooltip--top" style="position: relative;">{{ t('top', 'Top') }}</span>
7
+ <div class="ui-flex ui-gap-4 ui-p-4 ui-flex-wrap">
8
+ <div class="ui-relative">
9
+ <span class="ui-tooltip ui-tooltip--top ui-relative">{{ t('top', 'Top') }}</span>
10
10
  </div>
11
- <div style="position: relative;">
12
- <span class="ui-tooltip ui-tooltip--bottom" style="position: relative;">{{ t('bottom', 'Bottom') }}</span>
11
+ <div class="ui-relative">
12
+ <span class="ui-tooltip ui-tooltip--bottom ui-relative">{{ t('bottom', 'Bottom') }}</span>
13
13
  </div>
14
- <div style="position: relative;">
15
- <span class="ui-tooltip ui-tooltip--start" style="position: relative;">{{ t('start', 'Start') }}</span>
14
+ <div class="ui-relative">
15
+ <span class="ui-tooltip ui-tooltip--start ui-relative">{{ t('start', 'Start') }}</span>
16
16
  </div>
17
- <div style="position: relative;">
18
- <span class="ui-tooltip ui-tooltip--end" style="position: relative;">{{ t('end', 'End') }}</span>
17
+ <div class="ui-relative">
18
+ <span class="ui-tooltip ui-tooltip--end ui-relative">{{ t('end', 'End') }}</span>
19
19
  </div>
20
20
  </div>
21
21
 
22
22
  <!-- @with_animation -->
23
- <span class="ui-tooltip ui-tooltip--top ui-tooltip--animate ui-tooltip--visible" style="position: relative;">{{ t('animated_tooltip', 'Animated tooltip') }}</span>
23
+ <span class="ui-tooltip ui-tooltip--top ui-tooltip--animate ui-tooltip--visible ui-relative">{{ t('animated_tooltip', 'Animated tooltip') }}</span>
24
24
 
25
25
  <!-- @anchor_positioned -->
26
26
  <!-- Browser-native positioning via CSS Anchor Positioning. No JS needed for placement. Wrapped in @supports — falls back to manual positioning in unsupported browsers. -->
@@ -40,6 +40,6 @@ import '@teseor/css/dist/index.css';
40
40
 
41
41
  <!-- @customize -->
42
42
  <!-- Override design tokens with CSS custom properties. No build step required. -->
43
- <div class="theme-demo" style="--ui-hue-primary: 270">
43
+ <div class="demo-theme" style="--ui-color-primary: oklch(55% 0.22 290)">
44
44
  <button class="ui-button">{{ t('purple_brand', 'Purple brand') }}</button>
45
45
  </div>