@vielzeug/refine 3.2.1 → 3.3.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 (153) hide show
  1. package/dist/alert.cjs +3 -3
  2. package/dist/alert.cjs.map +1 -1
  3. package/dist/alert.js +11 -4
  4. package/dist/alert.js.map +1 -1
  5. package/dist/chip.cjs +9 -9
  6. package/dist/chip.cjs.map +1 -1
  7. package/dist/chip.js +38 -35
  8. package/dist/chip.js.map +1 -1
  9. package/dist/command-palette.cjs +5 -5
  10. package/dist/command-palette.cjs.map +1 -1
  11. package/dist/command-palette.js +5 -5
  12. package/dist/command-palette.js.map +1 -1
  13. package/dist/content/card/card.css.cjs +1 -1
  14. package/dist/content/card/card.css.cjs.map +1 -1
  15. package/dist/content/card/card.css.js +1 -1
  16. package/dist/content/card/card.css.js.map +1 -1
  17. package/dist/content/index.d.ts +4 -0
  18. package/dist/content/index.d.ts.map +1 -1
  19. package/dist/content/keyboard-key/keyboard-key.css.cjs +2 -0
  20. package/dist/content/keyboard-key/keyboard-key.css.cjs.map +1 -0
  21. package/dist/content/keyboard-key/keyboard-key.css.js +6 -0
  22. package/dist/content/keyboard-key/keyboard-key.css.js.map +1 -0
  23. package/dist/content/keyboard-key/keyboard-key.d.ts +12 -0
  24. package/dist/content/keyboard-key/keyboard-key.d.ts.map +1 -0
  25. package/dist/content/keyboard-key/keyboard-shortcut.css.cjs +2 -0
  26. package/dist/content/keyboard-key/keyboard-shortcut.css.cjs.map +1 -0
  27. package/dist/content/keyboard-key/keyboard-shortcut.css.js +6 -0
  28. package/dist/content/keyboard-key/keyboard-shortcut.css.js.map +1 -0
  29. package/dist/content/qr-code/qr-code.css.cjs +2 -0
  30. package/dist/content/qr-code/qr-code.css.cjs.map +1 -0
  31. package/dist/content/qr-code/qr-code.css.js +6 -0
  32. package/dist/content/qr-code/qr-code.css.js.map +1 -0
  33. package/dist/content/qr-code/qr-code.d.ts +74 -0
  34. package/dist/content/qr-code/qr-code.d.ts.map +1 -0
  35. package/dist/core/positioner.cjs +1 -1
  36. package/dist/core/positioner.cjs.map +1 -1
  37. package/dist/core/positioner.d.ts +4 -1
  38. package/dist/core/positioner.d.ts.map +1 -1
  39. package/dist/core/positioner.js +10 -5
  40. package/dist/core/positioner.js.map +1 -1
  41. package/dist/counter.cjs +91 -0
  42. package/dist/counter.cjs.map +1 -0
  43. package/dist/counter.js +180 -0
  44. package/dist/counter.js.map +1 -0
  45. package/dist/custom-elements.json +793 -17
  46. package/dist/disclosure/tabs/tabs.css.cjs +1 -1
  47. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
  48. package/dist/disclosure/tabs/tabs.css.js +1 -1
  49. package/dist/disclosure/tabs/tabs.css.js.map +1 -1
  50. package/dist/feedback/alert/alert.d.ts +8 -1
  51. package/dist/feedback/alert/alert.d.ts.map +1 -1
  52. package/dist/feedback/chip/chip.css.cjs +1 -1
  53. package/dist/feedback/chip/chip.css.cjs.map +1 -1
  54. package/dist/feedback/chip/chip.css.js +1 -1
  55. package/dist/feedback/chip/chip.css.js.map +1 -1
  56. package/dist/feedback/chip/chip.d.ts +6 -2
  57. package/dist/feedback/chip/chip.d.ts.map +1 -1
  58. package/dist/feedback/progress/progress.css.cjs +1 -1
  59. package/dist/feedback/progress/progress.css.cjs.map +1 -1
  60. package/dist/feedback/progress/progress.css.js +1 -1
  61. package/dist/feedback/progress/progress.css.js.map +1 -1
  62. package/dist/feedback/progress/progress.d.ts +6 -0
  63. package/dist/feedback/progress/progress.d.ts.map +1 -1
  64. package/dist/feedback/toast/toast.css.cjs +1 -1
  65. package/dist/feedback/toast/toast.css.cjs.map +1 -1
  66. package/dist/feedback/toast/toast.css.js +1 -1
  67. package/dist/feedback/toast/toast.css.js.map +1 -1
  68. package/dist/feedback/toast/toast.d.ts.map +1 -1
  69. package/dist/frameworks/elements.d.ts +1 -1
  70. package/dist/inputs/button/button.css.cjs +1 -1
  71. package/dist/inputs/button/button.css.cjs.map +1 -1
  72. package/dist/inputs/button/button.css.js +1 -1
  73. package/dist/inputs/button/button.css.js.map +1 -1
  74. package/dist/inputs/combobox/combobox.css.cjs +1 -1
  75. package/dist/inputs/combobox/combobox.css.cjs.map +1 -1
  76. package/dist/inputs/combobox/combobox.css.js +1 -1
  77. package/dist/inputs/combobox/combobox.css.js.map +1 -1
  78. package/dist/inputs/counter/counter.css.cjs +2 -0
  79. package/dist/inputs/counter/counter.css.cjs.map +1 -0
  80. package/dist/inputs/counter/counter.css.js +6 -0
  81. package/dist/inputs/counter/counter.css.js.map +1 -0
  82. package/dist/inputs/counter/counter.d.ts +100 -0
  83. package/dist/inputs/counter/counter.d.ts.map +1 -0
  84. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  85. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  86. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  87. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  88. package/dist/inputs/index.d.ts +4 -0
  89. package/dist/inputs/index.d.ts.map +1 -1
  90. package/dist/inputs/input/input.css.cjs +1 -1
  91. package/dist/inputs/input/input.css.cjs.map +1 -1
  92. package/dist/inputs/input/input.css.js +1 -1
  93. package/dist/inputs/input/input.css.js.map +1 -1
  94. package/dist/inputs/number-input/number-input.css.cjs +1 -1
  95. package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
  96. package/dist/inputs/number-input/number-input.css.js +1 -1
  97. package/dist/inputs/number-input/number-input.css.js.map +1 -1
  98. package/dist/inputs/qr-scanner/qr-scanner.css.cjs +2 -0
  99. package/dist/inputs/qr-scanner/qr-scanner.css.cjs.map +1 -0
  100. package/dist/inputs/qr-scanner/qr-scanner.css.js +6 -0
  101. package/dist/inputs/qr-scanner/qr-scanner.css.js.map +1 -0
  102. package/dist/inputs/qr-scanner/qr-scanner.d.ts +87 -0
  103. package/dist/inputs/qr-scanner/qr-scanner.d.ts.map +1 -0
  104. package/dist/inputs/select/select.css.cjs +1 -1
  105. package/dist/inputs/select/select.css.cjs.map +1 -1
  106. package/dist/inputs/select/select.css.js +1 -1
  107. package/dist/inputs/select/select.css.js.map +1 -1
  108. package/dist/inputs/slider/slider.css.cjs +1 -1
  109. package/dist/inputs/slider/slider.css.cjs.map +1 -1
  110. package/dist/inputs/slider/slider.css.js +1 -1
  111. package/dist/inputs/slider/slider.css.js.map +1 -1
  112. package/dist/keyboard-key.cjs +9 -0
  113. package/dist/keyboard-key.cjs.map +1 -0
  114. package/dist/keyboard-key.js +36 -0
  115. package/dist/keyboard-key.js.map +1 -0
  116. package/dist/menu.cjs +1 -1
  117. package/dist/menu.cjs.map +1 -1
  118. package/dist/menu.js +2 -1
  119. package/dist/menu.js.map +1 -1
  120. package/dist/overlay/command-palette/command-palette.css.cjs +1 -1
  121. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
  122. package/dist/overlay/command-palette/command-palette.css.js +1 -1
  123. package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
  124. package/dist/overlay/command-palette/command-palette.d.ts +1 -0
  125. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  126. package/dist/progress.cjs +14 -6
  127. package/dist/progress.cjs.map +1 -1
  128. package/dist/progress.js +19 -7
  129. package/dist/progress.js.map +1 -1
  130. package/dist/qr-code.cjs +15 -0
  131. package/dist/qr-code.cjs.map +1 -0
  132. package/dist/qr-code.js +70 -0
  133. package/dist/qr-code.js.map +1 -0
  134. package/dist/qr-scanner.cjs +46 -0
  135. package/dist/qr-scanner.cjs.map +1 -0
  136. package/dist/qr-scanner.js +129 -0
  137. package/dist/qr-scanner.js.map +1 -0
  138. package/dist/refine.cjs +365 -199
  139. package/dist/refine.cjs.map +1 -1
  140. package/dist/refine.iife.js +393 -227
  141. package/dist/refine.iife.js.map +1 -1
  142. package/dist/refine.js +740 -574
  143. package/dist/refine.js.map +1 -1
  144. package/dist/tabs.cjs +2 -2
  145. package/dist/tabs.cjs.map +1 -1
  146. package/dist/tabs.js +37 -34
  147. package/dist/tabs.js.map +1 -1
  148. package/dist/toast.cjs +44 -39
  149. package/dist/toast.cjs.map +1 -1
  150. package/dist/toast.js +132 -117
  151. package/dist/toast.js.map +1 -1
  152. package/dist/types/elements.d.ts +9 -0
  153. package/package.json +35 -2
@@ -1 +1 @@
1
- {"version":3,"file":"input.css.js","names":[],"sources":["../../../src/inputs/input/input.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n :host {\n --_font-size: var(--input-font-size, var(--text-sm));\n --_gap: var(--input-gap, var(--size-2));\n --_field-height: var(--input-height, var(--size-10));\n --_padding: var(--input-padding, var(--size-1-5) var(--size-3));\n --_label-block-inset: var(--input-label-block-inset, var(--size-2));\n --_label-inset: var(--input-label-inset, var(--size-3));\n --_radius: var(--input-radius, var(--rounded-lg));\n --_placeholder: var(--input-placeholder-color, var(--color-contrast-500));\n --_bg: var(--input-bg, var(--color-contrast-100));\n --_border-color: var(--input-border-color, var(--color-contrast-300));\n\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n min-width: var(--input-min-width, 12rem);\n }\n\n .input-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0;\n width: 100%;\n }\n\n .field {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 0;\n align-items: stretch;\n justify-content: center;\n height: var(--_field-height);\n min-height: var(--_field-height);\n padding: var(--_padding);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-2xs);\n transition: var(\n --_motion-transition,\n background var(--transition-fast),\n backdrop-filter var(--transition-fast),\n border-color var(--transition-fast),\n box-shadow var(--transition-fast)\n );\n }\n\n /* Expand height to fit inset label + input row */\n .input-wrapper:has(.label:not([hidden])) .field {\n height: auto;\n }\n\n /* Outside placement: label is above the field (natural flow) */\n\n /* Inset placement (default): label appears inside the field border */\n :host(:not([label-placement='outside'])) .input-wrapper {\n position: relative;\n }\n\n :host(:not([label-placement='outside'])) .label {\n position: absolute;\n inset-block-start: var(--_label-block-inset);\n inset-inline-start: var(--_label-inset);\n z-index: 1;\n pointer-events: none;\n }\n\n :host(:not([label-placement='outside'])) .input-wrapper:has(.label:not([hidden])) .field {\n padding-block-start: calc(var(--_label-block-inset) + 1lh + 2px);\n }\n\n .input-row {\n display: flex;\n flex: 1;\n gap: var(--_gap);\n align-items: center;\n }\n\n /* ========================================\n Label Styles\n ======================================== */\n\n .label,\n label.label {\n margin-bottom: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n line-height: var(--leading-tight);\n color: var(--color-contrast-600);\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n /* Outside placement: label moves outside the field via CSS */\n :host([label-placement='outside']) .label,\n :host([label-placement='outside']) label.label {\n order: -1;\n font-size: var(--text-xs);\n line-height: var(--leading-loose);\n }\n\n /* ========================================\n Helper Text\n ======================================== */\n\n .helper-text {\n padding-inline: 2px;\n margin-top: var(--size-1-5);\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n overflow-wrap: anywhere;\n }\n\n .helper-text[hidden] {\n display: none;\n }\n\n /* ========================================\n Slotted Prefix/Suffix Icons\n ======================================== */\n\n ::slotted(svg) {\n flex-shrink: 0;\n width: var(--_icon-size, var(--leading-6));\n height: var(--_icon-size, var(--leading-6));\n }\n}\n\n@layer refine.overrides {\n /* ========================================\n Input Element\n ======================================== */\n\n input {\n flex: 1;\n min-width: 0;\n min-height: var(--size-6);\n font: inherit;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n\n /* No all: unset needed - reset layer handles it */\n color: var(--color-contrast-900);\n outline: none;\n background: transparent;\n border: none;\n }\n\n input::placeholder {\n color: var(--_placeholder);\n transition: color var(--transition-fast);\n }\n\n input:focus-visible {\n outline: none;\n }\n\n /* ========================================\n Hover & Focus States\n ======================================== */\n\n :host(:not([disabled], [variant='bordered'], [variant='flat'])) .field:hover {\n border-color: var(--color-contrast-400);\n }\n\n :host(:not([disabled])) .field:focus-within .label {\n color: var(--_theme-focus);\n }\n\n :host(:not([disabled])) .field:focus-within ::slotted([slot='prefix']),\n :host(:not([disabled])) .field:focus-within ::slotted([slot='suffix']) {\n color: var(--_theme-focus);\n }\n\n /* ========================================\n Clear button\n ======================================== */\n\n .clear-btn {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n color: var(--color-contrast-500);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n .clear-btn:hover {\n color: var(--color-contrast-900);\n }\n\n .clear-btn:focus-visible {\n outline: var(--border-2) solid var(--_theme-focus);\n outline-offset: var(--border);\n }\n\n :host([clearable]) .clear-btn {\n display: flex;\n }\n\n :host([clearable]:not([has-value])) .clear-btn {\n visibility: hidden;\n pointer-events: none;\n }\n\n /* ========================================\n Password visibility toggle\n ======================================== */\n\n .pwd-toggle-btn {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n color: var(--color-contrast-500);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n .pwd-toggle-btn:hover {\n color: var(--color-contrast-900);\n }\n\n .pwd-toggle-btn:focus-visible {\n outline: var(--border-2) solid var(--_theme-focus);\n outline-offset: var(--border);\n }\n\n :host([type='password']) .pwd-toggle-btn {\n display: flex;\n }\n\n /* ========================================\n Character counter\n ======================================== */\n\n .char-counter {\n padding-inline: 2px;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: var(--color-contrast-400);\n text-align: end;\n white-space: nowrap;\n }\n\n .char-counter[data-near-limit] {\n color: var(--color-warning, #f59e0b);\n }\n\n .char-counter[data-at-limit] {\n color: var(--color-error);\n }\n\n /* ========================================\n Error State\n ======================================== */\n\n :host([error]:not([error=''])) .field {\n border-color: var(--color-error);\n }\n\n :host([error]:not([error=''])) .label {\n color: var(--color-error);\n }\n\n .helper-text[role='alert'] {\n color: var(--color-error);\n }\n\n /* ========================================\n Success State (Signal 04)\n ======================================== */\n\n :host([success]) .field {\n border-color: var(--color-success);\n }\n\n /* ========================================\n Status Icon (Signals 03/04: error/success — never color alone)\n ======================================== */\n\n .status-icon {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n height: var(--size-5);\n }\n\n :host([error]:not([error=''])) .status-icon,\n :host([success]) .status-icon {\n display: flex;\n }\n\n .status-icon[data-status='error'] {\n color: var(--color-error);\n }\n\n .status-icon[data-status='success'] {\n color: var(--color-success);\n }\n\n /* ========================================\n Loading Spinner (Signal 06)\n ======================================== */\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .field-spinner {\n display: none;\n flex-shrink: 0;\n width: var(--size-4);\n height: var(--size-4);\n border: var(--border-2) solid var(--_theme-focus, currentcolor);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n :host([loading]) .field-spinner {\n display: inline-block;\n }\n}\n\n/*\n * The solid/flat/bordered/outline/ghost variant switch (previously here) now lives in\n * `fieldVariantMixin({ container: '.field', tokenPrefix: 'input' })` in `input.ts`'s `styles`\n * array — shared with `ore-textarea`/`ore-message-composer` instead of hand-duplicated across\n * all three (see the mixin's own doc comment for what it covers and why). `ore-input`'s extra\n * `text` variant (below) is not part of that shared set, so it keeps its own block here.\n */\n@layer refine.variants {\n /* Text — underline style */\n :host([variant='text']) {\n --_bg: var(--input-bg, transparent);\n --_border-color: var(--input-border-color, var(--color-contrast-300));\n }\n\n :host([variant='text']) .field {\n background: transparent;\n border: none;\n border-radius: 0;\n box-shadow: none;\n }\n\n :host([variant='text']) .field:focus-within {\n box-shadow: none;\n }\n\n /*\n * Focus/error/success `box-shadow` on `.field` — kept here in `refine.variants` (alongside\n * `fieldVariantMixin`'s rest-state `box-shadow` for solid/outline/ghost) rather than\n * `refine.overrides`, so normal specificity decides the winner. Cascade layers beat\n * specificity outright, so a `refine.overrides` box-shadow always lost to every variant's\n * unconditional rest-state `box-shadow`, focused/error/success or not — the same bug class\n * fixed for `ore-otp-input`'s focus ring.\n */\n :host(:not([disabled], [variant='text'], [variant='flat'])) .field:focus-within {\n background: var(--color-canvas);\n border-color: var(--_theme-focus);\n box-shadow: var(--_theme-shadow, var(--color-primary-focus-shadow));\n }\n\n :host([error]:not([error=''])) .field:focus-within {\n border-color: var(--color-error);\n box-shadow: var(--color-error-focus-shadow);\n }\n\n :host([success]) .field:focus-within {\n border-color: var(--color-success);\n box-shadow: var(--color-success-focus-shadow);\n }\n}\n\n@layer refine.utilities {\n /* Full width */\n :host([fullwidth]) {\n width: 100%;\n }\n}\n\n/* ========================================\n Disabled State (Signal 05) — intentionally unlayered\n ======================================== */\n\n/*\n * The shared `disabledLoadingMixin` (pulled in via `fieldMixins`) dims `:host([disabled])`\n * with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to unlayered rules\n * regardless of source order or specificity, so overriding that from inside any `@layer`\n * block in this file (including `refine.overrides`) would be a no-op — this has to stay\n * unlayered too, to actually win.\n *\n * Per the field-state UX review: opacity-based dimming reads as a washed-out/loading look\n * and can mimic reduced-contrast content for low-vision users, rather than a clearly locked\n * field. Swapped for an explicit grayscale surface + `not-allowed` cursor (the cursor already\n * comes from the shared mixin, left untouched here).\n */\n:host([disabled]) {\n opacity: 1;\n}\n\n:host([disabled]) .field {\n background: var(--color-contrast-100);\n border-color: var(--color-contrast-200);\n box-shadow: none;\n}\n\n:host([disabled]) input {\n color: var(--color-contrast-400);\n}\n\n:host([disabled]) input::placeholder {\n color: var(--color-contrast-300);\n}\n\n:host([disabled]) .label {\n color: var(--color-contrast-400);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"input.css.js","names":[],"sources":["../../../src/inputs/input/input.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n :host {\n --_font-size: var(--input-font-size, var(--text-sm));\n --_gap: var(--input-gap, var(--size-2));\n --_field-height: var(--input-height, var(--size-10));\n --_padding: var(--input-padding, var(--size-1-5) var(--size-3));\n --_label-block-inset: var(--input-label-block-inset, var(--size-2));\n --_label-inset: var(--input-label-inset, var(--size-3));\n --_radius: var(--input-radius, var(--rounded-lg));\n --_placeholder: var(--input-placeholder-color, var(--color-contrast-500));\n --_bg: var(--input-bg, var(--color-contrast-100));\n --_border-color: var(--input-border-color, var(--color-contrast-300));\n\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n min-width: var(--input-min-width, 12rem);\n }\n\n .input-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0;\n width: 100%;\n }\n\n .field {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 0;\n align-items: stretch;\n justify-content: center;\n height: var(--_field-height);\n min-height: var(--_field-height);\n padding: var(--_padding);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-2xs);\n transition: var(\n --_motion-transition,\n background var(--transition-fast),\n backdrop-filter var(--transition-fast),\n border-color var(--transition-fast),\n box-shadow var(--transition-fast)\n );\n }\n\n /* Expand height to fit inset label + input row */\n .input-wrapper:has(.label:not([hidden])) .field {\n height: auto;\n }\n\n /* Outside placement: label is above the field (natural flow) */\n\n /* Inset placement (default): label appears inside the field border */\n :host(:not([label-placement='outside'])) .input-wrapper {\n position: relative;\n }\n\n :host(:not([label-placement='outside'])) .label {\n position: absolute;\n inset-block-start: var(--_label-block-inset);\n inset-inline-start: var(--_label-inset);\n z-index: 1;\n pointer-events: none;\n }\n\n :host(:not([label-placement='outside'])) .input-wrapper:has(.label:not([hidden])) .field {\n padding-block-start: calc(var(--_label-block-inset) + 1lh + 2px);\n }\n\n .input-row {\n display: flex;\n flex: 1;\n gap: var(--_gap);\n align-items: center;\n }\n\n /* ========================================\n Label Styles\n ======================================== */\n\n .label,\n label.label {\n margin-bottom: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n line-height: var(--leading-tight);\n color: var(--color-contrast-600);\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n /* Outside placement: label moves outside the field via CSS */\n :host([label-placement='outside']) .label,\n :host([label-placement='outside']) label.label {\n order: -1;\n font-size: var(--text-xs);\n line-height: var(--leading-loose);\n }\n\n /* ========================================\n Helper Text\n ======================================== */\n\n .helper-text {\n padding-inline: 2px;\n margin-top: var(--size-1-5);\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n overflow-wrap: anywhere;\n }\n\n .helper-text[hidden] {\n display: none;\n }\n\n /* ========================================\n Slotted Prefix/Suffix Icons\n ======================================== */\n\n ::slotted(svg) {\n flex-shrink: 0;\n width: var(--_icon-size, var(--leading-6));\n height: var(--_icon-size, var(--leading-6));\n }\n}\n\n@layer refine.overrides {\n /* ========================================\n Input Element\n ======================================== */\n\n input {\n flex: 1;\n min-width: 0;\n min-height: var(--size-6);\n text-overflow: ellipsis;\n font: inherit;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n\n /* No all: unset needed - reset layer handles it */\n color: var(--color-contrast-900);\n outline: none;\n background: transparent;\n border: none;\n }\n\n input::placeholder {\n color: var(--_placeholder);\n transition: color var(--transition-fast);\n }\n\n input:focus-visible {\n outline: none;\n }\n\n /* ========================================\n Hover & Focus States\n ======================================== */\n\n :host(:not([disabled], [variant='bordered'], [variant='flat'])) .field:hover {\n border-color: var(--color-contrast-400);\n }\n\n :host(:not([disabled])) .field:focus-within .label {\n color: var(--_theme-focus);\n }\n\n :host(:not([disabled])) .field:focus-within ::slotted([slot='prefix']),\n :host(:not([disabled])) .field:focus-within ::slotted([slot='suffix']) {\n color: var(--_theme-focus);\n }\n\n /* ========================================\n Clear button\n ======================================== */\n\n .clear-btn {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n color: var(--color-contrast-500);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n .clear-btn:hover {\n color: var(--color-contrast-900);\n }\n\n .clear-btn:focus-visible {\n outline: var(--border-2) solid var(--_theme-focus);\n outline-offset: var(--border);\n }\n\n :host([clearable]) .clear-btn {\n display: flex;\n }\n\n :host([clearable]:not([has-value])) .clear-btn {\n visibility: hidden;\n pointer-events: none;\n }\n\n /* ========================================\n Password visibility toggle\n ======================================== */\n\n .pwd-toggle-btn {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n color: var(--color-contrast-500);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition: var(--_motion-transition, color var(--transition-fast));\n }\n\n .pwd-toggle-btn:hover {\n color: var(--color-contrast-900);\n }\n\n .pwd-toggle-btn:focus-visible {\n outline: var(--border-2) solid var(--_theme-focus);\n outline-offset: var(--border);\n }\n\n :host([type='password']) .pwd-toggle-btn {\n display: flex;\n }\n\n /* ========================================\n Character counter\n ======================================== */\n\n .char-counter {\n padding-inline: 2px;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: var(--color-contrast-400);\n text-align: end;\n white-space: nowrap;\n }\n\n .char-counter[data-near-limit] {\n color: var(--color-warning, #f59e0b);\n }\n\n .char-counter[data-at-limit] {\n color: var(--color-error);\n }\n\n /* ========================================\n Error State\n ======================================== */\n\n :host([error]:not([error=''])) .field {\n border-color: var(--color-error);\n }\n\n :host([error]:not([error=''])) .label {\n color: var(--color-error);\n }\n\n .helper-text[role='alert'] {\n color: var(--color-error);\n }\n\n /* ========================================\n Success State (Signal 04)\n ======================================== */\n\n :host([success]) .field {\n border-color: var(--color-success);\n }\n\n /* ========================================\n Status Icon (Signals 03/04: error/success — never color alone)\n ======================================== */\n\n .status-icon {\n display: none;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-5);\n height: var(--size-5);\n }\n\n :host([error]:not([error=''])) .status-icon,\n :host([success]) .status-icon {\n display: flex;\n }\n\n .status-icon[data-status='error'] {\n color: var(--color-error);\n }\n\n .status-icon[data-status='success'] {\n color: var(--color-success);\n }\n\n /* ========================================\n Loading Spinner (Signal 06)\n ======================================== */\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .field-spinner {\n display: none;\n flex-shrink: 0;\n width: var(--size-4);\n height: var(--size-4);\n border: var(--border-2) solid var(--_theme-focus, currentcolor);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n :host([loading]) .field-spinner {\n display: inline-block;\n }\n}\n\n/*\n * The solid/flat/bordered/outline/ghost variant switch (previously here) now lives in\n * `fieldVariantMixin({ container: '.field', tokenPrefix: 'input' })` in `input.ts`'s `styles`\n * array — shared with `ore-textarea`/`ore-message-composer` instead of hand-duplicated across\n * all three (see the mixin's own doc comment for what it covers and why). `ore-input`'s extra\n * `text` variant (below) is not part of that shared set, so it keeps its own block here.\n */\n@layer refine.variants {\n /* Text — underline style */\n :host([variant='text']) {\n --_bg: var(--input-bg, transparent);\n --_border-color: var(--input-border-color, var(--color-contrast-300));\n }\n\n :host([variant='text']) .field {\n background: transparent;\n border: none;\n border-radius: 0;\n box-shadow: none;\n }\n\n :host([variant='text']) .field:focus-within {\n box-shadow: none;\n }\n\n /*\n * Focus/error/success `box-shadow` on `.field` — kept here in `refine.variants` (alongside\n * `fieldVariantMixin`'s rest-state `box-shadow` for solid/outline/ghost) rather than\n * `refine.overrides`, so normal specificity decides the winner. Cascade layers beat\n * specificity outright, so a `refine.overrides` box-shadow always lost to every variant's\n * unconditional rest-state `box-shadow`, focused/error/success or not — the same bug class\n * fixed for `ore-otp-input`'s focus ring.\n */\n :host(:not([disabled], [variant='text'], [variant='flat'])) .field:focus-within {\n background: var(--color-canvas);\n border-color: var(--_theme-focus);\n box-shadow: var(--_theme-shadow, var(--color-primary-focus-shadow));\n }\n\n :host([error]:not([error=''])) .field:focus-within {\n border-color: var(--color-error);\n box-shadow: var(--color-error-focus-shadow);\n }\n\n :host([success]) .field:focus-within {\n border-color: var(--color-success);\n box-shadow: var(--color-success-focus-shadow);\n }\n}\n\n@layer refine.utilities {\n /* Full width: fill the track and never overflow it — a `fullwidth` field in a track narrower\n than the 12rem floor shrinks with the track instead of pushing past it. */\n :host([fullwidth]) {\n width: 100%;\n min-width: 0;\n }\n}\n\n/* ========================================\n Disabled State (Signal 05) — intentionally unlayered\n ======================================== */\n\n/*\n * The shared `disabledLoadingMixin` (pulled in via `fieldMixins`) dims `:host([disabled])`\n * with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to unlayered rules\n * regardless of source order or specificity, so overriding that from inside any `@layer`\n * block in this file (including `refine.overrides`) would be a no-op — this has to stay\n * unlayered too, to actually win.\n *\n * Per the field-state UX review: opacity-based dimming reads as a washed-out/loading look\n * and can mimic reduced-contrast content for low-vision users, rather than a clearly locked\n * field. Swapped for an explicit grayscale surface + `not-allowed` cursor (the cursor already\n * comes from the shared mixin, left untouched here).\n */\n:host([disabled]) {\n opacity: 1;\n}\n\n:host([disabled]) .field {\n background: var(--color-contrast-100);\n border-color: var(--color-contrast-200);\n box-shadow: none;\n}\n\n:host([disabled]) input {\n color: var(--color-contrast-400);\n}\n\n:host([disabled]) input::placeholder {\n color: var(--color-contrast-300);\n}\n\n:host([disabled]) .label {\n color: var(--color-contrast-400);\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- var e=`@layer refine.base{:host{min-width:var(--number-input-min-width,12rem);display:inline-flex}:host([fullwidth]){width:100%}.field{flex:1}.field::part(input){text-align:center}button[part=decrement-btn],button[part=increment-btn]{width:var(--size-6);min-width:var(--size-6);height:var(--size-6);min-height:var(--size-6);color:var(--color-contrast-600);cursor:pointer;border-radius:var(--rounded-sm);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}button[part=decrement-btn]:hover:not(:disabled),button[part=increment-btn]:hover:not(:disabled){color:var(--color-contrast-900);background:var(--color-contrast-150,var(--color-contrast-100))}button[part=decrement-btn]:active:not(:disabled),button[part=increment-btn]:active:not(:disabled){background:var(--color-contrast-200)}button[part=decrement-btn]:disabled,button[part=increment-btn]:disabled{color:var(--color-contrast-300);cursor:not-allowed;background:0 0}button[part=decrement-btn]:focus-visible,button[part=increment-btn]:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}}:host([disabled]){opacity:1}`;exports.default=e;
1
+ var e=`@layer refine.base{:host{min-width:var(--number-input-min-width,12rem);display:inline-flex}:host([fullwidth]){width:100%;min-width:0}.field{flex:1}.field::part(input){text-align:center}button[part=decrement-btn],button[part=increment-btn]{width:var(--size-6);min-width:var(--size-6);height:var(--size-6);min-height:var(--size-6);color:var(--color-contrast-600);cursor:pointer;border-radius:var(--rounded-sm);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}button[part=decrement-btn]:hover:not(:disabled),button[part=increment-btn]:hover:not(:disabled){color:var(--color-contrast-900);background:var(--color-contrast-150,var(--color-contrast-100))}button[part=decrement-btn]:active:not(:disabled),button[part=increment-btn]:active:not(:disabled){background:var(--color-contrast-200)}button[part=decrement-btn]:disabled,button[part=increment-btn]:disabled{color:var(--color-contrast-300);cursor:not-allowed;background:0 0}button[part=decrement-btn]:focus-visible,button[part=increment-btn]:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}}:host([disabled]){opacity:1}`;exports.default=e;
2
2
  //# sourceMappingURL=number-input.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.css.cjs","names":[],"sources":["../../../src/inputs/number-input/number-input.css?inline"],"sourcesContent":["@layer refine.base {\n /* No explicit `width` here, on purpose — matches every other field's own `:host` (`ore-input`,\n `ore-select`, `ore-combobox`, `ore-date-picker`). A grid/flex item with `width: auto` (the\n default) stretches to fill its track by default; the old `width: fit-content` here overrode\n that default and forced this one field to shrink-wrap while every sibling field stretched to\n match the column, e.g. in a 2-column form grid.\n `min-width` is different: every field above sets the same `12rem` floor (each via its own\n `--<field>-min-width` custom property) so that a row of mixed field types — this one included\n — doesn't shrink-wrap to noticeably different widths purely because their *content* (a typed\n number vs. a selected option's label vs. free text) happens to differ. */\n :host {\n display: inline-flex;\n min-width: var(--number-input-min-width, 12rem);\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n }\n\n /* The inner `ore-input` (class=\"field\", see number-input.ts) is a flex item of this `:host`'s\n own `inline-flex` box — without `flex: 1` it only ever grows to its own `min-width` (12rem)\n and no further, leaving this component visibly narrower than its host once the host itself\n stretches to fill a wider grid/flex track (e.g. next to a full-width sibling field). `flex: 1`\n lets it grow to match; its own `min-width` (inherited from `ore-input`'s `:host`) still holds\n as the shrink floor, so this doesn't affect the min-width consistency across field types. */\n .field {\n flex: 1;\n }\n\n /* Centre the typed number inside the field */\n .field::part(input) {\n text-align: center;\n }\n\n /* Stepper buttons — slotted into ore-input's own prefix/suffix, so they render inside its\n bordered box like its built-in clear/password-toggle buttons, not as separate controls. */\n button[part='decrement-btn'],\n button[part='increment-btn'] {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-6);\n min-width: var(--size-6);\n height: var(--size-6);\n min-height: var(--size-6);\n padding: 0;\n color: var(--color-contrast-600);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition:\n color var(--transition-fast),\n background var(--transition-fast);\n }\n\n button[part='decrement-btn']:hover:not(:disabled),\n button[part='increment-btn']:hover:not(:disabled) {\n color: var(--color-contrast-900);\n background: var(--color-contrast-150, var(--color-contrast-100));\n }\n\n button[part='decrement-btn']:active:not(:disabled),\n button[part='increment-btn']:active:not(:disabled) {\n background: var(--color-contrast-200);\n }\n\n button[part='decrement-btn']:disabled,\n button[part='increment-btn']:disabled {\n color: var(--color-contrast-300);\n cursor: not-allowed;\n background: transparent;\n }\n\n button[part='decrement-btn']:focus-visible,\n button[part='increment-btn']:focus-visible {\n outline: 2px solid var(--color-primary-500);\n outline-offset: -2px;\n }\n}\n\n/* ========================================\n Disabled State — intentionally unlayered\n ======================================== */\n\n/*\n * `disabledStateMixin` (passed directly in `styles:`, not via `fieldMixins`) dims\n * `:host([disabled])` with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to\n * unlayered rules regardless of source order or specificity, so overriding that from inside any\n * `@layer` block in this file would be a no-op — this has to stay unlayered too, to actually win.\n * See `ore-input`'s `input.css` for the same pattern.\n *\n * The visible surface here is entirely the inner `ore-input`'s own `.field` (already fixed to a\n * grayscale look, not opacity) plus these slotted stepper buttons (muted via `:disabled` above,\n * also not opacity) — so this host itself needs no compensating background/color, just dropping\n * the blanket opacity that would otherwise wash out both of those over again.\n */\n:host([disabled]) {\n opacity: 1;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"number-input.css.cjs","names":[],"sources":["../../../src/inputs/number-input/number-input.css?inline"],"sourcesContent":["@layer refine.base {\n /* No explicit `width` here, on purpose — matches every other field's own `:host` (`ore-input`,\n `ore-select`, `ore-combobox`, `ore-date-picker`). A grid/flex item with `width: auto` (the\n default) stretches to fill its track by default; the old `width: fit-content` here overrode\n that default and forced this one field to shrink-wrap while every sibling field stretched to\n match the column, e.g. in a 2-column form grid.\n `min-width` is different: every field above sets the same `12rem` floor (each via its own\n `--<field>-min-width` custom property) so that a row of mixed field types — this one included\n — doesn't shrink-wrap to noticeably different widths purely because their *content* (a typed\n number vs. a selected option's label vs. free text) happens to differ. */\n :host {\n display: inline-flex;\n min-width: var(--number-input-min-width, 12rem);\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). The floor drops so the field follows a\n track narrower than 12rem instead of overflowing it. */\n :host([fullwidth]) {\n width: 100%;\n min-width: 0;\n }\n\n /* The inner `ore-input` (class=\"field\", see number-input.ts) is a flex item of this `:host`'s\n own `inline-flex` box — without `flex: 1` it only ever grows to its own `min-width` (12rem)\n and no further, leaving this component visibly narrower than its host once the host itself\n stretches to fill a wider grid/flex track (e.g. next to a full-width sibling field). `flex: 1`\n lets it grow to match; its own `min-width` (inherited from `ore-input`'s `:host`) still holds\n as the shrink floor, so this doesn't affect the min-width consistency across field types. */\n .field {\n flex: 1;\n }\n\n /* Centre the typed number inside the field */\n .field::part(input) {\n text-align: center;\n }\n\n /* Stepper buttons — slotted into ore-input's own prefix/suffix, so they render inside its\n bordered box like its built-in clear/password-toggle buttons, not as separate controls. */\n button[part='decrement-btn'],\n button[part='increment-btn'] {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-6);\n min-width: var(--size-6);\n height: var(--size-6);\n min-height: var(--size-6);\n padding: 0;\n color: var(--color-contrast-600);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition:\n color var(--transition-fast),\n background var(--transition-fast);\n }\n\n button[part='decrement-btn']:hover:not(:disabled),\n button[part='increment-btn']:hover:not(:disabled) {\n color: var(--color-contrast-900);\n background: var(--color-contrast-150, var(--color-contrast-100));\n }\n\n button[part='decrement-btn']:active:not(:disabled),\n button[part='increment-btn']:active:not(:disabled) {\n background: var(--color-contrast-200);\n }\n\n button[part='decrement-btn']:disabled,\n button[part='increment-btn']:disabled {\n color: var(--color-contrast-300);\n cursor: not-allowed;\n background: transparent;\n }\n\n button[part='decrement-btn']:focus-visible,\n button[part='increment-btn']:focus-visible {\n outline: 2px solid var(--color-primary-500);\n outline-offset: -2px;\n }\n}\n\n/* ========================================\n Disabled State — intentionally unlayered\n ======================================== */\n\n/*\n * `disabledStateMixin` (passed directly in `styles:`, not via `fieldMixins`) dims\n * `:host([disabled])` with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to\n * unlayered rules regardless of source order or specificity, so overriding that from inside any\n * `@layer` block in this file would be a no-op — this has to stay unlayered too, to actually win.\n * See `ore-input`'s `input.css` for the same pattern.\n *\n * The visible surface here is entirely the inner `ore-input`'s own `.field` (already fixed to a\n * grayscale look, not opacity) plus these slotted stepper buttons (muted via `:disabled` above,\n * also not opacity) — so this host itself needs no compensating background/color, just dropping\n * the blanket opacity that would otherwise wash out both of those over again.\n */\n:host([disabled]) {\n opacity: 1;\n}\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  //#region src/inputs/number-input/number-input.css?inline
2
- var e = "@layer refine.base{:host{min-width:var(--number-input-min-width,12rem);display:inline-flex}:host([fullwidth]){width:100%}.field{flex:1}.field::part(input){text-align:center}button[part=decrement-btn],button[part=increment-btn]{width:var(--size-6);min-width:var(--size-6);height:var(--size-6);min-height:var(--size-6);color:var(--color-contrast-600);cursor:pointer;border-radius:var(--rounded-sm);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}button[part=decrement-btn]:hover:not(:disabled),button[part=increment-btn]:hover:not(:disabled){color:var(--color-contrast-900);background:var(--color-contrast-150,var(--color-contrast-100))}button[part=decrement-btn]:active:not(:disabled),button[part=increment-btn]:active:not(:disabled){background:var(--color-contrast-200)}button[part=decrement-btn]:disabled,button[part=increment-btn]:disabled{color:var(--color-contrast-300);cursor:not-allowed;background:0 0}button[part=decrement-btn]:focus-visible,button[part=increment-btn]:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}}:host([disabled]){opacity:1}";
2
+ var e = "@layer refine.base{:host{min-width:var(--number-input-min-width,12rem);display:inline-flex}:host([fullwidth]){width:100%;min-width:0}.field{flex:1}.field::part(input){text-align:center}button[part=decrement-btn],button[part=increment-btn]{width:var(--size-6);min-width:var(--size-6);height:var(--size-6);min-height:var(--size-6);color:var(--color-contrast-600);cursor:pointer;border-radius:var(--rounded-sm);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}button[part=decrement-btn]:hover:not(:disabled),button[part=increment-btn]:hover:not(:disabled){color:var(--color-contrast-900);background:var(--color-contrast-150,var(--color-contrast-100))}button[part=decrement-btn]:active:not(:disabled),button[part=increment-btn]:active:not(:disabled){background:var(--color-contrast-200)}button[part=decrement-btn]:disabled,button[part=increment-btn]:disabled{color:var(--color-contrast-300);cursor:not-allowed;background:0 0}button[part=decrement-btn]:focus-visible,button[part=increment-btn]:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}}:host([disabled]){opacity:1}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.css.js","names":[],"sources":["../../../src/inputs/number-input/number-input.css?inline"],"sourcesContent":["@layer refine.base {\n /* No explicit `width` here, on purpose — matches every other field's own `:host` (`ore-input`,\n `ore-select`, `ore-combobox`, `ore-date-picker`). A grid/flex item with `width: auto` (the\n default) stretches to fill its track by default; the old `width: fit-content` here overrode\n that default and forced this one field to shrink-wrap while every sibling field stretched to\n match the column, e.g. in a 2-column form grid.\n `min-width` is different: every field above sets the same `12rem` floor (each via its own\n `--<field>-min-width` custom property) so that a row of mixed field types — this one included\n — doesn't shrink-wrap to noticeably different widths purely because their *content* (a typed\n number vs. a selected option's label vs. free text) happens to differ. */\n :host {\n display: inline-flex;\n min-width: var(--number-input-min-width, 12rem);\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n }\n\n /* The inner `ore-input` (class=\"field\", see number-input.ts) is a flex item of this `:host`'s\n own `inline-flex` box — without `flex: 1` it only ever grows to its own `min-width` (12rem)\n and no further, leaving this component visibly narrower than its host once the host itself\n stretches to fill a wider grid/flex track (e.g. next to a full-width sibling field). `flex: 1`\n lets it grow to match; its own `min-width` (inherited from `ore-input`'s `:host`) still holds\n as the shrink floor, so this doesn't affect the min-width consistency across field types. */\n .field {\n flex: 1;\n }\n\n /* Centre the typed number inside the field */\n .field::part(input) {\n text-align: center;\n }\n\n /* Stepper buttons — slotted into ore-input's own prefix/suffix, so they render inside its\n bordered box like its built-in clear/password-toggle buttons, not as separate controls. */\n button[part='decrement-btn'],\n button[part='increment-btn'] {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-6);\n min-width: var(--size-6);\n height: var(--size-6);\n min-height: var(--size-6);\n padding: 0;\n color: var(--color-contrast-600);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition:\n color var(--transition-fast),\n background var(--transition-fast);\n }\n\n button[part='decrement-btn']:hover:not(:disabled),\n button[part='increment-btn']:hover:not(:disabled) {\n color: var(--color-contrast-900);\n background: var(--color-contrast-150, var(--color-contrast-100));\n }\n\n button[part='decrement-btn']:active:not(:disabled),\n button[part='increment-btn']:active:not(:disabled) {\n background: var(--color-contrast-200);\n }\n\n button[part='decrement-btn']:disabled,\n button[part='increment-btn']:disabled {\n color: var(--color-contrast-300);\n cursor: not-allowed;\n background: transparent;\n }\n\n button[part='decrement-btn']:focus-visible,\n button[part='increment-btn']:focus-visible {\n outline: 2px solid var(--color-primary-500);\n outline-offset: -2px;\n }\n}\n\n/* ========================================\n Disabled State — intentionally unlayered\n ======================================== */\n\n/*\n * `disabledStateMixin` (passed directly in `styles:`, not via `fieldMixins`) dims\n * `:host([disabled])` with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to\n * unlayered rules regardless of source order or specificity, so overriding that from inside any\n * `@layer` block in this file would be a no-op — this has to stay unlayered too, to actually win.\n * See `ore-input`'s `input.css` for the same pattern.\n *\n * The visible surface here is entirely the inner `ore-input`'s own `.field` (already fixed to a\n * grayscale look, not opacity) plus these slotted stepper buttons (muted via `:disabled` above,\n * also not opacity) — so this host itself needs no compensating background/color, just dropping\n * the blanket opacity that would otherwise wash out both of those over again.\n */\n:host([disabled]) {\n opacity: 1;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"number-input.css.js","names":[],"sources":["../../../src/inputs/number-input/number-input.css?inline"],"sourcesContent":["@layer refine.base {\n /* No explicit `width` here, on purpose — matches every other field's own `:host` (`ore-input`,\n `ore-select`, `ore-combobox`, `ore-date-picker`). A grid/flex item with `width: auto` (the\n default) stretches to fill its track by default; the old `width: fit-content` here overrode\n that default and forced this one field to shrink-wrap while every sibling field stretched to\n match the column, e.g. in a 2-column form grid.\n `min-width` is different: every field above sets the same `12rem` floor (each via its own\n `--<field>-min-width` custom property) so that a row of mixed field types — this one included\n — doesn't shrink-wrap to noticeably different widths purely because their *content* (a typed\n number vs. a selected option's label vs. free text) happens to differ. */\n :host {\n display: inline-flex;\n min-width: var(--number-input-min-width, 12rem);\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). The floor drops so the field follows a\n track narrower than 12rem instead of overflowing it. */\n :host([fullwidth]) {\n width: 100%;\n min-width: 0;\n }\n\n /* The inner `ore-input` (class=\"field\", see number-input.ts) is a flex item of this `:host`'s\n own `inline-flex` box — without `flex: 1` it only ever grows to its own `min-width` (12rem)\n and no further, leaving this component visibly narrower than its host once the host itself\n stretches to fill a wider grid/flex track (e.g. next to a full-width sibling field). `flex: 1`\n lets it grow to match; its own `min-width` (inherited from `ore-input`'s `:host`) still holds\n as the shrink floor, so this doesn't affect the min-width consistency across field types. */\n .field {\n flex: 1;\n }\n\n /* Centre the typed number inside the field */\n .field::part(input) {\n text-align: center;\n }\n\n /* Stepper buttons — slotted into ore-input's own prefix/suffix, so they render inside its\n bordered box like its built-in clear/password-toggle buttons, not as separate controls. */\n button[part='decrement-btn'],\n button[part='increment-btn'] {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--size-6);\n min-width: var(--size-6);\n height: var(--size-6);\n min-height: var(--size-6);\n padding: 0;\n color: var(--color-contrast-600);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n transition:\n color var(--transition-fast),\n background var(--transition-fast);\n }\n\n button[part='decrement-btn']:hover:not(:disabled),\n button[part='increment-btn']:hover:not(:disabled) {\n color: var(--color-contrast-900);\n background: var(--color-contrast-150, var(--color-contrast-100));\n }\n\n button[part='decrement-btn']:active:not(:disabled),\n button[part='increment-btn']:active:not(:disabled) {\n background: var(--color-contrast-200);\n }\n\n button[part='decrement-btn']:disabled,\n button[part='increment-btn']:disabled {\n color: var(--color-contrast-300);\n cursor: not-allowed;\n background: transparent;\n }\n\n button[part='decrement-btn']:focus-visible,\n button[part='increment-btn']:focus-visible {\n outline: 2px solid var(--color-primary-500);\n outline-offset: -2px;\n }\n}\n\n/* ========================================\n Disabled State — intentionally unlayered\n ======================================== */\n\n/*\n * `disabledStateMixin` (passed directly in `styles:`, not via `fieldMixins`) dims\n * `:host([disabled])` with `opacity: 0.5` as bare, unlayered CSS. Cascade layers always lose to\n * unlayered rules regardless of source order or specificity, so overriding that from inside any\n * `@layer` block in this file would be a no-op — this has to stay unlayered too, to actually win.\n * See `ore-input`'s `input.css` for the same pattern.\n *\n * The visible surface here is entirely the inner `ore-input`'s own `.field` (already fixed to a\n * grayscale look, not opacity) plus these slotted stepper buttons (muted via `:disabled` above,\n * also not opacity) — so this host itself needs no compensating background/color, just dropping\n * the blanket opacity that would otherwise wash out both of those over again.\n */\n:host([disabled]) {\n opacity: 1;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ var e=`@layer refine.base{:host{--_radius:var(--qr-scanner-radius,var(--rounded-md));--_bg:var(--qr-scanner-bg,var(--color-contrast-100));--_viewfinder-color:var(--qr-scanner-viewfinder-color,var(--color-primary));--_status-color:var(--qr-scanner-status-color,var(--text-color-secondary));display:inline-block}:host([hidden]){display:none}.wrapper{--_size:var(--qr-scanner-size,var(--_size-px,280px));gap:var(--size-2);flex-direction:column;align-items:center;max-width:100%;display:inline-flex}.stage{width:var(--_size);max-width:100%;height:var(--_size);background:var(--_bg);border-radius:var(--_radius);position:relative;overflow:hidden}video{object-fit:cover;width:100%;height:100%;position:absolute;inset:0}.viewfinder{inset:var(--size-4);pointer-events:none;border:var(--border-width,1px) solid var(--_viewfinder-color);border-radius:var(--_radius);position:absolute;box-shadow:0 0 0 9999px #00000026}.overlay{pointer-events:none;justify-content:center;align-items:flex-end;display:flex;position:absolute;inset:0}.overlay ::slotted(*){pointer-events:auto}.state{box-sizing:border-box;gap:var(--size-2);padding:var(--size-4);color:var(--text-color-secondary);text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.state-text{font-size:var(--text-sm);overflow-wrap:anywhere}.status{max-width:var(--_size);font-size:var(--text-sm);color:var(--_status-color);text-align:center;overflow-wrap:anywhere}.controls{gap:var(--size-2);display:flex}}`;exports.default=e;
2
+ //# sourceMappingURL=qr-scanner.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-scanner.css.cjs","names":[],"sources":["../../../src/inputs/qr-scanner/qr-scanner.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_radius: var(--qr-scanner-radius, var(--rounded-md));\n --_bg: var(--qr-scanner-bg, var(--color-contrast-100));\n --_viewfinder-color: var(--qr-scanner-viewfinder-color, var(--color-primary));\n --_status-color: var(--qr-scanner-status-color, var(--text-color-secondary));\n\n display: inline-block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wrapper {\n /* --_size resolves here (not :host) so it can see the inline --_size-px set on this element. */\n --_size: var(--qr-scanner-size, var(--_size-px, 280px));\n\n display: inline-flex;\n flex-direction: column;\n gap: var(--size-2);\n align-items: center;\n max-width: 100%;\n }\n\n .stage {\n position: relative;\n width: var(--_size);\n max-width: 100%;\n height: var(--_size);\n overflow: hidden;\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .viewfinder {\n position: absolute;\n inset: var(--size-4);\n pointer-events: none;\n border: var(--border-width, 1px) solid var(--_viewfinder-color);\n border-radius: var(--_radius);\n box-shadow: 0 0 0 9999px rgb(0 0 0 / 0.15);\n }\n\n .overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n pointer-events: none;\n }\n\n .overlay ::slotted(*) {\n pointer-events: auto;\n }\n\n .state {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-2);\n align-items: center;\n justify-content: center;\n padding: var(--size-4);\n color: var(--text-color-secondary);\n text-align: center;\n }\n\n .state-text {\n font-size: var(--text-sm);\n overflow-wrap: anywhere;\n }\n\n .status {\n max-width: var(--_size);\n font-size: var(--text-sm);\n color: var(--_status-color);\n text-align: center;\n overflow-wrap: anywhere;\n }\n\n .controls {\n display: flex;\n gap: var(--size-2);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,6 @@
1
+ //#region src/inputs/qr-scanner/qr-scanner.css?inline
2
+ var e = "@layer refine.base{:host{--_radius:var(--qr-scanner-radius,var(--rounded-md));--_bg:var(--qr-scanner-bg,var(--color-contrast-100));--_viewfinder-color:var(--qr-scanner-viewfinder-color,var(--color-primary));--_status-color:var(--qr-scanner-status-color,var(--text-color-secondary));display:inline-block}:host([hidden]){display:none}.wrapper{--_size:var(--qr-scanner-size,var(--_size-px,280px));gap:var(--size-2);flex-direction:column;align-items:center;max-width:100%;display:inline-flex}.stage{width:var(--_size);max-width:100%;height:var(--_size);background:var(--_bg);border-radius:var(--_radius);position:relative;overflow:hidden}video{object-fit:cover;width:100%;height:100%;position:absolute;inset:0}.viewfinder{inset:var(--size-4);pointer-events:none;border:var(--border-width,1px) solid var(--_viewfinder-color);border-radius:var(--_radius);position:absolute;box-shadow:0 0 0 9999px #00000026}.overlay{pointer-events:none;justify-content:center;align-items:flex-end;display:flex;position:absolute;inset:0}.overlay ::slotted(*){pointer-events:auto}.state{box-sizing:border-box;gap:var(--size-2);padding:var(--size-4);color:var(--text-color-secondary);text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.state-text{font-size:var(--text-sm);overflow-wrap:anywhere}.status{max-width:var(--_size);font-size:var(--text-sm);color:var(--_status-color);text-align:center;overflow-wrap:anywhere}.controls{gap:var(--size-2);display:flex}}";
3
+ //#endregion
4
+ export { e as default };
5
+
6
+ //# sourceMappingURL=qr-scanner.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-scanner.css.js","names":[],"sources":["../../../src/inputs/qr-scanner/qr-scanner.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_radius: var(--qr-scanner-radius, var(--rounded-md));\n --_bg: var(--qr-scanner-bg, var(--color-contrast-100));\n --_viewfinder-color: var(--qr-scanner-viewfinder-color, var(--color-primary));\n --_status-color: var(--qr-scanner-status-color, var(--text-color-secondary));\n\n display: inline-block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wrapper {\n /* --_size resolves here (not :host) so it can see the inline --_size-px set on this element. */\n --_size: var(--qr-scanner-size, var(--_size-px, 280px));\n\n display: inline-flex;\n flex-direction: column;\n gap: var(--size-2);\n align-items: center;\n max-width: 100%;\n }\n\n .stage {\n position: relative;\n width: var(--_size);\n max-width: 100%;\n height: var(--_size);\n overflow: hidden;\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .viewfinder {\n position: absolute;\n inset: var(--size-4);\n pointer-events: none;\n border: var(--border-width, 1px) solid var(--_viewfinder-color);\n border-radius: var(--_radius);\n box-shadow: 0 0 0 9999px rgb(0 0 0 / 0.15);\n }\n\n .overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n pointer-events: none;\n }\n\n .overlay ::slotted(*) {\n pointer-events: auto;\n }\n\n .state {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-2);\n align-items: center;\n justify-content: center;\n padding: var(--size-4);\n color: var(--text-color-secondary);\n text-align: center;\n }\n\n .state-text {\n font-size: var(--text-sm);\n overflow-wrap: anywhere;\n }\n\n .status {\n max-width: var(--_size);\n font-size: var(--text-sm);\n color: var(--_status-color);\n text-align: center;\n overflow-wrap: anywhere;\n }\n\n .controls {\n display: flex;\n gap: var(--size-2);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import { type QrScanner, type QrScannerOptions, SigilError } from '@vielzeug/sigil';
2
+ import type { ComponentSize, RoundedSize } from '../../types';
3
+ import '../../content/icon/icon';
4
+ import '../button/button';
5
+ /** Testing hook — inject a fake `createQrScanner` without touching globals. */
6
+ export type QrScannerFactory = (options: QrScannerOptions) => QrScanner;
7
+ /** Component-level view states; sigil's transport states are mapped onto these. */
8
+ export type OreQrScannerStatus = 'idle' | 'starting' | 'scanning' | 'result' | 'unsupported' | 'denied' | 'error';
9
+ /** QR scanner component properties */
10
+ export type OreQrScannerProps = {
11
+ /** Start/stop the camera externally; mirrors into internal intent on change */
12
+ active?: boolean;
13
+ /** Preferred camera: 'environment' (rear) or 'user' (front) */
14
+ 'facing-mode'?: 'environment' | 'user';
15
+ /** Minimum ms between detection passes */
16
+ interval?: number;
17
+ /** Accessible label for the scanner region */
18
+ label?: string;
19
+ /** Stop after the first successful scan (default true) */
20
+ once?: boolean;
21
+ /** Border radius size */
22
+ rounded?: RoundedSize;
23
+ /** JS-only testing hook: custom scanner factory (defaults to `createQrScanner`) */
24
+ scannerFactory?: QrScannerFactory;
25
+ /** Preview size: named scale or pixel number */
26
+ size?: ComponentSize | number;
27
+ };
28
+ /** QR scanner component events */
29
+ export type OreQrScannerEvents = {
30
+ /** Emitted on every successful decode. detail: `{ value }` */
31
+ scan: {
32
+ value: string;
33
+ };
34
+ /** Emitted on permission, support, or detection failure. detail: `{ error }` */
35
+ error: {
36
+ error: SigilError;
37
+ };
38
+ /** Emitted on every view-state transition. detail: `{ status }` */
39
+ status: {
40
+ status: OreQrScannerStatus;
41
+ };
42
+ };
43
+ /**
44
+ * Camera QR scanner built on `createQrScanner` (native `BarcodeDetector`).
45
+ * `active` starts/stops the camera externally; internal Start/Stop controls
46
+ * drive the same intent. Unsupported browsers render the `unsupported` slot
47
+ * so apps can substitute a paste fallback.
48
+ *
49
+ * @element ore-qr-scanner
50
+ *
51
+ * @attr {boolean} active - Start/stop the camera
52
+ * @attr {string} facing-mode - 'environment' | 'user' (default 'environment')
53
+ * @attr {number} interval - Ms between detection passes (default 200)
54
+ * @attr {boolean} once - Stop after first scan (default true)
55
+ * @attr {string} size - 'sm' | 'md' | 'lg', or a pixel value
56
+ * @attr {string} label - Region label (default "QR code scanner")
57
+ * @attr {string} rounded - Border radius
58
+ *
59
+ * @fires scan - detail: `{ value }` on each decode
60
+ * @fires error - detail: `{ error }` on permission/support/detection failure
61
+ * @fires status - detail: `{ status }` on view-state transitions
62
+ *
63
+ * @slot overlay - Content layered over the camera preview
64
+ * @slot unsupported - Fallback UI when scanning is unsupported (e.g. paste input)
65
+ * @slot footer - Extra content below the status row
66
+ *
67
+ * @cssprop --qr-scanner-size - Preview edge length in px (overrides `size`)
68
+ * @cssprop --qr-scanner-radius - Border radius
69
+ * @cssprop --qr-scanner-bg - Preview background while idle
70
+ * @cssprop --qr-scanner-viewfinder-color - Viewfinder frame color
71
+ * @cssprop --qr-scanner-status-color - Status text color
72
+ *
73
+ * @part wrapper - Outer container
74
+ * @part stage - Square preview area (video + overlays)
75
+ * @part video - The `<video>` preview element
76
+ * @part viewfinder - Decorative scan frame over the preview
77
+ * @part state - Idle/error/denied/unsupported/result panel
78
+ * @part status - Live status line
79
+ * @part controls - Button row
80
+ *
81
+ * @example
82
+ * ```html
83
+ * <ore-qr-scanner active @scan=${(e) => pair(e.detail.value)}></ore-qr-scanner>
84
+ * ```
85
+ */
86
+ export declare const QR_SCANNER_TAG: "ore-qr-scanner";
87
+ //# sourceMappingURL=qr-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-scanner.d.ts","sourceRoot":"","sources":["../../../src/inputs/qr-scanner/qr-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,gBAAgB,EAErB,UAAU,EAGX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,yBAAyB,CAAC;AACjC,OAAO,kBAAkB,CAAC;AAG1B,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,SAAS,CAAC;AAExE,mFAAmF;AACnF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElH,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACvC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,mFAAmF;IACnF,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,gDAAgD;IAChD,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,8DAA8D;IAC9D,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,gFAAgF;IAChF,KAAK,EAAE;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAC7B,mEAAmE;IACnE,MAAM,EAAE;QAAE,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;CACxC,CAAC;AAgBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,cAAc,EAAG,gBAAyB,CAAC"}
@@ -1,2 +1,2 @@
1
- var e=`@layer refine.base{:host{min-width:var(--select-min-width,12rem);display:inline-block}:host([fullwidth]){width:100%;display:block}::slotted(option),::slotted(optgroup){display:none}.trigger{cursor:pointer;width:100%}.trigger::part(input){cursor:pointer;caret-color:#0000;-webkit-user-select:none;user-select:none}.chips-row{gap:var(--size-1);flex-wrap:wrap;align-items:center;min-width:0;display:flex}.chips-row[hidden]{display:none}.trigger-suffix{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.trigger-icon{transition:transform var(--transition-fast);justify-content:center;align-items:center;display:flex}:host([open]) .trigger-icon{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:var(--z-dropdown,8000);box-sizing:border-box;gap:var(--size-0-5);max-height:260px;padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;background:var(--color-canvas);border:var(--border) solid var(--color-contrast-200);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);flex-direction:column;margin:0;display:flex;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.options-list{flex-direction:column;gap:0;display:flex}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:first-child{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.disabled-reason{text-overflow:ellipsis;min-width:0;font-size:var(--text-xs);color:var(--text-color-tertiary);white-space:nowrap;flex:0 45%;overflow:hidden}.disabled-reason:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:right}.disabled-reason:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:left}.option:hover:not([data-disabled]){background:var(--color-contrast-100)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))}.option[data-selected]{font-weight:var(--font-medium);color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))}.option[data-selected][data-focused]{background:color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))}.option[data-disabled]{color:var(--color-contrast-500);cursor:not-allowed}.option-check{color:var(--_theme-base);opacity:0;transition:opacity var(--transition-fast);flex-shrink:0;display:inline-flex}.option-check:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.option-check:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}.option[data-selected] .option-check{opacity:1}.optgroup-label{padding:var(--size-1-5) var(--size-2-5) var(--size-1);font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--color-contrast-500);text-transform:uppercase;letter-spacing:var(--tracking-wide,.05em)}.dropdown-loading,.dropdown-empty{padding:var(--size-3) var(--size-2-5);font-size:var(--text-sm);color:var(--color-contrast-500);text-align:center}}`;exports.default=e;
1
+ var e=`@layer refine.base{:host{min-width:var(--select-min-width,12rem);display:inline-block}:host([fullwidth]){width:100%;min-width:0;display:block}::slotted(option),::slotted(optgroup){display:none}.trigger{cursor:pointer;width:100%}.trigger::part(input){cursor:pointer;caret-color:#0000;-webkit-user-select:none;user-select:none}.chips-row{gap:var(--size-1);flex-wrap:wrap;align-items:center;min-width:0;display:flex}.chips-row[hidden]{display:none}.trigger-suffix{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.trigger-icon{transition:transform var(--transition-fast);justify-content:center;align-items:center;display:flex}:host([open]) .trigger-icon{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:var(--z-dropdown,8000);box-sizing:border-box;gap:var(--size-0-5);max-height:260px;padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;background:var(--color-canvas);border:var(--border) solid var(--color-contrast-200);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);flex-direction:column;margin:0;display:flex;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.options-list{flex-direction:column;gap:0;display:flex}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:first-child{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.disabled-reason{text-overflow:ellipsis;min-width:0;font-size:var(--text-xs);color:var(--text-color-tertiary);white-space:nowrap;flex:0 45%;overflow:hidden}.disabled-reason:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:right}.disabled-reason:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:left}.option:hover:not([data-disabled]){background:var(--color-contrast-100)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))}.option[data-selected]{font-weight:var(--font-medium);color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))}.option[data-selected][data-focused]{background:color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))}.option[data-disabled]{color:var(--color-contrast-500);cursor:not-allowed}.option-check{color:var(--_theme-base);opacity:0;transition:opacity var(--transition-fast);flex-shrink:0;display:inline-flex}.option-check:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.option-check:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}.option[data-selected] .option-check{opacity:1}.optgroup-label{padding:var(--size-1-5) var(--size-2-5) var(--size-1);font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--color-contrast-500);text-transform:uppercase;letter-spacing:var(--tracking-wide,.05em)}.dropdown-loading,.dropdown-empty{padding:var(--size-3) var(--size-2-5);font-size:var(--text-sm);color:var(--color-contrast-500);text-align:center}}`;exports.default=e;
2
2
  //# sourceMappingURL=select.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.css.cjs","names":[],"sources":["../../../src/inputs/select/select.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n display: inline-block;\n min-width: var(--select-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n }\n\n /* Hide native <option> elements — we render our own UI */\n ::slotted(option),\n ::slotted(optgroup) {\n display: none;\n }\n\n /* ore-input is readonly so pointer defaults to text — override to pointer.\n `width: 100%` matters just as much: `:host` is `display: inline-block`, which — unlike a\n flex/grid container with `align-items`/`justify-items: stretch` — never stretches its own\n children to fill its own box. Without this, `.trigger` (an `ore-input`, whose own `:host`\n only guarantees a 12rem *minimum*) stays shrink-wrapped to that minimum even when this\n select's own host has already been stretched wider by an ancestor grid/flex track — visibly\n narrower than a sibling field (e.g. `ore-number-input`) occupying the same-width track. */\n .trigger {\n width: 100%;\n cursor: pointer;\n }\n\n .trigger::part(input) {\n cursor: pointer;\n caret-color: transparent;\n user-select: none;\n }\n\n /* Chips slot inside ore-input prefix */\n .chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-1);\n align-items: center;\n min-width: 0;\n }\n\n .chips-row[hidden] {\n display: none;\n }\n\n /* Suffix: loader (left) + chevron (right) */\n .trigger-suffix {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .trigger-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--transition-fast);\n }\n\n :host([open]) .trigger-icon {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: var(--z-dropdown, 8000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-0-5);\n max-height: 260px;\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n background: var(--color-canvas);\n border: var(--border) solid var(--color-contrast-200);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n\n /* Hidden by default */\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n .options-list {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels to keep option rows compact and readable. */\n .option > span:first-child {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .disabled-reason {\n flex: 0 1 45%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--text-color-tertiary);\n text-align: end;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--color-contrast-100);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100));\n }\n\n .option[data-selected] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50));\n }\n\n .option[data-selected][data-focused] {\n background: color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100));\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-500);\n cursor: not-allowed;\n }\n\n .option-check {\n display: inline-flex;\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--_theme-base);\n opacity: 0;\n transition: opacity var(--transition-fast);\n }\n\n .option[data-selected] .option-check {\n opacity: 1;\n }\n\n /* ========================================\n Option Groups\n ======================================== */\n\n .optgroup-label {\n padding: var(--size-1-5) var(--size-2-5) var(--size-1);\n font-size: var(--text-xs);\n font-weight: var(--font-semibold);\n color: var(--color-contrast-500);\n text-transform: uppercase;\n letter-spacing: var(--tracking-wide, 0.05em);\n }\n\n /* ========================================\n Loading / No-Results\n ======================================== */\n\n .dropdown-loading,\n .dropdown-empty {\n padding: var(--size-3) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--color-contrast-500);\n text-align: center;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"select.css.cjs","names":[],"sources":["../../../src/inputs/select/select.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n display: inline-block;\n min-width: var(--select-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n min-width: 0;\n }\n\n /* Hide native <option> elements — we render our own UI */\n ::slotted(option),\n ::slotted(optgroup) {\n display: none;\n }\n\n /* ore-input is readonly so pointer defaults to text — override to pointer.\n `width: 100%` matters just as much: `:host` is `display: inline-block`, which — unlike a\n flex/grid container with `align-items`/`justify-items: stretch` — never stretches its own\n children to fill its own box. Without this, `.trigger` (an `ore-input`, whose own `:host`\n only guarantees a 12rem *minimum*) stays shrink-wrapped to that minimum even when this\n select's own host has already been stretched wider by an ancestor grid/flex track — visibly\n narrower than a sibling field (e.g. `ore-number-input`) occupying the same-width track. */\n .trigger {\n width: 100%;\n cursor: pointer;\n }\n\n .trigger::part(input) {\n cursor: pointer;\n caret-color: transparent;\n user-select: none;\n }\n\n /* Chips slot inside ore-input prefix */\n .chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-1);\n align-items: center;\n min-width: 0;\n }\n\n .chips-row[hidden] {\n display: none;\n }\n\n /* Suffix: loader (left) + chevron (right) */\n .trigger-suffix {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .trigger-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--transition-fast);\n }\n\n :host([open]) .trigger-icon {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: var(--z-dropdown, 8000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-0-5);\n max-height: 260px;\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n background: var(--color-canvas);\n border: var(--border) solid var(--color-contrast-200);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n\n /* Hidden by default */\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n .options-list {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels to keep option rows compact and readable. */\n .option > span:first-child {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .disabled-reason {\n flex: 0 1 45%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--text-color-tertiary);\n text-align: end;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--color-contrast-100);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100));\n }\n\n .option[data-selected] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50));\n }\n\n .option[data-selected][data-focused] {\n background: color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100));\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-500);\n cursor: not-allowed;\n }\n\n .option-check {\n display: inline-flex;\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--_theme-base);\n opacity: 0;\n transition: opacity var(--transition-fast);\n }\n\n .option[data-selected] .option-check {\n opacity: 1;\n }\n\n /* ========================================\n Option Groups\n ======================================== */\n\n .optgroup-label {\n padding: var(--size-1-5) var(--size-2-5) var(--size-1);\n font-size: var(--text-xs);\n font-weight: var(--font-semibold);\n color: var(--color-contrast-500);\n text-transform: uppercase;\n letter-spacing: var(--tracking-wide, 0.05em);\n }\n\n /* ========================================\n Loading / No-Results\n ======================================== */\n\n .dropdown-loading,\n .dropdown-empty {\n padding: var(--size-3) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--color-contrast-500);\n text-align: center;\n }\n}\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  //#region src/inputs/select/select.css?inline
2
- var e = "@layer refine.base{:host{min-width:var(--select-min-width,12rem);display:inline-block}:host([fullwidth]){width:100%;display:block}::slotted(option),::slotted(optgroup){display:none}.trigger{cursor:pointer;width:100%}.trigger::part(input){cursor:pointer;caret-color:#0000;-webkit-user-select:none;user-select:none}.chips-row{gap:var(--size-1);flex-wrap:wrap;align-items:center;min-width:0;display:flex}.chips-row[hidden]{display:none}.trigger-suffix{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.trigger-icon{transition:transform var(--transition-fast);justify-content:center;align-items:center;display:flex}:host([open]) .trigger-icon{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:var(--z-dropdown,8000);box-sizing:border-box;gap:var(--size-0-5);max-height:260px;padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;background:var(--color-canvas);border:var(--border) solid var(--color-contrast-200);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);flex-direction:column;margin:0;display:flex;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.options-list{flex-direction:column;gap:0;display:flex}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:first-child{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.disabled-reason{text-overflow:ellipsis;min-width:0;font-size:var(--text-xs);color:var(--text-color-tertiary);white-space:nowrap;flex:0 45%;overflow:hidden}.disabled-reason:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:right}.disabled-reason:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:left}.option:hover:not([data-disabled]){background:var(--color-contrast-100)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))}.option[data-selected]{font-weight:var(--font-medium);color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))}.option[data-selected][data-focused]{background:color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))}.option[data-disabled]{color:var(--color-contrast-500);cursor:not-allowed}.option-check{color:var(--_theme-base);opacity:0;transition:opacity var(--transition-fast);flex-shrink:0;display:inline-flex}.option-check:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.option-check:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}.option[data-selected] .option-check{opacity:1}.optgroup-label{padding:var(--size-1-5) var(--size-2-5) var(--size-1);font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--color-contrast-500);text-transform:uppercase;letter-spacing:var(--tracking-wide,.05em)}.dropdown-loading,.dropdown-empty{padding:var(--size-3) var(--size-2-5);font-size:var(--text-sm);color:var(--color-contrast-500);text-align:center}}";
2
+ var e = "@layer refine.base{:host{min-width:var(--select-min-width,12rem);display:inline-block}:host([fullwidth]){width:100%;min-width:0;display:block}::slotted(option),::slotted(optgroup){display:none}.trigger{cursor:pointer;width:100%}.trigger::part(input){cursor:pointer;caret-color:#0000;-webkit-user-select:none;user-select:none}.chips-row{gap:var(--size-1);flex-wrap:wrap;align-items:center;min-width:0;display:flex}.chips-row[hidden]{display:none}.trigger-suffix{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.trigger-icon{transition:transform var(--transition-fast);justify-content:center;align-items:center;display:flex}:host([open]) .trigger-icon{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:var(--z-dropdown,8000);box-sizing:border-box;gap:var(--size-0-5);max-height:260px;padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;background:var(--color-canvas);border:var(--border) solid var(--color-contrast-200);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);flex-direction:column;margin:0;display:flex;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.options-list{flex-direction:column;gap:0;display:flex}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:first-child{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.disabled-reason{text-overflow:ellipsis;min-width:0;font-size:var(--text-xs);color:var(--text-color-tertiary);white-space:nowrap;flex:0 45%;overflow:hidden}.disabled-reason:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:right}.disabled-reason:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:left}.option:hover:not([data-disabled]){background:var(--color-contrast-100)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))}.option[data-selected]{font-weight:var(--font-medium);color:var(--_theme-base);background:color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))}.option[data-selected][data-focused]{background:color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))}.option[data-disabled]{color:var(--color-contrast-500);cursor:not-allowed}.option-check{color:var(--_theme-base);opacity:0;transition:opacity var(--transition-fast);flex-shrink:0;display:inline-flex}.option-check:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.option-check:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}.option[data-selected] .option-check{opacity:1}.optgroup-label{padding:var(--size-1-5) var(--size-2-5) var(--size-1);font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--color-contrast-500);text-transform:uppercase;letter-spacing:var(--tracking-wide,.05em)}.dropdown-loading,.dropdown-empty{padding:var(--size-3) var(--size-2-5);font-size:var(--text-sm);color:var(--color-contrast-500);text-align:center}}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"select.css.js","names":[],"sources":["../../../src/inputs/select/select.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n display: inline-block;\n min-width: var(--select-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n }\n\n /* Hide native <option> elements — we render our own UI */\n ::slotted(option),\n ::slotted(optgroup) {\n display: none;\n }\n\n /* ore-input is readonly so pointer defaults to text — override to pointer.\n `width: 100%` matters just as much: `:host` is `display: inline-block`, which — unlike a\n flex/grid container with `align-items`/`justify-items: stretch` — never stretches its own\n children to fill its own box. Without this, `.trigger` (an `ore-input`, whose own `:host`\n only guarantees a 12rem *minimum*) stays shrink-wrapped to that minimum even when this\n select's own host has already been stretched wider by an ancestor grid/flex track — visibly\n narrower than a sibling field (e.g. `ore-number-input`) occupying the same-width track. */\n .trigger {\n width: 100%;\n cursor: pointer;\n }\n\n .trigger::part(input) {\n cursor: pointer;\n caret-color: transparent;\n user-select: none;\n }\n\n /* Chips slot inside ore-input prefix */\n .chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-1);\n align-items: center;\n min-width: 0;\n }\n\n .chips-row[hidden] {\n display: none;\n }\n\n /* Suffix: loader (left) + chevron (right) */\n .trigger-suffix {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .trigger-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--transition-fast);\n }\n\n :host([open]) .trigger-icon {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: var(--z-dropdown, 8000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-0-5);\n max-height: 260px;\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n background: var(--color-canvas);\n border: var(--border) solid var(--color-contrast-200);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n\n /* Hidden by default */\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n .options-list {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels to keep option rows compact and readable. */\n .option > span:first-child {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .disabled-reason {\n flex: 0 1 45%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--text-color-tertiary);\n text-align: end;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--color-contrast-100);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100));\n }\n\n .option[data-selected] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50));\n }\n\n .option[data-selected][data-focused] {\n background: color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100));\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-500);\n cursor: not-allowed;\n }\n\n .option-check {\n display: inline-flex;\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--_theme-base);\n opacity: 0;\n transition: opacity var(--transition-fast);\n }\n\n .option[data-selected] .option-check {\n opacity: 1;\n }\n\n /* ========================================\n Option Groups\n ======================================== */\n\n .optgroup-label {\n padding: var(--size-1-5) var(--size-2-5) var(--size-1);\n font-size: var(--text-xs);\n font-weight: var(--font-semibold);\n color: var(--color-contrast-500);\n text-transform: uppercase;\n letter-spacing: var(--tracking-wide, 0.05em);\n }\n\n /* ========================================\n Loading / No-Results\n ======================================== */\n\n .dropdown-loading,\n .dropdown-empty {\n padding: var(--size-3) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--color-contrast-500);\n text-align: center;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"select.css.js","names":[],"sources":["../../../src/inputs/select/select.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n display: inline-block;\n min-width: var(--select-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n min-width: 0;\n }\n\n /* Hide native <option> elements — we render our own UI */\n ::slotted(option),\n ::slotted(optgroup) {\n display: none;\n }\n\n /* ore-input is readonly so pointer defaults to text — override to pointer.\n `width: 100%` matters just as much: `:host` is `display: inline-block`, which — unlike a\n flex/grid container with `align-items`/`justify-items: stretch` — never stretches its own\n children to fill its own box. Without this, `.trigger` (an `ore-input`, whose own `:host`\n only guarantees a 12rem *minimum*) stays shrink-wrapped to that minimum even when this\n select's own host has already been stretched wider by an ancestor grid/flex track — visibly\n narrower than a sibling field (e.g. `ore-number-input`) occupying the same-width track. */\n .trigger {\n width: 100%;\n cursor: pointer;\n }\n\n .trigger::part(input) {\n cursor: pointer;\n caret-color: transparent;\n user-select: none;\n }\n\n /* Chips slot inside ore-input prefix */\n .chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-1);\n align-items: center;\n min-width: 0;\n }\n\n .chips-row[hidden] {\n display: none;\n }\n\n /* Suffix: loader (left) + chevron (right) */\n .trigger-suffix {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .trigger-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--transition-fast);\n }\n\n :host([open]) .trigger-icon {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: var(--z-dropdown, 8000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--size-0-5);\n max-height: 260px;\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n background: var(--color-canvas);\n border: var(--border) solid var(--color-contrast-200);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n\n /* Hidden by default */\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n .options-list {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels to keep option rows compact and readable. */\n .option > span:first-child {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .disabled-reason {\n flex: 0 1 45%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--text-color-tertiary);\n text-align: end;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--color-contrast-100);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100));\n }\n\n .option[data-selected] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50));\n }\n\n .option[data-selected][data-focused] {\n background: color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100));\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-500);\n cursor: not-allowed;\n }\n\n .option-check {\n display: inline-flex;\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--_theme-base);\n opacity: 0;\n transition: opacity var(--transition-fast);\n }\n\n .option[data-selected] .option-check {\n opacity: 1;\n }\n\n /* ========================================\n Option Groups\n ======================================== */\n\n .optgroup-label {\n padding: var(--size-1-5) var(--size-2-5) var(--size-1);\n font-size: var(--text-xs);\n font-weight: var(--font-semibold);\n color: var(--color-contrast-500);\n text-transform: uppercase;\n letter-spacing: var(--tracking-wide, 0.05em);\n }\n\n /* ========================================\n Loading / No-Results\n ======================================== */\n\n .dropdown-loading,\n .dropdown-empty {\n padding: var(--size-3) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--color-contrast-500);\n text-align: center;\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- var e=`@layer refine.base{:host{--_size:var(--slider-size,var(--size-5));--_height:var(--slider-height,var(--size-1));--_track:var(--slider-track-bg,var(--color-contrast-300));--_fill:var(--slider-fill,var(--color-neutral));--_thumb:var(--slider-thumb-bg,var(--color-contrast-50));--_thumb-size:var(--_size);--_thumb-inset:var(--slider-thumb-inset,var(--size-2-5));--_touch-target:var(--size-11);--_font-size:var(--text-sm);--_shadow:var(--color-neutral-focus-shadow);gap:var(--_gap,var(--size-3));min-width:var(--slider-min-width,12rem);touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;display:inline-flex;position:relative}:host([fullwidth]){width:100%}}.slider-container{box-sizing:border-box;width:100%;min-height:var(--_touch-target);padding-inline:var(--_thumb-inset);flex:1;align-items:center;display:flex;position:relative}.slider-track{width:100%;height:var(--_height);background:var(--_track);border-radius:var(--rounded-full);position:relative}.slider-fill{top:0;left:var(--_fill-start,0%);width:var(--_fill-width,0%);background:var(--_fill);border-radius:var(--rounded-full);height:100%;transition:var(--_motion-transition,left var(--transition-fast), width var(--transition-fast));position:absolute}:host([data-dragging]) .slider-fill{transition:none}.slider-thumb{z-index:1;box-sizing:border-box;width:var(--_thumb-size);height:var(--_thumb-size);cursor:grab;background:var(--_thumb);border:2px solid var(--_fill);border-radius:var(--rounded-full);box-shadow:var(--shadow-sm);transition:var(--_motion-transition,box-shadow var(--transition-fast), left var(--transition-fast));will-change:transform;position:absolute;top:50%;transform:translate(-50%,-50%)}:host([data-dragging]) .slider-thumb{cursor:grabbing;box-shadow:var(--_shadow);transition:var(--_motion-transition,box-shadow var(--transition-fast))}.slider-thumb-sole{left:var(--_thumb-pos,0%)}:host(:focus-visible) .slider-thumb-sole,:host(:active) .slider-thumb-sole{box-shadow:var(--_shadow)}.slider-thumb-start{left:var(--_thumb-start,0%)}.slider-thumb-end{left:var(--_thumb-end,100%)}.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{z-index:2;outline:var(--border-2) solid var(--_fill);outline-offset:var(--size-0-5);box-shadow:var(--_shadow)}:host(:not([range])) .slider-thumb-start,:host(:not([range])) .slider-thumb-end,:host([range]) .slider-thumb-sole{display:none}@media (hover:hover){:host(:not([disabled])) .slider-thumb:hover{box-shadow:var(--_shadow)}}@media (forced-colors:active){:host(:focus-visible) .slider-thumb-sole,.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{outline-offset:2px;box-shadow:none;outline:2px solid highlight}}@layer refine.overrides{:host{--_fill:var(--slider-fill,var(--_theme-base));--_shadow:var(--_theme-shadow)}}.label{font-size:var(--_font-size);color:var(--color-contrast);white-space:nowrap}.helper-text[hidden]{display:none}.helper-text{width:100%;font-size:var(--text-xs);line-height:var(--leading-tight);color:color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas))}.helper-text[role=alert]{color:var(--color-error)}`;exports.default=e;
1
+ var e=`@layer refine.base{:host{--_size:var(--slider-size,var(--size-5));--_height:var(--slider-height,var(--size-1));--_track:var(--slider-track-bg,var(--color-contrast-300));--_fill:var(--slider-fill,var(--color-neutral));--_thumb:var(--slider-thumb-bg,var(--color-contrast-50));--_thumb-size:var(--_size);--_thumb-inset:var(--slider-thumb-inset,var(--size-2-5));--_touch-target:var(--size-11);--_font-size:var(--text-sm);--_shadow:var(--color-neutral-focus-shadow);gap:var(--_gap,var(--size-3));min-width:var(--slider-min-width,12rem);touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;display:inline-flex;position:relative}:host([fullwidth]){width:100%;min-width:0}}.slider-container{box-sizing:border-box;width:100%;min-height:var(--_touch-target);padding-inline:var(--_thumb-inset);flex:1;align-items:center;display:flex;position:relative}.slider-track{width:100%;height:var(--_height);background:var(--_track);border-radius:var(--rounded-full);position:relative}.slider-fill{top:0;left:var(--_fill-start,0%);width:var(--_fill-width,0%);background:var(--_fill);border-radius:var(--rounded-full);height:100%;transition:var(--_motion-transition,left var(--transition-fast), width var(--transition-fast));position:absolute}:host([data-dragging]) .slider-fill{transition:none}.slider-thumb{z-index:1;box-sizing:border-box;width:var(--_thumb-size);height:var(--_thumb-size);cursor:grab;background:var(--_thumb);border:2px solid var(--_fill);border-radius:var(--rounded-full);box-shadow:var(--shadow-sm);transition:var(--_motion-transition,box-shadow var(--transition-fast), left var(--transition-fast));will-change:transform;position:absolute;top:50%;transform:translate(-50%,-50%)}:host([data-dragging]) .slider-thumb{cursor:grabbing;box-shadow:var(--_shadow);transition:var(--_motion-transition,box-shadow var(--transition-fast))}.slider-thumb-sole{left:var(--_thumb-pos,0%)}:host(:focus-visible) .slider-thumb-sole,:host(:active) .slider-thumb-sole{box-shadow:var(--_shadow)}.slider-thumb-start{left:var(--_thumb-start,0%)}.slider-thumb-end{left:var(--_thumb-end,100%)}.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{z-index:2;outline:var(--border-2) solid var(--_fill);outline-offset:var(--size-0-5);box-shadow:var(--_shadow)}:host(:not([range])) .slider-thumb-start,:host(:not([range])) .slider-thumb-end,:host([range]) .slider-thumb-sole{display:none}@media (hover:hover){:host(:not([disabled])) .slider-thumb:hover{box-shadow:var(--_shadow)}}@media (forced-colors:active){:host(:focus-visible) .slider-thumb-sole,.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{outline-offset:2px;box-shadow:none;outline:2px solid highlight}}@layer refine.overrides{:host{--_fill:var(--slider-fill,var(--_theme-base));--_shadow:var(--_theme-shadow)}}.label{font-size:var(--_font-size);color:var(--color-contrast);white-space:nowrap}.helper-text[hidden]{display:none}.helper-text{width:100%;font-size:var(--text-xs);line-height:var(--leading-tight);color:color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas))}.helper-text[role=alert]{color:var(--color-error)}`;exports.default=e;
2
2
  //# sourceMappingURL=slider.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"slider.css.cjs","names":[],"sources":["../../../src/inputs/slider/slider.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n /* No unconditional `width: 100%` here, on purpose — matches every other field's own `:host`\n (`ore-input`, `ore-select`, `ore-number-input`, `ore-combobox`, `ore-date-picker`): shrink to\n `min-width` by default, opt into full width via `:host([fullwidth])` below. A hardcoded\n `width: 100%` here (the previous default) meant the slider always claimed the entire row in\n a flex layout regardless of layout intent — e.g. sitting next to a label/hint column in a\n settings-style row, it forced that column down to near its text's min-content width instead\n of sharing the row the way a same-row `ore-select`/`ore-number-input` naturally does. */\n :host {\n --_size: var(--slider-size, var(--size-5));\n --_height: var(--slider-height, var(--size-1));\n --_track: var(--slider-track-bg, var(--color-contrast-300));\n --_fill: var(--slider-fill, var(--color-neutral));\n --_thumb: var(--slider-thumb-bg, var(--color-contrast-50));\n --_thumb-size: var(--_size);\n --_thumb-inset: var(--slider-thumb-inset, var(--size-2-5));\n --_touch-target: var(--size-11);\n --_font-size: var(--text-sm);\n --_shadow: var(--color-neutral-focus-shadow);\n\n position: relative;\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--_gap, var(--size-3));\n align-items: center;\n min-width: var(--slider-min-width, 12rem);\n touch-action: none;\n cursor: pointer;\n user-select: none;\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n }\n}\n\n/* ========================================\n Track, Fill & Thumb\n ======================================== */\n\n.slider-container {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1;\n align-items: center;\n width: 100%;\n min-height: var(--_touch-target);\n padding-inline: var(--_thumb-inset);\n}\n\n.slider-track {\n position: relative;\n width: 100%;\n height: var(--_height);\n background: var(--_track);\n border-radius: var(--rounded-full);\n}\n\n/* Fill: always driven by --_fill-start / --_fill-width */\n.slider-fill {\n position: absolute;\n top: 0;\n left: var(--_fill-start, 0%);\n width: var(--_fill-width, 0%);\n height: 100%;\n background: var(--_fill);\n border-radius: var(--rounded-full);\n transition: var(--_motion-transition, left var(--transition-fast), width var(--transition-fast));\n}\n\n:host([data-dragging]) .slider-fill {\n transition: none;\n}\n\n.slider-thumb {\n position: absolute;\n top: 50%;\n z-index: 1;\n box-sizing: border-box;\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n cursor: grab;\n background: var(--_thumb);\n border: 2px solid var(--_fill);\n border-radius: var(--rounded-full);\n box-shadow: var(--shadow-sm);\n transform: translate(-50%, -50%);\n transition: var(--_motion-transition, box-shadow var(--transition-fast), left var(--transition-fast));\n will-change: transform;\n}\n\n:host([data-dragging]) .slider-thumb {\n cursor: grabbing;\n box-shadow: var(--_shadow);\n transition: var(--_motion-transition, box-shadow var(--transition-fast));\n}\n\n/* ── Single-value thumb ─────────────────────────────────── */\n\n.slider-thumb-sole {\n left: var(--_thumb-pos, 0%);\n}\n\n:host(:focus-visible) .slider-thumb-sole,\n:host(:active) .slider-thumb-sole {\n box-shadow: var(--_shadow);\n}\n\n/* ── Range thumbs ───────────────────────────────────────── */\n\n.slider-thumb-start {\n left: var(--_thumb-start, 0%);\n}\n\n.slider-thumb-end {\n left: var(--_thumb-end, 100%);\n}\n\n.slider-thumb-start:focus-visible,\n.slider-thumb-end:focus-visible {\n z-index: 2;\n outline: var(--border-2) solid var(--_fill);\n outline-offset: var(--size-0-5);\n box-shadow: var(--_shadow);\n}\n\n/* ── Visibility gating ──────────────────────────────────── */\n\n:host(:not([range])) .slider-thumb-start,\n:host(:not([range])) .slider-thumb-end {\n display: none;\n}\n\n:host([range]) .slider-thumb-sole {\n display: none;\n}\n\n@media (hover: hover) {\n :host(:not([disabled])) .slider-thumb:hover {\n box-shadow: var(--_shadow);\n }\n}\n\n@media (forced-colors: active) {\n :host(:focus-visible) .slider-thumb-sole,\n .slider-thumb-start:focus-visible,\n .slider-thumb-end:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: 2px;\n box-shadow: none;\n }\n}\n\n@layer refine.overrides {\n :host {\n --_fill: var(--slider-fill, var(--_theme-base));\n --_shadow: var(--_theme-shadow);\n }\n}\n\n/* ========================================\n Label\n ======================================== */\n\n.label {\n font-size: var(--_font-size);\n color: var(--color-contrast);\n white-space: nowrap;\n}\n\n.helper-text[hidden] {\n display: none;\n}\n\n.helper-text {\n width: 100%;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n}\n\n.helper-text[role='alert'] {\n color: var(--color-error);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"slider.css.cjs","names":[],"sources":["../../../src/inputs/slider/slider.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n /* No unconditional `width: 100%` here, on purpose — matches every other field's own `:host`\n (`ore-input`, `ore-select`, `ore-number-input`, `ore-combobox`, `ore-date-picker`): shrink to\n `min-width` by default, opt into full width via `:host([fullwidth])` below. A hardcoded\n `width: 100%` here (the previous default) meant the slider always claimed the entire row in\n a flex layout regardless of layout intent — e.g. sitting next to a label/hint column in a\n settings-style row, it forced that column down to near its text's min-content width instead\n of sharing the row the way a same-row `ore-select`/`ore-number-input` naturally does. */\n :host {\n --_size: var(--slider-size, var(--size-5));\n --_height: var(--slider-height, var(--size-1));\n --_track: var(--slider-track-bg, var(--color-contrast-300));\n --_fill: var(--slider-fill, var(--color-neutral));\n --_thumb: var(--slider-thumb-bg, var(--color-contrast-50));\n --_thumb-size: var(--_size);\n --_thumb-inset: var(--slider-thumb-inset, var(--size-2-5));\n --_touch-target: var(--size-11);\n --_font-size: var(--text-sm);\n --_shadow: var(--color-neutral-focus-shadow);\n\n position: relative;\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--_gap, var(--size-3));\n align-items: center;\n min-width: var(--slider-min-width, 12rem);\n touch-action: none;\n cursor: pointer;\n user-select: none;\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n min-width: 0;\n }\n}\n\n/* ========================================\n Track, Fill & Thumb\n ======================================== */\n\n.slider-container {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1;\n align-items: center;\n width: 100%;\n min-height: var(--_touch-target);\n padding-inline: var(--_thumb-inset);\n}\n\n.slider-track {\n position: relative;\n width: 100%;\n height: var(--_height);\n background: var(--_track);\n border-radius: var(--rounded-full);\n}\n\n/* Fill: always driven by --_fill-start / --_fill-width */\n.slider-fill {\n position: absolute;\n top: 0;\n left: var(--_fill-start, 0%);\n width: var(--_fill-width, 0%);\n height: 100%;\n background: var(--_fill);\n border-radius: var(--rounded-full);\n transition: var(--_motion-transition, left var(--transition-fast), width var(--transition-fast));\n}\n\n:host([data-dragging]) .slider-fill {\n transition: none;\n}\n\n.slider-thumb {\n position: absolute;\n top: 50%;\n z-index: 1;\n box-sizing: border-box;\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n cursor: grab;\n background: var(--_thumb);\n border: 2px solid var(--_fill);\n border-radius: var(--rounded-full);\n box-shadow: var(--shadow-sm);\n transform: translate(-50%, -50%);\n transition: var(--_motion-transition, box-shadow var(--transition-fast), left var(--transition-fast));\n will-change: transform;\n}\n\n:host([data-dragging]) .slider-thumb {\n cursor: grabbing;\n box-shadow: var(--_shadow);\n transition: var(--_motion-transition, box-shadow var(--transition-fast));\n}\n\n/* ── Single-value thumb ─────────────────────────────────── */\n\n.slider-thumb-sole {\n left: var(--_thumb-pos, 0%);\n}\n\n:host(:focus-visible) .slider-thumb-sole,\n:host(:active) .slider-thumb-sole {\n box-shadow: var(--_shadow);\n}\n\n/* ── Range thumbs ───────────────────────────────────────── */\n\n.slider-thumb-start {\n left: var(--_thumb-start, 0%);\n}\n\n.slider-thumb-end {\n left: var(--_thumb-end, 100%);\n}\n\n.slider-thumb-start:focus-visible,\n.slider-thumb-end:focus-visible {\n z-index: 2;\n outline: var(--border-2) solid var(--_fill);\n outline-offset: var(--size-0-5);\n box-shadow: var(--_shadow);\n}\n\n/* ── Visibility gating ──────────────────────────────────── */\n\n:host(:not([range])) .slider-thumb-start,\n:host(:not([range])) .slider-thumb-end {\n display: none;\n}\n\n:host([range]) .slider-thumb-sole {\n display: none;\n}\n\n@media (hover: hover) {\n :host(:not([disabled])) .slider-thumb:hover {\n box-shadow: var(--_shadow);\n }\n}\n\n@media (forced-colors: active) {\n :host(:focus-visible) .slider-thumb-sole,\n .slider-thumb-start:focus-visible,\n .slider-thumb-end:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: 2px;\n box-shadow: none;\n }\n}\n\n@layer refine.overrides {\n :host {\n --_fill: var(--slider-fill, var(--_theme-base));\n --_shadow: var(--_theme-shadow);\n }\n}\n\n/* ========================================\n Label\n ======================================== */\n\n.label {\n font-size: var(--_font-size);\n color: var(--color-contrast);\n white-space: nowrap;\n}\n\n.helper-text[hidden] {\n display: none;\n}\n\n.helper-text {\n width: 100%;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n}\n\n.helper-text[role='alert'] {\n color: var(--color-error);\n}\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  //#region src/inputs/slider/slider.css?inline
2
- var e = "@layer refine.base{:host{--_size:var(--slider-size,var(--size-5));--_height:var(--slider-height,var(--size-1));--_track:var(--slider-track-bg,var(--color-contrast-300));--_fill:var(--slider-fill,var(--color-neutral));--_thumb:var(--slider-thumb-bg,var(--color-contrast-50));--_thumb-size:var(--_size);--_thumb-inset:var(--slider-thumb-inset,var(--size-2-5));--_touch-target:var(--size-11);--_font-size:var(--text-sm);--_shadow:var(--color-neutral-focus-shadow);gap:var(--_gap,var(--size-3));min-width:var(--slider-min-width,12rem);touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;display:inline-flex;position:relative}:host([fullwidth]){width:100%}}.slider-container{box-sizing:border-box;width:100%;min-height:var(--_touch-target);padding-inline:var(--_thumb-inset);flex:1;align-items:center;display:flex;position:relative}.slider-track{width:100%;height:var(--_height);background:var(--_track);border-radius:var(--rounded-full);position:relative}.slider-fill{top:0;left:var(--_fill-start,0%);width:var(--_fill-width,0%);background:var(--_fill);border-radius:var(--rounded-full);height:100%;transition:var(--_motion-transition,left var(--transition-fast), width var(--transition-fast));position:absolute}:host([data-dragging]) .slider-fill{transition:none}.slider-thumb{z-index:1;box-sizing:border-box;width:var(--_thumb-size);height:var(--_thumb-size);cursor:grab;background:var(--_thumb);border:2px solid var(--_fill);border-radius:var(--rounded-full);box-shadow:var(--shadow-sm);transition:var(--_motion-transition,box-shadow var(--transition-fast), left var(--transition-fast));will-change:transform;position:absolute;top:50%;transform:translate(-50%,-50%)}:host([data-dragging]) .slider-thumb{cursor:grabbing;box-shadow:var(--_shadow);transition:var(--_motion-transition,box-shadow var(--transition-fast))}.slider-thumb-sole{left:var(--_thumb-pos,0%)}:host(:focus-visible) .slider-thumb-sole,:host(:active) .slider-thumb-sole{box-shadow:var(--_shadow)}.slider-thumb-start{left:var(--_thumb-start,0%)}.slider-thumb-end{left:var(--_thumb-end,100%)}.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{z-index:2;outline:var(--border-2) solid var(--_fill);outline-offset:var(--size-0-5);box-shadow:var(--_shadow)}:host(:not([range])) .slider-thumb-start,:host(:not([range])) .slider-thumb-end,:host([range]) .slider-thumb-sole{display:none}@media (hover:hover){:host(:not([disabled])) .slider-thumb:hover{box-shadow:var(--_shadow)}}@media (forced-colors:active){:host(:focus-visible) .slider-thumb-sole,.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{outline-offset:2px;box-shadow:none;outline:2px solid highlight}}@layer refine.overrides{:host{--_fill:var(--slider-fill,var(--_theme-base));--_shadow:var(--_theme-shadow)}}.label{font-size:var(--_font-size);color:var(--color-contrast);white-space:nowrap}.helper-text[hidden]{display:none}.helper-text{width:100%;font-size:var(--text-xs);line-height:var(--leading-tight);color:color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas))}.helper-text[role=alert]{color:var(--color-error)}";
2
+ var e = "@layer refine.base{:host{--_size:var(--slider-size,var(--size-5));--_height:var(--slider-height,var(--size-1));--_track:var(--slider-track-bg,var(--color-contrast-300));--_fill:var(--slider-fill,var(--color-neutral));--_thumb:var(--slider-thumb-bg,var(--color-contrast-50));--_thumb-size:var(--_size);--_thumb-inset:var(--slider-thumb-inset,var(--size-2-5));--_touch-target:var(--size-11);--_font-size:var(--text-sm);--_shadow:var(--color-neutral-focus-shadow);gap:var(--_gap,var(--size-3));min-width:var(--slider-min-width,12rem);touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;display:inline-flex;position:relative}:host([fullwidth]){width:100%;min-width:0}}.slider-container{box-sizing:border-box;width:100%;min-height:var(--_touch-target);padding-inline:var(--_thumb-inset);flex:1;align-items:center;display:flex;position:relative}.slider-track{width:100%;height:var(--_height);background:var(--_track);border-radius:var(--rounded-full);position:relative}.slider-fill{top:0;left:var(--_fill-start,0%);width:var(--_fill-width,0%);background:var(--_fill);border-radius:var(--rounded-full);height:100%;transition:var(--_motion-transition,left var(--transition-fast), width var(--transition-fast));position:absolute}:host([data-dragging]) .slider-fill{transition:none}.slider-thumb{z-index:1;box-sizing:border-box;width:var(--_thumb-size);height:var(--_thumb-size);cursor:grab;background:var(--_thumb);border:2px solid var(--_fill);border-radius:var(--rounded-full);box-shadow:var(--shadow-sm);transition:var(--_motion-transition,box-shadow var(--transition-fast), left var(--transition-fast));will-change:transform;position:absolute;top:50%;transform:translate(-50%,-50%)}:host([data-dragging]) .slider-thumb{cursor:grabbing;box-shadow:var(--_shadow);transition:var(--_motion-transition,box-shadow var(--transition-fast))}.slider-thumb-sole{left:var(--_thumb-pos,0%)}:host(:focus-visible) .slider-thumb-sole,:host(:active) .slider-thumb-sole{box-shadow:var(--_shadow)}.slider-thumb-start{left:var(--_thumb-start,0%)}.slider-thumb-end{left:var(--_thumb-end,100%)}.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{z-index:2;outline:var(--border-2) solid var(--_fill);outline-offset:var(--size-0-5);box-shadow:var(--_shadow)}:host(:not([range])) .slider-thumb-start,:host(:not([range])) .slider-thumb-end,:host([range]) .slider-thumb-sole{display:none}@media (hover:hover){:host(:not([disabled])) .slider-thumb:hover{box-shadow:var(--_shadow)}}@media (forced-colors:active){:host(:focus-visible) .slider-thumb-sole,.slider-thumb-start:focus-visible,.slider-thumb-end:focus-visible{outline-offset:2px;box-shadow:none;outline:2px solid highlight}}@layer refine.overrides{:host{--_fill:var(--slider-fill,var(--_theme-base));--_shadow:var(--_theme-shadow)}}.label{font-size:var(--_font-size);color:var(--color-contrast);white-space:nowrap}.helper-text[hidden]{display:none}.helper-text{width:100%;font-size:var(--text-xs);line-height:var(--leading-tight);color:color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas))}.helper-text[role=alert]{color:var(--color-error)}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"slider.css.js","names":[],"sources":["../../../src/inputs/slider/slider.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n /* No unconditional `width: 100%` here, on purpose — matches every other field's own `:host`\n (`ore-input`, `ore-select`, `ore-number-input`, `ore-combobox`, `ore-date-picker`): shrink to\n `min-width` by default, opt into full width via `:host([fullwidth])` below. A hardcoded\n `width: 100%` here (the previous default) meant the slider always claimed the entire row in\n a flex layout regardless of layout intent — e.g. sitting next to a label/hint column in a\n settings-style row, it forced that column down to near its text's min-content width instead\n of sharing the row the way a same-row `ore-select`/`ore-number-input` naturally does. */\n :host {\n --_size: var(--slider-size, var(--size-5));\n --_height: var(--slider-height, var(--size-1));\n --_track: var(--slider-track-bg, var(--color-contrast-300));\n --_fill: var(--slider-fill, var(--color-neutral));\n --_thumb: var(--slider-thumb-bg, var(--color-contrast-50));\n --_thumb-size: var(--_size);\n --_thumb-inset: var(--slider-thumb-inset, var(--size-2-5));\n --_touch-target: var(--size-11);\n --_font-size: var(--text-sm);\n --_shadow: var(--color-neutral-focus-shadow);\n\n position: relative;\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--_gap, var(--size-3));\n align-items: center;\n min-width: var(--slider-min-width, 12rem);\n touch-action: none;\n cursor: pointer;\n user-select: none;\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n }\n}\n\n/* ========================================\n Track, Fill & Thumb\n ======================================== */\n\n.slider-container {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1;\n align-items: center;\n width: 100%;\n min-height: var(--_touch-target);\n padding-inline: var(--_thumb-inset);\n}\n\n.slider-track {\n position: relative;\n width: 100%;\n height: var(--_height);\n background: var(--_track);\n border-radius: var(--rounded-full);\n}\n\n/* Fill: always driven by --_fill-start / --_fill-width */\n.slider-fill {\n position: absolute;\n top: 0;\n left: var(--_fill-start, 0%);\n width: var(--_fill-width, 0%);\n height: 100%;\n background: var(--_fill);\n border-radius: var(--rounded-full);\n transition: var(--_motion-transition, left var(--transition-fast), width var(--transition-fast));\n}\n\n:host([data-dragging]) .slider-fill {\n transition: none;\n}\n\n.slider-thumb {\n position: absolute;\n top: 50%;\n z-index: 1;\n box-sizing: border-box;\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n cursor: grab;\n background: var(--_thumb);\n border: 2px solid var(--_fill);\n border-radius: var(--rounded-full);\n box-shadow: var(--shadow-sm);\n transform: translate(-50%, -50%);\n transition: var(--_motion-transition, box-shadow var(--transition-fast), left var(--transition-fast));\n will-change: transform;\n}\n\n:host([data-dragging]) .slider-thumb {\n cursor: grabbing;\n box-shadow: var(--_shadow);\n transition: var(--_motion-transition, box-shadow var(--transition-fast));\n}\n\n/* ── Single-value thumb ─────────────────────────────────── */\n\n.slider-thumb-sole {\n left: var(--_thumb-pos, 0%);\n}\n\n:host(:focus-visible) .slider-thumb-sole,\n:host(:active) .slider-thumb-sole {\n box-shadow: var(--_shadow);\n}\n\n/* ── Range thumbs ───────────────────────────────────────── */\n\n.slider-thumb-start {\n left: var(--_thumb-start, 0%);\n}\n\n.slider-thumb-end {\n left: var(--_thumb-end, 100%);\n}\n\n.slider-thumb-start:focus-visible,\n.slider-thumb-end:focus-visible {\n z-index: 2;\n outline: var(--border-2) solid var(--_fill);\n outline-offset: var(--size-0-5);\n box-shadow: var(--_shadow);\n}\n\n/* ── Visibility gating ──────────────────────────────────── */\n\n:host(:not([range])) .slider-thumb-start,\n:host(:not([range])) .slider-thumb-end {\n display: none;\n}\n\n:host([range]) .slider-thumb-sole {\n display: none;\n}\n\n@media (hover: hover) {\n :host(:not([disabled])) .slider-thumb:hover {\n box-shadow: var(--_shadow);\n }\n}\n\n@media (forced-colors: active) {\n :host(:focus-visible) .slider-thumb-sole,\n .slider-thumb-start:focus-visible,\n .slider-thumb-end:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: 2px;\n box-shadow: none;\n }\n}\n\n@layer refine.overrides {\n :host {\n --_fill: var(--slider-fill, var(--_theme-base));\n --_shadow: var(--_theme-shadow);\n }\n}\n\n/* ========================================\n Label\n ======================================== */\n\n.label {\n font-size: var(--_font-size);\n color: var(--color-contrast);\n white-space: nowrap;\n}\n\n.helper-text[hidden] {\n display: none;\n}\n\n.helper-text {\n width: 100%;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n}\n\n.helper-text[role='alert'] {\n color: var(--color-error);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"slider.css.js","names":[],"sources":["../../../src/inputs/slider/slider.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n /* No unconditional `width: 100%` here, on purpose — matches every other field's own `:host`\n (`ore-input`, `ore-select`, `ore-number-input`, `ore-combobox`, `ore-date-picker`): shrink to\n `min-width` by default, opt into full width via `:host([fullwidth])` below. A hardcoded\n `width: 100%` here (the previous default) meant the slider always claimed the entire row in\n a flex layout regardless of layout intent — e.g. sitting next to a label/hint column in a\n settings-style row, it forced that column down to near its text's min-content width instead\n of sharing the row the way a same-row `ore-select`/`ore-number-input` naturally does. */\n :host {\n --_size: var(--slider-size, var(--size-5));\n --_height: var(--slider-height, var(--size-1));\n --_track: var(--slider-track-bg, var(--color-contrast-300));\n --_fill: var(--slider-fill, var(--color-neutral));\n --_thumb: var(--slider-thumb-bg, var(--color-contrast-50));\n --_thumb-size: var(--_size);\n --_thumb-inset: var(--slider-thumb-inset, var(--size-2-5));\n --_touch-target: var(--size-11);\n --_font-size: var(--text-sm);\n --_shadow: var(--color-neutral-focus-shadow);\n\n position: relative;\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--_gap, var(--size-3));\n align-items: center;\n min-width: var(--slider-min-width, 12rem);\n touch-action: none;\n cursor: pointer;\n user-select: none;\n }\n\n /* Explicit opt-in still forces full width outside a stretching grid/flex context — same\n convention as ore-input's own :host([fullwidth]). */\n :host([fullwidth]) {\n width: 100%;\n min-width: 0;\n }\n}\n\n/* ========================================\n Track, Fill & Thumb\n ======================================== */\n\n.slider-container {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1;\n align-items: center;\n width: 100%;\n min-height: var(--_touch-target);\n padding-inline: var(--_thumb-inset);\n}\n\n.slider-track {\n position: relative;\n width: 100%;\n height: var(--_height);\n background: var(--_track);\n border-radius: var(--rounded-full);\n}\n\n/* Fill: always driven by --_fill-start / --_fill-width */\n.slider-fill {\n position: absolute;\n top: 0;\n left: var(--_fill-start, 0%);\n width: var(--_fill-width, 0%);\n height: 100%;\n background: var(--_fill);\n border-radius: var(--rounded-full);\n transition: var(--_motion-transition, left var(--transition-fast), width var(--transition-fast));\n}\n\n:host([data-dragging]) .slider-fill {\n transition: none;\n}\n\n.slider-thumb {\n position: absolute;\n top: 50%;\n z-index: 1;\n box-sizing: border-box;\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n cursor: grab;\n background: var(--_thumb);\n border: 2px solid var(--_fill);\n border-radius: var(--rounded-full);\n box-shadow: var(--shadow-sm);\n transform: translate(-50%, -50%);\n transition: var(--_motion-transition, box-shadow var(--transition-fast), left var(--transition-fast));\n will-change: transform;\n}\n\n:host([data-dragging]) .slider-thumb {\n cursor: grabbing;\n box-shadow: var(--_shadow);\n transition: var(--_motion-transition, box-shadow var(--transition-fast));\n}\n\n/* ── Single-value thumb ─────────────────────────────────── */\n\n.slider-thumb-sole {\n left: var(--_thumb-pos, 0%);\n}\n\n:host(:focus-visible) .slider-thumb-sole,\n:host(:active) .slider-thumb-sole {\n box-shadow: var(--_shadow);\n}\n\n/* ── Range thumbs ───────────────────────────────────────── */\n\n.slider-thumb-start {\n left: var(--_thumb-start, 0%);\n}\n\n.slider-thumb-end {\n left: var(--_thumb-end, 100%);\n}\n\n.slider-thumb-start:focus-visible,\n.slider-thumb-end:focus-visible {\n z-index: 2;\n outline: var(--border-2) solid var(--_fill);\n outline-offset: var(--size-0-5);\n box-shadow: var(--_shadow);\n}\n\n/* ── Visibility gating ──────────────────────────────────── */\n\n:host(:not([range])) .slider-thumb-start,\n:host(:not([range])) .slider-thumb-end {\n display: none;\n}\n\n:host([range]) .slider-thumb-sole {\n display: none;\n}\n\n@media (hover: hover) {\n :host(:not([disabled])) .slider-thumb:hover {\n box-shadow: var(--_shadow);\n }\n}\n\n@media (forced-colors: active) {\n :host(:focus-visible) .slider-thumb-sole,\n .slider-thumb-start:focus-visible,\n .slider-thumb-end:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: 2px;\n box-shadow: none;\n }\n}\n\n@layer refine.overrides {\n :host {\n --_fill: var(--slider-fill, var(--_theme-base));\n --_shadow: var(--_theme-shadow);\n }\n}\n\n/* ========================================\n Label\n ======================================== */\n\n.label {\n font-size: var(--_font-size);\n color: var(--color-contrast);\n white-space: nowrap;\n}\n\n.helper-text[hidden] {\n display: none;\n}\n\n.helper-text {\n width: 100%;\n font-size: var(--text-xs);\n line-height: var(--leading-tight);\n color: color-mix(in oklch, var(--color-contrast-500) 80%, var(--color-canvas));\n}\n\n.helper-text[role='alert'] {\n color: var(--color-error);\n}\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./content/keyboard-key/keyboard-key.css.cjs"),n=require("./content/keyboard-key/keyboard-shortcut.css.cjs");let r=require("@vielzeug/ore");var i=`ore-keyboard-shortcut`;(0,r.define)(i,{props:{pressed:r.prop.bool(!1)},setup(e){return r.html`
2
+ <span class="shortcut" part="shortcut" ?data-pressed="${e.pressed}"><slot></slot></span>
3
+ `},styles:[e.reducedMotionMixin,n.default]});var a=`ore-keyboard-key`;(0,r.define)(a,{props:{pressed:r.prop.bool(!1),size:r.prop.string(`sm`),symbol:r.prop.string()},setup(e){return r.html`
4
+ <kbd class="key" part="key" ?data-has-symbol="${()=>!!e.symbol.value}" ?data-pressed="${e.pressed}">
5
+ <span class="symbol" aria-hidden="true" ?hidden="${()=>!e.symbol.value}">${e.symbol}</span>
6
+ <span class="label"><slot></slot></span>
7
+ </kbd>
8
+ `},styles:[e.reducedMotionMixin,t.default]}),exports.KEYBOARD_KEY_TAG=a,exports.KEYBOARD_SHORTCUT_TAG=i;
9
+ //# sourceMappingURL=keyboard-key.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-key.cjs","names":[],"sources":["../src/content/keyboard-key/keyboard-key.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { reducedMotionMixin } from '../../styles';\nimport componentStyles from './keyboard-key.css?inline';\nimport shortcutStyles from './keyboard-shortcut.css?inline';\n\nexport type KeyboardKeySize = 'sm' | 'lg';\n\nexport type OreKeyboardKeyProps = {\n pressed?: boolean;\n size?: KeyboardKeySize;\n symbol?: string;\n};\n\nexport type OreKeyboardShortcutProps = {\n pressed?: boolean;\n};\n\nexport const KEYBOARD_SHORTCUT_TAG = 'ore-keyboard-shortcut' as const;\ndefine<OreKeyboardShortcutProps>(KEYBOARD_SHORTCUT_TAG, {\n props: {\n pressed: prop.bool(false),\n },\n setup(props) {\n return html`\n <span class=\"shortcut\" part=\"shortcut\" ?data-pressed=\"${props.pressed}\"><slot></slot></span>\n `;\n },\n styles: [reducedMotionMixin, shortcutStyles],\n});\n\nexport const KEYBOARD_KEY_TAG = 'ore-keyboard-key' as const;\ndefine<OreKeyboardKeyProps>(KEYBOARD_KEY_TAG, {\n props: {\n pressed: prop.bool(false),\n size: prop.string<KeyboardKeySize>('sm'),\n symbol: prop.string(),\n },\n setup(props) {\n return html`\n <kbd class=\"key\" part=\"key\" ?data-has-symbol=\"${() => Boolean(props.symbol.value)}\" ?data-pressed=\"${props.pressed}\">\n <span class=\"symbol\" aria-hidden=\"true\" ?hidden=\"${() => !props.symbol.value}\">${props.symbol}</span>\n <span class=\"label\"><slot></slot></span>\n </kbd>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"kRAiBA,IAAa,EAAwB,yBACrC,EAAA,EAAA,OAAA,CAAiC,EAAuB,CACtD,MAAO,CACL,QAAS,EAAA,KAAK,KAAK,EAAK,CAC1B,EACA,MAAM,EAAO,CACX,MAAO,GAAA,IAAI;8DAC+C,EAAM,QAAQ;KAE1E,EACA,OAAQ,CAAC,EAAA,mBAAoB,EAAA,OAAc,CAC7C,CAAC,EAED,IAAa,EAAmB,oBAChC,EAAA,EAAA,OAAA,CAA4B,EAAkB,CAC5C,MAAO,CACL,QAAS,EAAA,KAAK,KAAK,EAAK,EACxB,KAAM,EAAA,KAAK,OAAwB,IAAI,EACvC,OAAQ,EAAA,KAAK,OAAO,CACtB,EACA,MAAM,EAAO,CACX,MAAO,GAAA,IAAI;0DAC6C,EAAQ,EAAM,OAAO,MAAO,mBAAmB,EAAM,QAAQ;+DACxD,CAAC,EAAM,OAAO,MAAM,IAAI,EAAM,OAAO;;;KAIpG,EACA,OAAQ,CAAC,EAAA,mBAAoB,EAAA,OAAe,CAC9C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
+ import t from "./content/keyboard-key/keyboard-key.css.js";
3
+ import n from "./content/keyboard-key/keyboard-shortcut.css.js";
4
+ import { define as r, html as i, prop as a } from "@vielzeug/ore";
5
+ //#region src/content/keyboard-key/keyboard-key.ts
6
+ var o = "ore-keyboard-shortcut";
7
+ r(o, {
8
+ props: { pressed: a.bool(!1) },
9
+ setup(e) {
10
+ return i`
11
+ <span class="shortcut" part="shortcut" ?data-pressed="${e.pressed}"><slot></slot></span>
12
+ `;
13
+ },
14
+ styles: [e, n]
15
+ });
16
+ var s = "ore-keyboard-key";
17
+ r(s, {
18
+ props: {
19
+ pressed: a.bool(!1),
20
+ size: a.string("sm"),
21
+ symbol: a.string()
22
+ },
23
+ setup(e) {
24
+ return i`
25
+ <kbd class="key" part="key" ?data-has-symbol="${() => !!e.symbol.value}" ?data-pressed="${e.pressed}">
26
+ <span class="symbol" aria-hidden="true" ?hidden="${() => !e.symbol.value}">${e.symbol}</span>
27
+ <span class="label"><slot></slot></span>
28
+ </kbd>
29
+ `;
30
+ },
31
+ styles: [e, t]
32
+ });
33
+ //#endregion
34
+ export { s as KEYBOARD_KEY_TAG, o as KEYBOARD_SHORTCUT_TAG };
35
+
36
+ //# sourceMappingURL=keyboard-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-key.js","names":[],"sources":["../src/content/keyboard-key/keyboard-key.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { reducedMotionMixin } from '../../styles';\nimport componentStyles from './keyboard-key.css?inline';\nimport shortcutStyles from './keyboard-shortcut.css?inline';\n\nexport type KeyboardKeySize = 'sm' | 'lg';\n\nexport type OreKeyboardKeyProps = {\n pressed?: boolean;\n size?: KeyboardKeySize;\n symbol?: string;\n};\n\nexport type OreKeyboardShortcutProps = {\n pressed?: boolean;\n};\n\nexport const KEYBOARD_SHORTCUT_TAG = 'ore-keyboard-shortcut' as const;\ndefine<OreKeyboardShortcutProps>(KEYBOARD_SHORTCUT_TAG, {\n props: {\n pressed: prop.bool(false),\n },\n setup(props) {\n return html`\n <span class=\"shortcut\" part=\"shortcut\" ?data-pressed=\"${props.pressed}\"><slot></slot></span>\n `;\n },\n styles: [reducedMotionMixin, shortcutStyles],\n});\n\nexport const KEYBOARD_KEY_TAG = 'ore-keyboard-key' as const;\ndefine<OreKeyboardKeyProps>(KEYBOARD_KEY_TAG, {\n props: {\n pressed: prop.bool(false),\n size: prop.string<KeyboardKeySize>('sm'),\n symbol: prop.string(),\n },\n setup(props) {\n return html`\n <kbd class=\"key\" part=\"key\" ?data-has-symbol=\"${() => Boolean(props.symbol.value)}\" ?data-pressed=\"${props.pressed}\">\n <span class=\"symbol\" aria-hidden=\"true\" ?hidden=\"${() => !props.symbol.value}\">${props.symbol}</span>\n <span class=\"label\"><slot></slot></span>\n </kbd>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":";;;;;AAiBA,IAAa,IAAwB;AACrC,EAAiC,GAAuB;CACtD,OAAO,EACL,SAAS,EAAK,KAAK,EAAK,EAC1B;CACA,MAAM,GAAO;EACX,OAAO,CAAI;8DAC+C,EAAM,QAAQ;;CAE1E;CACA,QAAQ,CAAC,GAAoB,CAAc;AAC7C,CAAC;AAED,IAAa,IAAmB;AAChC,EAA4B,GAAkB;CAC5C,OAAO;EACL,SAAS,EAAK,KAAK,EAAK;EACxB,MAAM,EAAK,OAAwB,IAAI;EACvC,QAAQ,EAAK,OAAO;CACtB;CACA,MAAM,GAAO;EACX,OAAO,CAAI;4DAC6C,EAAQ,EAAM,OAAO,MAAO,mBAAmB,EAAM,QAAQ;iEACxD,CAAC,EAAM,OAAO,MAAM,IAAI,EAAM,OAAO;;;;CAIpG;CACA,QAAQ,CAAC,GAAoB,CAAe;AAC9C,CAAC"}
package/dist/menu.cjs CHANGED
@@ -14,7 +14,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
14
14
  <span class="icon-slot"><slot name="icon"></slot></span>
15
15
  <span class="item-label"><slot></slot></span>
16
16
  </div>
17
- `},styles:[t.colorThemeMixin,u.default]});var g=`ore-menu-separator`;(0,f.define)(g,{setup(){return f.html``},styles:[d.default]});var _=e=>e===`checkbox`||e===`radio`,v=e=>e==null?void 0:e===``||e===`true`,y=`ore-menu`;(0,f.define)(y,{props:{...s.sizableBundle,...s.disablableBundle,"default-open":f.prop.bool(!1),open:{default:void 0,parse:v},placement:f.prop.oneOf([`bottom`,`bottom-start`,`bottom-end`,`top`,`top-start`,`top-end`],`bottom-start`)},setup(e){let t=(0,f.getHost)(),s=(0,f.useEmit)(),c=(0,f.useSlots)(),l=f.watchEffect,u=(0,f.createId)(`menu`),d=(0,p.computed)(()=>!!e.disabled.value),h=r.lifecycleSignal(f.onCleanup),g=null,v=null,y=null;function b(){return Array.from(t.querySelectorAll(`ore-menu-item:not([disabled])`))}function x(e){return e?e.shadowRoot?.querySelector(`[role^="menuitem"]`)??e:null}function S(){return b().findIndex(e=>{let t=x(e);return e===document.activeElement||t===document.activeElement})}let C=(0,p.signal)(!1),w=null,T=o.createDropdownPositioner({getFloating:()=>v,getPlacement:()=>e.placement.value??`bottom-start`,getReference:()=>g,matchWidth:!1,offsetPx:4,padding:6}),E=a.createListControl({disabled:(0,p.computed)(()=>!C.value),getItems:b,isItemDisabled:e=>e.hasAttribute(`disabled`),onNavigate:({item:e})=>{x(e)?.focus()},signal:h}),D=(e=`programmatic`,t=!0)=>{C.value&&(C.value=!1,E.reset(),w?.(),w=null,t&&(0,m.restoreFocus)(()=>g),s(`open-change`,{open:!1,reason:e}))},O=(e=`programmatic`)=>{d.value||C.value||(C.value=!0,T.update(),w=T.startAutoUpdate?.()??null,s(`open-change`,{open:!0,reason:e}))},k=()=>{C.value?D(`trigger`):O(`click`)};i.createOutsidePointerDismissal({getTargets:()=>[t,v],isActive:()=>C.value,onDismiss:()=>D(`outsideClick`),signal:h});let A=!1;(0,p.watch)(e.open,t=>{t===void 0?A?D(`programmatic`):e[`default-open`].value&&O(`programmatic`):t?O(`programmatic`):D(`programmatic`),A=!0},{immediate:!0}),h.addEventListener(`abort`,()=>{C.value&&(C.value=!1,E.reset(),w?.(),w=null)},{once:!0});let j=e=>{let n=e.getAttribute(`type`),r=_(n);if(n===`checkbox`)e.toggleAttribute(`checked`,!e.hasAttribute(`checked`));else if(n===`radio`)for(let n of t.querySelectorAll(`ore-menu-item[type="radio"]`))n.toggleAttribute(`checked`,n===e);let i=e.getAttribute(`value`)??``,a=r?e.hasAttribute(`checked`):void 0;s(`select`,{checked:a,value:i}),r||D(`programmatic`)},M=n.createInteraction({keys:[`Enter`,` `,`ArrowDown`],onPress:()=>{O(`keyboard`),requestAnimationFrame(()=>E.set(0))}}),N=n.createInteraction({onPress:()=>{let e=E.getActiveItem();e&&j(e)}});function P(e){if(d.value)return;if(!C.value){M.handleKeydown(e);return}let t=S();if(t>=0&&E.set(t),e.key===`Escape`){e.preventDefault(),D(`escape`);return}if(!E.handleKeydown(e)){if(e.key===` `||e.key===`Enter`){N.handleKeydown(e);return}e.key===`Tab`&&D(`programmatic`)}}(0,f.bind)({on:{click:e=>{let t=e.composedPath();if(!C.value)return;let n=t.find(e=>e instanceof HTMLElement&&e.tagName===`ORE-MENU-ITEM`)??e.target?.closest(`ore-menu-item`)??null;n&&!n.hasAttribute(`disabled`)&&j(n)}}}),l(()=>{let e=C.value;v&&v.toggleAttribute(`data-open`,e)});function F(){if(y?.(),y=null,g=c.elements(`trigger`).value?.[0]??null,!g)return;let e=[],t=(0,f.bind)({attr:{"aria-controls":()=>u,"aria-disabled":()=>d.value,"aria-expanded":()=>String(C.value),"aria-haspopup":`menu`}},{target:g}),n=e=>{e.stopPropagation(),!d.value&&k()},r=e=>{P(e)};g.addEventListener(`click`,n),g.addEventListener(`keydown`,r),e.push(()=>g?.removeEventListener(`click`,n)),e.push(()=>g?.removeEventListener(`keydown`,r)),y=()=>{t();for(let t of e)t()}}return(0,p.watch)(c.elements(`trigger`),F,{immediate:!0}),(0,f.onMounted)(()=>(F(),()=>{y?.(),y=null})),f.html`
17
+ `},styles:[t.colorThemeMixin,u.default]});var g=`ore-menu-separator`;(0,f.define)(g,{setup(){return f.html``},styles:[d.default]});var _=e=>e===`checkbox`||e===`radio`,v=e=>e==null?void 0:e===``||e===`true`,y=`ore-menu`;(0,f.define)(y,{props:{...s.sizableBundle,...s.disablableBundle,"default-open":f.prop.bool(!1),open:{default:void 0,parse:v},placement:f.prop.oneOf([`bottom`,`bottom-start`,`bottom-end`,`top`,`top-start`,`top-end`],`bottom-start`)},setup(e){let t=(0,f.getHost)(),s=(0,f.useEmit)(),c=(0,f.useSlots)(),l=f.watchEffect,u=(0,f.createId)(`menu`),d=(0,p.computed)(()=>!!e.disabled.value),h=r.lifecycleSignal(f.onCleanup),g=null,v=null,y=null;function b(){return Array.from(t.querySelectorAll(`ore-menu-item:not([disabled])`))}function x(e){return e?e.shadowRoot?.querySelector(`[role^="menuitem"]`)??e:null}function S(){return b().findIndex(e=>{let t=x(e);return e===document.activeElement||t===document.activeElement})}let C=(0,p.signal)(!1),w=null,T=o.createDropdownPositioner({getFloating:()=>v,getPlacement:()=>e.placement.value??`bottom-start`,getReference:()=>g,matchWidth:!1,offsetPx:4,padding:6,useClippingAncestor:!1}),E=a.createListControl({disabled:(0,p.computed)(()=>!C.value),getItems:b,isItemDisabled:e=>e.hasAttribute(`disabled`),onNavigate:({item:e})=>{x(e)?.focus()},signal:h}),D=(e=`programmatic`,t=!0)=>{C.value&&(C.value=!1,E.reset(),w?.(),w=null,t&&(0,m.restoreFocus)(()=>g),s(`open-change`,{open:!1,reason:e}))},O=(e=`programmatic`)=>{d.value||C.value||(C.value=!0,T.update(),w=T.startAutoUpdate?.()??null,s(`open-change`,{open:!0,reason:e}))},k=()=>{C.value?D(`trigger`):O(`click`)};i.createOutsidePointerDismissal({getTargets:()=>[t,v],isActive:()=>C.value,onDismiss:()=>D(`outsideClick`),signal:h});let A=!1;(0,p.watch)(e.open,t=>{t===void 0?A?D(`programmatic`):e[`default-open`].value&&O(`programmatic`):t?O(`programmatic`):D(`programmatic`),A=!0},{immediate:!0}),h.addEventListener(`abort`,()=>{C.value&&(C.value=!1,E.reset(),w?.(),w=null)},{once:!0});let j=e=>{let n=e.getAttribute(`type`),r=_(n);if(n===`checkbox`)e.toggleAttribute(`checked`,!e.hasAttribute(`checked`));else if(n===`radio`)for(let n of t.querySelectorAll(`ore-menu-item[type="radio"]`))n.toggleAttribute(`checked`,n===e);let i=e.getAttribute(`value`)??``,a=r?e.hasAttribute(`checked`):void 0;s(`select`,{checked:a,value:i}),r||D(`programmatic`)},M=n.createInteraction({keys:[`Enter`,` `,`ArrowDown`],onPress:()=>{O(`keyboard`),requestAnimationFrame(()=>E.set(0))}}),N=n.createInteraction({onPress:()=>{let e=E.getActiveItem();e&&j(e)}});function P(e){if(d.value)return;if(!C.value){M.handleKeydown(e);return}let t=S();if(t>=0&&E.set(t),e.key===`Escape`){e.preventDefault(),D(`escape`);return}if(!E.handleKeydown(e)){if(e.key===` `||e.key===`Enter`){N.handleKeydown(e);return}e.key===`Tab`&&D(`programmatic`)}}(0,f.bind)({on:{click:e=>{let t=e.composedPath();if(!C.value)return;let n=t.find(e=>e instanceof HTMLElement&&e.tagName===`ORE-MENU-ITEM`)??e.target?.closest(`ore-menu-item`)??null;n&&!n.hasAttribute(`disabled`)&&j(n)}}}),l(()=>{let e=C.value;v&&v.toggleAttribute(`data-open`,e)});function F(){if(y?.(),y=null,g=c.elements(`trigger`).value?.[0]??null,!g)return;let e=[],t=(0,f.bind)({attr:{"aria-controls":()=>u,"aria-disabled":()=>d.value,"aria-expanded":()=>String(C.value),"aria-haspopup":`menu`}},{target:g}),n=e=>{e.stopPropagation(),!d.value&&k()},r=e=>{P(e)};g.addEventListener(`click`,n),g.addEventListener(`keydown`,r),e.push(()=>g?.removeEventListener(`click`,n)),e.push(()=>g?.removeEventListener(`keydown`,r)),y=()=>{t();for(let t of e)t()}}return(0,p.watch)(c.elements(`trigger`),F,{immediate:!0}),(0,f.onMounted)(()=>(F(),()=>{y?.(),y=null})),f.html`
18
18
  <slot name="trigger"></slot>
19
19
  <div
20
20
  class="menu-panel"