actual-css 0.9.0 → 0.9.1

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 (84) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/components.json +2 -0
  3. package/dist/actual.css +10 -3
  4. package/dist/actual.full.css +238 -71
  5. package/dist/actual.full.js +1 -1
  6. package/dist/actual.full.min.css +1 -1
  7. package/dist/actual.min.css +1 -1
  8. package/docs/pages/foundations/tokens.md +1 -1
  9. package/docs/pages/guides/progressive-enhancement.md +12 -8
  10. package/package.json +159 -159
  11. package/src/css/components/accordion.css +2 -0
  12. package/src/css/components/actions.css +2 -0
  13. package/src/css/components/alert.css +2 -0
  14. package/src/css/components/app-nav.css +2 -0
  15. package/src/css/components/avatar.css +2 -0
  16. package/src/css/components/badge.css +2 -0
  17. package/src/css/components/breadcrumb.css +2 -0
  18. package/src/css/components/busy.css +2 -0
  19. package/src/css/components/button.css +2 -0
  20. package/src/css/components/card.css +2 -0
  21. package/src/css/components/chat.css +2 -0
  22. package/src/css/components/data-list.css +2 -0
  23. package/src/css/components/drawer.css +35 -22
  24. package/src/css/components/fab.css +2 -0
  25. package/src/css/components/flyout.css +2 -0
  26. package/src/css/components/indicator.css +2 -0
  27. package/src/css/components/join.css +2 -0
  28. package/src/css/components/key.css +2 -0
  29. package/src/css/components/list.css +2 -0
  30. package/src/css/components/meter.css +2 -0
  31. package/src/css/components/modal.css +47 -40
  32. package/src/css/components/navbar.css +2 -0
  33. package/src/css/components/pagination.css +2 -0
  34. package/src/css/components/progress.css +2 -0
  35. package/src/css/components/rating.css +2 -0
  36. package/src/css/components/scrollspy.css +2 -0
  37. package/src/css/components/skeleton.css +2 -0
  38. package/src/css/components/spinner.css +2 -0
  39. package/src/css/components/status-bar.css +2 -0
  40. package/src/css/components/steps.css +2 -0
  41. package/src/css/components/tab.css +2 -0
  42. package/src/css/components/table.css +2 -0
  43. package/src/css/components/tooltip.css +2 -0
  44. package/src/css/core/print.css +3 -0
  45. package/src/css/core/variants.css +7 -3
  46. package/src/css/effects/aura.css +2 -0
  47. package/src/css/forms/choice-card.css +4 -0
  48. package/src/css/forms/control.css +2 -0
  49. package/src/css/forms/floating-field.css +5 -1
  50. package/src/css/forms/form-actions.css +2 -0
  51. package/src/css/forms/form.css +2 -0
  52. package/src/css/forms/input-icon.css +2 -0
  53. package/src/css/forms/native.css +2 -0
  54. package/src/css/forms/otp.css +10 -0
  55. package/src/css/forms/range.css +2 -0
  56. package/src/css/forms/select.css +2 -0
  57. package/src/css/forms/switch.css +2 -0
  58. package/src/css/forms/validation.css +2 -0
  59. package/src/css/layout/app-layout.css +2 -0
  60. package/src/css/layout/app-shell.css +5 -1
  61. package/src/css/layout/center.css +2 -0
  62. package/src/css/layout/cluster.css +2 -0
  63. package/src/css/layout/column-layout.css +2 -0
  64. package/src/css/layout/frame.css +2 -0
  65. package/src/css/layout/grid.css +2 -0
  66. package/src/css/layout/media.css +2 -1
  67. package/src/css/layout/scroll-snap.css +2 -0
  68. package/src/css/layout/scroll-target.css +2 -0
  69. package/src/css/layout/sidebar-layout.css +2 -0
  70. package/src/css/layout/stack.css +2 -1
  71. package/src/css/layout/switcher.css +2 -0
  72. package/src/css/layout/topbar.css +2 -0
  73. package/src/css/typography/fluid.css +2 -0
  74. package/src/css/typography/lead.css +2 -1
  75. package/src/css/typography/overline.css +2 -0
  76. package/src/css/typography/prose.css +2 -0
  77. package/src/css/utilities/base.css +6 -1
  78. package/src/js/context-menu.js +56 -15
  79. package/src/js/enhancement-loader.js +5 -1
  80. package/src/js/escape.js +11 -1
  81. package/src/js/flyout.js +6 -1
  82. package/src/js/focus.js +8 -3
  83. package/src/js/surface.js +28 -0
  84. package/src/js/tooltip.js +10 -4
@@ -1 +1 @@
1
- *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; } body { margin: 0; } button, input, textarea, select { font: inherit; } [hidden]:not([hidden="until-found"]) { display: none !important; } :where(img, svg, video) { max-inline-size: 100%; block-size: auto; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto !important; } *, *::before, *::after { animation-duration: 0.01ms !important; animation-delay: 0s !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; transition-delay: 0s !important; } } :root { --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --line-height: 1.5; --line-height-tight: 1.25; --line-height-relaxed: 1.75; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-size-xs: 0.8125rem; --font-size-sm: 0.875rem; --font-size-md: 1rem; --font-size-lg: 1.125rem; --gap: 0.75rem; --density-space: var(--space-40); --space-10: 0.25rem; --space-20: 0.5rem; --space-30: 0.75rem; --space-40: 1rem; --space-50: 1.5rem; --space-60: 2rem; --border-width: 1px; --radius-full: 9999px; --shadow: 0 1px 3px rgb(0 0 0 / 0.05), 0 4px 12px rgb(0 0 0 / 0.04); --shadow-popout: 0 0.25rem 0.75rem rgb(0 0 0 / 0.15); --duration: 150ms; --duration-fast: 100ms; --duration-slow: 200ms; --duration-spin: 0.75s; --duration-shimmer: 1.2s; --ease-enter: cubic-bezier(0.2, 0, 0, 1); --ease-exit: cubic-bezier(0.4, 0, 1, 1); --focus-outline-color: currentColor; --focus-outline: calc(var(--border-width) * 2) solid var(--focus-outline-color); --focus-outline-offset: 2px; --focus-ring-width: 3px; --indicator-offset: 14.65%; --backdrop-color: rgb(0 0 0); --backdrop-opacity: 0.45; --backdrop-fill: rgb(0 0 0 / var(--backdrop-opacity)); --bar-height: 0.65rem; --control-size-sm: 2rem; --control-size-md: 2.375rem; --control-size-lg: 2.75rem; --control-size: var(--control-size-md); --control-pad-x: var(--font-size-md); --control-font-size: var(--font-size-md); --choice-control-size: 1.125em; --disabled-opacity: 0.65; } :root, [data-theme] { --state-selected: var(--primary); --state-selected-fg: var(--primary-fg); --state-disabled: var(--text-subtle); --indicator-ring: var(--surface); } :root { --soft-bg-mix: 88%; --soft-border-mix: 65%; --soft-hover-alpha: 12%; --soft-fg-mix: 100%; --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%238a8594' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); --icon-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E"); --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3C/svg%3E"); --icon-plus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E"); --viewport-block: 100vh; --viewport-inline: 100vw; --z-sticky: 10; --z-menu: 20; --z-status: 60; } @media (forced-colors: active) { :root, [data-theme] { --state-disabled: GrayText; --disabled-opacity: 1; } } @supports (block-size: 100dvh) { :root { --viewport-block: 100dvh; } } @supports (inline-size: 100vi) { :root { --viewport-inline: 100vi; } } @supports (color: color-mix(in oklch, red, white)) { :root, [data-theme] { --shadow: 0 1px 3px color-mix(in oklch, var(--shadow-color) 5%, transparent), 0 4px 12px color-mix(in oklch, var(--shadow-color) 4%, transparent); --shadow-popout: 0 0.25rem 0.75rem color-mix(in oklch, var(--shadow-color) 15%, transparent); } :root, [data-theme] { --backdrop-fill: color-mix( in oklch, var(--backdrop-color) calc(var(--backdrop-opacity) * 100%), transparent ); } } :root { color-scheme: light dark; } [data-theme="light"] { color-scheme: light; } [data-theme="dark"] { color-scheme: dark; } @supports not (color: light-dark(red, blue)) { :root, [data-theme="light"], [data-theme="dark"] { color-scheme: light; } } :root, [data-theme="light"] { --primary: hsl(268 32% 33%); --primary-fg: hsl(0 0% 98%); --secondary: hsl(16 38% 38%); --secondary-fg: hsl(0 0% 98%); --success: hsl(150 40% 31%); --success-fg: hsl(0 0% 98%); --warning: hsl(36 68% 34%); --warning-fg: hsl(0 0% 98%); --danger: hsl(5 58% 43%); --danger-fg: hsl(0 0% 98%); --neutral: hsl(258 7% 43%); --neutral-fg: hsl(0 0% 98%); --surface: hsl(0 0% 100%); --surface-raised: hsl(0 0% 100%); --surface-subtle: hsl(262 24% 96%); --surface-solid: hsl(261 16% 13%); --text: hsl(261 20% 13%); --text-muted: hsl(259 9% 42%); --text-subtle: hsl(258 7% 57%); --border: hsl(260 15% 88%); --focus: var(--neutral); --focus-ring: hsl(258 7% 43% / 0.3); --hover-overlay: hsl(260 20% 10% / 0.04); --radius: 0.5rem; --radius-sm: 0.25rem; --radius-lg: 0.75rem; --shadow-color: hsl(260 25% 10%); --hgroup-gap: 0.25em; } :root, [data-theme] { --heading: var(--text); --selection-bg: var(--primary); --selection-fg: var(--primary-fg); --focus-ring-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring); } :where([data-theme]:not([data-theme="light"]):not([data-theme="dark"])) { --primary-soft-fg: initial; --secondary-soft-fg: initial; --success-soft-fg: initial; --warning-soft-fg: initial; --danger-soft-fg: initial; --neutral-soft-fg: initial; } :root, [data-theme="light"], [data-theme="dark"] { --secondary-soft-fg: color-mix(in oklab, var(--text) 10%, var(--secondary) 90%); --success-soft-fg: color-mix(in oklab, var(--text) 15%, var(--success) 85%); --warning-soft-fg: color-mix(in oklab, var(--text) 25%, var(--warning) 75%); --danger-soft-fg: color-mix(in oklab, var(--text) 15%, var(--danger) 85%); --neutral-soft-fg: color-mix(in oklab, var(--text) 20%, var(--neutral) 80%); } :root, [data-theme] { accent-color: var(--primary); } [data-tone="dark"] { --tone-fg: white; } [data-tone="light"] { --tone-fg: var(--text); } @supports (color: color-mix(in oklch, red, white)) { :root, [data-theme] { --focus-ring: color-mix(in oklch, var(--focus) 30%, transparent); } } @supports (color: light-dark(red, blue)) { :root, [data-theme="light"] { --primary: light-dark(hsl(268 32% 33%), hsl(268 42% 76%)); --primary-fg: light-dark(hsl(0 0% 98%), hsl(268 30% 12%)); --secondary: light-dark(hsl(16 38% 38%), hsl(18 45% 72%)); --secondary-fg: light-dark(hsl(0 0% 98%), hsl(18 32% 11%)); --success: light-dark(hsl(150 40% 31%), hsl(150 38% 62%)); --success-fg: light-dark(hsl(0 0% 98%), hsl(150 35% 8%)); --warning: light-dark(hsl(36 68% 34%), hsl(40 62% 64%)); --warning-fg: light-dark(hsl(0 0% 98%), hsl(38 35% 10%)); --danger: light-dark(hsl(5 58% 43%), hsl(4 60% 70%)); --danger-fg: light-dark(hsl(0 0% 98%), hsl(4 35% 10%)); --neutral: light-dark(hsl(258 7% 43%), hsl(258 10% 72%)); --neutral-fg: light-dark(hsl(0 0% 98%), hsl(260 18% 10%)); --surface: light-dark(hsl(0 0% 100%), hsl(263 17% 9%)); --surface-raised: light-dark(hsl(0 0% 100%), hsl(263 15% 12%)); --surface-subtle: light-dark(hsl(262 24% 96%), hsl(263 13% 16%)); --surface-solid: light-dark(hsl(261 16% 13%), hsl(0 0% 96%)); --text: light-dark(hsl(261 20% 13%), hsl(260 12% 95%)); --text-muted: light-dark(hsl(259 9% 42%), hsl(259 9% 67%)); --text-subtle: light-dark(hsl(258 7% 57%), hsl(258 7% 54%)); --border: light-dark(hsl(260 15% 88%), hsl(262 12% 24%)); --focus-ring: light-dark(hsl(258 7% 43% / 0.3), hsl(258 10% 72% / 0.28)); --hover-overlay: light-dark(hsl(260 20% 10% / 0.04), hsl(0 0% 100% / 0.06)); --shadow-color: light-dark(hsl(260 25% 10%), hsl(262 40% 2%)); } } @supports (color: color-mix(in oklch, red, white)) and (color: light-dark(red, blue)) { :root, [data-theme] { --focus-ring: light-dark( color-mix(in oklch, var(--focus) 30%, transparent), color-mix(in oklch, var(--focus) 28%, transparent) ); } } @media (prefers-contrast: more) { :root, [data-theme][data-theme] { --border-width: 2px; --focus-outline-offset: 3px; --focus-ring-width: 4px; --text-muted: var(--text); --text-subtle: var(--text); } } body { background: var(--surface); color: var(--text); font-family: var(--font-sans); line-height: var(--line-height); } a { color: var(--link, inherit); text-underline-offset: 0.18em; } a:hover { text-decoration-thickness: 0.12em; } :where(h1, h2, h3, h4, h5, h6) { color: var(--heading, inherit); line-height: var(--line-height-tight); text-wrap: balance; } hgroup { display: grid; gap: var(--hgroup-gap); } hgroup > * { margin-block: 0; } hr { border: 0; border-block-start: var(--border-width) solid var(--border); margin-block: var(--hr-space, var(--space-60)); margin-inline: 0; } code, kbd, samp, pre { font-family: var(--font-mono); } pre { overflow-x: auto; } small { font-size: 0.875em; } ::selection { background: var(--selection-bg, var(--primary)); color: var(--selection-fg, var(--primary-fg)); } .primary { --intent: var(--primary); --intent-fg: var(--primary-fg); --intent-soft-fg: var(--primary-soft-fg); } .secondary { --intent: var(--secondary); --intent-fg: var(--secondary-fg); --intent-soft-fg: var(--secondary-soft-fg); } .success { --intent: var(--success); --intent-fg: var(--success-fg); --intent-soft-fg: var(--success-soft-fg); } .warning { --intent: var(--warning); --intent-fg: var(--warning-fg); --intent-soft-fg: var(--warning-soft-fg); } .danger { --intent: var(--danger); --intent-fg: var(--danger-fg); --intent-soft-fg: var(--danger-soft-fg); } .neutral { --intent: var(--neutral); --intent-fg: var(--neutral-fg); --intent-soft-fg: var(--neutral-soft-fg); } .intent-color { color: var(--intent); } .solid { --ui-bg: var(--intent, var(--neutral)); --ui-fg: var(--intent-fg, var(--neutral-fg)); --ui-border: transparent; } .soft { --ui-bg: var(--surface-subtle); --ui-border: var(--border); --ui-fg: var(--intent, var(--text)); } .outline { --ui-bg: transparent; --ui-fg: var(--intent, currentColor); --ui-border: var(--intent, currentColor); } .surface { --ui-bg: var(--surface); --ui-fg: var(--intent, var(--text)); --ui-border: var(--border); } .inverted { --ui-bg: var(--surface-solid); --ui-fg: var(--surface); --ui-border: transparent; --ui-hover-bg: var(--surface-solid); --heading: var(--surface); --busy-overlay-bg: var(--surface-solid); background: var(--ui-bg); color: var(--ui-fg); border-color: var(--ui-border); } .compact { --gap: var(--space-20); --density-space: var(--space-20); --control-size: var(--control-size-sm); } .spacious { --gap: var(--space-50); --density-space: var(--space-50); --control-size: var(--control-size-lg); } :where( .btn, .input, .textarea, .select, .color, .file, .field, .choice, .input-icon, .otp, .join, .pagination, .tabs, .tab, .flyout ).sm { --control-size: var(--control-size-sm); --control-font-size: var(--font-size-sm); --control-pad-x: var(--font-size-sm); } :where( .btn, .input, .textarea, .select, .color, .file, .field, .choice, .input-icon, .otp, .join, .pagination, .tabs, .tab, .flyout ).lg { --control-size: var(--control-size-lg); --control-font-size: var(--font-size-lg); --control-pad-x: var(--font-size-lg); } @supports (color: color-mix(in oklch, red, white)) { .soft { --ui-bg: color-mix(in oklab, var(--surface) var(--soft-bg-mix), var(--intent, var(--neutral))); --ui-border: color-mix( in oklab, var(--surface) var(--soft-border-mix), var(--intent, var(--neutral)) ); --ui-fg: var( --intent-soft-fg, color-mix(in oklab, var(--text), var(--intent, var(--text)) var(--soft-fg-mix)) ); } .inverted { --ui-hover-bg: color-mix(in oklch, var(--surface-solid) 88%, black); } } :focus { outline: var(--focus-outline); outline-offset: var(--focus-outline-offset); } @supports selector(:focus-visible) { :focus:not(:focus-visible) { outline: none; } } @media print { :root, body { color-scheme: light; background: #fff; color: #000; } h1, h2, h3, h4, h5, h6 { break-after: avoid; } }
1
+ *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; } body { margin: 0; } button, input, textarea, select { font: inherit; } [hidden]:not([hidden="until-found"]) { display: none !important; } :where(img, svg, video) { max-inline-size: 100%; block-size: auto; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto !important; } *, *::before, *::after { animation-duration: 0.01ms !important; animation-delay: 0s !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; transition-delay: 0s !important; } } :root { --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --line-height: 1.5; --line-height-tight: 1.25; --line-height-relaxed: 1.75; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-size-xs: 0.8125rem; --font-size-sm: 0.875rem; --font-size-md: 1rem; --font-size-lg: 1.125rem; --gap: 0.75rem; --density-space: var(--space-40); --space-10: 0.25rem; --space-20: 0.5rem; --space-30: 0.75rem; --space-40: 1rem; --space-50: 1.5rem; --space-60: 2rem; --border-width: 1px; --radius-full: 9999px; --shadow: 0 1px 3px rgb(0 0 0 / 0.05), 0 4px 12px rgb(0 0 0 / 0.04); --shadow-popout: 0 0.25rem 0.75rem rgb(0 0 0 / 0.15); --duration: 150ms; --duration-fast: 100ms; --duration-slow: 200ms; --duration-spin: 0.75s; --duration-shimmer: 1.2s; --ease-enter: cubic-bezier(0.2, 0, 0, 1); --ease-exit: cubic-bezier(0.4, 0, 1, 1); --focus-outline-color: currentColor; --focus-outline: calc(var(--border-width) * 2) solid var(--focus-outline-color); --focus-outline-offset: 2px; --focus-ring-width: 3px; --indicator-offset: 14.65%; --backdrop-color: rgb(0 0 0); --backdrop-opacity: 0.45; --backdrop-fill: rgb(0 0 0 / var(--backdrop-opacity)); --bar-height: 0.65rem; --control-size-sm: 2rem; --control-size-md: 2.375rem; --control-size-lg: 2.75rem; --control-size: var(--control-size-md); --control-pad-x: var(--font-size-md); --control-font-size: var(--font-size-md); --choice-control-size: 1.125em; --disabled-opacity: 0.65; } :root, [data-theme] { --state-selected: var(--primary); --state-selected-fg: var(--primary-fg); --state-disabled: var(--text-subtle); --indicator-ring: var(--surface); } :root { --soft-bg-mix: 88%; --soft-border-mix: 65%; --soft-hover-alpha: 12%; --soft-fg-mix: 100%; --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%238a8594' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); --icon-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E"); --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3C/svg%3E"); --icon-plus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E"); --viewport-block: 100vh; --viewport-inline: 100vw; --z-sticky: 10; --z-menu: 20; --z-status: 60; } @media (forced-colors: active) { :root, [data-theme] { --state-disabled: GrayText; --disabled-opacity: 1; } } @supports (block-size: 100dvh) { :root { --viewport-block: 100dvh; } } @supports (inline-size: 100vi) { :root { --viewport-inline: 100vi; } } @supports (color: color-mix(in oklch, red, white)) { :root, [data-theme] { --shadow: 0 1px 3px color-mix(in oklch, var(--shadow-color) 5%, transparent), 0 4px 12px color-mix(in oklch, var(--shadow-color) 4%, transparent); --shadow-popout: 0 0.25rem 0.75rem color-mix(in oklch, var(--shadow-color) 15%, transparent); } :root, [data-theme] { --backdrop-fill: color-mix( in oklch, var(--backdrop-color) calc(var(--backdrop-opacity) * 100%), transparent ); } } :root { color-scheme: light dark; } [data-theme="light"] { color-scheme: light; } [data-theme="dark"] { color-scheme: dark; } @supports not (color: light-dark(red, blue)) { :root, [data-theme="light"], [data-theme="dark"] { color-scheme: light; } } :root, [data-theme="light"] { --primary: hsl(268 32% 33%); --primary-fg: hsl(0 0% 98%); --secondary: hsl(16 38% 38%); --secondary-fg: hsl(0 0% 98%); --success: hsl(150 40% 31%); --success-fg: hsl(0 0% 98%); --warning: hsl(36 68% 34%); --warning-fg: hsl(0 0% 98%); --danger: hsl(5 58% 43%); --danger-fg: hsl(0 0% 98%); --neutral: hsl(258 7% 43%); --neutral-fg: hsl(0 0% 98%); --surface: hsl(0 0% 100%); --surface-raised: hsl(0 0% 100%); --surface-subtle: hsl(262 24% 96%); --surface-solid: hsl(261 16% 13%); --text: hsl(261 20% 13%); --text-muted: hsl(259 9% 42%); --text-subtle: hsl(258 7% 57%); --border: hsl(260 15% 88%); --focus: var(--neutral); --focus-ring: hsl(258 7% 43% / 0.3); --hover-overlay: hsl(260 20% 10% / 0.04); --radius: 0.5rem; --radius-sm: 0.25rem; --radius-lg: 0.75rem; --shadow-color: hsl(260 25% 10%); --hgroup-gap: 0.25em; } :root, [data-theme] { --heading: var(--text); --selection-bg: var(--primary); --selection-fg: var(--primary-fg); --focus-ring-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring); } :where([data-theme]:not([data-theme="light"]):not([data-theme="dark"])) { --primary-soft-fg: initial; --secondary-soft-fg: initial; --success-soft-fg: initial; --warning-soft-fg: initial; --danger-soft-fg: initial; --neutral-soft-fg: initial; } :root, [data-theme="light"], [data-theme="dark"] { --secondary-soft-fg: color-mix(in oklab, var(--text) 10%, var(--secondary) 90%); --success-soft-fg: color-mix(in oklab, var(--text) 15%, var(--success) 85%); --warning-soft-fg: color-mix(in oklab, var(--text) 25%, var(--warning) 75%); --danger-soft-fg: color-mix(in oklab, var(--text) 15%, var(--danger) 85%); --neutral-soft-fg: color-mix(in oklab, var(--text) 20%, var(--neutral) 80%); } :root, [data-theme] { accent-color: var(--primary); } [data-tone="dark"] { --tone-fg: white; } [data-tone="light"] { --tone-fg: var(--text); } @supports (color: color-mix(in oklch, red, white)) { :root, [data-theme] { --focus-ring: color-mix(in oklch, var(--focus) 30%, transparent); } } @supports (color: light-dark(red, blue)) { :root, [data-theme="light"] { --primary: light-dark(hsl(268 32% 33%), hsl(268 42% 76%)); --primary-fg: light-dark(hsl(0 0% 98%), hsl(268 30% 12%)); --secondary: light-dark(hsl(16 38% 38%), hsl(18 45% 72%)); --secondary-fg: light-dark(hsl(0 0% 98%), hsl(18 32% 11%)); --success: light-dark(hsl(150 40% 31%), hsl(150 38% 62%)); --success-fg: light-dark(hsl(0 0% 98%), hsl(150 35% 8%)); --warning: light-dark(hsl(36 68% 34%), hsl(40 62% 64%)); --warning-fg: light-dark(hsl(0 0% 98%), hsl(38 35% 10%)); --danger: light-dark(hsl(5 58% 43%), hsl(4 60% 70%)); --danger-fg: light-dark(hsl(0 0% 98%), hsl(4 35% 10%)); --neutral: light-dark(hsl(258 7% 43%), hsl(258 10% 72%)); --neutral-fg: light-dark(hsl(0 0% 98%), hsl(260 18% 10%)); --surface: light-dark(hsl(0 0% 100%), hsl(263 17% 9%)); --surface-raised: light-dark(hsl(0 0% 100%), hsl(263 15% 12%)); --surface-subtle: light-dark(hsl(262 24% 96%), hsl(263 13% 16%)); --surface-solid: light-dark(hsl(261 16% 13%), hsl(0 0% 96%)); --text: light-dark(hsl(261 20% 13%), hsl(260 12% 95%)); --text-muted: light-dark(hsl(259 9% 42%), hsl(259 9% 67%)); --text-subtle: light-dark(hsl(258 7% 57%), hsl(258 7% 54%)); --border: light-dark(hsl(260 15% 88%), hsl(262 12% 24%)); --focus-ring: light-dark(hsl(258 7% 43% / 0.3), hsl(258 10% 72% / 0.28)); --hover-overlay: light-dark(hsl(260 20% 10% / 0.04), hsl(0 0% 100% / 0.06)); --shadow-color: light-dark(hsl(260 25% 10%), hsl(262 40% 2%)); } } @supports (color: color-mix(in oklch, red, white)) and (color: light-dark(red, blue)) { :root, [data-theme] { --focus-ring: light-dark( color-mix(in oklch, var(--focus) 30%, transparent), color-mix(in oklch, var(--focus) 28%, transparent) ); } } @media (prefers-contrast: more) { :root, [data-theme][data-theme] { --border-width: 2px; --focus-outline-offset: 3px; --focus-ring-width: 4px; --text-muted: var(--text); --text-subtle: var(--text); } } body { background: var(--surface); color: var(--text); font-family: var(--font-sans); line-height: var(--line-height); } a { color: var(--link, inherit); text-underline-offset: 0.18em; } a:hover { text-decoration-thickness: 0.12em; } :where(h1, h2, h3, h4, h5, h6) { color: var(--heading, inherit); line-height: var(--line-height-tight); text-wrap: balance; } hgroup { display: grid; gap: var(--hgroup-gap); } hgroup > * { margin-block: 0; } hr { border: 0; border-block-start: var(--border-width) solid var(--border); margin-block: var(--hr-space, var(--space-60)); margin-inline: 0; } code, kbd, samp, pre { font-family: var(--font-mono); } pre { overflow-x: auto; } small { font-size: 0.875em; } ::selection { background: var(--selection-bg, var(--primary)); color: var(--selection-fg, var(--primary-fg)); } .primary { --intent: var(--primary); --intent-fg: var(--primary-fg); --intent-soft-fg: var(--primary-soft-fg); } .secondary { --intent: var(--secondary); --intent-fg: var(--secondary-fg); --intent-soft-fg: var(--secondary-soft-fg); } .success { --intent: var(--success); --intent-fg: var(--success-fg); --intent-soft-fg: var(--success-soft-fg); } .warning { --intent: var(--warning); --intent-fg: var(--warning-fg); --intent-soft-fg: var(--warning-soft-fg); } .danger { --intent: var(--danger); --intent-fg: var(--danger-fg); --intent-soft-fg: var(--danger-soft-fg); } .neutral { --intent: var(--neutral); --intent-fg: var(--neutral-fg); --intent-soft-fg: var(--neutral-soft-fg); } .intent-color { color: var(--intent); } .solid { --ui-bg: var(--intent, var(--neutral)); --ui-fg: var(--intent-fg, var(--neutral-fg)); --ui-border: transparent; } .soft { --ui-bg: var(--surface-subtle); --ui-border: var(--border); --ui-fg: var(--intent, var(--text)); } .outline { --ui-bg: transparent; --ui-fg: var(--intent, currentColor); --ui-border: var(--intent, currentColor); } .surface { --ui-bg: var(--surface); --ui-fg: var(--intent, var(--text)); --ui-border: var(--border); } .inverted { --ui-bg: var(--surface-solid); --ui-fg: var(--surface); --ui-border: transparent; --ui-hover-bg: var(--surface-solid); --heading: var(--surface); --busy-overlay-bg: var(--surface-solid); background: var(--ui-bg); color: var(--ui-fg); border-color: var(--ui-border); } .compact { --gap: var(--space-20); --density-space: var(--space-20); --control-size: var(--control-size-sm); } .spacious { --gap: var(--space-50); --density-space: var(--space-50); --control-size: var(--control-size-lg); } :where( .btn, .input, .textarea, .select, .color, .file, .field, .choice, .choice-card, .input-icon, .floating-field, .otp, .join, .pagination, .tabs, .tab, .flyout ).sm { --control-size: var(--control-size-sm); --control-font-size: var(--font-size-sm); --control-pad-x: var(--font-size-sm); } :where( .btn, .input, .textarea, .select, .color, .file, .field, .choice, .choice-card, .input-icon, .floating-field, .otp, .join, .pagination, .tabs, .tab, .flyout ).lg { --control-size: var(--control-size-lg); --control-font-size: var(--font-size-lg); --control-pad-x: var(--font-size-lg); } @supports (color: color-mix(in oklch, red, white)) { .soft { --ui-bg: color-mix(in oklab, var(--surface) var(--soft-bg-mix), var(--intent, var(--neutral))); --ui-border: color-mix( in oklab, var(--surface) var(--soft-border-mix), var(--intent, var(--neutral)) ); --ui-fg: var( --intent-soft-fg, color-mix(in oklab, var(--text), var(--intent, var(--text)) var(--soft-fg-mix)) ); } .inverted { --ui-hover-bg: color-mix(in oklch, var(--surface-solid) 88%, black); } } :focus { outline: var(--focus-outline); outline-offset: var(--focus-outline-offset); } @supports selector(:focus-visible) { :focus:not(:focus-visible) { outline: none; } } @media print { :root, [data-theme][data-theme], body { color-scheme: light; background: #fff; color: #000; } h1, h2, h3, h4, h5, h6 { break-after: avoid; } }
@@ -505,7 +505,7 @@ Because the native select chevron is an SVG background image and cannot inherit
505
505
 
506
506
  Under `prefers-contrast: more`, the user's contrast preference wins over a theme's palette by contract: the core collapses `--text-muted`/`--text-subtle` to `--text` and thickens borders and focus so no theme can defeat a legibility requirement. This is a deliberate decision, not a specificity quirk — the repeated `[data-theme][data-theme]` attribute only outranks a preset theme stylesheet loaded after the core.
507
507
 
508
- Under `forced-colors: active`, the browser automatically remaps `color`, `background`, and `border` properties to system colors. The default theme provides the few necessary system-color overrides for cases the browser cannot handle — `--focus-outline-color`, `--state-selected`/`--state-selected-fg`, `--state-disabled`, `--backdrop-fill`, and decorative shadow removal. Because that rule targets `:root` (which always matches regardless of `data-theme`) and the `[data-theme]` attributes, it reaches every theme. Components should inherit that baseline; keep local forced-color rules only for custom control geometry, native bar parts, disabled states, or selected states that would otherwise be communicated only by background color.
508
+ Under `forced-colors: active`, the browser automatically remaps `color`, `background`, and `border` properties to system colors. The core only adjusts what the remapping cannot express on its own — `--state-disabled` becomes `GrayText` and `--disabled-opacity` becomes `1` — declared on `:root` and `[data-theme]` so every theme boundary follows. Keep local forced-color rules only for custom control geometry, native bar parts, or selected/checked states that would otherwise be communicated only by background color.
509
509
 
510
510
  ## Component mapping
511
511
 
@@ -286,14 +286,14 @@ The runtime dispatches a small set of public `actual:*` events. All are
286
286
  listenable on the document; cancelable events veto the associated action when
287
287
  `preventDefault()` is called.
288
288
 
289
- | Event | Dispatch | `detail` |
290
- | ---------------------- | ------------------------------ | ------------------------------------ |
291
- | `actual:surface-open` | before a surface opens | `{ surface, options }` |
292
- | `actual:context-menu` | before a context menu opens | `{ menu, context, origin, trigger }` |
293
- | `actual:status` | status module, or any code | `{ message, intent, duration }` |
294
- | `actual:invalid` | after a submit was blocked | `{ form, firstInvalid, message }` |
295
- | `actual:dialog-cancel` | before a native cancel close | `{ dialog, sourceEvent }` |
296
- | `actual:dismiss` | after `--dismiss` hid a target | `{ trigger }` |
289
+ | Event | Dispatch | `detail` |
290
+ | ---------------------- | ----------------------------- | ------------------------------------ |
291
+ | `actual:surface-open` | before a surface opens | `{ surface, options }` |
292
+ | `actual:context-menu` | before a context menu opens | `{ menu, context, origin, trigger }` |
293
+ | `actual:status` | status module, or any code | `{ message, intent, duration }` |
294
+ | `actual:invalid` | after a submit was blocked | `{ form, firstInvalid, message }` |
295
+ | `actual:dialog-cancel` | before a native cancel close | `{ dialog, sourceEvent }` |
296
+ | `actual:dismiss` | after a `--dismiss` dismissal | `{ trigger }` |
297
297
 
298
298
  `actual:surface-open`, `actual:context-menu` and `actual:dialog-cancel` are
299
299
  cancelable. `actual:status` both shows and clears the status bar — omit
@@ -343,6 +343,10 @@ applications that unload the module owning the command.
343
343
  The runtime includes a generic `--dismiss` command for hiding any resolved
344
344
  target. It prevents the trigger's default action, sets `hidden`, and emits a
345
345
  bubbling `actual:dismiss` event with the trigger in `event.detail.trigger`.
346
+ On an open surface (flyout, context menu), the surface consumes the event to
347
+ close through its own lifecycle instead of staying hidden — by the time the
348
+ event reaches document listeners, `hidden` has already been lifted again and
349
+ the surface reads as closed, not merely attribute-hidden.
346
350
 
347
351
  ```html demo
348
352
  <section id="notice" class="alert">
package/package.json CHANGED
@@ -1,159 +1,159 @@
1
- {
2
- "name": "actual-css",
3
- "version": "0.9.0",
4
- "description": "Plain CSS component framework with semantic classes, universal variants, small tokens, theme hooks, and progressive enhancements.",
5
- "type": "module",
6
- "packageManager": "bun@1.4.2",
7
- "license": "MIT",
8
- "author": "Thomas <thomas@lekoala.be>",
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/lekoala/actual-css.git"
12
- },
13
- "homepage": "https://github.com/lekoala/actual-css",
14
- "bugs": {
15
- "url": "https://github.com/lekoala/actual-css/issues"
16
- },
17
- "keywords": [
18
- "css",
19
- "css-framework",
20
- "component-library",
21
- "semantic",
22
- "accessibility",
23
- "dark-mode",
24
- "themable",
25
- "no-build",
26
- "progressive-enhancement"
27
- ],
28
- "exports": {
29
- ".": "./dist/actual.min.css",
30
- "./full": "./dist/actual.full.min.css",
31
- "./css": "./src/css/actual.css",
32
- "./css/components": "./src/css/components/index.css",
33
- "./css/components/*": "./src/css/components/*.css",
34
- "./css/effects": "./src/css/effects/index.css",
35
- "./css/effects/*": "./src/css/effects/*.css",
36
- "./css/forms": "./src/css/forms/base.css",
37
- "./css/forms/all": "./src/css/forms/index.css",
38
- "./css/forms/*": "./src/css/forms/*.css",
39
- "./css/full": "./src/css/actual.full.css",
40
- "./css/layer": "./src/css/actual.layer.css",
41
- "./css/layout": "./src/css/layout/index.css",
42
- "./css/layout/*": "./src/css/layout/*.css",
43
- "./css/themes": null,
44
- "./css/themes/*": null,
45
- "./css/typography": "./src/css/typography/index.css",
46
- "./css/typography/*": "./src/css/typography/*.css",
47
- "./css/utilities": "./src/css/utilities/index.css",
48
- "./css/utilities/*": "./src/css/utilities/*.css",
49
- "./js": "./src/js/index.js",
50
- "./js/full": "./src/js/full.js",
51
- "./js/command": "./src/js/command.js",
52
- "./js/context-menu": "./src/js/context-menu.js",
53
- "./js/dialog": "./src/js/dialog.js",
54
- "./js/dismiss": "./src/js/dismiss.js",
55
- "./js/escape": "./src/js/escape.js",
56
- "./js/enhance": "./src/js/enhance.js",
57
- "./js/enhancement-loader": "./src/js/enhancement-loader.js",
58
- "./js/parse-config": "./src/js/parse-config.js",
59
- "./js/events": "./src/js/events.js",
60
- "./js/filter": "./src/js/filter.js",
61
- "./js/flyout": "./src/js/flyout.js",
62
- "./js/focus": "./src/js/focus.js",
63
- "./js/focus-group": "./src/js/focus-group.js",
64
- "./js/input": "./src/js/input.js",
65
- "./js/keys": "./src/js/keys.js",
66
- "./js/mask": "./src/js/mask.js",
67
- "./js/menu": "./src/js/menu.js",
68
- "./js/password": "./src/js/password.js",
69
- "./js/scrollspy": "./src/js/scrollspy.js",
70
- "./js/selectors": "./src/js/selectors.js",
71
- "./js/tab": "./src/js/tab.js",
72
- "./js/tooltip": "./src/js/tooltip.js",
73
- "./js/validation": "./src/js/validation.js",
74
- "./js/status": "./src/js/status.js",
75
- "./js/surface": "./src/js/surface.js",
76
- "./reserved-classes.json": "./reserved-classes.json",
77
- "./components.json": "./components.json",
78
- "./package.json": "./package.json"
79
- },
80
- "bin": {
81
- "actual-css": "./src/cli/actual-css.js"
82
- },
83
- "main": "./dist/actual.js",
84
- "style": "./dist/actual.min.css",
85
- "unpkg": "./dist/actual.min.css",
86
- "jsdelivr": "./dist/actual.min.css",
87
- "sideEffects": true,
88
- "files": [
89
- "dist",
90
- "src/css/*.css",
91
- "src/css/core",
92
- "src/css/layout",
93
- "src/css/typography",
94
- "src/css/forms",
95
- "src/css/components",
96
- "src/css/effects",
97
- "src/css/utilities",
98
- "src/cli",
99
- "src/js",
100
- "src/tooling",
101
- "reserved-classes.json",
102
- "components.json",
103
- "docs",
104
- "CHANGELOG.md",
105
- "llms.txt",
106
- "LICENSE",
107
- "README.md"
108
- ],
109
- "engines": {
110
- "bun": ">=1.4.0",
111
- "node": ">=18"
112
- },
113
- "scripts": {
114
- "lint": "biome check",
115
- "lint:fix": "biome check --write",
116
- "build:docs": "bun run build:themes && bun scripts/build-docs.js",
117
- "watch:docs": "bun run build:themes && bun scripts/build-docs.js --watch",
118
- "check:docs": "bun scripts/check-docs.js",
119
- "format:docs": "bun scripts/format-doc-tables.js",
120
- "check:doc-classes": "bun scripts/check-doc-classes.js",
121
- "check:compat": "bun scripts/check-compat.js",
122
- "check:css-api": "bun scripts/check-css-api.js",
123
- "check:color-space": "bun scripts/check-color-space.js",
124
- "report:theme-contrast": "bun scripts/report-theme-contrast.js",
125
- "report:neutral-ramp": "bun scripts/report-neutral-ramp.js",
126
- "report:dead-css": "bun scripts/report-dead-css.js",
127
- "report:overflow": "bun scripts/report-overflow.js",
128
- "check:architecture": "bun scripts/check-css-architecture.js",
129
- "build:dist": "bun scripts/build-dist.js",
130
- "build:js": "bun scripts/build-js.js",
131
- "build:themes": "bun scripts/build-themes.js",
132
- "build:size": "bun scripts/build-size.js",
133
- "check:enhance": "bun run scripts/check-enhance.js",
134
- "generate:reserved": "bun scripts/generate-reserved-classes.js",
135
- "check:reserved": "bun scripts/check-reserved.js",
136
- "generate:catalog": "bun scripts/build-catalog.js",
137
- "check:catalog": "bun scripts/check-catalog.js",
138
- "check:links": "bun scripts/check-doc-links.js",
139
- "check:templates": "bun scripts/check-templates.js",
140
- "check:markup": "bun scripts/check-markup.js",
141
- "shot:forced": "bun scripts/forced-colors-shot.js",
142
- "shot:multi": "bun scripts/multi-shot.js",
143
- "shot:page": "bun scripts/page-shot.js",
144
- "probe": "bun scripts/probe.js",
145
- "serve": "bun scripts/serve.js",
146
- "check:sync": "bun scripts/check-sync.js",
147
- "test": "bun test",
148
- "test:changed": "bun test --changed=master",
149
- "build:all": "bun run lint && bun run build:dist && bun run build:js && bun run build:size && bun run format:docs && bun run build:docs && bun run check:docs && bun run check:doc-classes && bun run check:compat && bun run check:css-api && bun run check:color-space && bun run check:architecture && bun run check:enhance && bun run generate:reserved && bun run check:reserved && bun run generate:catalog && bun run check:catalog && bun run check:sync && bun run check:links && bun run check:templates && bun run check:markup && bun run test",
150
- "prepublishOnly": "bun run build:all"
151
- },
152
- "devDependencies": {
153
- "@biomejs/biome": "^2.5.12",
154
- "happy-dom": "^20.14.0"
155
- },
156
- "dependencies": {
157
- "@lekoala/floating": "^0.2.0"
158
- }
159
- }
1
+ {
2
+ "name": "actual-css",
3
+ "version": "0.9.1",
4
+ "description": "Plain CSS component framework with semantic classes, universal variants, small tokens, theme hooks, and progressive enhancements.",
5
+ "type": "module",
6
+ "packageManager": "bun@1.4.2",
7
+ "license": "MIT",
8
+ "author": "Thomas <thomas@lekoala.be>",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/lekoala/actual-css.git"
12
+ },
13
+ "homepage": "https://github.com/lekoala/actual-css",
14
+ "bugs": {
15
+ "url": "https://github.com/lekoala/actual-css/issues"
16
+ },
17
+ "keywords": [
18
+ "css",
19
+ "css-framework",
20
+ "component-library",
21
+ "semantic",
22
+ "accessibility",
23
+ "dark-mode",
24
+ "themable",
25
+ "no-build",
26
+ "progressive-enhancement"
27
+ ],
28
+ "exports": {
29
+ ".": "./dist/actual.min.css",
30
+ "./full": "./dist/actual.full.min.css",
31
+ "./css": "./src/css/actual.css",
32
+ "./css/components": "./src/css/components/index.css",
33
+ "./css/components/*": "./src/css/components/*.css",
34
+ "./css/effects": "./src/css/effects/index.css",
35
+ "./css/effects/*": "./src/css/effects/*.css",
36
+ "./css/forms": "./src/css/forms/base.css",
37
+ "./css/forms/all": "./src/css/forms/index.css",
38
+ "./css/forms/*": "./src/css/forms/*.css",
39
+ "./css/full": "./src/css/actual.full.css",
40
+ "./css/layer": "./src/css/actual.layer.css",
41
+ "./css/layout": "./src/css/layout/index.css",
42
+ "./css/layout/*": "./src/css/layout/*.css",
43
+ "./css/themes": null,
44
+ "./css/themes/*": null,
45
+ "./css/typography": "./src/css/typography/index.css",
46
+ "./css/typography/*": "./src/css/typography/*.css",
47
+ "./css/utilities": "./src/css/utilities/index.css",
48
+ "./css/utilities/*": "./src/css/utilities/*.css",
49
+ "./js": "./src/js/index.js",
50
+ "./js/full": "./src/js/full.js",
51
+ "./js/command": "./src/js/command.js",
52
+ "./js/context-menu": "./src/js/context-menu.js",
53
+ "./js/dialog": "./src/js/dialog.js",
54
+ "./js/dismiss": "./src/js/dismiss.js",
55
+ "./js/escape": "./src/js/escape.js",
56
+ "./js/enhance": "./src/js/enhance.js",
57
+ "./js/enhancement-loader": "./src/js/enhancement-loader.js",
58
+ "./js/parse-config": "./src/js/parse-config.js",
59
+ "./js/events": "./src/js/events.js",
60
+ "./js/filter": "./src/js/filter.js",
61
+ "./js/flyout": "./src/js/flyout.js",
62
+ "./js/focus": "./src/js/focus.js",
63
+ "./js/focus-group": "./src/js/focus-group.js",
64
+ "./js/input": "./src/js/input.js",
65
+ "./js/keys": "./src/js/keys.js",
66
+ "./js/mask": "./src/js/mask.js",
67
+ "./js/menu": "./src/js/menu.js",
68
+ "./js/password": "./src/js/password.js",
69
+ "./js/scrollspy": "./src/js/scrollspy.js",
70
+ "./js/selectors": "./src/js/selectors.js",
71
+ "./js/tab": "./src/js/tab.js",
72
+ "./js/tooltip": "./src/js/tooltip.js",
73
+ "./js/validation": "./src/js/validation.js",
74
+ "./js/status": "./src/js/status.js",
75
+ "./js/surface": "./src/js/surface.js",
76
+ "./reserved-classes.json": "./reserved-classes.json",
77
+ "./components.json": "./components.json",
78
+ "./package.json": "./package.json"
79
+ },
80
+ "bin": {
81
+ "actual-css": "./src/cli/actual-css.js"
82
+ },
83
+ "main": "./dist/actual.js",
84
+ "style": "./dist/actual.min.css",
85
+ "unpkg": "./dist/actual.min.css",
86
+ "jsdelivr": "./dist/actual.min.css",
87
+ "sideEffects": true,
88
+ "files": [
89
+ "dist",
90
+ "src/css/*.css",
91
+ "src/css/core",
92
+ "src/css/layout",
93
+ "src/css/typography",
94
+ "src/css/forms",
95
+ "src/css/components",
96
+ "src/css/effects",
97
+ "src/css/utilities",
98
+ "src/cli",
99
+ "src/js",
100
+ "src/tooling",
101
+ "reserved-classes.json",
102
+ "components.json",
103
+ "docs",
104
+ "CHANGELOG.md",
105
+ "llms.txt",
106
+ "LICENSE",
107
+ "README.md"
108
+ ],
109
+ "engines": {
110
+ "bun": ">=1.4.0",
111
+ "node": ">=18"
112
+ },
113
+ "scripts": {
114
+ "lint": "biome check",
115
+ "lint:fix": "biome check --write",
116
+ "build:docs": "bun run build:themes && bun scripts/build-docs.js",
117
+ "watch:docs": "bun run build:themes && bun scripts/build-docs.js --watch",
118
+ "check:docs": "bun scripts/check-docs.js",
119
+ "format:docs": "bun scripts/format-doc-tables.js",
120
+ "check:doc-classes": "bun scripts/check-doc-classes.js",
121
+ "check:compat": "bun scripts/check-compat.js",
122
+ "check:css-api": "bun scripts/check-css-api.js",
123
+ "check:color-space": "bun scripts/check-color-space.js",
124
+ "report:theme-contrast": "bun scripts/report-theme-contrast.js",
125
+ "report:neutral-ramp": "bun scripts/report-neutral-ramp.js",
126
+ "report:dead-css": "bun scripts/report-dead-css.js",
127
+ "report:overflow": "bun scripts/report-overflow.js",
128
+ "check:architecture": "bun scripts/check-css-architecture.js",
129
+ "build:dist": "bun scripts/build-dist.js",
130
+ "build:js": "bun scripts/build-js.js",
131
+ "build:themes": "bun scripts/build-themes.js",
132
+ "build:size": "bun scripts/build-size.js",
133
+ "check:enhance": "bun run scripts/check-enhance.js",
134
+ "generate:reserved": "bun scripts/generate-reserved-classes.js",
135
+ "check:reserved": "bun scripts/check-reserved.js",
136
+ "generate:catalog": "bun scripts/build-catalog.js",
137
+ "check:catalog": "bun scripts/check-catalog.js",
138
+ "check:links": "bun scripts/check-doc-links.js",
139
+ "check:templates": "bun scripts/check-templates.js",
140
+ "check:markup": "bun scripts/check-markup.js",
141
+ "shot:forced": "bun scripts/forced-colors-shot.js",
142
+ "shot:multi": "bun scripts/multi-shot.js",
143
+ "shot:page": "bun scripts/page-shot.js",
144
+ "probe": "bun scripts/probe.js",
145
+ "serve": "bun scripts/serve.js",
146
+ "check:sync": "bun scripts/check-sync.js",
147
+ "test": "bun test",
148
+ "test:changed": "bun test --changed=master",
149
+ "build:all": "bun run lint && bun run build:dist && bun run build:js && bun run build:size && bun run format:docs && bun run build:docs && bun run check:docs && bun run check:doc-classes && bun run check:compat && bun run check:css-api && bun run check:color-space && bun run check:architecture && bun run check:enhance && bun run generate:reserved && bun run check:reserved && bun run generate:catalog && bun run check:catalog && bun run check:sync && bun run check:links && bun run check:templates && bun run check:markup && bun run test",
150
+ "prepublishOnly": "bun run build:all"
151
+ },
152
+ "devDependencies": {
153
+ "@biomejs/biome": "^2.5.12",
154
+ "happy-dom": "^20.14.0"
155
+ },
156
+ "dependencies": {
157
+ "@lekoala/floating": "^0.2.0"
158
+ }
159
+ }
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Accordion disclosures built on native details and summary.
3
3
  *
4
+ * Docs: docs/pages/components/accordion.md
5
+ *
4
6
  * Keeps the clickable summary affordance aligned and usable without JavaScript
5
7
  * or demo styles. Decorative palettes and custom markers belong outside the
6
8
  * base component.
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Actions — a horizontal action-button cluster.
3
3
  *
4
+ * Docs: docs/pages/patterns/actions.md
5
+ *
4
6
  * Composes with .btn (or any inline element) and feeds layout via the shared
5
7
  * --gap token.
6
8
  *
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Alerts for inline feedback and status messages.
3
3
  *
4
+ * Docs: docs/pages/components/alert.md
5
+ *
4
6
  * Keeps alert defaults local while consuming the shared --ui-* variant
5
7
  * plumbing for emphasis.
6
8
  *
@@ -3,6 +3,8 @@
3
3
  * and item states; app-layout owns whether that surface is a bottom bar or
4
4
  * labelled side navigation.
5
5
  *
6
+ * Docs: docs/pages/components/app-navigation.md
7
+ *
6
8
  * Public hooks:
7
9
  * --app-nav-size
8
10
  * --app-nav-gap
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Avatars for initials, images, links, and buttons.
3
3
  *
4
+ * Docs: docs/pages/components/avatar.md
5
+ *
4
6
  * The visual box stays the same across semantic elements. Grouping and status
5
7
  * dots (an empty .badge child) compose around the avatar without changing its
6
8
  * meaning.
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Badges for compact labels, counts, and state hints.
3
3
  *
4
+ * Docs: docs/pages/components/badge.md
5
+ *
4
6
  * Soft by default. .solid for counters and notification badges. The dot
5
7
  * (.badge:empty) stays solid regardless — a soft dot is pointless.
6
8
  * Shared .outline variant stays available.
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Breadcrumb — current-location trail from the site root.
3
3
  *
4
+ * Docs: docs/pages/components/breadcrumb.md
5
+ *
4
6
  * Inline list separated by "/". Mark the current page with `aria-current="page"`
5
7
  * either on the item or on the current link.
6
8
  */
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Busy overlay — non-button loading state.
3
3
  *
4
+ * Docs: docs/pages/components/spinner.md
5
+ *
4
6
  * A non-button element with aria-busy="true" and a direct last-child .spinner
5
7
  * shows that spinner as a centered overlay over a faded surface. Buttons keep
6
8
  * their spinners inline (e.g. .btn[aria-busy] > .spinner stays inline-flex).
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Buttons for actions and button-like links.
3
3
  *
4
+ * Docs: docs/pages/components/button.md
5
+ *
4
6
  * .btn is primarily for actionable elements: <button>, <a href>,
5
7
  * input[type="button"|"submit"|"reset"].
6
8
  *
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Cards provide a neutral raised surface for grouped content.
3
3
  *
4
+ * Docs: docs/pages/components/card.md
5
+ *
4
6
  * Surface, border, radius, padding, density, and elevation stay local here.
5
7
  * Direct header/footer children are structural slots; a direct footer is
6
8
  * anchored to the card's bottom edge when extra block space is available (so
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Message rows composed from an optional avatar, metadata, and bubble.
3
3
  *
4
+ * Docs: docs/pages/components/chat.md
5
+ *
4
6
  * Public hooks:
5
7
  * --chat-gap
6
8
  * --chat-max-size
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Data list — term/value pairs for the properties of a single object.
3
3
  *
4
+ * Docs: docs/pages/components/data-list.md
5
+ *
4
6
  * Expects alternating <dt>/<dd> children: one term, one value per property.
5
7
  * A plain <dl> handles richer relationships (several terms or descriptions)
6
8
  * and stays untouched by this component.