@ecopages/radiant-ui 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -0
- package/dist/components/ui/alert/alert.css +27 -0
- package/dist/components/ui/alert/alert.d.ts +4 -0
- package/dist/components/ui/alert/alert.script.d.ts +25 -0
- package/dist/components/ui/alert/index.d.ts +2 -0
- package/dist/components/ui/alert/index.js +2 -0
- package/dist/components/ui/alert/index.js.map +7 -0
- package/dist/components/ui/breadcrumb/breadcrumb.css +41 -0
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts +59 -0
- package/dist/components/ui/breadcrumb/breadcrumb.script.d.ts +40 -0
- package/dist/components/ui/breadcrumb/index.d.ts +2 -0
- package/dist/components/ui/breadcrumb/index.js +2 -0
- package/dist/components/ui/breadcrumb/index.js.map +7 -0
- package/dist/components/ui/button/button.d.ts +37 -0
- package/dist/components/ui/button/index.d.ts +1 -0
- package/dist/components/ui/button/index.js +2 -0
- package/dist/components/ui/button/index.js.map +7 -0
- package/dist/components/ui/carousel/carousel.css +170 -0
- package/dist/components/ui/carousel/carousel.d.ts +39 -0
- package/dist/components/ui/carousel/carousel.script.d.ts +113 -0
- package/dist/components/ui/carousel/index.d.ts +2 -0
- package/dist/components/ui/carousel/index.js +2 -0
- package/dist/components/ui/carousel/index.js.map +7 -0
- package/dist/components/ui/checkbox/checkbox.css +55 -0
- package/dist/components/ui/checkbox/checkbox.d.ts +4 -0
- package/dist/components/ui/checkbox/checkbox.script.d.ts +58 -0
- package/dist/components/ui/checkbox/index.d.ts +2 -0
- package/dist/components/ui/checkbox/index.js +2 -0
- package/dist/components/ui/checkbox/index.js.map +7 -0
- package/dist/components/ui/combobox/combobox.css +65 -0
- package/dist/components/ui/combobox/combobox.d.ts +53 -0
- package/dist/components/ui/combobox/combobox.script.d.ts +89 -0
- package/dist/components/ui/combobox/index.d.ts +2 -0
- package/dist/components/ui/combobox/index.js +2 -0
- package/dist/components/ui/combobox/index.js.map +7 -0
- package/dist/components/ui/dialog/dialog-registry.d.ts +34 -0
- package/dist/components/ui/dialog/dialog-registry.test.d.ts +1 -0
- package/dist/components/ui/dialog/dialog-types.d.ts +55 -0
- package/dist/components/ui/dialog/dialog.css +53 -0
- package/dist/components/ui/dialog/dialog.d.ts +36 -0
- package/dist/components/ui/dialog/dialog.script.d.ts +61 -0
- package/dist/components/ui/dialog/index.d.ts +4 -0
- package/dist/components/ui/dialog/index.js +2 -0
- package/dist/components/ui/dialog/index.js.map +7 -0
- package/dist/components/ui/disclosure/disclosure-group.script.d.ts +31 -0
- package/dist/components/ui/disclosure/disclosure.css +105 -0
- package/dist/components/ui/disclosure/disclosure.d.ts +35 -0
- package/dist/components/ui/disclosure/disclosure.script.d.ts +38 -0
- package/dist/components/ui/disclosure/index.d.ts +3 -0
- package/dist/components/ui/disclosure/index.js +2 -0
- package/dist/components/ui/disclosure/index.js.map +7 -0
- package/dist/components/ui/feed/feed.css +14 -0
- package/dist/components/ui/feed/feed.d.ts +12 -0
- package/dist/components/ui/feed/feed.script.d.ts +22 -0
- package/dist/components/ui/feed/index.d.ts +2 -0
- package/dist/components/ui/feed/index.js +2 -0
- package/dist/components/ui/feed/index.js.map +7 -0
- package/dist/components/ui/field/field-context.d.ts +20 -0
- package/dist/components/ui/field/field-description.d.ts +8 -0
- package/dist/components/ui/field/field-error.d.ts +9 -0
- package/dist/components/ui/field/field-ssr-hydration.test.d.ts +1 -0
- package/dist/components/ui/field/field.css +26 -0
- package/dist/components/ui/field/field.d.ts +4 -0
- package/dist/components/ui/field/field.script.d.ts +68 -0
- package/dist/components/ui/field/index.d.ts +5 -0
- package/dist/components/ui/field/index.js +2 -0
- package/dist/components/ui/field/index.js.map +7 -0
- package/dist/components/ui/form/control-protocol.d.ts +19 -0
- package/dist/components/ui/form/form-context.d.ts +27 -0
- package/dist/components/ui/form/form-field.test.d.ts +3 -0
- package/dist/components/ui/form/form-store.d.ts +53 -0
- package/dist/components/ui/form/form-store.test.d.ts +1 -0
- package/dist/components/ui/form/form.css +12 -0
- package/dist/components/ui/form/form.d.ts +5 -0
- package/dist/components/ui/form/form.script.d.ts +67 -0
- package/dist/components/ui/form/index.d.ts +7 -0
- package/dist/components/ui/form/index.js +2 -0
- package/dist/components/ui/form/index.js.map +7 -0
- package/dist/components/ui/form/resolvers.d.ts +3 -0
- package/dist/components/ui/form/types.d.ts +72 -0
- package/dist/components/ui/grid/grid.css +47 -0
- package/dist/components/ui/grid/grid.d.ts +7 -0
- package/dist/components/ui/grid/grid.script.d.ts +26 -0
- package/dist/components/ui/grid/index.d.ts +2 -0
- package/dist/components/ui/grid/index.js +2 -0
- package/dist/components/ui/grid/index.js.map +7 -0
- package/dist/components/ui/input/index.d.ts +1 -0
- package/dist/components/ui/input/index.js +2 -0
- package/dist/components/ui/input/index.js.map +7 -0
- package/dist/components/ui/input/input.css +32 -0
- package/dist/components/ui/input/input.d.ts +23 -0
- package/dist/components/ui/label/index.d.ts +1 -0
- package/dist/components/ui/label/index.js +2 -0
- package/dist/components/ui/label/index.js.map +7 -0
- package/dist/components/ui/label/label.css +8 -0
- package/dist/components/ui/label/label.d.ts +9 -0
- package/dist/components/ui/listbox/index.d.ts +2 -0
- package/dist/components/ui/listbox/index.js +2 -0
- package/dist/components/ui/listbox/index.js.map +7 -0
- package/dist/components/ui/listbox/listbox.css +23 -0
- package/dist/components/ui/listbox/listbox.d.ts +12 -0
- package/dist/components/ui/listbox/listbox.script.d.ts +40 -0
- package/dist/components/ui/menu-button/index.d.ts +2 -0
- package/dist/components/ui/menu-button/index.js +2 -0
- package/dist/components/ui/menu-button/index.js.map +7 -0
- package/dist/components/ui/menu-button/menu-button.css +43 -0
- package/dist/components/ui/menu-button/menu-button.d.ts +13 -0
- package/dist/components/ui/menu-button/menu-button.script.d.ts +64 -0
- package/dist/components/ui/menubar/index.d.ts +2 -0
- package/dist/components/ui/menubar/index.js +2 -0
- package/dist/components/ui/menubar/index.js.map +7 -0
- package/dist/components/ui/menubar/menubar.css +45 -0
- package/dist/components/ui/menubar/menubar.d.ts +16 -0
- package/dist/components/ui/menubar/menubar.script.d.ts +52 -0
- package/dist/components/ui/meter/index.d.ts +2 -0
- package/dist/components/ui/meter/index.js +2 -0
- package/dist/components/ui/meter/index.js.map +7 -0
- package/dist/components/ui/meter/meter.css +17 -0
- package/dist/components/ui/meter/meter.d.ts +4 -0
- package/dist/components/ui/meter/meter.script.d.ts +33 -0
- package/dist/components/ui/navigation-menu/index.d.ts +2 -0
- package/dist/components/ui/navigation-menu/index.js +2 -0
- package/dist/components/ui/navigation-menu/index.js.map +7 -0
- package/dist/components/ui/navigation-menu/navigation-menu.css +90 -0
- package/dist/components/ui/navigation-menu/navigation-menu.d.ts +28 -0
- package/dist/components/ui/navigation-menu/navigation-menu.script.d.ts +49 -0
- package/dist/components/ui/radio-group/index.d.ts +2 -0
- package/dist/components/ui/radio-group/index.js +2 -0
- package/dist/components/ui/radio-group/index.js.map +7 -0
- package/dist/components/ui/radio-group/radio-group.css +44 -0
- package/dist/components/ui/radio-group/radio-group.d.ts +12 -0
- package/dist/components/ui/radio-group/radio-group.script.d.ts +52 -0
- package/dist/components/ui/sidebar/index.d.ts +3 -0
- package/dist/components/ui/sidebar/index.js +2 -0
- package/dist/components/ui/sidebar/index.js.map +7 -0
- package/dist/components/ui/sidebar/sidebar-trigger.script.d.ts +53 -0
- package/dist/components/ui/sidebar/sidebar.css +362 -0
- package/dist/components/ui/sidebar/sidebar.d.ts +141 -0
- package/dist/components/ui/sidebar/sidebar.script.d.ts +140 -0
- package/dist/components/ui/sidebar/sidebar.test.d.ts +1 -0
- package/dist/components/ui/slider/index.d.ts +2 -0
- package/dist/components/ui/slider/index.js +2 -0
- package/dist/components/ui/slider/index.js.map +7 -0
- package/dist/components/ui/slider/slider.css +51 -0
- package/dist/components/ui/slider/slider.d.ts +7 -0
- package/dist/components/ui/slider/slider.script.d.ts +102 -0
- package/dist/components/ui/spinbutton/index.d.ts +2 -0
- package/dist/components/ui/spinbutton/index.js +2 -0
- package/dist/components/ui/spinbutton/index.js.map +7 -0
- package/dist/components/ui/spinbutton/spinbutton.css +19 -0
- package/dist/components/ui/spinbutton/spinbutton.d.ts +4 -0
- package/dist/components/ui/spinbutton/spinbutton.script.d.ts +64 -0
- package/dist/components/ui/switch/index.d.ts +2 -0
- package/dist/components/ui/switch/index.js +2 -0
- package/dist/components/ui/switch/index.js.map +7 -0
- package/dist/components/ui/switch/switch.css +47 -0
- package/dist/components/ui/switch/switch.d.ts +4 -0
- package/dist/components/ui/switch/switch.script.d.ts +51 -0
- package/dist/components/ui/tabs/index.d.ts +2 -0
- package/dist/components/ui/tabs/index.js +2 -0
- package/dist/components/ui/tabs/index.js.map +7 -0
- package/dist/components/ui/tabs/tabs.css +28 -0
- package/dist/components/ui/tabs/tabs.d.ts +12 -0
- package/dist/components/ui/tabs/tabs.script.d.ts +54 -0
- package/dist/components/ui/textarea/index.d.ts +1 -0
- package/dist/components/ui/textarea/index.js +2 -0
- package/dist/components/ui/textarea/index.js.map +7 -0
- package/dist/components/ui/textarea/textarea.css +33 -0
- package/dist/components/ui/textarea/textarea.d.ts +23 -0
- package/dist/components/ui/toast/index.d.ts +5 -0
- package/dist/components/ui/toast/index.js +2 -0
- package/dist/components/ui/toast/index.js.map +7 -0
- package/dist/components/ui/toast/toast-api.d.ts +29 -0
- package/dist/components/ui/toast/toast-context.d.ts +59 -0
- package/dist/components/ui/toast/toast-state.d.ts +25 -0
- package/dist/components/ui/toast/toast.css +315 -0
- package/dist/components/ui/toast/toast.d.ts +8 -0
- package/dist/components/ui/toast/toast.script.d.ts +91 -0
- package/dist/components/ui/toast/toast.test.d.ts +2 -0
- package/dist/components/ui/toast/toaster.script.d.ts +79 -0
- package/dist/components/ui/toolbar/index.d.ts +2 -0
- package/dist/components/ui/toolbar/index.js +2 -0
- package/dist/components/ui/toolbar/index.js.map +7 -0
- package/dist/components/ui/toolbar/toolbar.css +16 -0
- package/dist/components/ui/toolbar/toolbar.d.ts +4 -0
- package/dist/components/ui/toolbar/toolbar.script.d.ts +30 -0
- package/dist/components/ui/tooltip/index.d.ts +2 -0
- package/dist/components/ui/tooltip/index.js +2 -0
- package/dist/components/ui/tooltip/index.js.map +7 -0
- package/dist/components/ui/tooltip/tooltip.css +25 -0
- package/dist/components/ui/tooltip/tooltip.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip.script.d.ts +70 -0
- package/dist/components/ui/tree/index.d.ts +2 -0
- package/dist/components/ui/tree/index.js +2 -0
- package/dist/components/ui/tree/index.js.map +7 -0
- package/dist/components/ui/tree/tree.css +54 -0
- package/dist/components/ui/tree/tree.d.ts +13 -0
- package/dist/components/ui/tree/tree.script.d.ts +45 -0
- package/dist/components/ui/treegrid/index.d.ts +2 -0
- package/dist/components/ui/treegrid/index.js +2 -0
- package/dist/components/ui/treegrid/index.js.map +7 -0
- package/dist/components/ui/treegrid/treegrid.css +77 -0
- package/dist/components/ui/treegrid/treegrid.d.ts +14 -0
- package/dist/components/ui/treegrid/treegrid.script.d.ts +49 -0
- package/dist/components/ui/window-splitter/index.d.ts +2 -0
- package/dist/components/ui/window-splitter/index.js +2 -0
- package/dist/components/ui/window-splitter/index.js.map +7 -0
- package/dist/components/ui/window-splitter/window-splitter.css +35 -0
- package/dist/components/ui/window-splitter/window-splitter.d.ts +8 -0
- package/dist/components/ui/window-splitter/window-splitter.script.d.ts +49 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/dist/lib/focusable-elements.d.ts +2 -0
- package/dist/lib/radiant-view.d.ts +17 -0
- package/dist/lib/roving-tabindex.d.ts +27 -0
- package/dist/styles/components/button.css +115 -0
- package/dist/styles/radiant-ui-core.css +7 -0
- package/dist/styles/radiant-ui.css +10 -0
- package/dist/styles/styles.css +36 -0
- package/dist/styles/tailwind.css +41 -0
- package/dist/styles/themes/aurora.css +19 -0
- package/dist/styles/themes/default-compact-soft.css +19 -0
- package/dist/styles/themes/default.css +2 -0
- package/dist/styles/themes/glacier.css +19 -0
- package/dist/styles/tokens/colors/aurora.css +73 -0
- package/dist/styles/tokens/colors/basalt.css +36 -0
- package/dist/styles/tokens/colors/glacier.css +45 -0
- package/dist/styles/tokens/colors/palettes.css +3 -0
- package/dist/styles/tokens/elevation/default.css +22 -0
- package/dist/styles/tokens/elevation/flat.css +22 -0
- package/dist/styles/tokens/motion/default.css +19 -0
- package/dist/styles/tokens/motion/snappy.css +19 -0
- package/dist/styles/tokens/presets/colors/aurora.css +126 -0
- package/dist/styles/tokens/presets/colors/basalt.css +126 -0
- package/dist/styles/tokens/presets/colors/ember.css +134 -0
- package/dist/styles/tokens/presets/colors/glacier.css +130 -0
- package/dist/styles/tokens/presets/colors/index.css +4 -0
- package/dist/styles/tokens/presets/radius.css +45 -0
- package/dist/styles/tokens/presets/spacing.css +57 -0
- package/dist/styles/tokens/radius/default.css +34 -0
- package/dist/styles/tokens/radius/edgy.css +35 -0
- package/dist/styles/tokens/radius/sharp.css +2 -0
- package/dist/styles/tokens/radius/soft.css +34 -0
- package/dist/styles/tokens/semantic.css +80 -0
- package/dist/styles/tokens/spacing/compact.css +23 -0
- package/dist/styles/tokens/spacing/default.css +23 -0
- package/dist/styles/tokens/spacing/scale-bridge.css +17 -0
- package/dist/styles/tokens/spacing/wide.css +23 -0
- package/dist/styles/tokens/system.css +36 -0
- package/dist/styles/tokens/typography/default.css +37 -0
- package/dist/styles/utilities/sheen.css +7 -0
- package/dist/types.d.ts +14 -0
- package/package.json +371 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/ui/alert/alert.script.tsx", "../src/lib/radiant-view.ts", "../src/components/ui/alert/alert.tsx", "../src/components/ui/breadcrumb/breadcrumb.script.tsx", "../src/components/ui/breadcrumb/breadcrumb.tsx", "../src/components/ui/button/button.tsx", "../src/components/ui/carousel/carousel.script.tsx", "../src/components/ui/carousel/carousel.tsx", "../src/components/ui/checkbox/checkbox.script.tsx", "../src/components/ui/checkbox/checkbox.tsx", "../src/components/ui/combobox/combobox.script.tsx", "../src/components/ui/combobox/combobox.tsx", "../src/components/ui/dialog/dialog.script.tsx", "../src/components/ui/dialog/dialog.tsx", "../src/components/ui/dialog/dialog-types.ts", "../src/components/ui/dialog/dialog-registry.ts", "../src/components/ui/disclosure/disclosure.script.tsx", "../src/components/ui/disclosure/disclosure-group.script.tsx", "../src/lib/roving-tabindex.ts", "../src/components/ui/disclosure/disclosure.tsx", "../src/components/ui/feed/feed.script.tsx", "../src/components/ui/feed/feed.tsx", "../src/components/ui/field/field.script.tsx", "../src/components/ui/form/control-protocol.ts", "../src/components/ui/form/form-context.ts", "../src/components/ui/field/field-context.ts", "../src/components/ui/field/field.tsx", "../src/components/ui/field/field-description.tsx", "../src/components/ui/field/field-error.tsx", "../src/components/ui/form/form.script.tsx", "../src/components/ui/form/resolvers.ts", "../src/components/ui/form/form-store.ts", "../src/components/ui/form/form.tsx", "../src/components/ui/grid/grid.script.tsx", "../src/components/ui/grid/grid.tsx", "../src/components/ui/input/input.tsx", "../src/components/ui/label/label.tsx", "../src/components/ui/listbox/listbox.script.tsx", "../src/components/ui/listbox/listbox.tsx", "../src/components/ui/menu-button/menu-button.script.tsx", "../src/components/ui/menu-button/menu-button.tsx", "../src/components/ui/menubar/menubar.script.tsx", "../src/components/ui/menubar/menubar.tsx", "../src/components/ui/meter/meter.script.tsx", "../src/components/ui/meter/meter.tsx", "../src/components/ui/navigation-menu/navigation-menu.script.tsx", "../src/lib/focusable-elements.ts", "../src/components/ui/navigation-menu/navigation-menu.tsx", "../src/components/ui/radio-group/radio-group.script.tsx", "../src/components/ui/radio-group/radio-group.tsx", "../src/components/ui/sidebar/sidebar.script.tsx", "../src/components/ui/sidebar/sidebar-trigger.script.tsx", "../src/components/ui/sidebar/sidebar.tsx", "../src/components/ui/slider/slider.script.tsx", "../src/components/ui/slider/slider.tsx", "../src/components/ui/spinbutton/spinbutton.script.tsx", "../src/components/ui/spinbutton/spinbutton.tsx", "../src/components/ui/switch/switch.script.tsx", "../src/components/ui/switch/switch.tsx", "../src/components/ui/tabs/tabs.script.tsx", "../src/components/ui/tabs/tabs.tsx", "../src/components/ui/textarea/textarea.tsx", "../src/components/ui/toast/toast.script.tsx", "../src/components/ui/toast/toast-context.ts", "../src/components/ui/toast/toast-state.ts", "../src/components/ui/toast/toaster.script.tsx", "../src/components/ui/toast/toast.tsx", "../src/components/ui/toast/toast-api.ts", "../src/components/ui/toolbar/toolbar.script.tsx", "../src/components/ui/toolbar/toolbar.tsx", "../src/components/ui/tooltip/tooltip.script.tsx", "../src/components/ui/tooltip/tooltip.tsx", "../src/components/ui/tree/tree.script.tsx", "../src/components/ui/tree/tree.tsx", "../src/components/ui/treegrid/treegrid.script.tsx", "../src/components/ui/treegrid/treegrid.tsx", "../src/components/ui/window-splitter/window-splitter.script.tsx", "../src/components/ui/window-splitter/window-splitter.tsx"],
|
|
4
|
+
"sourcesContent": ["import { RadiantElement, customElement, prop } from '@ecopages/radiant';\n\nexport type RuiAlertProps = {\n\t/** Visual tone of the alert. Default: `info`. */\n\tvariant?: 'info' | 'success' | 'warning' | 'error';\n};\n\n/**\n * `<rui-alert>` \u2014 a brief, important message that attracts attention\n * without interrupting the user's task.\n *\n * Implements the WAI-ARIA APG Alert pattern via `role=\"alert\"`. Dynamically\n * rendered alerts are announced by most screen readers. Do not move focus\n * into the alert; use an Alert Dialog when interrupting workflow is required.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/alert/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/\n *\n * Keyboard interaction: not applicable \u2014 alerts must not steal focus.\n *\n * @element rui-alert\n * @slot - The alert message content.\n */\n@customElement('rui-alert')\nexport class RuiAlert extends RadiantElement {\n\t@prop({ type: String, reflect: true, defaultValue: 'info' }) variant: RuiAlertProps['variant'];\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class={`rui-alert rui-alert--${this.variant ?? 'info'}`} role=\"alert\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\n\nconst RADIANT_VIEW_ELEMENT = Symbol.for('@ecopages/storybook-radiant.viewElement');\nconst RADIANT_SCRIPT_MODULE = Symbol.for('@ecopages/storybook-radiant.scriptModule');\nconst RADIANT_SCRIPT_EXPORT = Symbol.for('@ecopages/storybook-radiant.scriptExport');\n\nexport type RadiantViewComponent<TArgs = unknown> = ((args: TArgs) => JsxRenderable) & {\n\t[RADIANT_VIEW_ELEMENT]?: CustomElementConstructor;\n\t[RADIANT_SCRIPT_MODULE]?: string;\n\t[RADIANT_SCRIPT_EXPORT]?: string;\n};\n\nfunction linkViewToElement<TArgs>(\n\tview: RadiantViewComponent<TArgs>,\n\telement: CustomElementConstructor & {\n\t\t[RADIANT_SCRIPT_MODULE]?: string;\n\t\t[RADIANT_SCRIPT_EXPORT]?: string;\n\t},\n): void {\n\tview[RADIANT_VIEW_ELEMENT] = element;\n\n\tconst ssrModule = element[RADIANT_SCRIPT_MODULE];\n\tif (ssrModule) {\n\t\tview[RADIANT_SCRIPT_MODULE] = ssrModule;\n\t\tview[RADIANT_SCRIPT_EXPORT] = element[RADIANT_SCRIPT_EXPORT] ?? element.name;\n\t}\n}\n\n/** Link a JSX view export to its RadiantElement class (same symbols as the Storybook framework). */\nexport function defineRadiantView<TArgs>(\n\telement: CustomElementConstructor & {\n\t\t[RADIANT_SCRIPT_MODULE]?: string;\n\t\t[RADIANT_SCRIPT_EXPORT]?: string;\n\t},\n\trender: (args: TArgs) => JsxRenderable,\n): RadiantViewComponent<TArgs> {\n\tconst view = ((args: TArgs) => render(args)) as RadiantViewComponent<TArgs>;\n\tlinkViewToElement(view, element);\n\treturn view;\n}\n\n/** Re-copy SSR metadata from the linked element (e.g. after HMR). */\nexport function syncRadiantViewMetadata(view: RadiantViewComponent): void {\n\tconst element = view[RADIANT_VIEW_ELEMENT];\n\tif (element) {\n\t\tlinkViewToElement(view, element);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiAlertProps } from './alert.script';\nimport { RuiAlert as RuiAlertElement } from './alert.script';\nimport './alert.css';\n\nexport const RuiAlert = defineRadiantView(\n\tRuiAlertElement,\n\t({ slot, variant, children }: WithChildren<RuiAlertProps & RadiantSlotProps>) => (\n\t\t<rui-alert slot={slot} variant={variant}>\n\t\t\t{children}\n\t\t</rui-alert>\n\t),\n);\n", "import { RadiantElement, customElement, prop } from '@ecopages/radiant';\n\nexport type RuiBreadcrumbProps = {\n\t/** Accessible name for the navigation landmark. Default: `Breadcrumb`. */\n\tlabel?: string;\n\t/**\n\t * Glyph used by empty `RuiBreadcrumbSeparator` nodes (via CSS custom\n\t * property). Default: `/`. Override per-separator with children instead\n\t * of reaching for context.\n\t */\n\tseparator?: string;\n};\n\ntype RuiBreadcrumbBindings = {\n\tlabel: string;\n\tseparator: string;\n};\n\n/**\n * `<rui-breadcrumb>` \u2014 a trail of links to ancestor pages in hierarchical order.\n *\n * Implements the WAI-ARIA APG Breadcrumb pattern: a `<nav>` landmark containing\n * an ordered list of links, with `aria-current=\"page\"` on the current page item.\n *\n * Compose with the JSX helpers (`RuiBreadcrumbList`, `RuiBreadcrumbItem`,\n * `RuiBreadcrumbLink`, `RuiBreadcrumbPage`, `RuiBreadcrumbSeparator`,\n * `RuiBreadcrumbEllipsis`), or author equivalent light-DOM markup into the slot.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/\n *\n * Keyboard interaction: standard link navigation (`Tab`, `Enter`).\n *\n * @element rui-breadcrumb\n * @slot - Authored breadcrumb list markup.\n */\n@customElement('rui-breadcrumb')\nexport class RuiBreadcrumb extends RadiantElement<RuiBreadcrumbBindings> {\n\t@prop({ type: String, defaultValue: 'Breadcrumb' }) label: string;\n\t@prop({ type: String, defaultValue: '/' }) separator: string;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || 'Breadcrumb');\n\tprivate readonly separatorStyle = this.$.separator.map(\n\t\t(separator) =>\n\t\t\t({\n\t\t\t\t'--rui-breadcrumb-separator': JSON.stringify(separator || '/'),\n\t\t\t}) as Record<string, string>,\n\t);\n\n\toverride render() {\n\t\treturn (\n\t\t\t<nav class=\"rui-breadcrumb\" aria-label={this.resolvedAriaLabel} style={this.separatorStyle}>\n\t\t\t\t<slot></slot>\n\t\t\t</nav>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiBreadcrumbProps } from './breadcrumb.script';\nimport { RuiBreadcrumb as RuiBreadcrumbElement } from './breadcrumb.script';\nimport './breadcrumb.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiBreadcrumbViewProps = RuiBreadcrumbProps &\n\tRadiantSlotProps & {\n\t\tchildren?: JsxRenderable;\n\t\tclass?: string;\n\t};\n\n/**\n * Landmark wrapper for a breadcrumb trail. Set `separator` once here (e.g. `/`\n * or `>`); empty `RuiBreadcrumbSeparator` nodes pick it up via CSS \u2014 no context.\n * Pass children into a separator to override for that instance.\n */\nexport const RuiBreadcrumb = defineRadiantView(\n\tRuiBreadcrumbElement,\n\t({ slot, label, separator, class: className, children }: RuiBreadcrumbViewProps) => (\n\t\t<rui-breadcrumb slot={slot} class={className} label={label} separator={separator}>\n\t\t\t{children}\n\t\t</rui-breadcrumb>\n\t),\n);\n\nexport type RuiBreadcrumbListProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Ordered list of breadcrumb items and separators. */\nexport function RuiBreadcrumbList({ children, class: className }: RuiBreadcrumbListProps) {\n\treturn <ol class={cx('rui-breadcrumb__list', className)}>{children}</ol>;\n}\n\nexport type RuiBreadcrumbItemProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Single crumb (`<li>`). */\nexport function RuiBreadcrumbItem({ children, class: className }: RuiBreadcrumbItemProps) {\n\treturn <li class={cx('rui-breadcrumb__item', className)}>{children}</li>;\n}\n\nexport type RuiBreadcrumbLinkProps = {\n\thref: string;\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Accessible name when the link content is non-text (e.g. an icon). */\n\t'aria-label'?: string;\n};\n\n/** Linked ancestor page. */\nexport function RuiBreadcrumbLink({\n\thref,\n\tchildren,\n\tclass: className,\n\t'aria-label': ariaLabel,\n}: RuiBreadcrumbLinkProps) {\n\treturn (\n\t\t<a class={cx('rui-breadcrumb__link', className)} href={href} aria-label={ariaLabel}>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nexport type RuiBreadcrumbPageProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Current page (non-link). */\nexport function RuiBreadcrumbPage({ children, class: className }: RuiBreadcrumbPageProps) {\n\treturn (\n\t\t<span class={cx('rui-breadcrumb__page', className)} aria-current=\"page\">\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\nexport type RuiBreadcrumbSeparatorProps = {\n\t/** Override the trail separator for this instance only. */\n\tchildren?: JsxRenderable;\n\tclass?: string;\n};\n\n/**\n * Visual separator between crumbs. Renders as a presentational list item.\n * With no children, uses the glyph from `RuiBreadcrumb`\u2019s `separator` prop\n * (CSS custom property). With children, those replace the default glyph.\n */\nexport function RuiBreadcrumbSeparator({ children, class: className }: RuiBreadcrumbSeparatorProps) {\n\treturn (\n\t\t<li class={cx('rui-breadcrumb__separator', className)} role=\"presentation\" aria-hidden=\"true\">\n\t\t\t{children}\n\t\t</li>\n\t);\n}\n\nexport type RuiBreadcrumbEllipsisProps = {\n\tclass?: string;\n\t/** Accessible label announced for the collapsed segment. Default: `More`. */\n\tlabel?: string;\n};\n\n/** Collapsed middle segment indicator. */\nexport function RuiBreadcrumbEllipsis({ class: className, label = 'More' }: RuiBreadcrumbEllipsisProps) {\n\treturn (\n\t\t<span class={cx('rui-breadcrumb__ellipsis', className)} role=\"presentation\" aria-hidden=\"true\">\n\t\t\t<span aria-hidden=\"true\">\u2026</span>\n\t\t\t<span class=\"rui-breadcrumb__ellipsis-label\">{label}</span>\n\t\t</span>\n\t);\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\n\nexport type RuiButtonVariant = 'filled' | 'outline' | 'destructive' | 'ghost';\nexport type RuiButtonSize = 'sm' | 'md' | 'lg';\n\nexport type RuiButtonProps = RadiantSlotProps & {\n\t/** Visual style. Default: `filled`. */\n\tvariant?: RuiButtonVariant;\n\t/** Control size. Default: `md`. */\n\tsize?: RuiButtonSize;\n\t/** Native button type. Default: `button`. */\n\ttype?: 'button' | 'submit' | 'reset';\n\t/** Disabled state. */\n\tdisabled?: boolean;\n\t/** Controlled pressed state for toggle buttons (`aria-pressed`). */\n\tpressed?: boolean;\n\t/** Initial pressed state when `toggle` is used without a controlled `pressed` value. */\n\tdefaultPressed?: boolean;\n\t/** Toggle `aria-pressed` on click when `pressed` is not controlled. */\n\ttoggle?: boolean;\n\t/** Extra class names appended after the variant/size classes. */\n\tclass?: string;\n\t/** Accessible name when the button has no visible text. */\n\t'aria-label'?: string;\n\t'on:click'?: (event: Event) => void;\n\tchildren?: JsxRenderable;\n};\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nfunction resolveAriaPressed(\n\tpressed: boolean | undefined,\n\ttoggle: boolean,\n\tdefaultPressed: boolean,\n): boolean | undefined {\n\tif (pressed !== undefined) {\n\t\treturn pressed;\n\t}\n\n\tif (toggle) {\n\t\treturn defaultPressed;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Presentational wrapper around a native `<button>`.\n *\n * No custom element and no controller \u2014 only CSS variants/sizes. Follows the\n * APG Button pattern by staying on the native control for activation and focus.\n *\n * Styles ship via the radiant-ui base stylesheet (`rui-button` classes).\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/button/\n */\nexport function RuiButton({\n\tvariant = 'filled',\n\tsize = 'md',\n\ttype = 'button',\n\tdisabled,\n\tpressed,\n\tdefaultPressed = false,\n\ttoggle = false,\n\tclass: className,\n\tslot,\n\tchildren,\n\t'on:click': onClick,\n\t...rest\n}: RuiButtonProps) {\n\tconst handleClick = (event: Event) => {\n\t\tif (toggle && pressed === undefined) {\n\t\t\tconst button = event.currentTarget as HTMLButtonElement;\n\t\t\tconst next = button.getAttribute('aria-pressed') !== 'true';\n\t\t\tbutton.setAttribute('aria-pressed', String(next));\n\t\t}\n\n\t\tonClick?.(event);\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tslot={slot}\n\t\t\tclass={cx('rui-button', `rui-button--${variant}`, `rui-button--${size}`, className)}\n\t\t\tdisabled={disabled}\n\t\t\taria-pressed={resolveAriaPressed(pressed, toggle, defaultPressed)}\n\t\t\tdata-toggle={toggle && pressed === undefined ? '' : undefined}\n\t\t\ton:click={toggle || onClick ? handleClick : undefined}\n\t\t\t{...rest}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n", "import { RadiantElement, customElement, onEvent, onUpdated, prop } from '@ecopages/radiant';\n\nexport type RuiCarouselTransition = 'none' | 'slide' | 'fade';\n\n/** Where default prev/next chrome is laid out. `toolbar` places controls below the slide; `overlay` pins them to the slide edges. */\nexport type RuiCarouselControlsVariant = 'toolbar' | 'overlay';\n\nexport type RuiCarouselProps = {\n\tlabel?: string;\n\tindex?: number;\n\tautoplay?: boolean;\n\t/** Autoplay interval in milliseconds. */\n\tinterval?: number;\n\ttransition?: RuiCarouselTransition;\n\t/** Layout for built-in prev/next (and rotation) chrome. Default: toolbar below the slide. */\n\tcontrolsVariant?: RuiCarouselControlsVariant;\n\tshowIndicators?: boolean;\n\tshowRotationControl?: boolean;\n\tloop?: boolean;\n\t/** When true, prev/next wrap and controls stay enabled at the ends. Default: true. */\n\twrap?: boolean;\n\t/** Authored slide count for render-time control state before slot projection. */\n\tslideCount?: number;\n};\n\nconst SWIPE_THRESHOLD_PX = 48;\n\ntype RuiCarouselBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-carousel>` \u2014 sequentially displays one slide at a time.\n *\n * Implements the [APG Carousel pattern](https://www.w3.org/WAI/ARIA/apg/patterns/carousel/):\n * labeled `carousel` region, slide groups or tab panels, optional tabbed pickers,\n * rotation control when autoplay is enabled, and `aria-live` on the slide container.\n *\n * @element rui-carousel\n * @slot prev - Optional custom previous control. Use `data-carousel-action=\"prev\"`.\n * @slot next - Optional custom next control. Use `data-carousel-action=\"next\"`.\n * @slot rotation - Optional play/pause control when `show-rotation-control` is set. Use `data-carousel-action=\"rotation\"`.\n */\n@customElement('rui-carousel')\nexport class RuiCarousel extends RadiantElement<RuiCarouselBindings> {\n\t@prop({ type: String, defaultValue: 'Carousel' }) label: string;\n\t@prop({ type: Number, reflect: true, defaultValue: 0 }) index: number;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) autoplay: boolean;\n\t@prop({ type: Number, defaultValue: 4000 }) interval: number;\n\t@prop({ type: String, defaultValue: 'none' }) transition: RuiCarouselTransition;\n\t@prop({ type: String, defaultValue: 'toolbar', attribute: 'controls-variant' })\n\tcontrolsVariant: RuiCarouselControlsVariant;\n\t@prop({ type: Boolean, defaultValue: false }) showIndicators: boolean;\n\t@prop({ type: Boolean, defaultValue: false }) showRotationControl: boolean;\n\t@prop({ type: Boolean, defaultValue: true }) loop: boolean;\n\t@prop({ type: Boolean, defaultValue: true }) wrap: boolean;\n\t@prop({ type: Number, defaultValue: 0 }) slideCount: number;\n\n\tprivate timer: ReturnType<typeof setInterval> | null = null;\n\tprivate paused = false;\n\t/** User explicitly resumed rotation (e.g. via rotation control) despite reduced motion. */\n\tprivate userOverrideReducedMotion = false;\n\tprivate swipePointerId: number | null = null;\n\tprivate swipeStartX = 0;\n\tprivate swipeStartY = 0;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tif (this.autoplay && this.prefersReducedMotion()) {\n\t\t\t\tthis.paused = true;\n\t\t\t}\n\t\t\tthis.sync();\n\t\t\tthis.syncAutoplay();\n\t\t\tthis.syncIndicators();\n\t\t\tthis.syncAriaLive();\n\t\t});\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.stop();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t@onUpdated(['index', 'transition', 'loop', 'wrap', 'controlsVariant'])\n\tonSlideStateUpdated(): void {\n\t\tthis.sync();\n\t\tthis.syncIndicators();\n\t\tthis.syncAutoplay();\n\t}\n\n\t@onUpdated(['autoplay', 'showRotationControl', 'interval'])\n\tonAutoplayUpdated(): void {\n\t\tthis.syncAutoplay();\n\t\tthis.syncRotationControl();\n\t}\n\n\t@onUpdated(['showIndicators'])\n\tonIndicatorsUpdated(): void {\n\t\tthis.syncIndicators();\n\t}\n\n\tprivate prefersReducedMotion(): boolean {\n\t\treturn (\n\t\t\ttypeof window !== 'undefined' &&\n\t\t\ttypeof window.matchMedia === 'function' &&\n\t\t\twindow.matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\t);\n\t}\n\n\tprivate getCarouselId(): string {\n\t\treturn this.id || 'rui-carousel';\n\t}\n\n\tprivate slidePanelId(slide: HTMLElement, index: number): string {\n\t\tconst key = slide.getAttribute('data-slide') ?? String(index);\n\t\tconst panelId = `${this.getCarouselId()}-panel-${key}`;\n\t\tslide.id = panelId;\n\t\treturn panelId;\n\t}\n\n\tprivate tabId(index: number): string {\n\t\treturn `${this.getCarouselId()}-tab-${index}`;\n\t}\n\n\tprivate shouldShowRotationControl(): boolean {\n\t\treturn this.autoplay || this.showRotationControl;\n\t}\n\n\tprivate syncSlideAccessibility(slides: HTMLElement[], activeIndex: number): void {\n\t\tconst count = slides.length;\n\n\t\tslides.forEach((slide, i) => {\n\t\t\tconst active = i === activeIndex;\n\t\t\tconst positionLabel = `${i + 1} of ${count}`;\n\n\t\t\tif (this.showIndicators) {\n\t\t\t\tthis.slidePanelId(slide, i);\n\t\t\t\tslide.setAttribute('role', 'tabpanel');\n\t\t\t\tslide.setAttribute('aria-labelledby', this.tabId(i));\n\t\t\t\tslide.setAttribute('aria-label', positionLabel);\n\t\t\t\tslide.removeAttribute('aria-roledescription');\n\t\t\t} else {\n\t\t\t\tslide.setAttribute('role', 'group');\n\t\t\t\tslide.setAttribute('aria-roledescription', 'slide');\n\t\t\t\tslide.setAttribute('aria-label', positionLabel);\n\t\t\t\tslide.removeAttribute('aria-labelledby');\n\t\t\t\tslide.removeAttribute('tabindex');\n\t\t\t}\n\n\t\t\tif (this.transition === 'none') {\n\t\t\t\tslide.hidden = !active;\n\t\t\t} else {\n\t\t\t\tslide.hidden = false;\n\t\t\t}\n\n\t\t\tslide.setAttribute('aria-hidden', String(!active));\n\t\t\tslide.setAttribute('data-active', active ? 'true' : 'false');\n\t\t});\n\t}\n\n\tprivate getSlides(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[data-slide]'));\n\t}\n\n\tprivate get shouldWrap(): boolean {\n\t\treturn this.wrap && this.loop;\n\t}\n\n\tprivate normalizeIndex(raw: number, count: number): number {\n\t\tif (count <= 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (!this.shouldWrap) {\n\t\t\treturn Math.min(Math.max(raw, 0), count - 1);\n\t\t}\n\n\t\treturn ((raw % count) + count) % count;\n\t}\n\n\tprivate sync(): void {\n\t\tconst slides = this.getSlides();\n\t\tif (!slides.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalized = this.normalizeIndex(this.index, slides.length);\n\t\tif (normalized !== this.index) {\n\t\t\tthis.index = normalized;\n\t\t}\n\n\t\tconst track = this.querySelector<HTMLElement>('.rui-carousel__track');\n\t\tif (track && this.transition === 'slide') {\n\t\t\ttrack.style.setProperty('--rui-carousel-index', String(normalized));\n\t\t}\n\n\t\tthis.syncSlideAccessibility(slides, normalized);\n\n\t\tthis.syncPrevNextDisabled(slides.length, normalized);\n\t}\n\n\tprivate syncPrevNextDisabled(count: number, normalized: number): void {\n\t\tconst disablePrev = !this.shouldWrap && count > 0 && normalized <= 0;\n\t\tconst disableNext = !this.shouldWrap && count > 0 && normalized >= count - 1;\n\n\t\tfor (const button of this.querySelectorAll<HTMLButtonElement>('[data-carousel-action=\"prev\"]')) {\n\t\t\tif (this.shouldWrap) {\n\t\t\t\tbutton.removeAttribute('disabled');\n\t\t\t} else {\n\t\t\t\tbutton.disabled = disablePrev;\n\t\t\t}\n\t\t}\n\n\t\tfor (const button of this.querySelectorAll<HTMLButtonElement>('[data-carousel-action=\"next\"]')) {\n\t\t\tif (this.shouldWrap) {\n\t\t\t\tbutton.removeAttribute('disabled');\n\t\t\t} else {\n\t\t\t\tbutton.disabled = disableNext;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate syncIndicators(): void {\n\t\tconst container = this.querySelector<HTMLElement>('[data-ref=\"indicators\"]');\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst slides = this.getSlides();\n\t\tconst normalized = this.normalizeIndex(this.index, slides.length);\n\t\tconst existing = Array.from(container.querySelectorAll<HTMLButtonElement>('[data-carousel-indicator]'));\n\n\t\tif (existing.length !== slides.length) {\n\t\t\tcontainer.replaceChildren(\n\t\t\t\t...slides.map((slide, i) => {\n\t\t\t\t\tconst button = document.createElement('button');\n\t\t\t\t\tbutton.type = 'button';\n\t\t\t\t\tbutton.className = 'rui-carousel__indicator';\n\t\t\t\t\tbutton.id = this.tabId(i);\n\t\t\t\t\tbutton.setAttribute('role', 'tab');\n\t\t\t\t\tbutton.setAttribute('data-carousel-indicator', String(i));\n\t\t\t\t\tbutton.setAttribute('aria-controls', this.slidePanelId(slide, i));\n\t\t\t\t\tbutton.setAttribute('aria-label', `Slide ${i + 1}`);\n\t\t\t\t\treturn button;\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst indicators = Array.from(container.querySelectorAll<HTMLButtonElement>('[data-carousel-indicator]'));\n\t\tindicators.forEach((indicator, i) => {\n\t\t\tconst selected = i === normalized;\n\t\t\tconst slide = slides[i];\n\t\t\tif (slide) {\n\t\t\t\tindicator.id = this.tabId(i);\n\t\t\t\tindicator.setAttribute('aria-controls', this.slidePanelId(slide, i));\n\t\t\t}\n\t\t\tindicator.setAttribute('aria-selected', String(selected));\n\t\t\tindicator.tabIndex = selected ? 0 : -1;\n\t\t});\n\t}\n\n\tprivate syncRotationControl(): void {\n\t\tfor (const toggle of this.querySelectorAll<HTMLButtonElement>('[data-carousel-action=\"rotation\"]')) {\n\t\t\tconst playing = this.autoplay && !this.paused;\n\t\t\ttoggle.setAttribute('aria-pressed', String(playing));\n\t\t\ttoggle.setAttribute('aria-label', playing ? 'Pause rotation' : 'Start rotation');\n\t\t}\n\t}\n\n\tprivate syncAriaLive(): void {\n\t\tconst viewport = this.querySelector<HTMLElement>('[data-ref=\"viewport\"]');\n\t\tif (!viewport) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rotating = this.autoplay && !this.paused && this.timer !== null;\n\t\tviewport.setAttribute('aria-live', rotating ? 'off' : 'polite');\n\t\tviewport.setAttribute('aria-atomic', 'false');\n\t}\n\n\tprivate canAutoplayRotate(): boolean {\n\t\tif (!this.autoplay || this.paused) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.prefersReducedMotion() && !this.userOverrideReducedMotion) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate syncAutoplay(): void {\n\t\tif (this.canAutoplayRotate()) {\n\t\t\tthis.start();\n\t\t} else {\n\t\t\tthis.stop();\n\t\t}\n\n\t\tthis.syncRotationControl();\n\t\tthis.syncAriaLive();\n\t}\n\n\tprivate start(): void {\n\t\tconst slides = this.getSlides();\n\t\tif (!slides.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.shouldWrap && this.index >= slides.length - 1) {\n\t\t\tthis.stop();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stop();\n\t\tconst ms = Math.max(0, this.interval);\n\t\tthis.timer = setInterval(() => {\n\t\t\tconst currentSlides = this.getSlides();\n\t\t\tif (!currentSlides.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.shouldWrap && this.index >= currentSlides.length - 1) {\n\t\t\t\tthis.stop();\n\t\t\t\tthis.syncAriaLive();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.goTo(this.index + 1);\n\t\t}, ms);\n\t\tthis.syncAriaLive();\n\t}\n\n\tprivate stop(): void {\n\t\tif (this.timer) {\n\t\t\tclearInterval(this.timer);\n\t\t}\n\n\t\tthis.timer = null;\n\t\tthis.syncAriaLive();\n\t}\n\n\tprivate goTo(next: number): void {\n\t\tconst slides = this.getSlides();\n\t\tif (!slides.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.index = this.normalizeIndex(next, slides.length);\n\t\tthis.sync();\n\t\tthis.syncIndicators();\n\t}\n\n\tprivate userNavigate(delta: number): void {\n\t\tthis.paused = true;\n\t\tthis.stop();\n\t\tthis.goTo(this.index + delta);\n\t}\n\n\tprivate isSwipeExcludedTarget(target: EventTarget | null): boolean {\n\t\tif (!(target instanceof Element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn Boolean(\n\t\t\ttarget.closest('button, a, input, textarea, select, [data-carousel-indicator], [data-carousel-action]'),\n\t\t);\n\t}\n\n\t@onEvent({ selector: '[data-carousel-action=\"prev\"]', type: 'click' })\n\tprev(): void {\n\t\tthis.userNavigate(-1);\n\t}\n\n\t@onEvent({ selector: '[data-carousel-action=\"next\"]', type: 'click' })\n\tnext(): void {\n\t\tthis.userNavigate(1);\n\t}\n\n\t@onEvent({ selector: '[data-carousel-action=\"rotation\"]', type: 'click' })\n\ttoggleRotation(): void {\n\t\tif (!this.autoplay) {\n\t\t\tthis.autoplay = true;\n\t\t\tthis.paused = false;\n\t\t\tthis.userOverrideReducedMotion = true;\n\t\t} else {\n\t\t\tthis.paused = !this.paused;\n\t\t\tif (!this.paused) {\n\t\t\t\tthis.userOverrideReducedMotion = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.syncAutoplay();\n\t}\n\n\t@onEvent({ selector: '[data-carousel-indicator]', type: 'click' })\n\tonIndicatorClick(event: Event): void {\n\t\tconst button = (event.target as HTMLElement).closest<HTMLButtonElement>('[data-carousel-indicator]');\n\t\tif (!button) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst indicatorIndex = Number(button.getAttribute('data-carousel-indicator'));\n\t\tif (!Number.isFinite(indicatorIndex)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.paused = true;\n\t\tthis.stop();\n\t\tthis.goTo(indicatorIndex);\n\t\tbutton.focus();\n\t}\n\n\t@onEvent({ selector: '[data-carousel-indicator]', type: 'keydown' })\n\tonIndicatorKeydown(event: KeyboardEvent): void {\n\t\tconst slides = this.getSlides();\n\t\tif (!slides.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = (event.target as HTMLElement).closest<HTMLButtonElement>('[data-carousel-indicator]');\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextIndex = Number(current.getAttribute('data-carousel-indicator'));\n\t\tif (!Number.isFinite(nextIndex)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowRight') {\n\t\t\tnextIndex = this.normalizeIndex(nextIndex + 1, slides.length);\n\t\t} else if (event.key === 'ArrowLeft') {\n\t\t\tnextIndex = this.normalizeIndex(nextIndex - 1, slides.length);\n\t\t} else if (event.key === 'Home') {\n\t\t\tnextIndex = 0;\n\t\t} else if (event.key === 'End') {\n\t\t\tnextIndex = slides.length - 1;\n\t\t} else if (event.key === ' ' || event.key === 'Enter') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.paused = true;\n\t\t\tthis.stop();\n\t\t\tthis.goTo(nextIndex);\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.paused = true;\n\t\tthis.stop();\n\t\tthis.goTo(nextIndex);\n\n\t\tconst indicators = Array.from(\n\t\t\tthis.querySelectorAll<HTMLButtonElement>('[data-ref=\"indicators\"] [data-carousel-indicator]'),\n\t\t);\n\t\tindicators[nextIndex]?.focus();\n\t}\n\n\t@onEvent({ ref: 'root', type: 'pointerenter' })\n\tonRootPointerEnter(event: PointerEvent): void {\n\t\tif (this.autoplay && event.pointerType === 'mouse') {\n\t\t\tthis.stop();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'root', type: 'pointerleave' })\n\tonRootPointerLeave(event: PointerEvent): void {\n\t\tif (this.autoplay && !this.paused && event.pointerType === 'mouse') {\n\t\t\tthis.syncAutoplay();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'root', type: 'focusin' })\n\tonRootFocusIn(): void {\n\t\tif (this.autoplay) {\n\t\t\tthis.stop();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'root', type: 'focusout' })\n\tonRootFocusOut(event: FocusEvent): void {\n\t\tconst next = event.relatedTarget as Node | null;\n\t\tif (next && this.contains(next)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.autoplay && !this.paused) {\n\t\t\tthis.syncAutoplay();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'viewport', type: 'pointerdown' })\n\tonViewportPointerDown(event: PointerEvent): void {\n\t\tif (event.button !== 0 || this.isSwipeExcludedTarget(event.target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.swipePointerId = event.pointerId;\n\t\tthis.swipeStartX = event.clientX;\n\t\tthis.swipeStartY = event.clientY;\n\t}\n\n\t@onEvent({ ref: 'viewport', type: 'pointermove' })\n\tonViewportPointerMove(event: PointerEvent): void {\n\t\tif (this.swipePointerId !== event.pointerId) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'viewport', type: 'pointerup' })\n\tonViewportPointerUp(event: PointerEvent): void {\n\t\tif (this.swipePointerId !== event.pointerId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dx = event.clientX - this.swipeStartX;\n\t\tconst dy = event.clientY - this.swipeStartY;\n\t\tthis.swipePointerId = null;\n\n\t\tif (Math.abs(dx) < SWIPE_THRESHOLD_PX || Math.abs(dx) <= Math.abs(dy)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (dx < 0) {\n\t\t\tthis.next();\n\t\t} else {\n\t\t\tthis.prev();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'viewport', type: 'pointercancel' })\n\tonViewportPointerCancel(event: PointerEvent): void {\n\t\tif (this.swipePointerId === event.pointerId) {\n\t\t\tthis.swipePointerId = null;\n\t\t}\n\t}\n\n\t/**\n\t * Only `aria-label` is bound below. Everything else in this render() stays\n\t * a plain read \u2014 audited, not an outstanding gap:\n\t * - disablePrev/disableNext must apply uniformly to the default button AND\n\t * any consumer-supplied `[data-carousel-action=\"prev\"/\"next\"]` element\n\t * slotted in (see syncPrevNextDisabled()) \u2014 a binding only patches this\n\t * host's own template position, not a slotted replacement.\n\t * - playing/ariaLive derive from `paused` and the live `timer` handle,\n\t * plain instance fields mutated across pointer/focus/keyboard handlers\n\t * and `setInterval`, not reactive members \u2014 promoting them would add an\n\t * explicit notify step at every one of those call sites for no behavior\n\t * change and real drift risk.\n\t * - the indicator buttons are a variable-length list built with\n\t * `replaceChildren()` (see syncIndicators()) \u2014 bindings patch one value\n\t * at one position, they don't reconcile a dynamic list.\n\t */\n\toverride render() {\n\t\tconst showRotation = this.shouldShowRotationControl();\n\t\tconst slideCount = Math.max(this.getSlides().length, this.slideCount);\n\t\tconst normalized = this.normalizeIndex(this.index, slideCount || 1);\n\t\tconst disablePrev = !this.shouldWrap && slideCount > 0 && normalized <= 0;\n\t\tconst disableNext = !this.shouldWrap && slideCount > 0 && normalized >= slideCount - 1;\n\t\tconst playing = this.autoplay && !this.paused;\n\t\tconst ariaLive = playing && this.timer !== null ? 'off' : 'polite';\n\t\tconst overlay = this.controlsVariant === 'overlay';\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.sync();\n\t\t\tthis.syncIndicators();\n\t\t\tthis.syncRotationControl();\n\t\t\tthis.syncAriaLive();\n\t\t});\n\n\t\tconst prevControl = (\n\t\t\t<slot name=\"prev\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdata-carousel-action=\"prev\"\n\t\t\t\t\tdata-ref=\"prev\"\n\t\t\t\t\tclass={`rui-carousel__nav rui-button rui-button--outline rui-button--sm${overlay ? ' rui-carousel__nav--overlay' : ' rui-carousel__nav--toolbar'}`}\n\t\t\t\t\taria-label=\"Previous slide\"\n\t\t\t\t\tdisabled={disablePrev}\n\t\t\t\t>\n\t\t\t\t\t{overlay ? (\n\t\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\u2039\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span class=\"rui-carousel__nav-label\">\n\t\t\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\u2039\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\tPrevious\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</slot>\n\t\t);\n\n\t\tconst nextControl = (\n\t\t\t<slot name=\"next\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdata-carousel-action=\"next\"\n\t\t\t\t\tdata-ref=\"next\"\n\t\t\t\t\tclass={`rui-carousel__nav rui-button rui-button--outline rui-button--sm${overlay ? ' rui-carousel__nav--overlay' : ' rui-carousel__nav--toolbar'}`}\n\t\t\t\t\taria-label=\"Next slide\"\n\t\t\t\t\tdisabled={disableNext}\n\t\t\t\t>\n\t\t\t\t\t{overlay ? (\n\t\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\u203A\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span class=\"rui-carousel__nav-label\">\n\t\t\t\t\t\t\tNext\n\t\t\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\u203A\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</slot>\n\t\t);\n\n\t\tconst rotationControl = showRotation ? (\n\t\t\t<slot name=\"rotation\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdata-carousel-action=\"rotation\"\n\t\t\t\t\tdata-ref=\"rotation\"\n\t\t\t\t\tclass={`rui-carousel__rotation rui-button rui-button--ghost rui-button--sm${overlay ? ' rui-carousel__rotation--overlay' : ''}`}\n\t\t\t\t\taria-pressed={playing}\n\t\t\t\t\taria-label={playing ? 'Pause rotation' : 'Start rotation'}\n\t\t\t\t>\n\t\t\t\t\t{playing ? 'Pause' : 'Play'}\n\t\t\t\t</button>\n\t\t\t</slot>\n\t\t) : null;\n\n\t\tconst indicators = this.showIndicators ? (\n\t\t\t<div\n\t\t\t\tclass={`rui-carousel__indicators${overlay ? ' rui-carousel__indicators--overlay' : ''}`}\n\t\t\t\tdata-ref=\"indicators\"\n\t\t\t\trole=\"tablist\"\n\t\t\t\taria-label=\"Choose slide to display\"\n\t\t\t/>\n\t\t) : null;\n\n\t\tconst toolbarControls = (\n\t\t\t<div class=\"rui-carousel__toolbar\">\n\t\t\t\t{showRotation ? <div class=\"rui-carousel__toolbar-rotation\">{rotationControl}</div> : null}\n\t\t\t\t<div class=\"rui-carousel__toolbar-side rui-carousel__toolbar-side--start\">{prevControl}</div>\n\t\t\t\t<div class=\"rui-carousel__toolbar-center\">{indicators}</div>\n\t\t\t\t<div class=\"rui-carousel__toolbar-side rui-carousel__toolbar-side--end\">{nextControl}</div>\n\t\t\t</div>\n\t\t);\n\n\t\tconst overlayChrome = overlay ? (\n\t\t\t<div class=\"rui-carousel__overlay-chrome\">\n\t\t\t\t{showRotation ? <div class=\"rui-carousel__overlay-rotation\">{rotationControl}</div> : null}\n\t\t\t\t<div class=\"rui-carousel__controls rui-carousel__controls--overlay\">\n\t\t\t\t\t{prevControl}\n\t\t\t\t\t{nextControl}\n\t\t\t\t</div>\n\t\t\t\t{indicators}\n\t\t\t</div>\n\t\t) : null;\n\n\t\treturn (\n\t\t\t<section\n\t\t\t\tclass={`rui-carousel rui-carousel--${this.transition} rui-carousel--controls-${this.controlsVariant}`}\n\t\t\t\tdata-ref=\"root\"\n\t\t\t\taria-roledescription=\"carousel\"\n\t\t\t\taria-label={this.$.label}\n\t\t\t>\n\t\t\t\t<div class=\"rui-carousel__stage\">\n\t\t\t\t\t<div class=\"rui-carousel__viewport\" data-ref=\"viewport\" aria-live={ariaLive} aria-atomic={false}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rui-carousel__track\"\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tthis.transition === 'slide' ? { '--rui-carousel-index': String(this.index) } : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{overlayChrome}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{!overlay ? <div class=\"rui-carousel__footer\">{toolbarControls}</div> : null}\n\t\t\t</section>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps, WithChildren } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiCarouselProps } from './carousel.script';\nimport { RuiCarousel as RuiCarouselElement } from './carousel.script';\nimport './carousel.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiCarouselSlideData = { id: string; children: JsxRenderable };\n\nexport type RuiCarouselSlideProps = {\n\tid: string;\n\tindex?: number;\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Slide in the default carousel slot (APG `group` / `tabpanel` roles are applied by the host). */\nexport function RuiCarouselSlide({ id, children, class: className }: RuiCarouselSlideProps) {\n\treturn (\n\t\t<div class={cx('rui-carousel__slide', className)} data-slide={id}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiCarouselControlProps = RadiantSlotProps & {\n\tchildren?: JsxRenderable;\n\tclass?: string;\n\tdisabled?: boolean;\n\t/** Match `controls-variant=\"overlay\"` on the carousel for circular on-slide chrome. */\n\toverlay?: boolean;\n};\n\nfunction toolbarPrevLabel() {\n\treturn (\n\t\t<span class=\"rui-carousel__nav-label\">\n\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\u2039\n\t\t\t</span>\n\t\t\tPrevious\n\t\t</span>\n\t);\n}\n\nfunction toolbarNextLabel() {\n\treturn (\n\t\t<span class=\"rui-carousel__nav-label\">\n\t\t\tNext\n\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\u203A\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\n/** Previous control slotted into `prev` by default. */\nexport function RuiCarouselPrev({\n\tslot = 'prev',\n\tchildren,\n\tclass: className,\n\tdisabled,\n\toverlay,\n}: RuiCarouselControlProps) {\n\treturn (\n\t\t<button\n\t\t\tslot={slot}\n\t\t\ttype=\"button\"\n\t\t\tdata-carousel-action=\"prev\"\n\t\t\tdata-ref=\"prev\"\n\t\t\tclass={cx(\n\t\t\t\t'rui-carousel__nav rui-button rui-button--outline rui-button--sm',\n\t\t\t\toverlay ? 'rui-carousel__nav--overlay' : 'rui-carousel__nav--toolbar',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-label=\"Previous slide\"\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{children ??\n\t\t\t\t(overlay ? (\n\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\u2039\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\ttoolbarPrevLabel()\n\t\t\t\t))}\n\t\t</button>\n\t);\n}\n\n/** Next control slotted into `next` by default. */\nexport function RuiCarouselNext({\n\tslot = 'next',\n\tchildren,\n\tclass: className,\n\tdisabled,\n\toverlay,\n}: RuiCarouselControlProps) {\n\treturn (\n\t\t<button\n\t\t\tslot={slot}\n\t\t\ttype=\"button\"\n\t\t\tdata-carousel-action=\"next\"\n\t\t\tdata-ref=\"next\"\n\t\t\tclass={cx(\n\t\t\t\t'rui-carousel__nav rui-button rui-button--outline rui-button--sm',\n\t\t\t\toverlay ? 'rui-carousel__nav--overlay' : 'rui-carousel__nav--toolbar',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-label=\"Next slide\"\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{children ??\n\t\t\t\t(overlay ? (\n\t\t\t\t\t<span class=\"rui-carousel__nav-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\u203A\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\ttoolbarNextLabel()\n\t\t\t\t))}\n\t\t</button>\n\t);\n}\n\nexport type RuiCarouselRotationProps = RadiantSlotProps & {\n\tchildren?: JsxRenderable;\n\tclass?: string;\n\toverlay?: boolean;\n};\n\n/** Play/pause rotation control slotted into `rotation` by default. */\nexport function RuiCarouselRotation({\n\tslot = 'rotation',\n\tchildren,\n\tclass: className,\n\toverlay,\n}: RuiCarouselRotationProps) {\n\treturn (\n\t\t<button\n\t\t\tslot={slot}\n\t\t\ttype=\"button\"\n\t\t\tdata-carousel-action=\"rotation\"\n\t\t\tdata-ref=\"rotation\"\n\t\t\tclass={cx(\n\t\t\t\t'rui-carousel__rotation rui-button rui-button--ghost rui-button--sm',\n\t\t\t\toverlay && 'rui-carousel__rotation--overlay',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-pressed={false}\n\t\t\taria-label=\"Start rotation\"\n\t\t>\n\t\t\t{children ?? 'Play'}\n\t\t</button>\n\t);\n}\n\nexport const RuiCarousel = defineRadiantView(\n\tRuiCarouselElement,\n\t({\n\t\tslot,\n\t\tlabel,\n\t\tindex,\n\t\tautoplay,\n\t\tinterval,\n\t\ttransition,\n\t\tcontrolsVariant,\n\t\tshowIndicators,\n\t\tshowRotationControl,\n\t\tloop,\n\t\twrap,\n\t\tslides,\n\t\tchildren,\n\t}: RuiCarouselProps &\n\t\tRadiantSlotProps &\n\t\tWithChildren<{\n\t\t\tslides?: RuiCarouselSlideData[];\n\t\t}>) => {\n\t\tif (children != null) {\n\t\t\treturn (\n\t\t\t\t<rui-carousel\n\t\t\t\t\tslot={slot}\n\t\t\t\t\tlabel={label}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tautoplay={autoplay}\n\t\t\t\t\tinterval={interval}\n\t\t\t\t\ttransition={transition}\n\t\t\t\t\tcontrolsVariant={controlsVariant}\n\t\t\t\t\tshowIndicators={showIndicators}\n\t\t\t\t\tshowRotationControl={showRotationControl}\n\t\t\t\t\tloop={loop}\n\t\t\t\t\twrap={wrap}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</rui-carousel>\n\t\t\t);\n\t\t}\n\n\t\tconst slideList = slides ?? [];\n\n\t\treturn (\n\t\t\t<rui-carousel\n\t\t\t\tslot={slot}\n\t\t\t\tlabel={label}\n\t\t\t\tindex={index}\n\t\t\t\tautoplay={autoplay}\n\t\t\t\tinterval={interval}\n\t\t\t\ttransition={transition}\n\t\t\t\tcontrolsVariant={controlsVariant}\n\t\t\t\tshowIndicators={showIndicators}\n\t\t\t\tshowRotationControl={showRotationControl}\n\t\t\t\tloop={loop}\n\t\t\t\twrap={wrap}\n\t\t\t\tslideCount={slideList.length}\n\t\t\t>\n\t\t\t\t{slideList.map((slide) => (\n\t\t\t\t\t<RuiCarouselSlide id={slide.id}>{slide.children}</RuiCarouselSlide>\n\t\t\t\t))}\n\t\t\t</rui-carousel>\n\t\t);\n\t},\n);\n", "import { RadiantElement, customElement, event, onEvent, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiCheckboxProps = {\n\t/** Whether the checkbox is checked. Default: `false`. */\n\tchecked?: boolean;\n\t/**\n\t * Partially checked (mixed) state for group controllers.\n\t * When `true`, the native input's `indeterminate` IDL is set and\n\t * `aria-checked=\"mixed\"` is exposed. Default: `false`.\n\t */\n\tindeterminate?: boolean;\n\t/** Disable the checkbox. Default: `false`. */\n\tdisabled?: boolean;\n\t/** Value submitted with forms when checked. */\n\tvalue?: string;\n\t/** Associates the control with a form field name. */\n\tname?: string;\n};\n\nexport type RuiCheckboxChangeDetail = {\n\tchecked: boolean;\n\tindeterminate: boolean;\n};\n\ntype RuiCheckboxBindings = {\n\tchecked: boolean;\n\tindeterminate: boolean;\n\tdisabled: boolean;\n\tvalue: string;\n\tname: string;\n};\n\n/**\n * `<rui-checkbox>` \u2014 a dual-state or tri-state checkbox.\n *\n * Implements the WAI-ARIA APG Checkbox pattern on a native\n * `<input type=\"checkbox\">`. Checked state uses the HTML `checked` attribute;\n * the mixed state uses the `indeterminate` IDL property with `aria-checked=\"mixed\"`.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/\n *\n * Keyboard interaction (native to the checkbox):\n * - `Space`: toggle checked state\n *\n * @element rui-checkbox\n * @slot - Visible label for the checkbox.\n * @fires rui-change - Emitted after the checked/indeterminate state changes.\n */\n@customElement('rui-checkbox')\nexport class RuiCheckbox extends RadiantElement<RuiCheckboxBindings> {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) checked: boolean;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) indeterminate: boolean;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: String, defaultValue: 'on' }) value: string;\n\t@prop({ type: String, defaultValue: '' }) name: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiCheckboxChangeDetail>;\n\n\tprivate readonly nameAttr = this.$.name.map((name) => name || undefined);\n\tprivate readonly resolvedAriaChecked = this.$.indeterminate.map((indeterminate) =>\n\t\tindeterminate ? 'mixed' : undefined,\n\t);\n\n\t@onEvent({ ref: 'input', type: 'change' })\n\tonInputChange(event: Event): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tthis.indeterminate = false;\n\t\tthis.checked = input.checked;\n\t\tthis.changeEvent.emit({ checked: this.checked, indeterminate: false });\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<label class=\"rui-checkbox\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tdata-ref=\"input\"\n\t\t\t\t\tdata-rui-control\n\t\t\t\t\tdata-rui-control-type=\"boolean\"\n\t\t\t\t\tclass=\"rui-checkbox__input\"\n\t\t\t\t\tprop:checked={this.$.checked}\n\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\tprop:value={this.$.value}\n\t\t\t\t\tname={this.nameAttr}\n\t\t\t\t\tprop:indeterminate={this.$.indeterminate}\n\t\t\t\t\taria-checked={this.resolvedAriaChecked}\n\t\t\t\t/>\n\t\t\t\t<span class=\"rui-checkbox__control\" aria-hidden=\"true\"></span>\n\t\t\t\t<span class=\"rui-checkbox__label\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiCheckboxProps } from './checkbox.script';\nimport { RuiCheckbox as RuiCheckboxElement } from './checkbox.script';\nimport './checkbox.css';\n\nexport const RuiCheckbox = defineRadiantView(\n\tRuiCheckboxElement,\n\t({\n\t\tslot,\n\t\tchecked,\n\t\tindeterminate,\n\t\tdisabled,\n\t\tvalue,\n\t\tname,\n\t\tchildren,\n\t}: WithChildren<RuiCheckboxProps & RadiantSlotProps>) => (\n\t\t<rui-checkbox\n\t\t\tslot={slot}\n\t\t\tchecked={checked}\n\t\t\tindeterminate={indeterminate}\n\t\t\tdisabled={disabled}\n\t\t\tvalue={value}\n\t\t\tname={name}\n\t\t>\n\t\t\t{children}\n\t\t</rui-checkbox>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiComboboxProps = {\n\tvalue?: string;\n\t/** Accessible name when there is no visible `RuiLabel` associated with the input. */\n\tlabel?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\t/**\n\t * When true, focusing the input opens the listbox (visual focus stays on the\n\t * input until ArrowDown / ArrowUp). Defaults to false \u2014 APG list autocomplete\n\t * opens on ArrowDown, typing, or the trigger button.\n\t */\n\topenOnFocus?: boolean;\n};\n\nexport type RuiComboboxChangeDetail = { value: string };\n\n/**\n * `<rui-combobox>` \u2014 a composition-first combobox with a listbox popup.\n *\n * Implements the APG Combobox pattern (list autocomplete, manual selection).\n * DOM focus stays on the combobox input; visual focus moves into the popup via\n * `aria-activedescendant` when the user presses ArrowDown / ArrowUp.\n *\n * Pair with `RuiLabel` (sibling, or via `RuiField`) for the visible name.\n * Compose with `data-combobox-input`, optional `data-combobox-trigger`,\n * `data-combobox-listbox`, and `data-combobox-option` (see view helpers).\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-list/\n * @element rui-combobox\n * @slot control - Input row (`RuiComboboxControl` with input and trigger).\n * @slot listbox - Popup listbox (`RuiComboboxListbox`).\n * @fires rui-change\n */\n@customElement('rui-combobox')\nexport class RuiCombobox extends RadiantElement {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: String, defaultValue: '' }) placeholder: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) openOnFocus: boolean;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiComboboxChangeDetail>;\n\n\tprivate open = false;\n\t/** True when visual focus is in the listbox (aria-activedescendant is set). */\n\tprivate listboxHasVisualFocus = false;\n\tprivate activeIndex = -1;\n\tprivate skipNextFocusOpen = false;\n\tprivate readonly uid = Math.random().toString(36).slice(2, 9);\n\n\tprivate get listboxId(): string {\n\t\treturn `rui-combobox-list-${this.uid}`;\n\t}\n\n\tprivate get inputId(): string {\n\t\treturn `rui-combobox-input-${this.uid}`;\n\t}\n\n\tprivate getInput(): HTMLInputElement | null {\n\t\treturn this.querySelector<HTMLInputElement>('[data-combobox-input]');\n\t}\n\n\tprivate getTrigger(): HTMLButtonElement | null {\n\t\treturn this.querySelector<HTMLButtonElement>('[data-combobox-trigger]');\n\t}\n\n\tprivate getListbox(): HTMLElement | null {\n\t\treturn this.querySelector<HTMLElement>('[data-combobox-listbox]');\n\t}\n\n\tprivate getOptions(): HTMLElement[] {\n\t\tconst listbox = this.getListbox();\n\t\tif (!listbox) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn Array.from(listbox.querySelectorAll<HTMLElement>('[data-combobox-option]'));\n\t}\n\n\tprivate getVisibleOptions(): HTMLElement[] {\n\t\treturn this.getOptions().filter((option) => !option.hidden && option.getAttribute('aria-disabled') !== 'true');\n\t}\n\n\tprivate getOptionLabel(option: HTMLElement): string {\n\t\treturn option.getAttribute('data-label') || option.textContent?.trim() || '';\n\t}\n\n\tprivate ensureOptionIds(): void {\n\t\tthis.getOptions().forEach((option, index) => {\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `rui-combobox-option-${this.uid}-${index}`;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getAccessibleName(): string {\n\t\tconst labelElement = this.findAssociatedLabel();\n\t\treturn labelElement?.textContent?.trim() || this.label || 'Suggestions';\n\t}\n\n\tprivate isComboboxInput(target: EventTarget | null): target is HTMLInputElement {\n\t\treturn target instanceof HTMLInputElement && target.hasAttribute('data-combobox-input');\n\t}\n\n\t/** Prefer `RuiLabel` as a previous sibling or Field-managed label. */\n\tprivate findAssociatedLabel(): HTMLLabelElement | null {\n\t\tconst previous = this.previousElementSibling;\n\t\tif (previous instanceof HTMLLabelElement) {\n\t\t\treturn previous;\n\t\t}\n\n\t\tconst parent = this.parentElement;\n\t\tif (parent) {\n\t\t\tconst fieldLabel = parent.querySelector<HTMLLabelElement>('[data-rui-field-label], label.rui-label');\n\t\t\tif (fieldLabel) {\n\t\t\t\treturn fieldLabel;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate syncLabel(): void {\n\t\tconst input = this.getInput();\n\t\tif (!input) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (input.hasAttribute('data-rui-field-managed')) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst labelElement = this.findAssociatedLabel();\n\t\tif (labelElement) {\n\t\t\tif (!labelElement.id) {\n\t\t\t\tlabelElement.id = `rui-combobox-label-${this.uid}`;\n\t\t\t}\n\n\t\t\tif (!labelElement.htmlFor) {\n\t\t\t\tlabelElement.htmlFor = this.inputId;\n\t\t\t}\n\n\t\t\tinput.setAttribute('aria-labelledby', labelElement.id);\n\t\t\tinput.removeAttribute('aria-label');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.label) {\n\t\t\tinput.setAttribute('aria-label', this.label);\n\t\t\tinput.removeAttribute('aria-labelledby');\n\t\t\treturn;\n\t\t}\n\n\t\tinput.removeAttribute('aria-label');\n\t\tinput.removeAttribute('aria-labelledby');\n\t}\n\n\tprivate syncTrigger(): void {\n\t\tconst trigger = this.getTrigger();\n\t\tconst listbox = this.getListbox();\n\t\tif (!trigger || !listbox) {\n\t\t\treturn;\n\t\t}\n\n\t\ttrigger.setAttribute('aria-expanded', String(this.open));\n\t\ttrigger.setAttribute('aria-controls', listbox.id || this.listboxId);\n\t\ttrigger.tabIndex = -1;\n\n\t\tif (this.disabled) {\n\t\t\ttrigger.disabled = true;\n\t\t}\n\t}\n\n\tprivate syncInput(): void {\n\t\tconst input = this.getInput();\n\t\tconst listbox = this.getListbox();\n\t\tif (!input || !listbox) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!input.id) {\n\t\t\tinput.id = this.inputId;\n\t\t}\n\n\t\tif (!listbox.id) {\n\t\t\tlistbox.id = this.listboxId;\n\t\t}\n\n\t\tinput.setAttribute('role', 'combobox');\n\t\tinput.setAttribute('aria-haspopup', 'listbox');\n\t\tinput.setAttribute('aria-autocomplete', 'list');\n\t\tinput.setAttribute('aria-expanded', String(this.open));\n\t\tinput.setAttribute('aria-controls', this.listboxId);\n\t\tlistbox.setAttribute('role', 'listbox');\n\t\tlistbox.setAttribute('aria-label', this.getAccessibleName());\n\n\t\tif (this.placeholder && !input.placeholder) {\n\t\t\tinput.placeholder = this.placeholder;\n\t\t}\n\n\t\tif (this.disabled) {\n\t\t\tinput.disabled = true;\n\t\t}\n\n\t\tthis.syncTrigger();\n\t}\n\n\tprivate clearActiveOption(): void {\n\t\tthis.activeIndex = -1;\n\t\tthis.listboxHasVisualFocus = false;\n\n\t\tconst input = this.getInput();\n\t\tinput?.removeAttribute('aria-activedescendant');\n\n\t\tfor (const option of this.getOptions()) {\n\t\t\toption.removeAttribute('data-active');\n\t\t\toption.removeAttribute('aria-selected');\n\t\t}\n\t}\n\n\tprivate setActiveOption(index: number): void {\n\t\tconst visible = this.getVisibleOptions();\n\t\tif (index < 0 || index >= visible.length) {\n\t\t\tthis.clearActiveOption();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeIndex = index;\n\t\tthis.listboxHasVisualFocus = true;\n\n\t\tfor (const option of this.getOptions()) {\n\t\t\toption.removeAttribute('data-active');\n\t\t\toption.removeAttribute('aria-selected');\n\t\t}\n\n\t\tconst active = visible[index];\n\t\tconst input = this.getInput();\n\t\tif (!active || !input) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!active.id) {\n\t\t\tactive.id = `rui-combobox-option-${this.uid}-${index}`;\n\t\t}\n\n\t\tactive.setAttribute('data-active', 'true');\n\t\tactive.setAttribute('aria-selected', 'true');\n\t\tinput.setAttribute('aria-activedescendant', active.id);\n\t\tactive.scrollIntoView({ block: 'nearest' });\n\t}\n\n\tprivate setVisualFocusCombobox(): void {\n\t\tthis.clearActiveOption();\n\t}\n\n\tprivate setOpen(next: boolean, options: { activate?: 'first' | 'last' | 'none' } = {}): void {\n\t\tconst activate = options.activate ?? 'none';\n\t\tthis.open = next;\n\t\tconst input = this.getInput();\n\t\tconst listbox = this.getListbox();\n\t\tif (!input || !listbox) {\n\t\t\treturn;\n\t\t}\n\n\t\tinput.setAttribute('aria-expanded', String(next));\n\t\tlistbox.hidden = !next;\n\t\tthis.syncTrigger();\n\n\t\tif (!next) {\n\t\t\tthis.clearActiveOption();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ensureOptionIds();\n\n\t\tif (activate === 'first') {\n\t\t\tconst visible = this.getVisibleOptions();\n\t\t\tthis.setActiveOption(visible.length ? 0 : -1);\n\t\t\treturn;\n\t\t}\n\n\t\tif (activate === 'last') {\n\t\t\tconst visible = this.getVisibleOptions();\n\t\t\tthis.setActiveOption(visible.length ? visible.length - 1 : -1);\n\t\t\treturn;\n\t\t}\n\n\t\t// Manual selection: popup can open without moving visual focus into it.\n\t\tthis.clearActiveOption();\n\t}\n\n\tprivate filterOptions(query: string): void {\n\t\tconst q = query.trim().toLowerCase();\n\t\tfor (const option of this.getOptions()) {\n\t\t\tconst text = this.getOptionLabel(option).toLowerCase();\n\t\t\toption.hidden = q !== '' && !text.startsWith(q);\n\t\t}\n\t}\n\n\tprivate select(option: HTMLElement): void {\n\t\tif (option.getAttribute('aria-disabled') === 'true') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = option.getAttribute('data-value') || this.getOptionLabel(option);\n\t\tconst label = this.getOptionLabel(option) || value;\n\t\tthis.value = value;\n\n\t\tconst input = this.getInput();\n\t\tif (input) {\n\t\t\tinput.value = label;\n\t\t}\n\n\t\tthis.changeEvent.emit({ value });\n\t\tthis.skipNextFocusOpen = true;\n\t\tthis.setOpen(false);\n\t\tinput?.focus();\n\t}\n\n\tprivate syncFromValue(): void {\n\t\tconst input = this.getInput();\n\t\tif (!input) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst match = this.getOptions().find((option) => option.getAttribute('data-value') === this.value);\n\t\tconst label = match ? this.getOptionLabel(match) : this.value || '';\n\t\tinput.value = label;\n\t}\n\n\tprivate initialize(): void {\n\t\tthis.ensureOptionIds();\n\t\tthis.syncLabel();\n\t\tthis.syncInput();\n\t\tthis.syncFromValue();\n\t\tthis.setOpen(false);\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => this.initialize());\n\t}\n\n\t@onUpdated(['value', 'label', 'placeholder', 'disabled', 'openOnFocus'])\n\tonPropsUpdated(): void {\n\t\tthis.syncLabel();\n\t\tthis.syncInput();\n\t\tthis.syncFromValue();\n\t}\n\n\t@onEvent({ ref: 'root', type: 'focusin' })\n\tonRootFocusIn(event: FocusEvent): void {\n\t\tif (!this.isComboboxInput(event.target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.skipNextFocusOpen) {\n\t\t\tthis.skipNextFocusOpen = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.openOnFocus) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.filterOptions(this.getInput()?.value ?? '');\n\t\tthis.setOpen(true);\n\t\tthis.setVisualFocusCombobox();\n\t}\n\n\t@onEvent({ ref: 'root', type: 'input' })\n\tonRootInput(event: Event): void {\n\t\tif (!this.isComboboxInput(event.target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = event.target;\n\t\tthis.filterOptions(input.value);\n\t\tif (input.value.trim() !== '' && this.getVisibleOptions().length) {\n\t\t\tthis.setOpen(true);\n\t\t} else if (input.value.trim() === '' && this.openOnFocus) {\n\t\t\tthis.setOpen(true);\n\t\t} else if (input.value.trim() === '' || !this.getVisibleOptions().length) {\n\t\t\tthis.setOpen(false);\n\t\t}\n\n\t\t// Typing returns visual focus to the textbox.\n\t\tthis.setVisualFocusCombobox();\n\t}\n\n\t@onEvent({ ref: 'root', type: 'keydown', options: { capture: true } })\n\tonRootKeydown(event: KeyboardEvent): void {\n\t\tif (!this.isComboboxInput(event.target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleInputKeydown(event);\n\t}\n\n\t/** Filter, open, and move the active option by one step (wrapping) toward `direction`. */\n\tprivate moveActive(direction: 1 | -1): void {\n\t\tthis.filterOptions(this.getInput()?.value ?? '');\n\t\tif (!this.getVisibleOptions().length) {\n\t\t\t// Show all options when the current filter has no matches.\n\t\t\tthis.filterOptions('');\n\t\t}\n\t\tconst visible = this.getVisibleOptions();\n\t\tif (!visible.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\tthis.setOpen(true, { activate: direction === 1 ? 'first' : 'last' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.listboxHasVisualFocus) {\n\t\t\tconst next =\n\t\t\t\tdirection === 1\n\t\t\t\t\t? this.activeIndex >= visible.length - 1\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: this.activeIndex + 1\n\t\t\t\t\t: this.activeIndex <= 0\n\t\t\t\t\t\t? visible.length - 1\n\t\t\t\t\t\t: this.activeIndex - 1;\n\t\t\tthis.setActiveOption(next);\n\t\t\treturn;\n\t\t}\n\n\t\t// First arrow key while open: jump visual focus into the listbox.\n\t\tthis.setActiveOption(direction === 1 ? 0 : visible.length - 1);\n\t}\n\n\tprivate handleInputKeydown(event: KeyboardEvent): void {\n\t\tif (event.ctrlKey || event.shiftKey || event.metaKey) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst altKey = event.altKey;\n\n\t\tif (event.key === 'ArrowDown') {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (altKey) {\n\t\t\t\tif (!this.open) {\n\t\t\t\t\tthis.filterOptions(this.getInput()?.value ?? '');\n\t\t\t\t\tthis.setOpen(true);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.moveActive(1);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowUp') {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (altKey) {\n\t\t\t\tif (this.open) {\n\t\t\t\t\tthis.setOpen(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.moveActive(-1);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Home') {\n\t\t\tconst input = this.getInput();\n\t\t\tif (!input) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tinput.setSelectionRange(0, 0);\n\t\t\tthis.setVisualFocusCombobox();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'End') {\n\t\t\tconst input = this.getInput();\n\t\t\tif (!input) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tconst length = input.value.length;\n\t\t\tinput.setSelectionRange(length, length);\n\t\t\tthis.setVisualFocusCombobox();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tif (this.open) {\n\t\t\t\tthis.setOpen(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst input = this.getInput();\n\t\t\tif (input && input.value) {\n\t\t\t\tinput.value = '';\n\t\t\t\tthis.value = '';\n\t\t\t\tthis.changeEvent.emit({ value: '' });\n\t\t\t\tthis.filterOptions('');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Enter') {\n\t\t\tconst visible = this.getVisibleOptions();\n\t\t\tif (this.open && this.listboxHasVisualFocus && visible[this.activeIndex]) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.select(visible[this.activeIndex]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.open) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.setOpen(false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Tab' && this.open) {\n\t\t\tconst visible = this.getVisibleOptions();\n\t\t\tif (this.listboxHasVisualFocus && visible[this.activeIndex]) {\n\t\t\t\tthis.select(visible[this.activeIndex]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.setOpen(false);\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-combobox-trigger]', type: 'click' })\n\tonTriggerClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tconst input = this.getInput();\n\t\tif (!input || input.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.open) {\n\t\t\tthis.skipNextFocusOpen = true;\n\t\t\tthis.setOpen(false);\n\t\t} else {\n\t\t\tthis.filterOptions(input.value);\n\t\t\tthis.setOpen(true);\n\t\t\tthis.setVisualFocusCombobox();\n\t\t}\n\n\t\tinput.focus();\n\t}\n\n\t@onEvent({ selector: '[data-combobox-option]', type: 'pointerover' })\n\tonOptionPointerOver(event: Event): void {\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst option = (event.target as HTMLElement).closest<HTMLElement>('[data-combobox-option]');\n\t\tif (!option || option.getAttribute('aria-disabled') === 'true' || option.hidden) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visible = this.getVisibleOptions();\n\t\tconst index = visible.indexOf(option);\n\t\tif (index >= 0) {\n\t\t\tthis.setActiveOption(index);\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-combobox-option]', type: 'mousedown' })\n\tonOptionMouseDown(event: Event): void {\n\t\tevent.preventDefault();\n\t}\n\n\t@onEvent({ selector: '[data-combobox-option]', type: 'click' })\n\tonOptionClick(event: Event): void {\n\t\tconst option = (event.target as HTMLElement).closest<HTMLElement>('[data-combobox-option]');\n\t\tif (option) {\n\t\t\tthis.select(option);\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'root', type: 'focusout' })\n\tonFocusOut(event: FocusEvent): void {\n\t\tconst next = event.relatedTarget;\n\t\tif (next instanceof Node && this.contains(next)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setOpen(false);\n\t}\n\n\t@onEvent({ document: true, type: 'click' })\n\tonDocumentClick(event: Event): void {\n\t\tif (!this.contains(event.target as Node)) {\n\t\t\tthis.setOpen(false);\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-combobox\" data-ref=\"root\">\n\t\t\t\t<slot name=\"control\"></slot>\n\t\t\t\t<slot name=\"listbox\"></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiComboboxProps } from './combobox.script';\nimport { RuiCombobox as RuiComboboxElement } from './combobox.script';\nimport './combobox.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiComboboxControlProps = RadiantSlotProps & {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Input row wrapper for the combobox input and optional trigger icon. */\nexport function RuiComboboxControl({ slot = 'control', children, class: className }: RuiComboboxControlProps) {\n\treturn (\n\t\t<div slot={slot} class={cx('rui-combobox__control', className)}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiComboboxInputProps = {\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tclass?: string;\n};\n\n/** Text input with `role=\"combobox\"`. Place inside `RuiComboboxControl`. */\nexport function RuiComboboxInput({ placeholder, disabled, class: className }: RuiComboboxInputProps) {\n\treturn (\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tdata-combobox-input\n\t\t\tdata-rui-control\n\t\t\tdata-rui-control-type=\"text\"\n\t\t\tclass={cx('rui-combobox__input', className)}\n\t\t\tplaceholder={placeholder}\n\t\t\tdisabled={disabled}\n\t\t\tautocomplete=\"off\"\n\t\t/>\n\t);\n}\n\nexport type RuiComboboxTriggerProps = {\n\tchildren?: JsxRenderable;\n\tclass?: string;\n\t'aria-label'?: string;\n\tdisabled?: boolean;\n};\n\n/** Optional open button placed inside `RuiComboboxControl`. */\nexport function RuiComboboxTrigger({\n\tchildren,\n\tclass: className,\n\t'aria-label': ariaLabel = 'Show suggestions',\n\tdisabled,\n}: RuiComboboxTriggerProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-combobox-trigger\n\t\t\tclass={cx('rui-combobox__trigger', className)}\n\t\t\taria-label={ariaLabel}\n\t\t\tdisabled={disabled}\n\t\t\ttabIndex={-1}\n\t\t>\n\t\t\t{children ?? <span aria-hidden=\"true\">\u25BE</span>}\n\t\t</button>\n\t);\n}\n\nexport type RuiComboboxListboxProps = RadiantSlotProps & {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Popup listbox slotted into `listbox` by default. */\nexport function RuiComboboxListbox({ slot = 'listbox', children, class: className }: RuiComboboxListboxProps) {\n\treturn (\n\t\t<div slot={slot} data-combobox-listbox class={cx('rui-combobox__listbox', className)} hidden>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiComboboxOptionProps = {\n\tvalue: string;\n\t/** Display text committed to the input when selected. Defaults to `children` text. */\n\tlabel?: string;\n\tchildren: JsxRenderable;\n\tclass?: string;\n\tdisabled?: boolean;\n};\n\n/** Listbox option placed inside `RuiComboboxListbox`. */\nexport function RuiComboboxOption({ value, label, children, class: className, disabled }: RuiComboboxOptionProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"option\"\n\t\t\tdata-combobox-option\n\t\t\tdata-value={value}\n\t\t\tdata-label={label}\n\t\t\tclass={cx('rui-combobox__option', className)}\n\t\t\taria-disabled={disabled ? 'true' : undefined}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiComboboxOptionData = { value: string; label: JsxRenderable };\n\n/**\n * Combobox view. Pair with `RuiLabel` (sibling or via `RuiField`) for the visible name \u2014\n * do not nest a combobox-specific label.\n */\nexport const RuiCombobox = defineRadiantView(\n\tRuiComboboxElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\tlabel,\n\t\tplaceholder,\n\t\tdisabled,\n\t\topenOnFocus,\n\t\toptions,\n\t\tchildren,\n\t}: RuiComboboxProps &\n\t\tRadiantSlotProps & {\n\t\t\toptions?: RuiComboboxOptionData[];\n\t\t\tchildren?: JsxRenderable;\n\t\t}) => {\n\t\tif (options != null) {\n\t\t\treturn (\n\t\t\t\t<rui-combobox\n\t\t\t\t\tslot={slot}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tlabel={label}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\topenOnFocus={openOnFocus}\n\t\t\t\t>\n\t\t\t\t\t<RuiComboboxControl>\n\t\t\t\t\t\t<RuiComboboxInput placeholder={placeholder} disabled={disabled} />\n\t\t\t\t\t\t<RuiComboboxTrigger />\n\t\t\t\t\t</RuiComboboxControl>\n\t\t\t\t\t<RuiComboboxListbox>\n\t\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t\t<RuiComboboxOption\n\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\tlabel={typeof option.label === 'string' ? option.label : undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t</RuiComboboxOption>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</RuiComboboxListbox>\n\t\t\t\t</rui-combobox>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<rui-combobox\n\t\t\t\tslot={slot}\n\t\t\t\tvalue={value}\n\t\t\t\tlabel={label}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\topenOnFocus={openOnFocus}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</rui-combobox>\n\t\t);\n\t},\n);\n", "import { RadiantElement, bound, customElement, event, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiDialogProps = {\n\t/** Whether the dialog is open. Default: `false`. */\n\topen?: boolean;\n\t/**\n\t * When `true`, uses `role=\"alertdialog\"` for workflow-interrupting\n\t * confirmations. Default: `false` (`role=\"dialog\"`).\n\t */\n\talert?: boolean;\n\t/** Accessible name when there is no visible title. */\n\tlabel?: string;\n};\n\nexport type RuiDialogCloseDetail = {\n\treason: 'escape' | 'backdrop' | 'dismiss';\n};\n\ntype RuiDialogBindings = {\n\topen: boolean;\n\talert: boolean;\n};\n\nconst FOCUSABLE =\n\t'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * `<rui-dialog>` \u2014 a composition-first modal dialog shell.\n *\n * Implements the WAI-ARIA APG Dialog (Modal) pattern, and the Alert and Message\n * Dialogs pattern when `alert` is set. Compose title, body, actions, and close\n * controls with the view helpers.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/\n *\n * @element rui-dialog\n * @slot close - Optional close control (`RuiDialogClose`).\n * @slot title - Optional visible dialog title (`RuiDialogTitle`).\n * @slot - Dialog body (`RuiDialogBody`).\n * @slot actions - Optional action buttons (`RuiDialogActions`).\n * @fires rui-close - Emitted when the dialog is dismissed.\n */\n@customElement('rui-dialog')\nexport class RuiDialog extends RadiantElement<RuiDialogBindings> {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) open: boolean;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) alert: boolean;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\t@query({ ref: 'dialog' }) dialogTarget: HTMLElement;\n\t@query({ selector: '[data-dialog-title]' }) titleTarget: HTMLElement;\n\t@query({ selector: '[data-dialog-body]' }) descriptionTarget: HTMLElement;\n\n\t@event({ name: 'rui-close', bubbles: true, composed: true })\n\tcloseEvent: EventEmitter<RuiDialogCloseDetail>;\n\n\tprivate readonly dialogHidden = this.$.open.map((open) => !open);\n\tprivate readonly resolvedRole = this.$.alert.map((alert) => (alert ? 'alertdialog' : 'dialog'));\n\n\tprivate previouslyFocused: HTMLElement | null = null;\n\tprivate titleId = `rui-dialog-title-${Math.random().toString(36).slice(2, 9)}`;\n\tprivate descriptionId = `rui-dialog-desc-${Math.random().toString(36).slice(2, 9)}`;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => this.syncOpenState());\n\t}\n\n\t@bound\n\t@onUpdated(['open', 'label'])\n\tsyncOpenState(): void {\n\t\tif (!this.dialogTarget) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.titleTarget?.textContent?.trim()) {\n\t\t\tthis.titleTarget.id = this.titleId;\n\t\t\tthis.dialogTarget.setAttribute('aria-labelledby', this.titleId);\n\t\t\tthis.dialogTarget.removeAttribute('aria-label');\n\t\t} else if (this.label) {\n\t\t\tthis.dialogTarget.setAttribute('aria-label', this.label);\n\t\t\tthis.dialogTarget.removeAttribute('aria-labelledby');\n\t\t}\n\n\t\tif (this.descriptionTarget) {\n\t\t\tthis.descriptionTarget.id = this.descriptionId;\n\t\t\tthis.dialogTarget.setAttribute('aria-describedby', this.descriptionId);\n\t\t} else {\n\t\t\tthis.dialogTarget.removeAttribute('aria-describedby');\n\t\t}\n\n\t\tif (this.open) {\n\t\t\tthis.previouslyFocused = document.activeElement as HTMLElement | null;\n\t\t\tqueueMicrotask(() => this.focusInitial());\n\t\t} else {\n\t\t\tthis.previouslyFocused?.focus?.();\n\t\t\tthis.previouslyFocused = null;\n\t\t}\n\t}\n\n\tprivate focusInitial(): void {\n\t\tconst focusable = this.getFocusable();\n\t\t(focusable[0] ?? this.dialogTarget)?.focus();\n\t}\n\n\tprivate getFocusable(): HTMLElement[] {\n\t\treturn Array.from(this.dialogTarget?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []).filter(\n\t\t\t(el) => !el.hasAttribute('disabled') && el.tabIndex !== -1,\n\t\t);\n\t}\n\n\tprivate dismiss(reason: RuiDialogCloseDetail['reason']): void {\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.open = false;\n\t\tthis.closeEvent.emit({ reason });\n\t}\n\n\t@onEvent({ document: true, type: 'keydown' })\n\tonDocumentKeydown(event: KeyboardEvent): void {\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.dismiss('escape');\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key !== 'Tab') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst focusable = this.getFocusable();\n\t\tif (!focusable.length) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.dialogTarget.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst first = focusable[0];\n\t\tconst last = focusable[focusable.length - 1];\n\t\tconst active = document.activeElement as HTMLElement | null;\n\n\t\tif (event.shiftKey && active === first) {\n\t\t\tevent.preventDefault();\n\t\t\tlast.focus();\n\t\t} else if (!event.shiftKey && active === last) {\n\t\t\tevent.preventDefault();\n\t\t\tfirst.focus();\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'backdrop', type: 'click' })\n\tonBackdropClick(): void {\n\t\tthis.dismiss('backdrop');\n\t}\n\n\t@onEvent({ selector: '[data-dialog-close]', type: 'click' })\n\tonCloseClick(): void {\n\t\tthis.dismiss('dismiss');\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-dialog\" hidden={this.dialogHidden}>\n\t\t\t\t<div data-ref=\"backdrop\" class=\"rui-dialog__backdrop\"></div>\n\t\t\t\t<div\n\t\t\t\t\tdata-ref=\"dialog\"\n\t\t\t\t\tclass=\"rui-dialog__surface\"\n\t\t\t\t\ttabindex={-1}\n\t\t\t\t\trole={this.resolvedRole}\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"close\"></slot>\n\t\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiDialogProps } from './dialog.script';\nimport { RuiDialog as RuiDialogElement } from './dialog.script';\nimport './dialog.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiDialogTitleProps = RadiantSlotProps & {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Dialog title slotted into `title` by default. */\nexport function RuiDialogTitle({ slot = 'title', children, class: className }: RuiDialogTitleProps) {\n\treturn (\n\t\t<div slot={slot} data-dialog-title data-ref=\"title\" class={cx('rui-dialog__title', className)}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiDialogBodyProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Dialog body in the default slot. */\nexport function RuiDialogBody({ children, class: className }: RuiDialogBodyProps) {\n\treturn (\n\t\t<div data-dialog-body data-ref=\"description\" class={cx('rui-dialog__body', className)}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiDialogActionsProps = RadiantSlotProps & {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Action row slotted into `actions` by default. */\nexport function RuiDialogActions({ slot = 'actions', children, class: className }: RuiDialogActionsProps) {\n\treturn (\n\t\t<div slot={slot} class={cx('rui-dialog__actions', className)}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiDialogCloseProps = RadiantSlotProps & {\n\tchildren?: JsxRenderable;\n\tclass?: string;\n\t'aria-label'?: string;\n};\n\n/** Close control slotted into `close` by default. */\nexport function RuiDialogClose({\n\tslot = 'close',\n\tchildren,\n\tclass: className,\n\t'aria-label': ariaLabel = 'Close',\n}: RuiDialogCloseProps) {\n\treturn (\n\t\t<button\n\t\t\tslot={slot}\n\t\t\ttype=\"button\"\n\t\t\tdata-dialog-close\n\t\t\tdata-ref=\"close\"\n\t\t\tclass={cx('rui-dialog__close', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{children ?? '\u00D7'}\n\t\t</button>\n\t);\n}\n\nexport type RuiDialogViewProps = RuiDialogProps &\n\tRadiantSlotProps & {\n\t\tid?: string;\n\t\ttitle?: JsxRenderable;\n\t\tactions?: JsxRenderable;\n\t\tchildren?: JsxRenderable;\n\t};\n\nexport const RuiDialog = defineRadiantView(\n\tRuiDialogElement,\n\t({ slot, open, alert, label, id, title, actions, children }: RuiDialogViewProps) => {\n\t\tif (title != null || actions != null) {\n\t\t\treturn (\n\t\t\t\t<rui-dialog slot={slot} id={id} open={open} alert={alert} label={label}>\n\t\t\t\t\t<RuiDialogClose />\n\t\t\t\t\t{title != null ? <RuiDialogTitle>{title}</RuiDialogTitle> : null}\n\t\t\t\t\t{children != null ? <RuiDialogBody>{children}</RuiDialogBody> : null}\n\t\t\t\t\t{actions != null ? <RuiDialogActions>{actions}</RuiDialogActions> : null}\n\t\t\t\t</rui-dialog>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<rui-dialog slot={slot} id={id} open={open} alert={alert} label={label}>\n\t\t\t\t{children}\n\t\t\t</rui-dialog>\n\t\t);\n\t},\n);\n", "/** Reserved id for the registry-owned imperative host dialog. */\nexport const RUI_DIALOG_HOST_ID = '__rui-dialog-host';\n\nexport const RUI_DIALOG_OPEN_EVENT = 'rui-dialog-open';\nexport const RUI_DIALOG_CLOSE_EVENT = 'rui-dialog-close';\nexport const RUI_DIALOG_TOGGLE_EVENT = 'rui-dialog-toggle';\nexport const RUI_DIALOG_ACTION_EVENT = 'rui-dialog-action';\n\nexport type DialogActionVariant = 'primary' | 'ghost' | 'error' | 'outline' | 'filled';\nexport type DialogActionSize = 'sm' | 'md' | 'lg';\n\nexport type DialogAction = {\n\tlabel: string;\n\tvariant?: DialogActionVariant;\n\tsize?: DialogActionSize;\n\t/** Emitted on `rui-dialog-action` as `detail.value`. */\n\tvalue?: string;\n\t/** Default `true` \u2014 dismiss after click. */\n\tcloseOnClick?: boolean;\n};\n\n/** Content for the registry-owned imperative host dialog (no `id`). */\nexport type DialogHostContent = {\n\ttitle?: string;\n\t/** Body copy (plain text). */\n\tbody?: string;\n\talert?: boolean;\n\t/** Accessible name when there is no title. */\n\tlabel?: string;\n\tactions?: DialogAction[];\n};\n\n/** Open a named dialog by id, or fill the imperative host \u2014 never both. */\nexport type DialogOpenOptions = { id: string } | DialogHostContent;\n\nexport type DialogOpenDetail = DialogOpenOptions | string;\nexport type DialogCloseDetail = { id?: string };\nexport type DialogToggleDetail = { id: string };\nexport type DialogActionDetail = { value?: string };\n\nexport type DialogHandle = {\n\topen: {\n\t\t(): void;\n\t\t(id: string): void;\n\t\t(options: DialogHostContent): void;\n\t};\n\t/** Omit `id` to close the currently open dialog. */\n\tclose: (id?: string) => void;\n\ttoggle: (id?: string) => void;\n\treadonly openId: string | null;\n};\n\nexport function isNamedDialogOpen(detail: DialogOpenOptions): detail is { id: string } {\n\treturn 'id' in detail && detail.id != null && detail.id !== '';\n}\n", "import type { RuiDialog } from './dialog.script';\nimport './dialog.script';\nimport {\n\tRUI_DIALOG_ACTION_EVENT,\n\tRUI_DIALOG_CLOSE_EVENT,\n\tRUI_DIALOG_HOST_ID,\n\tRUI_DIALOG_OPEN_EVENT,\n\tRUI_DIALOG_TOGGLE_EVENT,\n\ttype DialogAction,\n\ttype DialogActionDetail,\n\ttype DialogCloseDetail,\n\ttype DialogHandle,\n\ttype DialogHostContent,\n\ttype DialogOpenOptions,\n\ttype DialogToggleDetail,\n\tisNamedDialogOpen,\n} from './dialog-types';\n\nexport type InstallDialogsOptions = {\n\t/** Parent node for the imperative host mount. Default: `document.body`. */\n\tmount?: ParentNode;\n};\n\nlet installed = false;\nlet mountParent: ParentNode | null = null;\nlet hostDialog: RuiDialog | null = null;\nlet openId: string | null = null;\n\nfunction resolveDialog(id: string): RuiDialog | null {\n\tconst trimmed = id.trim();\n\tif (!trimmed) {\n\t\treturn null;\n\t}\n\n\tconst byId = document.getElementById(trimmed);\n\tif (byId?.localName === 'rui-dialog') {\n\t\treturn byId as RuiDialog;\n\t}\n\n\treturn null;\n}\n\nfunction createCloseButton(): HTMLButtonElement {\n\tconst close = document.createElement('button');\n\tclose.slot = 'close';\n\tclose.type = 'button';\n\tclose.setAttribute('data-dialog-close', '');\n\tclose.setAttribute('data-ref', 'close');\n\tclose.className = 'rui-dialog__close';\n\tclose.setAttribute('aria-label', 'Close');\n\tclose.textContent = '\u00D7';\n\treturn close;\n}\n\nfunction createTitle(title: string): HTMLElement {\n\tconst el = document.createElement('div');\n\tel.slot = 'title';\n\tel.setAttribute('data-dialog-title', '');\n\tel.setAttribute('data-ref', 'title');\n\tel.className = 'rui-dialog__title';\n\tel.textContent = title;\n\treturn el;\n}\n\nfunction createBody(body: string): HTMLElement {\n\tconst el = document.createElement('div');\n\tel.setAttribute('data-dialog-body', '');\n\tel.setAttribute('data-ref', 'description');\n\tel.className = 'rui-dialog__body';\n\tconst paragraph = document.createElement('p');\n\tparagraph.textContent = body;\n\tel.append(paragraph);\n\treturn el;\n}\n\nfunction createActions(actions: DialogAction[]): HTMLElement {\n\tconst row = document.createElement('div');\n\trow.slot = 'actions';\n\trow.className = 'rui-dialog__actions';\n\n\tfor (const action of actions) {\n\t\tconst button = document.createElement('button');\n\t\tbutton.type = 'button';\n\t\tbutton.className = `rui-button rui-button--${action.variant ?? 'filled'} rui-button--${action.size ?? 'md'}`;\n\t\tbutton.setAttribute('data-dialog-action', action.value ?? '');\n\t\tif (action.closeOnClick === false) {\n\t\t\tbutton.setAttribute('data-dialog-action-close', 'false');\n\t\t}\n\t\tbutton.textContent = action.label;\n\t\trow.append(button);\n\t}\n\n\treturn row;\n}\n\nfunction destroyHostDialog(): void {\n\thostDialog?.remove();\n\thostDialog = null;\n}\n\nfunction mountHostDialog(options: DialogHostContent): RuiDialog {\n\tdestroyHostDialog();\n\n\tconst dialog = document.createElement('rui-dialog') as RuiDialog;\n\tdialog.id = RUI_DIALOG_HOST_ID;\n\tdialog.alert = Boolean(options.alert);\n\tdialog.label = options.label ?? '';\n\n\tdialog.append(createCloseButton());\n\tif (options.title) {\n\t\tdialog.append(createTitle(options.title));\n\t}\n\tif (options.body) {\n\t\tdialog.append(createBody(options.body));\n\t}\n\tif (options.actions?.length) {\n\t\tdialog.append(createActions(options.actions));\n\t}\n\n\t(mountParent ?? document.body).appendChild(dialog);\n\thostDialog = dialog;\n\treturn dialog;\n}\n\nfunction closeCurrentExcept(nextId: string): void {\n\tif (!openId || openId === nextId) {\n\t\treturn;\n\t}\n\n\tif (openId === RUI_DIALOG_HOST_ID) {\n\t\tdestroyHostDialog();\n\t} else {\n\t\tconst dialog = resolveDialog(openId);\n\t\tif (dialog) {\n\t\t\tdialog.open = false;\n\t\t}\n\t}\n}\n\nfunction openNamed(id: string): void {\n\tensureInstalled();\n\tconst dialog = resolveDialog(id);\n\tif (!dialog) {\n\t\treturn;\n\t}\n\n\tcloseCurrentExcept(id);\n\tdialog.open = true;\n\topenId = id;\n}\n\nfunction openHost(options: DialogHostContent): void {\n\tensureInstalled();\n\tcloseCurrentExcept(RUI_DIALOG_HOST_ID);\n\tconst dialog = mountHostDialog(options);\n\tdialog.open = true;\n\topenId = RUI_DIALOG_HOST_ID;\n}\n\n/**\n * Resolve open intent: string/`id` opens a named dialog; otherwise fill the host.\n * Named dialogs own their markup \u2014 when `id` is set, host content fields are ignored.\n */\nfunction open(idOrOptions: string | DialogOpenOptions): void {\n\tif (typeof idOrOptions === 'string') {\n\t\topenNamed(idOrOptions);\n\t\treturn;\n\t}\n\n\tif (isNamedDialogOpen(idOrOptions)) {\n\t\topenNamed(idOrOptions.id);\n\t\treturn;\n\t}\n\n\topenHost(idOrOptions);\n}\n\nfunction close(id?: string): void {\n\tensureInstalled();\n\tconst targetId = id ?? openId;\n\tif (!targetId) {\n\t\treturn;\n\t}\n\n\tif (targetId === RUI_DIALOG_HOST_ID) {\n\t\tdestroyHostDialog();\n\t} else {\n\t\tconst dialog = resolveDialog(targetId);\n\t\tif (dialog) {\n\t\t\tdialog.open = false;\n\t\t}\n\t}\n\n\tif (openId === targetId) {\n\t\topenId = null;\n\t}\n}\n\nfunction toggle(id: string): void {\n\tensureInstalled();\n\tif (openId === id) {\n\t\tclose(id);\n\t\treturn;\n\t}\n\topenNamed(id);\n}\n\nfunction onOpenEvent(event: Event): void {\n\tconst detail = (event as CustomEvent<DialogOpenOptions | string>).detail;\n\tif (typeof detail === 'string') {\n\t\topen(detail);\n\t\treturn;\n\t}\n\tif (detail && typeof detail === 'object') {\n\t\topen(detail);\n\t}\n}\n\nfunction onCloseEvent(event: Event): void {\n\tconst detail = (event as CustomEvent<DialogCloseDetail>).detail;\n\tclose(detail?.id);\n}\n\nfunction onToggleEvent(event: Event): void {\n\tconst detail = (event as CustomEvent<DialogToggleDetail>).detail;\n\tif (detail?.id) {\n\t\ttoggle(detail.id);\n\t}\n}\n\nfunction onDocumentClick(event: Event): void {\n\tconst target = event.target as Element | null;\n\tif (!target?.closest) {\n\t\treturn;\n\t}\n\n\tconst action = target.closest('[data-dialog-action]') as HTMLElement | null;\n\tif (action && hostDialog?.contains(action)) {\n\t\tevent.preventDefault();\n\t\tconst value = action.getAttribute('data-dialog-action') || undefined;\n\t\tconst detail: DialogActionDetail = { value: value || undefined };\n\t\thostDialog.dispatchEvent(\n\t\t\tnew CustomEvent(RUI_DIALOG_ACTION_EVENT, {\n\t\t\t\tdetail,\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t);\n\t\tif (action.getAttribute('data-dialog-action-close') !== 'false') {\n\t\t\tclose(RUI_DIALOG_HOST_ID);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst openTrigger = target.closest('[data-dialog-open]');\n\tif (openTrigger) {\n\t\tconst id = openTrigger.getAttribute('data-dialog-open')?.trim();\n\t\tif (id) {\n\t\t\tevent.preventDefault();\n\t\t\topenNamed(id);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst closeTrigger = target.closest('[data-dialog-close]');\n\tif (closeTrigger) {\n\t\tconst insideDialog = closeTrigger.closest('rui-dialog');\n\t\tif (insideDialog?.hasAttribute('open')) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tclose();\n\t}\n}\n\nfunction onRuiClose(event: Event): void {\n\tconst dialog = (event.target as Element | null)?.closest?.('rui-dialog');\n\tif (!dialog) {\n\t\treturn;\n\t}\n\n\tconst id = dialog.id || null;\n\tif (id && openId === id) {\n\t\tif (id === RUI_DIALOG_HOST_ID) {\n\t\t\tdestroyHostDialog();\n\t\t}\n\t\topenId = null;\n\t}\n}\n\n/**\n * Install document listeners for dialog events and `data-dialog-*` attributes.\n * Idempotent \u2014 safe to call from app boot and Storybook decorators.\n * Returns an uninstall function for tests / HMR.\n */\nexport function installDialogs(options: InstallDialogsOptions = {}): () => void {\n\tif (installed) {\n\t\tif (options.mount) {\n\t\t\tmountParent = options.mount;\n\t\t}\n\t\treturn uninstallDialogs;\n\t}\n\n\tinstalled = true;\n\tmountParent = options.mount ?? document.body;\n\n\tdocument.addEventListener(RUI_DIALOG_OPEN_EVENT, onOpenEvent);\n\tdocument.addEventListener(RUI_DIALOG_CLOSE_EVENT, onCloseEvent);\n\tdocument.addEventListener(RUI_DIALOG_TOGGLE_EVENT, onToggleEvent);\n\tdocument.addEventListener('click', onDocumentClick);\n\tdocument.addEventListener('rui-close', onRuiClose);\n\n\treturn uninstallDialogs;\n}\n\nfunction ensureInstalled(): void {\n\tif (!installed) {\n\t\tinstallDialogs();\n\t}\n}\n\n/** Tear down listeners and the host dialog (mainly for tests). */\nexport function uninstallDialogs(): void {\n\tif (!installed) {\n\t\treturn;\n\t}\n\n\tdocument.removeEventListener(RUI_DIALOG_OPEN_EVENT, onOpenEvent);\n\tdocument.removeEventListener(RUI_DIALOG_CLOSE_EVENT, onCloseEvent);\n\tdocument.removeEventListener(RUI_DIALOG_TOGGLE_EVENT, onToggleEvent);\n\tdocument.removeEventListener('click', onDocumentClick);\n\tdocument.removeEventListener('rui-close', onRuiClose);\n\n\tdestroyHostDialog();\n\tmountParent = null;\n\topenId = null;\n\tinstalled = false;\n}\n\n/** Currently open dialog id, or `null`. */\nexport function getOpenDialogId(): string | null {\n\treturn openId;\n}\n\n/** Open a named dialog by id, or fill/open the imperative host dialog. */\nexport function openDialog(idOrOptions: string | DialogOpenOptions): void {\n\tensureInstalled();\n\topen(idOrOptions);\n}\n\n/** Close the current dialog, or a specific id. */\nexport function closeDialog(id?: string): void {\n\tensureInstalled();\n\tclose(id);\n}\n\n/** Toggle a named dialog by id. */\nexport function toggleDialog(id: string): void {\n\tensureInstalled();\n\ttoggle(id);\n}\n\n/**\n * Bound handle for a named dialog id, or the imperative host when `id` is omitted.\n * A bound handle's `open()` always targets that id; pass options only on unbound handles.\n *\n * @example\n * const confirm = createDialogHandle();\n * confirm.open({ title: 'Delete?', body: '\u2026', actions: [\u2026] });\n *\n * const profile = createDialogHandle('edit-profile');\n * profile.open();\n */\nexport function createDialogHandle(id?: string): DialogHandle {\n\tensureInstalled();\n\n\tconst boundId = id?.trim() || undefined;\n\n\tconst handleOpen = ((idOrOptions?: string | DialogHostContent) => {\n\t\tif (boundId) {\n\t\t\topenNamed(boundId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (idOrOptions == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof idOrOptions === 'string') {\n\t\t\topenNamed(idOrOptions);\n\t\t\treturn;\n\t\t}\n\t\topen(idOrOptions);\n\t}) as DialogHandle['open'];\n\n\treturn {\n\t\topen: handleOpen,\n\t\tclose: (closeId) => {\n\t\t\tclose(closeId ?? boundId);\n\t\t},\n\t\ttoggle: (toggleId) => {\n\t\t\tconst target = toggleId ?? boundId;\n\t\t\tif (target) {\n\t\t\t\ttoggle(target);\n\t\t\t}\n\t\t},\n\t\tget openId() {\n\t\t\treturn openId;\n\t\t},\n\t};\n}\n", "import { RadiantElement, bound, customElement, onEvent, onUpdated, prop } from '@ecopages/radiant';\n\nexport type RuiDisclosureProps = {\n\t/** Whether the disclosure content starts expanded. Default: `false`. */\n\topen?: boolean;\n\t/** Optional value used when coordinating disclosures inside a group. */\n\tvalue?: string;\n\t/** Animate panel height. Also enabled when inside an animated disclosure group. */\n\tanimated?: boolean;\n};\n\nexport type RuiDisclosureToggleDetail = {\n\tvalue: string;\n\topen: boolean;\n};\n\n/**\n * `<rui-disclosure>` \u2014 a composition-first show/hide control.\n *\n * Implements the WAI-ARIA APG Disclosure (Show/Hide) pattern. Pair a trigger\n * marked with `data-disclosure-trigger` and a panel marked with\n * `data-disclosure-panel` (see the view helpers).\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/\n *\n * @element rui-disclosure\n * @slot trigger - Disclosure button (use `RuiDisclosureTrigger`).\n * @slot - Panel content (use `RuiDisclosurePanel`).\n */\n@customElement('rui-disclosure')\nexport class RuiDisclosure extends RadiantElement {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) open: boolean;\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) animated: boolean;\n\n\tprivate panelId = `rui-disclosure-${Math.random().toString(36).slice(2, 9)}`;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncAnimated();\n\t\t\tthis.syncExpanded();\n\t\t});\n\t}\n\n\tprivate syncAnimated(): void {\n\t\tthis.toggleAttribute('data-animated', this.animated);\n\t}\n\n\t@onEvent({ selector: '[data-disclosure-trigger]', type: 'click' })\n\tonTriggerClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tthis.toggle();\n\t}\n\n\tprivate toggle(): void {\n\t\tconst next = !this.open;\n\t\tthis.open = next;\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<RuiDisclosureToggleDetail>('rui-disclosure-toggle', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, open: next },\n\t\t\t}),\n\t\t);\n\t}\n\n\t@bound\n\t@onUpdated(['open', 'animated'])\n\tsyncExpanded(): void {\n\t\tthis.syncAnimated();\n\n\t\tconst trigger = this.querySelector<HTMLElement>('[data-disclosure-trigger]');\n\t\tconst panel = this.querySelector<HTMLElement>('[data-disclosure-panel]');\n\t\tif (!trigger || !panel) {\n\t\t\treturn;\n\t\t}\n\n\t\ttrigger.setAttribute('aria-expanded', String(this.open));\n\t\ttrigger.setAttribute('aria-controls', this.panelId);\n\t\tpanel.id = this.panelId;\n\t\tpanel.dataset.state = this.open ? 'open' : 'closed';\n\n\t\tif (this.animated) {\n\t\t\tpanel.hidden = false;\n\t\t\tpanel.setAttribute('aria-hidden', String(!this.open));\n\t\t\treturn;\n\t\t}\n\n\t\tpanel.hidden = !this.open;\n\t\tpanel.removeAttribute('aria-hidden');\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-disclosure\">\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import { RadiantElement, customElement, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport { applyRovingTabindex, navigateRovingTabindex } from '../../../lib/roving-tabindex';\nimport type { RuiDisclosureToggleDetail } from './disclosure.script';\nimport { RuiDisclosure } from './disclosure.script';\n\nexport type RuiDisclosureGroupProps = {\n\t/** Allow more than one disclosure to stay open. Default: `false` (exclusive). */\n\tmultiple?: boolean;\n\t/** Animate panel height for child disclosures. Default: `false`. */\n\tanimated?: boolean;\n};\n\n/**\n * `<rui-disclosure-group>` \u2014 coordinates stacked disclosures (accordion-style).\n *\n * When `multiple` is `false` (default), opening one disclosure closes the others.\n * Supports APG accordion keyboard navigation between triggers (ArrowUp/Down, Home/End)\n * and optional ArrowLeft/Right to collapse/expand the focused section.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/accordion/\n * @element rui-disclosure-group\n * @slot - `rui-disclosure` children.\n */\n@customElement('rui-disclosure-group')\nexport class RuiDisclosureGroup extends RadiantElement {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) multiple: boolean;\n\t@prop({ type: Boolean, reflect: true, attribute: 'animated', defaultValue: false }) animated: boolean;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncChildrenAnimated();\n\t\t\tthis.syncTriggers();\n\t\t});\n\t}\n\n\tprivate getTriggers(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[data-disclosure-trigger]'));\n\t}\n\n\tprivate getDisclosureForTrigger(trigger: HTMLElement): RuiDisclosure | null {\n\t\treturn trigger.closest('rui-disclosure');\n\t}\n\n\tprivate syncTriggers(): void {\n\t\tconst triggers = this.getTriggers();\n\t\tif (!triggers.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeIndex = Math.max(\n\t\t\t0,\n\t\t\ttriggers.findIndex((trigger) => trigger.tabIndex === 0 || trigger === document.activeElement),\n\t\t);\n\t\tapplyRovingTabindex(triggers, activeIndex);\n\t}\n\n\tprivate syncChildrenAnimated(): void {\n\t\tfor (const disclosure of this.querySelectorAll<RuiDisclosure>('rui-disclosure')) {\n\t\t\tdisclosure.animated = this.animated;\n\t\t}\n\t}\n\n\t@onUpdated('animated')\n\tonAnimatedUpdated(): void {\n\t\tthis.syncChildrenAnimated();\n\t}\n\n\t@onEvent({ selector: 'rui-disclosure', type: 'rui-disclosure-toggle' })\n\tonDisclosureToggle(event: Event): void {\n\t\tif (this.multiple) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst detail = (event as CustomEvent<RuiDisclosureToggleDetail>).detail;\n\t\tif (!detail?.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst source = event.target;\n\t\tif (!(source instanceof RuiDisclosure)) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const disclosure of this.querySelectorAll<RuiDisclosure>('rui-disclosure')) {\n\t\t\tif (disclosure !== source) {\n\t\t\t\tdisclosure.open = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-disclosure-trigger]', type: 'keydown' })\n\tonTriggerKeydown(event: KeyboardEvent): void {\n\t\tconst triggers = this.getTriggers();\n\t\tconst current = (event.target as HTMLElement).closest<HTMLElement>('[data-disclosure-trigger]');\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Optional APG accordion: Left collapses, Right expands the focused header.\n\t\tif (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n\t\t\tconst disclosure = this.getDisclosureForTrigger(current);\n\t\t\tif (!disclosure) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextOpen = event.key === 'ArrowRight';\n\t\t\tif (disclosure.open === nextOpen) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\t\t\tdisclosure.open = nextOpen;\n\n\t\t\tif (nextOpen && !this.multiple) {\n\t\t\t\tfor (const other of this.querySelectorAll<RuiDisclosure>('rui-disclosure')) {\n\t\t\t\t\tif (other !== disclosure) {\n\t\t\t\t\t\tother.open = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems: triggers,\n\t\t\tcurrent,\n\t\t\tkey: event.key,\n\t\t\torientation: 'vertical',\n\t\t\twrap: true,\n\t\t});\n\n\t\tif (!result.handled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-disclosure-group\" data-ref=\"root\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "export type RovingOrientation = 'horizontal' | 'vertical';\n\nexport type RovingNavResult = { handled: false } | { handled: true; index: number; item: HTMLElement };\n\n/**\n * Apply the APG roving-tabindex pattern: one item is tabbable, the rest are `-1`.\n */\nexport function applyRovingTabindex(items: HTMLElement[], activeIndex: number): void {\n\titems.forEach((item, index) => {\n\t\titem.tabIndex = index === activeIndex ? 0 : -1;\n\t});\n}\n\n/**\n * Focus `items[index]` and update tabindexes. Returns the focused item, or null.\n */\nexport function focusRovingItem(items: HTMLElement[], index: number): HTMLElement | null {\n\tif (!items.length) return null;\n\tconst next = Math.max(0, Math.min(items.length - 1, index));\n\tapplyRovingTabindex(items, next);\n\titems[next]?.focus();\n\treturn items[next] ?? null;\n}\n\nfunction deltaForKey(key: string, orientation: RovingOrientation): 'prev' | 'next' | 'first' | 'last' | null {\n\tif (key === 'Home') return 'first';\n\tif (key === 'End') return 'last';\n\n\tif (orientation === 'horizontal') {\n\t\tif (key === 'ArrowRight') return 'next';\n\t\tif (key === 'ArrowLeft') return 'prev';\n\t\treturn null;\n\t}\n\n\tif (key === 'ArrowDown') return 'next';\n\tif (key === 'ArrowUp') return 'prev';\n\treturn null;\n}\n\n/**\n * Handle arrow / Home / End navigation for a flat roving-tabindex collection.\n * Does not activate the item \u2014 callers decide whether to select on move.\n */\nexport function navigateRovingTabindex(options: {\n\titems: HTMLElement[];\n\tcurrent: HTMLElement | null;\n\tkey: string;\n\torientation?: RovingOrientation;\n\twrap?: boolean;\n}): RovingNavResult {\n\tconst { items, current, key, orientation = 'horizontal', wrap = true } = options;\n\tif (!items.length || !current) return { handled: false };\n\n\tconst index = items.indexOf(current);\n\tif (index < 0) return { handled: false };\n\n\tconst delta = deltaForKey(key, orientation);\n\tif (!delta) return { handled: false };\n\n\tlet next = index;\n\tif (delta === 'first') next = 0;\n\telse if (delta === 'last') next = items.length - 1;\n\telse if (delta === 'next') next = wrap ? (index + 1) % items.length : Math.min(items.length - 1, index + 1);\n\telse next = wrap ? (index - 1 + items.length) % items.length : Math.max(0, index - 1);\n\n\tconst item = focusRovingItem(items, next);\n\tif (!item) return { handled: false };\n\treturn { handled: true, index: next, item };\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiDisclosureGroupProps } from './disclosure-group.script';\nimport { RuiDisclosureGroup as RuiDisclosureGroupElement } from './disclosure-group.script';\nimport type { RuiDisclosureProps } from './disclosure.script';\nimport { RuiDisclosure as RuiDisclosureElement } from './disclosure.script';\nimport './disclosure-group.css';\nimport './disclosure.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiDisclosureIconProps = {\n\tvariant?: 'chevron' | 'plus';\n\tclass?: string;\n};\n\n/** Default disclosure indicator. Override via `RuiDisclosureTrigger` `icon` prop. */\nexport function RuiDisclosureIcon({ variant = 'chevron', class: className }: RuiDisclosureIconProps) {\n\treturn (\n\t\t<span\n\t\t\tclass={cx('rui-disclosure__icon', `rui-disclosure__icon--${variant}`, className)}\n\t\t\tdata-disclosure-icon\n\t\t\taria-hidden=\"true\"\n\t\t></span>\n\t);\n}\n\nexport type RuiDisclosureTriggerProps = RadiantSlotProps & {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\tdisabled?: boolean;\n\t/** Custom indicator. Pass `null` to hide. Defaults to chevron. */\n\ticon?: JsxRenderable | null;\n\ticonPosition?: 'start' | 'end';\n};\n\n/** Disclosure button slotted into `trigger` by default. */\nexport function RuiDisclosureTrigger({\n\tslot = 'trigger',\n\tchildren,\n\tclass: className,\n\tdisabled,\n\ticon,\n\ticonPosition = 'start',\n}: RuiDisclosureTriggerProps) {\n\tconst showIcon = icon !== null;\n\tconst iconNode = showIcon ? (icon ?? <RuiDisclosureIcon />) : null;\n\n\treturn (\n\t\t<button\n\t\t\tslot={slot}\n\t\t\ttype=\"button\"\n\t\t\tdata-disclosure-trigger\n\t\t\tclass={cx(\n\t\t\t\t'rui-disclosure__trigger',\n\t\t\t\ticonPosition === 'end' && 'rui-disclosure__trigger--icon-end',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{iconPosition === 'start' ? iconNode : null}\n\t\t\t<span class=\"rui-disclosure__label\">{children}</span>\n\t\t\t{iconPosition === 'end' ? iconNode : null}\n\t\t</button>\n\t);\n}\n\nexport type RuiDisclosurePanelProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Disclosure panel in the default slot. */\nexport function RuiDisclosurePanel({ children, class: className }: RuiDisclosurePanelProps) {\n\treturn (\n\t\t<div data-disclosure-panel data-ref=\"panel\" class={cx('rui-disclosure__panel', className)}>\n\t\t\t<div class=\"rui-disclosure__panel-inner\">{children}</div>\n\t\t</div>\n\t);\n}\n\nexport const RuiDisclosure = defineRadiantView(\n\tRuiDisclosureElement,\n\t({\n\t\tslot,\n\t\topen,\n\t\tvalue,\n\t\tanimated,\n\t\ttrigger,\n\t\tchildren,\n\t}: RuiDisclosureProps &\n\t\tRadiantSlotProps & {\n\t\t\ttrigger?: JsxRenderable;\n\t\t\tchildren?: JsxRenderable;\n\t\t}) => {\n\t\tif (trigger != null) {\n\t\t\treturn (\n\t\t\t\t<rui-disclosure slot={slot} open={open} value={value} animated={animated}>\n\t\t\t\t\t<RuiDisclosureTrigger>{trigger}</RuiDisclosureTrigger>\n\t\t\t\t\t{children != null ? <RuiDisclosurePanel>{children}</RuiDisclosurePanel> : null}\n\t\t\t\t</rui-disclosure>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<rui-disclosure slot={slot} open={open} value={value} animated={animated}>\n\t\t\t\t{children}\n\t\t\t</rui-disclosure>\n\t\t);\n\t},\n);\n\nexport const RuiDisclosureGroup = defineRadiantView(\n\tRuiDisclosureGroupElement,\n\t({\n\t\tslot,\n\t\tmultiple,\n\t\tanimated,\n\t\tchildren,\n\t}: RuiDisclosureGroupProps & RadiantSlotProps & { children: JsxRenderable }) => (\n\t\t<rui-disclosure-group slot={slot} multiple={multiple} animated={animated}>\n\t\t\t{children}\n\t\t</rui-disclosure-group>\n\t),\n);\n", "import { RadiantElement, customElement, prop } from '@ecopages/radiant';\n\nexport type RuiFeedProps = {\n\tlabel?: string;\n};\n\ntype RuiFeedBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-feed>` \u2014 a section that can load articles as the user scrolls.\n *\n * Implements the APG Feed pattern shell: `role=\"feed\"` with article children.\n * Consumers own infinite-scroll loading; this host provides the landmark + labeling.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/feed/\n * @element rui-feed\n */\n@customElement('rui-feed')\nexport class RuiFeed extends RadiantElement<RuiFeedBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-feed\" role=\"feed\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiFeedProps } from './feed.script';\nimport { RuiFeed as RuiFeedElement } from './feed.script';\nimport './feed.css';\n\nexport type RuiFeedArticle = { id: string; title: string; children: JsxRenderable };\n\nexport const RuiFeed = defineRadiantView(\n\tRuiFeedElement,\n\t({ slot, label, articles }: RuiFeedProps & RadiantSlotProps & { articles: RuiFeedArticle[] }) => (\n\t\t<rui-feed slot={slot} label={label}>\n\t\t\t{articles.map((article, index) => (\n\t\t\t\t<article\n\t\t\t\t\tclass=\"rui-feed__article\"\n\t\t\t\t\taria-labelledby={`feed-${article.id}`}\n\t\t\t\t\taria-posinset={index + 1}\n\t\t\t\t\taria-setsize={articles.length}\n\t\t\t\t>\n\t\t\t\t\t<h3 id={`feed-${article.id}`}>{article.title}</h3>\n\t\t\t\t\t{article.children}\n\t\t\t\t</article>\n\t\t\t))}\n\t\t</rui-feed>\n\t),\n);\n", "import {\n\tRadiantElement,\n\tcustomElement,\n\tonEvent,\n\tonUpdated,\n\tprop,\n\tregisterSsrPreparationCallback,\n} from '@ecopages/radiant';\nimport { consumeContext, onContextUpdate, provideContext } from '@ecopages/radiant/context';\nimport type { ContextProvider } from '@ecopages/radiant/context';\nimport {\n\tfindFieldControl,\n\tfindFieldDescription,\n\tfindFieldError,\n\tfindFieldErrorElements,\n\tfindFieldLabel,\n\tgetAriaControlTarget,\n\treadControlValue,\n\tRUI_FIELD_DEFAULT_VALUE_ATTR,\n\tRUI_FIELD_MANAGED_ATTR,\n\twriteControlValue,\n\twireFieldControlName,\n} from '../form/control-protocol';\nimport { formContext, type FormContextValue } from '../form/form-context';\nimport { fieldContext } from './field-context';\nimport type { FieldRules } from '../form/types';\n\n/**\n * The JSON-safe subset of `FieldRules` for SSR hydration \u2014 a `validate` function can't\n * survive serialization and is dropped, same as any function crossing that boundary.\n */\nfunction stripValidate(rules: FieldRules | undefined): Omit<FieldRules, 'validate'> | undefined {\n\tif (!rules) {\n\t\treturn undefined;\n\t}\n\tconst { validate: _validate, ...serializable } = rules;\n\treturn serializable;\n}\n\nexport type RuiFieldProps = {\n\tname: string;\n\trules?: FieldRules;\n\tdefaultValue?: unknown;\n\tdefaultValueData?: string;\n\tdisabled?: boolean;\n\t/** Standalone error message when not using a form provider. */\n\terror?: string;\n\t/** Standalone invalid flag when not using a form provider. */\n\tinvalid?: boolean;\n};\n\n/**\n * `<rui-field>` \u2014 connector between slotted controls and an ancestor `<rui-form>`.\n *\n * Registers with the form via {@link formContext} actions, forwards control events,\n * and applies presentation (errors, ARIA) from the form-published `fields` map.\n *\n * @element rui-field\n */\n@customElement('rui-field')\nexport class RuiField extends RadiantElement {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) name: string;\n\t@prop({ type: Object }) rules?: FieldRules;\n\t@prop({ type: Object }) defaultValue?: unknown;\n\t@prop({ type: String, attribute: RUI_FIELD_DEFAULT_VALUE_ATTR }) defaultValueData?: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: String, defaultValue: '' }) error: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) invalid: boolean;\n\n\t@provideContext({\n\t\tcontext: fieldContext,\n\t\tinitialValue: {\n\t\t\tname: '',\n\t\t\tcontrolId: '',\n\t\t\tdescriptionId: '',\n\t\t\terrorId: '',\n\t\t\terror: undefined,\n\t\t\tinvalid: false,\n\t\t\trequired: false,\n\t\t},\n\t\thydrate: Object,\n\t\tserialize: (value) => ({ ...value, rules: stripValidate(value.rules) }),\n\t})\n\tfieldProvider: ContextProvider<typeof fieldContext>;\n\n\t@consumeContext(formContext)\n\tprivate formContextProvider?: ContextProvider<typeof formContext>;\n\n\tprivate uid = Math.random().toString(36).slice(2, 9);\n\t/** Resolved field name from property or `name` attribute (Storybook can hydrate props after connect). */\n\tprivate resolveFieldName(): string {\n\t\treturn (this.name || this.getAttribute('name') || '').trim();\n\t}\n\n\tprivate unregister?: () => void;\n\tprivate unregisterPresentation?: () => void;\n\tprivate registeredWithForm = false;\n\n\tconstructor() {\n\t\tsuper();\n\t\t// connectedCallback never runs during real SSR rendering \u2014 only this SSR-prep\n\t\t// lifecycle does, and only after `prop:rules` has already been applied to the\n\t\t// instance. Publishing rules onto fieldProvider here is what lets a hydrated field\n\t\t// recover them after a real SSR round-trip, since `prop:rules` itself doesn't\n\t\t// survive that boundary.\n\t\tregisterSsrPreparationCallback(this, () => this.fieldProvider.setContext({ rules: this.readFieldRules() }));\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.connectToForm();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.connectToForm();\n\t\t});\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.unregister?.();\n\t\tthis.unregister = undefined;\n\t\tthis.unregisterPresentation?.();\n\t\tthis.unregisterPresentation = undefined;\n\t\tthis.registeredWithForm = false;\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate get currentFormContext(): FormContextValue | undefined {\n\t\treturn this.formContextProvider?.getContext();\n\t}\n\n\tprivate parseJsonAttr(raw: string | null | undefined): unknown {\n\t\tif (!raw) {\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\treturn JSON.parse(raw);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Prefers the live `rules` prop \u2014 it's the only channel that can carry a `validate`\n\t * function. Falls back to `fieldProvider`'s own context, which only ever holds the\n\t * JSON-safe subset (see its `serialize` option) \u2014 this is what recovers rules after a\n\t * real SSR hydrate, since `prop:rules` itself doesn't survive that boundary.\n\t */\n\tprivate readFieldRules(): FieldRules | undefined {\n\t\tconst rules = this.rules;\n\t\tif (rules && typeof rules === 'object' && !Array.isArray(rules) && Object.keys(rules).length > 0) {\n\t\t\treturn rules;\n\t\t}\n\t\treturn this.fieldProvider.getContext()?.rules;\n\t}\n\n\tprivate readDefaultValue(): unknown {\n\t\tif (this.defaultValue !== undefined) {\n\t\t\treturn this.defaultValue;\n\t\t}\n\t\treturn this.parseJsonAttr(this.defaultValueData ?? this.getAttribute(RUI_FIELD_DEFAULT_VALUE_ATTR));\n\t}\n\n\tprivate isRequired(): boolean {\n\t\treturn Boolean(this.readFieldRules()?.required);\n\t}\n\n\tprivate resolveErrorMessage(formCtx?: FormContextValue): string | undefined {\n\t\tif (this.error) {\n\t\t\treturn this.error;\n\t\t}\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (!fieldName) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst ctx = formCtx ?? this.currentFormContext;\n\t\treturn ctx?.fields[fieldName]?.error;\n\t}\n\n\tprivate resolveInvalid(formCtx?: FormContextValue): boolean {\n\t\tif (this.invalid) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this.error) {\n\t\t\treturn true;\n\t\t}\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (!fieldName) {\n\t\t\treturn false;\n\t\t}\n\t\tconst ctx = formCtx ?? this.currentFormContext;\n\t\treturn ctx?.fields[fieldName]?.invalid ?? false;\n\t}\n\n\tprivate connectToForm(): void {\n\t\tconst fieldName = this.resolveFieldName();\n\t\tconst ctx = this.currentFormContext;\n\t\tconst actions = ctx?.actions;\n\t\tif (!ctx?.ready || !actions || !fieldName) {\n\t\t\tthis.syncField();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.registeredWithForm) {\n\t\t\tthis.registeredWithForm = true;\n\t\t\tthis.unregisterPresentation?.();\n\t\t\tthis.unregisterPresentation = actions.subscribePresentation((ctx) => this.syncField(ctx));\n\t\t\tthis.unregister = actions.register({\n\t\t\t\tname: fieldName,\n\t\t\t\trules: this.readFieldRules(),\n\t\t\t\tgetRules: () => this.readFieldRules(),\n\t\t\t\tdefaultValue: this.readDefaultValue(),\n\t\t\t\tgetValue: () => {\n\t\t\t\t\tconst control = findFieldControl(this);\n\t\t\t\t\treturn control ? readControlValue(control) : undefined;\n\t\t\t\t},\n\t\t\t\tsetValue: (value) => {\n\t\t\t\t\tconst control = findFieldControl(this);\n\t\t\t\t\tif (control) {\n\t\t\t\t\t\twriteControlValue(control, value);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tactions.updateFieldOptions(fieldName, {\n\t\t\trules: this.readFieldRules(),\n\t\t\tdefaultValue: this.readDefaultValue(),\n\t\t});\n\t\tthis.syncField();\n\t}\n\n\t@onContextUpdate({ context: formContext, requestUpdate: false })\n\tonFormContextChanged(ctx: FormContextValue): void {\n\t\tif (!this.registeredWithForm) {\n\t\t\tif (ctx.ready) {\n\t\t\t\tthis.connectToForm();\n\t\t\t} else {\n\t\t\t\tthis.syncField(ctx);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.syncField(ctx);\n\t}\n\n\t@onUpdated(['name'])\n\tonNameUpdated(): void {\n\t\tthis.unregister?.();\n\t\tthis.unregister = undefined;\n\t\tthis.unregisterPresentation?.();\n\t\tthis.unregisterPresentation = undefined;\n\t\tthis.registeredWithForm = false;\n\t\tthis.connectToForm();\n\t}\n\n\t@onUpdated(['rules', 'defaultValue', 'defaultValueData'])\n\tonRulesUpdated(): void {\n\t\tthis.connectToForm();\n\t}\n\n\t@onUpdated(['disabled', 'error', 'invalid'])\n\tonPresentationUpdated(): void {\n\t\tthis.syncField();\n\t}\n\n\t@onEvent({\n\t\tselector:\n\t\t\t'[data-rui-control], rui-combobox, rui-checkbox, rui-switch, rui-radio-group, rui-slider, rui-spinbutton, rui-listbox',\n\t\ttype: 'rui-change',\n\t})\n\tonControlChange(): void {\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (fieldName) {\n\t\t\tthis.currentFormContext?.actions.handleFieldChange(fieldName);\n\t\t}\n\t}\n\n\t@onEvent({\n\t\tselector: '[data-rui-control], input, textarea',\n\t\ttype: 'input',\n\t\toptions: { capture: true },\n\t})\n\tonControlInput(): void {\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (fieldName) {\n\t\t\tthis.currentFormContext?.actions.handleFieldChange(fieldName);\n\t\t}\n\t}\n\n\t@onEvent({\n\t\tselector: '[data-rui-control], input, textarea',\n\t\ttype: 'change',\n\t\toptions: { capture: true },\n\t})\n\tonControlNativeChange(): void {\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (fieldName) {\n\t\t\tthis.currentFormContext?.actions.handleFieldChange(fieldName);\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-rui-control], input, textarea', type: 'focusout' })\n\tonControlFocusOut(): void {\n\t\tconst fieldName = this.resolveFieldName();\n\t\tif (fieldName) {\n\t\t\tthis.currentFormContext?.actions.handleFieldBlur(fieldName);\n\t\t}\n\t}\n\n\tprivate syncField(formCtx?: FormContextValue): void {\n\t\tconst controlHost = findFieldControl(this);\n\t\tconst ariaTarget = controlHost ? getAriaControlTarget(controlHost) : null;\n\t\tconst controlId = ariaTarget?.id || `rui-field-control-${this.uid}`;\n\t\tconst descriptionId = `rui-field-desc-${this.uid}`;\n\t\tconst errorId = `rui-field-error-${this.uid}`;\n\t\tconst errorMessage = this.resolveErrorMessage(formCtx);\n\t\tconst invalid = this.resolveInvalid(formCtx);\n\t\tconst required = this.isRequired();\n\n\t\tconst fieldName = this.resolveFieldName();\n\t\twireFieldControlName(controlHost, ariaTarget, fieldName);\n\n\t\tif (ariaTarget) {\n\t\t\tif (!ariaTarget.id) {\n\t\t\t\tariaTarget.id = controlId;\n\t\t\t}\n\t\t\tariaTarget.setAttribute(RUI_FIELD_MANAGED_ATTR, '');\n\t\t\tariaTarget.setAttribute('aria-invalid', invalid ? 'true' : 'false');\n\t\t\tif (this.isRequired()) {\n\t\t\t\tariaTarget.setAttribute('aria-required', 'true');\n\t\t\t} else {\n\t\t\t\tariaTarget.removeAttribute('aria-required');\n\t\t\t}\n\n\t\t\tconst describedBy: string[] = [];\n\t\t\tconst description = findFieldDescription(this);\n\t\t\tif (description) {\n\t\t\t\tdescription.id = descriptionId;\n\t\t\t\tdescribedBy.push(descriptionId);\n\t\t\t}\n\t\t\tconst errorEl = findFieldError(this);\n\t\t\tif (errorEl) {\n\t\t\t\terrorEl.id = errorId;\n\t\t\t\tif (errorMessage) {\n\t\t\t\t\tdescribedBy.push(errorId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (describedBy.length > 0) {\n\t\t\t\tariaTarget.setAttribute('aria-describedby', describedBy.join(' '));\n\t\t\t} else {\n\t\t\t\tariaTarget.removeAttribute('aria-describedby');\n\t\t\t}\n\n\t\t\tif (this.disabled) {\n\t\t\t\tariaTarget.setAttribute('aria-disabled', 'true');\n\t\t\t\tif (ariaTarget instanceof HTMLInputElement || ariaTarget instanceof HTMLTextAreaElement) {\n\t\t\t\t\tariaTarget.disabled = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst label = findFieldLabel(this);\n\t\tif (label && ariaTarget) {\n\t\t\tlabel.htmlFor = ariaTarget.id;\n\t\t}\n\n\t\tfor (const errorEl of findFieldErrorElements(this)) {\n\t\t\terrorEl.textContent = errorMessage ?? '';\n\t\t\tif (errorMessage) {\n\t\t\t\terrorEl.hidden = false;\n\t\t\t\terrorEl.removeAttribute('hidden');\n\t\t\t} else {\n\t\t\t\terrorEl.hidden = true;\n\t\t\t}\n\t\t}\n\n\t\tconst nextFieldContext = {\n\t\t\tname: fieldName,\n\t\t\tcontrolId: ariaTarget?.id ?? controlId,\n\t\t\tdescriptionId,\n\t\t\terrorId,\n\t\t\terror: errorMessage,\n\t\t\tinvalid,\n\t\t\trequired,\n\t\t};\n\t\tconst prev = this.fieldProvider.getContext();\n\t\tif (\n\t\t\tprev.name === nextFieldContext.name &&\n\t\t\tprev.controlId === nextFieldContext.controlId &&\n\t\t\tprev.descriptionId === nextFieldContext.descriptionId &&\n\t\t\tprev.errorId === nextFieldContext.errorId &&\n\t\t\tprev.error === nextFieldContext.error &&\n\t\t\tprev.invalid === nextFieldContext.invalid &&\n\t\t\tprev.required === nextFieldContext.required\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldProvider.setContext(nextFieldContext);\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-field\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "export const RUI_CONTROL_ATTR = 'data-rui-control';\nexport const RUI_FIELD_MANAGED_ATTR = 'data-rui-field-managed';\nexport const RUI_FIELD_LABEL_ATTR = 'data-rui-field-label';\nexport const RUI_FIELD_DESCRIPTION_ATTR = 'data-rui-field-description';\nexport const RUI_FIELD_ERROR_ATTR = 'data-rui-field-error';\nexport const RUI_FIELD_DEFAULT_VALUE_ATTR = 'data-default-value';\nexport const RUI_FORM_DEFAULT_VALUES_ATTR = 'data-default-values';\n\nconst HOST_CONTROL_TAGS = new Set([\n\t'rui-combobox',\n\t'rui-checkbox',\n\t'rui-switch',\n\t'rui-radio-group',\n\t'rui-slider',\n\t'rui-spinbutton',\n\t'rui-listbox',\n]);\n\nconst CONTROL_SELECTOR = `[${RUI_CONTROL_ATTR}], ${Array.from(HOST_CONTROL_TAGS).join(', ')}, input, textarea`;\n\ntype FieldSlotHost = HTMLElement & { getSlotElements?: (name?: string) => Element[] };\n\n/** Radiant slot projection moves authored children into the render tree; search projected nodes first. */\nfunction forEachFieldContentNode(root: HTMLElement, visit: (node: Element) => void): void {\n\tconst slotHost = root as FieldSlotHost;\n\tconst visited = new Set<Element>();\n\tconst safeVisit = (node: Element) => {\n\t\tif (visited.has(node)) {\n\t\t\treturn;\n\t\t}\n\t\tvisited.add(node);\n\t\tvisit(node);\n\t};\n\n\tif (typeof slotHost.getSlotElements === 'function') {\n\t\tfor (const node of slotHost.getSlotElements()) {\n\t\t\tsafeVisit(node);\n\t\t}\n\t}\n\n\tconst renderRoot = root.querySelector('.rui-field') ?? root;\n\tfor (const child of Array.from(renderRoot.children)) {\n\t\tsafeVisit(child);\n\t}\n\tfor (const node of renderRoot.querySelectorAll('*')) {\n\t\tsafeVisit(node);\n\t}\n\n\tfor (const child of Array.from(root.children)) {\n\t\tsafeVisit(child);\n\t}\n\n\tconst shadow = root.shadowRoot;\n\tif (shadow) {\n\t\tfor (const child of Array.from(shadow.children)) {\n\t\t\tsafeVisit(child);\n\t\t}\n\t}\n}\n\nfunction queryFieldContent(root: HTMLElement, selector: string): HTMLElement | null {\n\tlet found: HTMLElement | null = null;\n\tforEachFieldContentNode(root, (node) => {\n\t\tif (found || !(node instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.matches(selector)) {\n\t\t\tfound = node;\n\t\t\treturn;\n\t\t}\n\t\tfound = node.querySelector<HTMLElement>(selector);\n\t});\n\treturn found;\n}\n\nfunction pickPrimaryFieldControl(candidates: HTMLElement[]): HTMLElement | null {\n\tif (candidates.length === 0) {\n\t\treturn null;\n\t}\n\tif (candidates.length === 1) {\n\t\treturn candidates[0];\n\t}\n\n\tconst active = document.activeElement;\n\tif (active instanceof HTMLElement) {\n\t\tfor (const candidate of candidates) {\n\t\t\tif (candidate === active || candidate.contains(active)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst visible = candidates.filter(\n\t\t(el) => el.isConnected && el.getClientRects().length > 0 && !el.closest('[hidden],[aria-hidden=\"true\"]'),\n\t);\n\tconst pool = visible.length > 0 ? visible : candidates.filter((el) => el.isConnected);\n\treturn pool[pool.length - 1] ?? candidates[candidates.length - 1];\n}\n\nfunction listFieldControlsInRenderTree(root: HTMLElement): HTMLElement[] {\n\tconst renderRoot = root.querySelector('.rui-field');\n\tif (!(renderRoot instanceof HTMLElement)) {\n\t\treturn [];\n\t}\n\treturn Array.from(renderRoot.querySelectorAll<HTMLElement>(CONTROL_SELECTOR)).filter((el) => root.contains(el));\n}\n\nexport function findFieldControl(root: HTMLElement): HTMLElement | null {\n\tconst fromRenderTree = pickPrimaryFieldControl(listFieldControlsInRenderTree(root));\n\tif (fromRenderTree) {\n\t\treturn fromRenderTree;\n\t}\n\n\tlet found: HTMLElement | null = null;\n\tforEachFieldContentNode(root, (node) => {\n\t\tif (found) {\n\t\t\treturn;\n\t\t}\n\t\tconst match = findControlInSubtree(node);\n\t\tif (match) {\n\t\t\tfound = match;\n\t\t}\n\t});\n\tif (found) {\n\t\treturn found;\n\t}\n\tconst renderRoot = root.querySelector('.rui-field') ?? root;\n\treturn findControlInSubtree(renderRoot);\n}\n\nfunction findControlInSubtree(node: Element): HTMLElement | null {\n\tif (!(node instanceof HTMLElement)) {\n\t\treturn null;\n\t}\n\tif (node.matches(`[${RUI_CONTROL_ATTR}]`)) {\n\t\treturn node;\n\t}\n\tif (HOST_CONTROL_TAGS.has(node.localName)) {\n\t\treturn node;\n\t}\n\tif (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement) {\n\t\treturn node;\n\t}\n\tconst nested = node.querySelector<HTMLElement>(CONTROL_SELECTOR);\n\treturn nested;\n}\n\nexport function readControlValue(control: HTMLElement): unknown {\n\tif (control instanceof HTMLInputElement) {\n\t\tif (control.type === 'checkbox') {\n\t\t\treturn control.checked;\n\t\t}\n\t\tif (control.type === 'number' || control.type === 'range') {\n\t\t\treturn control.value === '' ? '' : Number(control.value);\n\t\t}\n\t\treturn control.value;\n\t}\n\n\tif (control instanceof HTMLTextAreaElement) {\n\t\treturn control.value;\n\t}\n\n\tconst host = resolveControlHost(control);\n\n\tif (host.localName === 'rui-checkbox' || host.localName === 'rui-switch') {\n\t\tconst input = host.querySelector<HTMLInputElement>('input[type=\"checkbox\"]');\n\t\tif (input) {\n\t\t\treturn input.checked;\n\t\t}\n\t\treturn host.hasAttribute('checked');\n\t}\n\n\tif (host.localName === 'rui-combobox' || host.localName === 'rui-radio-group' || host.localName === 'rui-listbox') {\n\t\treturn (host as HTMLElement & { value?: string }).value ?? host.getAttribute('value') ?? '';\n\t}\n\n\tif (host.localName === 'rui-slider' || host.localName === 'rui-spinbutton') {\n\t\tconst propValue = (host as HTMLElement & { value?: number }).value;\n\t\tif (typeof propValue === 'number') {\n\t\t\treturn propValue;\n\t\t}\n\t\tconst raw = host.getAttribute('value');\n\t\treturn raw == null || raw === '' ? '' : Number(raw);\n\t}\n\n\treturn host.getAttribute('value') ?? '';\n}\n\nexport function writeControlValue(control: HTMLElement, value: unknown): void {\n\tif (control instanceof HTMLInputElement) {\n\t\tif (control.type === 'checkbox') {\n\t\t\tcontrol.checked = Boolean(value);\n\t\t\tconst ce = control.closest('rui-checkbox, rui-switch');\n\t\t\tif (ce) {\n\t\t\t\tif (value) {\n\t\t\t\t\tce.setAttribute('checked', '');\n\t\t\t\t} else {\n\t\t\t\t\tce.removeAttribute('checked');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcontrol.value = value == null ? '' : String(value);\n\t\treturn;\n\t}\n\n\tif (control instanceof HTMLTextAreaElement) {\n\t\tcontrol.value = value == null ? '' : String(value);\n\t\treturn;\n\t}\n\n\tconst host = resolveControlHost(control);\n\n\tif (host.localName === 'rui-checkbox' || host.localName === 'rui-switch') {\n\t\tif (value) {\n\t\t\thost.setAttribute('checked', '');\n\t\t} else {\n\t\t\thost.removeAttribute('checked');\n\t\t}\n\t\treturn;\n\t}\n\n\thost.setAttribute('value', value == null ? '' : String(value));\n}\n\nfunction resolveControlHost(control: HTMLElement): HTMLElement {\n\tif (control.hasAttribute(RUI_CONTROL_ATTR)) {\n\t\tconst host = control.closest(Array.from(HOST_CONTROL_TAGS).join(',')) as HTMLElement | null;\n\t\treturn host ?? control;\n\t}\n\treturn control;\n}\n\nexport function findFieldLabel(root: HTMLElement): HTMLLabelElement | null {\n\treturn queryFieldContent(root, `[${RUI_FIELD_LABEL_ATTR}], label.rui-label`) as HTMLLabelElement | null;\n}\n\nexport function findFieldDescription(root: HTMLElement): HTMLElement | null {\n\treturn queryFieldContent(root, `[${RUI_FIELD_DESCRIPTION_ATTR}]`);\n}\n\nexport function findFieldError(root: HTMLElement): HTMLElement | null {\n\tconst all = findFieldErrorElements(root);\n\treturn all[0] ?? null;\n}\n\n/** Every error region in the field (handles duplicate slot-projection copies). */\nexport function findFieldErrorElements(root: HTMLElement): HTMLElement[] {\n\tconst renderRoot = root.querySelector('.rui-field');\n\tif (renderRoot instanceof HTMLElement) {\n\t\tconst inRender = Array.from(renderRoot.querySelectorAll<HTMLElement>(`[${RUI_FIELD_ERROR_ATTR}]`));\n\t\tconst visible = inRender.filter((el) => el.getClientRects().length > 0);\n\t\tif (visible.length > 0) {\n\t\t\treturn visible;\n\t\t}\n\t\tif (inRender.length > 0) {\n\t\t\treturn inRender;\n\t\t}\n\t}\n\tconst fromDom = Array.from(root.querySelectorAll<HTMLElement>(`[${RUI_FIELD_ERROR_ATTR}]`));\n\tif (fromDom.length > 0) {\n\t\treturn fromDom;\n\t}\n\tconst single = queryFieldContent(root, `[${RUI_FIELD_ERROR_ATTR}]`);\n\treturn single ? [single] : [];\n}\n\n/** Syncs the field name onto the native control and custom-element hosts. */\nexport function wireFieldControlName(\n\tcontrolHost: HTMLElement | null,\n\tariaTarget: HTMLElement | null,\n\tname: string,\n): void {\n\tif (!name) {\n\t\treturn;\n\t}\n\n\tif (ariaTarget instanceof HTMLInputElement || ariaTarget instanceof HTMLTextAreaElement) {\n\t\tariaTarget.name = name;\n\t}\n\n\tif (!controlHost) {\n\t\treturn;\n\t}\n\n\tif (controlHost === ariaTarget) {\n\t\treturn;\n\t}\n\n\tif (HOST_CONTROL_TAGS.has(controlHost.localName)) {\n\t\tcontrolHost.setAttribute('name', name);\n\t}\n}\n\n/** Element that receives `id`, `aria-invalid`, and `aria-describedby` from Field. */\nexport function getAriaControlTarget(control: HTMLElement): HTMLElement {\n\tif (control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement) {\n\t\treturn control;\n\t}\n\n\tif (control.hasAttribute(RUI_CONTROL_ATTR)) {\n\t\treturn control;\n\t}\n\n\tconst marked = control.querySelector<HTMLElement>(`[${RUI_CONTROL_ATTR}]`);\n\tif (marked) {\n\t\treturn marked;\n\t}\n\n\tif (control.localName === 'rui-combobox') {\n\t\treturn control.querySelector<HTMLElement>('[data-combobox-input]') ?? control;\n\t}\n\n\tif (control.localName === 'rui-spinbutton') {\n\t\treturn control.querySelector<HTMLElement>('[data-spinbutton-input], input') ?? control;\n\t}\n\n\tif (control.localName === 'rui-slider') {\n\t\treturn control.querySelector<HTMLElement>('input[type=\"range\"]') ?? control;\n\t}\n\n\tif (control.localName === 'rui-checkbox' || control.localName === 'rui-switch') {\n\t\treturn control.querySelector<HTMLElement>('input') ?? control;\n\t}\n\n\tif (control.localName === 'rui-radio-group') {\n\t\tconst checked = control.querySelector<HTMLInputElement>('input[type=\"radio\"]:checked');\n\t\tconst first = control.querySelector<HTMLInputElement>('input[type=\"radio\"]');\n\t\treturn checked ?? first ?? control;\n\t}\n\n\treturn control;\n}\n", "import { createContext } from '@ecopages/radiant/context';\nimport type { FieldRegistration, RegisterOptions } from './types';\n\n/** UI slice for one field, computed by `<rui-form>` from the store. */\nexport type FormFieldPresentation = {\n\terror?: string;\n\tinvalid: boolean;\n};\n\nexport type FormContextActions = {\n\tregister: (registration: FieldRegistration) => () => void;\n\tupdateFieldOptions: (name: string, options: RegisterOptions) => void;\n\thandleFieldChange: (name: string) => void;\n\thandleFieldBlur: (name: string) => void;\n\t/** Notified whenever the form publishes a new presentation snapshot. */\n\tsubscribePresentation: (listener: (value: FormContextValue) => void) => () => void;\n};\n\nexport type FormContextValue = {\n\t/** False until `<rui-form>` has created its store and bound real actions. */\n\tready: boolean;\n\t/** Bumps when form store state changes. */\n\trevision: number;\n\t/** Per-field messages and invalid flags; only the form writes this map. */\n\tfields: Record<string, FormFieldPresentation>;\n\t/** Registration and validation triggers; fields call these instead of touching the store. */\n\tactions: FormContextActions;\n};\n\nexport const formContext = createContext<FormContextValue>(Symbol.for('rui-form-context'));\n", "import { createContext } from '@ecopages/radiant/context';\nimport type { FieldRules } from '../form/types';\n\nexport type FieldContextValue = {\n\tname: string;\n\tcontrolId: string;\n\tdescriptionId: string;\n\terrorId: string;\n\terror?: string;\n\tinvalid: boolean;\n\trequired: boolean;\n\t/**\n\t * The field's own rules, carried across a real SSR round-trip \u2014 `prop:rules` doesn't\n\t * survive that boundary, so `RuiField` republishes them on its own context, hydrated\n\t * client-side from the `<script>` this provider emits. Never carries `validate`; see\n\t * `fieldProvider`'s `serialize` option.\n\t */\n\trules?: FieldRules;\n};\n\nexport const fieldContext = createContext<FieldContextValue>(Symbol.for('rui-field-context'));\n", "import type { WithChildren } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiFieldProps } from './field.script';\nimport { RuiField as RuiFieldElement } from './field.script';\nimport './field.css';\n\nexport const RuiField = defineRadiantView(\n\tRuiFieldElement,\n\t({\n\t\tname,\n\t\trules,\n\t\tdefaultValue,\n\t\tdefaultValueData,\n\t\tdisabled,\n\t\terror,\n\t\tinvalid,\n\t\tchildren,\n\t}: WithChildren<RuiFieldProps>) => (\n\t\t<rui-field\n\t\t\tname={name}\n\t\t\tprop:rules={rules}\n\t\t\tprop:defaultValue={defaultValue}\n\t\t\tdisabled={disabled}\n\t\t\terror={error}\n\t\t\tinvalid={invalid}\n\t\t\tattr:data-default-value={\n\t\t\t\tdefaultValueData ?? (defaultValue !== undefined ? JSON.stringify(defaultValue) : undefined)\n\t\t\t}\n\t\t>\n\t\t\t{children}\n\t\t</rui-field>\n\t),\n);\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport { RUI_FIELD_DESCRIPTION_ATTR } from '../form/control-protocol';\nimport './field.css';\n\nexport type RuiFieldDescriptionProps = {\n\tclass?: string;\n\tchildren: JsxRenderable;\n};\n\n/** Helper text associated with a field via `aria-describedby`. */\nexport function RuiFieldDescription({ class: className, children }: RuiFieldDescriptionProps) {\n\treturn (\n\t\t<p\n\t\t\t{...{ [RUI_FIELD_DESCRIPTION_ATTR]: '' }}\n\t\t\tclass={['rui-field__description', className].filter(Boolean).join(' ')}\n\t\t>\n\t\t\t{children}\n\t\t</p>\n\t);\n}\n", "import { RUI_FIELD_ERROR_ATTR } from '../form/control-protocol';\nimport './field.css';\n\nexport type RuiFieldErrorProps = {\n\tclass?: string;\n};\n\n/**\n * Error message region for a field. Text is populated by `<rui-field>` from form validation\n * or the field's `error` prop.\n */\nexport function RuiFieldError({ class: className }: RuiFieldErrorProps) {\n\treturn (\n\t\t<p\n\t\t\t{...{ [RUI_FIELD_ERROR_ATTR]: '' }}\n\t\t\tclass={['rui-field__error', className].filter(Boolean).join(' ')}\n\t\t\trole=\"alert\"\n\t\t\thidden\n\t\t></p>\n\t);\n}\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport { provideContext } from '@ecopages/radiant/context';\nimport type { ContextProvider } from '@ecopages/radiant/context';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport {\n\tformContext,\n\ttype FormContextActions,\n\ttype FormContextValue,\n\ttype FormFieldPresentation,\n} from './form-context';\nimport { FormStore } from './form-store';\nimport type { FieldValues, Resolver, ValidationMode } from './types';\nimport { RUI_FORM_DEFAULT_VALUES_ATTR } from './control-protocol';\n\nexport type RuiFormProps<T extends FieldValues = FieldValues> = {\n\tdefaultValues?: Partial<T>;\n\t/** JSON default values for SSR / JSX attribute channel. */\n\tdefaultValuesData?: string;\n\tresolver?: Resolver<T>;\n\tmode?: ValidationMode;\n\treValidateMode?: ValidationMode;\n};\n\nexport type RuiFormSubmitDetail<T extends FieldValues = FieldValues> = {\n\tvalues: T;\n};\n\nexport type RuiFormInvalidDetail<T extends FieldValues = FieldValues> = {\n\terrors: Partial<Record<keyof T, { message?: string }>>;\n};\n\nconst noopUnregister = () => {};\n\nconst initialFormActions: FormContextActions = {\n\tregister: () => noopUnregister,\n\tupdateFieldOptions: () => {},\n\thandleFieldChange: () => {},\n\thandleFieldBlur: () => {},\n\tsubscribePresentation: () => noopUnregister,\n};\n\n/**\n * `<rui-form>` \u2014 form coordinator with RHF-like validation and field registration.\n *\n * Owns the {@link FormStore}, publishes field presentation via {@link formContext},\n * and exposes registration / validation entry points for `<rui-field>` connectors.\n *\n * @element rui-form\n * @fires rui-submit - Emitted when validation passes; `detail.values` holds field values.\n * @fires rui-invalid - Emitted when validation fails on submit.\n */\n@customElement('rui-form')\nexport class RuiForm extends RadiantElement {\n\t@provideContext({\n\t\tcontext: formContext,\n\t\tinitialValue: {\n\t\t\tready: false,\n\t\t\trevision: 0,\n\t\t\tfields: {},\n\t\t\tactions: initialFormActions,\n\t\t},\n\t})\n\tformProvider: ContextProvider<typeof formContext>;\n\n\t@event({ name: 'rui-submit', bubbles: true, composed: true })\n\tsubmitEvent: EventEmitter<RuiFormSubmitDetail>;\n\n\t@event({ name: 'rui-invalid', bubbles: true, composed: true })\n\tinvalidEvent: EventEmitter<RuiFormInvalidDetail>;\n\n\t@prop({ type: Object, defaultValue: {} }) defaultValues: FieldValues;\n\t@prop({ type: String, attribute: RUI_FORM_DEFAULT_VALUES_ATTR }) defaultValuesData?: string;\n\t@prop({ type: Object }) resolver?: Resolver<FieldValues>;\n\t@prop({ type: String, reflect: true, defaultValue: 'onSubmit' }) mode: ValidationMode;\n\t@prop({ type: String, reflect: true, attribute: 'revalidate-mode', defaultValue: 'onChange' })\n\treValidateMode: ValidationMode;\n\n\tprivate store: FormStore | undefined;\n\tprivate unsubscribeStore?: () => void;\n\tprivate readonly nativeFormId = `rui-form-native-${Math.random().toString(36).slice(2, 9)}`;\n\tprivate lastPublishedRevision = -1;\n\tprivate lastPublishedContext: FormContextValue | undefined;\n\tprivate readonly presentationListeners = new Set<(value: FormContextValue) => void>();\n\tprivate readonly formActions: FormContextActions = {\n\t\tregister: (registration) => {\n\t\t\tconst store = this.ensureStore();\n\t\t\tconst unregister = store.register(registration);\n\t\t\tthis.publishFormContext({ force: true });\n\t\t\treturn () => {\n\t\t\t\tunregister();\n\t\t\t\tthis.publishFormContext({ force: true });\n\t\t\t};\n\t\t},\n\t\tupdateFieldOptions: (name, options) => {\n\t\t\tthis.ensureStore().updateFieldOptions(name, options);\n\t\t},\n\t\thandleFieldChange: (name) => {\n\t\t\tvoid this.ensureStore()\n\t\t\t\t.handleFieldChange(name)\n\t\t\t\t.then(() => this.publishFormContext({ force: true }));\n\t\t},\n\t\thandleFieldBlur: (name) => {\n\t\t\tvoid this.ensureStore()\n\t\t\t\t.handleFieldBlur(name)\n\t\t\t\t.then(() => this.publishFormContext({ force: true }));\n\t\t},\n\t\tsubscribePresentation: (listener) => {\n\t\t\tthis.presentationListeners.add(listener);\n\t\t\tif (this.lastPublishedContext) {\n\t\t\t\tlistener(this.lastPublishedContext);\n\t\t\t}\n\t\t\treturn () => this.presentationListeners.delete(listener);\n\t\t},\n\t};\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.ensureStore();\n\t\tthis.publishFormContext({ force: true });\n\t\tqueueMicrotask(() => this.wireOrphanSubmitButtons());\n\t}\n\n\tprivate queryNativeForm(): HTMLFormElement | null {\n\t\treturn this.getRef<HTMLFormElement>('form') ?? this.querySelector('form.rui-form');\n\t}\n\n\t/** Link submit buttons left on the host (outside the inner `<form>`) after slot projection. */\n\tprivate wireOrphanSubmitButtons(): void {\n\t\tconst formEl = this.queryNativeForm();\n\t\tif (!formEl) {\n\t\t\treturn;\n\t\t}\n\t\tif (!formEl.id) {\n\t\t\tformEl.id = this.nativeFormId;\n\t\t}\n\t\tfor (const btn of this.querySelectorAll<HTMLButtonElement>('button[type=submit]')) {\n\t\t\tif (formEl.contains(btn)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbtn.setAttribute('form', formEl.id);\n\t\t}\n\t}\n\n\tprivate runFormSubmit(): void {\n\t\tconst store = this.ensureStore();\n\t\tvoid store.handleSubmit(\n\t\t\t(values) => {\n\t\t\t\tthis.submitEvent.emit({ values });\n\t\t\t},\n\t\t\t(errors) => {\n\t\t\t\tthis.invalidEvent.emit({ errors });\n\t\t\t},\n\t\t);\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.unsubscribeStore?.();\n\t\tthis.unsubscribeStore = undefined;\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate resolveMode(): ValidationMode {\n\t\tconst fromAttr = this.getAttribute('mode');\n\t\tif (fromAttr) {\n\t\t\treturn fromAttr as ValidationMode;\n\t\t}\n\t\treturn this.mode ?? 'onSubmit';\n\t}\n\n\tprivate resolveReValidateMode(): ValidationMode {\n\t\tconst fromAttr = this.getAttribute('revalidate-mode');\n\t\tif (fromAttr) {\n\t\t\treturn fromAttr as ValidationMode;\n\t\t}\n\t\treturn this.reValidateMode ?? 'onChange';\n\t}\n\n\tprivate resolveDefaultValues(): FieldValues {\n\t\tif (this.defaultValues && Object.keys(this.defaultValues).length > 0) {\n\t\t\treturn this.defaultValues;\n\t\t}\n\t\tconst raw = this.defaultValuesData ?? this.getAttribute(RUI_FORM_DEFAULT_VALUES_ATTR);\n\t\tif (!raw) {\n\t\t\treturn this.defaultValues ?? {};\n\t\t}\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(raw) as FieldValues;\n\t\t\treturn parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};\n\t\t} catch {\n\t\t\treturn this.defaultValues ?? {};\n\t\t}\n\t}\n\n\tprivate ensureStore(): FormStore {\n\t\tif (this.store) {\n\t\t\treturn this.store;\n\t\t}\n\n\t\tthis.store = new FormStore({\n\t\t\tdefaultValues: this.resolveDefaultValues(),\n\t\t\tresolver: typeof this.resolver === 'function' ? this.resolver : undefined,\n\t\t\tmode: this.resolveMode(),\n\t\t\treValidateMode: this.resolveReValidateMode(),\n\t\t});\n\t\tthis.unsubscribeStore = this.store.subscribe(() => this.publishFormContext());\n\t\treturn this.store;\n\t}\n\n\tprivate buildFieldPresentations(store: FormStore): Record<string, FormFieldPresentation> {\n\t\tconst fields: Record<string, FormFieldPresentation> = {};\n\t\tfor (const name of store.getRegisteredFieldNames()) {\n\t\t\tconst message = store.getFieldError(name);\n\t\t\tconst show = store.shouldDisplayFieldError(name);\n\t\t\tfields[name] = {\n\t\t\t\terror: show ? message : undefined,\n\t\t\t\tinvalid: Boolean(show && message),\n\t\t\t};\n\t\t}\n\t\treturn fields;\n\t}\n\n\tprivate publishFormContext(options?: { force?: boolean }): void {\n\t\tconst store = this.store;\n\t\tif (!store) {\n\t\t\treturn;\n\t\t}\n\t\tconst revision = store.getRevision();\n\t\tif (!options?.force && revision === this.lastPublishedRevision) {\n\t\t\treturn;\n\t\t}\n\t\tthis.lastPublishedRevision = revision;\n\t\tconst nextContext = {\n\t\t\tready: true,\n\t\t\trevision,\n\t\t\tfields: this.buildFieldPresentations(store),\n\t\t\tactions: this.formActions,\n\t\t} satisfies FormContextValue;\n\t\tthis.lastPublishedContext = nextContext;\n\t\tthis.formProvider.setContext(nextContext);\n\t\tfor (const listener of this.presentationListeners) {\n\t\t\tlistener(nextContext);\n\t\t}\n\t}\n\n\t@onUpdated(['defaultValues', 'defaultValuesData', 'mode', 'reValidateMode'])\n\tsyncOptions(): void {\n\t\tconst store = this.ensureStore();\n\t\tstore.updateOptions({\n\t\t\tdefaultValues: this.resolveDefaultValues(),\n\t\t\tmode: this.resolveMode(),\n\t\t\treValidateMode: this.resolveReValidateMode(),\n\t\t});\n\t}\n\n\t@onUpdated(['resolver'])\n\tsyncResolver(): void {\n\t\tif (typeof this.resolver === 'function') {\n\t\t\tthis.ensureStore().updateOptions({ resolver: this.resolver });\n\t\t}\n\t}\n\n\t/** Save clicks must run validation even when the button is not associated with the inner `<form>`. */\n\t@onEvent({ selector: 'button[type=submit]', type: 'click' })\n\tonSubmitButtonClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tthis.runFormSubmit();\n\t}\n\n\t@onEvent({ ref: 'form', type: 'submit' })\n\tonNativeSubmit(event: SubmitEvent): void {\n\t\tevent.preventDefault();\n\t\tthis.runFormSubmit();\n\t}\n\n\t@onEvent({ ref: 'form', type: 'reset' })\n\tonNativeReset(): void {\n\t\tthis.store?.reset();\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<form class=\"rui-form\" data-ref=\"form\" noValidate>\n\t\t\t\t<slot></slot>\n\t\t\t</form>\n\t\t);\n\t}\n}\n", "import type { FieldRules, FieldValues, Resolver, ResolverContext, ResolverResult } from './types';\n\nfunction resolveRuleMessage(\n\tfallback: string,\n\trule: boolean | string | number | { value: unknown; message: string } | undefined,\n): string | undefined {\n\tif (rule === undefined || rule === false) {\n\t\treturn undefined;\n\t}\n\tif (typeof rule === 'string') {\n\t\treturn rule;\n\t}\n\tif (typeof rule === 'object' && rule !== null && 'message' in rule && typeof rule.message === 'string') {\n\t\treturn rule.message;\n\t}\n\treturn fallback;\n}\n\nfunction ruleValue<T>(rule: T | { value: T; message: string }): T {\n\tif (typeof rule === 'object' && rule !== null && 'value' in rule) {\n\t\treturn rule.value as T;\n\t}\n\treturn rule as T;\n}\n\nasync function validateFieldRules(\n\t_valueName: string,\n\tvalue: unknown,\n\trules: FieldRules | undefined,\n\tvalues: FieldValues,\n): Promise<string | undefined> {\n\tif (!rules) {\n\t\treturn undefined;\n\t}\n\n\tif (rules.required) {\n\t\tconst empty =\n\t\t\tvalue === undefined ||\n\t\t\tvalue === null ||\n\t\t\tvalue === '' ||\n\t\t\t(Array.isArray(value) && value.length === 0) ||\n\t\t\tvalue === false;\n\t\tif (empty) {\n\t\t\treturn resolveRuleMessage('This field is required', rules.required) ?? 'This field is required';\n\t\t}\n\t}\n\n\tif (typeof value === 'number' || (typeof value === 'string' && value !== '' && !Number.isNaN(Number(value)))) {\n\t\tconst num = typeof value === 'number' ? value : Number(value);\n\t\tif (rules.min !== undefined && num < ruleValue(rules.min)) {\n\t\t\treturn resolveRuleMessage(`Minimum value is ${ruleValue(rules.min)}`, rules.min);\n\t\t}\n\t\tif (rules.max !== undefined && num > ruleValue(rules.max)) {\n\t\t\treturn resolveRuleMessage(`Maximum value is ${ruleValue(rules.max)}`, rules.max);\n\t\t}\n\t}\n\n\tconst str = value == null ? '' : String(value);\n\tif (rules.minLength !== undefined && str.length < ruleValue(rules.minLength)) {\n\t\treturn resolveRuleMessage(`Minimum length is ${ruleValue(rules.minLength)}`, rules.minLength);\n\t}\n\tif (rules.maxLength !== undefined && str.length > ruleValue(rules.maxLength)) {\n\t\treturn resolveRuleMessage(`Maximum length is ${ruleValue(rules.maxLength)}`, rules.maxLength);\n\t}\n\tif (rules.pattern !== undefined) {\n\t\tconst pattern = ruleValue(rules.pattern);\n\t\tif (!pattern.test(str)) {\n\t\t\tconst patternRule = rules.pattern;\n\t\t\tconst message =\n\t\t\t\ttypeof patternRule === 'object' && 'message' in patternRule && typeof patternRule.message === 'string'\n\t\t\t\t\t? patternRule.message\n\t\t\t\t\t: 'Invalid format';\n\t\t\treturn message;\n\t\t}\n\t}\n\n\tif (rules.validate) {\n\t\tif (typeof rules.validate === 'function') {\n\t\t\tconst result = await rules.validate(value, values);\n\t\t\tif (result === true || result === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (result === false) {\n\t\t\t\treturn 'Invalid value';\n\t\t\t}\n\t\t\treturn String(result);\n\t\t}\n\n\t\tfor (const key of Object.keys(rules.validate)) {\n\t\t\tconst fn = rules.validate[key];\n\t\t\tconst result = await fn(value, values);\n\t\t\tif (result !== true && result !== undefined) {\n\t\t\t\treturn result === false ? 'Invalid value' : String(result);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport async function runRulesResolver<T extends FieldValues>(\n\tvalues: T,\n\tcontext: ResolverContext,\n\tnames?: string[],\n): Promise<ResolverResult<T>> {\n\tconst targetNames = names ?? Object.keys(context.fields);\n\tconst errors: Partial<Record<keyof T, { type: string; message: string }>> = {};\n\n\tfor (const name of targetNames) {\n\t\tconst rules = context.fields[name]?.rules;\n\t\tconst message = await validateFieldRules(name, values[name], rules, values);\n\t\tif (message) {\n\t\t\terrors[name as keyof T] = { type: 'validation', message };\n\t\t}\n\t}\n\n\tif (Object.keys(errors).length > 0) {\n\t\treturn { values: {} as Record<string, never>, errors };\n\t}\n\n\treturn { values, errors: {} as Record<string, never> };\n}\n\nexport function createRulesResolver<T extends FieldValues>(): Resolver<T> {\n\treturn (values, context, options) => runRulesResolver(values, context, options.names);\n}\n", "import { createRulesResolver } from './resolvers';\nimport type {\n\tFieldError,\n\tFieldRegistration,\n\tFieldRules,\n\tFieldValues,\n\tFormState,\n\tRegisterOptions,\n\tResolver,\n\tValidationMode,\n} from './types';\n\nexport type FormStoreOptions<T extends FieldValues> = {\n\tdefaultValues?: Partial<T>;\n\tvalues?: Partial<T>;\n\tresolver?: Resolver<T>;\n\tmode?: ValidationMode;\n\treValidateMode?: ValidationMode;\n};\n\ntype InternalField = FieldRegistration & {\n\trules?: FieldRules;\n\tdefaultValue?: unknown;\n\tgetRules?: () => FieldRules | undefined;\n};\n\nfunction normalizeResolver<T extends FieldValues>(resolver: unknown): Resolver<T> {\n\tif (typeof resolver === 'function') {\n\t\treturn resolver as Resolver<T>;\n\t}\n\treturn createRulesResolver<T>();\n}\n\nexport class FormStore<T extends FieldValues = FieldValues> {\n\tmode: ValidationMode;\n\treValidateMode: ValidationMode;\n\tprivate resolver: Resolver<T>;\n\tprivate readonly fields = new Map<string, InternalField>();\n\tprivate listeners = new Set<() => void>();\n\tprivate revision = 0;\n\tprivate defaultValues: Partial<T>;\n\n\tvalues: T;\n\terrors: Partial<Record<keyof T, FieldError>> = {};\n\ttouched: Partial<Record<keyof T, boolean>> = {};\n\tdirty: Partial<Record<keyof T, boolean>> = {};\n\tisSubmitting = false;\n\tisSubmitted = false;\n\n\tconstructor(options: FormStoreOptions<T> = {}) {\n\t\tthis.mode = options.mode ?? 'onSubmit';\n\t\tthis.reValidateMode = options.reValidateMode ?? 'onChange';\n\t\tthis.resolver = normalizeResolver(options.resolver);\n\t\tthis.defaultValues = { ...(options.defaultValues ?? {}) } as Partial<T>;\n\t\tthis.values = { ...this.defaultValues, ...(options.values ?? {}) } as T;\n\t}\n\n\t/** Update options without dropping registered fields. */\n\tupdateOptions(options: FormStoreOptions<T>): void {\n\t\tif (options.mode !== undefined) {\n\t\t\tthis.mode = options.mode;\n\t\t}\n\t\tif (options.reValidateMode !== undefined) {\n\t\t\tthis.reValidateMode = options.reValidateMode;\n\t\t}\n\t\tif (options.resolver !== undefined) {\n\t\t\tthis.resolver = normalizeResolver(options.resolver);\n\t\t}\n\t\tif (options.defaultValues !== undefined) {\n\t\t\tthis.defaultValues = { ...(options.defaultValues as Partial<T>) };\n\t\t}\n\t}\n\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\tprivate notify(): void {\n\t\tthis.revision += 1;\n\t\tfor (const listener of this.listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tgetRevision(): number {\n\t\treturn this.revision;\n\t}\n\n\tgetRegisteredFieldNames(): string[] {\n\t\treturn Array.from(this.fields.keys());\n\t}\n\n\tregister(registration: FieldRegistration): () => void {\n\t\tconst existing = this.fields.get(registration.name);\n\t\tconst entry: InternalField = {\n\t\t\t...registration,\n\t\t\trules: registration.rules ?? existing?.rules,\n\t\t\tdefaultValue: registration.defaultValue ?? existing?.defaultValue,\n\t\t\tgetRules: registration.getRules ?? existing?.getRules,\n\t\t};\n\t\tthis.fields.set(registration.name, entry);\n\n\t\tif (this.values[registration.name as keyof T] === undefined && entry.defaultValue !== undefined) {\n\t\t\tthis.values = { ...this.values, [registration.name]: entry.defaultValue } as T;\n\t\t}\n\n\t\tentry.setValue(this.values[registration.name as keyof T]);\n\n\t\treturn () => {\n\t\t\tconst current = this.fields.get(registration.name);\n\t\t\tif (current === entry) {\n\t\t\t\tthis.fields.delete(registration.name);\n\t\t\t\tthis.notify();\n\t\t\t}\n\t\t};\n\t}\n\n\tupdateFieldOptions(name: string, options: RegisterOptions): void {\n\t\tconst field = this.fields.get(name);\n\t\tif (!field) {\n\t\t\treturn;\n\t\t}\n\t\tif (options.rules !== undefined) {\n\t\t\tfield.rules = options.rules;\n\t\t}\n\t\tif (options.defaultValue !== undefined) {\n\t\t\tfield.defaultValue = options.defaultValue;\n\t\t}\n\t}\n\n\tgetValues(): T {\n\t\tconst next = { ...this.values } as T;\n\t\tfor (const [name, field] of this.fields) {\n\t\t\tnext[name as keyof T] = field.getValue() as T[keyof T];\n\t\t}\n\t\treturn next;\n\t}\n\n\tsetValue(name: keyof T, value: unknown, options?: { shouldDirty?: boolean; shouldTouch?: boolean }): void {\n\t\tthis.values = { ...this.values, [name]: value } as T;\n\t\tconst field = this.fields.get(String(name));\n\t\tfield?.setValue(value);\n\t\tif (options?.shouldDirty) {\n\t\t\tthis.dirty = { ...this.dirty, [name]: true };\n\t\t}\n\t\tif (options?.shouldTouch) {\n\t\t\tthis.touched = { ...this.touched, [name]: true };\n\t\t}\n\t\tthis.notify();\n\t}\n\n\tmarkTouched(name: string): void {\n\t\tthis.touched = { ...this.touched, [name]: true };\n\t\tthis.notify();\n\t}\n\n\tmarkDirty(name: string): void {\n\t\tthis.dirty = { ...this.dirty, [name]: true };\n\t\tthis.notify();\n\t}\n\n\tclearErrors(name?: string): void {\n\t\tif (name) {\n\t\t\tconst next = { ...this.errors };\n\t\t\tdelete next[name as keyof T];\n\t\t\tthis.errors = next;\n\t\t\tthis.notify();\n\t\t\treturn;\n\t\t}\n\t\tthis.errors = {};\n\t\tthis.notify();\n\t}\n\n\tgetFieldError(name: string): string | undefined {\n\t\treturn this.errors[name as keyof T]?.message;\n\t}\n\n\tgetState(): FormState<T> {\n\t\tconst values = this.getValues();\n\t\tconst errorCount = Object.keys(this.errors).length;\n\t\treturn {\n\t\t\tvalues,\n\t\t\terrors: this.errors,\n\t\t\ttouched: this.touched,\n\t\t\tdirty: this.dirty,\n\t\t\tisSubmitting: this.isSubmitting,\n\t\t\tisSubmitted: this.isSubmitted,\n\t\t\tisValid: errorCount === 0,\n\t\t};\n\t}\n\n\tasync validateField(name: string): Promise<boolean> {\n\t\tconst values = this.getValues();\n\t\tconst result = await this.resolver(values, { fields: this.buildResolverFields() }, { names: [name] });\n\t\tconst message = result.errors[name as keyof T]?.message;\n\t\tconst next = { ...this.errors };\n\t\tif (message) {\n\t\t\tnext[name as keyof T] = { type: 'validation', message };\n\t\t} else {\n\t\t\tdelete next[name as keyof T];\n\t\t}\n\t\tthis.errors = next;\n\t\tthis.notify();\n\t\treturn !message;\n\t}\n\n\tasync validateAll(): Promise<boolean> {\n\t\tconst values = this.getValues();\n\t\tconst result = await this.resolver(values, { fields: this.buildResolverFields() }, {});\n\t\tthis.errors = result.errors as Partial<Record<keyof T, FieldError>>;\n\t\tthis.notify();\n\t\treturn Object.keys(this.errors).length === 0;\n\t}\n\n\tshouldValidate(name: string, trigger: 'change' | 'blur'): boolean {\n\t\tconst mode = this.isSubmitted ? this.reValidateMode : this.mode;\n\n\t\tswitch (mode) {\n\t\t\tcase 'all':\n\t\t\t\treturn true;\n\t\t\tcase 'onChange':\n\t\t\t\treturn trigger === 'change';\n\t\t\tcase 'onBlur':\n\t\t\t\treturn trigger === 'blur';\n\t\t\tcase 'onTouched':\n\t\t\t\treturn trigger === 'blur' && Boolean(this.touched[name as keyof T]);\n\t\t\tcase 'onSubmit':\n\t\t\t\treturn false;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync handleFieldChange(name: string): Promise<void> {\n\t\tconst field = this.fields.get(name);\n\t\tif (!field) {\n\t\t\treturn;\n\t\t}\n\t\tconst value = field.getValue();\n\t\tthis.values = { ...this.values, [name]: value } as T;\n\t\tthis.dirty = { ...this.dirty, [name]: true };\n\t\tif (this.shouldValidate(name, 'change')) {\n\t\t\tawait this.validateField(name);\n\t\t} else {\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tasync handleFieldBlur(name: string): Promise<void> {\n\t\tthis.markTouched(name);\n\t\tif (this.shouldValidate(name, 'blur')) {\n\t\t\tawait this.validateField(name);\n\t\t} else {\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\t/** Whether a field's validation message should be shown in the UI (RHF-style). */\n\tshouldDisplayFieldError(name: string): boolean {\n\t\tconst message = this.errors[name as keyof T]?.message;\n\t\tif (!message) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isSubmitted) {\n\t\t\treturn true;\n\t\t}\n\n\t\tswitch (this.mode) {\n\t\t\tcase 'all':\n\t\t\t\treturn Boolean(this.dirty[name as keyof T] || this.touched[name as keyof T]);\n\t\t\tcase 'onChange':\n\t\t\t\treturn Boolean(this.dirty[name as keyof T]);\n\t\t\tcase 'onBlur':\n\t\t\tcase 'onTouched':\n\t\t\t\treturn Boolean(this.touched[name as keyof T]);\n\t\t\tcase 'onSubmit':\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync handleSubmit(\n\t\tonValid: (values: T) => void | Promise<void>,\n\t\tonInvalid?: (errors: Partial<Record<keyof T, FieldError>>) => void,\n\t): Promise<void> {\n\t\tthis.isSubmitting = true;\n\t\tthis.isSubmitted = true;\n\n\t\tfor (const name of this.fields.keys()) {\n\t\t\tthis.touched = { ...this.touched, [name]: true };\n\t\t}\n\t\tthis.notify();\n\n\t\tconst valid = await this.validateAll();\n\t\tthis.isSubmitting = false;\n\t\tthis.notify();\n\n\t\tif (valid) {\n\t\t\tawait onValid(this.getValues());\n\t\t\treturn;\n\t\t}\n\n\t\tonInvalid?.(this.errors);\n\t}\n\n\treset(values?: Partial<T>): void {\n\t\tconst nextDefaults = values ?? { ...this.defaultValues, ...this.collectFieldDefaults() };\n\t\tthis.values = { ...nextDefaults } as T;\n\t\tthis.errors = {};\n\t\tthis.touched = {};\n\t\tthis.dirty = {};\n\t\tthis.isSubmitted = false;\n\t\tthis.isSubmitting = false;\n\t\tfor (const field of this.fields.values()) {\n\t\t\tfield.setValue(this.values[field.name as keyof T]);\n\t\t}\n\t\tthis.notify();\n\t}\n\n\tprivate collectFieldDefaults(): Partial<T> {\n\t\tconst defaults: Partial<T> = {};\n\t\tfor (const [name, field] of this.fields) {\n\t\t\tif (field.defaultValue !== undefined) {\n\t\t\t\tdefaults[name as keyof T] = field.defaultValue as T[keyof T];\n\t\t\t}\n\t\t}\n\t\treturn defaults;\n\t}\n\n\tprivate buildResolverFields(): Record<string, { rules?: FieldRules }> {\n\t\tconst fields: Record<string, { rules?: FieldRules }> = {};\n\t\tfor (const [name, field] of this.fields) {\n\t\t\tconst rules = field.getRules?.() ?? field.rules;\n\t\t\tfields[name] = { rules };\n\t\t}\n\t\treturn fields;\n\t}\n}\n", "import type { WithChildren } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiFormProps } from './form.script';\nimport { RuiForm as RuiFormElement } from './form.script';\nimport './form.css';\n\nexport const RuiForm = defineRadiantView(\n\tRuiFormElement,\n\t({ defaultValues, defaultValuesData, resolver, mode, reValidateMode, children }: WithChildren<RuiFormProps>) => (\n\t\t<rui-form\n\t\t\tmode={mode}\n\t\t\treValidateMode={reValidateMode}\n\t\t\tattr:revalidate-mode={reValidateMode}\n\t\t\tprop:defaultValues={defaultValues}\n\t\t\tprop:resolver={resolver}\n\t\t\tattr:data-default-values={\n\t\t\t\tdefaultValuesData ?? (defaultValues !== undefined ? JSON.stringify(defaultValues) : undefined)\n\t\t\t}\n\t\t>\n\t\t\t{children}\n\t\t</rui-form>\n\t),\n);\n\nexport type { RuiFormSubmitDetail, RuiFormInvalidDetail } from './form.script';\n", "import { RadiantElement, customElement, onEvent, prop } from '@ecopages/radiant';\nimport { applyRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiGridProps = {\n\tlabel?: string;\n};\n\ntype RuiGridBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-grid>` \u2014 an interactive grid navigated with arrow keys.\n *\n * Implements a simplified APG Grid pattern for layout/data cells with\n * `role=\"grid\"`, `role=\"row\"`, and `role=\"gridcell\"`. Row length is taken from\n * the authored markup \u2014 do not pass a separate column count.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n * @element rui-grid\n */\n@customElement('rui-grid')\nexport class RuiGrid extends RadiantElement<RuiGridBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tconst cells = Array.from(this.querySelectorAll<HTMLElement>('[role=\"gridcell\"]'));\n\t\t\tapplyRovingTabindex(cells, 0);\n\t\t});\n\t}\n\n\tprivate getRows(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"row\"]'));\n\t}\n\n\t@onEvent({ selector: '[role=\"gridcell\"]', type: 'keydown' })\n\tonKeydown(event: KeyboardEvent): void {\n\t\tconst rows = this.getRows();\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"gridcell\"]') as HTMLElement | null;\n\t\tif (!current) return;\n\n\t\tconst row = current.parentElement as HTMLElement;\n\t\tconst rowIndex = rows.indexOf(row);\n\t\tconst cells = Array.from(row.querySelectorAll<HTMLElement>('[role=\"gridcell\"]'));\n\t\tconst colIndex = cells.indexOf(current);\n\n\t\tlet nextRow = rowIndex;\n\t\tlet nextCol = colIndex;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\t\tnextCol = Math.min(cells.length - 1, colIndex + 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tnextCol = Math.max(0, colIndex - 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tnextRow = Math.min(rows.length - 1, rowIndex + 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tnextRow = Math.max(0, rowIndex - 1);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tnextCol = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tnextCol = cells.length - 1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tconst targetRow = rows[nextRow];\n\t\tconst targetCells = Array.from(targetRow.querySelectorAll<HTMLElement>('[role=\"gridcell\"]'));\n\t\tconst target = targetCells[Math.min(nextCol, targetCells.length - 1)];\n\t\tconst allCells = Array.from(this.querySelectorAll<HTMLElement>('[role=\"gridcell\"]'));\n\t\tapplyRovingTabindex(allCells, allCells.indexOf(target));\n\t\ttarget.focus();\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-grid\" role=\"grid\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiGridProps } from './grid.script';\nimport { RuiGrid as RuiGridElement } from './grid.script';\nimport './grid.css';\n\nexport const RuiGrid = defineRadiantView(\n\tRuiGridElement,\n\t({ slot, label, rows }: RuiGridProps & RadiantSlotProps & { rows: JsxRenderable[][] }) => (\n\t\t<rui-grid slot={slot} label={label}>\n\t\t\t{rows.map((row) => (\n\t\t\t\t<div class=\"rui-grid__row\" role=\"row\">\n\t\t\t\t\t{row.map((cell) => (\n\t\t\t\t\t\t<div class=\"rui-grid__cell\" role=\"gridcell\" tabindex={-1}>\n\t\t\t\t\t\t\t{cell}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</rui-grid>\n\t),\n);\n", "import { RUI_CONTROL_ATTR } from '../form/control-protocol';\nimport './input.css';\n\nexport type RuiInputSize = 'sm' | 'md' | 'lg';\n\nexport type RuiInputProps = {\n\tvalue?: string;\n\ttype?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tname?: string;\n\tsize?: RuiInputSize;\n\tclass?: string;\n\tid?: string;\n\t'aria-label'?: string;\n\t'on:input'?: (event: Event) => void;\n\t'on:change'?: (event: Event) => void;\n\t'on:blur'?: (event: Event) => void;\n};\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\n/**\n * Presentational wrapper around a native `<input>`.\n *\n * No custom element \u2014 Field owns labeling, `aria-*`, and validation wiring.\n * Marked with `data-rui-control` so `<rui-field>` can discover it.\n */\nexport function RuiInput({\n\tvalue,\n\ttype = 'text',\n\tplaceholder,\n\tdisabled,\n\tname,\n\tsize = 'md',\n\tclass: className,\n\tid,\n\t'aria-label': ariaLabel,\n\t'on:input': onInput,\n\t'on:change': onChange,\n\t'on:blur': onBlur,\n\t...rest\n}: RuiInputProps) {\n\treturn (\n\t\t<input\n\t\t\tid={id}\n\t\t\ttype={type}\n\t\t\t{...{ [RUI_CONTROL_ATTR]: '' }}\n\t\t\tdata-rui-control-type=\"text\"\n\t\t\tclass={cx('rui-input', `rui-input--${size}`, className)}\n\t\t\tvalue={value}\n\t\t\tplaceholder={placeholder}\n\t\t\tdisabled={disabled}\n\t\t\tname={name}\n\t\t\taria-label={ariaLabel}\n\t\t\ton:input={onInput}\n\t\t\ton:change={onChange}\n\t\t\ton:blur={onBlur}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport { RUI_FIELD_LABEL_ATTR } from '../form/control-protocol';\nimport './label.css';\n\nexport type RuiLabelProps = {\n\thtmlFor?: string;\n\tclass?: string;\n\tchildren: JsxRenderable;\n};\n\n/** Shared label styles for form fields. */\nexport function RuiLabel({ htmlFor, class: className, children }: RuiLabelProps) {\n\treturn (\n\t\t<label\n\t\t\t{...{ [RUI_FIELD_LABEL_ATTR]: '' }}\n\t\t\tclass={['rui-label', className].filter(Boolean).join(' ')}\n\t\t\thtmlFor={htmlFor}\n\t\t>\n\t\t\t{children}\n\t\t</label>\n\t);\n}\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiListboxProps = {\n\tvalue?: string;\n\tlabel?: string;\n\tdisabled?: boolean;\n};\n\nexport type RuiListboxChangeDetail = { value: string };\n\ntype RuiListboxBindings = {\n\tlabel: string;\n\tdisabled: boolean;\n};\n\n/**\n * `<rui-listbox>` \u2014 a list of options where one may be selected.\n *\n * Implements the APG Listbox pattern with roving tabindex on `[role=\"option\"]`.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/listbox/\n * @element rui-listbox\n * @fires rui-change\n */\n@customElement('rui-listbox')\nexport class RuiListbox extends RadiantElement<RuiListboxBindings> {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiListboxChangeDetail>;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\tprivate readonly resolvedAriaDisabled = this.$.disabled.map((disabled) => (disabled ? 'true' : undefined));\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => this.sync());\n\t}\n\n\t@onUpdated(['value', 'disabled'])\n\tonPropsUpdated(): void {\n\t\tthis.sync();\n\t}\n\n\tprivate getOptions(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"option\"]'));\n\t}\n\n\tprivate sync(): void {\n\t\tconst options = this.getOptions();\n\t\tfor (const option of options) {\n\t\t\tconst selected = option.getAttribute('data-value') === this.value;\n\t\t\toption.setAttribute('aria-selected', String(selected));\n\t\t\toption.tabIndex = selected || (!this.value && option === options[0]) ? 0 : -1;\n\t\t}\n\t}\n\n\tprivate select(option: HTMLElement): void {\n\t\tif (this.disabled || option.getAttribute('aria-disabled') === 'true') return;\n\t\tthis.value = option.getAttribute('data-value') || option.textContent?.trim() || '';\n\t\tthis.sync();\n\t\tthis.changeEvent.emit({ value: this.value });\n\t\toption.focus();\n\t}\n\n\t@onEvent({ selector: '[role=\"option\"]', type: 'click' })\n\tonOptionClick(event: Event): void {\n\t\tconst option = (event.target as HTMLElement).closest('[role=\"option\"]') as HTMLElement | null;\n\t\tif (option && this.contains(option)) this.select(option);\n\t}\n\n\t@onEvent({ selector: '[role=\"option\"]', type: 'keydown' })\n\tonOptionKeydown(event: KeyboardEvent): void {\n\t\tconst options = this.getOptions();\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"option\"]') as HTMLElement | null;\n\t\tif (!current) return;\n\n\t\tif (event.key === 'Enter' || event.key === ' ') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.select(current);\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems: options,\n\t\t\tcurrent,\n\t\t\tkey: event.key,\n\t\t\torientation: 'vertical',\n\t\t});\n\t\tif (!result.handled) return;\n\n\t\tevent.preventDefault();\n\t\tthis.select(result.item);\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclass=\"rui-listbox\"\n\t\t\t\trole=\"listbox\"\n\t\t\t\tdata-rui-control\n\t\t\t\tdata-rui-control-type=\"text\"\n\t\t\t\taria-label={this.resolvedAriaLabel}\n\t\t\t\taria-disabled={this.resolvedAriaDisabled}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiListboxProps } from './listbox.script';\nimport { RuiListbox as RuiListboxElement } from './listbox.script';\nimport './listbox.css';\n\nexport type RuiListboxOption = { value: string; label: JsxRenderable; disabled?: boolean };\n\nexport const RuiListbox = defineRadiantView(\n\tRuiListboxElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\tlabel,\n\t\tdisabled,\n\t\toptions,\n\t}: RuiListboxProps & RadiantSlotProps & { options: RuiListboxOption[] }) => (\n\t\t<rui-listbox slot={slot} value={value} label={label} disabled={disabled}>\n\t\t\t{options.map((option) => (\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rui-listbox__option\"\n\t\t\t\t\trole=\"option\"\n\t\t\t\t\tdata-value={option.value}\n\t\t\t\t\taria-disabled={option.disabled ? 'true' : undefined}\n\t\t\t\t\ttabindex={-1}\n\t\t\t\t>\n\t\t\t\t\t{option.label}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</rui-listbox>\n\t),\n);\n", "import { RadiantElement, bound, customElement, event, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { type Placement, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\n\nexport type RuiMenuButtonProps = {\n\t/** Whether the menu starts open. Default: `false`. */\n\topen?: boolean;\n\t/** Floating-ui placement for the menu. Default: `bottom-start`. */\n\tplacement?: Placement;\n};\n\nexport type RuiMenuButtonSelectDetail = {\n\tvalue: string;\n};\n\n/**\n * `<rui-menu-button>` \u2014 a button that opens a menu of actions.\n *\n * Implements the WAI-ARIA APG Menu Button pattern together with the Menu\n * keyboard model: the trigger exposes `aria-haspopup=\"menu\"` and\n * `aria-expanded`, and the popup has `role=\"menu\"` with `role=\"menuitem\"`\n * children.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/menubar/\n *\n * Keyboard interaction (trigger):\n * - `Enter` / `Space` / `ArrowDown`: open and focus the first item\n * - `ArrowUp`: open and focus the last item\n *\n * Keyboard interaction (open menu):\n * - `ArrowDown` / `ArrowUp`: move between items (wraps)\n * - `Home` / `End`: first / last item\n * - `Enter` / `Space`: activate the focused item and close\n * - `Escape`: close and return focus to the trigger\n *\n * @element rui-menu-button\n * @slot trigger - Label for the menu button.\n * @slot - Menu items (`role=\"menuitem\"`), typically buttons or anchors.\n * @fires rui-change - Emitted when a menu item is activated; `detail.value` is the item's `data-value` or text.\n * @fires rui-close - Emitted when the menu closes.\n */\n@customElement('rui-menu-button')\nexport class RuiMenuButton extends RadiantElement {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) open: boolean;\n\t@prop({ type: String, defaultValue: 'bottom-start' }) placement: Placement;\n\n\t@query({ ref: 'trigger' }) triggerTarget: HTMLButtonElement;\n\t@query({ ref: 'menu' }) menuTarget: HTMLElement;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiMenuButtonSelectDetail>;\n\n\t@event({ name: 'rui-close', bubbles: true, composed: true })\n\tcloseEvent: EventEmitter<void>;\n\n\tprivate cleanup: ReturnType<typeof autoUpdate> | null = null;\n\tprivate menuId = `rui-menu-${Math.random().toString(36).slice(2, 9)}`;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => this.syncOpenState());\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.teardownFloating();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate getItems(): HTMLElement[] {\n\t\treturn Array.from(this.menuTarget?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? []).filter(\n\t\t\t(item) => item.getAttribute('aria-disabled') !== 'true',\n\t\t);\n\t}\n\n\tprivate teardownFloating(): void {\n\t\tthis.cleanup?.();\n\t\tthis.cleanup = null;\n\t}\n\n\t@bound\n\tupdatePosition(): void {\n\t\tif (!this.triggerTarget || !this.menuTarget || !this.open) return;\n\t\tcomputePosition(this.triggerTarget, this.menuTarget, {\n\t\t\tplacement: this.placement,\n\t\t\tmiddleware: [offset(6), flip(), shift({ padding: 8 })],\n\t\t}).then(({ x, y }) => {\n\t\t\tObject.assign(this.menuTarget.style, {\n\t\t\t\tleft: `${x}px`,\n\t\t\t\ttop: `${y}px`,\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate pendingFocus: 'first' | 'last' | 'trigger' | null = null;\n\n\t@bound\n\t@onUpdated(['open', 'placement'])\n\tsyncOpenState(): void {\n\t\tif (!this.triggerTarget || !this.menuTarget) return;\n\n\t\tthis.menuTarget.id = this.menuId;\n\t\tthis.triggerTarget.setAttribute('aria-controls', this.menuId);\n\t\tthis.triggerTarget.setAttribute('aria-haspopup', 'menu');\n\t\tthis.triggerTarget.setAttribute('aria-expanded', String(this.open));\n\t\tthis.menuTarget.hidden = !this.open;\n\n\t\tif (this.open) {\n\t\t\tthis.teardownFloating();\n\t\t\tthis.cleanup = autoUpdate(this.triggerTarget, this.menuTarget, this.updatePosition);\n\t\t\tthis.updatePosition();\n\t\t} else {\n\t\t\tthis.teardownFloating();\n\t\t}\n\n\t\tconst focus = this.pendingFocus;\n\t\tthis.pendingFocus = null;\n\t\tif (!focus) return;\n\n\t\tif (focus === 'first') this.getItems()[0]?.focus();\n\t\tif (focus === 'last') {\n\t\t\tconst items = this.getItems();\n\t\t\titems[items.length - 1]?.focus();\n\t\t}\n\t\tif (focus === 'trigger') this.triggerTarget?.focus();\n\t}\n\n\tprivate setOpen(next: boolean, focus: 'first' | 'last' | 'trigger' | null = null): void {\n\t\tconst wasOpen = this.open;\n\t\tthis.pendingFocus = focus;\n\t\tthis.open = next;\n\t\tif (wasOpen && !next) this.closeEvent.emit();\n\t\tif (wasOpen === next) this.syncOpenState();\n\t}\n\n\t@onEvent({ document: true, type: 'click' })\n\tonDocumentClick(event: MouseEvent): void {\n\t\tif (!this.open) return;\n\t\tconst target = event.target as Node;\n\t\tif (this.triggerTarget?.contains(target) || this.menuTarget?.contains(target)) return;\n\t\tthis.setOpen(false);\n\t}\n\n\t@onEvent({ ref: 'trigger', type: 'click' })\n\tonTriggerClick(): void {\n\t\tthis.setOpen(!this.open, this.open ? null : 'first');\n\t}\n\n\t@onEvent({ ref: 'trigger', type: 'keydown' })\n\tonTriggerKeydown(event: KeyboardEvent): void {\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.setOpen(true, 'first');\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.setOpen(true, 'last');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'menu', type: 'keydown' })\n\tonMenuKeydown(event: KeyboardEvent): void {\n\t\tconst items = this.getItems();\n\t\tconst current = document.activeElement as HTMLElement | null;\n\t\tconst index = current ? items.indexOf(current) : -1;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst next = items[(index + 1) % items.length];\n\t\t\t\tnext?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst prev = items[(index - 1 + items.length) % items.length];\n\t\t\t\tprev?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\titems[0]?.focus();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\titems[items.length - 1]?.focus();\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.setOpen(false, 'trigger');\n\t\t\t\tbreak;\n\t\t\tcase 'Tab':\n\t\t\t\tthis.setOpen(false);\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tif (current && items.includes(current)) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.activateItem(current);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[role=\"menuitem\"]', type: 'click' })\n\tonItemClick(event: Event): void {\n\t\tconst item = (event.target as HTMLElement).closest('[role=\"menuitem\"]') as HTMLElement | null;\n\t\tif (!item || !this.contains(item)) return;\n\t\tthis.activateItem(item);\n\t}\n\n\tprivate activateItem(item: HTMLElement): void {\n\t\tconst value = item.getAttribute('data-value') || item.textContent?.trim() || '';\n\t\tthis.changeEvent.emit({ value });\n\t\tthis.setOpen(false, 'trigger');\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-menu-button\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdata-ref=\"trigger\"\n\t\t\t\t\tclass=\"rui-button rui-button--primary rui-button--md rui-menu-button__trigger\"\n\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t\taria-expanded=\"false\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t\t<span class=\"rui-menu-button__chevron\" aria-hidden=\"true\"></span>\n\t\t\t\t</button>\n\t\t\t\t<div data-ref=\"menu\" class=\"rui-menu-button__menu\" role=\"menu\" hidden>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiMenuButtonProps } from './menu-button.script';\nimport { RuiMenuButton as RuiMenuButtonElement } from './menu-button.script';\nimport './menu-button.css';\n\nexport type RuiMenuItem = {\n\tvalue: string;\n\tlabel: JsxRenderable;\n\tdisabled?: boolean;\n};\n\nexport const RuiMenuButton = defineRadiantView(\n\tRuiMenuButtonElement,\n\t({\n\t\tslot,\n\t\topen,\n\t\tplacement,\n\t\ttrigger,\n\t\titems,\n\t}: RuiMenuButtonProps &\n\t\tRadiantSlotProps & {\n\t\t\ttrigger: JsxRenderable;\n\t\t\titems: RuiMenuItem[];\n\t\t}) => (\n\t\t<rui-menu-button slot={slot} open={open} placement={placement}>\n\t\t\t<span slot=\"trigger\">{trigger}</span>\n\t\t\t{items.map((item) => (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"rui-menu-button__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\tdata-value={item.value}\n\t\t\t\t\taria-disabled={item.disabled ? 'true' : undefined}\n\t\t\t\t\ttabindex={-1}\n\t\t\t\t>\n\t\t\t\t\t{item.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</rui-menu-button>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { applyRovingTabindex, navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiMenubarProps = {\n\tlabel?: string;\n};\n\nexport type RuiMenubarChangeDetail = { value: string };\n\ntype RuiMenubarBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-menubar>` \u2014 a horizontal menubar of menus.\n *\n * Implements the APG Menubar pattern: top-level items use `role=\"menuitem\"` with\n * `aria-haspopup` / `aria-expanded` when they own a nested `[role=\"menu\"]`. Arrow\n * keys move across the bar; Enter/Space/ArrowDown open the popup; Escape closes it.\n *\n * Expected markup (also produced by the JSX view helper):\n * ```html\n * <div class=\"rui-menubar__root\" data-ref=\"menubar-root\">\n * <button role=\"menuitem\" aria-haspopup=\"true\" aria-expanded=\"false\">File</button>\n * <div role=\"menu\" hidden>\n * <button role=\"menuitem\" data-value=\"new\">New</button>\n * </div>\n * </div>\n * ```\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/menubar/\n * @element rui-menubar\n * @fires rui-change\n */\n@customElement('rui-menubar')\nexport class RuiMenubar extends RadiantElement<RuiMenubarBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiMenubarChangeDetail>;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\tprivate openRoot: HTMLElement | null = null;\n\n\tprivate getTopItems(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis.querySelectorAll<HTMLElement>('[data-ref=\"menubar\"] > [data-ref=\"menubar-root\"] > [role=\"menuitem\"]'),\n\t\t);\n\t}\n\n\tprivate getMenuFor(topItem: HTMLElement): HTMLElement | null {\n\t\tconst root = topItem.closest('[data-ref=\"menubar-root\"]');\n\t\treturn root?.querySelector<HTMLElement>(':scope > [role=\"menu\"]') ?? null;\n\t}\n\n\tprivate getMenuItems(menu: HTMLElement): HTMLElement[] {\n\t\treturn Array.from(menu.querySelectorAll<HTMLElement>(':scope > [role=\"menuitem\"]')).filter(\n\t\t\t(item) => item.getAttribute('aria-disabled') !== 'true',\n\t\t);\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => applyRovingTabindex(this.getTopItems(), 0));\n\t}\n\n\tprivate closeOpenMenu(returnFocus = false): void {\n\t\tif (!this.openRoot) return;\n\t\tconst top = this.openRoot.querySelector<HTMLElement>(':scope > [role=\"menuitem\"]');\n\t\tconst menu = this.openRoot.querySelector<HTMLElement>(':scope > [role=\"menu\"]');\n\t\tif (top) top.setAttribute('aria-expanded', 'false');\n\t\tif (menu) menu.hidden = true;\n\t\tthis.openRoot = null;\n\t\tif (returnFocus && top) top.focus();\n\t}\n\n\tprivate openMenu(topItem: HTMLElement, focus: 'first' | null = 'first'): void {\n\t\tconst root = topItem.closest('[data-ref=\"menubar-root\"]') as HTMLElement | null;\n\t\tconst menu = this.getMenuFor(topItem);\n\t\tif (!root || !menu) return;\n\n\t\tif (this.openRoot && this.openRoot !== root) this.closeOpenMenu();\n\n\t\ttopItem.setAttribute('aria-expanded', 'true');\n\t\tmenu.hidden = false;\n\t\tthis.openRoot = root;\n\n\t\tif (focus === 'first') {\n\t\t\tconst items = this.getMenuItems(menu);\n\t\t\tapplyRovingTabindex(items, 0);\n\t\t\titems[0]?.focus();\n\t\t}\n\t}\n\n\t@onEvent({ document: true, type: 'click' })\n\tonDocumentClick(event: MouseEvent): void {\n\t\tif (!this.openRoot) return;\n\t\tif (!this.contains(event.target as Node)) this.closeOpenMenu();\n\t}\n\n\t@onEvent({ selector: '[data-ref=\"menubar\"] > [data-ref=\"menubar-root\"] > [role=\"menuitem\"]', type: 'keydown' })\n\tonTopKeydown(event: KeyboardEvent): void {\n\t\tconst items = this.getTopItems();\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"menuitem\"]') as HTMLElement | null;\n\t\tif (!current || !items.includes(current)) return;\n\n\t\tif (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n\t\t\tif (this.getMenuFor(current)) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.openMenu(current, 'first');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closeOpenMenu(true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems,\n\t\t\tcurrent,\n\t\t\tkey: event.key,\n\t\t\torientation: 'horizontal',\n\t\t});\n\t\tif (!result.handled) return;\n\t\tevent.preventDefault();\n\n\t\t// APG: when a menu is open, moving across the bar opens the newly focused menu.\n\t\tif (this.openRoot) {\n\t\t\tif (this.getMenuFor(result.item)) this.openMenu(result.item, 'first');\n\t\t\telse this.closeOpenMenu();\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-ref=\"menubar\"] > [data-ref=\"menubar-root\"] > [role=\"menuitem\"]', type: 'click' })\n\tonTopClick(event: Event): void {\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"menuitem\"]') as HTMLElement | null;\n\t\tif (!current || !this.getTopItems().includes(current)) return;\n\t\tif (!this.getMenuFor(current)) return;\n\n\t\tconst expanded = current.getAttribute('aria-expanded') === 'true';\n\t\tif (expanded) this.closeOpenMenu();\n\t\telse this.openMenu(current, 'first');\n\t}\n\n\t@onEvent({ selector: '[role=\"menu\"] > [role=\"menuitem\"]', type: 'keydown' })\n\tonMenuKeydown(event: KeyboardEvent): void {\n\t\tconst menu = (event.target as HTMLElement).closest('[role=\"menu\"]') as HTMLElement | null;\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"menuitem\"]') as HTMLElement | null;\n\t\tif (!menu || !current || !this.contains(menu)) return;\n\n\t\tconst items = this.getMenuItems(menu);\n\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closeOpenMenu(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Enter' || event.key === ' ') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.activateItem(current);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n\t\t\tconst tops = this.getTopItems();\n\t\t\tconst top = menu.parentElement?.querySelector<HTMLElement>(':scope > [role=\"menuitem\"]');\n\t\t\tif (!top) return;\n\t\t\tevent.preventDefault();\n\t\t\tconst result = navigateRovingTabindex({\n\t\t\t\titems: tops,\n\t\t\t\tcurrent: top,\n\t\t\t\tkey: event.key,\n\t\t\t\torientation: 'horizontal',\n\t\t\t});\n\t\t\tif (result.handled && this.getMenuFor(result.item)) this.openMenu(result.item, 'first');\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems,\n\t\t\tcurrent,\n\t\t\tkey: event.key,\n\t\t\torientation: 'vertical',\n\t\t});\n\t\tif (result.handled) event.preventDefault();\n\t}\n\n\t@onEvent({ selector: '[role=\"menu\"] > [role=\"menuitem\"]', type: 'click' })\n\tonMenuItemClick(event: Event): void {\n\t\tconst item = (event.target as HTMLElement).closest('[role=\"menuitem\"]') as HTMLElement | null;\n\t\tif (!item || !this.contains(item)) return;\n\t\t// Ignore top-level items (they are not direct children of role=menu in our markup).\n\t\tif (item.parentElement?.getAttribute('role') !== 'menu') return;\n\t\tthis.activateItem(item);\n\t}\n\n\tprivate activateItem(item: HTMLElement): void {\n\t\tconst value = item.getAttribute('data-value') || item.textContent?.trim() || '';\n\t\tthis.changeEvent.emit({ value });\n\t\tthis.closeOpenMenu(true);\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-menubar\" data-ref=\"menubar\" role=\"menubar\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiMenubarProps } from './menubar.script';\nimport { RuiMenubar as RuiMenubarElement } from './menubar.script';\nimport './menubar.css';\n\nexport type RuiMenubarItem = {\n\tid: string;\n\tlabel: JsxRenderable;\n\t/** Popup actions. When present, the top item opens a `role=\"menu\"`. */\n\titems?: Array<{ id: string; label: JsxRenderable }>;\n};\n\nexport const RuiMenubar = defineRadiantView(\n\tRuiMenubarElement,\n\t({ slot, label, items }: RuiMenubarProps & RadiantSlotProps & { items: RuiMenubarItem[] }) => (\n\t\t<rui-menubar slot={slot} label={label}>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div class=\"rui-menubar__root\" data-ref=\"menubar-root\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"rui-menubar__item\"\n\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t\taria-haspopup={item.items?.length ? 'true' : undefined}\n\t\t\t\t\t\taria-expanded={item.items?.length ? 'false' : undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</button>\n\t\t\t\t\t{item.items?.length ? (\n\t\t\t\t\t\t<div class=\"rui-menubar__menu\" role=\"menu\" hidden>\n\t\t\t\t\t\t\t{item.items.map((child) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"rui-menubar__menu-item\"\n\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\tdata-value={child.id}\n\t\t\t\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{child.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</rui-menubar>\n\t),\n);\n", "import { RadiantElement, customElement, onUpdated, prop, state } from '@ecopages/radiant';\n\nexport type RuiMeterProps = {\n\tvalue?: number;\n\tmin?: number;\n\tmax?: number;\n\tlabel?: string;\n};\n\ntype RuiMeterBindings = {\n\tvalue: number;\n\tmin: number;\n\tmax: number;\n\tlabel: string;\n\tpercent: number;\n};\n\n/**\n * `<rui-meter>` \u2014 a graphical display of a numeric value within a range.\n *\n * Uses the native `<meter>` element, which maps to the APG Meter pattern.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/meter/\n * @element rui-meter\n */\n@customElement('rui-meter')\nexport class RuiMeter extends RadiantElement<RuiMeterBindings> {\n\t@prop({ type: Number, reflect: true, defaultValue: 0 }) value: number;\n\t@prop({ type: Number, defaultValue: 0 }) min: number;\n\t@prop({ type: Number, defaultValue: 100 }) max: number;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\t@state percent = 0;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\t@onUpdated(['value', 'min', 'max'])\n\tonRangeUpdated(): void {\n\t\tthis.percent = this.max === this.min ? 0 : Math.round(((this.value - this.min) / (this.max - this.min)) * 100);\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-meter\">\n\t\t\t\t{this.label ? <span class=\"rui-meter__label\">{this.$.label}</span> : null}\n\t\t\t\t<meter\n\t\t\t\t\tclass=\"rui-meter__bar\"\n\t\t\t\t\tmin={this.$.min}\n\t\t\t\t\tmax={this.$.max}\n\t\t\t\t\tvalue={this.$.value}\n\t\t\t\t\taria-label={this.resolvedAriaLabel}\n\t\t\t\t>\n\t\t\t\t\t{this.$.percent}%\n\t\t\t\t</meter>\n\t\t\t\t<span class=\"rui-meter__value\" aria-hidden=\"true\">\n\t\t\t\t\t{this.$.percent}%\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiMeterProps } from './meter.script';\nimport { RuiMeter as RuiMeterElement } from './meter.script';\nimport './meter.css';\n\nexport const RuiMeter = defineRadiantView(\n\tRuiMeterElement,\n\t({ slot, value, min, max, label }: RuiMeterProps & RadiantSlotProps) => (\n\t\t<rui-meter slot={slot} value={value} min={min} max={max} label={label} />\n\t),\n);\n", "import { RadiantElement, customElement, onEvent, prop } from '@ecopages/radiant';\nimport { getFocusableElements } from '../../../lib/focusable-elements';\nimport { applyRovingTabindex, navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiNavigationMenuProps = {\n\tlabel?: string;\n};\n\ntype RuiNavigationMenuBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-navigation-menu>` \u2014 a composition-first site navigation shell.\n *\n * Implements the APG Disclosure Navigation Menu interaction model: top-level\n * triggers open exclusive panels composed from other radiant-ui primitives.\n *\n * Mark triggers with `data-navigation-trigger` and `data-value`. Mark matching\n * panels with `data-navigation-panel` and the same `data-value`. Top-level bar\n * links and triggers should use `data-navigation-item` (added by the view helpers).\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/\n * @element rui-navigation-menu\n * @slot triggers - Top-level navigation triggers and plain links.\n * @slot panels - Disclosure panels composed from other primitives.\n */\n@customElement('rui-navigation-menu')\nexport class RuiNavigationMenu extends RadiantElement<RuiNavigationMenuBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\tprivate openValue: string | null = null;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncPanels();\n\t\t\tthis.syncBarRovingTabindex();\n\t\t});\n\t}\n\n\tprivate getBarItems(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[data-navigation-item]'));\n\t}\n\n\tprivate syncBarRovingTabindex(): void {\n\t\tconst items = this.getBarItems();\n\t\tconst activeIndex = Math.max(\n\t\t\t0,\n\t\t\titems.findIndex((item) => item.tabIndex === 0 || item === document.activeElement),\n\t\t);\n\t\tapplyRovingTabindex(items, activeIndex);\n\t}\n\n\tprivate isBarTrigger(item: HTMLElement): boolean {\n\t\treturn item.hasAttribute('data-navigation-trigger');\n\t}\n\n\tprivate getTriggers(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[data-navigation-trigger]'));\n\t}\n\n\tprivate getPanel(value: string): HTMLElement | null {\n\t\treturn this.querySelector<HTMLElement>(`[data-navigation-panel][data-value=\"${value}\"]`);\n\t}\n\n\tprivate getTrigger(value: string): HTMLElement | null {\n\t\treturn this.querySelector<HTMLElement>(`[data-navigation-trigger][data-value=\"${value}\"]`);\n\t}\n\n\tprivate getPanels(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[data-navigation-panel]'));\n\t}\n\n\tprivate focusPanelEntry(value: string): void {\n\t\tconst panel = this.getPanel(value);\n\t\tif (!panel) {\n\t\t\tthis.getTrigger(value)?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst focusables = getFocusableElements(panel);\n\t\tif (focusables.length > 0) {\n\t\t\tfocusables[0].focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!panel.hasAttribute('tabindex')) {\n\t\t\tpanel.tabIndex = -1;\n\t\t}\n\n\t\tpanel.focus();\n\t}\n\n\tprivate syncPanels(): void {\n\t\tfor (const panel of this.getPanels()) {\n\t\t\tconst value = panel.getAttribute('data-value') ?? '';\n\t\t\tconst open = this.openValue === value;\n\t\t\tpanel.hidden = !open;\n\t\t\tpanel.dataset.state = open ? 'open' : 'closed';\n\t\t\tpanel.setAttribute('aria-hidden', String(!open));\n\n\t\t\tconst trigger = this.getTrigger(value);\n\t\t\tif (trigger) {\n\t\t\t\ttrigger.setAttribute('aria-expanded', String(open));\n\t\t\t\tpanel.setAttribute('role', 'region');\n\t\t\t\tpanel.setAttribute('aria-labelledby', trigger.id || `${value}-trigger`);\n\t\t\t\tif (!trigger.id) {\n\t\t\t\t\ttrigger.id = `${value}-trigger`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const trigger of this.getTriggers()) {\n\t\t\tconst value = trigger.getAttribute('data-value') ?? '';\n\t\t\tconst open = this.openValue === value;\n\t\t\ttrigger.setAttribute('aria-expanded', String(open));\n\t\t\tif (this.getPanel(value)) {\n\t\t\t\ttrigger.setAttribute('aria-haspopup', 'true');\n\t\t\t} else {\n\t\t\t\ttrigger.removeAttribute('aria-haspopup');\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate closeMenu(returnFocus = false): void {\n\t\tconst previous = this.openValue;\n\t\tif (!previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openValue = null;\n\t\tthis.syncPanels();\n\n\t\tif (returnFocus) {\n\t\t\tthis.getTrigger(previous)?.focus();\n\t\t}\n\t}\n\n\tprivate openPanel(value: string, focusPanel = true): void {\n\t\tif (this.openValue === value) {\n\t\t\tthis.closeMenu(true);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openValue = value;\n\t\tthis.syncPanels();\n\t\tqueueMicrotask(() => {\n\t\t\tif (focusPanel) {\n\t\t\t\tthis.focusPanelEntry(value);\n\t\t\t} else {\n\t\t\t\tthis.getTrigger(value)?.focus();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getEventElement(event: Event): Element | null {\n\t\tconst target = event.target;\n\t\tif (target instanceof Element) {\n\t\t\treturn target;\n\t\t}\n\n\t\tif (target instanceof Text) {\n\t\t\treturn target.parentElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate isWithinOpenPanel(event: MouseEvent): boolean {\n\t\tif (!this.openValue) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst openPanel = this.getPanel(this.openValue);\n\t\tif (!openPanel) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn event.composedPath().some((node) => node instanceof Node && openPanel.contains(node));\n\t}\n\n\t@onEvent({ document: true, type: 'click' })\n\tonDocumentClick(event: MouseEvent): void {\n\t\tif (!this.openValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isWithinOpenPanel(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst element = this.getEventElement(event);\n\t\tif (element && this.contains(element)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.closeMenu();\n\t}\n\n\t@onEvent({ document: true, type: 'keydown' })\n\tonDocumentKeydown(event: KeyboardEvent): void {\n\t\tif (event.key !== 'Escape' || !this.openValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst active = document.activeElement;\n\t\tif (active && !this.contains(active)) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.closeMenu(true);\n\t}\n\n\t@onEvent({ ref: 'root', type: 'keydown' })\n\tonRootKeydown(event: KeyboardEvent): void {\n\t\tif (event.key === 'Escape' && this.openValue) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closeMenu(true);\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-navigation-trigger]', type: 'click' })\n\tonTriggerClick(event: Event): void {\n\t\tconst trigger = (event.target as HTMLElement).closest<HTMLElement>('[data-navigation-trigger]');\n\t\tconst value = trigger?.getAttribute('data-value');\n\t\tif (!trigger || !value) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.openPanel(value);\n\t}\n\n\t@onEvent({ selector: '[data-navigation-item]', type: 'keydown' })\n\tonBarItemKeydown(event: KeyboardEvent): void {\n\t\tconst item = (event.target as HTMLElement).closest<HTMLElement>('[data-navigation-item]');\n\t\tif (!item) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst barItems = this.getBarItems();\n\t\tconst isTrigger = this.isBarTrigger(item);\n\t\tconst value = item.getAttribute('data-value');\n\n\t\tif (event.key === 'Escape') {\n\t\t\tif (this.openValue) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.closeMenu(true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTrigger && value && (event.key === 'Enter' || event.key === ' ')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.openPanel(value);\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTrigger && value && event.key === 'ArrowDown') {\n\t\t\tevent.preventDefault();\n\t\t\tif (this.openValue === value) {\n\t\t\t\tthis.focusPanelEntry(value);\n\t\t\t} else {\n\t\t\t\tthis.openPanel(value);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems: barItems,\n\t\t\tcurrent: item,\n\t\t\tkey: event.key,\n\t\t\torientation: 'horizontal',\n\t\t\twrap: false,\n\t\t});\n\n\t\tif (!result.handled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst nextItem = result.item;\n\t\tconst nextValue = nextItem.getAttribute('data-value');\n\t\tconst nextIsTrigger = this.isBarTrigger(nextItem);\n\n\t\tif (this.openValue) {\n\t\t\tif (nextIsTrigger && nextValue) {\n\t\t\t\tthis.openPanel(nextValue);\n\t\t\t} else {\n\t\t\t\tthis.closeMenu(false);\n\t\t\t}\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-navigation-panel]', type: 'keydown' })\n\tonPanelKeydown(event: KeyboardEvent): void {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst panel = target.closest<HTMLElement>('[data-navigation-panel]');\n\t\tif (!panel || panel.hidden) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = panel.getAttribute('data-value');\n\t\tif (!value || this.openValue !== value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst active = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\t\tif (!active || !panel.contains(active)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closeMenu(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowUp' && active === getFocusableElements(panel)[0]) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.getTrigger(value)?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst focusables = getFocusableElements(panel);\n\t\tif (!focusables.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems: focusables,\n\t\t\tcurrent: active,\n\t\t\tkey: event.key,\n\t\t\torientation: 'vertical',\n\t\t\twrap: false,\n\t\t});\n\n\t\tif (!result.handled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<nav class=\"rui-navigation-menu\" data-ref=\"root\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<div class=\"rui-navigation-menu__bar\">\n\t\t\t\t\t<slot name=\"triggers\"></slot>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"rui-navigation-menu__panels\">\n\t\t\t\t\t<slot name=\"panels\"></slot>\n\t\t\t\t</div>\n\t\t\t</nav>\n\t\t);\n\t}\n}\n", "const FOCUSABLE_SELECTOR = [\n\t'a[href]',\n\t'button:not([disabled])',\n\t'input:not([disabled])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\nfunction isVisible(element: HTMLElement): boolean {\n\treturn element.getClientRects().length > 0 && !element.closest('[hidden]');\n}\n\n/** Returns focusable descendants in DOM order, skipping hidden nodes. */\nexport function getFocusableElements(root: ParentNode): HTMLElement[] {\n\treturn Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(isVisible);\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RadiantSlotProps } from '../../../types';\nimport { RuiButton, type RuiButtonProps } from '../button/button';\nimport type { RuiNavigationMenuProps } from './navigation-menu.script';\nimport { RuiNavigationMenu as RuiNavigationMenuElement } from './navigation-menu.script';\nimport './navigation-menu.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport const RuiNavigationMenu = defineRadiantView(\n\tRuiNavigationMenuElement,\n\t({ label, children, slot }: RuiNavigationMenuProps & RadiantSlotProps & { children: JsxRenderable }) => (\n\t\t<rui-navigation-menu slot={slot} label={label}>\n\t\t\t{children}\n\t\t</rui-navigation-menu>\n\t),\n);\n\nexport type RuiNavigationMenuTriggerProps = RadiantSlotProps &\n\tPick<RuiButtonProps, 'variant' | 'disabled' | 'class' | 'type'> & {\n\t\tvalue: string;\n\t\tchildren: JsxRenderable;\n\t};\n\n/** Top-level megamenu trigger slotted into `triggers` by default. */\nexport function RuiNavigationMenuTrigger({\n\tslot = 'triggers',\n\tvalue,\n\tchildren,\n\tvariant = 'ghost',\n\t...rest\n}: RuiNavigationMenuTriggerProps) {\n\treturn (\n\t\t<RuiButton\n\t\t\tslot={slot}\n\t\t\tvariant={variant}\n\t\t\tdata-navigation-item\n\t\t\tdata-navigation-trigger\n\t\t\tdata-value={value}\n\t\t\t{...rest}\n\t\t>\n\t\t\t{children}\n\t\t</RuiButton>\n\t);\n}\n\nexport type RuiNavigationMenuLinkProps = RadiantSlotProps & {\n\thref: string;\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Plain navigation link slotted into `triggers` by default. */\nexport function RuiNavigationMenuLink({\n\tslot = 'triggers',\n\thref,\n\tchildren,\n\tclass: className,\n}: RuiNavigationMenuLinkProps) {\n\treturn (\n\t\t<a\n\t\t\tslot={slot}\n\t\t\thref={href}\n\t\t\tdata-navigation-item\n\t\t\tclass={cx('rui-button', 'rui-button--ghost', 'rui-button--md', className)}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nexport type RuiNavigationMenuPanelProps = RadiantSlotProps & {\n\tvalue: string;\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Megamenu panel slotted into `panels` by default. */\nexport function RuiNavigationMenuPanel({\n\tslot = 'panels',\n\tvalue,\n\tchildren,\n\tclass: className,\n}: RuiNavigationMenuPanelProps) {\n\treturn (\n\t\t<div slot={slot} class={className} data-navigation-panel data-value={value}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiRadioGroupProps = {\n\t/** Currently selected value. Reflects to markup. */\n\tvalue?: string;\n\t/** Form field name shared by all radios in the group. */\n\tname?: string;\n\t/** Accessible name for the group when no visible legend is slotted. */\n\tlabel?: string;\n\t/** Disable every radio in the group. Default: `false`. */\n\tdisabled?: boolean;\n};\n\nexport type RuiRadioGroupChangeDetail = {\n\tvalue: string;\n};\n\ntype RuiRadioGroupBindings = {\n\tlabel: string;\n\tdisabled: boolean;\n};\n\n/**\n * `<rui-radio-group>` \u2014 a set of radio buttons where only one option may\n * be selected at a time.\n *\n * Implements the WAI-ARIA APG Radio Group pattern using native\n * `<input type=\"radio\">` controls inside a `role=\"radiogroup\"` container.\n * Arrow-key navigation and Space activation are provided by the browser.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/radio/\n *\n * Keyboard interaction (native radio group):\n * - `Tab` / `Shift+Tab`: move focus into and out of the group\n * - `Arrow` keys: move selection between radios\n * - `Space`: check the focused radio\n *\n * @element rui-radio-group\n * @slot - One or more `<label>` children each wrapping a radio input with a unique `value`.\n * @fires rui-change - Emitted after the selected value changes; `detail.value` holds the new value.\n */\n@customElement('rui-radio-group')\nexport class RuiRadioGroup extends RadiantElement<RuiRadioGroupBindings> {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\t@prop({ type: String, defaultValue: '' }) name: string;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiRadioGroupChangeDetail>;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\tprivate readonly resolvedAriaDisabled = this.$.disabled.map((disabled) => (disabled ? 'true' : undefined));\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.syncRadios();\n\t}\n\n\t@onUpdated(['value', 'name', 'disabled'])\n\tsyncRadios(): void {\n\t\tconst radios = this.querySelectorAll<HTMLInputElement>('input[type=\"radio\"]');\n\t\tconst groupName = this.name || this.getAttribute('name') || 'rui-radio-group';\n\t\tfor (const radio of radios) {\n\t\t\tradio.name = groupName;\n\t\t\tradio.disabled = this.disabled || radio.hasAttribute('data-disabled');\n\t\t\tradio.checked = this.value !== '' && radio.value === this.value;\n\t\t}\n\t}\n\n\t@onEvent({ selector: 'input[type=\"radio\"]', type: 'change' })\n\tonRadioChange(event: Event): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tif (!input.checked) return;\n\t\tthis.value = input.value;\n\t\tthis.changeEvent.emit({ value: this.value });\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclass=\"rui-radio-group\"\n\t\t\t\trole=\"radiogroup\"\n\t\t\t\tdata-rui-control\n\t\t\t\tdata-rui-control-type=\"text\"\n\t\t\t\taria-label={this.resolvedAriaLabel}\n\t\t\t\taria-disabled={this.resolvedAriaDisabled}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiRadioGroupProps } from './radio-group.script';\nimport { RuiRadioGroup as RuiRadioGroupElement } from './radio-group.script';\nimport './radio-group.css';\n\nexport type RuiRadioOption = {\n\tvalue: string;\n\tlabel: JsxRenderable;\n\tdisabled?: boolean;\n};\n\nexport const RuiRadioGroup = defineRadiantView(\n\tRuiRadioGroupElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\tname,\n\t\tlabel,\n\t\tdisabled,\n\t\toptions,\n\t}: RuiRadioGroupProps &\n\t\tRadiantSlotProps & {\n\t\t\toptions: RuiRadioOption[];\n\t\t}) => (\n\t\t<rui-radio-group slot={slot} value={value} name={name} label={label} disabled={disabled}>\n\t\t\t{options.map((option) => (\n\t\t\t\t<label class=\"rui-radio\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tclass=\"rui-radio__input\"\n\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\tdata-disabled={option.disabled ? '' : undefined}\n\t\t\t\t\t/>\n\t\t\t\t\t<span class=\"rui-radio__control\" aria-hidden=\"true\"></span>\n\t\t\t\t\t<span class=\"rui-radio__label\">{option.label}</span>\n\t\t\t\t</label>\n\t\t\t))}\n\t\t</rui-radio-group>\n\t),\n);\n", "import { RadiantElement, bound, customElement, event, onEvent, onUpdated, prop, query, state } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiSidebarVariant = 'sidebar' | 'inset';\nexport type RuiSidebarSide = 'left' | 'right';\nexport type RuiSidebarCollapsible = 'off' | 'icon' | 'full';\nexport type RuiSidebarState = 'expanded' | 'collapsed';\n\nexport type RuiSidebarProps = {\n\t/** Visual treatment. `sidebar` is the default bordered pane; `inset` floats inside a card. Default: `sidebar`. */\n\tvariant?: RuiSidebarVariant;\n\t/** Which edge the sidebar sits on. Default: `left`. */\n\tside?: RuiSidebarSide;\n\t/** Collapse behavior. `off` keeps the pane open; `icon` collapses to an icon rail; `full` collapses fully. Default: `off`. */\n\tcollapsible?: RuiSidebarCollapsible;\n\t/** Initial open state when uncontrolled. Default: `true`. */\n\tdefaultOpen?: boolean;\n\t/** Controlled open state. */\n\topen?: boolean;\n\t/** Initial width in pixels when uncontrolled. Default: `256`. */\n\tdefaultWidth?: number;\n\t/** Controlled width in pixels. */\n\twidth?: number;\n\t/** Minimum width in pixels when resizing. Default: `200`. */\n\tminWidth?: number;\n\t/** Maximum width in pixels when resizing. Default: `480`. */\n\tmaxWidth?: number;\n\t/** Hide on viewports below this width. Default: `768`. */\n\tmobileBreakpoint?: number;\n\t/** Accessible name announced by the pane landmark and triggers. Default: `Sidebar`. */\n\tlabel?: string;\n};\n\nexport type RuiSidebarToggleDetail = { open: boolean; state: RuiSidebarState };\nexport type RuiSidebarResizeDetail = { width: number };\n\ntype RuiSidebarBindings = {\n\tlabel: string;\n};\n\nconst DEFAULT_WIDTH = 256;\nconst ICON_WIDTH = 48;\nconst DEFAULT_MIN_WIDTH = 200;\nconst DEFAULT_MAX_WIDTH = 480;\nconst DEFAULT_MOBILE_BREAKPOINT = 768;\nconst KEYBOARD_SHORTCUT = 'b';\nconst KEYBOARD_STEP = 8;\nconst KEYBOARD_STEP_LARGE = 32;\n\nfunction isModifierPressed(event: KeyboardEvent): boolean {\n\treturn event.metaKey || event.ctrlKey;\n}\n\nfunction isMediaQuerySupported(): boolean {\n\treturn typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n}\n\nfunction isHorizontalSide(side: RuiSidebarSide): boolean {\n\treturn side === 'left' || side === 'right';\n}\n\n/**\n * `<rui-sidebar>` \u2014 a resizable, collapsible side panel.\n *\n * The sidebar hosts the pane content in the default slot. When the parent\n * supplies a `RuiSidebarRail` element (or the `collapsible` mode is not\n * `off`), the sidebar manages open/closed state, a focusable resize handle,\n * and keyboard navigation that follows the APG Window Splitter pattern.\n *\n * When `collapsible=\"off\"` (the default), the pane stays open and exposes\n * a draggable resize handle. When `collapsible=\"icon\"`, the pane collapses\n * to a narrow rail. When `collapsible=\"full\"`, the pane is hidden until\n * toggled, and shown as an overlay drawer below the mobile breakpoint.\n *\n * The host reflects `data-state`, `data-collapsible`, `data-variant`,\n * `data-side`, and `data-mobile` so the stylesheet can drive every visual\n * mode without imperative JS.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/\n *\n * @element rui-sidebar\n * @slot - Pane content. Stack header, content, and footer inside.\n * @fires rui-sidebar-toggle - Emitted on every open/closed transition.\n * `detail` is `{ open, state }`.\n * @fires rui-sidebar-resize - Emitted on every width change. `detail` is `{ width }`.\n * @fires rui-sidebar-mobile-change - Emitted when the host flips between\n * mobile drawer mode and inline mode. `detail` is `{ mobile: boolean }`.\n */\n@customElement('rui-sidebar')\nexport class RuiSidebar extends RadiantElement<RuiSidebarBindings> {\n\t@prop({ type: String, reflect: true, defaultValue: 'sidebar' }) variant: RuiSidebarVariant;\n\t@prop({ type: String, reflect: true, defaultValue: 'left' }) side: RuiSidebarSide;\n\t@prop({ type: String, reflect: true, defaultValue: 'off' }) collapsible: RuiSidebarCollapsible;\n\t@prop({ type: Number, defaultValue: DEFAULT_WIDTH }) defaultWidth: number;\n\t@prop({ type: Number, reflect: true, attribute: 'width' }) width: number | undefined;\n\t@prop({ type: Number, defaultValue: DEFAULT_MIN_WIDTH }) minWidth: number;\n\t@prop({ type: Number, defaultValue: DEFAULT_MAX_WIDTH }) maxWidth: number;\n\t@prop({ type: Boolean, defaultValue: true }) defaultOpen: boolean;\n\t@prop({ type: Boolean, attribute: 'open' }) open: boolean | undefined;\n\t@prop({ type: Number, defaultValue: DEFAULT_MOBILE_BREAKPOINT }) mobileBreakpoint: number;\n\t@prop({ type: String, defaultValue: 'Sidebar' }) label: string;\n\n\t@query({ ref: 'root' }) rootTarget: HTMLElement;\n\t@query({ ref: 'pane' }) paneTarget: HTMLElement;\n\t@query({ ref: 'handle' }) handleTarget: HTMLElement;\n\t@query({ ref: 'scrim' }) scrimTarget: HTMLButtonElement;\n\n\t@event({ name: 'rui-sidebar-toggle', bubbles: true, composed: true })\n\ttoggleEvent: EventEmitter<RuiSidebarToggleDetail>;\n\n\t@event({ name: 'rui-sidebar-resize', bubbles: true, composed: true })\n\tresizeEvent: EventEmitter<RuiSidebarResizeDetail>;\n\n\t@event({ name: 'rui-sidebar-mobile-change', bubbles: true, composed: true })\n\tmobileChangeEvent: EventEmitter<{ mobile: boolean }>;\n\n\t@state isMobile = false;\n\tprivate mediaQuery: MediaQueryList | null = null;\n\tprivate readonly mediaListener = (event: MediaQueryListEvent): void => this.setMobile(event.matches);\n\n\tprivate dragging = false;\n\tprivate dragStartCoord = 0;\n\tprivate dragStartSize = 0;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\n\t\tif (this.open === undefined) {\n\t\t\tthis.open = this.defaultOpen;\n\t\t}\n\t\tthis.ensureWidthInitialized();\n\n\t\tthis.setAttribute('role', 'complementary');\n\t\tthis.setAttribute('aria-label', this.label);\n\t\tthis.syncHostAttributes();\n\t\t// Deferred JSX `.prop` bindings flush after connectedCallback \u2014 settle width\n\t\t// and re-bind the mobile media query after props are applied.\n\t\tqueueMicrotask(() => {\n\t\t\tif (this.open === undefined) {\n\t\t\t\tthis.open = this.defaultOpen;\n\t\t\t}\n\t\t\tthis.ensureWidthInitialized();\n\t\t\tthis.syncPaneWidthVar();\n\t\t\tthis.bindMobileMediaQuery();\n\t\t});\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.endDrag();\n\t\tthis.unbindMobileMediaQuery();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t/**\n\t * Keep host `data-*` in sync for `:has(> rui-sidebar[...])` and public API.\n\t * Visual styles target the inner `.rui-sidebar` root (host is `display: contents`).\n\t */\n\tprivate syncHostAttributes(): void {\n\t\tconst paneState: RuiSidebarState = this.isOpen() ? 'expanded' : 'collapsed';\n\t\tthis.setAttribute('data-state', paneState);\n\t\tthis.setAttribute('data-collapsible', this.collapsible);\n\t\tthis.setAttribute('data-variant', this.variant);\n\t\tthis.setAttribute('data-side', this.side);\n\t\tthis.setAttribute('data-mobile', String(this.isMobile));\n\t\tthis.setAttribute('data-pane-width', String(this.paneWidth()));\n\t}\n\n\tprivate isOpen(): boolean {\n\t\treturn this.open !== false;\n\t}\n\n\t/**\n\t * Optional `Number` props initialize to `0` when no attribute/default is set\n\t * (`defaultValueForType(Number)`). Treat that unset `0` as \u201Cuse defaultWidth\u201D.\n\t */\n\tprivate ensureWidthInitialized(): void {\n\t\tif (this.hasAttribute('width')) return;\n\t\tif (this.width === undefined || this.width === 0) {\n\t\t\tthis.width = this.defaultWidth;\n\t\t}\n\t}\n\n\t@onUpdated([\n\t\t'open',\n\t\t'collapsible',\n\t\t'variant',\n\t\t'side',\n\t\t'width',\n\t\t'defaultWidth',\n\t\t'defaultOpen',\n\t\t'minWidth',\n\t\t'maxWidth',\n\t\t'isMobile',\n\t])\n\tonStateUpdated(): void {\n\t\tthis.syncHostAttributes();\n\t\tthis.syncPaneWidthVar();\n\t}\n\n\t@onUpdated(['mobileBreakpoint'])\n\tonMobileBreakpointUpdated(): void {\n\t\tthis.bindMobileMediaQuery();\n\t}\n\n\tprivate unbindMobileMediaQuery(): void {\n\t\tthis.mediaQuery?.removeEventListener('change', this.mediaListener);\n\t\tthis.mediaQuery = null;\n\t}\n\n\tprivate bindMobileMediaQuery(): void {\n\t\tthis.unbindMobileMediaQuery();\n\n\t\tif (this.mobileBreakpoint <= 0 || !isMediaQuerySupported()) {\n\t\t\tthis.setMobile(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.mediaQuery = window.matchMedia(`(max-width: ${this.mobileBreakpoint - 1}px)`);\n\t\tthis.mediaQuery.addEventListener('change', this.mediaListener);\n\t\tthis.setMobile(this.mediaQuery.matches);\n\t}\n\n\tprivate setMobile(next: boolean): void {\n\t\tif (next === this.isMobile) return;\n\t\tthis.isMobile = next;\n\t\tthis.mobileChangeEvent.emit({ mobile: next });\n\t}\n\n\tprivate clampWidth(next: number): number {\n\t\treturn Math.min(this.maxWidth, Math.max(this.minWidth, next));\n\t}\n\n\tprivate paneWidth(): number {\n\t\tif (!this.isOpen()) {\n\t\t\t// Mobile is always a full drawer \u2014 never leave an icon rail when closed.\n\t\t\tif (this.isMobile) return 0;\n\t\t\treturn this.collapsible === 'icon' ? ICON_WIDTH : 0;\n\t\t}\n\t\tconst configured = this.width && this.width > 0 ? this.width : this.defaultWidth;\n\t\treturn configured;\n\t}\n\n\t/** Drive layout through the CSS variable only \u2014 never set inline pane width. */\n\tprivate syncPaneWidthVar(width = this.paneWidth()): void {\n\t\tconst root = this.rootTarget;\n\t\tif (root) {\n\t\t\troot.style.setProperty('--rui-sidebar-pane-width', `${width}px`);\n\t\t}\n\t\tif (this.paneTarget) {\n\t\t\tthis.paneTarget.style.removeProperty('width');\n\t\t\tthis.paneTarget.style.removeProperty('height');\n\t\t}\n\t\tthis.setAttribute('data-pane-width', String(width));\n\t}\n\n\tprivate applyWidth(next: number, emit: boolean): void {\n\t\tconst clamped = this.clampWidth(next);\n\t\tthis.width = clamped;\n\t\tthis.syncPaneWidthVar(clamped);\n\t\tif (emit) {\n\t\t\tthis.resizeEvent.emit({ width: clamped });\n\t\t}\n\t}\n\n\ttoggle(): void {\n\t\tthis.setOpen(!this.isOpen());\n\t}\n\n\tsetOpen(next: boolean): void {\n\t\tconst wasOpen = this.isOpen();\n\t\tif (next === wasOpen) {\n\t\t\tthis.syncPaneWidthVar();\n\t\t\treturn;\n\t\t}\n\t\tthis.open = next;\n\t\tconst paneState: RuiSidebarState = next ? 'expanded' : 'collapsed';\n\t\tthis.setAttribute('data-state', paneState);\n\t\tthis.syncPaneWidthVar();\n\t\tthis.toggleEvent.emit({ open: next, state: paneState });\n\t}\n\n\tprivate beginDrag(event: PointerEvent): void {\n\t\tif (event.button !== 0) return;\n\t\tif (this.collapsible !== 'off') return;\n\t\tthis.dragging = true;\n\t\tconst horizontal = isHorizontalSide(this.side);\n\t\tthis.dragStartCoord = horizontal ? event.clientX : event.clientY;\n\t\tthis.dragStartSize = this.paneWidth();\n\t\tthis.handleTarget?.setPointerCapture(event.pointerId);\n\t\tdocument.addEventListener('pointermove', this.onPointerMove);\n\t\tdocument.addEventListener('pointerup', this.onPointerUp);\n\t\tdocument.addEventListener('pointercancel', this.onPointerUp);\n\t}\n\n\tprivate endDrag(): void {\n\t\tif (!this.dragging) return;\n\t\tthis.dragging = false;\n\t\tdocument.removeEventListener('pointermove', this.onPointerMove);\n\t\tdocument.removeEventListener('pointerup', this.onPointerUp);\n\t\tdocument.removeEventListener('pointercancel', this.onPointerUp);\n\t}\n\n\t@bound\n\tprivate onPointerMove(event: PointerEvent): void {\n\t\tif (!this.dragging) return;\n\t\tconst horizontal = isHorizontalSide(this.side);\n\t\tconst coord = horizontal ? event.clientX : event.clientY;\n\t\tconst delta = this.side === 'right' ? this.dragStartCoord - coord : coord - this.dragStartCoord;\n\t\tthis.applyWidth(this.dragStartSize + delta, true);\n\t}\n\n\t@bound\n\tprivate onPointerUp(): void {\n\t\tthis.endDrag();\n\t}\n\n\t@bound\n\tprivate onHandlePointerDown(event: Event): void {\n\t\tevent.preventDefault();\n\t\tthis.beginDrag(event as PointerEvent);\n\t}\n\n\t@bound\n\tprivate onHandleKeydown(event: Event): void {\n\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\tconst current = this.paneWidth();\n\t\tconst horizontal = isHorizontalSide(this.side);\n\t\tconst prevKey = horizontal ? 'ArrowLeft' : 'ArrowUp';\n\t\tconst nextKey = horizontal ? 'ArrowRight' : 'ArrowDown';\n\t\tlet next = current;\n\n\t\tif (keyboardEvent.key === prevKey) {\n\t\t\tnext = current - (keyboardEvent.shiftKey ? KEYBOARD_STEP_LARGE : KEYBOARD_STEP);\n\t\t} else if (keyboardEvent.key === nextKey) {\n\t\t\tnext = current + (keyboardEvent.shiftKey ? KEYBOARD_STEP_LARGE : KEYBOARD_STEP);\n\t\t} else if (keyboardEvent.key === 'Home') {\n\t\t\tnext = this.minWidth;\n\t\t} else if (keyboardEvent.key === 'End') {\n\t\t\tnext = this.maxWidth;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.applyWidth(next, true);\n\t}\n\n\t@bound\n\tprivate onScrimClick(): void {\n\t\tif (this.isMobile) {\n\t\t\tthis.setOpen(false);\n\t\t}\n\t}\n\n\t@onEvent({ document: true, type: 'keydown' })\n\tonHostKeydown(event: Event): void {\n\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\tif (keyboardEvent.key === 'Escape' && this.isMobile && this.isOpen()) {\n\t\t\tkeyboardEvent.preventDefault();\n\t\t\tthis.setOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (isModifierPressed(keyboardEvent) && keyboardEvent.key.toLowerCase() === KEYBOARD_SHORTCUT) {\n\t\t\tkeyboardEvent.preventDefault();\n\t\t\tthis.toggle();\n\t\t}\n\t}\n\n\t/**\n\t * Only the pane's `aria-label` is bound below. `data-state`/`data-collapsible`/\n\t * `data-variant`/`data-side`/`data-mobile` and the handle's `aria-value*`/\n\t * `aria-orientation` stay plain reads deliberately \u2014 this component's open/\n\t * close, drag-resize, and mobile-detection paths are the same high-frequency\n\t * interactive category where two sibling components in this migration\n\t * (tooltip, menu-button) hit real regressions from binding conversion that\n\t * weren't fully root-caused. Deferred as a follow-up rather than risking the\n\t * same class of bug here under the same review budget.\n\t */\n\toverride render() {\n\t\tconst horizontal = isHorizontalSide(this.side);\n\t\tconst open = this.isOpen();\n\t\tconst paneState: RuiSidebarState = open ? 'expanded' : 'collapsed';\n\t\tconst showHandle = this.collapsible === 'off' && open && !this.isMobile;\n\t\tconst widthVar = `${this.paneWidth()}px`;\n\t\t// Icon rail stays interactive when collapsed on desktop; mobile drawer does not.\n\t\tconst paneInert = open || (!this.isMobile && this.collapsible === 'icon') ? undefined : '';\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclass=\"rui-sidebar\"\n\t\t\t\tstyle={{ '--rui-sidebar-pane-width': widthVar } as Record<string, string>}\n\t\t\t\tdata-ref=\"root\"\n\t\t\t\tdata-state={paneState}\n\t\t\t\tdata-collapsible={this.collapsible}\n\t\t\t\tdata-variant={this.variant}\n\t\t\t\tdata-side={this.side}\n\t\t\t\tdata-mobile={String(this.isMobile)}\n\t\t\t>\n\t\t\t\t{/* Scrim first so it stacks under the pane (dialog pattern). */}\n\t\t\t\t<button\n\t\t\t\t\tdata-ref=\"scrim\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"rui-sidebar__scrim\"\n\t\t\t\t\ttabindex={-1}\n\t\t\t\t\taria-label=\"Close sidebar\"\n\t\t\t\t\thidden={!this.isMobile || !open}\n\t\t\t\t\ton:click={this.onScrimClick}\n\t\t\t\t></button>\n\t\t\t\t<div\n\t\t\t\t\tdata-ref=\"pane\"\n\t\t\t\t\tclass=\"rui-sidebar__pane\"\n\t\t\t\t\tdata-side={this.side}\n\t\t\t\t\tdata-variant={this.variant}\n\t\t\t\t\taria-label={this.$.label}\n\t\t\t\t\tinert={paneInert}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t\t{showHandle ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-ref=\"handle\"\n\t\t\t\t\t\tclass=\"rui-sidebar__handle\"\n\t\t\t\t\t\trole=\"separator\"\n\t\t\t\t\t\ttabindex={0}\n\t\t\t\t\t\taria-orientation={horizontal ? 'vertical' : 'horizontal'}\n\t\t\t\t\t\taria-valuenow={this.paneWidth()}\n\t\t\t\t\t\taria-valuemin={this.minWidth}\n\t\t\t\t\t\taria-valuemax={this.maxWidth}\n\t\t\t\t\t\taria-label={`${this.label} resize handle`}\n\t\t\t\t\t\ton:pointerdown={this.onHandlePointerDown}\n\t\t\t\t\t\ton:keydown={this.onHandleKeydown}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"rui-sidebar__handle-grip\" aria-hidden=\"true\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import { RadiantElement, bound, customElement, onUpdated, prop, query } from '@ecopages/radiant';\nimport type { RuiSidebarToggleDetail } from './sidebar.script';\n\nexport type RuiSidebarTriggerPlacement = 'header' | 'inset';\n\nexport type RuiSidebarTriggerProps = {\n\t/** ID of the `rui-sidebar` this trigger controls. */\n\tcontrols?: string;\n\t/** Accessible name for the trigger button. Default: `Toggle sidebar`. */\n\ttriggerLabel?: string;\n\t/**\n\t * Where the trigger is rendered. `header` is shown while the sidebar is expanded;\n\t * `inset` while collapsed (desktop icon rail / mobile drawer closed). CSS on\n\t * `.rui-sidebar-provider` hides the inactive placement.\n\t */\n\tplacement?: RuiSidebarTriggerPlacement;\n\t/** Variant passed through to the rendered button. */\n\tvariant?: 'filled' | 'outline' | 'ghost';\n\t/** Size passed through to the rendered button. */\n\tsize?: 'sm' | 'md' | 'lg';\n};\n\n/**\n * `<rui-sidebar-trigger>` \u2014 toggle button for a sibling `rui-sidebar`.\n *\n * The trigger looks up the sidebar by `id` on every click so it works even\n * when the trigger element is re-mounted independently of the sidebar. The\n * trigger also subscribes to `rui-sidebar-toggle` events to mirror the\n * sidebar's `data-state` in its own `aria-expanded` attribute.\n *\n * @element rui-sidebar-trigger\n * @slot - Visible label. Defaults to a hamburger glyph when empty.\n */\n@customElement('rui-sidebar-trigger')\nexport class RuiSidebarTrigger extends RadiantElement {\n\t@prop({ type: String, defaultValue: '' }) controls: string;\n\t/** `label` is not a safe reactive attribute name in the DOM; bind via `button-label`. */\n\t@prop({ type: String, attribute: 'button-label', defaultValue: 'Toggle sidebar' }) buttonLabel: string;\n\t@prop({ type: String, reflect: true, attribute: 'data-placement', defaultValue: '' }) placement:\n\t\tRuiSidebarTriggerPlacement | '';\n\t@prop({ type: String, defaultValue: 'ghost' }) variant: NonNullable<RuiSidebarTriggerProps['variant']>;\n\t@prop({ type: String, defaultValue: 'md' }) size: NonNullable<RuiSidebarTriggerProps['size']>;\n\n\t@query({ ref: 'button' }) buttonTarget: HTMLButtonElement;\n\n\tprivate sidebarListener: ((event: Event) => void) | null = null;\n\tprivate attachedSidebar: HTMLElement | null = null;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.syncWithSidebar();\n\t\t// JSX `.prop` bindings flush after connect when the trigger lives in a sidebar slot.\n\t\tqueueMicrotask(() => this.syncWithSidebar());\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.detachFromSidebar();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t@onUpdated(['controls', 'buttonLabel', 'placement'])\n\tonControlsUpdated(): void {\n\t\tthis.detachFromSidebar();\n\t\tthis.syncWithSidebar();\n\t\tthis.applyState(this.attachedSidebar ? this.readState(this.attachedSidebar) : 'expanded');\n\t}\n\n\tprivate resolveSidebar(): (HTMLElement & { toggle?: () => void }) | null {\n\t\tconst id = this.controls?.trim();\n\t\tif (id) {\n\t\t\tconst byId = document.getElementById(id);\n\t\t\tif (byId) {\n\t\t\t\treturn byId as HTMLElement & { toggle?: () => void };\n\t\t\t}\n\t\t}\n\t\tconst host = this.closest('rui-sidebar');\n\t\tif (host?.id) {\n\t\t\treturn host as HTMLElement & { toggle?: () => void };\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate syncWithSidebar(): void {\n\t\tconst sidebar = this.resolveSidebar();\n\t\tif (sidebar === this.attachedSidebar) {\n\t\t\tif (sidebar) this.applyState(this.readState(sidebar));\n\t\t\treturn;\n\t\t}\n\t\tthis.detachFromSidebar();\n\t\tif (!sidebar) return;\n\t\tthis.attachedSidebar = sidebar;\n\t\tthis.sidebarListener = (event: Event) => {\n\t\t\tconst detail = (event as CustomEvent<RuiSidebarToggleDetail>).detail;\n\t\t\tthis.applyState(detail.state);\n\t\t};\n\t\tsidebar.addEventListener('rui-sidebar-toggle', this.sidebarListener);\n\t\tthis.applyState(this.readState(sidebar));\n\t}\n\n\tprivate detachFromSidebar(): void {\n\t\tif (this.attachedSidebar && this.sidebarListener) {\n\t\t\tthis.attachedSidebar.removeEventListener('rui-sidebar-toggle', this.sidebarListener);\n\t\t}\n\t\tthis.attachedSidebar = null;\n\t\tthis.sidebarListener = null;\n\t}\n\n\tprivate readState(sidebar: HTMLElement): 'expanded' | 'collapsed' {\n\t\treturn (sidebar.getAttribute('data-state') as 'expanded' | 'collapsed' | null) ?? 'expanded';\n\t}\n\n\tprivate resolvedButtonLabel(): string {\n\t\tconst fromData = this.getAttribute('data-button-label')?.trim();\n\t\tif (fromData) return fromData;\n\t\tconst fromAttribute = this.getAttribute('button-label')?.trim();\n\t\tif (fromAttribute) return fromAttribute;\n\t\treturn this.buttonLabel || 'Toggle sidebar';\n\t}\n\n\tprivate applyState(state: 'expanded' | 'collapsed'): void {\n\t\tconst button = this.buttonTarget;\n\t\tif (!button) return;\n\t\tconst sidebar = this.resolveSidebar();\n\t\tconst buttonLabel = this.resolvedButtonLabel();\n\t\tbutton.setAttribute('aria-expanded', String(state === 'expanded'));\n\t\tbutton.setAttribute('data-sidebar-state', state);\n\t\tbutton.setAttribute('aria-label', buttonLabel);\n\t\tif (sidebar?.id) {\n\t\t\tbutton.setAttribute('aria-controls', sidebar.id);\n\t\t} else if (this.controls) {\n\t\t\tbutton.setAttribute('aria-controls', this.controls);\n\t\t}\n\t}\n\n\t@bound\n\tprivate onClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tconst sidebar = this.resolveSidebar();\n\t\tif (sidebar && typeof sidebar.toggle === 'function') {\n\t\t\tsidebar.toggle();\n\t\t}\n\t}\n\n\tprivate placementClass(): string {\n\t\tif (this.placement === 'header') return 'rui-sidebar__trigger--header';\n\t\tif (this.placement === 'inset') return 'rui-sidebar__trigger--inset';\n\t\treturn '';\n\t}\n\n\tprivate renderDefaultIcon() {\n\t\tconst sidebar = this.resolveSidebar();\n\t\tconst state = sidebar ? this.readState(sidebar) : 'expanded';\n\t\tconst showCollapse = this.placement === 'header' || (this.placement !== 'inset' && state === 'expanded');\n\t\tconst showExpand = this.placement === 'inset' || (this.placement !== 'header' && state === 'collapsed');\n\n\t\treturn (\n\t\t\t<span class=\"rui-sidebar__trigger-icon\" aria-hidden=\"true\">\n\t\t\t\t{showCollapse ? (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"rui-sidebar__trigger-glyph rui-sidebar__trigger-glyph--collapse\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d=\"M3 5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n\t\t\t\t\t\t<path d=\"M9 3v18\" />\n\t\t\t\t\t\t<path d=\"m14 15 3-3-3-3\" />\n\t\t\t\t\t</svg>\n\t\t\t\t) : null}\n\t\t\t\t{showExpand ? (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"rui-sidebar__trigger-glyph rui-sidebar__trigger-glyph--expand\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d=\"M3 5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n\t\t\t\t\t\t<path d=\"M9 3v18\" />\n\t\t\t\t\t\t<path d=\"m14 9-3 3 3 3\" />\n\t\t\t\t\t</svg>\n\t\t\t\t) : null}\n\t\t\t</span>\n\t\t);\n\t}\n\n\toverride render() {\n\t\tconst sidebar = this.resolveSidebar();\n\t\tconst controlsId = sidebar?.id || this.controls || null;\n\t\tconst buttonLabel = this.resolvedButtonLabel();\n\t\tconst state = sidebar ? this.readState(sidebar) : 'expanded';\n\t\treturn (\n\t\t\t<button\n\t\t\t\tdata-ref=\"button\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass={`rui-button rui-button--${this.variant} rui-button--${this.size} rui-sidebar__trigger ${this.placementClass()}`.trim()}\n\t\t\t\tdata-sidebar-state={state}\n\t\t\t\taria-expanded={String(state === 'expanded')}\n\t\t\t\taria-controls={controlsId || null}\n\t\t\t\taria-label={buttonLabel}\n\t\t\t\ton-native:click={this.onClick}\n\t\t\t>\n\t\t\t\t<slot>{this.renderDefaultIcon()}</slot>\n\t\t\t</button>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiSidebarProps, RuiSidebarCollapsible, RuiSidebarSide, RuiSidebarVariant } from './sidebar.script';\nimport { RuiSidebar as RuiSidebarElement } from './sidebar.script';\nimport type { RuiSidebarTriggerProps } from './sidebar-trigger.script';\nimport { RuiSidebarTrigger as RuiSidebarTriggerElement } from './sidebar-trigger.script';\nimport './sidebar.css';\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\nexport type RuiSidebarProviderProps = {\n\t/** Layout context. `default` is the standard shell; `full` removes chrome. */\n\tlayout?: 'default' | 'full';\n\t/** Slot for the sidebar element. */\n\tsidebar?: JsxRenderable;\n\t/** Slot for the inset (main content). */\n\tchildren?: JsxRenderable;\n\t/** Extra class names. */\n\tclass?: string;\n};\n\n/**\n * `<div>` shell that wraps the sidebar and the main inset. Reflects\n * `data-layout` so stylesheets can adapt. Plays the role of\n * `SidebarProvider` from common sidebar kits, but without a runtime context \u2014\n * coordination between trigger, sidebar, and inset is achieved through\n * `id`/`aria-controls` and shared `data-*` attributes.\n */\nexport function RuiSidebarProvider({\n\tlayout = 'default',\n\tsidebar,\n\tchildren,\n\tclass: className,\n}: RuiSidebarProviderProps) {\n\treturn (\n\t\t<div class={cx('rui-sidebar-provider', className)} data-layout={layout}>\n\t\t\t{sidebar}\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiSidebarHeaderProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Accessible name for the header region. */\n\t'aria-label'?: string;\n};\n\n/** Top section of the sidebar pane (logo, search, primary trigger). */\nexport function RuiSidebarHeader({ children, class: className, 'aria-label': ariaLabel }: RuiSidebarHeaderProps) {\n\treturn (\n\t\t<div class={cx('rui-sidebar__header', className)} aria-label={ariaLabel}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiSidebarContentProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Optional label for the scrolling content region. */\n\t'aria-label'?: string;\n};\n\n/** Scrollable middle section. Multiple allowed; each becomes its own region. */\nexport function RuiSidebarContent({ children, class: className, 'aria-label': ariaLabel }: RuiSidebarContentProps) {\n\treturn (\n\t\t<div class={cx('rui-sidebar__content', className)} aria-label={ariaLabel}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type RuiSidebarFooterProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** Pinned bottom section (user, theme toggle, settings). */\nexport function RuiSidebarFooter({ children, class: className }: RuiSidebarFooterProps) {\n\treturn <div class={cx('rui-sidebar__footer', className)}>{children}</div>;\n}\n\nexport type RuiSidebarSeparatorProps = {\n\tclass?: string;\n\t/** Accessible label for the separator. */\n\t'aria-label'?: string;\n};\n\n/** Horizontal rule between sidebar sections. */\nexport function RuiSidebarSeparator({ class: className, 'aria-label': ariaLabel }: RuiSidebarSeparatorProps) {\n\treturn (\n\t\t<hr\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=\"horizontal\"\n\t\t\taria-label={ariaLabel}\n\t\t\tclass={cx('rui-sidebar__separator', className)}\n\t\t/>\n\t);\n}\n\nexport type RuiSidebarGroupProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Accessible label for the group region. */\n\t'aria-label'?: string;\n};\n\n/** Landmark group of related sidebar items. */\nexport function RuiSidebarGroup({ children, class: className, 'aria-label': ariaLabel }: RuiSidebarGroupProps) {\n\treturn (\n\t\t<section class={cx('rui-sidebar__group', className)} aria-label={ariaLabel}>\n\t\t\t{children}\n\t\t</section>\n\t);\n}\n\nexport type RuiSidebarGroupLabelProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Optional `id` so the group can be referenced by `aria-labelledby`. */\n\tid?: string;\n};\n\n/** Heading for a sidebar group. */\nexport function RuiSidebarGroupLabel({ children, class: className, id }: RuiSidebarGroupLabelProps) {\n\treturn (\n\t\t<h2 id={id} class={cx('rui-sidebar__group-label', className)}>\n\t\t\t{children}\n\t\t</h2>\n\t);\n}\n\nexport type RuiSidebarGroupActionProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Accessible label for the action button. */\n\t'aria-label'?: string;\n};\n\n/** Top-right action button inside a group header. */\nexport function RuiSidebarGroupAction({\n\tchildren,\n\tclass: className,\n\t'aria-label': ariaLabel,\n}: RuiSidebarGroupActionProps) {\n\treturn (\n\t\t<button type=\"button\" aria-label={ariaLabel} class={cx('rui-sidebar__group-action', className)}>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\nexport type RuiSidebarGroupHeaderProps = {\n\tlabel: JsxRenderable;\n\taction?: JsxRenderable;\n\tclass?: string;\n};\n\n/** Convenience: a label + optional action in one row. */\nexport function RuiSidebarGroupHeader({ label, action, class: className }: RuiSidebarGroupHeaderProps) {\n\treturn (\n\t\t<div class={cx('rui-sidebar__group-header', className)}>\n\t\t\t<RuiSidebarGroupLabel>{label}</RuiSidebarGroupLabel>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\nexport type RuiSidebarMenuProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Accessible label for the menu list. */\n\t'aria-label'?: string;\n};\n\n/** `<ul>` of sidebar items. */\nexport function RuiSidebarMenu({ children, class: className, 'aria-label': ariaLabel }: RuiSidebarMenuProps) {\n\treturn (\n\t\t<ul role=\"list\" class={cx('rui-sidebar__menu', className)} aria-label={ariaLabel}>\n\t\t\t{children}\n\t\t</ul>\n\t);\n}\n\nexport type RuiSidebarMenuItemProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n};\n\n/** `<li>` of a sidebar menu. */\nexport function RuiSidebarMenuItem({ children, class: className }: RuiSidebarMenuItemProps) {\n\treturn <li class={cx('rui-sidebar__menu-item', className)}>{children}</li>;\n}\n\nexport type RuiSidebarMenuButtonProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Mark this button as the current page. */\n\tisActive?: boolean;\n\t/** Render as a different element via the `as` prop. Default: `a` when `href` is set, else `button`. */\n\tas?: 'a' | 'button';\n\t/** Forwarded to anchor or button. */\n\thref?: string;\n\ttype?: 'button' | 'submit' | 'reset';\n\t/** Optional tooltip label for collapsed-icon mode. */\n\ttooltip?: string;\n\tdisabled?: boolean;\n\t/** Click handler for `button` mode. */\n\tonClick?: (event: Event) => void;\n};\n\n/**\n * The clickable surface inside a `RuiSidebarMenuItem`. When the sidebar\n * collapses to icon mode, only this element remains visible; it must keep an\n * accessible name via `tooltip` or visible children.\n */\nexport function RuiSidebarMenuButton({\n\tchildren,\n\tclass: className,\n\tisActive,\n\tas,\n\thref,\n\ttype = 'button',\n\ttooltip,\n\tdisabled,\n\tonClick,\n}: RuiSidebarMenuButtonProps) {\n\tconst classNames = cx('rui-sidebar__menu-button', isActive && 'rui-sidebar__menu-button--active', className);\n\tconst title = tooltip;\n\tconst ariaLabel = typeof children === 'string' ? undefined : tooltip;\n\n\tif (as === 'button' || (!as && !href)) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype={type}\n\t\t\t\tclass={classNames}\n\t\t\t\taria-current={isActive ? 'page' : undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttitle={title}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\ton:click={onClick}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<a\n\t\t\thref={href}\n\t\t\tclass={classNames}\n\t\t\taria-current={isActive ? 'page' : undefined}\n\t\t\ttitle={title}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nexport type RuiSidebarMenuActionProps = RuiSidebarMenuButtonProps;\n\n/** Smaller, secondary button (e.g. `+ New`) below a menu or group. */\nexport function RuiSidebarMenuAction(props: RuiSidebarMenuActionProps) {\n\tconst { class: className, ...rest } = props;\n\treturn <RuiSidebarMenuButton class={cx('rui-sidebar__menu-action', className)} {...rest} />;\n}\n\nexport type RuiSidebarInsetProps = {\n\tchildren: JsxRenderable;\n\tclass?: string;\n\t/** Optional `id` so the sidebar trigger can target the main landmark. */\n\tid?: string;\n};\n\n/** The main content area that sits next to the sidebar. */\nexport function RuiSidebarInset({ children, class: className, id }: RuiSidebarInsetProps) {\n\treturn (\n\t\t<main id={id} class={cx('rui-sidebar__inset', className)}>\n\t\t\t{children}\n\t\t</main>\n\t);\n}\n\nexport type RuiSidebarViewProps = RuiSidebarProps &\n\tRadiantSlotProps & {\n\t\tid: string;\n\t\tchildren: JsxRenderable;\n\t\tclass?: string;\n\t};\n\nexport const RuiSidebar = defineRadiantView(\n\tRuiSidebarElement,\n\t({\n\t\tslot,\n\t\tid,\n\t\tvariant,\n\t\tside,\n\t\tcollapsible,\n\t\tdefaultOpen,\n\t\topen,\n\t\tdefaultWidth,\n\t\twidth,\n\t\tmobileBreakpoint,\n\t\tlabel,\n\t\tclass: className,\n\t\tchildren,\n\t}: RuiSidebarViewProps) => (\n\t\t<rui-sidebar\n\t\t\tslot={slot}\n\t\t\tid={id}\n\t\t\tclass={className}\n\t\t\tvariant={variant as RuiSidebarVariant | undefined}\n\t\t\tside={side as RuiSidebarSide | undefined}\n\t\t\tcollapsible={collapsible as RuiSidebarCollapsible | undefined}\n\t\t\tprop:defaultOpen={defaultOpen}\n\t\t\tprop:open={open}\n\t\t\tprop:defaultWidth={defaultWidth}\n\t\t\tprop:width={width}\n\t\t\tprop:mobileBreakpoint={mobileBreakpoint}\n\t\t\tlabel={label}\n\t\t>\n\t\t\t{children}\n\t\t</rui-sidebar>\n\t),\n);\n\nexport type RuiSidebarTriggerViewProps = RuiSidebarTriggerProps &\n\tRadiantSlotProps & {\n\t\tchildren?: JsxRenderable;\n\t\tclass?: string;\n\t};\n\nexport const RuiSidebarTrigger = defineRadiantView(\n\tRuiSidebarTriggerElement,\n\t({\n\t\tslot,\n\t\tcontrols,\n\t\ttriggerLabel,\n\t\tplacement,\n\t\tvariant,\n\t\tsize,\n\t\tclass: className,\n\t\tchildren,\n\t}: RuiSidebarTriggerViewProps) => (\n\t\t<rui-sidebar-trigger\n\t\t\tslot={slot}\n\t\t\tclass={className}\n\t\t\tprop:controls={controls}\n\t\t\tprop:buttonLabel={triggerLabel ?? 'Toggle sidebar'}\n\t\t\tattr:data-button-label={triggerLabel ?? 'Toggle sidebar'}\n\t\t\tprop:placement={placement}\n\t\t\tattr:data-placement={placement}\n\t\t\tvariant={variant}\n\t\t\tsize={size}\n\t\t>\n\t\t\t{children}\n\t\t</rui-sidebar-trigger>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiSliderVariant = 'single' | 'range';\n\nexport type RuiSliderProps = {\n\tvariant?: RuiSliderVariant;\n\tvalue?: number;\n\trangeMin?: number;\n\trangeMax?: number;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tminDistance?: number;\n\tdisabled?: boolean;\n\tlabel?: string;\n\tname?: string;\n};\n\nexport type RuiSliderChangeDetail = { value: number } | { values: [number, number] };\n\ntype RuiSliderBindings = {\n\tdisabled: boolean;\n\tname: string;\n\tlabel: string;\n};\n\n/**\n * `<rui-slider>` \u2014 select a value from a continuous or discrete range.\n *\n * Single mode uses native `<input type=\"range\">`. Range mode implements the APG\n * multi-thumb slider pattern with two `role=\"slider\"` thumbs on one track.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/slider/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/slider-multithumb/\n *\n * @element rui-slider\n * @fires rui-change\n */\n@customElement('rui-slider')\nexport class RuiSlider extends RadiantElement<RuiSliderBindings> {\n\t@prop({ type: String, defaultValue: 'single' }) variant: RuiSliderVariant;\n\t@prop({ type: Number, reflect: true, defaultValue: 50 }) value: number;\n\t@prop({ type: Number, reflect: true, attribute: 'range-min', defaultValue: 25 }) rangeMin: number;\n\t@prop({ type: Number, reflect: true, attribute: 'range-max', defaultValue: 75 }) rangeMax: number;\n\t@prop({ type: Number, defaultValue: 0 }) min: number;\n\t@prop({ type: Number, defaultValue: 100 }) max: number;\n\t@prop({ type: Number, defaultValue: 1 }) step: number;\n\t@prop({ type: Number, defaultValue: 0 }) minDistance: number;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: String, defaultValue: '' }) name: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiSliderChangeDetail>;\n\n\t@query({ ref: 'input' }) inputTarget: HTMLInputElement;\n\t@query({ ref: 'value' }) valueTarget: HTMLElement;\n\t@query({ ref: 'rangeMinThumb' }) rangeMinThumb: HTMLElement;\n\t@query({ ref: 'rangeMaxThumb' }) rangeMaxThumb: HTMLElement;\n\t@query({ ref: 'rangeFill' }) rangeFill: HTMLElement;\n\n\tprivate interacting = false;\n\tprivate activeThumb: 'min' | 'max' | null = null;\n\t/** Live range while dragging \u2014 avoids reactive prop updates that re-render mid-drag. */\n\tprivate pendingRange: [number, number] | null = null;\n\n\t/**\n\t * Only disabled/tabindex/aria-label/name are bound below \u2014 none of them\n\t * change during a drag. The value text and every aria-value* attribute\n\t * stay plain reads + imperative writes (paintRangeUi/updateDisplayedValue)\n\t * deliberately: they must show the LIVE pointer position while dragging,\n\t * before pendingRange commits to the reactive value/rangeMin/rangeMax\n\t * props. A binding only reacts to committed prop changes, so it cannot\n\t * replace that live-preview write without losing drag feedback \u2014 this\n\t * isn't a caution-driven exception, it's the correct tool for the job.\n\t */\n\tprivate readonly resolvedDisabledTabindex = this.$.disabled.map((disabled) => (disabled ? -1 : 0));\n\tprivate readonly resolvedMinLabel = this.$.label.map((label) => (label ? `${label} minimum` : 'Minimum value'));\n\tprivate readonly resolvedMaxLabel = this.$.label.map((label) => (label ? `${label} maximum` : 'Maximum value'));\n\tprivate readonly resolvedName = this.$.name.map((name) => name || undefined);\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tif (this.variant === 'single') {\n\t\t\t\tthis.syncInputFromValue();\n\t\t\t} else {\n\t\t\t\tthis.syncRangeUi();\n\t\t\t}\n\t\t});\n\t}\n\n\t@onUpdated(['value', 'min', 'max', 'step', 'variant'])\n\tonSinglePropsUpdated(): void {\n\t\tif (this.variant !== 'single' || this.interacting) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.syncInputFromValue();\n\t}\n\n\t@onUpdated(['rangeMin', 'rangeMax', 'min', 'max', 'step', 'minDistance', 'variant'])\n\tonRangePropsUpdated(): void {\n\t\tif (this.variant !== 'range' || this.activeThumb) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.syncRangeUi();\n\t}\n\n\tprivate clamp(next: number): number {\n\t\tconst stepped = Math.round(next / this.step) * this.step;\n\t\treturn Math.min(this.max, Math.max(this.min, stepped));\n\t}\n\n\tprivate normalizeRange(low = this.rangeMin, high = this.rangeMax): [number, number] {\n\t\tlet nextLow = this.clamp(low);\n\t\tlet nextHigh = this.clamp(high);\n\n\t\tif (nextLow > nextHigh) {\n\t\t\t[nextLow, nextHigh] = [nextHigh, nextLow];\n\t\t}\n\n\t\tif (nextHigh - nextLow < this.minDistance) {\n\t\t\tif (this.activeThumb === 'min') {\n\t\t\t\tnextLow = this.clamp(nextHigh - this.minDistance);\n\t\t\t} else {\n\t\t\t\tnextHigh = this.clamp(nextLow + this.minDistance);\n\t\t\t}\n\t\t}\n\n\t\treturn [nextLow, nextHigh];\n\t}\n\n\tprivate getActiveRange(): [number, number] {\n\t\treturn this.normalizeRange(...(this.pendingRange ?? [this.rangeMin, this.rangeMax]));\n\t}\n\n\tprivate percentFor(value: number): number {\n\t\tif (this.max === this.min) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn ((value - this.min) / (this.max - this.min)) * 100;\n\t}\n\n\tprivate valueFromPointer(clientX: number, track: HTMLElement): number {\n\t\tconst rect = track.getBoundingClientRect();\n\t\tconst ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\n\t\treturn this.clamp(this.min + ratio * (this.max - this.min));\n\t}\n\n\tprivate syncInputFromValue(): void {\n\t\tconst input = this.inputTarget;\n\t\tif (!input) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextValue = String(this.value);\n\t\tif (input.value !== nextValue) {\n\t\t\tinput.value = nextValue;\n\t\t}\n\n\t\tinput.min = String(this.min);\n\t\tinput.max = String(this.max);\n\t\tinput.step = String(this.step);\n\t\tthis.updateDisplayedValue(this.value);\n\t}\n\n\tprivate updateDisplayedValue(next: number): void {\n\t\tif (this.valueTarget) {\n\t\t\tthis.valueTarget.textContent = String(next);\n\t\t}\n\n\t\tif (this.inputTarget) {\n\t\t\tthis.inputTarget.setAttribute('aria-valuenow', String(next));\n\t\t}\n\t}\n\n\tprivate syncRangeUi(): void {\n\t\tconst [low, high] = this.getActiveRange();\n\n\t\tif (!this.activeThumb) {\n\t\t\tif (low !== this.rangeMin) {\n\t\t\t\tthis.rangeMin = low;\n\t\t\t}\n\t\t\tif (high !== this.rangeMax) {\n\t\t\t\tthis.rangeMax = high;\n\t\t\t}\n\t\t}\n\n\t\tthis.paintRangeUi(low, high);\n\t}\n\n\tprivate paintRangeUi(low: number, high: number): void {\n\t\tconst lowPercent = this.percentFor(low);\n\t\tconst highPercent = this.percentFor(high);\n\t\tconst track = this.querySelector<HTMLElement>('.rui-slider__range-track');\n\n\t\tif (track) {\n\t\t\ttrack.style.setProperty('--rui-slider-min', `${lowPercent}%`);\n\t\t\ttrack.style.setProperty('--rui-slider-max', `${highPercent}%`);\n\t\t}\n\n\t\tif (this.rangeMinThumb) {\n\t\t\tthis.rangeMinThumb.setAttribute('aria-valuemin', String(this.min));\n\t\t\tthis.rangeMinThumb.setAttribute('aria-valuemax', String(high));\n\t\t\tthis.rangeMinThumb.setAttribute('aria-valuenow', String(low));\n\t\t}\n\n\t\tif (this.rangeMaxThumb) {\n\t\t\tthis.rangeMaxThumb.setAttribute('aria-valuemin', String(low));\n\t\t\tthis.rangeMaxThumb.setAttribute('aria-valuemax', String(this.max));\n\t\t\tthis.rangeMaxThumb.setAttribute('aria-valuenow', String(high));\n\t\t}\n\n\t\tif (this.rangeFill) {\n\t\t\tthis.rangeFill.style.left = `${lowPercent}%`;\n\t\t\tthis.rangeFill.style.width = `${highPercent - lowPercent}%`;\n\t\t}\n\n\t\tif (this.valueTarget) {\n\t\t\tthis.valueTarget.textContent = `${low} \u2013 ${high}`;\n\t\t}\n\t}\n\n\tprivate commitRange(emit = true): void {\n\t\tconst [low, high] = this.getActiveRange();\n\t\tconst changed = low !== this.rangeMin || high !== this.rangeMax;\n\t\tthis.pendingRange = null;\n\t\tthis.rangeMin = low;\n\t\tthis.rangeMax = high;\n\t\tthis.paintRangeUi(low, high);\n\n\t\tif (emit && changed) {\n\t\t\tthis.changeEvent.emit({ values: [low, high] });\n\t\t}\n\t}\n\n\tprivate setRangeValue(thumb: 'min' | 'max', next: number): void {\n\t\tthis.activeThumb = thumb;\n\t\tconst [currentLow, currentHigh] = this.pendingRange ?? [this.rangeMin, this.rangeMax];\n\t\tconst [low, high] = this.normalizeRange(\n\t\t\tthumb === 'min' ? next : currentLow,\n\t\t\tthumb === 'max' ? next : currentHigh,\n\t\t);\n\t\tthis.pendingRange = [low, high];\n\t\tthis.paintRangeUi(low, high);\n\t}\n\n\tprivate commitSingleValue(input: HTMLInputElement): void {\n\t\tconst next = Number(input.value);\n\t\tthis.updateDisplayedValue(next);\n\n\t\tif (next === this.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.value = next;\n\t\tthis.changeEvent.emit({ value: next });\n\t}\n\n\t@onEvent({ ref: 'input', type: 'pointerdown' })\n\tonPointerDown(event: PointerEvent): void {\n\t\tif (event.button !== 0 || this.variant !== 'single') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interacting = true;\n\t}\n\n\t@onEvent({ ref: 'input', type: 'pointerup' })\n\tonPointerUp(event: Event): void {\n\t\tif (!this.interacting || this.variant !== 'single') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interacting = false;\n\t\tthis.commitSingleValue(event.target as HTMLInputElement);\n\t}\n\n\t@onEvent({ ref: 'input', type: 'pointercancel' })\n\tonPointerCancel(event: Event): void {\n\t\tif (!this.interacting || this.variant !== 'single') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interacting = false;\n\t\tthis.commitSingleValue(event.target as HTMLInputElement);\n\t}\n\n\t@onEvent({ ref: 'input', type: 'input' })\n\tonInput(event: Event): void {\n\t\tif (this.variant !== 'single') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = event.target as HTMLInputElement;\n\t\tconst next = Number(input.value);\n\t\tthis.updateDisplayedValue(next);\n\n\t\tif (this.interacting) {\n\t\t\tthis.changeEvent.emit({ value: next });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.commitSingleValue(input);\n\t}\n\n\t@onEvent({ ref: 'input', type: 'change' })\n\tonChange(event: Event): void {\n\t\tif (this.variant !== 'single') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interacting = false;\n\t\tthis.commitSingleValue(event.target as HTMLInputElement);\n\t}\n\n\t@onEvent({ selector: '[data-thumb]', type: 'pointerdown' })\n\tonThumbPointerDown(event: PointerEvent): void {\n\t\tif (event.button !== 0 || this.variant !== 'range' || this.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst thumbElement = (event.target as HTMLElement).closest<HTMLElement>('[data-thumb]');\n\t\tif (!thumbElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst thumb = thumbElement.getAttribute('data-thumb') as 'min' | 'max';\n\t\tthis.activeThumb = thumb;\n\t\tthis.pendingRange = [this.rangeMin, this.rangeMax];\n\t\tthumbElement.setPointerCapture(event.pointerId);\n\t\tevent.preventDefault();\n\t}\n\n\t@onEvent({ selector: '[data-thumb]', type: 'pointermove' })\n\tonThumbPointerMove(event: PointerEvent): void {\n\t\tif (!this.activeThumb || this.variant !== 'range') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst track = this.querySelector<HTMLElement>('.rui-slider__range-track');\n\t\tif (!track) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setRangeValue(this.activeThumb, this.valueFromPointer(event.clientX, track));\n\n\t\tif (this.pendingRange) {\n\t\t\tthis.changeEvent.emit({ values: this.pendingRange });\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[data-thumb]', type: 'pointerup' })\n\tonThumbPointerUp(): void {\n\t\tif (!this.activeThumb || this.variant !== 'range') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.commitRange();\n\t\tthis.activeThumb = null;\n\t}\n\n\t@onEvent({ selector: '[data-thumb]', type: 'pointercancel' })\n\tonThumbPointerCancel(): void {\n\t\tif (!this.activeThumb || this.variant !== 'range') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pendingRange = null;\n\t\tthis.syncRangeUi();\n\t\tthis.activeThumb = null;\n\t}\n\n\t@onEvent({ selector: '[data-thumb]', type: 'keydown' })\n\tonThumbKeydown(event: KeyboardEvent): void {\n\t\tif (this.variant !== 'range' || this.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst thumbElement = (event.target as HTMLElement).closest<HTMLElement>('[data-thumb]');\n\t\tif (!thumbElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst thumb = thumbElement.getAttribute('data-thumb') as 'min' | 'max';\n\t\tconst current = thumb === 'min' ? this.rangeMin : this.rangeMax;\n\t\tlet next = current;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowUp':\n\t\t\t\tnext = this.clamp(current + this.step);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowDown':\n\t\t\t\tnext = this.clamp(current - this.step);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tnext = this.min;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tnext = this.max;\n\t\t\t\tbreak;\n\t\t\tcase 'PageUp':\n\t\t\t\tnext = this.clamp(current + this.step * 10);\n\t\t\t\tbreak;\n\t\t\tcase 'PageDown':\n\t\t\t\tnext = this.clamp(current - this.step * 10);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.setRangeValue(thumb, next);\n\t\tthis.commitRange(false);\n\t\tthis.changeEvent.emit({ values: [this.rangeMin, this.rangeMax] });\n\t\tthis.activeThumb = null;\n\t}\n\n\toverride render() {\n\t\tif (this.variant === 'range') {\n\t\t\treturn (\n\t\t\t\t<div class=\"rui-slider rui-slider--range\">\n\t\t\t\t\t{this.label ? <span class=\"rui-slider__label\">{this.label}</span> : null}\n\t\t\t\t\t<div class=\"rui-slider__range\">\n\t\t\t\t\t\t<div class=\"rui-slider__range-track\">\n\t\t\t\t\t\t\t<div class=\"rui-slider__range-fill\" data-ref=\"rangeFill\" />\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"rui-slider__thumb\"\n\t\t\t\t\t\t\t\tdata-ref=\"rangeMinThumb\"\n\t\t\t\t\t\t\t\tdata-thumb=\"min\"\n\t\t\t\t\t\t\t\trole=\"slider\"\n\t\t\t\t\t\t\t\ttabindex={this.resolvedDisabledTabindex}\n\t\t\t\t\t\t\t\taria-label={this.resolvedMinLabel}\n\t\t\t\t\t\t\t\taria-valuemin={this.min}\n\t\t\t\t\t\t\t\taria-valuemax={this.rangeMax}\n\t\t\t\t\t\t\t\taria-valuenow={this.rangeMin}\n\t\t\t\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"rui-slider__thumb\"\n\t\t\t\t\t\t\t\tdata-ref=\"rangeMaxThumb\"\n\t\t\t\t\t\t\t\tdata-thumb=\"max\"\n\t\t\t\t\t\t\t\trole=\"slider\"\n\t\t\t\t\t\t\t\ttabindex={this.resolvedDisabledTabindex}\n\t\t\t\t\t\t\t\taria-label={this.resolvedMaxLabel}\n\t\t\t\t\t\t\t\taria-valuemin={this.rangeMin}\n\t\t\t\t\t\t\t\taria-valuemax={this.max}\n\t\t\t\t\t\t\t\taria-valuenow={this.rangeMax}\n\t\t\t\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"rui-slider__value\" data-ref=\"value\" aria-hidden=\"true\">\n\t\t\t\t\t\t{this.rangeMin} \u2013 {this.rangeMax}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<label class=\"rui-slider\">\n\t\t\t\t{this.label ? <span class=\"rui-slider__label\">{this.label}</span> : null}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tdata-ref=\"input\"\n\t\t\t\t\tdata-rui-control\n\t\t\t\t\tdata-rui-control-type=\"number\"\n\t\t\t\t\tclass=\"rui-slider__input\"\n\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\tname={this.resolvedName}\n\t\t\t\t\taria-valuemin={this.min}\n\t\t\t\t\taria-valuemax={this.max}\n\t\t\t\t\taria-valuenow={this.value}\n\t\t\t\t/>\n\t\t\t\t<span class=\"rui-slider__value\" data-ref=\"value\" aria-hidden=\"true\">\n\t\t\t\t\t{this.value}\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t);\n\t}\n}\n", "import type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiSliderProps } from './slider.script';\nimport { RuiSlider as RuiSliderElement } from './slider.script';\nimport './slider.css';\n\nexport type RuiSliderViewProps = RuiSliderProps &\n\tRadiantSlotProps & {\n\t\tvalues?: [number, number];\n\t};\n\nexport const RuiSlider = defineRadiantView(\n\tRuiSliderElement,\n\t({ slot, variant, value, values, min, max, step, minDistance, disabled, label, name }: RuiSliderViewProps) => (\n\t\t<rui-slider\n\t\t\tslot={slot}\n\t\t\tvariant={variant}\n\t\t\tvalue={value}\n\t\t\trangeMin={values?.[0]}\n\t\t\trangeMax={values?.[1]}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tminDistance={minDistance}\n\t\t\tdisabled={disabled}\n\t\t\tlabel={label}\n\t\t\tname={name}\n\t\t/>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop, state } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiSpinbuttonProps = {\n\tvalue?: number;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdisabled?: boolean;\n\tlabel?: string;\n\tname?: string;\n};\n\nexport type RuiSpinbuttonChangeDetail = { value: number };\n\ntype RuiSpinbuttonBindings = {\n\tvalue: number;\n\tdisabled: boolean;\n\tlabel: string;\n\tname: string;\n\tmin: number;\n\tmax: number;\n\tdecreaseDisabled: boolean;\n\tincreaseDisabled: boolean;\n};\n\n/**\n * `<rui-spinbutton>` \u2014 an input restricted to a discrete numeric range.\n *\n * Implements the APG Spinbutton pattern with `role=\"spinbutton\"` on a native\n * number-like text field, plus decrement/increment buttons.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/\n *\n * @element rui-spinbutton\n * @slot decrease - Optional custom decrease control. Use `data-spinbutton-action=\"decrease\"`.\n * @slot increase - Optional custom increase control. Use `data-spinbutton-action=\"increase\"`.\n * @fires rui-change\n */\n@customElement('rui-spinbutton')\nexport class RuiSpinbutton extends RadiantElement<RuiSpinbuttonBindings> {\n\t@prop({ type: Number, reflect: true, defaultValue: 0 }) value: number;\n\t@prop({ type: Number, defaultValue: 0 }) min: number;\n\t@prop({ type: Number, defaultValue: 100 }) max: number;\n\t@prop({ type: Number, defaultValue: 1 }) step: number;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: String, defaultValue: '' }) name: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiSpinbuttonChangeDetail>;\n\n\t@state decreaseDisabled = false;\n\t@state increaseDisabled = false;\n\n\tprivate readonly nameAttr = this.$.name.map((name) => name || undefined);\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\t/** Derived from disabled/value/min/max \u2014 recomputed here instead of per-render. */\n\t@onUpdated(['disabled', 'value', 'min', 'max'])\n\tonRangeUpdated(): void {\n\t\tthis.decreaseDisabled = this.isDecreaseDisabled();\n\t\tthis.increaseDisabled = this.isIncreaseDisabled();\n\t\tqueueMicrotask(() => this.syncSlottedStepperControls());\n\t}\n\n\tprivate syncSlottedStepperControls(): void {\n\t\tconst decreaseDisabled = this.isDecreaseDisabled();\n\t\tconst increaseDisabled = this.isIncreaseDisabled();\n\n\t\tfor (const button of this.querySelectorAll<HTMLButtonElement>('[slot][data-spinbutton-action=\"decrease\"]')) {\n\t\t\tbutton.disabled = decreaseDisabled;\n\t\t}\n\n\t\tfor (const button of this.querySelectorAll<HTMLButtonElement>('[slot][data-spinbutton-action=\"increase\"]')) {\n\t\t\tbutton.disabled = increaseDisabled;\n\t\t}\n\t}\n\n\tprivate isDecreaseDisabled(): boolean {\n\t\treturn this.disabled || this.value <= this.min;\n\t}\n\n\tprivate isIncreaseDisabled(): boolean {\n\t\treturn this.disabled || this.value >= this.max;\n\t}\n\n\tprivate clamp(next: number): number {\n\t\tconst stepped = Math.round(next / this.step) * this.step;\n\t\treturn Math.min(this.max, Math.max(this.min, stepped));\n\t}\n\n\tprivate setValue(next: number): void {\n\t\tconst value = this.clamp(next);\n\t\tif (value === this.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.changeEvent.emit({ value });\n\t}\n\n\t@onEvent({ selector: '[data-spinbutton-action=\"decrease\"]', type: 'click' })\n\tdecrement(): void {\n\t\tif (this.isDecreaseDisabled()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setValue(this.value - this.step);\n\t}\n\n\t@onEvent({ selector: '[data-spinbutton-action=\"increase\"]', type: 'click' })\n\tincrement(): void {\n\t\tif (this.isIncreaseDisabled()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setValue(this.value + this.step);\n\t}\n\n\t@onEvent({ ref: 'input', type: 'change' })\n\tonChange(event: Event): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tconst parsed = Number(input.value);\n\t\tthis.setValue(Number.isFinite(parsed) ? parsed : this.value);\n\t\tinput.value = String(this.value);\n\t}\n\n\t@onEvent({ ref: 'input', type: 'keydown' })\n\tonKeydown(event: KeyboardEvent): void {\n\t\tif (this.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowUp') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.increment();\n\t\t} else if (event.key === 'ArrowDown') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.decrement();\n\t\t} else if (event.key === 'Home') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.setValue(this.min);\n\t\t} else if (event.key === 'End') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.setValue(this.max);\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-spinbutton\">\n\t\t\t\t{this.label ? (\n\t\t\t\t\t<span class=\"rui-spinbutton__label\" id={`${this.id || 'spin'}-label`}>\n\t\t\t\t\t\t{this.$.label}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t<div class=\"rui-spinbutton__control\">\n\t\t\t\t\t<slot name=\"decrease\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"rui-button rui-button--outline rui-button--sm\"\n\t\t\t\t\t\t\tdata-spinbutton-action=\"decrease\"\n\t\t\t\t\t\t\taria-label=\"Decrease\"\n\t\t\t\t\t\t\tdisabled={this.$.decreaseDisabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\u2212\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</slot>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\tdata-ref=\"input\"\n\t\t\t\t\t\tdata-rui-control\n\t\t\t\t\t\tdata-rui-control-type=\"number\"\n\t\t\t\t\t\tclass=\"rui-spinbutton__input\"\n\t\t\t\t\t\trole=\"spinbutton\"\n\t\t\t\t\t\tprop:value={this.$.value.map(String)}\n\t\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\t\tname={this.nameAttr}\n\t\t\t\t\t\taria-valuemin={this.$.min}\n\t\t\t\t\t\taria-valuemax={this.$.max}\n\t\t\t\t\t\taria-valuenow={this.$.value}\n\t\t\t\t\t\taria-label={this.resolvedAriaLabel}\n\t\t\t\t\t/>\n\t\t\t\t\t<slot name=\"increase\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"rui-button rui-button--outline rui-button--sm\"\n\t\t\t\t\t\t\tdata-spinbutton-action=\"increase\"\n\t\t\t\t\t\t\taria-label=\"Increase\"\n\t\t\t\t\t\t\tdisabled={this.$.increaseDisabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiSpinbuttonProps } from './spinbutton.script';\nimport { RuiSpinbutton as RuiSpinbuttonElement } from './spinbutton.script';\nimport './spinbutton.css';\n\nexport const RuiSpinbutton = defineRadiantView(\n\tRuiSpinbuttonElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\tmin,\n\t\tmax,\n\t\tstep,\n\t\tdisabled,\n\t\tlabel,\n\t\tname,\n\t\tchildren,\n\t}: WithChildren<RuiSpinbuttonProps & RadiantSlotProps>) => (\n\t\t<rui-spinbutton\n\t\t\tslot={slot}\n\t\t\tvalue={value}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tdisabled={disabled}\n\t\t\tlabel={label}\n\t\t\tname={name}\n\t\t>\n\t\t\t{children}\n\t\t</rui-spinbutton>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiSwitchProps = {\n\t/** Whether the switch is on. Reflects to markup. Default: `false`. */\n\tchecked?: boolean;\n\t/** Disable the switch. Default: `false`. */\n\tdisabled?: boolean;\n\t/** Associates the control with a form field name. */\n\tname?: string;\n};\n\nexport type RuiSwitchChangeDetail = {\n\tchecked: boolean;\n};\n\ntype RuiSwitchBindings = {\n\tchecked: boolean;\n\tdisabled: boolean;\n\tname: string;\n};\n\n/**\n * `<rui-switch>` \u2014 a binary on/off control.\n *\n * Implements the WAI-ARIA APG Switch pattern using a native\n * `<input type=\"checkbox\" role=\"switch\">` wrapped in a `<label>`. The browser\n * owns activation (click on label or control, Space when focused); no click\n * delegation is required. The HTML `checked` attribute conveys state.\n *\n * Prefer Switch over Checkbox when the UI communicates on/off (for example\n * enabling notifications) rather than checked/unchecked membership in a set.\n *\n * Important: the accessible label must not change when the switch state changes.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/switch/\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/switch/examples/switch-checkbox/\n *\n * Keyboard interaction (native to the checkbox):\n * - `Space`: toggle the switch\n *\n * @element rui-switch\n * @slot - Visible label for the switch. Must not change with state.\n * @fires rui-change - Emitted after the checked state changes; `detail.checked` holds the new state.\n */\n@customElement('rui-switch')\nexport class RuiSwitch extends RadiantElement<RuiSwitchBindings> {\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) checked: boolean;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) disabled: boolean;\n\t@prop({ type: String, defaultValue: '' }) name: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiSwitchChangeDetail>;\n\n\tprivate readonly nameAttr = this.$.name.map((name) => name || undefined);\n\n\t@onEvent({ ref: 'input', type: 'change' })\n\tonInputChange(event: Event): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tthis.checked = input.checked;\n\t\tthis.changeEvent.emit({ checked: this.checked });\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<label class=\"rui-switch\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\trole=\"switch\"\n\t\t\t\t\tdata-ref=\"input\"\n\t\t\t\t\tdata-rui-control\n\t\t\t\t\tdata-rui-control-type=\"boolean\"\n\t\t\t\t\tclass=\"rui-switch__input\"\n\t\t\t\t\tprop:checked={this.$.checked}\n\t\t\t\t\tdisabled={this.$.disabled}\n\t\t\t\t\tname={this.nameAttr}\n\t\t\t\t/>\n\t\t\t\t<span class=\"rui-switch__track\" aria-hidden=\"true\">\n\t\t\t\t\t<span class=\"rui-switch__thumb\"></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"rui-switch__label\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiSwitchProps } from './switch.script';\nimport { RuiSwitch as RuiSwitchElement } from './switch.script';\nimport './switch.css';\n\nexport const RuiSwitch = defineRadiantView(\n\tRuiSwitchElement,\n\t({ slot, checked, disabled, name, children }: WithChildren<RuiSwitchProps & RadiantSlotProps>) => (\n\t\t<rui-switch slot={slot} checked={checked} disabled={disabled} name={name}>\n\t\t\t{children}\n\t\t</rui-switch>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiTabsProps = {\n\t/** ID of the initially selected tab. Defaults to the first tab. */\n\tvalue?: string;\n\t/** Accessible name for the tab list. */\n\tlabel?: string;\n\t/**\n\t * When `true` (default), focusing a tab activates it (automatic activation).\n\t * When `false`, Space/Enter activate the focused tab (manual activation).\n\t */\n\tautomatic?: boolean;\n};\n\nexport type RuiTabsChangeDetail = {\n\tvalue: string;\n};\n\n/**\n * `<rui-tabs>` \u2014 layered sections of content with one visible panel at a time.\n *\n * Implements the WAI-ARIA APG Tabs pattern with a `tablist`, `tab` controls, and\n * associated `tabpanel` regions. Automatic activation is the default.\n *\n * Author a `[role=\"tablist\"]` of `[role=\"tab\"]` buttons and matching\n * `[role=\"tabpanel\"]` regions as children. Each tab must have an `id` and\n * `aria-controls` pointing at its panel; each panel must have `aria-labelledby`\n * pointing at its tab.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n *\n * Keyboard interaction:\n * - `Tab`: move focus into the active tab, then to the panel / next page control\n * - `ArrowLeft` / `ArrowRight`: move focus (and activate when automatic)\n * - `Home` / `End`: jump to first / last tab\n * - `Space` / `Enter`: activate the focused tab (manual mode)\n *\n * @element rui-tabs\n * @slot - A tablist and one or more tabpanels.\n * @fires rui-change - Emitted when the selected tab changes.\n */\n@customElement('rui-tabs')\nexport class RuiTabs extends RadiantElement {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: Boolean, defaultValue: true }) automatic: boolean;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiTabsChangeDetail>;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncTablistLabel();\n\t\t\tthis.syncSelection(this.value || this.getTabs()[0]?.id || '');\n\t\t});\n\t}\n\n\t@onUpdated(['value', 'label'])\n\tonPropsUpdated(): void {\n\t\tthis.syncTablistLabel();\n\t\tif (this.value) this.syncSelection(this.value);\n\t}\n\n\tprivate getTabs(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"tab\"]'));\n\t}\n\n\tprivate getPanels(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"tabpanel\"]'));\n\t}\n\n\tprivate syncTablistLabel(): void {\n\t\tconst tablist = this.querySelector<HTMLElement>('[role=\"tablist\"]');\n\t\tif (!tablist || !this.label) return;\n\t\ttablist.setAttribute('aria-label', this.label);\n\t}\n\n\tprivate syncSelection(nextValue: string): void {\n\t\tconst tabs = this.getTabs();\n\t\tconst panels = this.getPanels();\n\t\tif (!tabs.length) return;\n\n\t\tconst selected = tabs.find((tab) => tab.id === nextValue) ?? tabs[0];\n\t\tthis.value = selected.id;\n\n\t\tfor (const tab of tabs) {\n\t\t\tconst isSelected = tab === selected;\n\t\t\ttab.setAttribute('aria-selected', String(isSelected));\n\t\t\ttab.tabIndex = isSelected ? 0 : -1;\n\t\t}\n\n\t\tfor (const panel of panels) {\n\t\t\tconst controls = tabs.find((tab) => tab.getAttribute('aria-controls') === panel.id);\n\t\t\tconst isSelected = controls === selected;\n\t\t\tpanel.hidden = !isSelected;\n\t\t\tif (!panel.hasAttribute('tabindex')) {\n\t\t\t\tpanel.tabIndex = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate activateTab(tab: HTMLElement): void {\n\t\tif (!tab || tab.getAttribute('aria-disabled') === 'true') return;\n\t\tthis.syncSelection(tab.id);\n\t\tthis.changeEvent.emit({ value: tab.id });\n\t}\n\n\t@onEvent({ selector: '[role=\"tab\"]', type: 'click' })\n\tonTabClick(event: Event): void {\n\t\tconst tab = (event.target as HTMLElement).closest('[role=\"tab\"]') as HTMLElement | null;\n\t\tif (!tab || !this.contains(tab)) return;\n\t\tthis.activateTab(tab);\n\t}\n\n\t@onEvent({ selector: '[role=\"tab\"]', type: 'keydown' })\n\tonTabKeydown(event: KeyboardEvent): void {\n\t\tconst tabs = this.getTabs();\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"tab\"]') as HTMLElement | null;\n\t\tif (!current || !tabs.includes(current)) return;\n\n\t\tif (event.key === 'Enter' || event.key === ' ') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.activateTab(current);\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems: tabs,\n\t\t\tcurrent,\n\t\t\tkey: event.key,\n\t\t\torientation: 'horizontal',\n\t\t});\n\t\tif (!result.handled) return;\n\n\t\tevent.preventDefault();\n\t\tif (this.automatic) this.activateTab(result.item);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiTabsProps } from './tabs.script';\nimport { RuiTabs as RuiTabsElement } from './tabs.script';\nimport './tabs.css';\n\nexport type RuiTabItem = {\n\tid: string;\n\tlabel: JsxRenderable;\n\tchildren: JsxRenderable;\n};\n\nexport const RuiTabs = defineRadiantView(\n\tRuiTabsElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\tlabel,\n\t\tautomatic,\n\t\titems,\n\t}: RuiTabsProps &\n\t\tRadiantSlotProps & {\n\t\t\titems: RuiTabItem[];\n\t\t}) => (\n\t\t<rui-tabs slot={slot} value={value} label={label} automatic={automatic}>\n\t\t\t<div class=\"rui-tabs__list\" role=\"tablist\">\n\t\t\t\t{items.map((item) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"rui-tabs__tab\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\tid={`tab-${item.id}`}\n\t\t\t\t\t\taria-controls={`panel-${item.id}`}\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rui-tabs__panel\"\n\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\tid={`panel-${item.id}`}\n\t\t\t\t\taria-labelledby={`tab-${item.id}`}\n\t\t\t\t\ttabindex={0}\n\t\t\t\t\thidden\n\t\t\t\t>\n\t\t\t\t\t{item.children}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</rui-tabs>\n\t),\n);\n", "import { RUI_CONTROL_ATTR } from '../form/control-protocol';\nimport type { RuiInputSize } from '../input';\nimport './textarea.css';\n\nexport type RuiTextareaProps = {\n\tvalue?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tname?: string;\n\trows?: number;\n\tsize?: RuiInputSize;\n\tclass?: string;\n\tid?: string;\n\t'aria-label'?: string;\n\t'on:input'?: (event: Event) => void;\n\t'on:change'?: (event: Event) => void;\n\t'on:blur'?: (event: Event) => void;\n};\n\nfunction cx(...parts: Array<string | false | null | undefined>): string {\n\treturn parts.filter(Boolean).join(' ');\n}\n\n/**\n * Presentational wrapper around a native `<textarea>`.\n *\n * No custom element \u2014 Field owns labeling, `aria-*`, and validation wiring.\n * Marked with `data-rui-control` so `<rui-field>` can discover it.\n */\nexport function RuiTextarea({\n\tvalue,\n\tplaceholder,\n\tdisabled,\n\tname,\n\trows = 3,\n\tsize = 'md',\n\tclass: className,\n\tid,\n\t'aria-label': ariaLabel,\n\t'on:input': onInput,\n\t'on:change': onChange,\n\t'on:blur': onBlur,\n\t...rest\n}: RuiTextareaProps) {\n\treturn (\n\t\t<textarea\n\t\t\tid={id}\n\t\t\t{...{ [RUI_CONTROL_ATTR]: '' }}\n\t\t\tdata-rui-control-type=\"text\"\n\t\t\tclass={cx('rui-textarea', `rui-textarea--${size}`, className)}\n\t\t\tvalue={value}\n\t\t\tplaceholder={placeholder}\n\t\t\tdisabled={disabled}\n\t\t\trows={rows}\n\t\t\tname={name}\n\t\t\taria-label={ariaLabel}\n\t\t\ton:input={onInput}\n\t\t\ton:change={onChange}\n\t\t\ton:blur={onBlur}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n", "import { RadiantElement, bound, customElement, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport {\n\tDEFAULT_TOAST_POSITION,\n\tTOAST_EXIT_MS,\n\tTOAST_LIFETIME,\n\tTOAST_SWIPE_THRESHOLD,\n\ttype ToastId,\n\ttype ToastPosition,\n\ttype ToastVariant,\n\tsplitToastPosition,\n} from './toast-context';\nimport { toastState } from './toast-state';\n\nexport type RuiToastProps = {\n\t/** JSX list reconciliation key (not reflected to the DOM). */\n\tkey?: string | number;\n\ttoastId?: ToastId;\n\ttitle?: string;\n\tdescription?: string;\n\tvariant?: ToastVariant;\n\tduration?: number;\n\tdismissible?: boolean;\n\tcloseButton?: boolean;\n\tactionLabel?: string;\n\tposition?: ToastPosition;\n\t/** When true, plays the exit animation then removes the toast. */\n\tmarkedDelete?: boolean;\n};\n\ntype RuiToastBindings = {\n\ttitle: string;\n\tdescription: string;\n\tvariant: ToastVariant;\n\tactionLabel: string;\n\tcloseButton: boolean;\n};\n\n/**\n * `<rui-toast>` \u2014 a single transient notification in a toaster stack.\n *\n * Prefer the imperative {@link toast} API with `<rui-toaster>`; this element is\n * rendered by the toaster and is not typically authored by hand.\n *\n * @element rui-toast\n */\n@customElement('rui-toast')\nexport class RuiToast extends RadiantElement<RuiToastBindings> {\n\t@prop({ type: String, reflect: true, defaultValue: '' }) toastId: string;\n\t@prop({ type: String, defaultValue: '' }) title: string;\n\t@prop({ type: String, defaultValue: '' }) description: string;\n\t@prop({ type: String, reflect: true, defaultValue: 'default' }) variant: ToastVariant;\n\t@prop({ type: Number, defaultValue: TOAST_LIFETIME }) duration: number;\n\t@prop({ type: Boolean, defaultValue: true }) dismissible: boolean;\n\t@prop({ type: Boolean, defaultValue: false }) closeButton: boolean;\n\t@prop({ type: String, defaultValue: '' }) actionLabel: string;\n\t@prop({ type: String, defaultValue: DEFAULT_TOAST_POSITION }) position: ToastPosition;\n\t@prop({ type: Boolean, defaultValue: false }) markedDelete: boolean;\n\n\t@query({ ref: 'toast' }) toastTarget: HTMLElement;\n\n\tprivate mounted = false;\n\tprivate removed = false;\n\tprivate swiping = false;\n\tprivate swipeOut = false;\n\tprivate swipeAxis: 'x' | 'y' | null = null;\n\tprivate swipeOutDirection: 'left' | 'right' | 'up' | 'down' | null = null;\n\tprivate held = false;\n\tprivate timerReady = false;\n\tprivate timeoutId: ReturnType<typeof setTimeout> | null = null;\n\tprivate pointerStart: { x: number; y: number } | null = null;\n\tprivate dragStartTime: number | null = null;\n\tprivate exitTimer: ReturnType<typeof setTimeout> | null = null;\n\n\t/**\n\t * Wire pointer listeners, then announce mount after paint so enter CSS can run.\n\t * On reconnect, re-announce without restarting the enter sequence.\n\t */\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tconst isReconnect = this.mounted;\n\n\t\tthis.addEventListener('pointerdown', this.onPointerDown);\n\t\tthis.addEventListener('pointermove', this.onPointerMove);\n\t\tthis.addEventListener('pointerup', this.onPointerUp);\n\t\tthis.addEventListener('pointercancel', this.onPointerUp);\n\n\t\tif (isReconnect) {\n\t\t\tthis.syncDomState();\n\t\t\tthis.dispatchEvent(new CustomEvent('rui-toast-mounted', { bubbles: true }));\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timerReady = false;\n\t\trequestAnimationFrame(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (!this.isConnected) return;\n\t\t\t\tthis.mounted = true;\n\t\t\t\tthis.timerReady = true;\n\t\t\t\tthis.syncDomState();\n\t\t\t\tthis.dispatchEvent(new CustomEvent('rui-toast-mounted', { bubbles: true }));\n\t\t\t});\n\t\t});\n\t\tthis.syncDomState();\n\t}\n\n\t/**\n\t * Clear timers on unmount. Only purge shared state when this instance was exiting \u2014\n\t * overflow toasts are intentionally unmounted while still queued.\n\t */\n\toverride disconnectedCallback(): void {\n\t\tthis.clearTimer();\n\t\tif (this.exitTimer) {\n\t\t\tclearTimeout(this.exitTimer);\n\t\t\tthis.exitTimer = null;\n\t\t}\n\t\tconst id = this.resolvedId;\n\t\tif (id !== '' && this.removed) {\n\t\t\ttoastState.remove(id);\n\t\t}\n\t\tthis.held = false;\n\t\tthis.timerReady = false;\n\t\tthis.removeEventListener('pointerdown', this.onPointerDown);\n\t\tthis.removeEventListener('pointermove', this.onPointerMove);\n\t\tthis.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.removeEventListener('pointercancel', this.onPointerUp);\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t@onUpdated(['title', 'description', 'variant', 'actionLabel', 'closeButton'])\n\tonContentUpdated(): void {\n\t\tthis.requestUpdate();\n\t}\n\n\t@onUpdated('position')\n\tonPositionUpdated(): void {\n\t\tthis.syncDomState();\n\t}\n\n\t/**\n\t * Hold or release auto-dismiss (toaster-controlled on stack hover).\n\t * Leaving hover resets lifetime to a full `duration` (does not resume leftover time).\n\t * A no-op `setPaused(false)` still starts the timer on first paint if it never ran.\n\t */\n\tsetPaused(paused: boolean): void {\n\t\tif (this.held === paused) {\n\t\t\tif (!paused && this.timerReady && this.mounted && !this.removed && !this.timeoutId) {\n\t\t\t\tthis.startTimer();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.held = paused;\n\t\tif (!this.timerReady || !this.mounted || this.removed) return;\n\t\tif (paused || document.hidden) {\n\t\t\tthis.clearTimer();\n\t\t} else {\n\t\t\tthis.startTimer();\n\t\t}\n\t}\n\n\t@onUpdated('duration')\n\tonDurationUpdated(): void {\n\t\tif (!this.timerReady || !this.mounted || this.removed || this.held) return;\n\t\tthis.startTimer();\n\t}\n\n\t@onUpdated('markedDelete')\n\tonMarkedDeleteUpdated(): void {\n\t\tif (this.markedDelete && !this.removed) {\n\t\t\tthis.beginRemove();\n\t\t}\n\t}\n\n\tprivate get resolvedId(): ToastId {\n\t\tconst raw = this.toastId;\n\t\tif (raw == null || raw === '') return '';\n\t\tconst asNumber = Number(raw);\n\t\treturn Number.isFinite(asNumber) && String(asNumber) === raw ? asNumber : raw;\n\t}\n\n\tprivate clearTimer(): void {\n\t\tif (this.timeoutId) clearTimeout(this.timeoutId);\n\t\tthis.timeoutId = null;\n\t}\n\n\t/** Start a fresh full-duration countdown (never resumes leftover time). */\n\tprivate startTimer(): void {\n\t\tif (this.held || this.removed || document.hidden) return;\n\t\tif (this.duration === Number.POSITIVE_INFINITY || this.variant === 'loading') return;\n\t\tif (this.duration <= 0) {\n\t\t\tthis.beginRemove();\n\t\t\treturn;\n\t\t}\n\t\tthis.clearTimer();\n\t\tthis.timeoutId = setTimeout(() => this.beginRemove(), this.duration);\n\t}\n\n\tprivate beginRemove(): void {\n\t\tif (this.removed) return;\n\t\tthis.removed = true;\n\t\tthis.clearTimer();\n\t\tthis.syncDomState();\n\t\tif (!this.markedDelete) {\n\t\t\ttoastState.dismiss(this.resolvedId);\n\t\t}\n\t\tthis.exitTimer = setTimeout(() => {\n\t\t\tthis.exitTimer = null;\n\t\t\ttoastState.remove(this.resolvedId);\n\t\t}, TOAST_EXIT_MS);\n\t}\n\n\t@bound\n\tprivate onPointerDown(event: PointerEvent): void {\n\t\tif (!this.dismissible || this.variant === 'loading') return;\n\t\tif (event.button !== 0) return;\n\t\tconst target = event.target as HTMLElement | null;\n\t\tif (target?.closest('[data-toast-close], [data-toast-action], button, a')) return;\n\n\t\tthis.dragStartTime = Date.now();\n\t\tthis.pointerStart = { x: event.clientX, y: event.clientY };\n\t\tthis.swipeAxis = null;\n\t\tthis.setPointerCapture(event.pointerId);\n\t}\n\n\t@bound\n\tprivate onPointerMove(event: PointerEvent): void {\n\t\tif (!this.pointerStart) return;\n\t\tconst { y, x } = splitToastPosition(this.position);\n\t\tconst deltaX = event.clientX - this.pointerStart.x;\n\t\tconst deltaY = event.clientY - this.pointerStart.y;\n\n\t\tif (!this.swiping) {\n\t\t\tif (Math.abs(deltaX) < 8 && Math.abs(deltaY) < 8) return;\n\t\t\tthis.swiping = true;\n\t\t\tthis.syncDomState();\n\t\t}\n\n\t\tif (!this.swipeAxis) {\n\t\t\tthis.swipeAxis = Math.abs(deltaX) > Math.abs(deltaY) ? 'x' : 'y';\n\t\t}\n\n\t\tconst swipeAmountX = this.swipeAxis === 'x' ? deltaX : 0;\n\t\tconst swipeAmountY = this.swipeAxis === 'y' ? deltaY : 0;\n\n\t\tif (this.swipeAxis === 'y') {\n\t\t\tconst towardExit = y === 'bottom' ? swipeAmountY > 0 : swipeAmountY < 0;\n\t\t\tif (!towardExit && Math.abs(swipeAmountY) < TOAST_SWIPE_THRESHOLD) {\n\t\t\t\tthis.style.setProperty('--swipe-amount-x', '0px');\n\t\t\t\tthis.style.setProperty('--swipe-amount-y', '0px');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this.swipeAxis === 'x') {\n\t\t\tconst towardExit = x === 'start' ? swipeAmountX < 0 : swipeAmountX > 0;\n\t\t\tif (x !== 'center' && !towardExit && Math.abs(swipeAmountX) < TOAST_SWIPE_THRESHOLD) {\n\t\t\t\tthis.style.setProperty('--swipe-amount-x', '0px');\n\t\t\t\tthis.style.setProperty('--swipe-amount-y', '0px');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.style.setProperty('--swipe-amount-x', `${swipeAmountX}px`);\n\t\tthis.style.setProperty('--swipe-amount-y', `${swipeAmountY}px`);\n\t}\n\n\t@bound\n\tprivate onPointerUp(event: PointerEvent): void {\n\t\tif (!this.pointerStart) return;\n\t\ttry {\n\t\t\tthis.releasePointerCapture(event.pointerId);\n\t\t} catch {}\n\n\t\tconst wasSwiping = this.swiping;\n\t\tthis.swiping = false;\n\n\t\tif (!wasSwiping) {\n\t\t\tthis.pointerStart = null;\n\t\t\tthis.dragStartTime = null;\n\t\t\tthis.swipeAxis = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipeAmountX = Number.parseFloat(this.style.getPropertyValue('--swipe-amount-x') || '0');\n\t\tconst swipeAmountY = Number.parseFloat(this.style.getPropertyValue('--swipe-amount-y') || '0');\n\t\tconst swipeAmount = this.swipeAxis === 'x' ? swipeAmountX : swipeAmountY;\n\t\tconst swipeTime = this.dragStartTime ? Date.now() - this.dragStartTime : 0;\n\t\tconst velocity = Math.abs(swipeAmount) / Math.max(swipeTime, 1);\n\t\tconst shouldDismiss = Math.abs(swipeAmount) >= TOAST_SWIPE_THRESHOLD || velocity > 0.11;\n\n\t\tif (shouldDismiss && this.dismissible) {\n\t\t\tconst { y, x } = splitToastPosition(this.position);\n\t\t\tif (this.swipeAxis === 'x') {\n\t\t\t\tthis.swipeOutDirection = swipeAmountX < 0 ? 'left' : 'right';\n\t\t\t\tif (x === 'start') this.swipeOutDirection = 'left';\n\t\t\t\tif (x === 'end') this.swipeOutDirection = 'right';\n\t\t\t} else {\n\t\t\t\tthis.swipeOutDirection = y === 'bottom' ? 'down' : 'up';\n\t\t\t}\n\t\t\tthis.swipeOut = true;\n\t\t\tthis.syncDomState();\n\t\t\tthis.beginRemove();\n\t\t} else {\n\t\t\tthis.style.setProperty('--swipe-amount-x', '0px');\n\t\t\tthis.style.setProperty('--swipe-amount-y', '0px');\n\t\t\tthis.swipeAxis = null;\n\t\t\tthis.syncDomState();\n\t\t}\n\n\t\tthis.pointerStart = null;\n\t\tthis.dragStartTime = null;\n\t}\n\n\t@onEvent({ selector: '[data-toast-close]', type: 'click' })\n\tonCloseClick(event: Event): void {\n\t\tevent.stopPropagation();\n\t\tif (!this.dismissible) return;\n\t\tthis.beginRemove();\n\t}\n\n\t@onEvent({ selector: '[data-toast-action]', type: 'click' })\n\tonActionClick(event: MouseEvent): void {\n\t\tevent.stopPropagation();\n\t\tconst record = toastState.getSnapshot().find((toast) => toast.id === this.resolvedId);\n\t\trecord?.action?.onClick(event);\n\t\tif (this.dismissible) this.beginRemove();\n\t}\n\n\tprivate syncDomState(): void {\n\t\tconst { y, x } = splitToastPosition(this.position);\n\t\tthis.setAttribute('role', 'listitem');\n\t\tthis.dataset.mounted = String(this.mounted);\n\t\tthis.dataset.removed = String(this.removed);\n\t\tthis.dataset.swiping = String(this.swiping);\n\t\tthis.dataset.swipeOut = String(this.swipeOut);\n\t\tthis.dataset.dismissible = String(this.dismissible);\n\t\tthis.dataset.yPosition = y;\n\t\tthis.dataset.xPosition = x;\n\t\tthis.dataset.variant = this.variant ?? 'default';\n\t\tif (this.swipeOutDirection) this.dataset.swipeDirection = this.swipeOutDirection;\n\t\telse delete this.dataset.swipeDirection;\n\t}\n\n\tprivate iconForVariant(): string {\n\t\tswitch (this.variant) {\n\t\t\tcase 'success':\n\t\t\t\treturn '\u2713';\n\t\t\tcase 'error':\n\t\t\t\treturn '\u2715';\n\t\t\tcase 'warning':\n\t\t\t\treturn '!';\n\t\t\tcase 'info':\n\t\t\t\treturn 'i';\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst variant = this.variant ?? 'default';\n\t\tconst icon = this.iconForVariant();\n\t\tconst showIcon = variant !== 'default';\n\n\t\treturn (\n\t\t\t<div ref=\"toast\" class={`rui-toast rui-toast--${variant}`} role=\"status\" aria-live=\"off\" data-ref=\"toast\">\n\t\t\t\t{this.closeButton && variant !== 'loading' ? (\n\t\t\t\t\t<button type=\"button\" class=\"rui-toast__close\" data-toast-close aria-label=\"Close toast\">\n\t\t\t\t\t\t\u00D7\n\t\t\t\t\t</button>\n\t\t\t\t) : null}\n\t\t\t\t{showIcon ? (\n\t\t\t\t\t<span class=\"rui-toast__icon\" data-icon aria-hidden=\"true\">\n\t\t\t\t\t\t{variant === 'loading' ? <span class=\"rui-toast__loader\" /> : icon}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t<div class=\"rui-toast__content\">\n\t\t\t\t\t<div class=\"rui-toast__title\" data-title>\n\t\t\t\t\t\t{this.$.title}\n\t\t\t\t\t</div>\n\t\t\t\t\t{this.description ? (\n\t\t\t\t\t\t<div class=\"rui-toast__description\" data-description>\n\t\t\t\t\t\t\t{this.$.description}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{this.actionLabel ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"rui-toast__action rui-button rui-button--outline rui-button--sm\"\n\t\t\t\t\t\tdata-toast-action\n\t\t\t\t\t>\n\t\t\t\t\t\t{this.$.actionLabel}\n\t\t\t\t\t</button>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "export const RUI_TOAST_SHOW_EVENT = 'rui-toast-show';\nexport const RUI_TOAST_DISMISS_EVENT = 'rui-toast-dismiss';\n\nexport type ToastVariant = 'default' | 'info' | 'success' | 'warning' | 'error' | 'loading';\n\nexport type ToastPosition = 'top-start' | 'top-center' | 'top-end' | 'bottom-start' | 'bottom-center' | 'bottom-end';\n\nexport type ToastAction = {\n\tlabel: string;\n\tonClick: (event: MouseEvent) => void;\n};\n\nexport type ToastId = string | number;\n\nexport type ToastOptions = {\n\tid?: ToastId;\n\tdescription?: string;\n\tduration?: number;\n\taction?: ToastAction;\n\tdismissible?: boolean;\n\tcloseButton?: boolean;\n\tposition?: ToastPosition;\n};\n\nexport type ToastRecord = {\n\tid: ToastId;\n\ttitle: string;\n\tdescription?: string;\n\tvariant: ToastVariant;\n\tduration?: number;\n\taction?: ToastAction;\n\tdismissible: boolean;\n\tcloseButton?: boolean;\n\tposition?: ToastPosition;\n\t/** Marks the toast for animated exit; toaster removes after exit. */\n\tdelete?: boolean;\n};\n\nexport type ToastDismissDetail = { id?: ToastId };\nexport type ToastShowDetail = Omit<ToastRecord, 'dismissible'> & { dismissible?: boolean };\n\nexport type PromiseToastMessages<T> = {\n\tloading: string;\n\tsuccess: string | ((data: T) => string);\n\terror: string | ((error: unknown) => string);\n\tdescription?: string | ((data: T | unknown) => string);\n\tduration?: number;\n\taction?: ToastAction;\n\tcloseButton?: boolean;\n\tposition?: ToastPosition;\n};\n\nexport const TOAST_LIFETIME = 4000;\nexport const TOAST_WIDTH = 356;\nexport const TOAST_GAP = 14;\nexport const TOAST_VIEWPORT_OFFSET = 24;\nexport const TOAST_VISIBLE_AMOUNT = 3;\nexport const TOAST_SWIPE_THRESHOLD = 45;\nexport const TOAST_EXIT_MS = 200;\n\nexport const DEFAULT_TOAST_POSITION: ToastPosition = 'bottom-end';\n\nexport function splitToastPosition(position: ToastPosition): {\n\ty: 'top' | 'bottom';\n\tx: 'start' | 'center' | 'end';\n} {\n\tconst [y, x] = position.split('-') as ['top' | 'bottom', 'start' | 'center' | 'end'];\n\treturn { y, x };\n}\n", "import type { PromiseToastMessages, ToastId, ToastOptions, ToastRecord, ToastVariant } from './toast-context';\n\nexport type ToastSubscriber = (toasts: ToastRecord[]) => void;\n\nlet toastCounter = 1;\n\nfunction nextId(): number {\n\treturn toastCounter++;\n}\n\nfunction resolveMessage<T>(message: string | ((value: T) => string), value: T): string {\n\treturn typeof message === 'function' ? message(value) : message;\n}\n\nclass ToastState {\n\tprivate subscribers: ToastSubscriber[] = [];\n\tprivate toasts: ToastRecord[] = [];\n\n\tsubscribe = (subscriber: ToastSubscriber): (() => void) => {\n\t\tthis.subscribers.push(subscriber);\n\t\tsubscriber(this.toasts);\n\t\treturn () => {\n\t\t\tconst index = this.subscribers.indexOf(subscriber);\n\t\t\tif (index >= 0) this.subscribers.splice(index, 1);\n\t\t};\n\t};\n\n\tgetSnapshot = (): ToastRecord[] => this.toasts;\n\n\tprivate publish(): void {\n\t\tconst snapshot = this.toasts;\n\t\tfor (const subscriber of this.subscribers) {\n\t\t\tsubscriber(snapshot);\n\t\t}\n\t}\n\n\tcreate = (title: string, options: ToastOptions & { variant?: ToastVariant } = {}): ToastId => {\n\t\tconst id = options.id ?? nextId();\n\t\tconst dismissible = options.dismissible ?? true;\n\t\tconst existingIndex = this.toasts.findIndex((toast) => toast.id === id);\n\n\t\tconst next: ToastRecord = {\n\t\t\tid,\n\t\t\ttitle,\n\t\t\tdescription: options.description,\n\t\t\tvariant: options.variant ?? 'default',\n\t\t\tduration: options.duration,\n\t\t\taction: options.action,\n\t\t\tdismissible,\n\t\t\tcloseButton: options.closeButton,\n\t\t\tposition: options.position,\n\t\t\tdelete: false,\n\t\t};\n\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.toasts = this.toasts.map((toast) => (toast.id === id ? { ...toast, ...next, delete: false } : toast));\n\t\t} else {\n\t\t\tthis.toasts = [next, ...this.toasts];\n\t\t}\n\n\t\tthis.publish();\n\t\treturn id;\n\t};\n\n\tdismiss = (id?: ToastId): void => {\n\t\tif (id == null) {\n\t\t\tif (this.toasts.length === 0) return;\n\t\t\tthis.toasts = this.toasts.map((toast) => ({ ...toast, delete: true }));\n\t\t} else {\n\t\t\tconst target = this.toasts.find((toast) => toast.id === id);\n\t\t\tif (!target || target.delete) return;\n\t\t\tthis.toasts = this.toasts.map((toast) => (toast.id === id ? { ...toast, delete: true } : toast));\n\t\t}\n\t\tthis.publish();\n\t};\n\n\tremove = (id: ToastId): void => {\n\t\tthis.toasts = this.toasts.filter((toast) => toast.id !== id);\n\t\tthis.publish();\n\t};\n\n\t/** Drop every toast from the store (tests, Storybook resets). */\n\tclear = (): void => {\n\t\tif (this.toasts.length === 0) return;\n\t\tthis.toasts = [];\n\t\tthis.publish();\n\t};\n\n\tmessage = (title: string, options?: ToastOptions): ToastId => this.create(title, options);\n\n\tsuccess = (title: string, options?: ToastOptions): ToastId =>\n\t\tthis.create(title, { ...options, variant: 'success' });\n\n\terror = (title: string, options?: ToastOptions): ToastId => this.create(title, { ...options, variant: 'error' });\n\n\tinfo = (title: string, options?: ToastOptions): ToastId => this.create(title, { ...options, variant: 'info' });\n\n\twarning = (title: string, options?: ToastOptions): ToastId =>\n\t\tthis.create(title, { ...options, variant: 'warning' });\n\n\tloading = (title: string, options?: ToastOptions): ToastId =>\n\t\tthis.create(title, { ...options, variant: 'loading', duration: options?.duration ?? Number.POSITIVE_INFINITY });\n\n\tpromise = <T>(promise: Promise<T> | (() => Promise<T>), messages: PromiseToastMessages<T>): ToastId => {\n\t\tconst id = this.loading(messages.loading, {\n\t\t\tduration: Number.POSITIVE_INFINITY,\n\t\t\taction: messages.action,\n\t\t\tcloseButton: messages.closeButton,\n\t\t\tposition: messages.position,\n\t\t\tdescription: typeof messages.description === 'string' ? messages.description : undefined,\n\t\t});\n\n\t\tconst pending = typeof promise === 'function' ? promise() : promise;\n\n\t\tpending\n\t\t\t.then((data) => {\n\t\t\t\tconst description =\n\t\t\t\t\ttypeof messages.description === 'function' ? messages.description(data) : messages.description;\n\t\t\t\tthis.create(resolveMessage(messages.success, data), {\n\t\t\t\t\tid,\n\t\t\t\t\tvariant: 'success',\n\t\t\t\t\tdescription,\n\t\t\t\t\tduration: messages.duration,\n\t\t\t\t\taction: messages.action,\n\t\t\t\t\tcloseButton: messages.closeButton,\n\t\t\t\t\tposition: messages.position,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst description =\n\t\t\t\t\ttypeof messages.description === 'function' ? messages.description(error) : messages.description;\n\t\t\t\tthis.create(resolveMessage(messages.error, error), {\n\t\t\t\t\tid,\n\t\t\t\t\tvariant: 'error',\n\t\t\t\t\tdescription,\n\t\t\t\t\tduration: messages.duration,\n\t\t\t\t\taction: messages.action,\n\t\t\t\t\tcloseButton: messages.closeButton,\n\t\t\t\t\tposition: messages.position,\n\t\t\t\t});\n\t\t\t});\n\n\t\treturn id;\n\t};\n}\n\nexport const toastState = new ToastState();\n", "import { RadiantElement, bound, customElement, onEvent, onUpdated, prop, state } from '@ecopages/radiant';\nimport {\n\tDEFAULT_TOAST_POSITION,\n\tRUI_TOAST_DISMISS_EVENT,\n\tRUI_TOAST_SHOW_EVENT,\n\tTOAST_GAP,\n\tTOAST_LIFETIME,\n\tTOAST_VIEWPORT_OFFSET,\n\tTOAST_VISIBLE_AMOUNT,\n\tTOAST_WIDTH,\n\ttype ToastDismissDetail,\n\ttype ToastPosition,\n\ttype ToastRecord,\n\ttype ToastShowDetail,\n\tsplitToastPosition,\n} from './toast-context';\nimport { toastState } from './toast-state';\nimport type { RuiToast } from './toast.script';\nimport './toast.script';\n\nexport type RuiToasterProps = {\n\t/** Corner / edge placement. Default: `bottom-end`. */\n\tposition?: ToastPosition;\n\t/** Default lifetime in ms. Default: `4000`. */\n\tduration?: number;\n\t/**\n\t * Max toasts shown in the stack at once (older ones wait in queue).\n\t * Default: `3`.\n\t */\n\tvisibleToasts?: number;\n\t/** Show a close button on every toast. */\n\tcloseButton?: boolean;\n\t/**\n\t * Always show the stack expanded with full gaps.\n\t * Default `false`: toasts collapse behind the front one (Sonner-style peek)\n\t * and expand on hover.\n\t */\n\texpand?: boolean;\n\t/** Gap between toasts when expanded, in px. Default: `14`. */\n\tgap?: number;\n\t/** Viewport inset in px. Default: `24`. */\n\toffset?: number;\n};\n\ntype RuiToasterBindings = {\n\tposition: ToastPosition;\n\ttoasts: ToastRecord[];\n};\n\nfunction isInsideToaster(node: EventTarget | null, root: Element): boolean {\n\treturn node instanceof Node && root.contains(node);\n}\n\n/**\n * `<rui-toaster>` \u2014 fixed viewport that renders the toast stack.\n *\n * @element rui-toaster\n */\n@customElement('rui-toaster')\nexport class RuiToaster extends RadiantElement<RuiToasterBindings> {\n\t@prop({ type: String, reflect: true, defaultValue: DEFAULT_TOAST_POSITION }) position: ToastPosition;\n\t@prop({ type: Number, defaultValue: TOAST_LIFETIME }) duration: number;\n\t@prop({ type: Number, defaultValue: TOAST_VISIBLE_AMOUNT }) visibleToasts: number;\n\t@prop({ type: Boolean, defaultValue: false }) closeButton: boolean;\n\t@prop({ type: Boolean, defaultValue: false }) expand: boolean;\n\t@prop({ type: Number, defaultValue: TOAST_GAP }) gap: number;\n\t@prop({ type: Number, defaultValue: TOAST_VIEWPORT_OFFSET }) offset: number;\n\n\t@state toasts: ToastRecord[] = [];\n\n\tprivate expanded = false;\n\tprivate interacting = false;\n\tprivate unsubscribe: (() => void) | null = null;\n\tprivate visibilityHandler: (() => void) | null = null;\n\tprivate readonly heights = new Map<string, number>();\n\tprivate readonly observers = new Map<string, ResizeObserver>();\n\tprivate layoutFrame: number | null = null;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.syncHostPosition();\n\t\tthis.unsubscribe = toastState.subscribe((toasts) => {\n\t\t\tthis.toasts = toasts;\n\t\t\tif (toasts.length === 0) {\n\t\t\t\tthis.resetLayoutState();\n\t\t\t}\n\t\t\tthis.scheduleLayoutSync();\n\t\t});\n\t\tthis.visibilityHandler = () => this.syncPauseState();\n\t\tdocument.addEventListener('visibilitychange', this.visibilityHandler);\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.unsubscribe?.();\n\t\tthis.unsubscribe = null;\n\t\tif (this.visibilityHandler) {\n\t\t\tdocument.removeEventListener('visibilitychange', this.visibilityHandler);\n\t\t\tthis.visibilityHandler = null;\n\t\t}\n\t\tdocument.removeEventListener('pointerup', this.onPointerUp);\n\t\tdocument.removeEventListener('pointercancel', this.onPointerUp);\n\t\tif (this.layoutFrame != null) cancelAnimationFrame(this.layoutFrame);\n\t\tthis.resetLayoutState();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t@onUpdated(['position', 'duration', 'visibleToasts', 'closeButton', 'expand', 'gap', 'offset'])\n\tonConfigUpdated(): void {\n\t\tthis.syncHostPosition();\n\t\tthis.scheduleLayoutSync();\n\t}\n\n\t@onEvent({ document: true, type: RUI_TOAST_SHOW_EVENT })\n\tonDocumentShow(event: Event): void {\n\t\tconst detail = (event as CustomEvent<ToastShowDetail>).detail;\n\t\tif (!detail?.title) return;\n\t\ttoastState.create(detail.title, {\n\t\t\tid: detail.id,\n\t\t\tdescription: detail.description,\n\t\t\tvariant: detail.variant,\n\t\t\tduration: detail.duration,\n\t\t\taction: detail.action,\n\t\t\tdismissible: detail.dismissible,\n\t\t\tcloseButton: detail.closeButton,\n\t\t\tposition: detail.position,\n\t\t});\n\t}\n\n\t@onEvent({ document: true, type: RUI_TOAST_DISMISS_EVENT })\n\tonDocumentDismiss(event: Event): void {\n\t\tconst detail = (event as CustomEvent<ToastDismissDetail>).detail;\n\t\ttoastState.dismiss(detail?.id);\n\t}\n\n\t@onEvent({ selector: 'rui-toast', type: 'rui-toast-mounted' })\n\tonToastMounted(): void {\n\t\tthis.observeToasts();\n\t\tthis.syncPauseState();\n\t}\n\n\tprivate filteredToasts(): ToastRecord[] {\n\t\tconst forPosition = this.toasts.filter((toast) => (toast.position ?? this.position) === this.position);\n\t\tconst active: ToastRecord[] = [];\n\t\tconst exiting: ToastRecord[] = [];\n\n\t\tfor (const toast of forPosition) {\n\t\t\tif (toast.delete) exiting.push(toast);\n\t\t\telse active.push(toast);\n\t\t}\n\n\t\treturn [...active.slice(0, this.visibleToasts), ...exiting];\n\t}\n\n\tprivate syncHostPosition(): void {\n\t\tconst { y, x } = splitToastPosition(this.position);\n\t\tthis.dataset.yPosition = y;\n\t\tthis.dataset.xPosition = x;\n\t\tthis.style.setProperty('--width', `${TOAST_WIDTH}px`);\n\t\tthis.style.setProperty('--gap', `${this.gap}px`);\n\t\tthis.style.setProperty('--viewport-offset', `${this.offset}px`);\n\t}\n\n\tprivate isStackExpanded(): boolean {\n\t\treturn this.expanded || this.expand;\n\t}\n\n\tprivate isPaused(): boolean {\n\t\treturn this.isStackExpanded() || this.interacting || document.hidden;\n\t}\n\n\tprivate resetLayoutState(): void {\n\t\tfor (const observer of this.observers.values()) observer.disconnect();\n\t\tthis.observers.clear();\n\t\tthis.heights.clear();\n\t\tthis.expanded = false;\n\t\tthis.interacting = false;\n\t\tconst list = this.querySelector<HTMLOListElement>('.rui-toaster');\n\t\tif (list) {\n\t\t\tlist.style.height = '0px';\n\t\t\tlist.dataset.expanded = 'false';\n\t\t}\n\t\tthis.dataset.expanded = 'false';\n\t}\n\n\tprivate syncPauseState(): void {\n\t\tconst paused = this.isPaused();\n\t\tfor (const el of this.querySelectorAll('rui-toast')) {\n\t\t\t(el as RuiToast).setPaused(paused);\n\t\t}\n\t\tthis.patchStackLayout();\n\t}\n\n\t/**\n\t * Measure + layout on the next frame. Re-reads `:hover` because emptying the\n\t * stack under the cursor can skip `pointerout`, leaving hold/expand stale.\n\t */\n\tprivate scheduleLayoutSync(): void {\n\t\tif (this.layoutFrame != null) cancelAnimationFrame(this.layoutFrame);\n\t\tthis.layoutFrame = requestAnimationFrame(() => {\n\t\t\tthis.layoutFrame = null;\n\t\t\tif (this.toasts.length > 0 && !this.interacting) {\n\t\t\t\tconst list = this.querySelector('.rui-toaster');\n\t\t\t\tconst hovered = Boolean(list?.matches(':hover') || this.matches(':hover'));\n\t\t\t\tthis.expanded = hovered;\n\t\t\t}\n\t\t\tthis.observeToasts();\n\t\t\tthis.syncPauseState();\n\t\t});\n\t}\n\n\tprivate measureToast(el: RuiToast): number {\n\t\tconst prevHeight = el.style.height;\n\t\tconst prevOverflow = el.style.overflow;\n\t\tel.style.height = 'auto';\n\t\tel.style.overflow = 'visible';\n\t\tconst inner = el.querySelector('.rui-toast');\n\t\tconst height = Math.round(inner instanceof HTMLElement ? inner.offsetHeight : el.offsetHeight) || 64;\n\t\tel.style.height = prevHeight;\n\t\tel.style.overflow = prevOverflow;\n\t\treturn height;\n\t}\n\n\tprivate observeToasts(): void {\n\t\tconst list = this.querySelector('.rui-toaster');\n\t\tif (!list) return;\n\n\t\tconst els = [...list.querySelectorAll('rui-toast')] as RuiToast[];\n\t\tconst seen = new Set<string>();\n\n\t\tfor (const el of els) {\n\t\t\tconst id = el.toastId;\n\t\t\tif (!id) continue;\n\t\t\tseen.add(id);\n\n\t\t\tconst target = el.querySelector('.rui-toast') ?? el;\n\n\t\t\tif (!this.observers.has(id)) {\n\t\t\t\tconst observer = new ResizeObserver(() => {\n\t\t\t\t\tconst height = this.measureToast(el);\n\t\t\t\t\tif (this.heights.get(id) === height) return;\n\t\t\t\t\tthis.heights.set(id, height);\n\t\t\t\t\tthis.patchStackLayout();\n\t\t\t\t});\n\t\t\t\tobserver.observe(target);\n\t\t\t\tthis.observers.set(id, observer);\n\t\t\t}\n\n\t\t\tthis.heights.set(id, this.measureToast(el));\n\t\t}\n\n\t\tfor (const [id, observer] of [...this.observers]) {\n\t\t\tif (seen.has(id)) continue;\n\t\t\tobserver.disconnect();\n\t\t\tthis.observers.delete(id);\n\t\t\tthis.heights.delete(id);\n\t\t}\n\t}\n\n\tprivate patchStackLayout(): void {\n\t\tconst list = this.querySelector<HTMLOListElement>('.rui-toaster');\n\t\tif (!list) return;\n\n\t\tconst expanded = this.isStackExpanded();\n\t\tconst { y } = splitToastPosition(this.position);\n\t\tconst lift = y === 'bottom' ? -1 : 1;\n\n\t\tthis.dataset.expanded = String(expanded);\n\t\tlist.dataset.expanded = String(expanded);\n\n\t\tconst els = ([...list.querySelectorAll('rui-toast')] as RuiToast[]).filter(\n\t\t\t(el) => el.dataset.mounted === 'true' && el.dataset.removed !== 'true',\n\t\t);\n\n\t\tif (els.length === 0) {\n\t\t\tlist.style.height = '0px';\n\t\t\treturn;\n\t\t}\n\n\t\tconst heights = els.map((el) => {\n\t\t\tconst measured = this.heights.get(el.toastId) ?? this.measureToast(el);\n\t\t\tthis.heights.set(el.toastId, measured);\n\t\t\treturn measured;\n\t\t});\n\t\tconst frontHeight = heights[0] ?? 64;\n\n\t\tlet accumulated = 0;\n\t\tfor (let index = 0; index < els.length; index += 1) {\n\t\t\tconst el = els[index];\n\t\t\tif (!el) continue;\n\t\t\tconst height = heights[index] ?? 64;\n\t\t\tconst isFront = index === 0;\n\n\t\t\tel.dataset.index = String(index);\n\t\t\tel.dataset.front = String(isFront);\n\t\t\tel.dataset.expanded = String(expanded);\n\t\t\tel.style.setProperty('--z-index', String(els.length - index));\n\n\t\t\tif (expanded) {\n\t\t\t\tel.style.setProperty('--y', `translateY(${lift * accumulated}px)`);\n\t\t\t\tel.style.height = `${height}px`;\n\t\t\t\tel.style.overflow = 'visible';\n\t\t\t\taccumulated += height + this.gap;\n\t\t\t} else if (isFront) {\n\t\t\t\tel.style.setProperty('--y', 'translateY(0px)');\n\t\t\t\tel.style.height = `${height}px`;\n\t\t\t\tel.style.overflow = 'visible';\n\t\t\t} else {\n\t\t\t\t// Keep scaling for every depth \u2014 clamping (e.g. at 0.92) makes toasts\n\t\t\t\t// past the default visibleToasts=3 look identical and stack poorly.\n\t\t\t\tconst scale = Math.max(0.7, 1 - index * 0.05);\n\t\t\t\tel.style.setProperty('--y', `translateY(${lift * index * this.gap}px) scale(${scale})`);\n\t\t\t\tel.style.height = `${frontHeight}px`;\n\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t}\n\t\t}\n\n\t\tconst stackHeight = expanded\n\t\t\t? Math.max(0, accumulated > 0 ? accumulated - this.gap : frontHeight)\n\t\t\t: frontHeight + Math.max(0, els.length - 1) * this.gap;\n\n\t\tlist.style.height = `${stackHeight}px`;\n\t}\n\n\t@bound\n\tprivate onPointerOver(event: PointerEvent): void {\n\t\tif (isInsideToaster(event.relatedTarget, this)) return;\n\t\tthis.expanded = true;\n\t\tthis.syncPauseState();\n\t}\n\n\t@bound\n\tprivate onPointerOut(event: PointerEvent): void {\n\t\tif (isInsideToaster(event.relatedTarget, this)) return;\n\t\tif (this.interacting) return;\n\t\tthis.expanded = false;\n\t\tthis.syncPauseState();\n\t}\n\n\t@bound\n\tprivate onPointerDown(): void {\n\t\tthis.interacting = true;\n\t\tthis.expanded = true;\n\t\tthis.syncPauseState();\n\t\tdocument.addEventListener('pointerup', this.onPointerUp, { once: true });\n\t\tdocument.addEventListener('pointercancel', this.onPointerUp, { once: true });\n\t}\n\n\t/** End interaction; collapse only when the pointer is no longer over the toaster. */\n\t@bound\n\tprivate onPointerUp(): void {\n\t\tif (!this.interacting) return;\n\t\tthis.interacting = false;\n\t\tconst hovered = this.matches(':hover') || this.querySelector('rui-toast:hover');\n\t\tif (!hovered) this.expanded = false;\n\t\tthis.syncPauseState();\n\t}\n\n\toverride render() {\n\t\tconst filtered = this.filteredToasts();\n\n\t\treturn (\n\t\t\t<section\n\t\t\t\tclass=\"rui-toaster-region\"\n\t\t\t\taria-label=\"Notifications\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-relevant=\"additions text\"\n\t\t\t\taria-atomic=\"false\"\n\t\t\t\ttabIndex={-1}\n\t\t\t>\n\t\t\t\t<ol\n\t\t\t\t\tclass=\"rui-toaster\"\n\t\t\t\t\tdata-rui-toaster\n\t\t\t\t\ton:pointerover={this.onPointerOver}\n\t\t\t\t\ton:pointerout={this.onPointerOut}\n\t\t\t\t\ton:pointerdown={this.onPointerDown}\n\t\t\t\t>\n\t\t\t\t\t{filtered.map((toast) => {\n\t\t\t\t\t\tconst duration =\n\t\t\t\t\t\t\ttoast.duration ?? (toast.variant === 'loading' ? Number.POSITIVE_INFINITY : this.duration);\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<rui-toast\n\t\t\t\t\t\t\t\tkey={String(toast.id)}\n\t\t\t\t\t\t\t\tprop:toastId={String(toast.id)}\n\t\t\t\t\t\t\t\tprop:title={toast.title}\n\t\t\t\t\t\t\t\tprop:description={toast.description ?? ''}\n\t\t\t\t\t\t\t\tprop:variant={toast.variant}\n\t\t\t\t\t\t\t\tprop:duration={duration}\n\t\t\t\t\t\t\t\tprop:dismissible={toast.dismissible}\n\t\t\t\t\t\t\t\tprop:closeButton={toast.closeButton ?? this.closeButton}\n\t\t\t\t\t\t\t\tprop:actionLabel={toast.action?.label ?? ''}\n\t\t\t\t\t\t\t\tprop:position={toast.position ?? this.position}\n\t\t\t\t\t\t\t\tprop:markedDelete={Boolean(toast.delete)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</ol>\n\t\t\t</section>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiToastProps } from './toast.script';\nimport { RuiToast as RuiToastElement } from './toast.script';\nimport type { RuiToasterProps } from './toaster.script';\nimport { RuiToaster as RuiToasterElement } from './toaster.script';\nimport './toast.css';\n\nexport type RuiToastViewProps = RuiToastProps & RadiantSlotProps;\n\nexport const RuiToast = defineRadiantView(\n\tRuiToastElement,\n\t({\n\t\tslot,\n\t\ttoastId,\n\t\ttitle,\n\t\tdescription,\n\t\tvariant,\n\t\tduration,\n\t\tdismissible,\n\t\tcloseButton,\n\t\tactionLabel,\n\t\tposition,\n\t\tmarkedDelete,\n\t}: RuiToastViewProps) => (\n\t\t<rui-toast\n\t\t\tslot={slot}\n\t\t\tprop:toastId={toastId != null ? String(toastId) : undefined}\n\t\t\tprop:title={title}\n\t\t\tprop:description={description}\n\t\t\tprop:variant={variant}\n\t\t\tprop:duration={duration}\n\t\t\tprop:dismissible={dismissible}\n\t\t\tprop:closeButton={closeButton}\n\t\t\tprop:actionLabel={actionLabel}\n\t\t\tprop:position={position}\n\t\t\tprop:markedDelete={markedDelete}\n\t\t/>\n\t),\n);\n\nexport type RuiToasterViewProps = WithChildren<RuiToasterProps & RadiantSlotProps>;\n\nexport const RuiToaster = defineRadiantView(\n\tRuiToasterElement,\n\t({ slot, position, duration, visibleToasts, closeButton, expand, gap, offset, children }: RuiToasterViewProps) => (\n\t\t<rui-toaster\n\t\t\tslot={slot}\n\t\t\tprop:position={position}\n\t\t\tprop:duration={duration}\n\t\t\tprop:visibleToasts={visibleToasts}\n\t\t\tprop:closeButton={closeButton}\n\t\t\tprop:expand={expand}\n\t\t\tprop:gap={gap}\n\t\t\tprop:offset={offset}\n\t\t>\n\t\t\t{children}\n\t\t</rui-toaster>\n\t),\n);\n", "import {\n\tRUI_TOAST_DISMISS_EVENT,\n\tRUI_TOAST_SHOW_EVENT,\n\ttype PromiseToastMessages,\n\ttype ToastDismissDetail,\n\ttype ToastId,\n\ttype ToastOptions,\n\ttype ToastShowDetail,\n} from './toast-context';\nimport { toastState } from './toast-state';\n\nexport type ToastCallable = {\n\t(title: string, options?: ToastOptions): ToastId;\n\tmessage: (title: string, options?: ToastOptions) => ToastId;\n\tsuccess: (title: string, options?: ToastOptions) => ToastId;\n\terror: (title: string, options?: ToastOptions) => ToastId;\n\tinfo: (title: string, options?: ToastOptions) => ToastId;\n\twarning: (title: string, options?: ToastOptions) => ToastId;\n\tloading: (title: string, options?: ToastOptions) => ToastId;\n\tpromise: <T>(promise: Promise<T> | (() => Promise<T>), messages: PromiseToastMessages<T>) => ToastId;\n\tdismiss: (id?: ToastId) => void;\n\t/** Remove all toasts from the store (Storybook / test resets). */\n\tclear: () => void;\n};\n\n/**\n * Primary imperative toast API (Sonner-shaped). Requires a mounted `<rui-toaster>`.\n * Prefer this over {@link showToast} in application code.\n */\nexport const toast: ToastCallable = Object.assign(\n\t(title: string, options?: ToastOptions) => toastState.create(title, options),\n\t{\n\t\tmessage: (title: string, options?: ToastOptions) => toastState.message(title, options),\n\t\tsuccess: (title: string, options?: ToastOptions) => toastState.success(title, options),\n\t\terror: (title: string, options?: ToastOptions) => toastState.error(title, options),\n\t\tinfo: (title: string, options?: ToastOptions) => toastState.info(title, options),\n\t\twarning: (title: string, options?: ToastOptions) => toastState.warning(title, options),\n\t\tloading: (title: string, options?: ToastOptions) => toastState.loading(title, options),\n\t\tpromise: <T>(promise: Promise<T> | (() => Promise<T>), messages: PromiseToastMessages<T>) =>\n\t\t\ttoastState.promise(promise, messages),\n\t\tdismiss: (id?: ToastId) => toastState.dismiss(id),\n\t\tclear: () => toastState.clear(),\n\t},\n);\n\n/**\n * DOM event bridge: dispatches `rui-toast-show` on `document` for hosts that listen globally.\n * Application code should use {@link toast} unless you intentionally decouple via custom events.\n */\nexport function showToast(detail: ToastShowDetail): void {\n\tdocument.dispatchEvent(\n\t\tnew CustomEvent(RUI_TOAST_SHOW_EVENT, {\n\t\t\tdetail,\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t}),\n\t);\n}\n\n/**\n * DOM event bridge: dispatches `rui-toast-dismiss` on `document`.\n * Application code should use {@link toast.dismiss} unless you intentionally decouple via custom events.\n */\nexport function dismissToast(id?: ToastId): void {\n\tconst detail: ToastDismissDetail = id == null ? {} : { id };\n\tdocument.dispatchEvent(\n\t\tnew CustomEvent(RUI_TOAST_DISMISS_EVENT, {\n\t\t\tdetail,\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t}),\n\t);\n}\n", "import { RadiantElement, customElement, onEvent, prop } from '@ecopages/radiant';\nimport { applyRovingTabindex, navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiToolbarProps = {\n\tlabel?: string;\n\t/** When true, only one toggle button in the toolbar can stay pressed at a time. */\n\texclusiveToggles?: boolean;\n};\n\ntype RuiToolbarBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-toolbar>` \u2014 a container for grouping controls.\n *\n * Implements the APG Toolbar pattern with left/right arrow navigation among\n * focusable descendants.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/\n * @element rui-toolbar\n */\n@customElement('rui-toolbar')\nexport class RuiToolbar extends RadiantElement<RuiToolbarBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: Boolean, reflect: true, defaultValue: false }) exclusiveToggles: boolean;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\tprivate getItems(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis.querySelectorAll<HTMLElement>('button, a[href], input, select, [tabindex]:not([tabindex=\"-1\"])'),\n\t\t).filter((el) => !el.hasAttribute('disabled'));\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => applyRovingTabindex(this.getItems(), 0));\n\t}\n\n\t@onEvent({ type: 'keydown', selector: 'button, a[href], input, select, [tabindex]' })\n\tonKeydown(event: KeyboardEvent): void {\n\t\tconst items = this.getItems();\n\t\tconst result = navigateRovingTabindex({\n\t\t\titems,\n\t\t\tcurrent: event.target as HTMLElement,\n\t\t\tkey: event.key,\n\t\t\torientation: 'horizontal',\n\t\t});\n\t\tif (!result.handled) return;\n\t\tevent.preventDefault();\n\t}\n\n\tprivate getToggleButtons(): HTMLButtonElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLButtonElement>('button[data-toggle][aria-pressed]')).filter(\n\t\t\t(button) => !button.disabled,\n\t\t);\n\t}\n\n\t// Captures ahead of the button's own inline toggle handler (see `RuiButton`'s\n\t// `on:click`) so this reads pre-click state and stays the single source of truth\n\t// for `aria-pressed` when a toggle button lives in a toolbar.\n\t@onEvent({ type: 'click', selector: 'button[data-toggle][aria-pressed]', options: { capture: true } })\n\tonToggleButtonClick(event: Event): void {\n\t\tconst button = (event.target as HTMLElement).closest(\n\t\t\t'button[data-toggle][aria-pressed]',\n\t\t) as HTMLButtonElement | null;\n\t\tif (!button || button.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.stopImmediatePropagation();\n\n\t\tconst wasPressed = button.getAttribute('aria-pressed') === 'true';\n\n\t\tif (this.exclusiveToggles) {\n\t\t\tfor (const toggle of this.getToggleButtons()) {\n\t\t\t\ttoggle.setAttribute('aria-pressed', 'false');\n\t\t\t}\n\n\t\t\tif (!wasPressed) {\n\t\t\t\tbutton.setAttribute('aria-pressed', 'true');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tbutton.setAttribute('aria-pressed', String(!wasPressed));\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-toolbar\" role=\"toolbar\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiToolbarProps } from './toolbar.script';\nimport { RuiToolbar as RuiToolbarElement } from './toolbar.script';\nimport './toolbar.css';\n\nexport const RuiToolbar = defineRadiantView(\n\tRuiToolbarElement,\n\t({ slot, label, exclusiveToggles, children }: WithChildren<RuiToolbarProps & RadiantSlotProps>) => (\n\t\t<rui-toolbar slot={slot} label={label} exclusiveToggles={exclusiveToggles}>\n\t\t\t{children}\n\t\t</rui-toolbar>\n\t),\n);\n", "import { RadiantElement, bound, customElement, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport { type Placement, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\n\nexport type RuiTooltipProps = {\n\t/** Accessible description shown in the tooltip. */\n\tcontent?: string;\n\t/** Floating-ui placement. Default: `top`. */\n\tplacement?: Placement;\n\t/** Delay in ms before showing on hover/focus. Default: `200`. */\n\tdelay?: number;\n};\n\ntype RuiTooltipBindings = {\n\tcontent: string;\n};\n\n/**\n * `<rui-tooltip>` \u2014 a popup that describes a trigger on hover or focus.\n *\n * Implements the WAI-ARIA APG Tooltip pattern: the popup has `role=\"tooltip\"`\n * and the focusable trigger references it with `aria-describedby`. The tooltip\n * itself never receives focus.\n *\n * Event wiring:\n * - Bubbling events (`focusin` / `focusout`, document `keydown`) use `@onEvent`.\n * - `pointerenter` / `pointerleave` are bound directly on the host \u2014 they do not\n * bubble, so `@onEvent` delegation cannot see them on the slotted trigger.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/\n *\n * @element rui-tooltip\n * @slot - The trigger element (typically a button or focusable control).\n */\n@customElement('rui-tooltip')\nexport class RuiTooltip extends RadiantElement<RuiTooltipBindings> {\n\t@prop({ type: String, defaultValue: '' }) content: string;\n\t@prop({ type: String, defaultValue: 'top' }) placement: Placement;\n\t@prop({ type: Number, defaultValue: 200 }) delay: number;\n\n\t@query({ ref: 'tooltip' }) tooltipTarget: HTMLElement;\n\n\t/**\n\t * Plain (non-reactive) field, not a JSX binding target: `hidden` is toggled\n\t * imperatively in `setOpen()` rather than bound, since it flips on every\n\t * hover/focus in/out \u2014 high-frequency enough that a plain synchronous DOM\n\t * write is preferable to routing it through the reactive binding system.\n\t */\n\tprivate open = false;\n\n\tprivate showTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate hideTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate cleanup: ReturnType<typeof autoUpdate> | null = null;\n\tprivate tooltipId = `rui-tooltip-${Math.random().toString(36).slice(2, 9)}`;\n\tprivate describedEl: HTMLElement | null = null;\n\n\t/**\n\t * Pointer enter/leave must be host listeners: those events do not bubble, and\n\t * `@onEvent` only supports delegated (bubbling) listeners.\n\t */\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.addEventListener('pointerenter', this.onPointerEnter);\n\t\tthis.addEventListener('pointerleave', this.onPointerLeave);\n\t\tqueueMicrotask(() => this.wireTrigger());\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis.clearTimers();\n\t\tthis.teardownFloating();\n\t\tthis.removeEventListener('pointerenter', this.onPointerEnter);\n\t\tthis.removeEventListener('pointerleave', this.onPointerLeave);\n\t\tthis.describedEl?.removeAttribute('aria-describedby');\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate clearTimers(): void {\n\t\tif (this.showTimer) clearTimeout(this.showTimer);\n\t\tif (this.hideTimer) clearTimeout(this.hideTimer);\n\t\tthis.showTimer = null;\n\t\tthis.hideTimer = null;\n\t}\n\n\tprivate teardownFloating(): void {\n\t\tthis.cleanup?.();\n\t\tthis.cleanup = null;\n\t}\n\n\tprivate getAnchor(): HTMLElement {\n\t\treturn (\n\t\t\t(this.querySelector(\n\t\t\t\t'button, a[href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n\t\t\t) as HTMLElement | null) ?? this\n\t\t);\n\t}\n\n\tprivate wireTrigger(): void {\n\t\tthis.describedEl?.removeAttribute('aria-describedby');\n\t\tthis.describedEl = this.getAnchor();\n\t\tthis.describedEl.setAttribute('aria-describedby', this.tooltipId);\n\t}\n\n\t@bound\n\tupdatePosition(): void {\n\t\tif (!this.tooltipTarget || !this.open) return;\n\t\tconst anchor = this.getAnchor();\n\t\tcomputePosition(anchor, this.tooltipTarget, {\n\t\t\tplacement: this.placement,\n\t\t\tmiddleware: [offset(8), flip(), shift({ padding: 8 })],\n\t\t}).then(({ x, y }) => {\n\t\t\tObject.assign(this.tooltipTarget.style, {\n\t\t\t\tleft: `${x}px`,\n\t\t\t\ttop: `${y}px`,\n\t\t\t});\n\t\t});\n\t}\n\n\t@onUpdated(['content', 'placement'])\n\tonDescribedPropsUpdated(): void {\n\t\tthis.wireTrigger();\n\t\tif (this.open) this.updatePosition();\n\t}\n\n\tprivate setOpen(next: boolean): void {\n\t\tthis.clearTimers();\n\t\tthis.open = next;\n\t\tif (!this.tooltipTarget) return;\n\t\tthis.tooltipTarget.hidden = !next;\n\n\t\tif (next) {\n\t\t\tthis.teardownFloating();\n\t\t\tconst anchor = this.getAnchor();\n\t\t\tthis.cleanup = autoUpdate(anchor, this.tooltipTarget, this.updatePosition);\n\t\t\tthis.updatePosition();\n\t\t} else {\n\t\t\tthis.teardownFloating();\n\t\t}\n\t}\n\n\tprivate scheduleShow(): void {\n\t\tthis.clearTimers();\n\t\tif (this.delay <= 0) {\n\t\t\tthis.setOpen(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.showTimer = setTimeout(() => this.setOpen(true), this.delay);\n\t}\n\n\tprivate scheduleHide(): void {\n\t\tthis.clearTimers();\n\t\tthis.hideTimer = setTimeout(() => this.setOpen(false), 80);\n\t}\n\n\t@onEvent({ document: true, type: 'keydown' })\n\tonDocumentKeydown(event: KeyboardEvent): void {\n\t\tif (!this.open || event.key !== 'Escape') return;\n\t\tthis.setOpen(false);\n\t}\n\n\t@onEvent({ type: 'focusin', selector: '.rui-tooltip__trigger' })\n\tonFocusIn(): void {\n\t\tthis.scheduleShow();\n\t}\n\n\t@onEvent({ type: 'focusout', selector: '.rui-tooltip__trigger' })\n\tonFocusOut(event: FocusEvent): void {\n\t\tconst next = event.relatedTarget as Node | null;\n\t\tif (next && this.contains(next)) return;\n\t\tthis.scheduleHide();\n\t}\n\n\t@bound\n\tonPointerEnter(): void {\n\t\tthis.scheduleShow();\n\t}\n\n\t@bound\n\tonPointerLeave(): void {\n\t\tthis.scheduleHide();\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<span class=\"rui-tooltip\">\n\t\t\t\t<span class=\"rui-tooltip__trigger\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</span>\n\t\t\t\t<span data-ref=\"tooltip\" id={this.tooltipId} class=\"rui-tooltip__content\" role=\"tooltip\" hidden>\n\t\t\t\t\t{this.$.content}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t);\n\t}\n}\n", "import type { WithChildren, RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiTooltipProps } from './tooltip.script';\nimport { RuiTooltip as RuiTooltipElement } from './tooltip.script';\nimport './tooltip.css';\n\nexport const RuiTooltip = defineRadiantView(\n\tRuiTooltipElement,\n\t({ slot, content, placement, delay, children }: WithChildren<RuiTooltipProps & RadiantSlotProps>) => (\n\t\t<rui-tooltip slot={slot} content={content} placement={placement} delay={delay}>\n\t\t\t{children}\n\t\t</rui-tooltip>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { applyRovingTabindex, focusRovingItem, navigateRovingTabindex } from '../../../lib/roving-tabindex';\n\nexport type RuiTreeProps = {\n\tlabel?: string;\n\t/** Selected tree item `data-value` / id. */\n\tvalue?: string;\n};\n\nexport type RuiTreeChangeDetail = { value: string };\n\ntype RuiTreeBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-tree>` \u2014 a hierarchical list of tree items.\n *\n * Implements a single-select APG Tree View with Arrow key navigation,\n * Home/End, parent navigation on ArrowLeft, and Enter/Space to select.\n * Expand/collapse is handled with ArrowRight/ArrowLeft (and `*` for siblings);\n * click or Enter on a parent also toggles expansion.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/treeview/\n * @element rui-tree\n * @fires rui-change\n */\n@customElement('rui-tree')\nexport class RuiTree extends RadiantElement<RuiTreeBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiTreeChangeDetail>;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\tprivate getVisibleItems(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')).filter((item) => {\n\t\t\tlet node: HTMLElement | null = item.parentElement;\n\t\t\twhile (node && node !== this) {\n\t\t\t\tif (node.getAttribute('role') === 'group' && node.hidden) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tnode = node.parentElement;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate getParentItem(item: HTMLElement): HTMLElement | null {\n\t\tconst group = item.closest('[role=\"group\"]');\n\t\tif (!group) return null;\n\t\tconst parent = group.previousElementSibling as HTMLElement | null;\n\t\treturn parent?.getAttribute('role') === 'treeitem' ? parent : null;\n\t}\n\n\t/** Same-level treeitems as `item` (for `*` expand-siblings). */\n\tprivate getSiblingItems(item: HTMLElement): HTMLElement[] {\n\t\tconst parent = this.getParentItem(item);\n\t\tconst container = parent\n\t\t\t? parent.nextElementSibling?.getAttribute('role') === 'group'\n\t\t\t\t? (parent.nextElementSibling as HTMLElement)\n\t\t\t\t: null\n\t\t\t: (this.querySelector<HTMLElement>('[role=\"tree\"]') ?? this);\n\n\t\tif (!container) return [];\n\n\t\treturn Array.from(\n\t\t\tcontainer.querySelectorAll<HTMLElement>(':scope > li > [role=\"treeitem\"], :scope > [role=\"treeitem\"]'),\n\t\t);\n\t}\n\n\tprivate syncSelection(): void {\n\t\tconst items = Array.from(this.querySelectorAll<HTMLElement>('[role=\"treeitem\"]'));\n\t\tconst visible = this.getVisibleItems();\n\t\tlet activeIndex = 0;\n\n\t\titems.forEach((item, i) => {\n\t\t\tconst id = item.getAttribute('data-value') || item.id || '';\n\t\t\tconst selected = Boolean(this.value) && id === this.value;\n\t\t\titem.setAttribute('aria-selected', String(selected));\n\t\t\tif (selected) {\n\t\t\t\tconst vis = visible.indexOf(item);\n\t\t\t\tif (vis >= 0) activeIndex = vis;\n\t\t\t} else if (!this.value && i === 0) {\n\t\t\t\tactiveIndex = 0;\n\t\t\t}\n\t\t});\n\n\t\tapplyRovingTabindex(visible, activeIndex);\n\t}\n\n\tprivate syncExpanded(): void {\n\t\tconst items = Array.from(this.querySelectorAll<HTMLElement>('[role=\"treeitem\"]'));\n\t\tfor (const item of items) {\n\t\t\tif (!item.hasAttribute('aria-expanded')) continue;\n\t\t\tconst group = item.nextElementSibling as HTMLElement | null;\n\t\t\tif (group?.getAttribute('role') === 'group') {\n\t\t\t\tgroup.hidden = item.getAttribute('aria-expanded') === 'false';\n\t\t\t}\n\t\t}\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncExpanded();\n\t\t\tthis.syncSelection();\n\t\t});\n\t}\n\n\t@onUpdated('value')\n\tonValueUpdated(): void {\n\t\tthis.syncSelection();\n\t}\n\n\tprivate select(item: HTMLElement): void {\n\t\tconst value = item.getAttribute('data-value') || item.id || item.textContent?.trim() || '';\n\t\tthis.value = value;\n\t\tthis.syncSelection();\n\t\tthis.changeEvent.emit({ value });\n\t\titem.focus();\n\t}\n\n\tprivate setExpanded(item: HTMLElement, expanded: boolean): void {\n\t\titem.setAttribute('aria-expanded', String(expanded));\n\t\tconst group = item.nextElementSibling as HTMLElement | null;\n\t\tif (group?.getAttribute('role') === 'group') group.hidden = !expanded;\n\t\tthis.syncSelection();\n\t}\n\n\t@onEvent({ selector: '[role=\"treeitem\"]', type: 'click' })\n\tonClick(event: Event): void {\n\t\tconst item = (event.target as HTMLElement).closest('[role=\"treeitem\"]') as HTMLElement | null;\n\t\tif (!item || !this.contains(item)) return;\n\t\tif (item.hasAttribute('aria-expanded')) {\n\t\t\tthis.setExpanded(item, item.getAttribute('aria-expanded') !== 'true');\n\t\t}\n\t\tthis.select(item);\n\t}\n\n\t@onEvent({ selector: '[role=\"treeitem\"]', type: 'keydown' })\n\tonKeydown(event: KeyboardEvent): void {\n\t\tconst current = (event.target as HTMLElement).closest('[role=\"treeitem\"]') as HTMLElement | null;\n\t\tif (!current) return;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Home':\n\t\t\tcase 'End': {\n\t\t\t\tconst result = navigateRovingTabindex({\n\t\t\t\t\titems: this.getVisibleItems(),\n\t\t\t\t\tcurrent,\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\torientation: 'vertical',\n\t\t\t\t\twrap: false,\n\t\t\t\t});\n\t\t\t\tif (!result.handled) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowRight': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (current.getAttribute('aria-expanded') === 'false') {\n\t\t\t\t\tthis.setExpanded(current, true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (current.getAttribute('aria-expanded') === 'true') {\n\t\t\t\t\tconst items = this.getVisibleItems();\n\t\t\t\t\tconst index = items.indexOf(current);\n\t\t\t\t\tif (items[index + 1]) focusRovingItem(items, index + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (current.getAttribute('aria-expanded') === 'true') {\n\t\t\t\t\tthis.setExpanded(current, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst parent = this.getParentItem(current);\n\t\t\t\tif (parent) {\n\t\t\t\t\tconst nextItems = this.getVisibleItems();\n\t\t\t\t\tconst parentIndex = nextItems.indexOf(parent);\n\t\t\t\t\tif (parentIndex >= 0) focusRovingItem(nextItems, parentIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '*': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfor (const sibling of this.getSiblingItems(current)) {\n\t\t\t\t\tif (sibling.hasAttribute('aria-expanded')) {\n\t\t\t\t\t\tthis.setExpanded(sibling, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (current.hasAttribute('aria-expanded')) {\n\t\t\t\t\tthis.setExpanded(current, current.getAttribute('aria-expanded') !== 'true');\n\t\t\t\t}\n\t\t\t\tthis.select(current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ' ': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.select(current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<ul class=\"rui-tree\" role=\"tree\" aria-label={this.resolvedAriaLabel} aria-multiselectable=\"false\">\n\t\t\t\t<slot></slot>\n\t\t\t</ul>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiTreeProps } from './tree.script';\nimport { RuiTree as RuiTreeElement } from './tree.script';\nimport './tree.css';\n\nexport type RuiTreeNode = {\n\tid: string;\n\tlabel: JsxRenderable;\n\tchildren?: RuiTreeNode[];\n\texpanded?: boolean;\n};\n\nconst TreeNodes = ({ nodes }: { nodes: RuiTreeNode[] }) => (\n\t<>\n\t\t{nodes.map((node) => (\n\t\t\t<li class=\"rui-tree__item\">\n\t\t\t\t{node.children?.length ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"rui-tree__node\"\n\t\t\t\t\t\t\trole=\"treeitem\"\n\t\t\t\t\t\t\tdata-value={node.id}\n\t\t\t\t\t\t\taria-expanded={node.expanded ?? false}\n\t\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{node.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<ul role=\"group\" hidden={!(node.expanded ?? false)}>\n\t\t\t\t\t\t\t<TreeNodes nodes={node.children} />\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"rui-tree__node\"\n\t\t\t\t\t\trole=\"treeitem\"\n\t\t\t\t\t\tdata-value={node.id}\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t>\n\t\t\t\t\t\t{node.label}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</li>\n\t\t))}\n\t</>\n);\n\nexport const RuiTree = defineRadiantView(\n\tRuiTreeElement,\n\t({ slot, label, value, nodes }: RuiTreeProps & RadiantSlotProps & { nodes: RuiTreeNode[] }) => (\n\t\t<rui-tree slot={slot} label={label} value={value}>\n\t\t\t<TreeNodes nodes={nodes} />\n\t\t</rui-tree>\n\t),\n);\n", "import { RadiantElement, customElement, event, onEvent, onUpdated, prop } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\nimport { applyRovingTabindex, focusRovingItem } from '../../../lib/roving-tabindex';\n\nexport type RuiTreegridProps = {\n\tlabel?: string;\n\t/** Selected row `data-row-id`. */\n\tvalue?: string;\n};\n\nexport type RuiTreegridChangeDetail = {\n\trowId: string;\n\tcolumnIndex: number;\n};\n\ntype RuiTreegridBindings = {\n\tlabel: string;\n};\n\n/**\n * `<rui-treegrid>` \u2014 a hierarchical grid navigated with arrow keys.\n *\n * Implements a read-only APG Treegrid: rows may expand/collapse to reveal child\n * rows, and `role=\"gridcell\"` descendants are focused with roving tabindex.\n *\n * Expand/collapse with ArrowRight/ArrowLeft only from the first cell of a row\n * (APG cell-only focus). Enter or click on that cell toggles expansion; Space selects.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/\n * @element rui-treegrid\n * @fires rui-change\n */\n@customElement('rui-treegrid')\nexport class RuiTreegrid extends RadiantElement<RuiTreegridBindings> {\n\t@prop({ type: String, defaultValue: '' }) label: string;\n\t@prop({ type: String, reflect: true, defaultValue: '' }) value: string;\n\n\t@event({ name: 'rui-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiTreegridChangeDetail>;\n\n\tprivate readonly resolvedAriaLabel = this.$.label.map((label) => label || undefined);\n\n\tprivate getDataRows(): HTMLElement[] {\n\t\treturn Array.from(this.querySelectorAll<HTMLElement>('[role=\"row\"][data-row-id]'));\n\t}\n\n\tprivate getVisibleRows(): HTMLElement[] {\n\t\treturn this.getDataRows().filter((row) => {\n\t\t\tlet parent = row.parentElement;\n\t\t\twhile (parent && parent !== this) {\n\t\t\t\tif (parent.getAttribute('role') === 'rowgroup' && parent.hidden) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tparent = parent.parentElement;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate getRowCells(row: HTMLElement): HTMLElement[] {\n\t\treturn Array.from(row.querySelectorAll<HTMLElement>(':scope > [role=\"gridcell\"]'));\n\t}\n\n\tprivate getVisibleCells(): HTMLElement[] {\n\t\treturn this.getVisibleRows().flatMap((row) => this.getRowCells(row));\n\t}\n\n\tprivate getParentRow(row: HTMLElement): HTMLElement | null {\n\t\tconst group = row.parentElement;\n\t\tif (!group || group.getAttribute('role') !== 'rowgroup') {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst parent = group.previousElementSibling as HTMLElement | null;\n\t\treturn parent?.getAttribute('role') === 'row' ? parent : null;\n\t}\n\n\tprivate syncExpanded(): void {\n\t\tfor (const row of this.getDataRows()) {\n\t\t\tif (!row.hasAttribute('aria-expanded')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst group = row.nextElementSibling as HTMLElement | null;\n\t\t\tif (group?.getAttribute('role') === 'rowgroup') {\n\t\t\t\tgroup.hidden = row.getAttribute('aria-expanded') === 'false';\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate syncSelection(): void {\n\t\tconst cells = this.getVisibleCells();\n\t\tlet activeIndex = 0;\n\n\t\tfor (const row of this.getDataRows()) {\n\t\t\tconst rowId = row.getAttribute('data-row-id') ?? '';\n\t\t\tconst selected = Boolean(this.value) && rowId === this.value;\n\t\t\tfor (const cell of this.getRowCells(row)) {\n\t\t\t\tcell.setAttribute('aria-selected', String(selected));\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst index = cells.indexOf(cell);\n\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\tactiveIndex = index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (cells.length > 0) {\n\t\t\tapplyRovingTabindex(cells, activeIndex);\n\t\t}\n\t}\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => {\n\t\t\tthis.syncExpanded();\n\t\t\tthis.syncSelection();\n\t\t});\n\t}\n\n\t@onUpdated('value')\n\tonValueUpdated(): void {\n\t\tthis.syncSelection();\n\t}\n\n\tprivate setExpanded(row: HTMLElement, expanded: boolean): void {\n\t\trow.setAttribute('aria-expanded', String(expanded));\n\t\tconst group = row.nextElementSibling as HTMLElement | null;\n\t\tif (group?.getAttribute('role') === 'rowgroup') {\n\t\t\tgroup.hidden = !expanded;\n\t\t}\n\t}\n\n\tprivate activateCell(cell: HTMLElement): void {\n\t\tconst row = cell.closest<HTMLElement>('[role=\"row\"][data-row-id]');\n\t\tif (!row) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rowId = row.getAttribute('data-row-id') ?? '';\n\t\tconst columnIndex = this.getRowCells(row).indexOf(cell);\n\t\tthis.value = rowId;\n\t\tthis.syncSelection();\n\t\tthis.changeEvent.emit({ rowId, columnIndex });\n\t\tcell.focus();\n\t}\n\n\tprivate focusCell(row: HTMLElement, columnIndex: number): void {\n\t\tconst rows = this.getVisibleRows();\n\t\tconst rowIndex = rows.indexOf(row);\n\t\tif (rowIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst cells = this.getVisibleCells();\n\t\tconst rowCells = this.getRowCells(row);\n\t\tconst target = rowCells[Math.min(Math.max(0, columnIndex), rowCells.length - 1)];\n\t\tconst nextIndex = cells.indexOf(target);\n\t\tif (nextIndex >= 0) {\n\t\t\tfocusRovingItem(cells, nextIndex);\n\t\t}\n\t}\n\n\t@onEvent({ selector: '[role=\"gridcell\"]', type: 'click' })\n\tonCellClick(event: Event): void {\n\t\tconst cell = (event.target as HTMLElement).closest<HTMLElement>('[role=\"gridcell\"]');\n\t\tif (!cell || !this.contains(cell)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst row = cell.closest<HTMLElement>('[role=\"row\"][data-row-id]');\n\t\tif (row) {\n\t\t\tconst isFirstCell = this.getRowCells(row).indexOf(cell) === 0;\n\t\t\tif (isFirstCell && row.hasAttribute('aria-expanded')) {\n\t\t\t\tthis.setExpanded(row, row.getAttribute('aria-expanded') !== 'true');\n\t\t\t}\n\t\t}\n\n\t\tthis.activateCell(cell);\n\t}\n\n\t@onEvent({ selector: '[role=\"gridcell\"]', type: 'keydown' })\n\tonCellKeydown(event: KeyboardEvent): void {\n\t\tconst cell = (event.target as HTMLElement).closest<HTMLElement>('[role=\"gridcell\"]');\n\t\tconst row = cell?.closest<HTMLElement>('[role=\"row\"][data-row-id]');\n\t\tif (!cell || !row) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visibleRows = this.getVisibleRows();\n\t\tconst rowIndex = visibleRows.indexOf(row);\n\t\tconst rowCells = this.getRowCells(row);\n\t\tconst colIndex = rowCells.indexOf(cell);\n\t\tconst isFirstCell = colIndex === 0;\n\t\tconst isExpandable = row.hasAttribute('aria-expanded');\n\t\tconst isExpanded = row.getAttribute('aria-expanded') === 'true';\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// APG cell-only: expand only from the first cell of a collapsed parent.\n\t\t\t\tif (isFirstCell && isExpandable && !isExpanded) {\n\t\t\t\t\tthis.setExpanded(row, true);\n\t\t\t\t\tthis.syncSelection();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (colIndex < rowCells.length - 1) {\n\t\t\t\t\tthis.focusCell(row, colIndex + 1);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// APG cell-only: collapse only from the first cell of an expanded parent.\n\t\t\t\tif (isFirstCell && isExpandable && isExpanded) {\n\t\t\t\t\tthis.setExpanded(row, false);\n\t\t\t\t\tthis.syncSelection();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (colIndex > 0) {\n\t\t\t\t\tthis.focusCell(row, colIndex - 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parent = this.getParentRow(row);\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis.focusCell(parent, 0);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextRow = visibleRows[Math.min(visibleRows.length - 1, rowIndex + 1)];\n\t\t\t\tif (nextRow && nextRow !== row) {\n\t\t\t\t\tthis.focusCell(nextRow, colIndex);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst prevRow = visibleRows[Math.max(0, rowIndex - 1)];\n\t\t\t\tif (prevRow && prevRow !== row) {\n\t\t\t\t\tthis.focusCell(prevRow, colIndex);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusCell(row, 0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusCell(row, rowCells.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase '*': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfor (const sibling of this.getDataRows()) {\n\t\t\t\t\tif (sibling.hasAttribute('aria-expanded')) {\n\t\t\t\t\t\tthis.setExpanded(sibling, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.syncSelection();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Enter': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// APG: Enter on the first cell of an expandable row toggles expansion.\n\t\t\t\tif (isFirstCell && isExpandable) {\n\t\t\t\t\tthis.setExpanded(row, !isExpanded);\n\t\t\t\t\tthis.syncSelection();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.activateCell(cell);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ' ': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.activateCell(cell);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn (\n\t\t\t<div class=\"rui-treegrid\" role=\"treegrid\" aria-label={this.resolvedAriaLabel}>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiTreegridProps } from './treegrid.script';\nimport { RuiTreegrid as RuiTreegridElement } from './treegrid.script';\nimport './treegrid.css';\n\nexport type RuiTreegridRow = {\n\tid: string;\n\tcells: JsxRenderable[];\n\tchildren?: RuiTreegridRow[];\n\texpanded?: boolean;\n};\n\nconst TreegridRows = ({ rows }: { rows: RuiTreegridRow[] }) => (\n\t<>\n\t\t{rows.map((row) => (\n\t\t\t<>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rui-treegrid__row\"\n\t\t\t\t\trole=\"row\"\n\t\t\t\t\tdata-row-id={row.id}\n\t\t\t\t\taria-expanded={row.children?.length ? (row.expanded ?? false) : undefined}\n\t\t\t\t>\n\t\t\t\t\t{row.cells.map((cell, index) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rui-treegrid__cell\"\n\t\t\t\t\t\t\trole=\"gridcell\"\n\t\t\t\t\t\t\ttabindex={-1}\n\t\t\t\t\t\t\tdata-col={index}\n\t\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{cell}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{row.children?.length ? (\n\t\t\t\t\t<div class=\"rui-treegrid__group\" role=\"rowgroup\" hidden={!(row.expanded ?? false)}>\n\t\t\t\t\t\t<TreegridRows rows={row.children} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</>\n\t\t))}\n\t</>\n);\n\nexport const RuiTreegrid = defineRadiantView(\n\tRuiTreegridElement,\n\t({\n\t\tslot,\n\t\tlabel,\n\t\tvalue,\n\t\tcolumns,\n\t\trows,\n\t}: RuiTreegridProps & RadiantSlotProps & { columns: JsxRenderable[]; rows: RuiTreegridRow[] }) => (\n\t\t<rui-treegrid slot={slot} label={label} value={value}>\n\t\t\t<div class=\"rui-treegrid__row rui-treegrid__row--header\" role=\"row\">\n\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t<div class=\"rui-treegrid__cell rui-treegrid__cell--header\" role=\"columnheader\">\n\t\t\t\t\t\t{column}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<TreegridRows rows={rows} />\n\t\t</rui-treegrid>\n\t),\n);\n", "import { RadiantElement, bound, customElement, event, onEvent, onUpdated, prop, query } from '@ecopages/radiant';\nimport type { EventEmitter } from '@ecopages/radiant/tools/event-emitter';\n\nexport type RuiWindowSplitterProps = {\n\t/** Primary pane size as a percentage. Default: `50`. */\n\tvalue?: number;\n\t/** Orientation of the split. Default: `horizontal` (left/right panes). */\n\torientation?: 'horizontal' | 'vertical';\n\tlabel?: string;\n};\n\nexport type RuiWindowSplitterChangeDetail = { value: number };\n\ntype RuiWindowSplitterBindings = {\n\tvalue: number;\n\tlabel: string;\n\torientation: NonNullable<RuiWindowSplitterProps['orientation']>;\n};\n\n/**\n * `<rui-window-splitter>` \u2014 a movable separator between two panes.\n *\n * Implements the APG Window Splitter pattern with a focusable separator that\n * adjusts pane size via arrow keys and pointer drag. `value` and `orientation`\n * are reactive props.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/\n * @element rui-window-splitter\n */\n@customElement('rui-window-splitter')\nexport class RuiWindowSplitter extends RadiantElement<RuiWindowSplitterBindings> {\n\t@prop({ type: Number, reflect: true, defaultValue: 50 }) value: number;\n\t@prop({ type: String, defaultValue: 'horizontal' }) orientation: NonNullable<RuiWindowSplitterProps['orientation']>;\n\t@prop({ type: String, defaultValue: 'Split view' }) label: string;\n\n\t@query({ ref: 'primary' }) primaryTarget: HTMLElement;\n\t@query({ ref: 'separator' }) separatorTarget: HTMLElement;\n\n\t@event({ name: 'rui-splitter-change', bubbles: true, composed: true })\n\tchangeEvent: EventEmitter<RuiWindowSplitterChangeDetail>;\n\n\t/** `class` stays a plain-read composition; only the derived aria-orientation string is bound. */\n\tprivate readonly resolvedAriaOrientation = this.$.orientation.map((orientation) =>\n\t\torientation !== 'vertical' ? 'vertical' : 'horizontal',\n\t);\n\n\tprivate dragging = false;\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tqueueMicrotask(() => this.applySize());\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tdocument.removeEventListener('pointermove', this.onPointerMove);\n\t\tdocument.removeEventListener('pointerup', this.onPointerUp);\n\t\tsuper.disconnectedCallback();\n\t}\n\n\t@onUpdated(['value', 'orientation'])\n\tonPropsUpdated(): void {\n\t\tthis.applySize();\n\t}\n\n\tprivate applySize(): void {\n\t\tif (!this.primaryTarget) return;\n\t\tconst size = `${Math.min(80, Math.max(20, this.value))}%`;\n\t\tif (this.orientation === 'vertical') {\n\t\t\tthis.primaryTarget.style.height = size;\n\t\t\tthis.primaryTarget.style.width = '';\n\t\t} else {\n\t\t\tthis.primaryTarget.style.width = size;\n\t\t\tthis.primaryTarget.style.height = '';\n\t\t}\n\t}\n\n\t@onEvent({ ref: 'separator', type: 'keydown' })\n\tonKeydown(event: KeyboardEvent): void {\n\t\tconst delta = event.shiftKey ? 10 : 2;\n\t\tconst horizontal = this.orientation !== 'vertical';\n\t\tif ((horizontal && event.key === 'ArrowLeft') || (!horizontal && event.key === 'ArrowUp')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.updateValue(Math.max(20, this.value - delta));\n\t\t} else if ((horizontal && event.key === 'ArrowRight') || (!horizontal && event.key === 'ArrowDown')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.updateValue(Math.min(80, this.value + delta));\n\t\t} else if (event.key === 'Home') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.updateValue(20);\n\t\t} else if (event.key === 'End') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.updateValue(80);\n\t\t}\n\t}\n\n\tprivate updateValue(next: number): void {\n\t\tif (next === this.value) return;\n\t\tthis.value = next;\n\t\tthis.changeEvent.emit({ value: next });\n\t}\n\n\t@onEvent({ ref: 'separator', type: 'pointerdown' })\n\tonPointerDown(event: PointerEvent): void {\n\t\tthis.dragging = true;\n\t\tthis.separatorTarget.setPointerCapture(event.pointerId);\n\t\tdocument.addEventListener('pointermove', this.onPointerMove);\n\t\tdocument.addEventListener('pointerup', this.onPointerUp);\n\t}\n\n\t@bound\n\tonPointerMove(event: PointerEvent): void {\n\t\tif (!this.dragging) return;\n\t\tconst rect = this.getBoundingClientRect();\n\t\tif (this.orientation === 'vertical') {\n\t\t\tthis.updateValue(Math.min(80, Math.max(20, ((event.clientY - rect.top) / rect.height) * 100)));\n\t\t} else {\n\t\t\tthis.updateValue(Math.min(80, Math.max(20, ((event.clientX - rect.left) / rect.width) * 100)));\n\t\t}\n\t}\n\n\t@bound\n\tonPointerUp(): void {\n\t\tthis.dragging = false;\n\t\tdocument.removeEventListener('pointermove', this.onPointerMove);\n\t\tdocument.removeEventListener('pointerup', this.onPointerUp);\n\t}\n\n\toverride render() {\n\t\tconst horizontal = this.orientation !== 'vertical';\n\t\treturn (\n\t\t\t<div class={`rui-window-splitter rui-window-splitter--${horizontal ? 'horizontal' : 'vertical'}`}>\n\t\t\t\t<div data-ref=\"primary\" class=\"rui-window-splitter__pane\">\n\t\t\t\t\t<slot name=\"primary\"></slot>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tdata-ref=\"separator\"\n\t\t\t\t\tclass=\"rui-window-splitter__separator\"\n\t\t\t\t\trole=\"separator\"\n\t\t\t\t\ttabindex={0}\n\t\t\t\t\taria-orientation={this.resolvedAriaOrientation}\n\t\t\t\t\taria-valuenow={this.$.value}\n\t\t\t\t\taria-valuemin={20}\n\t\t\t\t\taria-valuemax={80}\n\t\t\t\t\taria-label={this.$.label}\n\t\t\t\t></div>\n\t\t\t\t<div class=\"rui-window-splitter__pane\">\n\t\t\t\t\t<slot name=\"secondary\"></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n", "import type { JsxRenderable } from '@ecopages/jsx';\nimport type { RadiantSlotProps } from '../../../types';\nimport { defineRadiantView } from '../../../lib/radiant-view';\nimport type { RuiWindowSplitterProps } from './window-splitter.script';\nimport { RuiWindowSplitter as RuiWindowSplitterElement } from './window-splitter.script';\nimport './window-splitter.css';\n\nexport const RuiWindowSplitter = defineRadiantView(\n\tRuiWindowSplitterElement,\n\t({\n\t\tslot,\n\t\tvalue,\n\t\torientation,\n\t\tlabel,\n\t\tprimary,\n\t\tsecondary,\n\t}: RuiWindowSplitterProps & RadiantSlotProps & { primary: JsxRenderable; secondary: JsxRenderable }) => (\n\t\t<rui-window-splitter slot={slot} value={value} orientation={orientation} label={label}>\n\t\t\t<div slot=\"primary\">{primary}</div>\n\t\t\t<div slot=\"secondary\">{secondary}</div>\n\t\t</rui-window-splitter>\n\t),\n);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["RadiantElement", "customElement", "prop", "RuiAlert", "RADIANT_VIEW_ELEMENT", "RADIANT_SCRIPT_MODULE", "RADIANT_SCRIPT_EXPORT", "linkViewToElement", "view", "element", "ssrModule", "defineRadiantView", "render", "args", "RuiAlert", "defineRadiantView", "slot", "variant", "children", "RadiantElement", "customElement", "prop", "RuiBreadcrumb", "label", "separator", "cx", "parts", "RuiBreadcrumb", "defineRadiantView", "slot", "label", "separator", "className", "children", "RuiBreadcrumbList", "RuiBreadcrumbItem", "RuiBreadcrumbLink", "href", "ariaLabel", "RuiBreadcrumbPage", "RuiBreadcrumbSeparator", "RuiBreadcrumbEllipsis", "cx", "parts", "resolveAriaPressed", "pressed", "toggle", "defaultPressed", "RuiButton", "variant", "size", "type", "disabled", "className", "slot", "children", "onClick", "rest", "handleClick", "event", "button", "next", "RadiantElement", "customElement", "onEvent", "onUpdated", "prop", "SWIPE_THRESHOLD_PX", "RuiCarousel", "slide", "index", "key", "panelId", "slides", "activeIndex", "count", "i", "active", "positionLabel", "raw", "normalized", "track", "disablePrev", "disableNext", "button", "container", "indicator", "selected", "toggle", "playing", "viewport", "rotating", "ms", "currentSlides", "next", "delta", "target", "event", "indicatorIndex", "current", "nextIndex", "dx", "dy", "showRotation", "slideCount", "ariaLive", "overlay", "prevControl", "nextControl", "rotationControl", "indicators", "toolbarControls", "overlayChrome", "cx", "parts", "RuiCarouselSlide", "id", "children", "className", "toolbarPrevLabel", "toolbarNextLabel", "RuiCarouselPrev", "slot", "disabled", "overlay", "RuiCarouselNext", "RuiCarouselRotation", "RuiCarousel", "defineRadiantView", "label", "index", "autoplay", "interval", "transition", "controlsVariant", "showIndicators", "showRotationControl", "loop", "wrap", "slides", "slideList", "slide", "RadiantElement", "customElement", "event", "onEvent", "prop", "RuiCheckbox", "name", "indeterminate", "input", "RuiCheckbox", "defineRadiantView", "slot", "checked", "indeterminate", "disabled", "value", "name", "children", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiCombobox", "listbox", "option", "index", "target", "previous", "parent", "fieldLabel", "input", "labelElement", "trigger", "visible", "active", "next", "options", "activate", "query", "q", "text", "value", "label", "match", "direction", "altKey", "length", "cx", "parts", "RuiComboboxControl", "slot", "children", "className", "RuiComboboxInput", "placeholder", "disabled", "RuiComboboxTrigger", "ariaLabel", "RuiComboboxListbox", "RuiComboboxOption", "value", "label", "RuiCombobox", "defineRadiantView", "openOnFocus", "options", "option", "RadiantElement", "bound", "customElement", "event", "onEvent", "onUpdated", "prop", "query", "FOCUSABLE", "RuiDialog", "open", "alert", "el", "reason", "focusable", "first", "last", "active", "cx", "parts", "RuiDialogTitle", "slot", "children", "className", "RuiDialogBody", "RuiDialogActions", "RuiDialogClose", "ariaLabel", "RuiDialog", "defineRadiantView", "open", "alert", "label", "id", "title", "actions", "RUI_DIALOG_HOST_ID", "RUI_DIALOG_OPEN_EVENT", "RUI_DIALOG_CLOSE_EVENT", "RUI_DIALOG_TOGGLE_EVENT", "RUI_DIALOG_ACTION_EVENT", "isNamedDialogOpen", "detail", "installed", "mountParent", "hostDialog", "openId", "resolveDialog", "id", "trimmed", "byId", "createCloseButton", "close", "createTitle", "title", "el", "createBody", "body", "paragraph", "createActions", "actions", "row", "action", "button", "destroyHostDialog", "mountHostDialog", "options", "dialog", "RUI_DIALOG_HOST_ID", "closeCurrentExcept", "nextId", "openNamed", "ensureInstalled", "openHost", "open", "idOrOptions", "isNamedDialogOpen", "targetId", "toggle", "onOpenEvent", "event", "detail", "onCloseEvent", "onToggleEvent", "onDocumentClick", "target", "RUI_DIALOG_ACTION_EVENT", "openTrigger", "closeTrigger", "onRuiClose", "installDialogs", "uninstallDialogs", "RUI_DIALOG_OPEN_EVENT", "RUI_DIALOG_CLOSE_EVENT", "RUI_DIALOG_TOGGLE_EVENT", "getOpenDialogId", "openDialog", "closeDialog", "toggleDialog", "createDialogHandle", "boundId", "closeId", "toggleId", "RadiantElement", "bound", "customElement", "onEvent", "onUpdated", "prop", "RuiDisclosure", "event", "next", "trigger", "panel", "RadiantElement", "customElement", "onEvent", "onUpdated", "prop", "applyRovingTabindex", "items", "activeIndex", "item", "index", "focusRovingItem", "next", "deltaForKey", "key", "orientation", "navigateRovingTabindex", "options", "current", "wrap", "delta", "RuiDisclosureGroup", "customElement", "RadiantElement", "prop", "trigger", "triggers", "activeIndex", "applyRovingTabindex", "disclosure", "onUpdated", "onEvent", "event", "source", "RuiDisclosure", "current", "nextOpen", "other", "navigateRovingTabindex", "cx", "parts", "RuiDisclosureIcon", "variant", "className", "RuiDisclosureTrigger", "slot", "children", "disabled", "icon", "iconPosition", "iconNode", "RuiDisclosurePanel", "RuiDisclosure", "defineRadiantView", "open", "value", "animated", "trigger", "RuiDisclosureGroup", "multiple", "RadiantElement", "customElement", "prop", "RuiFeed", "label", "RuiFeed", "defineRadiantView", "slot", "label", "articles", "article", "index", "RadiantElement", "customElement", "onEvent", "onUpdated", "prop", "registerSsrPreparationCallback", "consumeContext", "onContextUpdate", "provideContext", "RUI_CONTROL_ATTR", "RUI_FIELD_MANAGED_ATTR", "RUI_FIELD_LABEL_ATTR", "RUI_FIELD_DESCRIPTION_ATTR", "RUI_FIELD_ERROR_ATTR", "RUI_FIELD_DEFAULT_VALUE_ATTR", "RUI_FORM_DEFAULT_VALUES_ATTR", "HOST_CONTROL_TAGS", "CONTROL_SELECTOR", "forEachFieldContentNode", "root", "visit", "slotHost", "visited", "safeVisit", "node", "renderRoot", "child", "shadow", "queryFieldContent", "selector", "found", "pickPrimaryFieldControl", "candidates", "active", "candidate", "visible", "el", "pool", "listFieldControlsInRenderTree", "findFieldControl", "fromRenderTree", "match", "findControlInSubtree", "readControlValue", "control", "host", "resolveControlHost", "input", "propValue", "raw", "writeControlValue", "value", "ce", "findFieldLabel", "findFieldDescription", "findFieldError", "findFieldErrorElements", "inRender", "fromDom", "single", "wireFieldControlName", "controlHost", "ariaTarget", "name", "getAriaControlTarget", "marked", "checked", "first", "createContext", "formContext", "createContext", "fieldContext", "stripValidate", "rules", "_validate", "serializable", "RuiField", "customElement", "RadiantElement", "prop", "RUI_FIELD_DEFAULT_VALUE_ATTR", "provideContext", "fieldContext", "value", "consumeContext", "formContext", "registerSsrPreparationCallback", "raw", "formCtx", "fieldName", "ctx", "actions", "control", "findFieldControl", "readControlValue", "writeControlValue", "onContextUpdate", "onUpdated", "onEvent", "controlHost", "ariaTarget", "getAriaControlTarget", "controlId", "descriptionId", "errorId", "errorMessage", "invalid", "required", "wireFieldControlName", "RUI_FIELD_MANAGED_ATTR", "describedBy", "description", "findFieldDescription", "errorEl", "findFieldError", "label", "findFieldLabel", "findFieldErrorElements", "nextFieldContext", "prev", "RuiField", "defineRadiantView", "name", "rules", "defaultValue", "defaultValueData", "disabled", "error", "invalid", "children", "RuiFieldDescription", "className", "children", "RUI_FIELD_DESCRIPTION_ATTR", "RuiFieldError", "className", "RUI_FIELD_ERROR_ATTR", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "provideContext", "resolveRuleMessage", "fallback", "rule", "ruleValue", "validateFieldRules", "_valueName", "value", "rules", "values", "num", "str", "patternRule", "result", "key", "fn", "runRulesResolver", "context", "names", "targetNames", "errors", "name", "message", "createRulesResolver", "options", "normalizeResolver", "resolver", "createRulesResolver", "FormStore", "options", "listener", "registration", "existing", "entry", "name", "field", "next", "value", "values", "errorCount", "message", "result", "trigger", "onValid", "onInvalid", "valid", "nextDefaults", "defaults", "fields", "rules", "noopUnregister", "initialFormActions", "RuiForm", "customElement", "RadiantElement", "provideContext", "formContext", "event", "prop", "RUI_FORM_DEFAULT_VALUES_ATTR", "registration", "unregister", "name", "options", "listener", "formEl", "btn", "values", "errors", "fromAttr", "raw", "parsed", "FormStore", "store", "fields", "message", "show", "revision", "nextContext", "onUpdated", "onEvent", "RuiForm", "defineRadiantView", "defaultValues", "defaultValuesData", "resolver", "mode", "reValidateMode", "children", "RadiantElement", "customElement", "onEvent", "prop", "RuiGrid", "customElement", "RadiantElement", "prop", "label", "cells", "applyRovingTabindex", "onEvent", "event", "rows", "current", "row", "rowIndex", "colIndex", "nextRow", "nextCol", "targetRow", "targetCells", "target", "allCells", "RuiGrid", "defineRadiantView", "slot", "label", "rows", "row", "cell", "cx", "parts", "RuiInput", "value", "type", "placeholder", "disabled", "name", "size", "className", "id", "ariaLabel", "onInput", "onChange", "onBlur", "rest", "RUI_CONTROL_ATTR", "RuiLabel", "htmlFor", "className", "children", "RUI_FIELD_LABEL_ATTR", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiListbox", "customElement", "RadiantElement", "prop", "event", "label", "disabled", "onUpdated", "options", "option", "selected", "onEvent", "current", "result", "navigateRovingTabindex", "RuiListbox", "defineRadiantView", "slot", "value", "label", "disabled", "options", "option", "RadiantElement", "bound", "customElement", "event", "onEvent", "onUpdated", "prop", "query", "autoUpdate", "computePosition", "flip", "offset", "shift", "RuiMenuButton", "item", "x", "y", "focus", "items", "next", "wasOpen", "target", "current", "index", "value", "RuiMenuButton", "defineRadiantView", "slot", "open", "placement", "trigger", "items", "item", "RadiantElement", "customElement", "event", "onEvent", "prop", "RuiMenubar", "customElement", "RadiantElement", "prop", "event", "label", "topItem", "menu", "item", "applyRovingTabindex", "returnFocus", "top", "focus", "root", "items", "onEvent", "current", "result", "navigateRovingTabindex", "tops", "value", "RuiMenubar", "defineRadiantView", "slot", "label", "items", "item", "child", "RadiantElement", "customElement", "onUpdated", "prop", "state", "RuiMeter", "label", "RuiMeter", "defineRadiantView", "slot", "value", "min", "max", "label", "RadiantElement", "customElement", "onEvent", "prop", "FOCUSABLE_SELECTOR", "isVisible", "element", "getFocusableElements", "root", "RuiNavigationMenu", "customElement", "RadiantElement", "prop", "label", "items", "activeIndex", "item", "applyRovingTabindex", "value", "panel", "focusables", "getFocusableElements", "open", "trigger", "returnFocus", "previous", "focusPanel", "event", "target", "openPanel", "node", "onEvent", "element", "active", "barItems", "isTrigger", "result", "navigateRovingTabindex", "nextItem", "nextValue", "nextIsTrigger", "cx", "parts", "RuiNavigationMenu", "defineRadiantView", "label", "children", "slot", "RuiNavigationMenuTrigger", "value", "variant", "rest", "RuiButton", "RuiNavigationMenuLink", "href", "className", "RuiNavigationMenuPanel", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiRadioGroup", "label", "disabled", "radios", "groupName", "radio", "input", "RuiRadioGroup", "defineRadiantView", "slot", "value", "name", "label", "disabled", "options", "option", "RadiantElement", "bound", "customElement", "event", "onEvent", "onUpdated", "prop", "query", "state", "DEFAULT_WIDTH", "ICON_WIDTH", "DEFAULT_MIN_WIDTH", "DEFAULT_MAX_WIDTH", "DEFAULT_MOBILE_BREAKPOINT", "KEYBOARD_SHORTCUT", "KEYBOARD_STEP", "KEYBOARD_STEP_LARGE", "isModifierPressed", "isMediaQuerySupported", "isHorizontalSide", "side", "RuiSidebar", "paneState", "next", "width", "root", "emit", "clamped", "wasOpen", "horizontal", "coord", "delta", "keyboardEvent", "current", "prevKey", "nextKey", "open", "showHandle", "widthVar", "paneInert", "RadiantElement", "bound", "customElement", "onUpdated", "prop", "query", "RuiSidebarTrigger", "id", "byId", "host", "sidebar", "event", "detail", "fromData", "fromAttribute", "state", "button", "buttonLabel", "showCollapse", "showExpand", "controlsId", "cx", "parts", "RuiSidebarProvider", "layout", "sidebar", "children", "className", "RuiSidebarHeader", "ariaLabel", "RuiSidebarContent", "RuiSidebarFooter", "RuiSidebarSeparator", "RuiSidebarGroup", "RuiSidebarGroupLabel", "id", "RuiSidebarGroupAction", "RuiSidebarGroupHeader", "label", "action", "RuiSidebarMenu", "RuiSidebarMenuItem", "RuiSidebarMenuButton", "isActive", "as", "href", "type", "tooltip", "disabled", "onClick", "classNames", "title", "RuiSidebarMenuAction", "props", "rest", "RuiSidebarInset", "RuiSidebar", "defineRadiantView", "slot", "variant", "side", "collapsible", "defaultOpen", "open", "defaultWidth", "width", "mobileBreakpoint", "RuiSidebarTrigger", "controls", "triggerLabel", "placement", "size", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "query", "RuiSlider", "disabled", "label", "name", "next", "stepped", "low", "high", "nextLow", "nextHigh", "value", "clientX", "track", "rect", "ratio", "input", "nextValue", "lowPercent", "highPercent", "emit", "changed", "thumb", "currentLow", "currentHigh", "thumbElement", "current", "RuiSlider", "defineRadiantView", "slot", "variant", "value", "values", "min", "max", "step", "minDistance", "disabled", "label", "name", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "state", "RuiSpinbutton", "name", "label", "decreaseDisabled", "increaseDisabled", "button", "next", "stepped", "value", "input", "parsed", "RuiSpinbutton", "defineRadiantView", "slot", "value", "min", "max", "step", "disabled", "label", "name", "children", "RadiantElement", "customElement", "event", "onEvent", "prop", "RuiSwitch", "name", "input", "RuiSwitch", "defineRadiantView", "slot", "checked", "disabled", "name", "children", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiTabs", "customElement", "RadiantElement", "prop", "event", "onUpdated", "tablist", "nextValue", "tabs", "panels", "selected", "tab", "isSelected", "panel", "onEvent", "current", "result", "navigateRovingTabindex", "RuiTabs", "defineRadiantView", "slot", "value", "label", "automatic", "items", "item", "cx", "parts", "RuiTextarea", "value", "placeholder", "disabled", "name", "rows", "size", "className", "id", "ariaLabel", "onInput", "onChange", "onBlur", "rest", "RUI_CONTROL_ATTR", "RadiantElement", "bound", "customElement", "onEvent", "onUpdated", "prop", "query", "RUI_TOAST_SHOW_EVENT", "RUI_TOAST_DISMISS_EVENT", "TOAST_LIFETIME", "TOAST_WIDTH", "TOAST_GAP", "TOAST_VIEWPORT_OFFSET", "TOAST_VISIBLE_AMOUNT", "TOAST_SWIPE_THRESHOLD", "TOAST_EXIT_MS", "DEFAULT_TOAST_POSITION", "splitToastPosition", "position", "y", "x", "toastCounter", "nextId", "resolveMessage", "message", "value", "ToastState", "subscriber", "index", "snapshot", "title", "options", "id", "dismissible", "existingIndex", "toast", "next", "target", "promise", "messages", "data", "description", "error", "toastState", "RuiToast", "customElement", "RadiantElement", "prop", "DEFAULT_TOAST_POSITION", "query", "isReconnect", "id", "toastState", "onUpdated", "paused", "raw", "asNumber", "bound", "event", "y", "x", "splitToastPosition", "deltaX", "deltaY", "swipeAmountX", "swipeAmountY", "towardExit", "wasSwiping", "swipeAmount", "swipeTime", "velocity", "onEvent", "toast", "variant", "icon", "showIcon", "RadiantElement", "bound", "customElement", "onEvent", "onUpdated", "prop", "state", "isInsideToaster", "node", "root", "RuiToaster", "customElement", "RadiantElement", "prop", "DEFAULT_TOAST_POSITION", "state", "toastState", "toasts", "onUpdated", "onEvent", "RUI_TOAST_SHOW_EVENT", "event", "detail", "RUI_TOAST_DISMISS_EVENT", "forPosition", "toast", "active", "exiting", "y", "x", "splitToastPosition", "observer", "list", "paused", "el", "hovered", "prevHeight", "prevOverflow", "inner", "height", "els", "seen", "id", "target", "expanded", "lift", "heights", "measured", "frontHeight", "accumulated", "index", "isFront", "scale", "stackHeight", "bound", "filtered", "duration", "RuiToast", "defineRadiantView", "slot", "toastId", "title", "description", "variant", "duration", "dismissible", "closeButton", "actionLabel", "position", "markedDelete", "RuiToaster", "visibleToasts", "expand", "gap", "offset", "children", "toast", "title", "options", "toastState", "promise", "messages", "id", "showToast", "detail", "RUI_TOAST_SHOW_EVENT", "dismissToast", "RUI_TOAST_DISMISS_EVENT", "RadiantElement", "customElement", "onEvent", "prop", "RuiToolbar", "customElement", "RadiantElement", "prop", "label", "el", "applyRovingTabindex", "onEvent", "event", "items", "navigateRovingTabindex", "button", "wasPressed", "toggle", "RuiToolbar", "defineRadiantView", "slot", "label", "exclusiveToggles", "children", "RadiantElement", "bound", "customElement", "onEvent", "onUpdated", "prop", "query", "autoUpdate", "computePosition", "flip", "offset", "shift", "RuiTooltip", "anchor", "x", "y", "next", "event", "RuiTooltip", "defineRadiantView", "slot", "content", "placement", "delay", "children", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiTree", "customElement", "RadiantElement", "prop", "event", "label", "item", "node", "group", "parent", "container", "items", "visible", "activeIndex", "i", "id", "selected", "vis", "applyRovingTabindex", "onUpdated", "value", "expanded", "onEvent", "current", "navigateRovingTabindex", "index", "focusRovingItem", "nextItems", "parentIndex", "sibling", "TreeNodes", "nodes", "node", "RuiTree", "defineRadiantView", "slot", "label", "value", "RadiantElement", "customElement", "event", "onEvent", "onUpdated", "prop", "RuiTreegrid", "customElement", "RadiantElement", "prop", "event", "label", "row", "parent", "group", "cells", "activeIndex", "rowId", "selected", "cell", "index", "applyRovingTabindex", "onUpdated", "expanded", "columnIndex", "rowCells", "target", "nextIndex", "focusRovingItem", "onEvent", "visibleRows", "rowIndex", "colIndex", "isFirstCell", "isExpandable", "isExpanded", "nextRow", "prevRow", "sibling", "TreegridRows", "rows", "row", "cell", "index", "RuiTreegrid", "defineRadiantView", "slot", "label", "value", "columns", "column", "RadiantElement", "bound", "customElement", "event", "onEvent", "onUpdated", "prop", "query", "RuiWindowSplitter", "orientation", "size", "delta", "horizontal", "next", "rect", "RuiWindowSplitter", "defineRadiantView", "slot", "value", "orientation", "label", "primary", "secondary"]
|
|
7
|
+
}
|