@webx-ui/core 0.6.0 → 0.8.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/dist/components/Alert/Alert.d.ts +41 -0
- package/dist/components/Alert/index.d.ts +2 -0
- package/dist/components/Alert/types.d.ts +29 -0
- package/dist/components/Aside/Aside.d.ts +25 -0
- package/dist/components/Aside/index.d.ts +2 -0
- package/dist/components/Aside/types.d.ts +14 -0
- package/dist/components/Badge/Badge.d.ts +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +23 -0
- package/dist/components/Breadcrumb/index.d.ts +2 -0
- package/dist/components/Breadcrumb/types.d.ts +13 -0
- package/dist/components/BreadcrumbItem/BreadcrumbItem.d.ts +28 -0
- package/dist/components/BreadcrumbItem/index.d.ts +2 -0
- package/dist/components/BreadcrumbItem/types.d.ts +19 -0
- package/dist/components/Cascader/Cascader.d.ts +1 -1
- package/dist/components/Col/Col.d.ts +27 -0
- package/dist/components/Col/index.d.ts +2 -0
- package/dist/components/Col/types.d.ts +24 -0
- package/dist/components/Container/Container.d.ts +23 -0
- package/dist/components/Container/index.d.ts +2 -0
- package/dist/components/Container/types.d.ts +23 -0
- package/dist/components/Dialog/Dialog.d.ts +1 -1
- package/dist/components/Divider/Divider.d.ts +24 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Divider/types.d.ts +16 -0
- package/dist/components/Footer/Footer.d.ts +23 -0
- package/dist/components/Footer/index.d.ts +2 -0
- package/dist/components/Footer/types.d.ts +8 -0
- package/dist/components/Header/Header.d.ts +24 -0
- package/dist/components/Header/index.d.ts +2 -0
- package/dist/components/Header/types.d.ts +10 -0
- package/dist/components/Icon/icons.d.ts +1 -0
- package/dist/components/ListDetail/ListDetail.d.ts +73 -0
- package/dist/components/ListDetail/index.d.ts +2 -0
- package/dist/components/ListDetail/types.d.ts +19 -0
- package/dist/components/Main/Main.d.ts +22 -0
- package/dist/components/Main/index.d.ts +2 -0
- package/dist/components/Main/types.d.ts +8 -0
- package/dist/components/Menu/Menu.d.ts +45 -0
- package/dist/components/Menu/index.d.ts +2 -0
- package/dist/components/Menu/nodes.d.ts +30 -0
- package/dist/components/Menu/types.d.ts +36 -0
- package/dist/components/MenuGroup/MenuGroup.d.ts +21 -0
- package/dist/components/MenuGroup/index.d.ts +2 -0
- package/dist/components/MenuGroup/types.d.ts +4 -0
- package/dist/components/MenuItem/MenuItem.d.ts +32 -0
- package/dist/components/MenuItem/index.d.ts +2 -0
- package/dist/components/MenuItem/types.d.ts +23 -0
- package/dist/components/Row/Row.d.ts +25 -0
- package/dist/components/Row/index.d.ts +2 -0
- package/dist/components/Row/types.d.ts +17 -0
- package/dist/components/Scrollbar/Scrollbar.d.ts +39 -0
- package/dist/components/Scrollbar/index.d.ts +2 -0
- package/dist/components/Scrollbar/types.d.ts +30 -0
- package/dist/components/Space/Space.d.ts +27 -0
- package/dist/components/Space/index.d.ts +2 -0
- package/dist/components/Space/types.d.ts +23 -0
- package/dist/components/Submenu/Submenu.d.ts +31 -0
- package/dist/components/Submenu/index.d.ts +2 -0
- package/dist/components/Submenu/types.d.ts +15 -0
- package/dist/components/index.d.ts +18 -0
- package/dist/composables/useBreadcrumb.d.ts +13 -0
- package/dist/composables/useControlAttrs.d.ts +35 -0
- package/dist/composables/useElementWidth.d.ts +17 -0
- package/dist/composables/useMenu.d.ts +49 -0
- package/dist/composables/useResponsiveShell.d.ts +59 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4595 -3439
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/composables/useAccordion.ts","../src/components/Accordion/Accordion.vue","../src/components/Icon/icons.ts","../src/components/Icon/Icon.vue","../src/components/AccordionItem/AccordionItem.vue","../src/composables/useActions.ts","../src/components/Action/Action.vue","../src/composables/useDropdown.ts","../src/components/Dropdown/Dropdown.vue","../src/components/Actions/Actions.vue","../src/composables/useFormField.ts","../src/components/Autocomplete/Autocomplete.vue","../src/components/Badge/Badge.vue","../src/composables/useButtonGroup.ts","../src/components/Button/Button.vue","../src/components/ButtonGroup/ButtonGroup.vue","../src/components/Card/Card.vue","../src/components/Cascader/Cascader.vue","../src/components/Checkbox/Checkbox.vue","../src/components/CheckboxGroup/CheckboxGroup.vue","../src/components/ColorPicker/ColorPicker.vue","../src/components/Statistic/Statistic.vue","../src/components/Countdown/format.ts","../src/components/Countdown/Countdown.vue","../src/components/DatePicker/DatePicker.vue","../src/components/DateRangePicker/DateRangePicker.vue","../src/components/DateTimePicker/DateTimePicker.vue","../src/composables/useOverlayPanel.ts","../src/components/Dialog/Dialog.vue","../src/components/Drawer/Drawer.vue","../src/components/DropdownItem/DropdownItem.vue","../src/components/EntityCard/EntityCard.vue","../src/components/Form/Form.vue","../src/components/FormItem/FormItem.vue","../src/components/Heading/Heading.vue","../src/components/Indicator/Indicator.vue","../src/components/Input/Input.vue","../src/components/InputNumber/InputNumber.vue","../../../node_modules/.pnpm/vue-draggable-plus@0.6.1_@types+sortablejs@1.15.9/node_modules/vue-draggable-plus/dist/vue-draggable-plus.js","../src/components/Kanban/Kanban.vue","../src/components/Link/Link.vue","../src/components/Pagination/Pagination.vue","../src/components/Popover/Popover.vue","../src/components/Prose/Prose.vue","../src/components/Radio/Radio.vue","../src/components/RadioGroup/RadioGroup.vue","../src/components/Rate/Rate.vue","../src/components/RichText/icons.ts","../src/components/RichText/ToolbarButton.vue","../src/components/RichText/tools.ts","../src/components/RichText/RichText.vue","../src/components/Select/Select.vue","../src/components/Slider/Slider.vue","../src/components/Switch/Switch.vue","../src/components/Tab/Tab.vue","../src/components/Table/Table.vue","../src/components/Tabs/Tabs.vue","../src/components/TagsInput/TagsInput.vue","../src/components/Text/Text.vue","../src/components/Textarea/Textarea.vue","../src/composables/useTimeline.ts","../src/components/Timeline/Timeline.vue","../src/components/TimelineItem/TimelineItem.vue","../src/components/TimePicker/TimePicker.vue","../src/plugin.ts"],"sourcesContent":["import { inject, type ComputedRef, type InjectionKey } from 'vue'\n\nexport type AccordionSize = 'sm' | 'md'\n\n/** Boxed as one list, each panel its own card, or nothing but rules between them. */\nexport type AccordionVariant = 'bordered' | 'separated' | 'plain'\n\n/** Which side of the header the chevron sits on. */\nexport type AccordionIconPosition = 'start' | 'end'\n\n/** What `WxAccordion` hands down to the items inside it. */\nexport interface AccordionContext {\n size: ComputedRef<AccordionSize>\n variant: ComputedRef<AccordionVariant>\n iconPosition: ComputedRef<AccordionIconPosition>\n /** The element each header is written as, so a page keeps one heading outline. */\n headingTag: ComputedRef<string>\n}\n\nexport const accordionKey: InjectionKey<AccordionContext> = Symbol('wx-accordion')\n\nexport function useAccordion(): AccordionContext | null {\n return inject(accordionKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionKey } from '../../composables/useAccordion'\nimport type { AccordionEmits, AccordionModelValue, AccordionProps } from './types'\n\ndefineOptions({ name: 'WxAccordion' })\n\nconst props = withDefaults(defineProps<AccordionProps>(), {\n multiple: false,\n collapsible: true,\n variant: 'bordered',\n size: 'md',\n iconPosition: 'end',\n headingTag: 'h3',\n disabled: false,\n})\n\nconst emit = defineEmits<AccordionEmits>()\n\ndefineSlots<{\n /** The `WxAccordionItem`s. */\n default?: () => unknown\n}>()\n\n/**\n * One value or a list of them, depending on `multiple` — the same shape Reka uses, and\n * the same shape a backend would store it in.\n */\nconst model = defineModel<AccordionModelValue>({ default: undefined })\n\nprovide(accordionKey, {\n size: computed(() => props.size),\n variant: computed(() => props.variant),\n iconPosition: computed(() => props.iconPosition),\n headingTag: computed(() => props.headingTag),\n})\n\nwatch(model, (value) => emit('change', value))\n\nconst classes = computed(() => [\n 'wx-accordion',\n `wx-accordion--${props.variant}`,\n `wx-accordion--${props.size}`,\n])\n</script>\n\n<template>\n <accordion-root\n v-model=\"model\"\n :class=\"classes\"\n :type=\"multiple ? 'multiple' : 'single'\"\n :collapsible=\"collapsible\"\n :disabled=\"disabled\"\n >\n <slot />\n </accordion-root>\n</template>\n\n<style scoped>\n.wx-accordion {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-accordion--bordered {\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n /* The items square off their own corners; the box rounds what sticks out. */\n overflow: hidden;\n}\n\n/* Each item is its own card, with air between them. */\n.wx-accordion--separated {\n gap: var(--wx-space-8);\n}\n</style>\n","/**\n * The built-in icon set.\n *\n * Every entry is the *inside* of a 24×24 `<svg>` drawn in `currentColor` with a\n * stroke — the wrapper in `Icon.vue` supplies the viewBox, the stroke width and the\n * colour, so an icon inherits the text it sits next to. Shapes that read better\n * filled (dots, pips) set `fill=\"currentColor\" stroke=\"none\"` themselves.\n */\nexport const builtinIcons = {\n // --- actions -------------------------------------------------------------\n check: '<path d=\"m5 13 4.5 4.5L19 7\"/>',\n 'check-circle': '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8.2 12.2 2.6 2.6 5-5.2\"/>',\n close: '<path d=\"M18 6 6 18M6 6l12 12\"/>',\n 'close-circle': '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m9 9 6 6m0-6-6 6\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n edit: '<path d=\"M4 20h4L19.5 8.5a2.83 2.83 0 0 0-4-4L4 16v4Z\"/><path d=\"m14.5 5.5 4 4\"/>',\n trash:\n '<path d=\"M4 7h16M10 7V5.5A1.5 1.5 0 0 1 11.5 4h1A1.5 1.5 0 0 1 14 5.5V7M6.5 7l.8 11.6a2 2 0 0 0 2 1.9h5.4a2 2 0 0 0 2-1.9L17.5 7\"/><path d=\"M10 11v5.5M14 11v5.5\"/>',\n copy: '<rect x=\"8.5\" y=\"8.5\" width=\"11\" height=\"11\" rx=\"2.2\"/><path d=\"M15.5 8.5v-2a2 2 0 0 0-2-2h-7a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h2\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"m16 16 4.5 4.5\"/>',\n filter: '<path d=\"M4 5.5h16l-6.2 7.2v5.1l-3.6 2v-7.1z\"/>',\n refresh:\n '<path d=\"M4 12a8 8 0 0 1 13.7-5.6L20 8.5\"/><path d=\"M20 4.5v4h-4\"/><path d=\"M20 12a8 8 0 0 1-13.7 5.6L4 15.5\"/><path d=\"M4 19.5v-4h4\"/>',\n upload:\n '<path d=\"M12 16V4m0 0-4.5 4.5M12 4l4.5 4.5\"/><path d=\"M4 15v3.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V15\"/>',\n download:\n '<path d=\"M12 4v12m0 0-4.5-4.5M12 16l4.5-4.5\"/><path d=\"M4 15v3.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V15\"/>',\n logout:\n '<path d=\"M14 6V5a1.5 1.5 0 0 0-1.5-1.5h-6A1.5 1.5 0 0 0 5 5v14a1.5 1.5 0 0 0 1.5 1.5h6A1.5 1.5 0 0 0 14 19v-1\"/><path d=\"M10 12h10m0 0-3-3m3 3-3 3\"/>',\n\n // --- direction -----------------------------------------------------------\n 'chevron-down': '<path d=\"m6 9.5 6 6 6-6\"/>',\n 'chevron-up': '<path d=\"m6 14.5 6-6 6 6\"/>',\n 'chevron-left': '<path d=\"m14.5 6-6 6 6 6\"/>',\n 'chevron-right': '<path d=\"m9.5 6 6 6-6 6\"/>',\n 'arrow-up': '<path d=\"M12 20V4m0 0 6 6m-6-6-6 6\"/>',\n 'arrow-down': '<path d=\"M12 4v16m0 0 6-6m-6 6-6-6\"/>',\n 'arrow-left': '<path d=\"M20 12H4m0 0 6-6m-6 6 6 6\"/>',\n 'arrow-right': '<path d=\"M4 12h16m0 0-6-6m6 6-6 6\"/>',\n menu: '<path d=\"M4 7h16M4 12h16M4 17h16\"/>',\n 'more-horizontal':\n '<circle cx=\"5.5\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18.5\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n 'more-vertical':\n '<circle cx=\"12\" cy=\"5.5\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"18.5\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n drag: '<circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>',\n\n // --- objects -------------------------------------------------------------\n user: '<circle cx=\"12\" cy=\"8\" r=\"3.75\"/><path d=\"M4.5 20a7.5 7.5 0 0 1 15 0\"/>',\n users:\n '<circle cx=\"9.5\" cy=\"8.5\" r=\"3.4\"/><path d=\"M2.5 20a7 7 0 0 1 14 0\"/><path d=\"M16 5.5a3.4 3.4 0 0 1 0 6.6M17.5 14.2A6.3 6.3 0 0 1 21.5 20\"/>',\n settings:\n '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 4v2.5M12 17.5V20M4 12h2.5M17.5 12H20M6.34 6.34l1.77 1.77M15.89 15.89l1.77 1.77M17.66 6.34l-1.77 1.77M6.34 17.66l1.77-1.77\"/>',\n sliders:\n '<path d=\"M4 7h9M17 7h3M4 17h3M11 17h9\"/><circle cx=\"15\" cy=\"7\" r=\"2\"/><circle cx=\"9\" cy=\"17\" r=\"2\"/>',\n home: '<path d=\"M4 10.5 12 4l8 6.5V19a1.5 1.5 0 0 1-1.5 1.5H15V14H9v6.5H5.5A1.5 1.5 0 0 1 4 19Z\"/>',\n file: '<path d=\"M13.5 3.5H7a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9zm0 0V9H19\"/>',\n folder:\n '<path d=\"M3.5 7a2 2 0 0 1 2-2h3.2a2 2 0 0 1 1.5.7l1.3 1.5h7a2 2 0 0 1 2 2v8.3a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z\"/>',\n image:\n '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2.5\"/><circle cx=\"8.75\" cy=\"9.75\" r=\"1.75\"/><path d=\"m4 17 4.5-4.2a2 2 0 0 1 2.7 0l3 2.8 1.6-1.5a2 2 0 0 1 2.7 0L20 16\"/>',\n calendar:\n '<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2.5\"/><path d=\"M3.5 10h17M8 3.5V7M16 3.5V7\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/>',\n mail: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2.5\"/><path d=\"m4 7.5 6.9 5a2 2 0 0 0 2.2 0l6.9-5\"/>',\n phone:\n '<path d=\"M7 3.5 9.5 4l1.2 3.4-1.9 1.6a11 11 0 0 0 5.2 5.2l1.6-1.9 3.4 1.2.5 2.5a2 2 0 0 1-2 2.3A15.5 15.5 0 0 1 4.7 5.5a2 2 0 0 1 2.3-2Z\"/>',\n bell: '<path d=\"M7 10a5 5 0 0 1 10 0c0 4 1.5 5.5 1.5 5.5h-13S7 14 7 10Z\"/><path d=\"M10.2 18.5a2 2 0 0 0 3.6 0\"/>',\n cart: '<path d=\"M3 4.5h2.2l2.3 10.2a1.6 1.6 0 0 0 1.6 1.3h7.4a1.6 1.6 0 0 0 1.6-1.2L20 8H6\"/><circle cx=\"10\" cy=\"19.5\" r=\"1.5\"/><circle cx=\"17\" cy=\"19.5\" r=\"1.5\"/>',\n tag: '<path d=\"M4 11.2V5.5A1.5 1.5 0 0 1 5.5 4h5.7a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8l-5.2 5.2a2 2 0 0 1-2.8 0l-7-7a2 2 0 0 1-.6-1.4Z\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/>',\n link: '<path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7L11.5 7\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-3 3A4 4 0 0 0 11 18.7L12.5 17\"/>',\n 'external-link':\n '<path d=\"M13.5 4.5H20V11\"/><path d=\"m11 13 9-8.5\"/><path d=\"M19 14.5v4a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 5 18.5v-11A1.5 1.5 0 0 1 6.5 6h4\"/>',\n lock: '<rect x=\"4.5\" y=\"10\" width=\"15\" height=\"10\" rx=\"2.5\"/><path d=\"M8 10V7.8a4 4 0 0 1 8 0V10\"/>',\n unlock:\n '<rect x=\"4.5\" y=\"10\" width=\"15\" height=\"10\" rx=\"2.5\"/><path d=\"M8 10V7.8a4 4 0 0 1 7.6-1.8\"/>',\n grid: '<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.8\"/>',\n list: '<path d=\"M9 6h11M9 12h11M9 18h11\"/><circle cx=\"5\" cy=\"6\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"12\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"18\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/>',\n eye: '<path d=\"M2.5 12S6.8 5.5 12 5.5 21.5 12 21.5 12 17.2 18.5 12 18.5 2.5 12 2.5 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.75\"/>',\n 'eye-off':\n '<path d=\"M10.2 6a9.9 9.9 0 0 1 1.8-.2c5.2 0 9.5 6.2 9.5 6.2a18 18 0 0 1-3.3 3.8M6.6 7.9A17.8 17.8 0 0 0 2.5 12s4.3 6.5 9.5 6.5a9.4 9.4 0 0 0 3.3-.6\"/><path d=\"m4 4 16 16\"/>',\n star: '<path d=\"m12 4 2.5 5.1 5.6.8-4 4 .9 5.6-5-2.7-5 2.7.9-5.6-4-4 5.6-.8z\"/>',\n heart:\n '<path d=\"M12 19.5S4 15 4 9.8A4.3 4.3 0 0 1 12 7.4 4.3 4.3 0 0 1 20 9.8c0 5.2-8 9.7-8 9.7Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M18.4 5.6 17 7M7 17l-1.4 1.4\"/>',\n moon: '<path d=\"M20 14.5A8.5 8.5 0 0 1 9.5 4a8.5 8.5 0 1 0 10.5 10.5Z\"/>',\n\n // --- status --------------------------------------------------------------\n info: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5\"/><circle cx=\"12\" cy=\"7.75\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n warning:\n '<path d=\"M10.3 4.9a2 2 0 0 1 3.4 0l7 12.1a2 2 0 0 1-1.7 3H5a2 2 0 0 1-1.7-3z\"/><path d=\"M12 9.5v4\"/><circle cx=\"12\" cy=\"16.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n question:\n '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M9.6 9.4a2.5 2.5 0 0 1 4.9.6c0 1.7-2.5 2-2.5 3.5\"/><circle cx=\"12\" cy=\"16.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n loader:\n '<path d=\"M12 3.5v4M12 16.5v4M3.5 12h4M16.5 12h4M6 6l2.8 2.8M15.2 15.2 18 18M18 6l-2.8 2.8M8.8 15.2 6 18\"/>',\n} as const satisfies Record<string, string>\n\n/** Every name the library ships with. */\nexport type BuiltinIconName = keyof typeof builtinIcons\n\nconst customIcons = new Map<string, string>()\n\n/**\n * Adds icons to the set, so `<wx-icon name=\"my-logo\" />` works anywhere in the app.\n *\n * ```ts\n * registerIcons({ 'my-logo': '<path d=\"M4 4h16v16H4z\" />' })\n * ```\n *\n * The markup is injected as-is, so register only icons you author or control —\n * never a string that arrived from a user or an API.\n */\nexport function registerIcons(icons: Record<string, string>): void {\n for (const [name, content] of Object.entries(icons)) customIcons.set(name, content)\n}\n\n/** The markup of an icon, or `undefined` when nothing is registered under that name. */\nexport function resolveIcon(name: string): string | undefined {\n return customIcons.get(name) ?? (builtinIcons as Record<string, string>)[name]\n}\n\n/** Names currently available, built-in plus registered — handy for a docs gallery. */\nexport function iconNames(): string[] {\n return [...new Set([...Object.keys(builtinIcons), ...customIcons.keys()])].sort()\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { resolveIcon } from './icons'\nimport type { IconProps } from './types'\n\ndefineOptions({ name: 'WxIcon' })\n\nconst props = withDefaults(defineProps<IconProps>(), {\n size: undefined,\n strokeWidth: 1.7,\n spin: false,\n label: undefined,\n})\n\nconst keywordSizes: Record<string, string> = {\n sm: 'var(--wx-font-size-sm)',\n md: 'var(--wx-font-size-lg)',\n lg: 'var(--wx-font-size-2xl)',\n}\n\n/**\n * The markup is authored in `icons.ts` or handed to `registerIcons` by the app —\n * both are developer-controlled, which is what makes `v-html` safe here.\n */\nconst content = computed(() => resolveIcon(props.name))\n\n/*\n * The rule cannot tell an icon registry from a request body, so it is switched off\n * for this file rather than left as a warning somebody would eventually \"fix\" by\n * deleting the directive. It is switched off here, in the script, because a comment\n * above the template's root element would make that template a fragment.\n */\n/* eslint-disable vue/no-v-html */\n\nconst boxSize = computed(() => {\n const { size } = props\n if (size === undefined) return '1em'\n if (typeof size === 'number') return `${size}px`\n return keywordSizes[size] ?? size\n})\n\nconst classes = computed(() => ['wx-icon', { 'wx-icon--spin': props.spin }])\n</script>\n\n<template>\n <svg\n v-if=\"content\"\n :class=\"classes\"\n :style=\"{ '--wx-icon-size': boxSize }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"content\"\n />\n</template>\n\n<style scoped>\n.wx-icon {\n display: inline-block;\n flex: 0 0 auto;\n width: var(--wx-icon-size, 1em);\n height: var(--wx-icon-size, 1em);\n /* Sits on the text baseline rather than hanging below it. */\n vertical-align: -0.125em;\n overflow: visible;\n}\n\n/*\n * A turn a second. The duration tokens size transitions, not loops: even the slow one\n * is 320ms, which spins an icon three times a second and reads as a blur.\n */\n.wx-icon--spin {\n animation: wx-icon-spin var(--wx-icon-spin-duration, 1s) linear infinite;\n}\n\n@keyframes wx-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-icon--spin {\n animation-duration: 2s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger } from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useAccordion } from '../../composables/useAccordion'\nimport type { AccordionItemProps } from './types'\n\ndefineOptions({ name: 'WxAccordionItem' })\n\nconst props = withDefaults(defineProps<AccordionItemProps>(), {\n title: undefined,\n subtitle: undefined,\n icon: undefined,\n disabled: false,\n})\n\ndefineSlots<{\n /** The panel. */\n default?: () => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /**\n * Sits at the end of the header, outside the button — so a switch or a menu there\n * can be operated without opening the item.\n */\n extra?: () => unknown\n}>()\n\nconst accordion = useAccordion()\n\nconst size = computed(() => accordion?.size.value ?? 'md')\nconst iconPosition = computed(() => accordion?.iconPosition.value ?? 'end')\nconst headingTag = computed(() => accordion?.headingTag.value ?? 'h3')\n\nconst classes = computed(() => [\n 'wx-accordion-item',\n `wx-accordion-item--${accordion?.variant.value ?? 'bordered'}`,\n `wx-accordion-item--${size.value}`,\n `wx-accordion-item--chevron-${iconPosition.value}`,\n // Everything standing before the title moves the panel text under it as well.\n { 'wx-accordion-item--icon': Boolean(props.icon) },\n])\n</script>\n\n<template>\n <accordion-item :class=\"classes\" :value=\"value\" :disabled=\"disabled\">\n <!--\n The heading holds the button and nothing else, which is what a screen reader\n reads out when it walks the headings of a page. Whatever the `extra` slot carries\n — a switch, a menu — sits beside the heading rather than inside it.\n -->\n <div class=\"wx-accordion-item__row\">\n <accordion-header class=\"wx-accordion-item__header\" :as=\"headingTag\">\n <accordion-trigger class=\"wx-accordion-item__trigger\">\n <wx-icon class=\"wx-accordion-item__chevron\" name=\"chevron-down\" />\n\n <wx-icon v-if=\"icon\" class=\"wx-accordion-item__icon\" :name=\"icon\" />\n\n <span class=\"wx-accordion-item__titles\">\n <span class=\"wx-accordion-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <span v-if=\"subtitle\" class=\"wx-accordion-item__subtitle\">{{ subtitle }}</span>\n </span>\n </accordion-trigger>\n </accordion-header>\n\n <span v-if=\"$slots.extra\" class=\"wx-accordion-item__extra\">\n <slot name=\"extra\" />\n </span>\n </div>\n\n <accordion-content class=\"wx-accordion-item__content\">\n <div class=\"wx-accordion-item__body\">\n <slot />\n </div>\n </accordion-content>\n </accordion-item>\n</template>\n\n<style scoped>\n.wx-accordion-item {\n --wx-accordion-padding-x: var(--wx-space-16);\n --wx-accordion-padding-y: var(--wx-space-14);\n /* Air between the header and what it opened — see the body's padding. */\n --wx-accordion-gap: var(--wx-space-8);\n /* One mark — the chevron, or the icon — plus the gap after it. */\n --wx-accordion-mark: calc(var(--wx-font-size-lg) + var(--wx-space-10));\n --wx-accordion-chevron-indent: 0px;\n --wx-accordion-icon-indent: 0px;\n\n min-width: 0;\n}\n\n/* The panel text lines up with the title, not with whatever stands to its left. */\n.wx-accordion-item--chevron-start {\n --wx-accordion-chevron-indent: var(--wx-accordion-mark);\n}\n\n.wx-accordion-item--icon {\n --wx-accordion-icon-indent: var(--wx-accordion-mark);\n}\n\n.wx-accordion-item--sm {\n --wx-accordion-padding-x: var(--wx-space-12);\n --wx-accordion-padding-y: var(--wx-space-8);\n --wx-accordion-gap: var(--wx-space-4);\n}\n\n/* Inside one box the items are told apart by a rule, not by a border each. */\n.wx-accordion-item--bordered + .wx-accordion-item--bordered,\n.wx-accordion-item--plain + .wx-accordion-item--plain {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-accordion-item--separated {\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n overflow: hidden;\n}\n\n.wx-accordion-item__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n transition: background var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__header {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n font-size: inherit;\n font-weight: inherit;\n}\n\n.wx-accordion-item__trigger {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n gap: var(--wx-space-10);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding: var(--wx-accordion-padding-y) var(--wx-accordion-padding-x);\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n/*\n * The tint belongs to the row, not to the button: the `extra` slot sits beside the\n * button, and a highlight that stopped at its edge left a seam down the header. It is\n * still the button that is being hovered — pointing at a switch in the `extra` must not\n * suggest that the section is about to open.\n */\n.wx-accordion-item__row:has(.wx-accordion-item__trigger:hover:not(:disabled)) {\n background: var(--wx-bg-subtle);\n}\n\n.wx-accordion-item__trigger:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-accordion-item__trigger:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/* The chevron is written first and moved by order, so the button's text order holds. */\n.wx-accordion-item--chevron-end .wx-accordion-item__chevron {\n order: 2;\n margin-left: auto;\n}\n\n.wx-accordion-item__chevron {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n transition: transform var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__trigger[data-state='open'] .wx-accordion-item__chevron {\n transform: rotate(180deg);\n}\n\n.wx-accordion-item__icon {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-accordion-item__titles {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wx-accordion-item__title {\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-accordion-item--sm .wx-accordion-item__title {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-accordion-item__subtitle {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n font-weight: var(--wx-font-weight-regular);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-accordion-item__extra {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n padding-right: var(--wx-accordion-padding-x);\n}\n\n/*\n * Reka measures the panel and publishes the height as a custom property, which is what\n * makes an animation from nothing to \"however tall this turns out to be\" possible.\n * The padding lives on the body inside, so the height being animated is only content.\n */\n.wx-accordion-item__content {\n overflow: hidden;\n}\n\n.wx-accordion-item__content[data-state='open'] {\n animation: wx-accordion-open var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__content[data-state='closed'] {\n animation: wx-accordion-close var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n/*\n * The header's own padding ends at the edge of the row it highlights, so without this\n * the panel starts flush against that edge and the two read as one block. The gap is\n * the panel's, and it is measured into the height that is animated.\n */\n.wx-accordion-item__body {\n padding-top: var(--wx-accordion-gap);\n padding-right: var(--wx-accordion-padding-x);\n padding-bottom: var(--wx-accordion-padding-y);\n padding-left: calc(\n var(--wx-accordion-padding-x) + var(--wx-accordion-chevron-indent) +\n var(--wx-accordion-icon-indent)\n );\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n@keyframes wx-accordion-open {\n from {\n height: 0;\n }\n\n to {\n height: var(--reka-accordion-content-height);\n }\n}\n\n@keyframes wx-accordion-close {\n from {\n height: var(--reka-accordion-content-height);\n }\n\n to {\n height: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-accordion-item__content[data-state='open'],\n .wx-accordion-item__content[data-state='closed'] {\n animation: none;\n }\n\n .wx-accordion-item__chevron,\n .wx-accordion-item__row {\n transition: none;\n }\n}\n\n/* A header is a tap target; on a touch screen it needs the height of one. */\n@media (pointer: coarse) {\n .wx-accordion-item__trigger {\n min-height: 48px;\n }\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\nimport type { ActionSize } from '../components/Action/types'\n\n/** What a `WxActions` row hands down to the actions inside it. */\nexport interface ActionsContext {\n size: ComputedRef<ActionSize | undefined>\n}\n\nexport const actionsKey: InjectionKey<ActionsContext> = Symbol('wx-actions')\n\nexport function useActions(): ActionsContext | null {\n return inject(actionsKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useActions } from '../../composables/useActions'\nimport type { ActionEmits, ActionProps, ActionTone, ActionType } from './types'\nimport type { IconName } from '../Icon/types'\n\ndefineOptions({ name: 'WxAction', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ActionProps>(), {\n type: 'edit',\n icon: undefined,\n tone: undefined,\n title: undefined,\n label: undefined,\n href: undefined,\n target: undefined,\n as: undefined,\n disabled: false,\n hidden: false,\n size: undefined,\n})\n\nconst emit = defineEmits<ActionEmits>()\n\n/** Icon, colour and English fallback name for each kind of action. */\nconst presets: Record<ActionType, { icon: IconName; tone: ActionTone; label: string }> = {\n add: { icon: 'plus', tone: 'primary', label: 'Add' },\n edit: { icon: 'edit', tone: 'primary', label: 'Edit' },\n remove: { icon: 'trash', tone: 'danger', label: 'Delete' },\n copy: { icon: 'copy', tone: 'primary', label: 'Copy' },\n link: { icon: 'link', tone: 'primary', label: 'Link' },\n goto: { icon: 'external-link', tone: 'primary', label: 'Open' },\n details: { icon: 'info', tone: 'primary', label: 'Details' },\n view: { icon: 'eye', tone: 'primary', label: 'View' },\n hide: { icon: 'eye-off', tone: 'neutral', label: 'Hide' },\n upload: { icon: 'upload', tone: 'primary', label: 'Upload' },\n download: { icon: 'download', tone: 'primary', label: 'Download' },\n sort: { icon: 'drag', tone: 'neutral', label: 'Reorder' },\n search: { icon: 'search', tone: 'primary', label: 'Search' },\n restore: { icon: 'refresh', tone: 'success', label: 'Restore' },\n settings: { icon: 'settings', tone: 'neutral', label: 'Settings' },\n send: { icon: 'mail', tone: 'primary', label: 'Send' },\n more: { icon: 'more-horizontal', tone: 'neutral', label: 'More' },\n}\n\nconst group = useActions()\n\nconst preset = computed(() => presets[props.type] ?? presets.edit)\nconst icon = computed(() => props.icon ?? preset.value.icon)\nconst tone = computed(() => props.tone ?? preset.value.tone)\nconst size = computed(() => props.size ?? group?.size.value ?? 'md')\nconst accessibleName = computed(() => props.label ?? props.title ?? preset.value.label)\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n\nconst nativeAttrs = computed(() => {\n if (props.href) {\n return {\n href: props.disabled ? undefined : props.href,\n target: props.target,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n tabindex: props.disabled ? -1 : undefined,\n }\n }\n if (props.as) return { 'aria-disabled': props.disabled ? 'true' : undefined }\n return { type: 'button' as const, disabled: props.disabled }\n})\n\nconst classes = computed(() => [\n 'wx-action',\n `wx-action--${size.value}`,\n `wx-action--${tone.value}`,\n { 'is-disabled': props.disabled },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <span\n v-if=\"hidden\"\n class=\"wx-action wx-action--placeholder\"\n :class=\"`wx-action--${size}`\"\n aria-hidden=\"true\"\n />\n\n <component\n :is=\"tag\"\n v-else\n v-bind=\"{ ...nativeAttrs, ...$attrs }\"\n :class=\"classes\"\n :title=\"title\"\n :aria-label=\"accessibleName\"\n @click=\"onClick\"\n >\n <slot>\n <wx-icon :name=\"icon\" />\n </slot>\n </component>\n</template>\n\n<style scoped>\n.wx-action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-action-size, 36px);\n height: var(--wx-action-size, 36px);\n padding: 0;\n background: var(--wx-action-bg, var(--wx-bg-fill));\n border: 1px solid transparent;\n border-radius: var(--wx-radius-control);\n color: var(--wx-action-color, var(--wx-color-primary));\n font-size: var(--wx-action-icon, 18px);\n line-height: 1;\n text-decoration: none;\n cursor: pointer;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-action:hover:not(.is-disabled) {\n background: var(--wx-bg-fill-hover);\n}\n\n.wx-action:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-action.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/* An empty square: no background, no pointer, just the space. */\n.wx-action--placeholder {\n background: transparent;\n cursor: default;\n pointer-events: none;\n}\n\n/* sizes */\n.wx-action--sm {\n --wx-action-size: 30px;\n --wx-action-icon: 16px;\n}\n\n.wx-action--md {\n --wx-action-size: 36px;\n --wx-action-icon: 18px;\n}\n\n.wx-action--lg {\n --wx-action-size: 42px;\n --wx-action-icon: 20px;\n}\n\n/* tones */\n.wx-action--primary {\n --wx-action-color: var(--wx-color-primary);\n}\n\n.wx-action--danger {\n --wx-action-color: var(--wx-color-danger);\n}\n\n.wx-action--success {\n --wx-action-color: var(--wx-color-success-active);\n}\n\n.wx-action--warning {\n --wx-action-color: var(--wx-color-warning-active);\n}\n\n.wx-action--neutral {\n --wx-action-color: var(--wx-text-muted);\n}\n</style>\n","import { inject, type InjectionKey } from 'vue'\n\n/** What a `WxDropdown` hands down, so an item inside it can close the panel. */\nexport interface DropdownContext {\n close: () => void\n /** Whether a click on an item closes the panel — the dropdown's `closeOnClick`. */\n closeOnSelect: () => boolean\n}\n\nexport const dropdownKey: InjectionKey<DropdownContext> = Symbol('wx-dropdown')\n\nexport function useDropdown(): DropdownContext | null {\n return inject(dropdownKey, null)\n}\n","<script setup lang=\"ts\">\nimport { provide, watch } from 'vue'\nimport { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\nimport { dropdownKey } from '../../composables/useDropdown'\nimport type { DropdownEmits, DropdownProps } from './types'\n\ndefineOptions({ name: 'WxDropdown', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DropdownProps>(), {\n side: 'bottom',\n align: 'start',\n offset: 6,\n alignOffset: 0,\n closeOnClick: true,\n matchTriggerWidth: false,\n teleport: true,\n modal: false,\n disabled: false,\n})\n\nconst emit = defineEmits<DropdownEmits>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nfunction close() {\n open.value = false\n}\n\nprovide(dropdownKey, { close, closeOnSelect: () => props.closeOnClick })\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\n/**\n * A click anywhere in the panel closes it, the way a menu behaves. Items that run\n * their own logic still close through the same path, and a panel that should stay\n * open while it is worked in turns this off with `:close-on-click=\"false\"`.\n */\nfunction onPanelClick() {\n if (props.closeOnClick) close()\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child` rather than a button of our own: the trigger is nearly always a\n control that is already a button — WxButton, WxAction — and nesting one button\n inside another is invalid HTML. The slot must hold exactly one element.\n -->\n <popover-trigger as-child :disabled=\"disabled\">\n <slot name=\"trigger\" :open=\"open\" />\n </popover-trigger>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content\n v-bind=\"$attrs\"\n class=\"wx-dropdown\"\n :class=\"{ 'wx-dropdown--match-width': matchTriggerWidth }\"\n :side=\"side\"\n :align=\"align\"\n :side-offset=\"offset\"\n :align-offset=\"alignOffset\"\n @click=\"onPanelClick\"\n >\n <slot :close=\"close\" />\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-dropdown {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 160px;\n max-width: min(90vw, 320px);\n padding: var(--wx-space-6);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-dropdown:focus-visible {\n outline: none;\n}\n\n.wx-dropdown--match-width {\n min-width: var(--reka-popover-trigger-width);\n}\n\n/* A rule between groups of items. */\n.wx-dropdown hr,\n.wx-dropdown .wx-dropdown__divider {\n height: 0;\n margin: var(--wx-space-4) 0;\n border: none;\n border-top: 1px solid var(--wx-border-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, provide, ref, watch } from 'vue'\nimport WxAction from '../Action/Action.vue'\nimport WxDropdown from '../Dropdown/Dropdown.vue'\nimport { actionsKey } from '../../composables/useActions'\nimport type { ActionsEmits, ActionsProps } from './types'\n\ndefineOptions({ name: 'WxActions' })\n\nconst props = withDefaults(defineProps<ActionsProps>(), {\n align: 'start',\n size: undefined,\n collapse: false,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<ActionsEmits>()\n\nprovide(actionsKey, { size: computed(() => props.size) })\n\nconst root = ref<HTMLElement | null>(null)\nconst row = ref<HTMLElement | null>(null)\nconst collapsed = ref(false)\n\n/**\n * The row is measured against the space its container gives it. When it collapses\n * the row is not unmounted, only taken out of the flow — it keeps its natural width,\n * which is the only way to know when there is room for it again.\n */\nfunction measure() {\n const rowEl = row.value\n const parent = root.value?.parentElement\n if (!props.collapse || !rowEl || !parent) return\n\n /* `|| 0`: a padding that was never set reads as an empty string, not as `0px`. */\n const style = getComputedStyle(parent)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n const available = parent.clientWidth - padding\n\n /* jsdom and a container that has not been laid out yet both report zero. */\n if (available <= 0) return\n\n collapsed.value = rowEl.scrollWidth > available\n}\n\nlet observer: ResizeObserver | undefined\n\nfunction observe() {\n observer?.disconnect()\n if (!props.collapse) return\n\n observer = new ResizeObserver(() => measure())\n if (root.value?.parentElement) observer.observe(root.value.parentElement)\n if (row.value) observer.observe(row.value)\n measure()\n}\n\nonMounted(observe)\nwatch(() => props.collapse, observe)\nwatch(collapsed, (value) => emit('collapse', value))\nonBeforeUnmount(() => observer?.disconnect())\n\nconst classes = computed(() => [\n 'wx-actions',\n `wx-actions--${props.align}`,\n { 'is-collapsed': collapsed.value },\n])\n\ndefineExpose({ collapsed, measure })\n</script>\n\n<template>\n <div ref=\"root\" :class=\"classes\" role=\"group\" :aria-label=\"ariaLabel\">\n <div ref=\"row\" class=\"wx-actions__row\">\n <slot />\n </div>\n\n <!-- The dropdown teleports its panel, so the class that hides it lives on a wrapper. -->\n <span v-if=\"collapse\" class=\"wx-actions__menu\">\n <wx-dropdown align=\"end\">\n <template #trigger>\n <slot name=\"trigger\">\n <wx-action type=\"more\" :size=\"size\" />\n </slot>\n </template>\n\n <!-- Falls back to the row itself, so a plain list of actions needs no second copy. -->\n <slot name=\"collapsed\">\n <slot />\n </slot>\n </wx-dropdown>\n </span>\n </div>\n</template>\n\n<style scoped>\n.wx-actions {\n display: flex;\n align-items: center;\n /* The row is taken out of the flow when collapsed, so it anchors here. */\n position: relative;\n}\n\n.wx-actions--start {\n justify-content: flex-start;\n}\n\n.wx-actions--center {\n justify-content: center;\n}\n\n.wx-actions--end {\n justify-content: flex-end;\n}\n\n.wx-actions__row {\n display: flex;\n align-items: center;\n gap: var(--wx-actions-gap, var(--wx-space-6));\n}\n\n/* Hidden, but still measurable: that is what lets the row come back. */\n.wx-actions.is-collapsed .wx-actions__row {\n position: absolute;\n z-index: -1;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.wx-actions:not(.is-collapsed) .wx-actions__menu {\n display: none;\n}\n</style>\n","import { computed, inject, provide, type ComputedRef, type InjectionKey, type Ref } from 'vue'\n\nexport type ControlSize = 'sm' | 'md' | 'lg'\nexport type ControlStatus = 'default' | 'success' | 'warning' | 'error'\n\n/** Field name -> messages, the shape Laravel returns on a 422. */\nexport type ValidationErrors = Record<string, string[]>\n\nexport interface FormContext {\n /** Server-side errors, keyed by field name. */\n errors: Ref<ValidationErrors>\n disabled: Ref<boolean>\n size: Ref<ControlSize>\n labelPosition: Ref<'top' | 'left'>\n labelWidth: Ref<string | undefined>\n}\n\nexport interface FormItemContext {\n /** Id given to the control, so the label's `for` matches. */\n id: ComputedRef<string>\n /** Ids of the help and error nodes, for `aria-describedby`. */\n describedBy: ComputedRef<string | undefined>\n status: ComputedRef<ControlStatus>\n disabled: ComputedRef<boolean>\n size: ComputedRef<ControlSize | undefined>\n /** Set by grouped controls so the label points at the group, not one input. */\n registerLabelTarget: (id: string | undefined) => void\n}\n\nexport const formContextKey: InjectionKey<FormContext> = Symbol('wx-form')\nexport const formItemContextKey: InjectionKey<FormItemContext> = Symbol('wx-form-item')\n\nlet uid = 0\nexport function useId(prefix = 'wx'): string {\n uid += 1\n return `${prefix}-${uid}`\n}\n\nexport interface FormFieldProps {\n disabled?: boolean\n size?: ControlSize\n status?: ControlStatus\n id?: string\n}\n\n/**\n * Resolves what a control should render as, given its own props, the enclosing\n * `WxFormItem` and the enclosing `WxForm`. The control's own prop always wins;\n * `WxFormItem` beats `WxForm`.\n */\nexport function useFormField(props: FormFieldProps) {\n const form = inject(formContextKey, null)\n const item = inject(formItemContextKey, null)\n const fallbackId = useId('wx-control')\n\n const id = computed(() => props.id ?? item?.id.value ?? fallbackId)\n\n const disabled = computed(\n () => props.disabled || item?.disabled.value || form?.disabled.value || false,\n )\n\n const size = computed<ControlSize>(\n () => props.size ?? item?.size.value ?? form?.size.value ?? 'md',\n )\n\n const status = computed<ControlStatus>(() => {\n if (props.status && props.status !== 'default') return props.status\n return item?.status.value ?? 'default'\n })\n\n const describedBy = computed(() => item?.describedBy.value)\n\n return { id, disabled, size, status, describedBy, form, item }\n}\n\n/**\n * What a checkbox, radio or switch may carry. Deliberately narrower than `unknown`:\n * a `v-model` that hands back `unknown` is useless to the caller, and object values\n * would need identity comparison rather than `===`.\n */\nexport type ChoiceValue = string | number | boolean | null\n\n/** Used by `WxCheckboxGroup` / `WxRadioGroup` to share state with their children. */\nexport interface ChoiceGroupContext<T> {\n name: ComputedRef<string | undefined>\n modelValue: Ref<T>\n disabled: ComputedRef<boolean>\n size: ComputedRef<ControlSize>\n toggle: (value: ChoiceValue, checked: boolean) => void\n}\n\nexport const checkboxGroupKey: InjectionKey<ChoiceGroupContext<ChoiceValue[]>> =\n Symbol('wx-checkbox-group')\nexport const radioGroupKey: InjectionKey<ChoiceGroupContext<ChoiceValue | undefined>> =\n Symbol('wx-radio-group')\n\nexport function provideFormItem(context: FormItemContext): void {\n provide(formItemContextKey, context)\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport {\n AutocompleteAnchor,\n AutocompleteContent,\n AutocompleteEmpty,\n AutocompleteInput,\n AutocompleteItem,\n AutocompletePortal,\n AutocompleteRoot,\n AutocompleteViewport,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { AutocompleteEmits, AutocompleteOption, AutocompleteProps } from './types'\n\ndefineOptions({ name: 'WxAutocomplete', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<AutocompleteProps>(), {\n options: () => [],\n remote: false,\n debounce: 300,\n loading: false,\n loadingText: 'Searching…',\n emptyText: 'Nothing found',\n minLength: 0,\n placeholder: undefined,\n clearable: false,\n openOnFocus: true,\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<AutocompleteEmits>()\n\n/** The model is the text in the field — an autocomplete suggests, it does not constrain. */\nconst model = defineModel<string>({ default: '' })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\nlet debounceTimer: ReturnType<typeof setTimeout> | undefined\n/** Set while a pick is being applied, so choosing a suggestion does not search for it. */\nlet picking = false\n\nfunction cancelSearch() {\n if (debounceTimer === undefined) return\n clearTimeout(debounceTimer)\n debounceTimer = undefined\n}\n\nwatch(model, (value) => {\n emit('change', value)\n\n if (picking) {\n picking = false\n cancelSearch()\n return\n }\n\n cancelSearch()\n if (value.length < props.minLength) {\n open.value = false\n return\n }\n\n debounceTimer = setTimeout(() => {\n debounceTimer = undefined\n emit('search', value)\n }, props.debounce)\n})\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\nonBeforeUnmount(cancelSearch)\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && model.value.length > 0)\n\n/** Nothing to drop down yet: below `min-length`, or still waiting on the first response. */\nconst hasList = computed(\n () => props.options.length > 0 || props.loading || model.value.length >= props.minLength,\n)\n\nconst classes = computed(() => [\n 'wx-autocomplete',\n `wx-autocomplete--${field.size.value}`,\n {\n [`wx-autocomplete--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction onSelect(option: AutocompleteOption) {\n picking = true\n emit('select', option)\n}\n\nfunction clear() {\n picking = true\n model.value = ''\n open.value = false\n emit('clear')\n}\n</script>\n\n<template>\n <autocomplete-root\n v-model=\"model\"\n v-model:open=\"open\"\n as=\"div\"\n :class=\"classes\"\n :disabled=\"field.disabled.value\"\n :name=\"name\"\n :ignore-filter=\"remote\"\n :open-on-focus=\"openOnFocus\"\n :open-on-click=\"openOnFocus\"\n >\n <autocomplete-anchor class=\"wx-autocomplete__anchor\" as=\"div\">\n <span v-if=\"$slots.prefix\" class=\"wx-autocomplete__affix\">\n <slot name=\"prefix\" />\n </span>\n\n <autocomplete-input\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-autocomplete__input\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n />\n\n <wx-icon v-if=\"loading\" class=\"wx-autocomplete__spinner\" name=\"loader\" spin />\n\n <button\n v-else-if=\"showClear\"\n class=\"wx-autocomplete__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click=\"clear\"\n >\n <wx-icon name=\"close\" />\n </button>\n\n <span v-if=\"$slots.suffix\" class=\"wx-autocomplete__affix\">\n <slot name=\"suffix\" />\n </span>\n </autocomplete-anchor>\n\n <autocomplete-portal :disabled=\"!teleport\">\n <autocomplete-content\n v-if=\"hasList\"\n class=\"wx-autocomplete__content\"\n position=\"popper\"\n :side-offset=\"4\"\n >\n <autocomplete-viewport class=\"wx-autocomplete__viewport\">\n <div v-if=\"loading && options.length === 0\" class=\"wx-autocomplete__status\">\n {{ loadingText }}\n </div>\n <autocomplete-empty v-else class=\"wx-autocomplete__status\">\n {{ emptyText }}\n </autocomplete-empty>\n\n <autocomplete-item\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"wx-autocomplete__option\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n @select=\"onSelect(option)\"\n >\n <slot name=\"option\" :option=\"option\">\n <span class=\"wx-autocomplete__option-label\">{{ option.label ?? option.value }}</span>\n <span v-if=\"option.description\" class=\"wx-autocomplete__option-description\">\n {{ option.description }}\n </span>\n </slot>\n </autocomplete-item>\n </autocomplete-viewport>\n </autocomplete-content>\n </autocomplete-portal>\n </autocomplete-root>\n</template>\n\n<style scoped>\n.wx-autocomplete {\n display: block;\n width: 100%;\n}\n\n.wx-autocomplete__anchor {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-10) 0 var(--wx-space-12);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-md);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-autocomplete--sm .wx-autocomplete__anchor {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-autocomplete--lg .wx-autocomplete__anchor {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-autocomplete__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-autocomplete.is-open .wx-autocomplete__anchor,\n.wx-autocomplete__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-autocomplete--error .wx-autocomplete__anchor,\n.wx-autocomplete--error.is-open .wx-autocomplete__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-autocomplete--success .wx-autocomplete__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-autocomplete--warning .wx-autocomplete__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-autocomplete.is-disabled .wx-autocomplete__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-autocomplete__input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-autocomplete__input::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-autocomplete__input:disabled {\n cursor: not-allowed;\n}\n\n.wx-autocomplete__affix,\n.wx-autocomplete__spinner {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-autocomplete__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 20px;\n height: 20px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-autocomplete__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* The list is teleported, so its styles cannot be scoped to the component. */\n.wx-autocomplete__content {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n width: var(--reka-combobox-trigger-width);\n max-height: 300px;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n overflow: hidden;\n}\n\n.wx-autocomplete__viewport {\n max-height: 292px;\n overflow-y: auto;\n}\n\n.wx-autocomplete__option {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n user-select: none;\n}\n\n.wx-autocomplete__option[data-highlighted] {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-autocomplete__option[data-disabled] {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-autocomplete__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-autocomplete__option-description {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-autocomplete__status {\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { BadgeEmits, BadgeProps } from './types'\n\ndefineOptions({ name: 'WxBadge' })\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n type: 'default',\n variant: 'soft',\n size: 'md',\n round: false,\n dot: false,\n closable: false,\n closeLabel: 'Remove',\n})\n\nconst emit = defineEmits<BadgeEmits>()\n\nconst classes = computed(() => [\n 'wx-badge',\n `wx-badge--${props.type}`,\n `wx-badge--${props.variant}`,\n `wx-badge--${props.size}`,\n {\n 'wx-badge--round': props.round,\n 'wx-badge--closable': props.closable,\n },\n])\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"wx-badge__dot\" aria-hidden=\"true\" />\n <span v-if=\"$slots.icon\" class=\"wx-badge__icon\">\n <slot name=\"icon\" />\n </span>\n <span class=\"wx-badge__label\">\n <slot />\n </span>\n <button\n v-if=\"closable\"\n class=\"wx-badge__close\"\n type=\"button\"\n :aria-label=\"closeLabel\"\n @click=\"emit('close', $event)\"\n >\n <wx-icon name=\"close\" />\n </button>\n </span>\n</template>\n\n<style scoped>\n.wx-badge {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n box-sizing: border-box;\n max-width: 100%;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs);\n font-family: inherit;\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n white-space: nowrap;\n vertical-align: middle;\n}\n\n/* sizes */\n.wx-badge--sm {\n padding: 1px var(--wx-space-6);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-badge--md {\n padding: 3px var(--wx-space-8);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-badge--lg {\n padding: 5px var(--wx-space-10);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-badge--round {\n border-radius: var(--wx-radius-full);\n}\n\n/* Each type names its colours once; the variants below stay type-agnostic. */\n.wx-badge--default {\n --wx-badge-accent: var(--wx-text-muted);\n --wx-badge-soft: var(--wx-bg-fill);\n --wx-badge-solid: var(--wx-bg-inverse);\n --wx-badge-contrast: var(--wx-text-inverse);\n --wx-badge-border: var(--wx-border-default);\n}\n\n.wx-badge--primary {\n --wx-badge-accent: var(--wx-color-primary);\n --wx-badge-soft: var(--wx-color-primary-soft);\n --wx-badge-solid: var(--wx-color-primary);\n --wx-badge-contrast: var(--wx-color-primary-contrast);\n --wx-badge-border: var(--wx-color-primary);\n}\n\n.wx-badge--success {\n --wx-badge-accent: var(--wx-color-success-active);\n --wx-badge-soft: var(--wx-color-success-soft);\n --wx-badge-solid: var(--wx-color-success);\n --wx-badge-contrast: var(--wx-color-success-contrast);\n --wx-badge-border: var(--wx-color-success);\n}\n\n.wx-badge--warning {\n --wx-badge-accent: var(--wx-color-warning-active);\n --wx-badge-soft: var(--wx-color-warning-soft);\n --wx-badge-solid: var(--wx-color-warning);\n --wx-badge-contrast: var(--wx-color-warning-contrast);\n --wx-badge-border: var(--wx-color-warning);\n}\n\n.wx-badge--danger {\n --wx-badge-accent: var(--wx-color-danger);\n --wx-badge-soft: var(--wx-color-danger-soft);\n --wx-badge-solid: var(--wx-color-danger);\n --wx-badge-contrast: var(--wx-color-danger-contrast);\n --wx-badge-border: var(--wx-color-danger);\n}\n\n.wx-badge--info {\n --wx-badge-accent: var(--wx-color-info-active);\n --wx-badge-soft: var(--wx-color-info-soft);\n --wx-badge-solid: var(--wx-color-info);\n --wx-badge-contrast: var(--wx-color-info-contrast);\n --wx-badge-border: var(--wx-color-info);\n}\n\n/* variants */\n.wx-badge--soft {\n background: var(--wx-badge-soft);\n color: var(--wx-badge-accent);\n}\n\n.wx-badge--solid {\n background: var(--wx-badge-solid);\n color: var(--wx-badge-contrast);\n}\n\n.wx-badge--outline {\n background: transparent;\n border-color: var(--wx-badge-border);\n color: var(--wx-badge-accent);\n}\n\n.wx-badge__dot {\n width: 6px;\n height: 6px;\n flex: 0 0 auto;\n background: currentcolor;\n border-radius: var(--wx-radius-full);\n}\n\n.wx-badge__icon {\n display: inline-flex;\n align-items: center;\n}\n\n.wx-badge__label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wx-badge__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n /* Keeps the badge from growing taller than its text. */\n margin-right: -2px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: inherit;\n font-size: 1em;\n line-height: 1;\n opacity: 0.65;\n cursor: pointer;\n}\n\n.wx-badge__close:hover {\n opacity: 1;\n}\n\n.wx-badge__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\nimport type { ButtonSize, ButtonType, ButtonVariant } from '../components/Button/types'\n\n/**\n * What a `WxButtonGroup` hands down to the buttons inside it. Every field is\n * optional: a button's own prop always wins, the group only fills the gaps.\n */\nexport interface ButtonGroupContext {\n type: ComputedRef<ButtonType | undefined>\n variant: ComputedRef<ButtonVariant | undefined>\n size: ComputedRef<ButtonSize | undefined>\n disabled: ComputedRef<boolean>\n vertical: ComputedRef<boolean>\n}\n\nexport const buttonGroupKey: InjectionKey<ButtonGroupContext> = Symbol('wx-button-group')\n\nexport function useButtonGroup(): ButtonGroupContext | null {\n return inject(buttonGroupKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useButtonGroup } from '../../composables/useButtonGroup'\nimport type { ButtonEmits, ButtonProps } from './types'\n\ndefineOptions({ name: 'WxButton', inheritAttrs: false })\n\n/*\n * The look defaults to `undefined` rather than to its documented value: inside a\n * `WxButtonGroup` the button has to tell \"caller said default\" from \"caller said\n * nothing\", and a prop default would erase that difference.\n */\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: undefined,\n variant: undefined,\n size: undefined,\n disabled: false,\n loading: false,\n block: false,\n round: false,\n href: undefined,\n target: undefined,\n nativeType: 'button',\n})\n\nconst emit = defineEmits<ButtonEmits>()\n\nconst group = useButtonGroup()\n\nconst type = computed(() => props.type ?? group?.type.value ?? 'default')\nconst variant = computed(() => props.variant ?? group?.variant.value ?? 'solid')\nconst size = computed(() => props.size ?? group?.size.value ?? 'md')\n\nconst isDisabled = computed(() => props.disabled || props.loading || group?.disabled.value || false)\nconst tag = computed(() => (props.href ? 'a' : 'button'))\n\nconst classes = computed(() => [\n 'wx-button',\n `wx-button--${type.value}`,\n `wx-button--${variant.value}`,\n `wx-button--${size.value}`,\n {\n 'wx-button--block': props.block,\n 'wx-button--round': props.round,\n 'wx-button--loading': props.loading,\n 'is-disabled': isDisabled.value,\n },\n])\n\nconst nativeAttrs = computed(() =>\n props.href\n ? {\n href: isDisabled.value ? undefined : props.href,\n target: props.target,\n role: 'button',\n 'aria-disabled': isDisabled.value ? 'true' : undefined,\n tabindex: isDisabled.value ? -1 : undefined,\n }\n : {\n type: props.nativeType,\n disabled: isDisabled.value,\n },\n)\n\nfunction onClick(event: MouseEvent) {\n if (isDisabled.value) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"{ ...nativeAttrs, ...$attrs }\"\n :class=\"classes\"\n :aria-busy=\"loading || undefined\"\n @click=\"onClick\"\n >\n <span v-if=\"loading\" class=\"wx-button__spinner\" aria-hidden=\"true\" />\n <span v-else-if=\"$slots.icon\" class=\"wx-button__icon\">\n <slot name=\"icon\" />\n </span>\n <span v-if=\"$slots.default\" class=\"wx-button__label\">\n <slot />\n </span>\n </component>\n</template>\n\n<style scoped>\n.wx-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-control);\n font-family: inherit;\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--wx-duration-normal) var(--wx-easing-standard),\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n color var(--wx-duration-normal) var(--wx-easing-standard),\n box-shadow var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-button:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* sizes */\n.wx-button--sm {\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-12);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-button--md {\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-18);\n font-size: var(--wx-font-size-md);\n}\n\n.wx-button--lg {\n height: var(--wx-size-control-lg);\n padding: 0 var(--wx-space-24);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-button--block {\n display: flex;\n width: 100%;\n}\n\n.wx-button--round {\n border-radius: var(--wx-radius-full);\n}\n\n/*\n * Each type exposes its own palette through local variables, so the variant rules\n * below stay type-agnostic.\n */\n.wx-button--default {\n --wx-button-bg: var(--wx-bg-surface);\n --wx-button-bg-hover: var(--wx-bg-fill);\n --wx-button-bg-active: var(--wx-bg-fill-hover);\n --wx-button-bg-disabled: var(--wx-bg-surface);\n --wx-button-fg: var(--wx-text-default);\n --wx-button-border: var(--wx-border-default);\n}\n\n.wx-button--primary {\n --wx-button-bg: var(--wx-color-primary);\n --wx-button-bg-hover: var(--wx-color-primary-hover);\n --wx-button-bg-active: var(--wx-color-primary-active);\n --wx-button-bg-disabled: var(--wx-color-primary-disabled);\n --wx-button-fg: var(--wx-color-primary-contrast);\n --wx-button-border: var(--wx-color-primary);\n --wx-button-accent: var(--wx-color-primary);\n --wx-button-soft: var(--wx-color-primary-soft);\n}\n\n.wx-button--success {\n --wx-button-bg: var(--wx-color-success);\n --wx-button-bg-hover: var(--wx-color-success-hover);\n --wx-button-bg-active: var(--wx-color-success-active);\n --wx-button-bg-disabled: var(--wx-color-success-disabled);\n --wx-button-fg: var(--wx-color-success-contrast);\n --wx-button-border: var(--wx-color-success);\n --wx-button-accent: var(--wx-color-success);\n --wx-button-soft: var(--wx-color-success-soft);\n}\n\n.wx-button--warning {\n --wx-button-bg: var(--wx-color-warning);\n --wx-button-bg-hover: var(--wx-color-warning-hover);\n --wx-button-bg-active: var(--wx-color-warning-active);\n --wx-button-bg-disabled: var(--wx-color-warning-disabled);\n --wx-button-fg: var(--wx-color-warning-contrast);\n --wx-button-border: var(--wx-color-warning);\n --wx-button-accent: var(--wx-color-warning);\n --wx-button-soft: var(--wx-color-warning-soft);\n}\n\n.wx-button--danger {\n --wx-button-bg: var(--wx-color-danger);\n --wx-button-bg-hover: var(--wx-color-danger-hover);\n --wx-button-bg-active: var(--wx-color-danger-active);\n --wx-button-bg-disabled: var(--wx-color-danger-disabled);\n --wx-button-fg: var(--wx-color-danger-contrast);\n --wx-button-border: var(--wx-color-danger);\n --wx-button-accent: var(--wx-color-danger);\n --wx-button-soft: var(--wx-color-danger-soft);\n}\n\n/* solid */\n.wx-button--solid {\n background: var(--wx-button-bg);\n border-color: var(--wx-button-border);\n color: var(--wx-button-fg);\n}\n\n.wx-button--solid:hover:not(.is-disabled) {\n background: var(--wx-button-bg-hover);\n border-color: var(--wx-button-bg-hover);\n}\n\n.wx-button--solid:active:not(.is-disabled) {\n background: var(--wx-button-bg-active);\n border-color: var(--wx-button-bg-active);\n}\n\n.wx-button--solid.is-disabled {\n background: var(--wx-button-bg-disabled);\n border-color: var(--wx-button-bg-disabled);\n}\n\n.wx-button--solid.wx-button--default.is-disabled {\n border-color: var(--wx-border-default);\n color: var(--wx-text-disabled);\n}\n\n/* outline */\n.wx-button--outline {\n background: transparent;\n border-color: var(--wx-button-accent, var(--wx-border-default));\n color: var(--wx-button-accent, var(--wx-text-default));\n}\n\n.wx-button--outline:hover:not(.is-disabled) {\n background: var(--wx-button-soft, var(--wx-bg-fill));\n}\n\n.wx-button--outline:active:not(.is-disabled) {\n border-color: var(--wx-button-bg-active);\n color: var(--wx-button-bg-active);\n}\n\n.wx-button--outline.is-disabled {\n border-color: var(--wx-button-bg-disabled);\n color: var(--wx-button-bg-disabled);\n}\n\n/* text */\n.wx-button--text {\n background: transparent;\n border-color: transparent;\n color: var(--wx-button-accent, var(--wx-text-default));\n}\n\n.wx-button--text:hover:not(.is-disabled) {\n background: var(--wx-bg-fill);\n}\n\n.wx-button--text:active:not(.is-disabled) {\n background: var(--wx-bg-fill-hover);\n}\n\n.wx-button--text.is-disabled {\n color: var(--wx-text-disabled);\n}\n\n/* states */\n.wx-button.is-disabled {\n cursor: not-allowed;\n}\n\n.wx-button--loading {\n cursor: progress;\n}\n\n.wx-button__spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-right-color: transparent;\n border-radius: var(--wx-radius-full);\n /* Same pace as a spinning WxIcon — a turn a second, not three. */\n animation: wx-button-spin var(--wx-button-spin-duration, 1s) linear infinite;\n}\n\n.wx-button__icon {\n display: inline-flex;\n align-items: center;\n}\n\n@keyframes wx-button-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-button {\n transition: none;\n }\n\n .wx-button__spinner {\n animation-duration: 2s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { buttonGroupKey } from '../../composables/useButtonGroup'\nimport type { ButtonGroupProps } from './types'\n\ndefineOptions({ name: 'WxButtonGroup' })\n\nconst props = withDefaults(defineProps<ButtonGroupProps>(), {\n type: undefined,\n variant: undefined,\n size: undefined,\n disabled: false,\n vertical: false,\n attached: true,\n ariaLabel: undefined,\n})\n\nprovide(buttonGroupKey, {\n type: computed(() => props.type),\n variant: computed(() => props.variant),\n size: computed(() => props.size),\n disabled: computed(() => props.disabled),\n vertical: computed(() => props.vertical),\n})\n\nconst classes = computed(() => [\n 'wx-button-group',\n {\n 'wx-button-group--vertical': props.vertical,\n 'wx-button-group--attached': props.attached,\n },\n])\n</script>\n\n<template>\n <div :class=\"classes\" role=\"group\" :aria-label=\"ariaLabel\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.wx-button-group {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n vertical-align: middle;\n}\n\n.wx-button-group--vertical {\n flex-direction: column;\n align-items: stretch;\n}\n\n/* Joined: the buttons share one outline, so the gap goes and the borders overlap. */\n.wx-button-group--attached {\n gap: 0;\n}\n\n.wx-button-group--attached :deep(.wx-button) {\n position: relative;\n border-radius: 0;\n}\n\n.wx-button-group--attached :deep(.wx-button:first-child) {\n border-start-start-radius: var(--wx-radius-control);\n border-end-start-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached :deep(.wx-button:last-child) {\n border-start-end-radius: var(--wx-radius-control);\n border-end-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached :deep(.wx-button:not(:first-child)) {\n margin-left: -1px;\n}\n\n/* The hovered or focused button owns the shared border, so it is not half-covered. */\n.wx-button-group--attached :deep(.wx-button:hover),\n.wx-button-group--attached :deep(.wx-button:focus-visible),\n.wx-button-group--attached :deep(.wx-button:active) {\n z-index: 1;\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button) {\n border-radius: 0;\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:first-child) {\n border-start-start-radius: var(--wx-radius-control);\n border-start-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:last-child) {\n border-end-start-radius: var(--wx-radius-control);\n border-end-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:not(:first-child)) {\n margin-left: 0;\n margin-top: -1px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { CardProps } from './types'\n\ndefineOptions({ name: 'WxCard' })\n\nconst props = withDefaults(defineProps<CardProps>(), {\n title: undefined,\n shadow: 'always',\n padding: 'md',\n bordered: false,\n})\n\nconst slots = useSlots()\n\nconst hasHeader = computed(() => Boolean(props.title || slots.header || slots.extra))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\nconst classes = computed(() => [\n 'wx-card',\n `wx-card--shadow-${props.shadow}`,\n `wx-card--padding-${props.padding}`,\n {\n 'wx-card--bordered': props.bordered,\n 'wx-card--with-sidebar': hasSidebar.value,\n },\n])\n</script>\n\n<template>\n <section :class=\"classes\">\n <header v-if=\"hasHeader\" class=\"wx-card__header\">\n <div class=\"wx-card__title\">\n <slot name=\"header\">{{ title }}</slot>\n </div>\n <div v-if=\"$slots.extra\" class=\"wx-card__extra\">\n <slot name=\"extra\" />\n </div>\n </header>\n\n <div class=\"wx-card__body\">\n <div v-if=\"hasSidebar\" class=\"wx-card__layout\">\n <aside class=\"wx-card__sidebar\">\n <slot name=\"sidebar\" />\n </aside>\n <div class=\"wx-card__content\">\n <slot />\n </div>\n </div>\n <slot v-else />\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-card__footer\">\n <slot name=\"footer\" />\n </footer>\n </section>\n</template>\n\n<style scoped>\n.wx-card {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background: var(--wx-bg-surface);\n border: 1px solid transparent;\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n transition: box-shadow var(--wx-duration-normal) var(--wx-easing-standard);\n /* The sidebar layout reacts to the card's own width, not the viewport's. */\n container-type: inline-size;\n}\n\n.wx-card--bordered {\n border-color: var(--wx-border-default);\n}\n\n.wx-card--shadow-always {\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-card--shadow-hover:hover {\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-card__header,\n.wx-card__body,\n.wx-card__footer {\n padding: var(--wx-card-padding, var(--wx-space-16));\n}\n\n.wx-card--padding-none {\n --wx-card-padding: 0px;\n}\n\n.wx-card--padding-sm {\n --wx-card-padding: var(--wx-space-12);\n}\n\n.wx-card--padding-md {\n --wx-card-padding: var(--wx-space-16);\n}\n\n.wx-card--padding-lg {\n --wx-card-padding: var(--wx-space-24);\n}\n\n.wx-card__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-16);\n padding-bottom: 0;\n}\n\n.wx-card__title {\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-card__extra {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-card__body {\n flex: 1 1 auto;\n}\n\n.wx-card__footer {\n padding-top: 0;\n}\n\n/* Sidebar layout: stacked by default, two columns once the card is wide enough. */\n.wx-card__layout {\n display: flex;\n flex-direction: column;\n gap: var(--wx-card-padding, var(--wx-space-16));\n}\n\n.wx-card__sidebar,\n.wx-card__content {\n min-width: 0;\n}\n\n.wx-card__content {\n flex: 1 1 auto;\n}\n\n@container (min-width: 560px) {\n .wx-card__layout {\n flex-direction: row;\n }\n\n .wx-card__sidebar {\n flex: 0 0 auto;\n width: var(--wx-card-sidebar-width, 240px);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue'\nimport { PopoverAnchor, PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type {\n CascaderEmits,\n CascaderModelValue,\n CascaderOption,\n CascaderProps,\n CascaderValue,\n} from './types'\n\ndefineOptions({ name: 'WxCascader', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CascaderProps>(), {\n options: () => [],\n expandTrigger: 'click',\n checkStrictly: false,\n emitPath: true,\n showAllLevels: true,\n separator: ' / ',\n lazy: false,\n load: undefined,\n placeholder: undefined,\n emptyText: 'Nothing here',\n clearable: false,\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<CascaderEmits>()\n\nconst model = defineModel<CascaderModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst open = ref(false)\n/** The chain of opened nodes — one column per entry, plus the root column. */\nconst activePath = ref<CascaderOption[]>([])\nconst panel = ref<HTMLElement | null>(null)\n\n/** Levels fetched by `load`, keyed by the path that asked for them. */\nconst loadedChildren = ref(new Map<string, CascaderOption[]>())\nconst loadingKeys = ref(new Set<string>())\n\n/**\n * A path is keyed by the values along it, serialised — no separator character to\n * clash with a value that happens to contain one. The root is the empty path.\n */\nfunction keyOf(path: CascaderOption[]): string {\n return JSON.stringify(path.map((option) => option.value))\n}\n\nconst rootOptions = computed<CascaderOption[]>(() =>\n props.options.length > 0 ? props.options : (loadedChildren.value.get(keyOf([])) ?? []),\n)\n\nfunction childrenOf(option: CascaderOption, parents: CascaderOption[]): CascaderOption[] {\n if (option.children?.length) return option.children\n return loadedChildren.value.get(keyOf([...parents, option])) ?? []\n}\n\nfunction isLeaf(option: CascaderOption, parents: CascaderOption[]): boolean {\n if (option.leaf === true) return true\n if (option.children?.length) return false\n if (!props.lazy) return true\n\n /* Lazily: a node is a leaf once its level came back empty, not before. */\n const loaded = loadedChildren.value.get(keyOf([...parents, option]))\n return loaded !== undefined && loaded.length === 0\n}\n\nfunction isLoading(option: CascaderOption, parents: CascaderOption[]): boolean {\n return loadingKeys.value.has(keyOf([...parents, option]))\n}\n\n/** The root column, then one column per opened node that has something under it. */\nconst columns = computed<CascaderOption[][]>(() => {\n const result: CascaderOption[][] = [rootOptions.value]\n\n activePath.value.forEach((option, index) => {\n const children = childrenOf(option, activePath.value.slice(0, index))\n if (children.length > 0) result.push(children)\n })\n\n return result\n})\n\n/** Walks a stored path of values back into the options they name. */\nfunction resolvePath(values: CascaderValue[]): CascaderOption[] {\n const path: CascaderOption[] = []\n let level = rootOptions.value\n\n for (const value of values) {\n const option = level.find((candidate) => candidate.value === value)\n if (!option) break\n path.push(option)\n level = childrenOf(option, path.slice(0, -1))\n }\n\n return path\n}\n\n/** Depth-first search, for a model that holds the last value alone. */\nfunction findPath(\n options: CascaderOption[],\n value: CascaderValue,\n parents: CascaderOption[] = [],\n): CascaderOption[] | undefined {\n for (const option of options) {\n const path = [...parents, option]\n if (option.value === value) return path\n\n const found = findPath(childrenOf(option, parents), value, path)\n if (found) return found\n }\n return undefined\n}\n\nconst selectedPath = computed<CascaderOption[]>(() => {\n const value = model.value\n if (value === null || value === undefined || value === '') return []\n if (Array.isArray(value)) return resolvePath(value)\n return findPath(rootOptions.value, value) ?? []\n})\n\nconst hasValue = computed(() => {\n const value = model.value\n if (value === null || value === undefined || value === '') return false\n /* An empty path is \"nothing picked\" — that is what `clear` leaves behind. */\n if (Array.isArray(value)) return value.length > 0\n return true\n})\n\nconst displayLabel = computed(() => {\n const path = selectedPath.value\n\n /* Nothing resolved — usually a lazy tree that has not loaded the branch yet. */\n if (path.length === 0) {\n const value = model.value\n if (!hasValue.value) return ''\n return Array.isArray(value) ? value.join(props.separator) : String(value)\n }\n\n if (!props.showAllLevels) return path[path.length - 1].label\n return path.map((option) => option.label).join(props.separator)\n})\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && hasValue.value)\n\n/** What a plain form post carries: the path as `content,news`, or the single value. */\nconst formValue = computed(() => {\n const value = model.value\n if (!hasValue.value) return ''\n return Array.isArray(value) ? value.join(',') : String(value)\n})\n\nconst classes = computed(() => [\n 'wx-cascader',\n `wx-cascader--${field.size.value}`,\n {\n [`wx-cascader--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nasync function loadLevel(path: CascaderOption[]): Promise<void> {\n if (!props.load) return\n\n const key = keyOf(path)\n if (loadedChildren.value.has(key) || loadingKeys.value.has(key)) return\n\n loadingKeys.value.add(key)\n try {\n const children = await props.load(path[path.length - 1] ?? null, path)\n loadedChildren.value.set(key, children)\n } finally {\n loadingKeys.value.delete(key)\n }\n}\n\nfunction expand(option: CascaderOption, level: number) {\n if (option.disabled) return\n\n const parents = activePath.value.slice(0, level)\n activePath.value = [...parents, option]\n emit('expand', activePath.value)\n\n if (props.lazy && !isLeaf(option, parents)) void loadLevel([...parents, option])\n}\n\nfunction select(path: CascaderOption[]) {\n const value: CascaderModelValue = props.emitPath\n ? path.map((option) => option.value)\n : (path[path.length - 1]?.value ?? null)\n\n model.value = value\n emit('change', value)\n}\n\nfunction onOptionClick(option: CascaderOption, level: number) {\n if (option.disabled) return\n\n const parents = activePath.value.slice(0, level)\n const path = [...parents, option]\n const leaf = isLeaf(option, parents)\n\n expand(option, level)\n\n if (leaf || props.checkStrictly) select(path)\n if (leaf) open.value = false\n}\n\nfunction onOptionHover(option: CascaderOption, level: number) {\n if (props.expandTrigger !== 'hover' || option.disabled) return\n if (isLeaf(option, activePath.value.slice(0, level))) return\n expand(option, level)\n}\n\nfunction clear() {\n model.value = props.emitPath ? [] : null\n activePath.value = []\n emit('change', model.value)\n emit('clear')\n}\n\nwatch(open, (value) => {\n if (value) {\n /* Reopening lands where the current value sits, not where the last poke left it. */\n activePath.value = selectedPath.value.slice(0, -1)\n if (props.lazy && rootOptions.value.length === 0) void loadLevel([])\n emit('open')\n return\n }\n emit('close')\n})\n\n// --- keyboard ---------------------------------------------------------------\n\nfunction optionsIn(level: number): HTMLButtonElement[] {\n if (!panel.value) return []\n return [\n ...panel.value.querySelectorAll<HTMLButtonElement>(\n `[data-column=\"${level}\"] .wx-cascader__option:not(:disabled)`,\n ),\n ]\n}\n\nfunction focusOption(level: number, index: number) {\n const items = optionsIn(level)\n if (items.length === 0) return\n const bounded = ((index % items.length) + items.length) % items.length\n items[bounded]?.focus()\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n const target = event.target as HTMLElement | null\n const column = target?.closest<HTMLElement>('[data-column]')\n\n /* The panel itself has focus right after opening: the first arrow enters the list. */\n if (!column) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault()\n focusOption(0, 0)\n }\n return\n }\n\n const level = Number(column.dataset.column)\n const items = optionsIn(level)\n const current = items.indexOf(target as HTMLButtonElement)\n const option = columns.value[level]?.[Number((target as HTMLElement).dataset.index)]\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusOption(level, current + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusOption(level, current - 1)\n break\n case 'ArrowRight': {\n if (!option || isLeaf(option, activePath.value.slice(0, level))) return\n event.preventDefault()\n expand(option, level)\n void nextTick(() => focusOption(level + 1, 0))\n break\n }\n case 'ArrowLeft': {\n if (level === 0) return\n event.preventDefault()\n activePath.value = activePath.value.slice(0, level - 1)\n void nextTick(() => {\n const parent = columns.value[level - 1]?.findIndex(\n (candidate) => candidate.value === activePath.value[level - 1]?.value,\n )\n focusOption(level - 1, parent === undefined || parent < 0 ? 0 : parent)\n })\n break\n }\n default:\n break\n }\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\">\n <div :class=\"classes\">\n <popover-anchor as=\"div\" class=\"wx-cascader__anchor\">\n <popover-trigger\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-cascader__trigger\"\n type=\"button\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n >\n <span v-if=\"hasValue\" class=\"wx-cascader__value\">{{ displayLabel }}</span>\n <span v-else class=\"wx-cascader__placeholder\">{{ placeholder }}</span>\n <wx-icon class=\"wx-cascader__arrow\" name=\"chevron-down\" />\n </popover-trigger>\n\n <button\n v-if=\"showClear\"\n class=\"wx-cascader__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n <wx-icon name=\"close\" />\n </button>\n </popover-anchor>\n\n <input v-if=\"name\" type=\"hidden\" :name=\"name\" :value=\"formValue\" />\n </div>\n\n <popover-portal :disabled=\"!teleport\">\n <!--\n The panel itself takes focus when it opens — that is what makes the arrow keys\n work — so the key handler sits on it rather than on the columns inside.\n -->\n <popover-content\n class=\"wx-cascader__panel\"\n align=\"start\"\n :side-offset=\"4\"\n @keydown=\"onPanelKeydown\"\n >\n <div ref=\"panel\" class=\"wx-cascader__columns\">\n <div\n v-for=\"(column, level) in columns\"\n :key=\"level\"\n class=\"wx-cascader__column\"\n :data-column=\"level\"\n role=\"listbox\"\n :aria-label=\"`Level ${level + 1}`\"\n >\n <button\n v-for=\"(option, index) in column\"\n :key=\"String(option.value)\"\n class=\"wx-cascader__option\"\n type=\"button\"\n role=\"option\"\n :data-index=\"index\"\n :disabled=\"option.disabled\"\n :aria-selected=\"selectedPath[level]?.value === option.value\"\n :class=\"{\n 'is-active': activePath[level]?.value === option.value,\n 'is-selected': selectedPath[level]?.value === option.value,\n }\"\n @click=\"onOptionClick(option, level)\"\n @mouseenter=\"onOptionHover(option, level)\"\n >\n <span class=\"wx-cascader__label\">\n <slot name=\"option\" :option=\"option\" :level=\"level\">{{ option.label }}</slot>\n </span>\n\n <wx-icon\n v-if=\"isLoading(option, activePath.slice(0, level))\"\n class=\"wx-cascader__mark\"\n name=\"loader\"\n spin\n />\n <wx-icon\n v-else-if=\"!isLeaf(option, activePath.slice(0, level))\"\n class=\"wx-cascader__mark\"\n name=\"chevron-right\"\n />\n <wx-icon\n v-else-if=\"selectedPath[level]?.value === option.value\"\n class=\"wx-cascader__mark wx-cascader__mark--check\"\n name=\"check\"\n />\n </button>\n\n <p v-if=\"column.length === 0\" class=\"wx-cascader__empty\">{{ emptyText }}</p>\n </div>\n </div>\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style scoped>\n.wx-cascader {\n display: block;\n width: 100%;\n}\n\n.wx-cascader__anchor {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding-right: var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-md);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-cascader--sm .wx-cascader__anchor {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-cascader--lg .wx-cascader__anchor {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-cascader__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-cascader.is-open .wx-cascader__anchor,\n.wx-cascader__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-cascader--error .wx-cascader__anchor,\n.wx-cascader--error.is-open .wx-cascader__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-cascader--success .wx-cascader__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-cascader--warning .wx-cascader__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-cascader.is-disabled .wx-cascader__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-cascader__trigger {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0 0 0 var(--wx-space-12);\n background: transparent;\n border: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-cascader__trigger:focus-visible {\n outline: none;\n}\n\n.wx-cascader.is-disabled .wx-cascader__trigger {\n cursor: not-allowed;\n}\n\n.wx-cascader__value,\n.wx-cascader__placeholder {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-cascader__placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-cascader__arrow {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: 16px;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-cascader.is-open .wx-cascader__arrow {\n transform: rotate(180deg);\n}\n\n.wx-cascader__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 20px;\n height: 20px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-cascader__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-cascader__panel {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n overflow: hidden;\n}\n\n.wx-cascader__columns {\n display: flex;\n align-items: stretch;\n max-width: min(90vw, 720px);\n /* Columns scroll sideways rather than push the panel off a narrow screen. */\n overflow-x: auto;\n}\n\n.wx-cascader__column {\n display: flex;\n flex-direction: column;\n flex: 0 0 auto;\n gap: 1px;\n min-width: 180px;\n max-height: 280px;\n padding: var(--wx-space-4);\n overflow-y: auto;\n}\n\n.wx-cascader__column + .wx-cascader__column {\n border-left: 1px solid var(--wx-border-muted);\n}\n\n.wx-cascader__option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n width: 100%;\n padding: var(--wx-space-6) var(--wx-space-10);\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: inherit;\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n text-align: start;\n cursor: pointer;\n}\n\n.wx-cascader__option:hover:not(:disabled),\n.wx-cascader__option:focus-visible {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-cascader__option.is-active {\n background: var(--wx-bg-fill);\n}\n\n.wx-cascader__option.is-selected {\n color: var(--wx-color-primary);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-cascader__option:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-cascader__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-cascader__mark {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: 14px;\n}\n\n.wx-cascader__mark--check {\n color: var(--wx-color-primary);\n}\n\n.wx-cascader__empty {\n margin: 0;\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, ref, watch } from 'vue'\nimport { checkboxGroupKey, useFormField } from '../../composables/useFormField'\nimport type { CheckboxEmits, CheckboxProps } from './types'\n\ndefineOptions({ name: 'WxCheckbox', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n value: undefined,\n label: undefined,\n indeterminate: false,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<CheckboxEmits>()\n\nconst model = defineModel<boolean>({ default: false })\n\nconst group = inject(checkboxGroupKey, null)\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst checked = computed(() =>\n group ? group.modelValue.value.includes(props.value ?? null) : model.value === true,\n)\n\nconst disabled = computed(() => props.disabled || group?.disabled.value || field.disabled.value)\nconst size = computed(() => props.size ?? group?.size.value ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-checkbox',\n `wx-checkbox--${size.value}`,\n {\n 'is-checked': checked.value,\n 'is-indeterminate': props.indeterminate && !checked.value,\n 'is-disabled': disabled.value,\n },\n])\n\n/** `indeterminate` only exists as a DOM property, never as an attribute. */\nfunction syncIndeterminate() {\n if (inputRef.value) inputRef.value.indeterminate = props.indeterminate && !checked.value\n}\n\nonMounted(syncIndeterminate)\nwatch([() => props.indeterminate, checked], syncIndeterminate)\n\nfunction onChange(event: Event) {\n const next = (event.target as HTMLInputElement).checked\n if (group) group.toggle(props.value ?? null, next)\n else model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <label :class=\"classes\">\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"$attrs\"\n class=\"wx-checkbox__native\"\n type=\"checkbox\"\n :name=\"name ?? group?.name.value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-checkbox__box\" aria-hidden=\"true\">\n <svg class=\"wx-checkbox__mark\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n v-if=\"indeterminate && !checked\"\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n <path\n v-else\n d=\"M3.5 8.5l3 3 6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-checkbox__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-checkbox {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-checkbox.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-checkbox__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.wx-checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-checkbox-size, 20px);\n height: var(--wx-checkbox-size, 20px);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-strong);\n border-radius: var(--wx-radius-xs);\n color: transparent;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-checkbox--sm {\n --wx-checkbox-size: 16px;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-checkbox--md {\n --wx-checkbox-size: 20px;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-checkbox--lg {\n --wx-checkbox-size: 24px;\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-checkbox:hover:not(.is-disabled) .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n}\n\n.wx-checkbox.is-checked .wx-checkbox__box,\n.wx-checkbox.is-indeterminate .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n color: var(--wx-color-primary);\n}\n\n.wx-checkbox.is-disabled .wx-checkbox__box {\n background: var(--wx-bg-disabled);\n border-color: var(--wx-border-default);\n}\n\n.wx-checkbox.is-disabled.is-checked .wx-checkbox__box,\n.wx-checkbox.is-disabled.is-indeterminate .wx-checkbox__box {\n color: var(--wx-color-primary-disabled);\n border-color: var(--wx-color-primary-disabled);\n}\n\n.wx-checkbox__native:focus-visible + .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-checkbox__mark {\n width: 100%;\n height: 100%;\n}\n\n.wx-checkbox__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-checkbox__box {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { checkboxGroupKey, useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport WxCheckbox from '../Checkbox/Checkbox.vue'\nimport type { CheckboxGroupEmits, CheckboxGroupProps } from './types'\n\ndefineOptions({ name: 'WxCheckboxGroup' })\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n options: undefined,\n disabled: undefined,\n size: undefined,\n name: undefined,\n inline: false,\n min: undefined,\n max: undefined,\n})\n\nconst emit = defineEmits<CheckboxGroupEmits>()\n\nconst model = defineModel<ChoiceValue[]>({ default: () => [] })\n\nconst field = useFormField(props)\n\n/** A group cannot be the target of a `for`, so the item label becomes a span. */\nfield.item?.registerLabelTarget(undefined)\n\nconst disabled = computed(() => props.disabled ?? field.disabled.value)\nconst size = computed(() => props.size ?? field.size.value)\n\nfunction toggle(value: ChoiceValue, checked: boolean) {\n const current = model.value ?? []\n if (checked) {\n if (current.includes(value)) return\n if (props.max !== undefined && current.length >= props.max) return\n model.value = [...current, value]\n } else {\n if (props.min !== undefined && current.length <= props.min) return\n model.value = current.filter((item) => item !== value)\n }\n emit('change', model.value)\n}\n\nprovide(checkboxGroupKey, {\n name: computed(() => props.name),\n modelValue: computed(() => model.value ?? []),\n disabled,\n size,\n toggle,\n})\n</script>\n\n<template>\n <div\n :class=\"['wx-checkbox-group', { 'wx-checkbox-group--inline': inline }]\"\n role=\"group\"\n :aria-labelledby=\"field.item ? `${field.item.id.value}-label` : undefined\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <slot>\n <wx-checkbox\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :label=\"option.label\"\n :disabled=\"option.disabled\"\n />\n </slot>\n </div>\n</template>\n\n<style scoped>\n.wx-checkbox-group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-checkbox-group--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--wx-space-16);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n ColorAreaArea,\n ColorAreaRoot,\n ColorAreaThumb,\n ColorSliderRoot,\n ColorSliderThumb,\n ColorSliderTrack,\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n colorToHex,\n convertToHsb,\n getAreaBackgroundStyle,\n getSliderBackgroundStyle,\n parseColor,\n} from 'reka-ui'\nimport type { Color } from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { ColorPickerEmits, ColorPickerProps } from './types'\n\ndefineOptions({ name: 'WxColorPicker', inheritAttrs: false })\n\nconst HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n presets: () => [],\n clearable: false,\n placeholder: '#000000',\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<ColorPickerEmits>()\n\nconst model = defineModel<string | null>({ default: null })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\n/** What the text box shows. Kept separate so a half-typed hex is not thrown away. */\nconst text = ref(model.value ?? '')\n\nwatch(model, (value) => {\n text.value = value ?? ''\n})\n\n/**\n * A hex parses into an RGB colour, and the picker works in HSB. Both the gradients and\n * the primitives take the space from the object unless told otherwise, so an unconverted\n * colour draws an RGB area — where the brightness gradient runs the other way and the\n * square looks upside down until the first drag replaces the object.\n */\nfunction toWorking(hex: string): Color {\n return convertToHsb(parseColor(hex))\n}\n\n/**\n * The picker works on a colour object, not on the hex string.\n *\n * A grey has no hue to speak of, so parsing #919191 back into channels invents one —\n * and re-deriving it on every pointer move is what made the hue strip jump from blue\n * to teal to red as the pointer travelled into the desaturated corner. Holding the\n * object keeps the hue the user chose even where the colour cannot express it.\n */\nconst working = ref<Color>(\n toWorking(model.value && HEX.test(model.value) ? model.value : '#427edd'),\n)\n\nwatch(model, (value) => {\n const hex = value && HEX.test(value) ? value : null\n if (!hex || hex === colorToHex(working.value).toLowerCase()) return\n working.value = toWorking(hex)\n})\n\n// The space is stated rather than read off the colour, so the gradients cannot drift\n// away from the channels the area and the slider are pinned to.\nconst areaStyle = computed(() =>\n getAreaBackgroundStyle(working.value, 'saturation', 'brightness', 'hsb'),\n)\nconst hueStyle = computed(() => getSliderBackgroundStyle(working.value, 'hue', 'hsb'))\n\nconst swatch = computed(() => (model.value && HEX.test(model.value) ? model.value : null))\n\nconst classes = computed(() => [\n 'wx-color-picker',\n `wx-color-picker--${field.size.value}`,\n {\n [`wx-color-picker--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction commit(value: string | null) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\n/** Typing is free-form; only a complete hex reaches the model. */\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n text.value = value\n if (HEX.test(value)) commit(value.toLowerCase())\n else if (value === '') commit(null)\n}\n\n/** On blur the box either shows a valid colour or goes back to the last one. */\nfunction onBlur() {\n if (text.value === '') {\n commit(null)\n return\n }\n const candidate = text.value.startsWith('#') ? text.value : `#${text.value}`\n if (HEX.test(candidate)) {\n commit(candidate.toLowerCase())\n text.value = candidate.toLowerCase()\n } else {\n text.value = model.value ?? ''\n }\n}\n\n/**\n * The two primitives do not agree on which event carries the new colour: the hue\n * slider reports through `change`, the saturation area through `update:modelValue`.\n * Both are bound on both, and only string payloads are taken — the slider can also\n * hand back a colour object. Committing twice is harmless: an unchanged value is\n * dropped.\n */\nfunction onColor(color: Color) {\n working.value = convertToHsb(color)\n commit(colorToHex(color).toLowerCase())\n}\n\n/** Presets and typing come in as hex and have to be parsed back into the picker. */\nfunction onHex(value: string) {\n const hex = value.toLowerCase()\n working.value = toWorking(hex)\n commit(hex)\n}\n\nfunction clear() {\n commit(null)\n text.value = ''\n}\n\nfunction openPicker() {\n if (!field.disabled.value && !props.readonly) open.value = true\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\">\n <div :class=\"classes\">\n <popover-anchor as-child>\n <div class=\"wx-color-picker__field\" @click=\"openPicker\">\n <button\n class=\"wx-color-picker__swatch\"\n type=\"button\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel ?? 'Pick a colour'\"\n :style=\"swatch ? { background: swatch } : undefined\"\n :class=\"{ 'is-empty': !swatch }\"\n />\n\n <input\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-color-picker__input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n :value=\"text\"\n :name=\"name\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n @input=\"onInput\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"clearable && swatch && !field.disabled.value\"\n class=\"wx-color-picker__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n ✕\n </button>\n </div>\n </popover-anchor>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content class=\"wx-color-picker__panel\" :side-offset=\"4\" align=\"start\">\n <!-- Channels are stated: the defaults are RGB, which would move the hue as\n the pointer travels and disagree with the gradient drawn underneath. -->\n <color-area-root\n class=\"wx-color-picker__area\"\n color-space=\"hsb\"\n x-channel=\"saturation\"\n y-channel=\"brightness\"\n :model-value=\"working\"\n @update:color=\"onColor\"\n >\n <color-area-area class=\"wx-color-picker__area-surface\" :style=\"areaStyle\">\n <color-area-thumb class=\"wx-color-picker__thumb\" />\n </color-area-area>\n </color-area-root>\n\n <color-slider-root\n class=\"wx-color-picker__hue\"\n color-space=\"hsb\"\n channel=\"hue\"\n :model-value=\"working\"\n @update:color=\"onColor\"\n >\n <color-slider-track class=\"wx-color-picker__hue-track\" :style=\"hueStyle\">\n <color-slider-thumb class=\"wx-color-picker__thumb\" />\n </color-slider-track>\n </color-slider-root>\n\n <div v-if=\"presets.length\" class=\"wx-color-picker__presets\">\n <button\n v-for=\"preset in presets\"\n :key=\"preset\"\n class=\"wx-color-picker__preset\"\n type=\"button\"\n :style=\"{ background: preset }\"\n :aria-label=\"preset\"\n :aria-pressed=\"model === preset\"\n @click=\"onHex(preset)\"\n />\n </div>\n </popover-content>\n </popover-portal>\n </div>\n </popover-root>\n</template>\n\n<style scoped>\n.wx-color-picker {\n display: block;\n width: 100%;\n}\n\n.wx-color-picker__field {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-8) 0 var(--wx-space-6);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-md);\n cursor: text;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-color-picker--sm .wx-color-picker__field {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-color-picker--lg .wx-color-picker__field {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-color-picker__field:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-color-picker.is-open .wx-color-picker__field,\n.wx-color-picker__field:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-color-picker--error .wx-color-picker__field {\n border-color: var(--wx-color-danger);\n}\n\n.wx-color-picker--success .wx-color-picker__field {\n border-color: var(--wx-color-success);\n}\n\n.wx-color-picker--warning .wx-color-picker__field {\n border-color: var(--wx-color-warning);\n}\n\n.wx-color-picker.is-disabled .wx-color-picker__field {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-color-picker__swatch {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n/* A chequerboard says \"no colour\" more clearly than an empty box. */\n.wx-color-picker__swatch.is-empty {\n background-image:\n linear-gradient(45deg, var(--wx-bg-fill) 25%, transparent 25%),\n linear-gradient(-45deg, var(--wx-bg-fill) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--wx-bg-fill) 75%),\n linear-gradient(-45deg, transparent 75%, var(--wx-bg-fill) 75%);\n background-size: 8px 8px;\n background-position:\n 0 0,\n 0 4px,\n 4px -4px,\n -4px 0;\n}\n\n.wx-color-picker__input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: var(--wx-font-family-mono);\n font-size: inherit;\n text-transform: lowercase;\n}\n\n.wx-color-picker__input::placeholder {\n color: var(--wx-text-placeholder);\n text-transform: none;\n}\n\n.wx-color-picker__clear {\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n}\n\n.wx-color-picker__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* Teleported panel. */\n.wx-color-picker__panel {\n z-index: var(--wx-z-index-popover);\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n width: 232px;\n padding: var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n}\n\n.wx-color-picker__area,\n.wx-color-picker__area-surface {\n position: relative;\n width: 100%;\n height: 140px;\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-color-picker__hue {\n position: relative;\n height: 14px;\n}\n\n.wx-color-picker__hue-track {\n /* Reka renders the track as an inline element, where width and height do nothing. */\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: var(--wx-radius-full);\n}\n\n.wx-color-picker__thumb {\n width: 14px;\n height: 14px;\n background: transparent;\n border: 2px solid #fff;\n border-radius: var(--wx-radius-full);\n box-shadow: 0 0 0 1px rgb(0 0 0 / 0.35);\n}\n\n.wx-color-picker__thumb:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 1px rgb(0 0 0 / 0.35),\n var(--wx-ring-focus);\n}\n\n.wx-color-picker__presets {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n}\n\n.wx-color-picker__preset {\n width: 20px;\n height: 20px;\n padding: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n.wx-color-picker__preset[aria-pressed='true'] {\n box-shadow: 0 0 0 2px var(--wx-color-primary);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { StatisticProps } from './types'\n\ndefineOptions({ name: 'WxStatistic' })\n\nconst props = withDefaults(defineProps<StatisticProps>(), {\n value: undefined,\n title: undefined,\n precision: undefined,\n locale: undefined,\n grouping: true,\n prefix: undefined,\n suffix: undefined,\n formatter: undefined,\n size: 'md',\n tone: 'strong',\n align: undefined,\n})\n\nconst display = computed(() => {\n if (props.formatter) return props.formatter(props.value)\n if (typeof props.value !== 'number') return props.value ?? ''\n\n /*\n * `Intl` rather than a hand-rolled separator: 268 500 in one locale is 268,500 in\n * another, and an admin panel that ships in several languages should not decide.\n */\n return new Intl.NumberFormat(props.locale, {\n useGrouping: props.grouping,\n minimumFractionDigits: props.precision,\n maximumFractionDigits: props.precision,\n }).format(props.value)\n})\n\nconst classes = computed(() => [\n 'wx-statistic',\n `wx-statistic--${props.size}`,\n `wx-statistic--tone-${props.tone}`,\n { [`wx-statistic--align-${props.align}`]: Boolean(props.align) },\n])\n</script>\n\n<template>\n <div :class=\"classes\">\n <div v-if=\"title || $slots.title\" class=\"wx-statistic__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <div class=\"wx-statistic__value\">\n <span v-if=\"prefix || $slots.prefix\" class=\"wx-statistic__affix\">\n <slot name=\"prefix\">{{ prefix }}</slot>\n </span>\n\n <span class=\"wx-statistic__number\">\n <slot name=\"value\">{{ display }}</slot>\n </span>\n\n <span v-if=\"suffix || $slots.suffix\" class=\"wx-statistic__affix\">\n <slot name=\"suffix\">{{ suffix }}</slot>\n </span>\n </div>\n\n <div v-if=\"$slots.default\" class=\"wx-statistic__footer\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-statistic {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-statistic--align-center {\n text-align: center;\n align-items: center;\n}\n\n.wx-statistic--align-end {\n text-align: end;\n align-items: flex-end;\n}\n\n.wx-statistic--align-start {\n text-align: start;\n align-items: flex-start;\n}\n\n.wx-statistic--align-justify {\n text-align: justify;\n}\n\n.wx-statistic__title {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-statistic--sm .wx-statistic__title {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-statistic__value {\n display: flex;\n align-items: baseline;\n gap: var(--wx-space-4);\n color: var(--wx-statistic-color, var(--wx-text-strong));\n /* Digits of equal width, so a ticking number does not jitter. */\n font-variant-numeric: tabular-nums;\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-statistic--sm .wx-statistic__value {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-statistic--md .wx-statistic__value {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-statistic--lg .wx-statistic__value {\n font-size: var(--wx-font-size-3xl);\n}\n\n.wx-statistic__number {\n min-width: 0;\n}\n\n.wx-statistic__affix {\n color: var(--wx-text-muted);\n font-size: 0.65em;\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-statistic__footer {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n/* tones */\n.wx-statistic--tone-default {\n --wx-statistic-color: var(--wx-text-default);\n}\n\n.wx-statistic--tone-strong {\n --wx-statistic-color: var(--wx-text-strong);\n}\n\n.wx-statistic--tone-muted {\n --wx-statistic-color: var(--wx-text-muted);\n}\n\n.wx-statistic--tone-placeholder {\n --wx-statistic-color: var(--wx-text-placeholder);\n}\n\n.wx-statistic--tone-primary {\n --wx-statistic-color: var(--wx-color-primary);\n}\n\n.wx-statistic--tone-success {\n --wx-statistic-color: var(--wx-color-success-active);\n}\n\n.wx-statistic--tone-warning {\n --wx-statistic-color: var(--wx-color-warning-active);\n}\n\n.wx-statistic--tone-danger {\n --wx-statistic-color: var(--wx-color-danger);\n}\n\n.wx-statistic--tone-info {\n --wx-statistic-color: var(--wx-color-info-active);\n}\n\n.wx-statistic--tone-inverse {\n --wx-statistic-color: var(--wx-text-inverse);\n}\n</style>\n","import type { CountdownTarget } from './types'\n\n/** Largest unit first: each token takes its share of what the previous ones left. */\nconst units: [token: string, ms: number][] = [\n ['DD', 86_400_000],\n ['HH', 3_600_000],\n ['mm', 60_000],\n ['ss', 1_000],\n ['SSS', 1],\n]\n\n/**\n * Renders a span of milliseconds against a pattern of `DD`, `HH`, `mm`, `ss`, `SSS`.\n *\n * Only the tokens the pattern actually contains consume time, so `mm:ss` on two hours\n * prints `120:00` rather than silently dropping the hours. Everything else in the\n * pattern is copied through — mind that a literal word containing a token (`ss` in\n * \"passed\") would be replaced.\n */\nexport function formatCountdown(ms: number, format = 'HH:mm:ss'): string {\n let remaining = Math.max(0, Math.floor(ms))\n let out = format\n\n for (const [token, unit] of units) {\n if (!out.includes(token)) continue\n const value = Math.floor(remaining / unit)\n remaining -= value * unit\n out = out.replace(token, String(value).padStart(token.length, '0'))\n }\n\n return out\n}\n\n/** Normalises whatever the caller passed as a target into a timestamp. */\nexport function toTimestamp(value: CountdownTarget): number {\n if (typeof value === 'number') return value\n if (value instanceof Date) return value.getTime()\n const parsed = Date.parse(value)\n return Number.isNaN(parsed) ? 0 : parsed\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport WxStatistic from '../Statistic/Statistic.vue'\nimport { formatCountdown, toTimestamp } from './format'\nimport type { CountdownEmits, CountdownProps } from './types'\n\ndefineOptions({ name: 'WxCountdown' })\n\nconst props = withDefaults(defineProps<CountdownProps>(), {\n format: 'HH:mm:ss',\n interval: 1000,\n title: undefined,\n prefix: undefined,\n suffix: undefined,\n size: 'md',\n tone: 'strong',\n align: undefined,\n})\n\nconst emit = defineEmits<CountdownEmits>()\n\nconst target = computed(() => toTimestamp(props.value))\nconst remaining = ref(Math.max(0, target.value - Date.now()))\n\nlet timer: ReturnType<typeof setInterval> | undefined\n\nfunction stop() {\n if (timer === undefined) return\n clearInterval(timer)\n timer = undefined\n}\n\nfunction tick() {\n const left = Math.max(0, target.value - Date.now())\n remaining.value = left\n emit('change', left)\n\n /* `finish` fires once: the timer stops before the next tick can repeat it. */\n if (left === 0) {\n stop()\n emit('finish')\n }\n}\n\nfunction start() {\n stop()\n if (remaining.value === 0) return\n timer = setInterval(tick, Math.max(16, props.interval))\n}\n\n/*\n * A new target — or a new tick rate — restarts the clock rather than letting it\n * drift. The value is recomputed either way; the timer only exists once the\n * component is mounted, which is what keeps it off the server: an interval started\n * during SSR is never cleared, and it holds the render process open forever.\n */\nlet running = false\n\nwatch(\n [target, () => props.interval],\n () => {\n remaining.value = Math.max(0, target.value - Date.now())\n if (running) start()\n },\n { immediate: true },\n)\n\nonMounted(() => {\n running = true\n start()\n})\n\nonBeforeUnmount(() => {\n running = false\n stop()\n})\n\nconst text = computed(() => formatCountdown(remaining.value, props.format))\n\ndefineExpose({ remaining })\n</script>\n\n<template>\n <wx-statistic\n class=\"wx-countdown\"\n :value=\"text\"\n :title=\"title\"\n :prefix=\"prefix\"\n :suffix=\"suffix\"\n :size=\"size\"\n :tone=\"tone\"\n :align=\"align\"\n >\n <template v-if=\"$slots.title\" #title><slot name=\"title\" /></template>\n <template v-if=\"$slots.prefix\" #prefix><slot name=\"prefix\" /></template>\n <template v-if=\"$slots.suffix\" #suffix><slot name=\"suffix\" /></template>\n <template v-if=\"$slots.value\" #value\n ><slot name=\"value\" :remaining=\"remaining\" :text=\"text\"\n /></template>\n <template v-if=\"$slots.default\" #default><slot /></template>\n </wx-statistic>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { VueDatePicker } from '@vuepic/vue-datepicker'\nimport { useFormField } from '../../composables/useFormField'\nimport '../../styles/datepicker.css'\nimport type { DatePickerEmits, DatePickerModelValue, DatePickerProps } from './types'\n\ndefineOptions({ name: 'WxDatePicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DatePickerProps>(), {\n type: 'date',\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: true,\n minDate: undefined,\n maxDate: undefined,\n seconds: false,\n minutesIncrement: 1,\n is24: true,\n weekStart: 1,\n autoApply: true,\n textInput: false,\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DatePickerEmits>()\n\n/*\n * Every slot is passed straight through to the underlying picker, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates `$slots`, and TypeScript answers that circle by emitting `any` — which\n * takes the props of this component down with it.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst hasTime = computed(() => props.type !== 'date')\n\n/**\n * What the model holds. Defaults match the column types a Laravel migration\n * produces, so the value can go to the API untouched; `'date'` opts out and keeps\n * `Date` objects.\n */\nconst modelType = computed(() => {\n if (props.valueFormat === 'date') return undefined\n if (props.valueFormat) return props.valueFormat\n if (props.type === 'time') return props.seconds ? 'HH:mm:ss' : 'HH:mm'\n if (props.type === 'datetime') return props.seconds ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd HH:mm'\n return 'yyyy-MM-dd'\n})\n\n/** What the field shows. Day-first, because this kit is aimed at European admins. */\nconst displayFormat = computed(() => {\n if (props.format) return props.format\n const time = props.seconds ? 'HH:mm:ss' : 'HH:mm'\n if (props.type === 'time') return time\n if (props.type === 'datetime') return `dd.MM.yyyy ${time}`\n return 'dd.MM.yyyy'\n})\n\n/**\n * The overlay is sized to a calendar (`modeHeight`, 255 by default) so switching\n * between panes does not resize the menu. A time-only picker has no calendar to\n * match, and the default leaves ~150px of empty space around the columns.\n */\nconst config = computed(() => (props.type === 'time' ? { modeHeight: 125 } : undefined))\n\nconst timeConfig = computed(() => ({\n enableTimePicker: hasTime.value,\n enableSeconds: props.seconds,\n is24: props.is24,\n minutesIncrement: props.minutesIncrement,\n}))\n\nconst inputAttrs = computed(() => ({\n id: field.id.value,\n name: props.name,\n clearable: props.clearable,\n // The library reads `state: false` as invalid; leaving it undefined means neutral.\n state: field.status.value === 'error' ? false : undefined,\n 'aria-label': props.ariaLabel,\n 'aria-describedby': field.describedBy.value,\n}))\n\nconst classes = computed(() => [\n 'wx-datepicker',\n `wx-datepicker--${field.size.value}`,\n {\n [`wx-datepicker--${field.status.value}`]: field.status.value !== 'default',\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction onUpdate(value: DatePickerModelValue) {\n model.value = value\n emit('change', value)\n}\n\nfunction onCleared() {\n model.value = null\n emit('change', null)\n emit('clear')\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <vue-date-picker\n :model-value=\"model\"\n :model-type=\"modelType\"\n :formats=\"{ input: displayFormat }\"\n :time-picker=\"type === 'time'\"\n :time-config=\"timeConfig\"\n :config=\"config\"\n :input-attrs=\"inputAttrs\"\n :ui=\"{ input: 'wx-datepicker__input', menu: 'wx-datepicker__menu' }\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :week-start=\"weekStart\"\n :auto-apply=\"autoApply\"\n :text-input=\"textInput\"\n :teleport=\"teleport\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n v-bind=\"$attrs\"\n @update:model-value=\"onUpdate\"\n @cleared=\"onCleared\"\n @open=\"emit('open')\"\n @closed=\"emit('close')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </vue-date-picker>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { VueDatePicker } from '@vuepic/vue-datepicker'\nimport { useFormField } from '../../composables/useFormField'\nimport '../../styles/datepicker.css'\nimport type { DateRangePickerEmits, DateRangePickerModelValue, DateRangePickerProps } from './types'\n\ndefineOptions({ name: 'WxDateRangePicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DateRangePickerProps>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: true,\n minDate: undefined,\n maxDate: undefined,\n months: 2,\n weekStart: 1,\n autoApply: true,\n textInput: false,\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DateRangePickerEmits>()\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DateRangePickerModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst modelType = computed(() =>\n props.valueFormat === 'date' ? undefined : (props.valueFormat ?? 'yyyy-MM-dd'),\n)\nconst displayFormat = computed(() => props.format ?? 'dd.MM.yyyy')\n\nconst inputAttrs = computed(() => ({\n id: field.id.value,\n name: props.name,\n clearable: props.clearable,\n state: field.status.value === 'error' ? false : undefined,\n 'aria-label': props.ariaLabel,\n 'aria-describedby': field.describedBy.value,\n}))\n\nconst classes = computed(() => [\n 'wx-datepicker',\n 'wx-datepicker--range',\n `wx-datepicker--${field.size.value}`,\n {\n [`wx-datepicker--${field.status.value}`]: field.status.value !== 'default',\n 'is-disabled': field.disabled.value,\n },\n])\n\n/** The library hands back `null` while only the first date has been picked. */\nfunction onUpdate(value: DateRangePickerModelValue) {\n model.value = value\n emit('change', value)\n}\n\nfunction onCleared() {\n model.value = null\n emit('change', null)\n emit('clear')\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <vue-date-picker\n range\n :model-value=\"model\"\n :model-type=\"modelType\"\n :formats=\"{ input: displayFormat }\"\n :multi-calendars=\"months\"\n :input-attrs=\"inputAttrs\"\n :ui=\"{ input: 'wx-datepicker__input', menu: 'wx-datepicker__menu' }\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :week-start=\"weekStart\"\n :auto-apply=\"autoApply\"\n :text-input=\"textInput\"\n :teleport=\"teleport\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n v-bind=\"$attrs\"\n @update:model-value=\"onUpdate\"\n @cleared=\"onCleared\"\n @open=\"emit('open')\"\n @closed=\"emit('close')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </vue-date-picker>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport WxDatePicker from '../DatePicker/DatePicker.vue'\nimport type { DatePickerModelValue, DatePickerProps } from '../DatePicker/types'\n\ndefineOptions({ name: 'WxDateTimePicker' })\n\n/**\n * Every prop defaults to `undefined` on purpose. Vue casts an absent boolean prop\n * to `false`, and this preset forwards its whole prop object — without these the\n * preset would hand `WxDatePicker` an explicit `false` for `is24`, `clearable`,\n * `autoApply` and `teleport`, overriding that component's own defaults. Passing\n * `undefined` lets each default apply as if the prop had never been written.\n */\nwithDefaults(defineProps<Omit<DatePickerProps, 'type'>>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: undefined,\n minDate: undefined,\n maxDate: undefined,\n seconds: undefined,\n minutesIncrement: undefined,\n is24: undefined,\n weekStart: undefined,\n autoApply: undefined,\n textInput: undefined,\n teleport: undefined,\n disabled: undefined,\n readonly: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n</script>\n\n<template>\n <wx-date-picker v-model=\"model\" type=\"datetime\" v-bind=\"$props\">\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </wx-date-picker>\n</template>\n","/**\n * The pieces `WxDialog` and `WxDrawer` have in common: both take a size in pixels or\n * per cent, both can be dragged to a new one, and both can be told to remember it.\n */\n\n/** A number is pixels, however it arrives — `width=\"520\"` in a template is a string. */\nexport function cssLength(value: number | string | undefined): string | undefined {\n if (value === undefined || value === null || value === '') return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? `${value}px` : undefined\n\n const trimmed = value.trim()\n return /^-?\\d+(\\.\\d+)?$/.test(trimmed) ? `${trimmed}px` : trimmed\n}\n\n/**\n * The pixels behind a size prop, when there are any — `'60%'` has none, and a gesture\n * that starts on such a panel has to measure it instead.\n */\nexport function pixelLength(value: number | string | undefined): number | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string') return undefined\n\n const trimmed = value.trim()\n if (!/^-?\\d+(\\.\\d+)?(px)?$/.test(trimmed)) return undefined\n return Number.parseFloat(trimmed)\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), Math.max(min, max))\n}\n\nexport interface PanelMemory<T> {\n read: () => Partial<T> | null\n write: (value: T) => void\n clear: () => void\n}\n\n/**\n * `localStorage`, with every way it can fail treated the same way: remembering a panel's\n * size is a convenience, and a private window or a full quota only costs the default.\n */\nexport function usePanelMemory<T>(prefix: string, key: () => string | undefined): PanelMemory<T> {\n const storageKey = () => {\n const name = key()\n return name ? prefix + name : null\n }\n\n return {\n read() {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(id)\n return raw ? (JSON.parse(raw) as Partial<T>) : null\n } catch {\n // Unavailable, or holding something we did not write.\n return null\n }\n },\n write(value: T) {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return\n try {\n window.localStorage.setItem(id, JSON.stringify(value))\n } catch {\n // A private window or a full quota.\n }\n },\n clear() {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(id)\n } catch {\n // Nothing to undo if it cannot be removed.\n }\n },\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport {\n DialogClose,\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { clamp, cssLength, pixelLength, usePanelMemory } from '../../composables/useOverlayPanel'\nimport type { DialogEmits, DialogLayout, DialogProps } from './types'\n\ndefineOptions({ name: 'WxDialog', inheritAttrs: false })\n\n/*\n * A window over the page: a heading with its actions, a body that scrolls, a row of\n * buttons under it. `WxDrawer` is the same panel anchored to an edge of the screen —\n * reach for that one when what is behind it has to stay visible.\n *\n * What has no appearance of its own — the focus trap, the scroll lock, Escape, the\n * portal, `aria-modal` — comes from Reka's dialog primitive. Everything that can be\n * seen is ours.\n */\nconst props = withDefaults(defineProps<DialogProps>(), {\n title: undefined,\n width: 520,\n height: undefined,\n scroll: 'body',\n stickyFooter: true,\n minWidth: 320,\n minHeight: 200,\n sidebarWidth: 200,\n closable: true,\n closeLabel: 'Close',\n closeOnOverlay: true,\n closeOnEscape: true,\n overlay: true,\n modal: true,\n draggable: false,\n resizable: false,\n persist: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DialogEmits>()\n\ndefineSlots<{\n /** The control that opens the panel. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The body. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** Next to the heading — badges, or actions that belong to the whole panel. */\n extra?: (props: { close: () => void }) => unknown\n /** A column beside the body. Its presence is what splits the body in two. */\n sidebar?: (props: { close: () => void }) => unknown\n /** A row under the body — where the Save and Cancel go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nconst hasTitle = computed(() => Boolean(props.title || slots.title))\nconst hasHead = computed(() => Boolean(hasTitle.value || slots.extra || props.closable))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\n/* Reka needs a `DialogTitle` to name the panel; without a visible one it is hidden. */\nconst accessibleName = computed(() => props.title ?? props.ariaLabel ?? 'Dialog')\n\n/*\n * A panel taller than the screen is not a panel that can be moved or stretched: the\n * gesture would fight the scroll it sits in, and there is no free space around it to move\n * into. Both are ignored rather than refused, so one prop can turn a dialog into the long\n * kind without having to unpick the rest.\n */\nconst scrollsInPlace = computed(() => props.scroll === 'body')\nconst movable = computed(() => props.draggable && scrollsInPlace.value)\nconst sizable = computed(() => props.resizable && scrollsInPlace.value)\n\n/** Pixels the panel was last left at. Empty until it is dragged, resized or restored. */\nconst layout = ref<DialogLayout>({})\n\nconst memory = usePanelMemory<DialogLayout>('wx-dialog:', () => props.persist)\n\n/*\n * Sizes travel as custom properties rather than as `width` and `height`: the small-screen\n * rules then override them by being a later rule, instead of having to out-shout an\n * inline style with `!important`.\n */\nconst panelVars = computed(() => {\n const vars: Record<string, string> = {}\n\n const width = layout.value.width != null ? `${layout.value.width}px` : cssLength(props.width)\n if (width) vars['--wx-dialog-width'] = width\n\n const height = layout.value.height != null ? `${layout.value.height}px` : cssLength(props.height)\n if (height) vars['--wx-dialog-height'] = height\n\n if (layout.value.x) vars['--wx-dialog-x'] = `${layout.value.x}px`\n if (layout.value.y) vars['--wx-dialog-y'] = `${layout.value.y}px`\n\n const sidebar = cssLength(props.sidebarWidth)\n if (sidebar) vars['--wx-dialog-sidebar-width'] = sidebar\n\n return vars\n})\n\nconst panel = ref<HTMLElement | null>(null)\nconst dragging = ref(false)\nconst resizing = ref(false)\n\n/** The panel as it stood when the pointer went down, so every move is measured once. */\ninterface Gesture {\n kind: 'move' | 'resize'\n pointerX: number\n pointerY: number\n left: number\n top: number\n width: number\n height: number\n x: number\n y: number\n}\n\nlet gesture: Gesture | null = null\n\n/** Room left around the panel when a resize runs into the edge of the screen. */\nconst GUTTER = 32\n\nfunction begin(kind: 'move' | 'resize', event: PointerEvent) {\n /*\n * Touch is left out on purpose: a finger dragging the heading is a finger not\n * scrolling, and on a screen that small the panel fills it anyway.\n */\n if (event.button !== 0 || event.pointerType === 'touch') return\n\n const element = panel.value\n if (!element) return\n\n const rect = element.getBoundingClientRect()\n\n gesture = {\n kind,\n pointerX: event.clientX,\n pointerY: event.clientY,\n left: rect.left,\n top: rect.top,\n /* A panel sized in per cent has no pixels of its own until it is measured. */\n width: rect.width || layout.value.width || pixelLength(props.width) || props.minWidth,\n height: rect.height || layout.value.height || pixelLength(props.height) || props.minHeight,\n x: layout.value.x ?? 0,\n y: layout.value.y ?? 0,\n }\n\n if (kind === 'move') dragging.value = true\n else resizing.value = true\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', end)\n window.addEventListener('pointercancel', end)\n event.preventDefault()\n}\n\nfunction startDrag(event: PointerEvent) {\n if (!movable.value) return\n /* The heading holds the × and whatever `extra` put there; those keep their clicks. */\n const target = event.target as HTMLElement | null\n if (target?.closest('button, a, input, select, textarea, [contenteditable]')) return\n begin('move', event)\n}\n\nfunction startResize(event: PointerEvent) {\n if (!sizable.value) return\n begin('resize', event)\n}\n\nfunction move(event: PointerEvent) {\n if (!gesture) return\n\n const dx = event.clientX - gesture.pointerX\n const dy = event.clientY - gesture.pointerY\n\n if (gesture.kind === 'move') {\n /* Held by its own edges, so the panel cannot be dragged off the screen. */\n const left = clamp(gesture.left + dx, 0, window.innerWidth - gesture.width)\n const top = clamp(gesture.top + dy, 0, window.innerHeight - gesture.height)\n\n layout.value = {\n ...layout.value,\n x: gesture.x + (left - gesture.left),\n y: gesture.y + (top - gesture.top),\n }\n return\n }\n\n const width = clamp(gesture.width + dx, props.minWidth, window.innerWidth - GUTTER)\n const height = clamp(gesture.height + dy, props.minHeight, window.innerHeight - GUTTER)\n\n /*\n * The panel is centred, so it grows by half in each direction. Shifting it by that\n * half pins the top-left corner and leaves only the one under the pointer moving.\n */\n layout.value = {\n width,\n height,\n x: gesture.x + (width - gesture.width) / 2,\n y: gesture.y + (height - gesture.height) / 2,\n }\n}\n\nfunction stopListening() {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', end)\n window.removeEventListener('pointercancel', end)\n}\n\nfunction end() {\n if (!gesture) return\n\n gesture = null\n dragging.value = false\n resizing.value = false\n stopListening()\n\n memory.write(layout.value)\n emit('layout', { ...layout.value })\n}\n\n/** Back to the declared size, in the middle of the screen, and forgotten. */\nfunction reset() {\n layout.value = {}\n memory.clear()\n}\n\nfunction restore() {\n const saved = memory.read()\n if (!saved) return\n\n const next: DialogLayout = {}\n for (const key of ['width', 'height', 'x', 'y'] as const) {\n const value = saved[key]\n if (typeof value === 'number' && Number.isFinite(value)) next[key] = value\n }\n layout.value = next\n}\n\n/*\n * After mount rather than during setup: this renders on a server too, and a panel sized\n * from one machine's `localStorage` would not match the markup the browser hydrates.\n */\nonMounted(restore)\nonBeforeUnmount(stopListening)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n\n emit('close')\n /* Without a key to remember it by, every opening starts from the declared size. */\n if (!props.persist) layout.value = {}\n})\n\nfunction onEscape(event: Event) {\n if (!props.closeOnEscape) event.preventDefault()\n}\n\nfunction onInteractOutside(event: Event) {\n if (!props.closeOnOverlay) event.preventDefault()\n}\n\n/*\n * The wrapper covers the screen, so a click beside the panel is a click inside the\n * dialog as far as Reka is concerned — and in modal mode it gives the wrapper its own\n * `pointer-events: auto`, which the overlay underneath can then never be handed. The\n * space around the panel is therefore closed here, by the element that receives it.\n */\nfunction onViewportPointerDown() {\n if (props.closeOnOverlay) close()\n}\n\ndefineExpose({ close, reset })\n</script>\n\n<template>\n <dialog-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, a menu item,\n a row in a table — and wrapping it in a button of ours would nest one inside another.\n -->\n <dialog-trigger v-if=\"$slots.trigger\" as-child>\n <slot name=\"trigger\" :open=\"open\" />\n </dialog-trigger>\n\n <dialog-portal>\n <dialog-overlay v-if=\"overlay\" class=\"wx-dialog__overlay\" />\n\n <!--\n The content element covers the screen: it centres the panel and gives it room to\n be dragged in. `aria-describedby` is cleared because there is no description —\n Reka warns about a missing one otherwise.\n -->\n <dialog-content\n class=\"wx-dialog__viewport\"\n :class=\"{ 'wx-dialog__viewport--scrolls': !scrollsInPlace }\"\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"onInteractOutside\"\n @mousedown.self=\"onViewportPointerDown\"\n >\n <div\n ref=\"panel\"\n v-bind=\"$attrs\"\n class=\"wx-dialog\"\n :class=\"{\n 'wx-dialog--draggable': movable,\n 'wx-dialog--dragging': dragging,\n 'wx-dialog--resizing': resizing,\n 'wx-dialog--split': hasSidebar,\n 'wx-dialog--long': !scrollsInPlace,\n 'wx-dialog--sticky-foot': !scrollsInPlace && stickyFooter,\n }\"\n :style=\"panelVars\"\n >\n <header v-if=\"hasHead\" class=\"wx-dialog__head\" @pointerdown=\"startDrag\">\n <dialog-title class=\"wx-dialog__title\" :class=\"{ 'wx-sr-only': !hasTitle }\">\n <slot name=\"title\">{{ hasTitle ? title : accessibleName }}</slot>\n </dialog-title>\n\n <div v-if=\"$slots.extra\" class=\"wx-dialog__extra\">\n <slot name=\"extra\" :close=\"close\" />\n </div>\n\n <dialog-close v-if=\"closable\" class=\"wx-dialog__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </dialog-close>\n </header>\n\n <dialog-title v-else class=\"wx-sr-only\">{{ accessibleName }}</dialog-title>\n\n <div class=\"wx-dialog__body\">\n <aside v-if=\"hasSidebar\" class=\"wx-dialog__sidebar\">\n <slot name=\"sidebar\" :close=\"close\" />\n </aside>\n\n <div class=\"wx-dialog__content\">\n <slot :close=\"close\" />\n </div>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-dialog__foot\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <!-- Pointer-only, and hidden with it: a corner this size cannot be hit by a finger. -->\n <div\n v-if=\"sizable\"\n class=\"wx-dialog__grip\"\n aria-hidden=\"true\"\n @pointerdown=\"startResize\"\n />\n </div>\n </dialog-content>\n </dialog-portal>\n </dialog-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-dialog__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-overlay);\n background: var(--wx-bg-overlay);\n}\n\n.wx-dialog__viewport {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-dialog);\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n padding: var(--wx-space-16);\n /*\n * The wrapper only places the panel. Left to itself it would swallow every click\n * beside it, so it lets them through to the overlay — except in modal mode, where Reka\n * writes `pointer-events: auto` back onto it and the wrapper closes the dialog itself.\n */\n pointer-events: none;\n}\n\n/* Reka focuses the content when it opens; the ring belongs on what is inside it. */\n.wx-dialog__viewport:focus,\n.wx-dialog__viewport:focus-visible {\n outline: none;\n}\n\n.wx-dialog {\n /* One set of paddings for the three parts, so the small screens can halve them once. */\n --wx-dialog-pad-x: var(--wx-space-18);\n --wx-dialog-pad-y: var(--wx-space-14);\n --wx-dialog-body-pad: var(--wx-space-18);\n position: relative;\n pointer-events: auto;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: min(var(--wx-dialog-width, 520px), 100%);\n height: var(--wx-dialog-height, auto);\n max-height: 100%;\n translate: var(--wx-dialog-x, 0) var(--wx-dialog-y, 0);\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-md);\n box-shadow: var(--wx-shadow-dialog);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-dialog__head {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-dialog--draggable .wx-dialog__head {\n cursor: grab;\n user-select: none;\n}\n\n.wx-dialog--dragging .wx-dialog__head {\n cursor: grabbing;\n}\n\n/* A gesture that strays over the body would otherwise paint it blue as it goes. */\n.wx-dialog--dragging,\n.wx-dialog--resizing {\n user-select: none;\n}\n\n.wx-dialog__title {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-dialog__extra {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n.wx-dialog__close {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin-right: -6px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-dialog__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-dialog__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The body is the only part that scrolls, so the heading and the buttons stay put however\n * long the content is. Split in two, each column scrolls on its own instead.\n */\n.wx-dialog__body {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n overflow: hidden;\n}\n\n.wx-dialog__content {\n flex: 1 1 auto;\n min-width: 0;\n overflow: auto;\n padding: var(--wx-dialog-body-pad);\n}\n\n.wx-dialog__sidebar {\n flex: 0 0 auto;\n width: var(--wx-dialog-sidebar-width, 200px);\n overflow: auto;\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n background: var(--wx-bg-subtle);\n border-right: 1px solid var(--wx-border-muted);\n border-bottom-left-radius: var(--wx-radius-md);\n}\n\n.wx-dialog__foot {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n border-top: 1px solid var(--wx-border-muted);\n}\n\n/*\n * The long kind: the panel is as tall as its content and the wrapper around it scrolls.\n * `margin: auto` rather than `align-items: center` — a centred flex item taller than its\n * container is clipped at the top and cannot be scrolled back to, while an auto margin\n * simply gives up when there is no room left to share.\n */\n.wx-dialog__viewport--scrolls {\n align-items: flex-start;\n overflow-y: auto;\n /* The wrapper is the scroller now, so it has to take its own events. */\n pointer-events: auto;\n}\n\n.wx-dialog--long {\n height: auto;\n max-height: none;\n margin-block: auto;\n translate: none;\n}\n\n.wx-dialog--long .wx-dialog__body,\n.wx-dialog--long .wx-dialog__content,\n.wx-dialog--long .wx-dialog__sidebar {\n overflow: visible;\n}\n\n/*\n * Stuck to the bottom of the screen while the rest of the panel scrolls past it. The\n * background is what makes it a bar rather than a transparent strip over the content, and\n * the rounded corners are the panel's own, borrowed for the moment it rests on them.\n */\n.wx-dialog--long.wx-dialog--sticky-foot .wx-dialog__foot {\n position: sticky;\n bottom: 0;\n z-index: 1;\n background: var(--wx-bg-surface);\n border-bottom-left-radius: var(--wx-radius-md);\n border-bottom-right-radius: var(--wx-radius-md);\n}\n\n.wx-dialog__grip {\n position: absolute;\n right: 0;\n bottom: 0;\n width: 20px;\n height: 20px;\n cursor: nwse-resize;\n touch-action: none;\n}\n\n.wx-dialog__grip::after {\n content: '';\n position: absolute;\n right: 5px;\n bottom: 5px;\n width: 7px;\n height: 7px;\n border-right: 2px solid var(--wx-border-strong);\n border-bottom: 2px solid var(--wx-border-strong);\n opacity: 0.5;\n}\n\n.wx-dialog__grip:hover::after {\n opacity: 1;\n}\n\n@keyframes wx-dialog-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.97);\n }\n}\n\n@keyframes wx-dialog-out {\n to {\n opacity: 0;\n transform: scale(0.98);\n }\n}\n\n@keyframes wx-dialog-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes wx-dialog-fade-out {\n to {\n opacity: 0;\n }\n}\n\n/*\n * The wrapper is what animates, not the panel inside it: Reka waits for the animation on\n * the element it owns before unmounting, and a centred panel scaled from the middle of\n * the screen is a panel scaled from its own middle.\n */\n.wx-dialog__viewport[data-state='open'] {\n animation: wx-dialog-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-dialog__viewport[data-state='closed'] {\n animation: wx-dialog-out var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-dialog__overlay[data-state='open'] {\n animation: wx-dialog-fade-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-dialog__overlay[data-state='closed'] {\n animation: wx-dialog-fade-out var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n/*\n * Small screens: the panel takes what there is, and the remembered size and position go\n * with it — a dialog dragged into a corner on a desktop must not open half off a phone.\n */\n@media (max-width: 640px) {\n .wx-dialog__viewport {\n padding: var(--wx-space-8);\n }\n\n .wx-dialog {\n /* Tighter than on a desktop: every pixel of padding is a line of content lost. */\n --wx-dialog-pad-x: var(--wx-space-12);\n --wx-dialog-pad-y: var(--wx-space-10);\n --wx-dialog-body-pad: var(--wx-space-12);\n width: 100%;\n height: auto;\n translate: none;\n }\n\n .wx-dialog__head {\n gap: var(--wx-space-8);\n }\n\n .wx-dialog--split .wx-dialog__body {\n flex-direction: column;\n overflow: auto;\n }\n\n .wx-dialog--split .wx-dialog__sidebar,\n .wx-dialog--split .wx-dialog__content {\n overflow: visible;\n }\n\n .wx-dialog__sidebar {\n width: auto;\n border-right: none;\n border-bottom: 1px solid var(--wx-border-muted);\n border-radius: 0;\n }\n}\n\n/* Nothing here can be aimed at with a finger. */\n@media (pointer: coarse) {\n .wx-dialog__grip {\n display: none;\n }\n\n .wx-dialog--draggable .wx-dialog__head {\n cursor: default;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-dialog__viewport,\n .wx-dialog__overlay {\n animation: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport {\n DialogClose,\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { clamp, cssLength, pixelLength, usePanelMemory } from '../../composables/useOverlayPanel'\nimport type { DrawerEmits, DrawerLayout, DrawerProps } from './types'\n\ndefineOptions({ name: 'WxDrawer', inheritAttrs: false })\n\n/*\n * The same panel as `WxDialog` — heading, body, footer — anchored to an edge of the\n * screen instead of floating in the middle of it. It is the one to reach for when the\n * page behind it is the point: a record opened beside the table it came from.\n *\n * The dialog primitive underneath is Reka's, so the focus trap, the scroll lock, Escape\n * and `aria-modal` are the same as everywhere else. What can be seen is ours.\n */\nconst props = withDefaults(defineProps<DrawerProps>(), {\n title: undefined,\n side: 'right',\n size: 380,\n minSize: 280,\n sidebarWidth: 200,\n closable: true,\n closeLabel: 'Close',\n closeOnOverlay: true,\n closeOnEscape: true,\n overlay: true,\n modal: true,\n resizable: false,\n persist: undefined,\n ariaLabel: undefined,\n resizeLabel: 'Resize the panel',\n})\n\nconst emit = defineEmits<DrawerEmits>()\n\ndefineSlots<{\n /** The control that opens the panel. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The body. The one part of the panel that scrolls. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** Next to the heading — badges, or actions that belong to the whole panel. */\n extra?: (props: { close: () => void }) => unknown\n /** A column beside the body. Its presence is what splits the body in two. */\n sidebar?: (props: { close: () => void }) => unknown\n /** A row under the body — where the Save and Cancel go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nconst hasTitle = computed(() => Boolean(props.title || slots.title))\nconst hasHead = computed(() => Boolean(hasTitle.value || slots.extra || props.closable))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\n/* Reka needs a `DialogTitle` to name the panel; without a visible one it is hidden. */\nconst accessibleName = computed(() => props.title ?? props.ariaLabel ?? 'Panel')\n\n/** Which way the panel grows: across the screen, or down it. */\nconst horizontal = computed(() => props.side === 'left' || props.side === 'right')\n\n/** Pixels the panel was last left at. Empty until it is resized or restored. */\nconst layout = ref<DrawerLayout>({})\n\nconst memory = usePanelMemory<DrawerLayout>('wx-drawer:', () => props.persist)\n\n/*\n * The size travels as a custom property rather than as `width` or `height`: the\n * small-screen rule then takes the panel full-screen by being a later rule, instead of\n * having to out-shout an inline style with `!important`.\n */\nconst panelVars = computed(() => {\n const vars: Record<string, string> = {}\n\n const size = layout.value.size != null ? `${layout.value.size}px` : cssLength(props.size)\n if (size) vars['--wx-drawer-size'] = size\n\n const sidebar = cssLength(props.sidebarWidth)\n if (sidebar) vars['--wx-drawer-sidebar-width'] = sidebar\n\n return vars\n})\n\nconst resizing = ref(false)\n\n/** Room left between the panel and the far edge of the screen. */\nconst GUTTER = 32\n\n/** The panel as it stood when the gesture began, so every move is measured once. */\nlet gesture: { pointerX: number; pointerY: number; size: number } | null = null\n\n/**\n * The panel around the handle. Taken from the event rather than from a template ref: the\n * panel is a Reka component, and what a ref on one holds is the component, not the box\n * that has to be measured.\n */\nfunction panelOf(event: Event): HTMLElement | null {\n return (event.currentTarget as HTMLElement | null)?.closest('.wx-drawer') ?? null\n}\n\n/** What the panel measures now, falling back to what it was told to be. */\nfunction currentSize(element: HTMLElement | null): number {\n const rect = element?.getBoundingClientRect()\n const measured = horizontal.value ? rect?.width : rect?.height\n /* A panel sized in per cent has no pixels of its own until it is measured. */\n return measured || layout.value.size || pixelLength(props.size) || props.minSize\n}\n\nfunction maxSize(): number {\n const room = horizontal.value ? window.innerWidth : window.innerHeight\n return room - GUTTER\n}\n\n/** Pointer movement, turned into a size: every side grows towards the middle. */\nfunction sizeFrom(startSize: number, dx: number, dy: number): number {\n const delta =\n props.side === 'right' ? -dx : props.side === 'left' ? dx : props.side === 'top' ? dy : -dy\n return clamp(startSize + delta, props.minSize, maxSize())\n}\n\nfunction startResize(event: PointerEvent) {\n /*\n * Touch is left out on purpose: a handle this narrow cannot be aimed at with a finger,\n * and on a screen that small the panel covers everything anyway.\n */\n if (!props.resizable || event.button !== 0 || event.pointerType === 'touch') return\n\n gesture = { pointerX: event.clientX, pointerY: event.clientY, size: currentSize(panelOf(event)) }\n resizing.value = true\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', end)\n window.addEventListener('pointercancel', end)\n event.preventDefault()\n}\n\nfunction move(event: PointerEvent) {\n if (!gesture) return\n\n layout.value = {\n size: sizeFrom(\n gesture.size,\n event.clientX - gesture.pointerX,\n event.clientY - gesture.pointerY,\n ),\n }\n}\n\nfunction stopListening() {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', end)\n window.removeEventListener('pointercancel', end)\n}\n\nfunction end() {\n if (!gesture) return\n\n gesture = null\n resizing.value = false\n stopListening()\n store()\n}\n\n/** The same resize from the keyboard, which is the only way to reach it without a mouse. */\nconst STEP = 24\n\nfunction onHandleKeydown(event: KeyboardEvent) {\n if (!props.resizable) return\n\n const towards = horizontal.value\n ? { ArrowLeft: -STEP, ArrowRight: STEP }\n : { ArrowUp: -STEP, ArrowDown: STEP }\n const delta = (towards as Record<string, number | undefined>)[event.key]\n if (delta === undefined) return\n\n event.preventDefault()\n const from = currentSize(panelOf(event))\n layout.value = {\n size: sizeFrom(from, horizontal.value ? delta : 0, horizontal.value ? 0 : delta),\n }\n store()\n}\n\nfunction store() {\n memory.write(layout.value)\n emit('layout', { ...layout.value })\n}\n\n/** Back to the declared size, and forgotten. */\nfunction reset() {\n layout.value = {}\n memory.clear()\n}\n\nfunction restore() {\n const saved = memory.read()\n if (!saved) return\n if (typeof saved.size === 'number' && Number.isFinite(saved.size)) {\n layout.value = { size: saved.size }\n }\n}\n\n/*\n * After mount rather than during setup: this renders on a server too, and a panel sized\n * from one machine's `localStorage` would not match the markup the browser hydrates.\n */\nonMounted(restore)\nonBeforeUnmount(stopListening)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n\n emit('close')\n /* Without a key to remember it by, every opening starts from the declared size. */\n if (!props.persist) layout.value = {}\n})\n\nfunction onEscape(event: Event) {\n if (!props.closeOnEscape) event.preventDefault()\n}\n\nfunction onInteractOutside(event: Event) {\n if (!props.closeOnOverlay) event.preventDefault()\n}\n\ndefineExpose({ close, reset })\n</script>\n\n<template>\n <dialog-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, a menu item,\n a row in a table — and wrapping it in a button of ours would nest one inside another.\n -->\n <dialog-trigger v-if=\"$slots.trigger\" as-child>\n <slot name=\"trigger\" :open=\"open\" />\n </dialog-trigger>\n\n <dialog-portal>\n <dialog-overlay v-if=\"overlay\" class=\"wx-drawer__overlay\" />\n\n <!--\n Here the content element is the panel itself — nothing has to be centred, and it\n is the element Reka slides in. `aria-describedby` is cleared because there is no\n description; Reka warns about a missing one otherwise.\n -->\n <dialog-content\n v-bind=\"$attrs\"\n class=\"wx-drawer\"\n :class=\"[\n `wx-drawer--${side}`,\n { 'wx-drawer--resizing': resizing, 'wx-drawer--split': hasSidebar },\n ]\"\n :style=\"panelVars\"\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"onInteractOutside\"\n >\n <header v-if=\"hasHead\" class=\"wx-drawer__head\">\n <dialog-title class=\"wx-drawer__title\" :class=\"{ 'wx-sr-only': !hasTitle }\">\n <slot name=\"title\">{{ hasTitle ? title : accessibleName }}</slot>\n </dialog-title>\n\n <div v-if=\"$slots.extra\" class=\"wx-drawer__extra\">\n <slot name=\"extra\" :close=\"close\" />\n </div>\n\n <dialog-close v-if=\"closable\" class=\"wx-drawer__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </dialog-close>\n </header>\n\n <dialog-title v-else class=\"wx-sr-only\">{{ accessibleName }}</dialog-title>\n\n <div class=\"wx-drawer__body\">\n <aside v-if=\"hasSidebar\" class=\"wx-drawer__sidebar\">\n <slot name=\"sidebar\" :close=\"close\" />\n </aside>\n\n <div class=\"wx-drawer__content\">\n <slot :close=\"close\" />\n </div>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-drawer__foot\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <!--\n A separator rather than a decoration: it takes focus and answers the arrow keys,\n which is the only way to resize the panel without a pointer.\n -->\n <div\n v-if=\"resizable\"\n class=\"wx-drawer__handle\"\n role=\"separator\"\n tabindex=\"0\"\n :aria-label=\"resizeLabel\"\n :aria-orientation=\"horizontal ? 'vertical' : 'horizontal'\"\n @pointerdown=\"startResize\"\n @keydown=\"onHandleKeydown\"\n />\n </dialog-content>\n </dialog-portal>\n </dialog-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-drawer__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-overlay);\n background: var(--wx-bg-overlay);\n}\n\n.wx-drawer {\n /* One set of paddings for the three parts, so the small screens can halve them once. */\n --wx-drawer-pad-x: var(--wx-space-18);\n --wx-drawer-pad-y: var(--wx-space-14);\n --wx-drawer-body-pad: var(--wx-space-18);\n position: fixed;\n z-index: var(--wx-z-index-dialog);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n background: var(--wx-bg-surface);\n box-shadow: var(--wx-shadow-dialog);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-drawer:focus,\n.wx-drawer:focus-visible {\n outline: none;\n}\n\n/*\n * `dvh` rather than `vh`: on a phone the address bar comes and goes, and a panel measured\n * against the taller of the two would keep its footer under it.\n */\n.wx-drawer--left,\n.wx-drawer--right {\n top: 0;\n height: 100dvh;\n width: min(var(--wx-drawer-size, 380px), 100%);\n}\n\n.wx-drawer--right {\n right: 0;\n border-left: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--left {\n left: 0;\n border-right: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--top,\n.wx-drawer--bottom {\n left: 0;\n width: 100%;\n height: min(var(--wx-drawer-size, 380px), 100dvh);\n}\n\n.wx-drawer--top {\n top: 0;\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--bottom {\n bottom: 0;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer__head {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-drawer__title {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-drawer__extra {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n.wx-drawer__close {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin-right: -6px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-drawer__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-drawer__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The body is the only part that scrolls: the heading and the buttons stay where they are\n * however long the content is. Split in two, each column scrolls on its own instead.\n */\n.wx-drawer__body {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n overflow: hidden;\n}\n\n.wx-drawer__content {\n flex: 1 1 auto;\n min-width: 0;\n overflow: auto;\n padding: var(--wx-drawer-body-pad);\n}\n\n.wx-drawer__sidebar {\n flex: 0 0 auto;\n width: var(--wx-drawer-sidebar-width, 200px);\n overflow: auto;\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n background: var(--wx-bg-subtle);\n border-right: 1px solid var(--wx-border-muted);\n}\n\n.wx-drawer__foot {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n border-top: 1px solid var(--wx-border-muted);\n}\n\n/* The handle sits on the edge the panel faces the page with. */\n.wx-drawer__handle {\n position: absolute;\n touch-action: none;\n background: transparent;\n transition: background var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-drawer__handle:hover,\n.wx-drawer--resizing .wx-drawer__handle {\n background: var(--wx-color-primary-soft);\n}\n\n.wx-drawer__handle:focus-visible {\n outline: none;\n background: var(--wx-color-primary);\n}\n\n.wx-drawer--right .wx-drawer__handle,\n.wx-drawer--left .wx-drawer__handle {\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: col-resize;\n}\n\n.wx-drawer--right .wx-drawer__handle {\n left: 0;\n}\n\n.wx-drawer--left .wx-drawer__handle {\n right: 0;\n}\n\n.wx-drawer--top .wx-drawer__handle,\n.wx-drawer--bottom .wx-drawer__handle {\n left: 0;\n right: 0;\n height: 6px;\n cursor: row-resize;\n}\n\n.wx-drawer--top .wx-drawer__handle {\n bottom: 0;\n}\n\n.wx-drawer--bottom .wx-drawer__handle {\n top: 0;\n}\n\n/*\n * One pair of keyframes for all four sides: the side sets where the panel sits when it is\n * off-screen, and `translate` is a property of its own, so nothing here collides with a\n * `transform` set elsewhere.\n */\n.wx-drawer--right {\n --wx-drawer-from: 100% 0;\n}\n\n.wx-drawer--left {\n --wx-drawer-from: -100% 0;\n}\n\n.wx-drawer--top {\n --wx-drawer-from: 0 -100%;\n}\n\n.wx-drawer--bottom {\n --wx-drawer-from: 0 100%;\n}\n\n@keyframes wx-drawer-in {\n from {\n translate: var(--wx-drawer-from);\n }\n}\n\n@keyframes wx-drawer-out {\n to {\n translate: var(--wx-drawer-from);\n }\n}\n\n@keyframes wx-drawer-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes wx-drawer-fade-out {\n to {\n opacity: 0;\n }\n}\n\n.wx-drawer[data-state='open'] {\n animation: wx-drawer-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer[data-state='closed'] {\n animation: wx-drawer-out var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer__overlay[data-state='open'] {\n animation: wx-drawer-fade-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer__overlay[data-state='closed'] {\n animation: wx-drawer-fade-out var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n/*\n * Small screens: a panel that leaves a strip of the page visible is a panel too narrow to\n * work in, so it takes the whole screen — the remembered size with it.\n */\n@media (max-width: 640px) {\n .wx-drawer {\n /* Tighter than on a desktop: every pixel of padding is a line of content lost. */\n --wx-drawer-pad-x: var(--wx-space-12);\n --wx-drawer-pad-y: var(--wx-space-10);\n --wx-drawer-body-pad: var(--wx-space-12);\n inset: 0;\n width: 100%;\n height: 100dvh;\n border: none;\n }\n\n .wx-drawer__head {\n gap: var(--wx-space-8);\n }\n\n .wx-drawer--split .wx-drawer__body {\n flex-direction: column;\n overflow: auto;\n }\n\n .wx-drawer--split .wx-drawer__sidebar,\n .wx-drawer--split .wx-drawer__content {\n overflow: visible;\n }\n\n .wx-drawer__sidebar {\n width: auto;\n border-right: none;\n border-bottom: 1px solid var(--wx-border-muted);\n }\n\n .wx-drawer__handle {\n display: none;\n }\n}\n\n/* A handle six pixels wide cannot be aimed at with a finger. */\n@media (pointer: coarse) {\n .wx-drawer__handle {\n display: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-drawer,\n .wx-drawer__overlay {\n animation: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useDropdown } from '../../composables/useDropdown'\nimport type { DropdownItemEmits, DropdownItemProps } from './types'\n\ndefineOptions({ name: 'WxDropdownItem', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DropdownItemProps>(), {\n icon: undefined,\n href: undefined,\n target: undefined,\n as: undefined,\n tone: 'default',\n active: false,\n disabled: false,\n})\n\nconst emit = defineEmits<DropdownItemEmits>()\n\nconst dropdown = useDropdown()\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n\nconst nativeAttrs = computed(() => {\n if (props.href) {\n return {\n href: props.disabled ? undefined : props.href,\n target: props.target,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n tabindex: props.disabled ? -1 : undefined,\n }\n }\n if (props.as) return { 'aria-disabled': props.disabled ? 'true' : undefined }\n return { type: 'button' as const, disabled: props.disabled }\n})\n\nconst classes = computed(() => [\n 'wx-dropdown-item',\n `wx-dropdown-item--${props.tone}`,\n { 'is-active': props.active, 'is-disabled': props.disabled },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n emit('click', event)\n\n /*\n * The panel closes here as well as on its own click handler: an item rendered\n * outside the dropdown's panel — in a collapsed actions row, say — still behaves.\n */\n if (dropdown?.closeOnSelect()) dropdown.close()\n}\n</script>\n\n<template>\n <component :is=\"tag\" v-bind=\"{ ...nativeAttrs, ...$attrs }\" :class=\"classes\" @click=\"onClick\">\n <span v-if=\"icon || $slots.before\" class=\"wx-dropdown-item__before\">\n <slot name=\"before\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n\n <span class=\"wx-dropdown-item__label\"><slot /></span>\n\n <span v-if=\"$slots.after\" class=\"wx-dropdown-item__after\">\n <slot name=\"after\" />\n </span>\n </component>\n</template>\n\n<style scoped>\n.wx-dropdown-item {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 100%;\n padding: var(--wx-space-6) var(--wx-space-10);\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-dropdown-item-color, var(--wx-text-default));\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-normal);\n text-align: start;\n text-decoration: none;\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-dropdown-item:hover:not(.is-disabled),\n.wx-dropdown-item.is-active {\n background: var(--wx-dropdown-item-bg, var(--wx-bg-fill));\n}\n\n.wx-dropdown-item:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-dropdown-item--default {\n --wx-dropdown-item-color: var(--wx-text-default);\n}\n\n.wx-dropdown-item--default:hover:not(.is-disabled),\n.wx-dropdown-item--default.is-active {\n --wx-dropdown-item-color: var(--wx-color-primary);\n}\n\n.wx-dropdown-item--primary {\n --wx-dropdown-item-color: var(--wx-color-primary);\n --wx-dropdown-item-bg: var(--wx-color-primary-soft);\n}\n\n.wx-dropdown-item--danger {\n --wx-dropdown-item-color: var(--wx-color-danger);\n --wx-dropdown-item-bg: var(--wx-color-danger-soft);\n}\n\n.wx-dropdown-item--success {\n --wx-dropdown-item-color: var(--wx-color-success-active);\n --wx-dropdown-item-bg: var(--wx-color-success-soft);\n}\n\n.wx-dropdown-item--warning {\n --wx-dropdown-item-color: var(--wx-color-warning-active);\n --wx-dropdown-item-bg: var(--wx-color-warning-soft);\n}\n\n.wx-dropdown-item.is-disabled,\n.wx-dropdown-item:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-dropdown-item__before,\n.wx-dropdown-item__after {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n font-size: 16px;\n}\n\n.wx-dropdown-item__after {\n margin-left: auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-dropdown-item__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { EntityCardEmits, EntityCardProps } from './types'\n\ndefineOptions({ name: 'WxEntityCard' })\n\nconst props = withDefaults(defineProps<EntityCardProps>(), {\n title: undefined,\n href: undefined,\n subtitle: undefined,\n image: undefined,\n imageAlt: undefined,\n shape: 'rounded',\n imageSize: undefined,\n meta: () => [],\n size: 'md',\n variant: 'card',\n bordered: false,\n selected: false,\n})\n\nconst emit = defineEmits<EntityCardEmits>()\n\nconst slots = useSlots()\n\nconst defaultImageSize: Record<string, string> = { sm: '32px', md: '44px', lg: '64px' }\n\nconst imageSize = computed(() => {\n if (props.imageSize === undefined) return defaultImageSize[props.size]\n return typeof props.imageSize === 'number' ? `${props.imageSize}px` : props.imageSize\n})\n\nconst hasMedia = computed(() => Boolean(props.image || slots.media))\n\n/** With no picture, the first letter stands in — a list of rows stays aligned. */\nconst initial = computed(() => props.title?.trim().charAt(0).toUpperCase() ?? '')\n\nconst hasMeta = computed(() => Boolean(slots.meta || props.meta.length > 0))\n\nconst classes = computed(() => [\n 'wx-entity-card',\n `wx-entity-card--${props.size}`,\n `wx-entity-card--${props.variant}`,\n {\n 'wx-entity-card--bordered': props.bordered,\n 'is-selected': props.selected,\n },\n])\n</script>\n\n<template>\n <div\n :class=\"classes\"\n :style=\"{ '--wx-entity-card-image': imageSize }\"\n @click=\"emit('click', $event)\"\n >\n <div v-if=\"hasMedia\" class=\"wx-entity-card__media\" :class=\"`wx-entity-card__media--${shape}`\">\n <slot name=\"media\">\n <img :src=\"image\" :alt=\"imageAlt ?? title ?? ''\" class=\"wx-entity-card__image\" />\n </slot>\n </div>\n <div\n v-else-if=\"title\"\n class=\"wx-entity-card__media wx-entity-card__media--empty\"\n :class=\"`wx-entity-card__media--${shape}`\"\n aria-hidden=\"true\"\n >\n {{ initial }}\n </div>\n\n <div class=\"wx-entity-card__body\">\n <component\n :is=\"href ? 'a' : 'span'\"\n v-if=\"title || $slots.title\"\n class=\"wx-entity-card__title\"\n :href=\"href\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </component>\n\n <span v-if=\"subtitle || $slots.subtitle\" class=\"wx-entity-card__subtitle\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </span>\n\n <div v-if=\"hasMeta\" class=\"wx-entity-card__meta\">\n <slot name=\"meta\">\n <span v-for=\"(item, index) in meta\" :key=\"index\" class=\"wx-entity-card__meta-item\">\n <span v-if=\"item.label\" class=\"wx-entity-card__meta-label\">{{ item.label }}:</span>\n <span v-if=\"item.text\" class=\"wx-entity-card__meta-text\">{{ item.text }}</span>\n </span>\n </slot>\n </div>\n\n <div v-if=\"$slots.default\" class=\"wx-entity-card__content\">\n <slot />\n </div>\n </div>\n\n <div v-if=\"$slots.actions\" class=\"wx-entity-card__actions\" @click.stop>\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-entity-card {\n display: flex;\n align-items: center;\n /* Wrapping is what makes a narrow card work: the actions drop to their own line\n instead of squeezing the title into two characters. */\n flex-wrap: wrap;\n gap: var(--wx-space-12);\n box-sizing: border-box;\n padding: var(--wx-entity-card-padding, var(--wx-space-12));\n border: 1px solid transparent;\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-entity-card--sm {\n --wx-entity-card-padding: var(--wx-space-8);\n gap: var(--wx-space-8);\n}\n\n.wx-entity-card--lg {\n --wx-entity-card-padding: var(--wx-space-16);\n gap: var(--wx-space-16);\n}\n\n.wx-entity-card--card {\n background: var(--wx-bg-surface);\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-entity-card--plain {\n padding: 0;\n background: transparent;\n}\n\n.wx-entity-card--bordered {\n border-color: var(--wx-border-default);\n}\n\n/*\n * A border needs something to enclose: without this a plain card — which drops its\n * padding so it can sit inside another one — glues the thumbnail and the actions to\n * the outline.\n */\n.wx-entity-card--plain.wx-entity-card--bordered,\n.wx-entity-card--plain.is-selected {\n padding: var(--wx-entity-card-padding, var(--wx-space-12));\n}\n\n.wx-entity-card.is-selected {\n border-color: var(--wx-color-primary);\n background: var(--wx-color-primary-soft);\n}\n\n.wx-entity-card__media {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: var(--wx-entity-card-image, 44px);\n height: var(--wx-entity-card-image, 44px);\n overflow: hidden;\n background: var(--wx-bg-fill);\n}\n\n.wx-entity-card__media--rounded {\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-entity-card__media--square {\n border-radius: 0;\n}\n\n.wx-entity-card__media--circle {\n border-radius: var(--wx-radius-full);\n}\n\n.wx-entity-card__media--empty {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n user-select: none;\n}\n\n.wx-entity-card__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.wx-entity-card__body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n /* The basis is the point where the actions wrap; `min-width: 0` is what lets a long\n title be cut rather than stretch the row. */\n flex: 1 1 180px;\n min-width: 0;\n}\n\n.wx-entity-card__title {\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card--sm .wx-entity-card__title {\n font-size: var(--wx-font-size-sm);\n}\n\na.wx-entity-card__title:hover {\n color: var(--wx-text-link);\n}\n\n.wx-entity-card__subtitle {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-12);\n margin-top: 2px;\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-entity-card__meta-item {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-entity-card__meta-label {\n color: var(--wx-text-muted);\n}\n\n.wx-entity-card__meta-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card__content {\n margin-top: var(--wx-space-8);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-entity-card__actions {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n flex: 0 0 auto;\n margin-left: auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide, toRef } from 'vue'\nimport { formContextKey, type ValidationErrors } from '../../composables/useFormField'\nimport type { FormEmits, FormProps } from './types'\n\ndefineOptions({ name: 'WxForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), {\n errors: undefined,\n disabled: false,\n size: 'md',\n labelPosition: 'top',\n labelWidth: undefined,\n gap: 'md',\n})\n\nconst emit = defineEmits<FormEmits>()\n\nconst errors = computed<ValidationErrors>(() => props.errors ?? {})\n\nprovide(formContextKey, {\n errors,\n disabled: toRef(props, 'disabled'),\n size: toRef(props, 'size'),\n labelPosition: toRef(props, 'labelPosition'),\n labelWidth: toRef(props, 'labelWidth'),\n})\n\n/** Native submit is always prevented: forms here talk to a data adapter, not a URL. */\nfunction onSubmit(event: SubmitEvent) {\n event.preventDefault()\n emit('submit', event)\n}\n\nfunction onReset(event: Event) {\n emit('reset', event)\n}\n</script>\n\n<template>\n <form\n :class=\"['wx-form', `wx-form--gap-${gap}`, `wx-form--label-${labelPosition}`]\"\n novalidate\n @submit=\"onSubmit\"\n @reset=\"onReset\"\n >\n <slot />\n </form>\n</template>\n\n<style scoped>\n.wx-form {\n display: flex;\n flex-direction: column;\n}\n\n.wx-form--gap-sm {\n gap: var(--wx-space-8);\n}\n\n.wx-form--gap-md {\n gap: var(--wx-space-16);\n}\n\n.wx-form--gap-lg {\n gap: var(--wx-space-24);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref } from 'vue'\nimport {\n formContextKey,\n provideFormItem,\n useId,\n type ControlSize,\n type ControlStatus,\n} from '../../composables/useFormField'\nimport type { FormItemProps } from './types'\n\ndefineOptions({ name: 'WxFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), {\n label: undefined,\n name: undefined,\n required: false,\n error: undefined,\n help: undefined,\n disabled: false,\n size: undefined,\n labelWidth: undefined,\n reserveErrorSpace: false,\n})\n\nconst form = inject(formContextKey, null)\n\nconst baseId = useId('wx-field')\nconst errorId = `${baseId}-error`\nconst helpId = `${baseId}-help`\n\n/**\n * Grouped controls (checkbox and radio groups) cannot be targeted by `for`,\n * so they register themselves and the label becomes a plain span instead.\n */\nconst labelMode = ref<'control' | 'group'>('control')\nconst controlId = ref<string>(baseId)\n\nfunction registerLabelTarget(id: string | undefined) {\n if (id === undefined) {\n labelMode.value = 'group'\n return\n }\n labelMode.value = 'control'\n controlId.value = id\n}\n\nconst messages = computed<string[]>(() => {\n if (props.error !== undefined) {\n return Array.isArray(props.error) ? props.error : [props.error]\n }\n if (props.name && form) return form.errors.value[props.name] ?? []\n return []\n})\n\nconst hasError = computed(() => messages.value.length > 0)\nconst status = computed<ControlStatus>(() => (hasError.value ? 'error' : 'default'))\n\n/**\n * Only ever names nodes that are actually rendered — the help text gives way to the\n * error, and a dangling `aria-describedby` is worse than none.\n */\nconst describedBy = computed(() => {\n if (hasError.value) return errorId\n return props.help ? helpId : undefined\n})\n\nconst size = computed<ControlSize | undefined>(() => props.size)\nconst disabled = computed(() => props.disabled)\n\nconst labelWidth = computed(() => props.labelWidth ?? form?.labelWidth.value)\nconst isInline = computed(() => form?.labelPosition.value === 'left')\n\nprovideFormItem({\n id: computed(() => baseId),\n describedBy,\n status,\n disabled,\n size,\n registerLabelTarget,\n})\n\ndefineExpose({ messages, hasError })\n</script>\n\n<template>\n <div\n :class=\"[\n 'wx-form-item',\n { 'wx-form-item--inline': isInline, 'is-error': hasError, 'is-required': required },\n ]\"\n :style=\"isInline && labelWidth ? { '--wx-form-item-label-width': labelWidth } : undefined\"\n >\n <component\n :is=\"labelMode === 'group' ? 'span' : 'label'\"\n v-if=\"label || $slots.label\"\n :id=\"`${baseId}-label`\"\n class=\"wx-form-item__label\"\n :for=\"labelMode === 'group' ? undefined : controlId\"\n >\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"wx-form-item__required\" aria-hidden=\"true\">*</span>\n </component>\n\n <div class=\"wx-form-item__control\">\n <slot />\n\n <p v-if=\"hasError\" :id=\"errorId\" class=\"wx-form-item__error\" role=\"alert\">\n {{ messages[0] }}\n </p>\n <p v-else-if=\"help\" :id=\"helpId\" class=\"wx-form-item__help\">{{ help }}</p>\n <p v-else-if=\"reserveErrorSpace\" class=\"wx-form-item__error\" aria-hidden=\"true\"> </p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-form-item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-form-item--inline {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wx-space-16);\n}\n\n.wx-form-item--inline .wx-form-item__label {\n flex: 0 0 auto;\n width: var(--wx-form-item-label-width, 160px);\n /* Line the label up with the first line of a control's text. */\n padding-top: calc((var(--wx-size-control-md) - 1lh) / 2);\n}\n\n.wx-form-item--inline .wx-form-item__control {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.wx-form-item__label {\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-form-item__required {\n margin-left: var(--wx-space-2);\n color: var(--wx-color-danger);\n}\n\n.wx-form-item__control {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-form-item__error,\n.wx-form-item__help {\n margin: 0;\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-form-item__error {\n color: var(--wx-color-danger);\n}\n\n.wx-form-item__help {\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { HeadingLevel, HeadingProps, HeadingSize } from './types'\n\ndefineOptions({ name: 'WxHeading' })\n\nconst props = withDefaults(defineProps<HeadingProps>(), {\n level: 2,\n size: undefined,\n tone: 'strong',\n align: undefined,\n truncate: false,\n})\n\n/** What each level looks like when `size` is left alone. */\nconst sizeForLevel: Record<HeadingLevel, HeadingSize> = {\n 1: '3xl',\n 2: '2xl',\n 3: 'xl',\n 4: 'lg',\n 5: 'md',\n 6: 'sm',\n}\n\nconst size = computed(() => props.size ?? sizeForLevel[props.level])\n\nconst classes = computed(() => [\n 'wx-heading',\n `wx-heading--${size.value}`,\n `wx-heading--tone-${props.tone}`,\n {\n [`wx-heading--align-${props.align}`]: Boolean(props.align),\n 'wx-heading--truncate': props.truncate,\n },\n])\n</script>\n\n<template>\n <component :is=\"`h${level}`\" :class=\"classes\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n/*\n * No margin: spacing belongs to the layout around the heading, not to the heading\n * itself. `WxProse` puts the rhythm back for free-flowing content.\n */\n.wx-heading {\n margin: 0;\n color: var(--wx-heading-color, var(--wx-text-strong));\n font-family: var(--wx-font-family-sans);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-wrap: balance;\n}\n\n.wx-heading--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-heading--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-heading--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-heading--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-heading--2xl {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-heading--3xl {\n font-size: var(--wx-font-size-3xl);\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-heading--tone-default {\n --wx-heading-color: var(--wx-text-default);\n}\n\n.wx-heading--tone-strong {\n --wx-heading-color: var(--wx-text-strong);\n}\n\n.wx-heading--tone-muted {\n --wx-heading-color: var(--wx-text-muted);\n}\n\n.wx-heading--tone-placeholder {\n --wx-heading-color: var(--wx-text-placeholder);\n}\n\n.wx-heading--tone-primary {\n --wx-heading-color: var(--wx-color-primary);\n}\n\n.wx-heading--tone-success {\n --wx-heading-color: var(--wx-color-success-active);\n}\n\n.wx-heading--tone-warning {\n --wx-heading-color: var(--wx-color-warning-active);\n}\n\n.wx-heading--tone-danger {\n --wx-heading-color: var(--wx-color-danger);\n}\n\n.wx-heading--tone-info {\n --wx-heading-color: var(--wx-color-info-active);\n}\n\n.wx-heading--tone-inverse {\n --wx-heading-color: var(--wx-text-inverse);\n}\n\n.wx-heading--align-start {\n text-align: start;\n}\n\n.wx-heading--align-center {\n text-align: center;\n}\n\n.wx-heading--align-end {\n text-align: end;\n}\n\n.wx-heading--align-justify {\n text-align: justify;\n}\n\n.wx-heading--truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { IndicatorProps } from './types'\n\ndefineOptions({ name: 'WxIndicator' })\n\nconst props = withDefaults(defineProps<IndicatorProps>(), {\n value: undefined,\n max: 99,\n dot: false,\n showZero: false,\n placement: 'top-right',\n offset: undefined,\n type: 'danger',\n hidden: false,\n label: undefined,\n})\n\nconst slots = useSlots()\n\n/** Without a wrapped element the mark is the whole component — a count in a menu row. */\nconst isAttached = computed(() => Boolean(slots.default))\n\nconst text = computed(() => {\n if (props.dot) return ''\n if (typeof props.value === 'number') {\n return props.value > props.max ? `${props.max}+` : String(props.value)\n }\n return props.value ?? ''\n})\n\nconst visible = computed(() => {\n if (props.hidden) return false\n if (props.dot) return true\n if (props.value === 0) return props.showZero\n return text.value !== ''\n})\n\nconst markClasses = computed(() => [\n 'wx-indicator__mark',\n `wx-indicator__mark--${props.type}`,\n {\n 'wx-indicator__mark--dot': props.dot,\n 'wx-indicator__mark--attached': isAttached.value,\n [`wx-indicator__mark--${props.placement}`]: isAttached.value,\n },\n])\n\nconst markStyle = computed(() => {\n if (!props.offset) return undefined\n const [x, y] = props.offset\n return { '--wx-indicator-offset-x': `${x}px`, '--wx-indicator-offset-y': `${y}px` }\n})\n</script>\n\n<template>\n <span class=\"wx-indicator\" :class=\"{ 'wx-indicator--attached': isAttached }\">\n <slot />\n <span v-if=\"visible\" :class=\"markClasses\" :style=\"markStyle\" :aria-label=\"label\">\n <slot name=\"mark\">{{ text }}</slot>\n </span>\n </span>\n</template>\n\n<style scoped>\n.wx-indicator {\n display: inline-flex;\n vertical-align: middle;\n}\n\n.wx-indicator--attached {\n position: relative;\n}\n\n.wx-indicator__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: var(--wx-radius-full);\n color: var(--wx-indicator-fg);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-xs);\n font-weight: var(--wx-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n background: var(--wx-indicator-bg);\n}\n\n/*\n * The ring is the surface behind the mark, not a fixed white — a counter pinned to a\n * dark sidebar icon needs the sidebar's colour, which callers set on the wrapper.\n */\n.wx-indicator__mark--attached {\n position: absolute;\n z-index: 1;\n border: 2px solid var(--wx-indicator-ring, var(--wx-bg-surface));\n height: 20px;\n min-width: 20px;\n pointer-events: none;\n}\n\n.wx-indicator__mark--top-right {\n top: 0;\n right: 0;\n transform: translate(\n calc(50% + var(--wx-indicator-offset-x, 0px)),\n calc(-50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--top-left {\n top: 0;\n left: 0;\n transform: translate(\n calc(-50% + var(--wx-indicator-offset-x, 0px)),\n calc(-50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--bottom-right {\n bottom: 0;\n right: 0;\n transform: translate(\n calc(50% + var(--wx-indicator-offset-x, 0px)),\n calc(50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--bottom-left {\n bottom: 0;\n left: 0;\n transform: translate(\n calc(-50% + var(--wx-indicator-offset-x, 0px)),\n calc(50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--dot {\n min-width: 10px;\n width: 10px;\n height: 10px;\n padding: 0;\n}\n\n.wx-indicator__mark--dot.wx-indicator__mark--attached {\n min-width: 12px;\n width: 12px;\n height: 12px;\n}\n\n/* colours */\n.wx-indicator__mark--danger {\n --wx-indicator-bg: var(--wx-color-danger);\n --wx-indicator-fg: var(--wx-color-danger-contrast);\n}\n\n.wx-indicator__mark--primary {\n --wx-indicator-bg: var(--wx-color-primary);\n --wx-indicator-fg: var(--wx-color-primary-contrast);\n}\n\n.wx-indicator__mark--success {\n --wx-indicator-bg: var(--wx-color-success);\n --wx-indicator-fg: var(--wx-color-success-contrast);\n}\n\n.wx-indicator__mark--warning {\n --wx-indicator-bg: var(--wx-color-warning);\n --wx-indicator-fg: var(--wx-color-warning-contrast);\n}\n\n.wx-indicator__mark--info {\n --wx-indicator-bg: var(--wx-color-info);\n --wx-indicator-fg: var(--wx-color-info-contrast);\n}\n\n.wx-indicator__mark--neutral {\n --wx-indicator-bg: var(--wx-bg-fill-hover);\n --wx-indicator-fg: var(--wx-text-default);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { InputEmits, InputModelValue, InputProps } from './types'\n\ndefineOptions({ name: 'WxInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n size: undefined,\n status: undefined,\n id: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n clearable: false,\n maxlength: undefined,\n showCount: false,\n autocomplete: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<InputEmits>()\n\nconst model = defineModel<InputModelValue>({ default: '' })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst focused = ref(false)\n\nconst currentValue = computed(() => (model.value == null ? '' : String(model.value)))\n\nconst showClear = computed(\n () =>\n props.clearable && !field.disabled.value && !props.readonly && currentValue.value.length > 0,\n)\n\nconst counter = computed(() =>\n props.showCount && props.maxlength ? `${currentValue.value.length}/${props.maxlength}` : null,\n)\n\nconst classes = computed(() => [\n 'wx-input',\n `wx-input--${field.size.value}`,\n {\n [`wx-input--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n },\n])\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n model.value = value\n emit('input', value)\n}\n\nfunction onChange(event: Event) {\n emit('change', (event.target as HTMLInputElement).value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n emit('blur', event)\n}\n\nfunction clear() {\n model.value = ''\n emit('input', '')\n emit('change', '')\n emit('clear')\n inputRef.value?.focus()\n}\n\ndefineExpose({\n focus: () => inputRef.value?.focus(),\n blur: () => inputRef.value?.blur(),\n select: () => inputRef.value?.select(),\n input: inputRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"$slots.prefix\" class=\"wx-input__affix wx-input__affix--prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"$attrs\"\n class=\"wx-input__inner\"\n :type=\"type\"\n :value=\"currentValue\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :maxlength=\"maxlength\"\n :autocomplete=\"autocomplete\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n class=\"wx-input__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click=\"clear\"\n >\n ✕\n </button>\n\n <span v-if=\"counter\" class=\"wx-input__count\">{{ counter }}</span>\n\n <span v-if=\"$slots.suffix\" class=\"wx-input__affix wx-input__affix--suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\n</template>\n\n<style scoped>\n.wx-input {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-input:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n/* The reference marks focus with a tinted border rather than a ring. */\n.wx-input.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-input--sm {\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-10);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-input--md {\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-12);\n font-size: var(--wx-font-size-md);\n}\n\n.wx-input--lg {\n height: var(--wx-size-control-lg);\n padding: 0 var(--wx-space-16);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-input--error,\n.wx-input--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-input--success,\n.wx-input--success.is-focused {\n border-color: var(--wx-color-success);\n}\n\n.wx-input--warning,\n.wx-input--warning.is-focused {\n border-color: var(--wx-color-warning);\n}\n\n.wx-input.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-input__inner {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.wx-input__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-input__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-input__affix,\n.wx-input__count {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-input__count {\n font-size: var(--wx-font-size-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.wx-input__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-input__clear:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { InputNumberEmits, InputNumberModelValue, InputNumberProps } from './types'\n\ndefineOptions({ name: 'WxInputNumber', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<InputNumberProps>(), {\n min: undefined,\n max: undefined,\n step: 1,\n precision: undefined,\n controls: true,\n controlsPosition: 'sides',\n wheel: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<InputNumberEmits>()\n\nconst model = defineModel<InputNumberModelValue>({ default: null })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst focused = ref(false)\n\n/** Decimals to keep: explicit `precision`, otherwise whatever `step` implies. */\nconst precision = computed(() => {\n if (props.precision !== undefined) return props.precision\n const [, decimals = ''] = String(props.step).split('.')\n return decimals.length\n})\n\n/** Rounds through a scaled integer so 0.1 + 0.2 does not leak into the model. */\nfunction round(value: number): number {\n const factor = 10 ** precision.value\n return Math.round((value + Number.EPSILON) * factor) / factor\n}\n\nfunction clamp(value: number): number {\n let next = value\n if (props.min !== undefined) next = Math.max(next, props.min)\n if (props.max !== undefined) next = Math.min(next, props.max)\n return round(next)\n}\n\nconst current = computed<number | null>(() =>\n typeof model.value === 'number' && Number.isFinite(model.value) ? model.value : null,\n)\n\n/** What the user sees. Kept as text so a half-typed \"-\" or \"1.\" survives. */\nconst display = ref(current.value === null ? '' : current.value.toFixed(precision.value))\n\nwatch(current, (value) => {\n if (focused.value) return\n display.value = value === null ? '' : value.toFixed(precision.value)\n})\n\nconst disabled = computed(() => field.disabled.value)\nconst canDecrease = computed(\n () =>\n !disabled.value &&\n !props.readonly &&\n (props.min === undefined || (current.value ?? 0) > props.min),\n)\nconst canIncrease = computed(\n () =>\n !disabled.value &&\n !props.readonly &&\n (props.max === undefined || (current.value ?? 0) < props.max),\n)\n\nconst classes = computed(() => [\n 'wx-input-number',\n `wx-input-number--${field.size.value}`,\n `wx-input-number--controls-${props.controls ? props.controlsPosition : 'none'}`,\n {\n [`wx-input-number--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': disabled.value,\n },\n])\n\nfunction commit(value: number | null) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\nfunction stepBy(direction: 1 | -1) {\n if (disabled.value || props.readonly) return\n const base = current.value ?? clamp(0)\n const next = clamp(base + direction * props.step)\n commit(next)\n display.value = next.toFixed(precision.value)\n}\n\nfunction onInput(event: Event) {\n display.value = (event.target as HTMLInputElement).value\n const parsed = Number.parseFloat(display.value)\n // While typing, only push through values that already make sense.\n if (display.value === '') commit(null)\n else if (Number.isFinite(parsed)) commit(round(parsed))\n}\n\n/** Clamping and formatting happen on blur, so typing 5 into a min=10 field is possible. */\nfunction normalize() {\n if (display.value.trim() === '') {\n commit(null)\n display.value = ''\n return\n }\n const parsed = Number.parseFloat(display.value)\n if (!Number.isFinite(parsed)) {\n display.value = current.value === null ? '' : current.value.toFixed(precision.value)\n return\n }\n const next = clamp(parsed)\n commit(next)\n display.value = next.toFixed(precision.value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n normalize()\n emit('blur', event)\n}\n\n/**\n * Only ever acts on a focused field, and swallows the scroll while it does — a\n * hovered field must not steal the page's scrolling.\n */\nfunction onWheel(event: WheelEvent) {\n if (!props.wheel || !focused.value || disabled.value || props.readonly) return\n event.preventDefault()\n stepBy(event.deltaY < 0 ? 1 : -1)\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n stepBy(1)\n } else if (event.key === 'ArrowDown') {\n event.preventDefault()\n stepBy(-1)\n } else if (event.key === 'Enter') {\n normalize()\n }\n}\n\ndefineExpose({\n focus: () => inputRef.value?.focus(),\n blur: () => inputRef.value?.blur(),\n increase: () => stepBy(1),\n decrease: () => stepBy(-1),\n input: inputRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <button\n v-if=\"controls\"\n class=\"wx-input-number__button wx-input-number__button--decrease\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Decrease\"\n :disabled=\"!canDecrease\"\n @click=\"stepBy(-1)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 8h9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"$attrs\"\n class=\"wx-input-number__inner\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n :name=\"name\"\n :value=\"display\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n role=\"spinbutton\"\n :aria-valuenow=\"current ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n @wheel=\"onWheel\"\n />\n\n <button\n v-if=\"controls\"\n class=\"wx-input-number__button wx-input-number__button--increase\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Increase\"\n :disabled=\"!canIncrease\"\n @click=\"stepBy(1)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 3.5v9M3.5 8h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n</template>\n\n<style scoped>\n.wx-input-number {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n height: var(--wx-size-control-md);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n overflow: hidden;\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-input-number--sm {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-input-number--md {\n height: var(--wx-size-control-md);\n font-size: var(--wx-font-size-md);\n}\n\n.wx-input-number--lg {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-input-number:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n.wx-input-number.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-input-number--error,\n.wx-input-number--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-input-number--success {\n border-color: var(--wx-color-success);\n}\n\n.wx-input-number--warning {\n border-color: var(--wx-color-warning);\n}\n\n.wx-input-number.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-input-number__inner {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0 var(--wx-space-12);\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n.wx-input-number--controls-none .wx-input-number__inner {\n text-align: left;\n}\n\n.wx-input-number__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-input-number__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-input-number__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: calc(var(--wx-size-control-md) - 8px);\n height: 100%;\n padding: 0;\n background: var(--wx-bg-fill);\n border: none;\n color: var(--wx-text-default);\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-input-number__button svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-input-number__button:hover:not(:disabled) {\n background: var(--wx-bg-fill-hover);\n color: var(--wx-color-primary);\n}\n\n.wx-input-number__button:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/*\n * Stacked layout: the DOM order stays decrease → input → increase (which is what a\n * screen reader and the tab order want); grid puts the buttons where they belong.\n */\n.wx-input-number--controls-right {\n display: grid;\n grid-template-columns: 1fr auto;\n grid-template-rows: 1fr 1fr;\n}\n\n.wx-input-number--controls-right .wx-input-number__inner {\n grid-column: 1;\n grid-row: 1 / span 2;\n text-align: left;\n}\n\n.wx-input-number--controls-right .wx-input-number__button {\n width: calc(var(--wx-size-control-md) - 16px);\n height: 100%;\n border-left: 1px solid var(--wx-border-default);\n}\n\n.wx-input-number--controls-right .wx-input-number__button--increase {\n grid-column: 2;\n grid-row: 1;\n}\n\n.wx-input-number--controls-right .wx-input-number__button--decrease {\n grid-column: 2;\n grid-row: 2;\n border-top: 1px solid var(--wx-border-default);\n}\n</style>\n","var an = Object.defineProperty;\nvar Pe = Object.getOwnPropertySymbols;\nvar yt = Object.prototype.hasOwnProperty, wt = Object.prototype.propertyIsEnumerable;\nvar bt = (t, e, n) => e in t ? an(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n, fe = (t, e) => {\n for (var n in e || (e = {}))\n yt.call(e, n) && bt(t, n, e[n]);\n if (Pe)\n for (var n of Pe(e))\n wt.call(e, n) && bt(t, n, e[n]);\n return t;\n};\nvar $e = (t, e) => {\n var n = {};\n for (var o in t)\n yt.call(t, o) && e.indexOf(o) < 0 && (n[o] = t[o]);\n if (t != null && Pe)\n for (var o of Pe(t))\n e.indexOf(o) < 0 && wt.call(t, o) && (n[o] = t[o]);\n return n;\n};\nimport { getCurrentInstance as dt, unref as U, watch as ln, onUnmounted as sn, onMounted as un, nextTick as kt, isRef as qe, defineComponent as cn, computed as Et, toRefs as fn, ref as dn, reactive as hn, h as pn, isProxy as gn } from \"vue\";\nconst Ht = \"[vue-draggable-plus]: \";\nfunction mn(t) {\n console.warn(Ht + t);\n}\nfunction vn(t) {\n console.error(Ht + t);\n}\nfunction St(t, e, n) {\n return n >= 0 && n < t.length && t.splice(n, 0, t.splice(e, 1)[0]), t;\n}\nfunction bn(t) {\n return t.replace(/-(\\w)/g, (e, n) => n ? n.toUpperCase() : \"\");\n}\nfunction yn(t) {\n return Object.keys(t).reduce((e, n) => (typeof t[n] != \"undefined\" && (e[bn(n)] = t[n]), e), {});\n}\nfunction Dt(t, e) {\n return Array.isArray(t) && t.splice(e, 1), t;\n}\nfunction _t(t, e, n) {\n return Array.isArray(t) && t.splice(e, 0, n), t;\n}\nfunction wn(t) {\n return typeof t == \"undefined\";\n}\nfunction En(t) {\n return typeof t == \"string\";\n}\nfunction Tt(t, e, n) {\n const o = t.children[n];\n t.insertBefore(e, o);\n}\nfunction Ke(t) {\n t.parentNode && t.parentNode.removeChild(t);\n}\nfunction Sn(t, e = document) {\n var o;\n let n = null;\n return typeof (e == null ? void 0 : e.querySelector) == \"function\" ? n = (o = e == null ? void 0 : e.querySelector) == null ? void 0 : o.call(e, t) : n = document.querySelector(t), n || mn(`Element not found: ${t}`), n;\n}\nfunction Dn(t, e, n = null) {\n return function(...o) {\n return t.apply(n, o), e.apply(n, o);\n };\n}\nfunction _n(t, e) {\n const n = fe({}, t);\n return Object.keys(e).forEach((o) => {\n n[o] ? n[o] = Dn(t[o], e[o]) : n[o] = e[o];\n }), n;\n}\nfunction Tn(t) {\n return t instanceof HTMLElement;\n}\nfunction Ct(t, e) {\n Object.keys(t).forEach((n) => {\n e(n, t[n]);\n });\n}\nfunction Cn(t) {\n return t.charCodeAt(0) === 111 && t.charCodeAt(1) === 110 && (t.charCodeAt(2) > 122 || t.charCodeAt(2) < 97);\n}\nconst On = Object.assign;\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction Ot(t, e) {\n var n = Object.keys(t);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(t);\n e && (o = o.filter(function(r) {\n return Object.getOwnPropertyDescriptor(t, r).enumerable;\n })), n.push.apply(n, o);\n }\n return n;\n}\nfunction ne(t) {\n for (var e = 1; e < arguments.length; e++) {\n var n = arguments[e] != null ? arguments[e] : {};\n e % 2 ? Ot(Object(n), !0).forEach(function(o) {\n In(t, o, n[o]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : Ot(Object(n)).forEach(function(o) {\n Object.defineProperty(t, o, Object.getOwnPropertyDescriptor(n, o));\n });\n }\n return t;\n}\nfunction Ye(t) {\n \"@babel/helpers - typeof\";\n return typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\" ? Ye = function(e) {\n return typeof e;\n } : Ye = function(e) {\n return e && typeof Symbol == \"function\" && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n }, Ye(t);\n}\nfunction In(t, e, n) {\n return e in t ? Object.defineProperty(t, e, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : t[e] = n, t;\n}\nfunction ie() {\n return ie = Object.assign || function(t) {\n for (var e = 1; e < arguments.length; e++) {\n var n = arguments[e];\n for (var o in n)\n Object.prototype.hasOwnProperty.call(n, o) && (t[o] = n[o]);\n }\n return t;\n }, ie.apply(this, arguments);\n}\nfunction An(t, e) {\n if (t == null)\n return {};\n var n = {}, o = Object.keys(t), r, i;\n for (i = 0; i < o.length; i++)\n r = o[i], !(e.indexOf(r) >= 0) && (n[r] = t[r]);\n return n;\n}\nfunction xn(t, e) {\n if (t == null)\n return {};\n var n = An(t, e), o, r;\n if (Object.getOwnPropertySymbols) {\n var i = Object.getOwnPropertySymbols(t);\n for (r = 0; r < i.length; r++)\n o = i[r], !(e.indexOf(o) >= 0) && Object.prototype.propertyIsEnumerable.call(t, o) && (n[o] = t[o]);\n }\n return n;\n}\nvar Nn = \"1.15.2\";\nfunction re(t) {\n if (typeof window != \"undefined\" && window.navigator)\n return !!/* @__PURE__ */ navigator.userAgent.match(t);\n}\nvar ae = re(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i), xe = re(/Edge/i), It = re(/firefox/i), Te = re(/safari/i) && !re(/chrome/i) && !re(/android/i), Lt = re(/iP(ad|od|hone)/i), Wt = re(/chrome/i) && re(/android/i), Gt = {\n capture: !1,\n passive: !1\n};\nfunction S(t, e, n) {\n t.addEventListener(e, n, !ae && Gt);\n}\nfunction E(t, e, n) {\n t.removeEventListener(e, n, !ae && Gt);\n}\nfunction We(t, e) {\n if (e) {\n if (e[0] === \">\" && (e = e.substring(1)), t)\n try {\n if (t.matches)\n return t.matches(e);\n if (t.msMatchesSelector)\n return t.msMatchesSelector(e);\n if (t.webkitMatchesSelector)\n return t.webkitMatchesSelector(e);\n } catch (n) {\n return !1;\n }\n return !1;\n }\n}\nfunction Pn(t) {\n return t.host && t !== document && t.host.nodeType ? t.host : t.parentNode;\n}\nfunction Q(t, e, n, o) {\n if (t) {\n n = n || document;\n do {\n if (e != null && (e[0] === \">\" ? t.parentNode === n && We(t, e) : We(t, e)) || o && t === n)\n return t;\n if (t === n)\n break;\n } while (t = Pn(t));\n }\n return null;\n}\nvar At = /\\s+/g;\nfunction V(t, e, n) {\n if (t && e)\n if (t.classList)\n t.classList[n ? \"add\" : \"remove\"](e);\n else {\n var o = (\" \" + t.className + \" \").replace(At, \" \").replace(\" \" + e + \" \", \" \");\n t.className = (o + (n ? \" \" + e : \"\")).replace(At, \" \");\n }\n}\nfunction h(t, e, n) {\n var o = t && t.style;\n if (o) {\n if (n === void 0)\n return document.defaultView && document.defaultView.getComputedStyle ? n = document.defaultView.getComputedStyle(t, \"\") : t.currentStyle && (n = t.currentStyle), e === void 0 ? n : n[e];\n !(e in o) && e.indexOf(\"webkit\") === -1 && (e = \"-webkit-\" + e), o[e] = n + (typeof n == \"string\" ? \"\" : \"px\");\n }\n}\nfunction ye(t, e) {\n var n = \"\";\n if (typeof t == \"string\")\n n = t;\n else\n do {\n var o = h(t, \"transform\");\n o && o !== \"none\" && (n = o + \" \" + n);\n } while (!e && (t = t.parentNode));\n var r = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n return r && new r(n);\n}\nfunction jt(t, e, n) {\n if (t) {\n var o = t.getElementsByTagName(e), r = 0, i = o.length;\n if (n)\n for (; r < i; r++)\n n(o[r], r);\n return o;\n }\n return [];\n}\nfunction te() {\n var t = document.scrollingElement;\n return t || document.documentElement;\n}\nfunction P(t, e, n, o, r) {\n if (!(!t.getBoundingClientRect && t !== window)) {\n var i, a, l, s, u, d, f;\n if (t !== window && t.parentNode && t !== te() ? (i = t.getBoundingClientRect(), a = i.top, l = i.left, s = i.bottom, u = i.right, d = i.height, f = i.width) : (a = 0, l = 0, s = window.innerHeight, u = window.innerWidth, d = window.innerHeight, f = window.innerWidth), (e || n) && t !== window && (r = r || t.parentNode, !ae))\n do\n if (r && r.getBoundingClientRect && (h(r, \"transform\") !== \"none\" || n && h(r, \"position\") !== \"static\")) {\n var m = r.getBoundingClientRect();\n a -= m.top + parseInt(h(r, \"border-top-width\")), l -= m.left + parseInt(h(r, \"border-left-width\")), s = a + i.height, u = l + i.width;\n break;\n }\n while (r = r.parentNode);\n if (o && t !== window) {\n var y = ye(r || t), b = y && y.a, w = y && y.d;\n y && (a /= w, l /= b, f /= b, d /= w, s = a + d, u = l + f);\n }\n return {\n top: a,\n left: l,\n bottom: s,\n right: u,\n width: f,\n height: d\n };\n }\n}\nfunction xt(t, e, n) {\n for (var o = ce(t, !0), r = P(t)[e]; o; ) {\n var i = P(o)[n], a = void 0;\n if (a = r >= i, !a)\n return o;\n if (o === te())\n break;\n o = ce(o, !1);\n }\n return !1;\n}\nfunction we(t, e, n, o) {\n for (var r = 0, i = 0, a = t.children; i < a.length; ) {\n if (a[i].style.display !== \"none\" && a[i] !== p.ghost && (o || a[i] !== p.dragged) && Q(a[i], n.draggable, t, !1)) {\n if (r === e)\n return a[i];\n r++;\n }\n i++;\n }\n return null;\n}\nfunction ht(t, e) {\n for (var n = t.lastElementChild; n && (n === p.ghost || h(n, \"display\") === \"none\" || e && !We(n, e)); )\n n = n.previousElementSibling;\n return n || null;\n}\nfunction J(t, e) {\n var n = 0;\n if (!t || !t.parentNode)\n return -1;\n for (; t = t.previousElementSibling; )\n t.nodeName.toUpperCase() !== \"TEMPLATE\" && t !== p.clone && (!e || We(t, e)) && n++;\n return n;\n}\nfunction Nt(t) {\n var e = 0, n = 0, o = te();\n if (t)\n do {\n var r = ye(t), i = r.a, a = r.d;\n e += t.scrollLeft * i, n += t.scrollTop * a;\n } while (t !== o && (t = t.parentNode));\n return [e, n];\n}\nfunction Mn(t, e) {\n for (var n in t)\n if (t.hasOwnProperty(n)) {\n for (var o in e)\n if (e.hasOwnProperty(o) && e[o] === t[n][o])\n return Number(n);\n }\n return -1;\n}\nfunction ce(t, e) {\n if (!t || !t.getBoundingClientRect)\n return te();\n var n = t, o = !1;\n do\n if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) {\n var r = h(n);\n if (n.clientWidth < n.scrollWidth && (r.overflowX == \"auto\" || r.overflowX == \"scroll\") || n.clientHeight < n.scrollHeight && (r.overflowY == \"auto\" || r.overflowY == \"scroll\")) {\n if (!n.getBoundingClientRect || n === document.body)\n return te();\n if (o || e)\n return n;\n o = !0;\n }\n }\n while (n = n.parentNode);\n return te();\n}\nfunction Fn(t, e) {\n if (t && e)\n for (var n in e)\n e.hasOwnProperty(n) && (t[n] = e[n]);\n return t;\n}\nfunction Je(t, e) {\n return Math.round(t.top) === Math.round(e.top) && Math.round(t.left) === Math.round(e.left) && Math.round(t.height) === Math.round(e.height) && Math.round(t.width) === Math.round(e.width);\n}\nvar Ce;\nfunction zt(t, e) {\n return function() {\n if (!Ce) {\n var n = arguments, o = this;\n n.length === 1 ? t.call(o, n[0]) : t.apply(o, n), Ce = setTimeout(function() {\n Ce = void 0;\n }, e);\n }\n };\n}\nfunction Rn() {\n clearTimeout(Ce), Ce = void 0;\n}\nfunction Ut(t, e, n) {\n t.scrollLeft += e, t.scrollTop += n;\n}\nfunction Vt(t) {\n var e = window.Polymer, n = window.jQuery || window.Zepto;\n return e && e.dom ? e.dom(t).cloneNode(!0) : n ? n(t).clone(!0)[0] : t.cloneNode(!0);\n}\nfunction $t(t, e, n) {\n var o = {};\n return Array.from(t.children).forEach(function(r) {\n var i, a, l, s;\n if (!(!Q(r, e.draggable, t, !1) || r.animated || r === n)) {\n var u = P(r);\n o.left = Math.min((i = o.left) !== null && i !== void 0 ? i : 1 / 0, u.left), o.top = Math.min((a = o.top) !== null && a !== void 0 ? a : 1 / 0, u.top), o.right = Math.max((l = o.right) !== null && l !== void 0 ? l : -1 / 0, u.right), o.bottom = Math.max((s = o.bottom) !== null && s !== void 0 ? s : -1 / 0, u.bottom);\n }\n }), o.width = o.right - o.left, o.height = o.bottom - o.top, o.x = o.left, o.y = o.top, o;\n}\nvar q = \"Sortable\" + (/* @__PURE__ */ new Date()).getTime();\nfunction Xn() {\n var t = [], e;\n return {\n captureAnimationState: function() {\n if (t = [], !!this.options.animation) {\n var o = [].slice.call(this.el.children);\n o.forEach(function(r) {\n if (!(h(r, \"display\") === \"none\" || r === p.ghost)) {\n t.push({\n target: r,\n rect: P(r)\n });\n var i = ne({}, t[t.length - 1].rect);\n if (r.thisAnimationDuration) {\n var a = ye(r, !0);\n a && (i.top -= a.f, i.left -= a.e);\n }\n r.fromRect = i;\n }\n });\n }\n },\n addAnimationState: function(o) {\n t.push(o);\n },\n removeAnimationState: function(o) {\n t.splice(Mn(t, {\n target: o\n }), 1);\n },\n animateAll: function(o) {\n var r = this;\n if (!this.options.animation) {\n clearTimeout(e), typeof o == \"function\" && o();\n return;\n }\n var i = !1, a = 0;\n t.forEach(function(l) {\n var s = 0, u = l.target, d = u.fromRect, f = P(u), m = u.prevFromRect, y = u.prevToRect, b = l.rect, w = ye(u, !0);\n w && (f.top -= w.f, f.left -= w.e), u.toRect = f, u.thisAnimationDuration && Je(m, f) && !Je(d, f) && // Make sure animatingRect is on line between toRect & fromRect\n (b.top - f.top) / (b.left - f.left) === (d.top - f.top) / (d.left - f.left) && (s = Bn(b, m, y, r.options)), Je(f, d) || (u.prevFromRect = d, u.prevToRect = f, s || (s = r.options.animation), r.animate(u, b, f, s)), s && (i = !0, a = Math.max(a, s), clearTimeout(u.animationResetTimer), u.animationResetTimer = setTimeout(function() {\n u.animationTime = 0, u.prevFromRect = null, u.fromRect = null, u.prevToRect = null, u.thisAnimationDuration = null;\n }, s), u.thisAnimationDuration = s);\n }), clearTimeout(e), i ? e = setTimeout(function() {\n typeof o == \"function\" && o();\n }, a) : typeof o == \"function\" && o(), t = [];\n },\n animate: function(o, r, i, a) {\n if (a) {\n h(o, \"transition\", \"\"), h(o, \"transform\", \"\");\n var l = ye(this.el), s = l && l.a, u = l && l.d, d = (r.left - i.left) / (s || 1), f = (r.top - i.top) / (u || 1);\n o.animatingX = !!d, o.animatingY = !!f, h(o, \"transform\", \"translate3d(\" + d + \"px,\" + f + \"px,0)\"), this.forRepaintDummy = Yn(o), h(o, \"transition\", \"transform \" + a + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\")), h(o, \"transform\", \"translate3d(0,0,0)\"), typeof o.animated == \"number\" && clearTimeout(o.animated), o.animated = setTimeout(function() {\n h(o, \"transition\", \"\"), h(o, \"transform\", \"\"), o.animated = !1, o.animatingX = !1, o.animatingY = !1;\n }, a);\n }\n }\n };\n}\nfunction Yn(t) {\n return t.offsetWidth;\n}\nfunction Bn(t, e, n, o) {\n return Math.sqrt(Math.pow(e.top - t.top, 2) + Math.pow(e.left - t.left, 2)) / Math.sqrt(Math.pow(e.top - n.top, 2) + Math.pow(e.left - n.left, 2)) * o.animation;\n}\nvar ge = [], Ze = {\n initializeByDefault: !0\n}, Ne = {\n mount: function(e) {\n for (var n in Ze)\n Ze.hasOwnProperty(n) && !(n in e) && (e[n] = Ze[n]);\n ge.forEach(function(o) {\n if (o.pluginName === e.pluginName)\n throw \"Sortable: Cannot mount plugin \".concat(e.pluginName, \" more than once\");\n }), ge.push(e);\n },\n pluginEvent: function(e, n, o) {\n var r = this;\n this.eventCanceled = !1, o.cancel = function() {\n r.eventCanceled = !0;\n };\n var i = e + \"Global\";\n ge.forEach(function(a) {\n n[a.pluginName] && (n[a.pluginName][i] && n[a.pluginName][i](ne({\n sortable: n\n }, o)), n.options[a.pluginName] && n[a.pluginName][e] && n[a.pluginName][e](ne({\n sortable: n\n }, o)));\n });\n },\n initializePlugins: function(e, n, o, r) {\n ge.forEach(function(l) {\n var s = l.pluginName;\n if (!(!e.options[s] && !l.initializeByDefault)) {\n var u = new l(e, n, e.options);\n u.sortable = e, u.options = e.options, e[s] = u, ie(o, u.defaults);\n }\n });\n for (var i in e.options)\n if (e.options.hasOwnProperty(i)) {\n var a = this.modifyOption(e, i, e.options[i]);\n typeof a != \"undefined\" && (e.options[i] = a);\n }\n },\n getEventProperties: function(e, n) {\n var o = {};\n return ge.forEach(function(r) {\n typeof r.eventProperties == \"function\" && ie(o, r.eventProperties.call(n[r.pluginName], e));\n }), o;\n },\n modifyOption: function(e, n, o) {\n var r;\n return ge.forEach(function(i) {\n e[i.pluginName] && i.optionListeners && typeof i.optionListeners[n] == \"function\" && (r = i.optionListeners[n].call(e[i.pluginName], o));\n }), r;\n }\n};\nfunction kn(t) {\n var e = t.sortable, n = t.rootEl, o = t.name, r = t.targetEl, i = t.cloneEl, a = t.toEl, l = t.fromEl, s = t.oldIndex, u = t.newIndex, d = t.oldDraggableIndex, f = t.newDraggableIndex, m = t.originalEvent, y = t.putSortable, b = t.extraEventProperties;\n if (e = e || n && n[q], !!e) {\n var w, L = e.options, G = \"on\" + o.charAt(0).toUpperCase() + o.substr(1);\n window.CustomEvent && !ae && !xe ? w = new CustomEvent(o, {\n bubbles: !0,\n cancelable: !0\n }) : (w = document.createEvent(\"Event\"), w.initEvent(o, !0, !0)), w.to = a || n, w.from = l || n, w.item = r || n, w.clone = i, w.oldIndex = s, w.newIndex = u, w.oldDraggableIndex = d, w.newDraggableIndex = f, w.originalEvent = m, w.pullMode = y ? y.lastPutMode : void 0;\n var R = ne(ne({}, b), Ne.getEventProperties(o, e));\n for (var j in R)\n w[j] = R[j];\n n && n.dispatchEvent(w), L[G] && L[G].call(e, w);\n }\n}\nvar Hn = [\"evt\"], z = function(e, n) {\n var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, i = xn(o, Hn);\n Ne.pluginEvent.bind(p)(e, n, ne({\n dragEl: c,\n parentEl: O,\n ghostEl: g,\n rootEl: T,\n nextEl: pe,\n lastDownEl: Be,\n cloneEl: C,\n cloneHidden: ue,\n dragStarted: Se,\n putSortable: Y,\n activeSortable: p.active,\n originalEvent: r,\n oldIndex: be,\n oldDraggableIndex: Oe,\n newIndex: $,\n newDraggableIndex: se,\n hideGhostForTarget: Zt,\n unhideGhostForTarget: Qt,\n cloneNowHidden: function() {\n ue = !0;\n },\n cloneNowShown: function() {\n ue = !1;\n },\n dispatchSortableEvent: function(l) {\n W({\n sortable: n,\n name: l,\n originalEvent: r\n });\n }\n }, i));\n};\nfunction W(t) {\n kn(ne({\n putSortable: Y,\n cloneEl: C,\n targetEl: c,\n rootEl: T,\n oldIndex: be,\n oldDraggableIndex: Oe,\n newIndex: $,\n newDraggableIndex: se\n }, t));\n}\nvar c, O, g, T, pe, Be, C, ue, be, $, Oe, se, Me, Y, ve = !1, Ge = !1, je = [], de, Z, Qe, et, Pt, Mt, Se, me, Ie, Ae = !1, Fe = !1, ke, H, tt = [], lt = !1, ze = [], Ve = typeof document != \"undefined\", Re = Lt, Ft = xe || ae ? \"cssFloat\" : \"float\", Ln = Ve && !Wt && !Lt && \"draggable\" in document.createElement(\"div\"), qt = function() {\n if (Ve) {\n if (ae)\n return !1;\n var t = document.createElement(\"x\");\n return t.style.cssText = \"pointer-events:auto\", t.style.pointerEvents === \"auto\";\n }\n}(), Kt = function(e, n) {\n var o = h(e), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), i = we(e, 0, n), a = we(e, 1, n), l = i && h(i), s = a && h(a), u = l && parseInt(l.marginLeft) + parseInt(l.marginRight) + P(i).width, d = s && parseInt(s.marginLeft) + parseInt(s.marginRight) + P(a).width;\n if (o.display === \"flex\")\n return o.flexDirection === \"column\" || o.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (o.display === \"grid\")\n return o.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (i && l.float && l.float !== \"none\") {\n var f = l.float === \"left\" ? \"left\" : \"right\";\n return a && (s.clear === \"both\" || s.clear === f) ? \"vertical\" : \"horizontal\";\n }\n return i && (l.display === \"block\" || l.display === \"flex\" || l.display === \"table\" || l.display === \"grid\" || u >= r && o[Ft] === \"none\" || a && o[Ft] === \"none\" && u + d > r) ? \"vertical\" : \"horizontal\";\n}, Wn = function(e, n, o) {\n var r = o ? e.left : e.top, i = o ? e.right : e.bottom, a = o ? e.width : e.height, l = o ? n.left : n.top, s = o ? n.right : n.bottom, u = o ? n.width : n.height;\n return r === l || i === s || r + a / 2 === l + u / 2;\n}, Gn = function(e, n) {\n var o;\n return je.some(function(r) {\n var i = r[q].options.emptyInsertThreshold;\n if (!(!i || ht(r))) {\n var a = P(r), l = e >= a.left - i && e <= a.right + i, s = n >= a.top - i && n <= a.bottom + i;\n if (l && s)\n return o = r;\n }\n }), o;\n}, Jt = function(e) {\n function n(i, a) {\n return function(l, s, u, d) {\n var f = l.options.group.name && s.options.group.name && l.options.group.name === s.options.group.name;\n if (i == null && (a || f))\n return !0;\n if (i == null || i === !1)\n return !1;\n if (a && i === \"clone\")\n return i;\n if (typeof i == \"function\")\n return n(i(l, s, u, d), a)(l, s, u, d);\n var m = (a ? l : s).options.group.name;\n return i === !0 || typeof i == \"string\" && i === m || i.join && i.indexOf(m) > -1;\n };\n }\n var o = {}, r = e.group;\n (!r || Ye(r) != \"object\") && (r = {\n name: r\n }), o.name = r.name, o.checkPull = n(r.pull, !0), o.checkPut = n(r.put), o.revertClone = r.revertClone, e.group = o;\n}, Zt = function() {\n !qt && g && h(g, \"display\", \"none\");\n}, Qt = function() {\n !qt && g && h(g, \"display\", \"\");\n};\nVe && !Wt && document.addEventListener(\"click\", function(t) {\n if (Ge)\n return t.preventDefault(), t.stopPropagation && t.stopPropagation(), t.stopImmediatePropagation && t.stopImmediatePropagation(), Ge = !1, !1;\n}, !0);\nvar he = function(e) {\n if (c) {\n e = e.touches ? e.touches[0] : e;\n var n = Gn(e.clientX, e.clientY);\n if (n) {\n var o = {};\n for (var r in e)\n e.hasOwnProperty(r) && (o[r] = e[r]);\n o.target = o.rootEl = n, o.preventDefault = void 0, o.stopPropagation = void 0, n[q]._onDragOver(o);\n }\n }\n}, jn = function(e) {\n c && c.parentNode[q]._isOutsideThisEl(e.target);\n};\nfunction p(t, e) {\n if (!(t && t.nodeType && t.nodeType === 1))\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(t));\n this.el = t, this.options = e = ie({}, e), t[q] = this;\n var n = {\n group: null,\n sort: !0,\n disabled: !1,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(t.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: !1,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: !0,\n direction: function() {\n return Kt(t, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: !0,\n animation: 0,\n easing: null,\n setData: function(a, l) {\n a.setData(\"Text\", l.textContent);\n },\n dropBubble: !1,\n dragoverBubble: !1,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: !1,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: !1,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: !1,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: p.supportPointer !== !1 && \"PointerEvent\" in window && !Te,\n emptyInsertThreshold: 5\n };\n Ne.initializePlugins(this, t, n);\n for (var o in n)\n !(o in e) && (e[o] = n[o]);\n Jt(e);\n for (var r in this)\n r.charAt(0) === \"_\" && typeof this[r] == \"function\" && (this[r] = this[r].bind(this));\n this.nativeDraggable = e.forceFallback ? !1 : Ln, this.nativeDraggable && (this.options.touchStartThreshold = 1), e.supportPointer ? S(t, \"pointerdown\", this._onTapStart) : (S(t, \"mousedown\", this._onTapStart), S(t, \"touchstart\", this._onTapStart)), this.nativeDraggable && (S(t, \"dragover\", this), S(t, \"dragenter\", this)), je.push(this.el), e.store && e.store.get && this.sort(e.store.get(this) || []), ie(this, Xn());\n}\np.prototype = /** @lends Sortable.prototype */\n{\n constructor: p,\n _isOutsideThisEl: function(e) {\n !this.el.contains(e) && e !== this.el && (me = null);\n },\n _getDirection: function(e, n) {\n return typeof this.options.direction == \"function\" ? this.options.direction.call(this, e, n, c) : this.options.direction;\n },\n _onTapStart: function(e) {\n if (e.cancelable) {\n var n = this, o = this.el, r = this.options, i = r.preventOnFilter, a = e.type, l = e.touches && e.touches[0] || e.pointerType && e.pointerType === \"touch\" && e, s = (l || e).target, u = e.target.shadowRoot && (e.path && e.path[0] || e.composedPath && e.composedPath()[0]) || s, d = r.filter;\n if (Zn(o), !c && !(/mousedown|pointerdown/.test(a) && e.button !== 0 || r.disabled) && !u.isContentEditable && !(!this.nativeDraggable && Te && s && s.tagName.toUpperCase() === \"SELECT\") && (s = Q(s, r.draggable, o, !1), !(s && s.animated) && Be !== s)) {\n if (be = J(s), Oe = J(s, r.draggable), typeof d == \"function\") {\n if (d.call(this, e, s, this)) {\n W({\n sortable: n,\n rootEl: u,\n name: \"filter\",\n targetEl: s,\n toEl: o,\n fromEl: o\n }), z(\"filter\", n, {\n evt: e\n }), i && e.cancelable && e.preventDefault();\n return;\n }\n } else if (d && (d = d.split(\",\").some(function(f) {\n if (f = Q(u, f.trim(), o, !1), f)\n return W({\n sortable: n,\n rootEl: f,\n name: \"filter\",\n targetEl: s,\n fromEl: o,\n toEl: o\n }), z(\"filter\", n, {\n evt: e\n }), !0;\n }), d)) {\n i && e.cancelable && e.preventDefault();\n return;\n }\n r.handle && !Q(u, r.handle, o, !1) || this._prepareDragStart(e, l, s);\n }\n }\n },\n _prepareDragStart: function(e, n, o) {\n var r = this, i = r.el, a = r.options, l = i.ownerDocument, s;\n if (o && !c && o.parentNode === i) {\n var u = P(o);\n if (T = i, c = o, O = c.parentNode, pe = c.nextSibling, Be = o, Me = a.group, p.dragged = c, de = {\n target: c,\n clientX: (n || e).clientX,\n clientY: (n || e).clientY\n }, Pt = de.clientX - u.left, Mt = de.clientY - u.top, this._lastX = (n || e).clientX, this._lastY = (n || e).clientY, c.style[\"will-change\"] = \"all\", s = function() {\n if (z(\"delayEnded\", r, {\n evt: e\n }), p.eventCanceled) {\n r._onDrop();\n return;\n }\n r._disableDelayedDragEvents(), !It && r.nativeDraggable && (c.draggable = !0), r._triggerDragStart(e, n), W({\n sortable: r,\n name: \"choose\",\n originalEvent: e\n }), V(c, a.chosenClass, !0);\n }, a.ignore.split(\",\").forEach(function(d) {\n jt(c, d.trim(), nt);\n }), S(l, \"dragover\", he), S(l, \"mousemove\", he), S(l, \"touchmove\", he), S(l, \"mouseup\", r._onDrop), S(l, \"touchend\", r._onDrop), S(l, \"touchcancel\", r._onDrop), It && this.nativeDraggable && (this.options.touchStartThreshold = 4, c.draggable = !0), z(\"delayStart\", this, {\n evt: e\n }), a.delay && (!a.delayOnTouchOnly || n) && (!this.nativeDraggable || !(xe || ae))) {\n if (p.eventCanceled) {\n this._onDrop();\n return;\n }\n S(l, \"mouseup\", r._disableDelayedDrag), S(l, \"touchend\", r._disableDelayedDrag), S(l, \"touchcancel\", r._disableDelayedDrag), S(l, \"mousemove\", r._delayedDragTouchMoveHandler), S(l, \"touchmove\", r._delayedDragTouchMoveHandler), a.supportPointer && S(l, \"pointermove\", r._delayedDragTouchMoveHandler), r._dragStartTimer = setTimeout(s, a.delay);\n } else\n s();\n }\n },\n _delayedDragTouchMoveHandler: function(e) {\n var n = e.touches ? e.touches[0] : e;\n Math.max(Math.abs(n.clientX - this._lastX), Math.abs(n.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1)) && this._disableDelayedDrag();\n },\n _disableDelayedDrag: function() {\n c && nt(c), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function() {\n var e = this.el.ownerDocument;\n E(e, \"mouseup\", this._disableDelayedDrag), E(e, \"touchend\", this._disableDelayedDrag), E(e, \"touchcancel\", this._disableDelayedDrag), E(e, \"mousemove\", this._delayedDragTouchMoveHandler), E(e, \"touchmove\", this._delayedDragTouchMoveHandler), E(e, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function(e, n) {\n n = n || e.pointerType == \"touch\" && e, !this.nativeDraggable || n ? this.options.supportPointer ? S(document, \"pointermove\", this._onTouchMove) : n ? S(document, \"touchmove\", this._onTouchMove) : S(document, \"mousemove\", this._onTouchMove) : (S(c, \"dragend\", this), S(T, \"dragstart\", this._onDragStart));\n try {\n document.selection ? He(function() {\n document.selection.empty();\n }) : window.getSelection().removeAllRanges();\n } catch (o) {\n }\n },\n _dragStarted: function(e, n) {\n if (ve = !1, T && c) {\n z(\"dragStarted\", this, {\n evt: n\n }), this.nativeDraggable && S(document, \"dragover\", jn);\n var o = this.options;\n !e && V(c, o.dragClass, !1), V(c, o.ghostClass, !0), p.active = this, e && this._appendGhost(), W({\n sortable: this,\n name: \"start\",\n originalEvent: n\n });\n } else\n this._nulling();\n },\n _emulateDragOver: function() {\n if (Z) {\n this._lastX = Z.clientX, this._lastY = Z.clientY, Zt();\n for (var e = document.elementFromPoint(Z.clientX, Z.clientY), n = e; e && e.shadowRoot && (e = e.shadowRoot.elementFromPoint(Z.clientX, Z.clientY), e !== n); )\n n = e;\n if (c.parentNode[q]._isOutsideThisEl(e), n)\n do {\n if (n[q]) {\n var o = void 0;\n if (o = n[q]._onDragOver({\n clientX: Z.clientX,\n clientY: Z.clientY,\n target: e,\n rootEl: n\n }), o && !this.options.dragoverBubble)\n break;\n }\n e = n;\n } while (n = n.parentNode);\n Qt();\n }\n },\n _onTouchMove: function(e) {\n if (de) {\n var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, i = e.touches ? e.touches[0] : e, a = g && ye(g, !0), l = g && a && a.a, s = g && a && a.d, u = Re && H && Nt(H), d = (i.clientX - de.clientX + r.x) / (l || 1) + (u ? u[0] - tt[0] : 0) / (l || 1), f = (i.clientY - de.clientY + r.y) / (s || 1) + (u ? u[1] - tt[1] : 0) / (s || 1);\n if (!p.active && !ve) {\n if (o && Math.max(Math.abs(i.clientX - this._lastX), Math.abs(i.clientY - this._lastY)) < o)\n return;\n this._onDragStart(e, !0);\n }\n if (g) {\n a ? (a.e += d - (Qe || 0), a.f += f - (et || 0)) : a = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: d,\n f\n };\n var m = \"matrix(\".concat(a.a, \",\").concat(a.b, \",\").concat(a.c, \",\").concat(a.d, \",\").concat(a.e, \",\").concat(a.f, \")\");\n h(g, \"webkitTransform\", m), h(g, \"mozTransform\", m), h(g, \"msTransform\", m), h(g, \"transform\", m), Qe = d, et = f, Z = i;\n }\n e.cancelable && e.preventDefault();\n }\n },\n _appendGhost: function() {\n if (!g) {\n var e = this.options.fallbackOnBody ? document.body : T, n = P(c, !0, Re, !0, e), o = this.options;\n if (Re) {\n for (H = e; h(H, \"position\") === \"static\" && h(H, \"transform\") === \"none\" && H !== document; )\n H = H.parentNode;\n H !== document.body && H !== document.documentElement ? (H === document && (H = te()), n.top += H.scrollTop, n.left += H.scrollLeft) : H = te(), tt = Nt(H);\n }\n g = c.cloneNode(!0), V(g, o.ghostClass, !1), V(g, o.fallbackClass, !0), V(g, o.dragClass, !0), h(g, \"transition\", \"\"), h(g, \"transform\", \"\"), h(g, \"box-sizing\", \"border-box\"), h(g, \"margin\", 0), h(g, \"top\", n.top), h(g, \"left\", n.left), h(g, \"width\", n.width), h(g, \"height\", n.height), h(g, \"opacity\", \"0.8\"), h(g, \"position\", Re ? \"absolute\" : \"fixed\"), h(g, \"zIndex\", \"100000\"), h(g, \"pointerEvents\", \"none\"), p.ghost = g, e.appendChild(g), h(g, \"transform-origin\", Pt / parseInt(g.style.width) * 100 + \"% \" + Mt / parseInt(g.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function(e, n) {\n var o = this, r = e.dataTransfer, i = o.options;\n if (z(\"dragStart\", this, {\n evt: e\n }), p.eventCanceled) {\n this._onDrop();\n return;\n }\n z(\"setupClone\", this), p.eventCanceled || (C = Vt(c), C.removeAttribute(\"id\"), C.draggable = !1, C.style[\"will-change\"] = \"\", this._hideClone(), V(C, this.options.chosenClass, !1), p.clone = C), o.cloneId = He(function() {\n z(\"clone\", o), !p.eventCanceled && (o.options.removeCloneOnHide || T.insertBefore(C, c), o._hideClone(), W({\n sortable: o,\n name: \"clone\"\n }));\n }), !n && V(c, i.dragClass, !0), n ? (Ge = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (E(document, \"mouseup\", o._onDrop), E(document, \"touchend\", o._onDrop), E(document, \"touchcancel\", o._onDrop), r && (r.effectAllowed = \"move\", i.setData && i.setData.call(o, r, c)), S(document, \"drop\", o), h(c, \"transform\", \"translateZ(0)\")), ve = !0, o._dragStartId = He(o._dragStarted.bind(o, n, e)), S(document, \"selectstart\", o), Se = !0, Te && h(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function(e) {\n var n = this.el, o = e.target, r, i, a, l = this.options, s = l.group, u = p.active, d = Me === s, f = l.sort, m = Y || u, y, b = this, w = !1;\n if (lt)\n return;\n function L(ee, Ee) {\n z(ee, b, ne({\n evt: e,\n isOwner: d,\n axis: y ? \"vertical\" : \"horizontal\",\n revert: a,\n dragRect: r,\n targetRect: i,\n canSort: f,\n fromSortable: m,\n target: o,\n completed: R,\n onMove: function(vt, rn) {\n return Xe(T, n, c, r, vt, P(vt), e, rn);\n },\n changed: j\n }, Ee));\n }\n function G() {\n L(\"dragOverAnimationCapture\"), b.captureAnimationState(), b !== m && m.captureAnimationState();\n }\n function R(ee) {\n return L(\"dragOverCompleted\", {\n insertion: ee\n }), ee && (d ? u._hideClone() : u._showClone(b), b !== m && (V(c, Y ? Y.options.ghostClass : u.options.ghostClass, !1), V(c, l.ghostClass, !0)), Y !== b && b !== p.active ? Y = b : b === p.active && Y && (Y = null), m === b && (b._ignoreWhileAnimating = o), b.animateAll(function() {\n L(\"dragOverAnimationComplete\"), b._ignoreWhileAnimating = null;\n }), b !== m && (m.animateAll(), m._ignoreWhileAnimating = null)), (o === c && !c.animated || o === n && !o.animated) && (me = null), !l.dragoverBubble && !e.rootEl && o !== document && (c.parentNode[q]._isOutsideThisEl(e.target), !ee && he(e)), !l.dragoverBubble && e.stopPropagation && e.stopPropagation(), w = !0;\n }\n function j() {\n $ = J(c), se = J(c, l.draggable), W({\n sortable: b,\n name: \"change\",\n toEl: n,\n newIndex: $,\n newDraggableIndex: se,\n originalEvent: e\n });\n }\n if (e.preventDefault !== void 0 && e.cancelable && e.preventDefault(), o = Q(o, l.draggable, n, !0), L(\"dragOver\"), p.eventCanceled)\n return w;\n if (c.contains(e.target) || o.animated && o.animatingX && o.animatingY || b._ignoreWhileAnimating === o)\n return R(!1);\n if (Ge = !1, u && !l.disabled && (d ? f || (a = O !== T) : Y === this || (this.lastPutMode = Me.checkPull(this, u, c, e)) && s.checkPut(this, u, c, e))) {\n if (y = this._getDirection(e, o) === \"vertical\", r = P(c), L(\"dragOverValid\"), p.eventCanceled)\n return w;\n if (a)\n return O = T, G(), this._hideClone(), L(\"revert\"), p.eventCanceled || (pe ? T.insertBefore(c, pe) : T.appendChild(c)), R(!0);\n var B = ht(n, l.draggable);\n if (!B || $n(e, y, this) && !B.animated) {\n if (B === c)\n return R(!1);\n if (B && n === e.target && (o = B), o && (i = P(o)), Xe(T, n, c, r, o, i, e, !!o) !== !1)\n return G(), B && B.nextSibling ? n.insertBefore(c, B.nextSibling) : n.appendChild(c), O = n, j(), R(!0);\n } else if (B && Vn(e, y, this)) {\n var X = we(n, 0, l, !0);\n if (X === c)\n return R(!1);\n if (o = X, i = P(o), Xe(T, n, c, r, o, i, e, !1) !== !1)\n return G(), n.insertBefore(c, X), O = n, j(), R(!0);\n } else if (o.parentNode === n) {\n i = P(o);\n var K = 0, oe, le = c.parentNode !== n, k = !Wn(c.animated && c.toRect || r, o.animated && o.toRect || i, y), v = y ? \"top\" : \"left\", D = xt(o, \"top\", \"top\") || xt(c, \"top\", \"top\"), A = D ? D.scrollTop : void 0;\n me !== o && (oe = i[v], Ae = !1, Fe = !k && l.invertSwap || le), K = qn(e, o, i, y, k ? 1 : l.swapThreshold, l.invertedSwapThreshold == null ? l.swapThreshold : l.invertedSwapThreshold, Fe, me === o);\n var I;\n if (K !== 0) {\n var _ = J(c);\n do\n _ -= K, I = O.children[_];\n while (I && (h(I, \"display\") === \"none\" || I === g));\n }\n if (K === 0 || I === o)\n return R(!1);\n me = o, Ie = K;\n var x = o.nextElementSibling, M = !1;\n M = K === 1;\n var F = Xe(T, n, c, r, o, i, e, M);\n if (F !== !1)\n return (F === 1 || F === -1) && (M = F === 1), lt = !0, setTimeout(Un, 30), G(), M && !x ? n.appendChild(c) : o.parentNode.insertBefore(c, M ? x : o), D && Ut(D, 0, A - D.scrollTop), O = c.parentNode, oe !== void 0 && !Fe && (ke = Math.abs(oe - P(o)[v])), j(), R(!0);\n }\n if (n.contains(c))\n return R(!1);\n }\n return !1;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function() {\n E(document, \"mousemove\", this._onTouchMove), E(document, \"touchmove\", this._onTouchMove), E(document, \"pointermove\", this._onTouchMove), E(document, \"dragover\", he), E(document, \"mousemove\", he), E(document, \"touchmove\", he);\n },\n _offUpEvents: function() {\n var e = this.el.ownerDocument;\n E(e, \"mouseup\", this._onDrop), E(e, \"touchend\", this._onDrop), E(e, \"pointerup\", this._onDrop), E(e, \"touchcancel\", this._onDrop), E(document, \"selectstart\", this);\n },\n _onDrop: function(e) {\n var n = this.el, o = this.options;\n if ($ = J(c), se = J(c, o.draggable), z(\"drop\", this, {\n evt: e\n }), O = c && c.parentNode, $ = J(c), se = J(c, o.draggable), p.eventCanceled) {\n this._nulling();\n return;\n }\n ve = !1, Fe = !1, Ae = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), st(this.cloneId), st(this._dragStartId), this.nativeDraggable && (E(document, \"drop\", this), E(n, \"dragstart\", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Te && h(document.body, \"user-select\", \"\"), h(c, \"transform\", \"\"), e && (Se && (e.cancelable && e.preventDefault(), !o.dropBubble && e.stopPropagation()), g && g.parentNode && g.parentNode.removeChild(g), (T === O || Y && Y.lastPutMode !== \"clone\") && C && C.parentNode && C.parentNode.removeChild(C), c && (this.nativeDraggable && E(c, \"dragend\", this), nt(c), c.style[\"will-change\"] = \"\", Se && !ve && V(c, Y ? Y.options.ghostClass : this.options.ghostClass, !1), V(c, this.options.chosenClass, !1), W({\n sortable: this,\n name: \"unchoose\",\n toEl: O,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: e\n }), T !== O ? ($ >= 0 && (W({\n rootEl: O,\n name: \"add\",\n toEl: O,\n fromEl: T,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"remove\",\n toEl: O,\n originalEvent: e\n }), W({\n rootEl: O,\n name: \"sort\",\n toEl: O,\n fromEl: T,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"sort\",\n toEl: O,\n originalEvent: e\n })), Y && Y.save()) : $ !== be && $ >= 0 && (W({\n sortable: this,\n name: \"update\",\n toEl: O,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"sort\",\n toEl: O,\n originalEvent: e\n })), p.active && (($ == null || $ === -1) && ($ = be, se = Oe), W({\n sortable: this,\n name: \"end\",\n toEl: O,\n originalEvent: e\n }), this.save()))), this._nulling();\n },\n _nulling: function() {\n z(\"nulling\", this), T = c = O = g = pe = C = Be = ue = de = Z = Se = $ = se = be = Oe = me = Ie = Y = Me = p.dragged = p.ghost = p.clone = p.active = null, ze.forEach(function(e) {\n e.checked = !0;\n }), ze.length = Qe = et = 0;\n },\n handleEvent: function(e) {\n switch (e.type) {\n case \"drop\":\n case \"dragend\":\n this._onDrop(e);\n break;\n case \"dragenter\":\n case \"dragover\":\n c && (this._onDragOver(e), zn(e));\n break;\n case \"selectstart\":\n e.preventDefault();\n break;\n }\n },\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function() {\n for (var e = [], n, o = this.el.children, r = 0, i = o.length, a = this.options; r < i; r++)\n n = o[r], Q(n, a.draggable, this.el, !1) && e.push(n.getAttribute(a.dataIdAttr) || Jn(n));\n return e;\n },\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function(e, n) {\n var o = {}, r = this.el;\n this.toArray().forEach(function(i, a) {\n var l = r.children[a];\n Q(l, this.options.draggable, r, !1) && (o[i] = l);\n }, this), n && this.captureAnimationState(), e.forEach(function(i) {\n o[i] && (r.removeChild(o[i]), r.appendChild(o[i]));\n }), n && this.animateAll();\n },\n /**\n * Save the current sorting\n */\n save: function() {\n var e = this.options.store;\n e && e.set && e.set(this);\n },\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function(e, n) {\n return Q(e, n || this.options.draggable, this.el, !1);\n },\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function(e, n) {\n var o = this.options;\n if (n === void 0)\n return o[e];\n var r = Ne.modifyOption(this, e, n);\n typeof r != \"undefined\" ? o[e] = r : o[e] = n, e === \"group\" && Jt(o);\n },\n /**\n * Destroy\n */\n destroy: function() {\n z(\"destroy\", this);\n var e = this.el;\n e[q] = null, E(e, \"mousedown\", this._onTapStart), E(e, \"touchstart\", this._onTapStart), E(e, \"pointerdown\", this._onTapStart), this.nativeDraggable && (E(e, \"dragover\", this), E(e, \"dragenter\", this)), Array.prototype.forEach.call(e.querySelectorAll(\"[draggable]\"), function(n) {\n n.removeAttribute(\"draggable\");\n }), this._onDrop(), this._disableDelayedDragEvents(), je.splice(je.indexOf(this.el), 1), this.el = e = null;\n },\n _hideClone: function() {\n if (!ue) {\n if (z(\"hideClone\", this), p.eventCanceled)\n return;\n h(C, \"display\", \"none\"), this.options.removeCloneOnHide && C.parentNode && C.parentNode.removeChild(C), ue = !0;\n }\n },\n _showClone: function(e) {\n if (e.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if (ue) {\n if (z(\"showClone\", this), p.eventCanceled)\n return;\n c.parentNode == T && !this.options.group.revertClone ? T.insertBefore(C, c) : pe ? T.insertBefore(C, pe) : T.appendChild(C), this.options.group.revertClone && this.animate(c, C), h(C, \"display\", \"\"), ue = !1;\n }\n }\n};\nfunction zn(t) {\n t.dataTransfer && (t.dataTransfer.dropEffect = \"move\"), t.cancelable && t.preventDefault();\n}\nfunction Xe(t, e, n, o, r, i, a, l) {\n var s, u = t[q], d = u.options.onMove, f;\n return window.CustomEvent && !ae && !xe ? s = new CustomEvent(\"move\", {\n bubbles: !0,\n cancelable: !0\n }) : (s = document.createEvent(\"Event\"), s.initEvent(\"move\", !0, !0)), s.to = e, s.from = t, s.dragged = n, s.draggedRect = o, s.related = r || e, s.relatedRect = i || P(e), s.willInsertAfter = l, s.originalEvent = a, t.dispatchEvent(s), d && (f = d.call(u, s, a)), f;\n}\nfunction nt(t) {\n t.draggable = !1;\n}\nfunction Un() {\n lt = !1;\n}\nfunction Vn(t, e, n) {\n var o = P(we(n.el, 0, n.options, !0)), r = $t(n.el, n.options, g), i = 10;\n return e ? t.clientX < r.left - i || t.clientY < o.top && t.clientX < o.right : t.clientY < r.top - i || t.clientY < o.bottom && t.clientX < o.left;\n}\nfunction $n(t, e, n) {\n var o = P(ht(n.el, n.options.draggable)), r = $t(n.el, n.options, g), i = 10;\n return e ? t.clientX > r.right + i || t.clientY > o.bottom && t.clientX > o.left : t.clientY > r.bottom + i || t.clientX > o.right && t.clientY > o.top;\n}\nfunction qn(t, e, n, o, r, i, a, l) {\n var s = o ? t.clientY : t.clientX, u = o ? n.height : n.width, d = o ? n.top : n.left, f = o ? n.bottom : n.right, m = !1;\n if (!a) {\n if (l && ke < u * r) {\n if (!Ae && (Ie === 1 ? s > d + u * i / 2 : s < f - u * i / 2) && (Ae = !0), Ae)\n m = !0;\n else if (Ie === 1 ? s < d + ke : s > f - ke)\n return -Ie;\n } else if (s > d + u * (1 - r) / 2 && s < f - u * (1 - r) / 2)\n return Kn(e);\n }\n return m = m || a, m && (s < d + u * i / 2 || s > f - u * i / 2) ? s > d + u / 2 ? 1 : -1 : 0;\n}\nfunction Kn(t) {\n return J(c) < J(t) ? 1 : -1;\n}\nfunction Jn(t) {\n for (var e = t.tagName + t.className + t.src + t.href + t.textContent, n = e.length, o = 0; n--; )\n o += e.charCodeAt(n);\n return o.toString(36);\n}\nfunction Zn(t) {\n ze.length = 0;\n for (var e = t.getElementsByTagName(\"input\"), n = e.length; n--; ) {\n var o = e[n];\n o.checked && ze.push(o);\n }\n}\nfunction He(t) {\n return setTimeout(t, 0);\n}\nfunction st(t) {\n return clearTimeout(t);\n}\nVe && S(document, \"touchmove\", function(t) {\n (p.active || ve) && t.cancelable && t.preventDefault();\n});\np.utils = {\n on: S,\n off: E,\n css: h,\n find: jt,\n is: function(e, n) {\n return !!Q(e, n, e, !1);\n },\n extend: Fn,\n throttle: zt,\n closest: Q,\n toggleClass: V,\n clone: Vt,\n index: J,\n nextTick: He,\n cancelNextTick: st,\n detectDirection: Kt,\n getChild: we\n};\np.get = function(t) {\n return t[q];\n};\np.mount = function() {\n for (var t = arguments.length, e = new Array(t), n = 0; n < t; n++)\n e[n] = arguments[n];\n e[0].constructor === Array && (e = e[0]), e.forEach(function(o) {\n if (!o.prototype || !o.prototype.constructor)\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(o));\n o.utils && (p.utils = ne(ne({}, p.utils), o.utils)), Ne.mount(o);\n });\n};\np.create = function(t, e) {\n return new p(t, e);\n};\np.version = Nn;\nvar N = [], De, ut, ct = !1, ot, rt, Ue, _e;\nfunction Qn() {\n function t() {\n this.defaults = {\n scroll: !0,\n forceAutoScrollFallback: !1,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: !0\n };\n for (var e in this)\n e.charAt(0) === \"_\" && typeof this[e] == \"function\" && (this[e] = this[e].bind(this));\n }\n return t.prototype = {\n dragStarted: function(n) {\n var o = n.originalEvent;\n this.sortable.nativeDraggable ? S(document, \"dragover\", this._handleAutoScroll) : this.options.supportPointer ? S(document, \"pointermove\", this._handleFallbackAutoScroll) : o.touches ? S(document, \"touchmove\", this._handleFallbackAutoScroll) : S(document, \"mousemove\", this._handleFallbackAutoScroll);\n },\n dragOverCompleted: function(n) {\n var o = n.originalEvent;\n !this.options.dragOverBubble && !o.rootEl && this._handleAutoScroll(o);\n },\n drop: function() {\n this.sortable.nativeDraggable ? E(document, \"dragover\", this._handleAutoScroll) : (E(document, \"pointermove\", this._handleFallbackAutoScroll), E(document, \"touchmove\", this._handleFallbackAutoScroll), E(document, \"mousemove\", this._handleFallbackAutoScroll)), Rt(), Le(), Rn();\n },\n nulling: function() {\n Ue = ut = De = ct = _e = ot = rt = null, N.length = 0;\n },\n _handleFallbackAutoScroll: function(n) {\n this._handleAutoScroll(n, !0);\n },\n _handleAutoScroll: function(n, o) {\n var r = this, i = (n.touches ? n.touches[0] : n).clientX, a = (n.touches ? n.touches[0] : n).clientY, l = document.elementFromPoint(i, a);\n if (Ue = n, o || this.options.forceAutoScrollFallback || xe || ae || Te) {\n it(n, this.options, l, o);\n var s = ce(l, !0);\n ct && (!_e || i !== ot || a !== rt) && (_e && Rt(), _e = setInterval(function() {\n var u = ce(document.elementFromPoint(i, a), !0);\n u !== s && (s = u, Le()), it(n, r.options, u, o);\n }, 10), ot = i, rt = a);\n } else {\n if (!this.options.bubbleScroll || ce(l, !0) === te()) {\n Le();\n return;\n }\n it(n, this.options, ce(l, !1), !1);\n }\n }\n }, ie(t, {\n pluginName: \"scroll\",\n initializeByDefault: !0\n });\n}\nfunction Le() {\n N.forEach(function(t) {\n clearInterval(t.pid);\n }), N = [];\n}\nfunction Rt() {\n clearInterval(_e);\n}\nvar it = zt(function(t, e, n, o) {\n if (e.scroll) {\n var r = (t.touches ? t.touches[0] : t).clientX, i = (t.touches ? t.touches[0] : t).clientY, a = e.scrollSensitivity, l = e.scrollSpeed, s = te(), u = !1, d;\n ut !== n && (ut = n, Le(), De = e.scroll, d = e.scrollFn, De === !0 && (De = ce(n, !0)));\n var f = 0, m = De;\n do {\n var y = m, b = P(y), w = b.top, L = b.bottom, G = b.left, R = b.right, j = b.width, B = b.height, X = void 0, K = void 0, oe = y.scrollWidth, le = y.scrollHeight, k = h(y), v = y.scrollLeft, D = y.scrollTop;\n y === s ? (X = j < oe && (k.overflowX === \"auto\" || k.overflowX === \"scroll\" || k.overflowX === \"visible\"), K = B < le && (k.overflowY === \"auto\" || k.overflowY === \"scroll\" || k.overflowY === \"visible\")) : (X = j < oe && (k.overflowX === \"auto\" || k.overflowX === \"scroll\"), K = B < le && (k.overflowY === \"auto\" || k.overflowY === \"scroll\"));\n var A = X && (Math.abs(R - r) <= a && v + j < oe) - (Math.abs(G - r) <= a && !!v), I = K && (Math.abs(L - i) <= a && D + B < le) - (Math.abs(w - i) <= a && !!D);\n if (!N[f])\n for (var _ = 0; _ <= f; _++)\n N[_] || (N[_] = {});\n (N[f].vx != A || N[f].vy != I || N[f].el !== y) && (N[f].el = y, N[f].vx = A, N[f].vy = I, clearInterval(N[f].pid), (A != 0 || I != 0) && (u = !0, N[f].pid = setInterval(function() {\n o && this.layer === 0 && p.active._onTouchMove(Ue);\n var x = N[this.layer].vy ? N[this.layer].vy * l : 0, M = N[this.layer].vx ? N[this.layer].vx * l : 0;\n typeof d == \"function\" && d.call(p.dragged.parentNode[q], M, x, t, Ue, N[this.layer].el) !== \"continue\" || Ut(N[this.layer].el, M, x);\n }.bind({\n layer: f\n }), 24))), f++;\n } while (e.bubbleScroll && m !== s && (m = ce(m, !1)));\n ct = u;\n }\n}, 30), en = function(e) {\n var n = e.originalEvent, o = e.putSortable, r = e.dragEl, i = e.activeSortable, a = e.dispatchSortableEvent, l = e.hideGhostForTarget, s = e.unhideGhostForTarget;\n if (n) {\n var u = o || i;\n l();\n var d = n.changedTouches && n.changedTouches.length ? n.changedTouches[0] : n, f = document.elementFromPoint(d.clientX, d.clientY);\n s(), u && !u.el.contains(f) && (a(\"spill\"), this.onSpill({\n dragEl: r,\n putSortable: o\n }));\n }\n};\nfunction pt() {\n}\npt.prototype = {\n startIndex: null,\n dragStart: function(e) {\n var n = e.oldDraggableIndex;\n this.startIndex = n;\n },\n onSpill: function(e) {\n var n = e.dragEl, o = e.putSortable;\n this.sortable.captureAnimationState(), o && o.captureAnimationState();\n var r = we(this.sortable.el, this.startIndex, this.options);\n r ? this.sortable.el.insertBefore(n, r) : this.sortable.el.appendChild(n), this.sortable.animateAll(), o && o.animateAll();\n },\n drop: en\n};\nie(pt, {\n pluginName: \"revertOnSpill\"\n});\nfunction gt() {\n}\ngt.prototype = {\n onSpill: function(e) {\n var n = e.dragEl, o = e.putSortable, r = o || this.sortable;\n r.captureAnimationState(), n.parentNode && n.parentNode.removeChild(n), r.animateAll();\n },\n drop: en\n};\nie(gt, {\n pluginName: \"removeOnSpill\"\n});\np.mount(new Qn());\np.mount(gt, pt);\nfunction eo(t) {\n return t == null ? t : JSON.parse(JSON.stringify(t));\n}\nfunction to(t) {\n dt() && sn(t);\n}\nfunction no(t) {\n dt() ? un(t) : kt(t);\n}\nlet tn = null, nn = null;\nfunction Xt(t = null, e = null) {\n tn = t, nn = e;\n}\nfunction oo() {\n return {\n data: tn,\n clonedData: nn\n };\n}\nconst Yt = Symbol(\"cloneElement\");\nfunction on(...t) {\n var le, k;\n const e = (le = dt()) == null ? void 0 : le.proxy;\n let n = null;\n const o = t[0];\n let [, r, i] = t;\n Array.isArray(U(r)) || (i = r, r = null);\n let a = null;\n const {\n immediate: l = !0,\n clone: s = eo,\n forceFallback: u,\n fallbackOnBody: d,\n customUpdate: f\n } = (k = U(i)) != null ? k : {};\n function m(v) {\n var F;\n const { from: D, oldIndex: A, item: I } = v, _ = Array.from(D.childNodes);\n n = u && !d ? _.slice(0, -1) : _;\n const x = U((F = U(r)) == null ? void 0 : F[A]), M = s(x);\n Xt(x, M), I[Yt] = M;\n }\n function y(v) {\n const D = v.item[Yt];\n if (!wn(D)) {\n if (Ke(v.item), qe(r)) {\n const A = [...U(r)];\n r.value = _t(A, v.newDraggableIndex, D);\n return;\n }\n _t(U(r), v.newDraggableIndex, D);\n }\n }\n function b(v) {\n const { from: D, item: A, oldIndex: I, oldDraggableIndex: _, pullMode: x, clone: M } = v;\n if (Tt(D, A, I), x === \"clone\") {\n Ke(M);\n return;\n }\n if (qe(r)) {\n const F = [...U(r)];\n r.value = Dt(F, _);\n return;\n }\n Dt(U(r), _);\n }\n function w(v) {\n if (f) {\n f(v);\n return;\n }\n const { from: D, item: A, oldIndex: I, oldDraggableIndex: _, newDraggableIndex: x } = v;\n if (Ke(A), Tt(D, A, I), qe(r)) {\n const M = [...U(r)];\n r.value = St(\n M,\n _,\n x\n );\n return;\n }\n St(U(r), _, x);\n }\n function L(v) {\n const { newIndex: D, oldIndex: A, from: I, to: _ } = v;\n let x = null;\n const M = D === A && I === _;\n try {\n if (M) {\n let F = null;\n n == null || n.some((ee, Ee) => {\n if (F && (n == null ? void 0 : n.length) !== _.childNodes.length)\n return I.insertBefore(F, ee.nextSibling), !0;\n const mt = _.childNodes[Ee];\n F = _ == null ? void 0 : _.replaceChild(ee, mt);\n });\n }\n } catch (F) {\n x = F;\n } finally {\n n = null;\n }\n kt(() => {\n if (Xt(), x)\n throw x;\n });\n }\n const G = {\n onUpdate: w,\n onStart: m,\n onAdd: y,\n onRemove: b,\n onEnd: L\n };\n function R(v) {\n const D = U(o);\n return v || (v = En(D) ? Sn(D, e == null ? void 0 : e.$el) : D), v && !Tn(v) && (v = v.$el), v || vn(\"Root element not found\"), v;\n }\n function j() {\n var I;\n const _ = (I = U(i)) != null ? I : {}, { immediate: v, clone: D } = _, A = $e(_, [\"immediate\", \"clone\"]);\n return Ct(A, (x, M) => {\n Cn(x) && (A[x] = (F, ...ee) => {\n const Ee = oo();\n return On(F, Ee), M(F, ...ee);\n });\n }), _n(\n r === null ? {} : G,\n A\n );\n }\n const B = (v) => {\n v = R(v), a && X.destroy(), a = new p(v, j());\n };\n ln(\n () => i,\n () => {\n a && Ct(j(), (v, D) => {\n a == null || a.option(v, D);\n });\n },\n { deep: !0 }\n );\n const X = {\n option: (v, D) => a == null ? void 0 : a.option(v, D),\n destroy: () => {\n a == null || a.destroy(), a = null;\n },\n save: () => a == null ? void 0 : a.save(),\n toArray: () => a == null ? void 0 : a.toArray(),\n closest: (...v) => a == null ? void 0 : a.closest(...v)\n }, K = () => X == null ? void 0 : X.option(\"disabled\", !0), oe = () => X == null ? void 0 : X.option(\"disabled\", !1);\n return no(() => {\n l && B();\n }), to(X.destroy), fe({ start: B, pause: K, resume: oe }, X);\n}\nconst ft = [\n \"update\",\n \"start\",\n \"add\",\n \"remove\",\n \"choose\",\n \"unchoose\",\n \"end\",\n \"sort\",\n \"filter\",\n \"clone\",\n \"move\",\n \"change\"\n], ro = [\n \"clone\",\n \"animation\",\n \"ghostClass\",\n \"group\",\n \"sort\",\n \"disabled\",\n \"store\",\n \"handle\",\n \"draggable\",\n \"swapThreshold\",\n \"invertSwap\",\n \"invertedSwapThreshold\",\n \"removeCloneOnHide\",\n \"direction\",\n \"chosenClass\",\n \"dragClass\",\n \"ignore\",\n \"filter\",\n \"preventOnFilter\",\n \"easing\",\n \"setData\",\n \"dropBubble\",\n \"dragoverBubble\",\n \"dataIdAttr\",\n \"delay\",\n \"delayOnTouchOnly\",\n \"touchStartThreshold\",\n \"forceFallback\",\n \"fallbackClass\",\n \"fallbackOnBody\",\n \"fallbackTolerance\",\n \"fallbackOffset\",\n \"supportPointer\",\n \"emptyInsertThreshold\",\n \"scroll\",\n \"forceAutoScrollFallback\",\n \"scrollSensitivity\",\n \"scrollSpeed\",\n \"bubbleScroll\",\n \"modelValue\",\n \"tag\",\n \"target\",\n \"customUpdate\",\n ...ft.map((t) => `on${t.replace(/^\\S/, (e) => e.toUpperCase())}`)\n], lo = cn({\n name: \"VueDraggable\",\n model: {\n prop: \"modelValue\",\n event: \"update:modelValue\"\n },\n props: ro,\n emits: [\"update:modelValue\", ...ft],\n setup(t, { slots: e, emit: n, expose: o, attrs: r }) {\n const i = ft.reduce((d, f) => {\n const m = `on${f.replace(/^\\S/, (y) => y.toUpperCase())}`;\n return d[m] = (...y) => n(f, ...y), d;\n }, {}), a = Et(() => {\n const y = fn(t), { modelValue: d } = y, f = $e(y, [\"modelValue\"]), m = Object.entries(f).reduce((b, [w, L]) => {\n const G = U(L);\n return G !== void 0 && (b[w] = G), b;\n }, {});\n return fe(fe({}, i), yn(fe(fe({}, r), m)));\n }), l = Et({\n get: () => t.modelValue,\n set: (d) => n(\"update:modelValue\", d)\n }), s = dn(), u = hn(\n on(t.target || s, l, a)\n );\n return o(u), () => {\n var d;\n return pn(t.tag || \"div\", { ref: s }, (d = e == null ? void 0 : e.default) == null ? void 0 : d.call(e, u));\n };\n }\n}), Bt = {\n mounted: \"mounted\",\n unmounted: \"unmounted\"\n}, at = /* @__PURE__ */ new WeakMap(), so = {\n [Bt.mounted](t, e) {\n const n = gn(e.value) ? [e.value] : e.value, [o, r] = n, i = on(t, o, r);\n at.set(t, i.destroy);\n },\n [Bt.unmounted](t) {\n var e;\n (e = at.get(t)) == null || e(), at.delete(t);\n }\n};\nexport {\n lo as VueDraggable,\n on as useDraggable,\n so as vDraggable\n};\n","<script setup lang=\"ts\" generic=\"T extends KanbanCard = KanbanCard\">\nimport { computed, nextTick, ref, useId, useTemplateRef } from 'vue'\nimport { VueDraggable } from 'vue-draggable-plus'\nimport WxBadge from '../Badge/Badge.vue'\nimport WxButton from '../Button/Button.vue'\nimport WxEntityCard from '../EntityCard/EntityCard.vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type {\n KanbanCard,\n KanbanColumn,\n KanbanEmits,\n KanbanId,\n KanbanProps,\n KanbanVia,\n} from './types'\n\ndefineOptions({ name: 'WxKanban', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<KanbanProps<T>>(), {\n group: undefined,\n size: 'md',\n columnWidth: 288,\n disabled: false,\n handle: undefined,\n addable: false,\n addLabel: 'Add a card',\n collapsible: false,\n reorderColumns: false,\n columnAddable: false,\n addColumnLabel: 'Add a column',\n emptyText: 'Nothing here yet',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<KanbanEmits<T>>()\n\ndefineSlots<{\n /** One card. Without it the board falls back to the card's own title. */\n card?: (props: { card: T; column: KanbanColumn<T>; index: number }) => unknown\n /** Replaces the title and the count above a column. */\n 'column-header'?: (props: {\n column: KanbanColumn<T>\n count: number\n overLimit: boolean\n }) => unknown\n /** The end of a column's heading — a plus, a menu, whatever the column can do. */\n 'column-actions'?: (props: { column: KanbanColumn<T>; collapsed: boolean }) => unknown\n /** Under the cards, where the add button would be. */\n 'column-footer'?: (props: { column: KanbanColumn<T> }) => unknown\n /** Shown in a column holding no cards. */\n empty?: (props: { column: KanbanColumn<T> }) => unknown\n /** After the last column, in place of the add-a-column button. */\n default?: () => unknown\n}>()\n\n/** Which columns are folded down. Bind it to remember them between visits. */\nconst collapsed = defineModel<KanbanId[]>('collapsed', { default: () => [] })\n\nconst root = useTemplateRef<HTMLElement>('root')\n\n/** Boards exchange cards only when they are told to share a name. */\nconst ownId = useId()\nconst cardGroup = computed(() => props.group ?? `wx-kanban-cards-${ownId}`)\n\nconst boardStyle = computed(() => ({\n '--wx-kanban-column-width':\n typeof props.columnWidth === 'number' ? `${props.columnWidth}px` : props.columnWidth,\n}))\n\nfunction isFull(column: KanbanColumn<T>) {\n return column.limit !== undefined && column.items.length >= column.limit\n}\n\nfunction isCollapsed(column: KanbanColumn<T>) {\n return collapsed.value.includes(column.id)\n}\n\n/** A folded column has nowhere to put a card, so it is closed to them as well. */\nfunction isLocked(column: KanbanColumn<T>) {\n return props.disabled || Boolean(column.disabled) || isCollapsed(column)\n}\n\nfunction columnById(id: KanbanId | string) {\n return props.columns.find((column) => String(column.id) === String(id))\n}\n\nfunction cardTitle(card: T) {\n const named = card as { title?: unknown; name?: unknown; label?: unknown }\n return String(named.title ?? named.name ?? named.label ?? card.id)\n}\n\nfunction nameOf(column: KanbanColumn<T>) {\n return String(column.title ?? column.id)\n}\n\nfunction toggle(column: KanbanColumn<T>) {\n collapsed.value = isCollapsed(column)\n ? collapsed.value.filter((id) => id !== column.id)\n : [...collapsed.value, column.id]\n}\n\n/**\n * A work-in-progress limit is only worth drawing if it also refuses the card. The\n * column's own group decides what may be dropped into it; reordering inside a full\n * column stays allowed, since that does not make it any fuller.\n */\nfunction groupFor(column: KanbanColumn<T>) {\n return {\n name: cardGroup.value,\n pull: !isLocked(column),\n put: (to: unknown, from: unknown) => {\n if (isLocked(column)) return false\n return to === from || !isFull(column)\n },\n }\n}\n\n/* ---------------------------------------------------------------------------\n * Moving a card\n * ------------------------------------------------------------------------- */\n\nfunction move(\n from: KanbanColumn<T>,\n fromIndex: number,\n to: KanbanColumn<T>,\n toIndex: number,\n via: KanbanVia,\n) {\n const [card] = from.items.splice(fromIndex, 1)\n if (!card) return\n\n to.items.splice(toIndex, 0, card)\n emit('move', {\n card,\n from: { column: from.id, index: fromIndex },\n to: { column: to.id, index: toIndex },\n via,\n })\n}\n\n/**\n * A pointer drag is over by the time this runs — the library moved the card between\n * the arrays itself, and all that is left is to say what happened. Each list carries\n * its column id in the DOM so the event can be read back into our own terms.\n */\nfunction onCardDrop(event: {\n from: HTMLElement\n to: HTMLElement\n oldIndex?: number\n newIndex?: number\n}) {\n const fromId = event.from.dataset.columnId\n const toId = event.to.dataset.columnId\n const fromIndex = event.oldIndex ?? -1\n const toIndex = event.newIndex ?? -1\n if (fromId === undefined || toId === undefined || fromIndex < 0 || toIndex < 0) return\n if (fromId === toId && fromIndex === toIndex) return\n\n const to = columnById(toId)\n const card = to?.items[toIndex]\n if (!to || !card) return\n\n emit('move', {\n card,\n from: { column: columnById(fromId)?.id ?? fromId, index: fromIndex },\n to: { column: to.id, index: toIndex },\n via: 'pointer',\n })\n}\n\n/* ---------------------------------------------------------------------------\n * Moving a column\n * ------------------------------------------------------------------------- */\n\n/*\n * Writing into `columns` is the board's contract rather than an accident: a move has\n * to be visible the moment it happens, and the array the caller passed is the one\n * their own `ref` holds — the cards are moved between `column.items` the same way, a\n * level deeper than the rule can see. Assigning to the prop itself is still off the\n * table; only its contents are rearranged.\n */\n/* eslint-disable vue/no-mutating-props */\n\n/**\n * The new order of the columns, written back into the array it came from.\n */\nconst columnOrder = computed({\n get: () => props.columns,\n set: (next) => {\n props.columns.splice(0, props.columns.length, ...next)\n },\n})\n\nfunction moveColumn(from: number, to: number, via: KanbanVia) {\n if (to < 0 || to >= props.columns.length || from === to) return\n\n const [column] = props.columns.splice(from, 1)\n if (!column) return\n\n props.columns.splice(to, 0, column)\n emit('column-move', { column, from, to, via })\n}\n\n/* eslint-enable vue/no-mutating-props */\n\nfunction onColumnDrop(event: { oldDraggableIndex?: number; newDraggableIndex?: number }) {\n const from = event.oldDraggableIndex ?? -1\n const to = event.newDraggableIndex ?? -1\n if (from < 0 || to < 0 || from === to) return\n\n const column = props.columns[to]\n if (!column) return\n\n emit('column-move', { column, from, to, via: 'pointer' })\n}\n\n/* ---------------------------------------------------------------------------\n * Moving without a mouse\n *\n * SortableJS is a pointer library and has nothing to say to a keyboard, so the board\n * carries its own: space picks a card — or a column — up, the arrows move it, space\n * drops it, escape puts it back. It is the same two array operations a drag performs;\n * what a keyboard needs on top is somewhere to read the result, and that is the live\n * region.\n * ------------------------------------------------------------------------- */\n\nconst grabbed = ref<{\n id: KanbanId\n column: KanbanId\n origin: { column: KanbanId; index: number }\n} | null>(null)\n\nconst grabbedColumn = ref<{ id: KanbanId; origin: number } | null>(null)\n\nconst announcement = ref('')\n\nfunction isGrabbed(card: T) {\n return grabbed.value?.id === card.id\n}\n\nfunction isColumnGrabbed(column: KanbanColumn<T>) {\n return grabbedColumn.value?.id === column.id\n}\n\nfunction positionOf(card: T, column: KanbanColumn<T>) {\n return `${column.items.indexOf(card) + 1} of ${column.items.length}`\n}\n\n/**\n * Whatever moved is in a different element now, so the focus has to follow it there.\n * The id is compared rather than written into a selector: an id belongs to the\n * application, and quoting one into CSS needs an escape not every environment has.\n */\nasync function refocus(attribute: 'data-card-id' | 'data-column-grip', id: KanbanId) {\n await nextTick()\n\n const wanted = String(id)\n const elements = root.value?.querySelectorAll<HTMLElement>(`[${attribute}]`) ?? []\n for (const element of elements) {\n if (element.getAttribute(attribute) === wanted) {\n element.focus()\n return\n }\n }\n}\n\nfunction onCardKeydown(event: KeyboardEvent, card: T, column: KanbanColumn<T>, index: number) {\n /* A button or a link inside a card keeps its own keys. */\n if (event.target !== event.currentTarget) return\n if (isLocked(column)) return\n\n const held = isGrabbed(card)\n\n if (event.key === ' ' || event.key === 'Spacebar' || event.key === 'Enter') {\n event.preventDefault()\n if (held) {\n grabbed.value = null\n announcement.value = `Dropped ${cardTitle(card)} in ${nameOf(column)}, ${positionOf(card, column)}.`\n } else {\n grabbed.value = { id: card.id, column: column.id, origin: { column: column.id, index } }\n announcement.value = `Picked up ${cardTitle(card)}. Use the arrow keys to move it, space to drop it, escape to put it back.`\n }\n return\n }\n\n if (!held) return\n\n if (event.key === 'Escape') {\n event.preventDefault()\n const state = grabbed.value\n grabbed.value = null\n if (!state) return\n\n const current = columnById(state.column)\n const origin = columnById(state.origin.column)\n if (current && origin) {\n const at = current.items.indexOf(card)\n if (at >= 0) move(current, at, origin, state.origin.index, 'keyboard')\n }\n\n announcement.value = 'Move cancelled.'\n void refocus('data-card-id', card.id)\n return\n }\n\n const steps: Record<string, () => void> = {\n ArrowUp: () => stepCard(card, column, -1),\n ArrowDown: () => stepCard(card, column, 1),\n ArrowLeft: () => shiftCard(card, column, -1),\n ArrowRight: () => shiftCard(card, column, 1),\n }\n\n const run = steps[event.key]\n if (!run) return\n\n event.preventDefault()\n run()\n}\n\nfunction stepCard(card: T, column: KanbanColumn<T>, offset: number) {\n const index = column.items.indexOf(card)\n const next = index + offset\n if (next < 0 || next >= column.items.length) return\n\n move(column, index, column, next, 'keyboard')\n announcement.value = `${cardTitle(card)} is now ${positionOf(card, column)} in ${nameOf(column)}.`\n void refocus('data-card-id', card.id)\n}\n\nfunction shiftCard(card: T, column: KanbanColumn<T>, offset: number) {\n const columnIndex = props.columns.indexOf(column)\n\n /* Past a column that refuses the card there may still be one that takes it. */\n for (let i = columnIndex + offset; i >= 0 && i < props.columns.length; i += offset) {\n const target = props.columns[i]\n if (isLocked(target) || isFull(target)) continue\n\n const index = column.items.indexOf(card)\n move(column, index, target, Math.min(index, target.items.length), 'keyboard')\n\n if (grabbed.value) grabbed.value = { ...grabbed.value, column: target.id }\n announcement.value = `${cardTitle(card)} moved to ${nameOf(target)}, ${positionOf(card, target)}.`\n void refocus('data-card-id', card.id)\n return\n }\n\n announcement.value = `${nameOf(column)} is the last column that can take ${cardTitle(card)}.`\n}\n\nfunction onColumnKeydown(event: KeyboardEvent, column: KanbanColumn<T>, index: number) {\n if (event.target !== event.currentTarget) return\n if (!props.reorderColumns || props.disabled) return\n\n const held = isColumnGrabbed(column)\n\n if (event.key === ' ' || event.key === 'Spacebar' || event.key === 'Enter') {\n event.preventDefault()\n if (held) {\n grabbedColumn.value = null\n announcement.value = `Dropped ${nameOf(column)}, ${index + 1} of ${props.columns.length}.`\n } else {\n grabbedColumn.value = { id: column.id, origin: index }\n announcement.value = `Picked up the ${nameOf(column)} column. Use the left and right arrows to move it.`\n }\n return\n }\n\n if (!held) return\n\n if (event.key === 'Escape') {\n event.preventDefault()\n const state = grabbedColumn.value\n grabbedColumn.value = null\n if (state) moveColumn(props.columns.indexOf(column), state.origin, 'keyboard')\n\n announcement.value = 'Move cancelled.'\n void refocus('data-column-grip', column.id)\n return\n }\n\n const offsets: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1 }\n const offset = offsets[event.key]\n if (offset === undefined) return\n\n event.preventDefault()\n const at = props.columns.indexOf(column)\n moveColumn(at, at + offset, 'keyboard')\n announcement.value = `${nameOf(column)} is now ${props.columns.indexOf(column) + 1} of ${props.columns.length}.`\n void refocus('data-column-grip', column.id)\n}\n\nconst classes = computed(() => ['wx-kanban', `wx-kanban--${props.size}`])\n\ndefineExpose({ move, moveColumn, toggle })\n</script>\n\n<template>\n <div\n ref=\"root\"\n v-bind=\"$attrs\"\n :class=\"classes\"\n :style=\"boardStyle\"\n role=\"group\"\n :aria-label=\"ariaLabel\"\n >\n <!--\n Only the columns are items of this list; the tail that adds a column rides along\n inside the same scroller so it stays at the end of the row wherever that is.\n -->\n <vue-draggable\n v-model=\"columnOrder\"\n class=\"wx-kanban__scroller\"\n :group=\"{ name: `wx-kanban-columns-${ownId}`, pull: false, put: false }\"\n :disabled=\"!reorderColumns || disabled\"\n draggable=\".wx-kanban__column\"\n handle=\".wx-kanban__grip\"\n filter=\"button, a, .wx-kanban__actions\"\n :prevent-on-filter=\"false\"\n :animation=\"160\"\n @end=\"onColumnDrop\"\n >\n <section\n v-for=\"(column, columnIndex) in columns\"\n :key=\"column.id\"\n class=\"wx-kanban__column\"\n :class=\"[\n `wx-kanban__column--${column.tone ?? 'default'}`,\n {\n 'is-collapsed': isCollapsed(column),\n 'is-locked': disabled || column.disabled,\n 'is-grabbed': isColumnGrabbed(column),\n },\n ]\"\n >\n <!-- Folded down, a column is a strip with its name read the long way. -->\n <div\n v-if=\"isCollapsed(column)\"\n class=\"wx-kanban__strip wx-kanban__grip\"\n :data-column-grip=\"column.id\"\n :tabindex=\"reorderColumns && !disabled ? 0 : -1\"\n @keydown=\"onColumnKeydown($event, column, columnIndex)\"\n >\n <button\n class=\"wx-kanban__expand\"\n type=\"button\"\n :aria-expanded=\"false\"\n :aria-label=\"`Expand ${nameOf(column)}`\"\n @click=\"toggle(column)\"\n >\n <wx-icon name=\"chevron-right\" />\n </button>\n <span class=\"wx-kanban__title wx-kanban__title--vertical\">{{ nameOf(column) }}</span>\n <wx-badge size=\"sm\" round :type=\"isFull(column) ? 'danger' : 'default'\">\n {{ column.items.length }}\n </wx-badge>\n </div>\n\n <template v-else>\n <header\n class=\"wx-kanban__head wx-kanban__grip\"\n :data-column-grip=\"column.id\"\n :tabindex=\"reorderColumns && !disabled ? 0 : -1\"\n :role=\"reorderColumns && !disabled ? 'button' : undefined\"\n :aria-roledescription=\"reorderColumns && !disabled ? 'Draggable column' : undefined\"\n :aria-pressed=\"reorderColumns && !disabled ? isColumnGrabbed(column) : undefined\"\n @keydown=\"onColumnKeydown($event, column, columnIndex)\"\n >\n <button\n v-if=\"collapsible\"\n class=\"wx-kanban__collapse\"\n type=\"button\"\n :aria-expanded=\"true\"\n :aria-label=\"`Collapse ${nameOf(column)}`\"\n @click=\"toggle(column)\"\n >\n <wx-icon name=\"chevron-left\" />\n </button>\n\n <slot\n name=\"column-header\"\n :column=\"column\"\n :count=\"column.items.length\"\n :over-limit=\"isFull(column)\"\n >\n <span class=\"wx-kanban__title\">{{ nameOf(column) }}</span>\n <wx-badge\n class=\"wx-kanban__count\"\n size=\"sm\"\n round\n :type=\"isFull(column) ? 'danger' : 'default'\"\n >\n {{ column.items.length\n }}<template v-if=\"column.limit\">/{{ column.limit }}</template>\n </wx-badge>\n </slot>\n\n <span v-if=\"$slots['column-actions']\" class=\"wx-kanban__actions\">\n <slot name=\"column-actions\" :column=\"column\" :collapsed=\"false\" />\n </span>\n </header>\n\n <vue-draggable\n v-model=\"column.items\"\n class=\"wx-kanban__list\"\n :data-column-id=\"column.id\"\n :group=\"groupFor(column)\"\n :disabled=\"isLocked(column)\"\n :handle=\"handle\"\n :animation=\"160\"\n :delay=\"150\"\n :delay-on-touch-only=\"true\"\n ghost-class=\"wx-kanban__card--ghost\"\n chosen-class=\"wx-kanban__card--chosen\"\n @end=\"onCardDrop\"\n >\n <div\n v-for=\"(card, index) in column.items\"\n :key=\"card.id\"\n class=\"wx-kanban__card\"\n :class=\"{ 'is-grabbed': isGrabbed(card) }\"\n :data-card-id=\"card.id\"\n :tabindex=\"isLocked(column) ? -1 : 0\"\n role=\"button\"\n aria-roledescription=\"Draggable card\"\n :aria-pressed=\"isGrabbed(card)\"\n @keydown=\"onCardKeydown($event, card, column, index)\"\n >\n <slot name=\"card\" :card=\"card\" :column=\"column\" :index=\"index\">\n <wx-entity-card :title=\"cardTitle(card)\" variant=\"card\" bordered size=\"sm\" />\n </slot>\n </div>\n </vue-draggable>\n\n <p v-if=\"column.items.length === 0\" class=\"wx-kanban__empty\">\n <slot name=\"empty\" :column=\"column\">{{ emptyText }}</slot>\n </p>\n\n <footer v-if=\"addable || $slots['column-footer']\" class=\"wx-kanban__foot\">\n <slot name=\"column-footer\" :column=\"column\">\n <wx-button\n class=\"wx-kanban__add\"\n variant=\"text\"\n size=\"sm\"\n block\n :disabled=\"isLocked(column) || isFull(column)\"\n @click=\"emit('add', column)\"\n >\n <template #icon><wx-icon name=\"plus\" /></template>\n {{ addLabel }}\n </wx-button>\n </slot>\n </footer>\n </template>\n </section>\n\n <div v-if=\"columnAddable || $slots.default\" class=\"wx-kanban__tail\">\n <slot>\n <button class=\"wx-kanban__add-column\" type=\"button\" @click=\"emit('add-column')\">\n <wx-icon name=\"plus\" />\n <span class=\"wx-kanban__title--vertical\">{{ addColumnLabel }}</span>\n </button>\n </slot>\n </div>\n </vue-draggable>\n\n <!-- What a keyboard move says out loud. -->\n <div class=\"wx-kanban__live\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style scoped>\n.wx-kanban {\n --wx-kanban-column-width: 288px;\n\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n /* The board is as tall as it is given; the columns scroll inside it, not the page. */\n min-height: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n container-type: inline-size;\n}\n\n.wx-kanban__scroller {\n display: flex;\n align-items: stretch;\n gap: var(--wx-space-12);\n min-height: 0;\n padding-bottom: var(--wx-space-6);\n overflow-x: auto;\n /* A swipe across the board must not turn into a page swipe or a back gesture. */\n overscroll-behavior-inline: contain;\n scroll-snap-type: inline proximity;\n}\n\n.wx-kanban__column {\n display: flex;\n flex: 0 0 auto;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--wx-kanban-column-width);\n min-height: 0;\n background: var(--wx-bg-muted);\n border-top: 3px solid var(--wx-kanban-tone, var(--wx-border-default));\n border-radius: var(--wx-radius-md);\n scroll-snap-align: start;\n transition: width var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-kanban__column--primary {\n --wx-kanban-tone: var(--wx-color-primary);\n}\n\n.wx-kanban__column--success {\n --wx-kanban-tone: var(--wx-color-success);\n}\n\n.wx-kanban__column--warning {\n --wx-kanban-tone: var(--wx-color-warning);\n}\n\n.wx-kanban__column--danger {\n --wx-kanban-tone: var(--wx-color-danger);\n}\n\n.wx-kanban__column--info {\n --wx-kanban-tone: var(--wx-color-info);\n}\n\n.wx-kanban__column.is-locked {\n opacity: 0.7;\n}\n\n.wx-kanban__column.is-collapsed {\n width: 48px;\n}\n\n.wx-kanban__column.is-grabbed {\n box-shadow: var(--wx-ring-focus), var(--wx-shadow-md);\n}\n\n.wx-kanban__head {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n padding: var(--wx-space-12) var(--wx-space-12) var(--wx-space-8);\n border-radius: var(--wx-radius-md) var(--wx-radius-md) 0 0;\n}\n\n/* The heading is what a column is dragged by, so it says so under the pointer. */\n.wx-kanban__grip {\n cursor: grab;\n}\n\n.wx-kanban__grip:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-kanban__title {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Read down the strip of a folded column, the way a spine is. */\n.wx-kanban__title--vertical {\n flex: 0 1 auto;\n max-height: 100%;\n writing-mode: vertical-rl;\n}\n\n.wx-kanban__count,\n.wx-kanban__actions {\n flex: 0 0 auto;\n}\n\n.wx-kanban__actions {\n display: flex;\n align-items: center;\n gap: var(--wx-space-2);\n cursor: default;\n}\n\n.wx-kanban__collapse,\n.wx-kanban__expand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-kanban__collapse:hover,\n.wx-kanban__expand:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-kanban__collapse:focus-visible,\n.wx-kanban__expand:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-kanban__strip {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n gap: var(--wx-space-8);\n min-height: 0;\n padding: var(--wx-space-10) 0;\n overflow: hidden;\n}\n\n.wx-kanban__list {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--wx-space-8);\n /* Room to drop a card into a column that has none. */\n min-height: 40px;\n padding: 0 var(--wx-space-8);\n overflow-y: auto;\n}\n\n.wx-kanban__card {\n border-radius: var(--wx-radius-sm);\n cursor: grab;\n}\n\n.wx-kanban__card:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Held by the keyboard: the same ring, plus the lift a dragged card has. */\n.wx-kanban__card.is-grabbed {\n box-shadow: var(--wx-ring-focus), var(--wx-shadow-md);\n}\n\n/* What is left behind in the list while the card is being dragged. */\n.wx-kanban__card--ghost {\n opacity: 0.4;\n}\n\n.wx-kanban__card--chosen {\n cursor: grabbing;\n}\n\n.wx-kanban__empty {\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12) 0;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-kanban__foot {\n padding: var(--wx-space-8);\n}\n\n.wx-kanban__tail {\n display: flex;\n flex: 0 0 auto;\n align-items: stretch;\n}\n\n/* A column-shaped button, so the end of the row reads as a place for one more. */\n.wx-kanban__add-column {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 48px;\n padding: var(--wx-space-10) 0;\n background: var(--wx-bg-subtle);\n border: 1px dashed var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-muted);\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n cursor: pointer;\n transition: color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-kanban__add-column:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-kanban__add-column:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Read out, never drawn. */\n.wx-kanban__live {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.wx-kanban--sm .wx-kanban__head {\n padding: var(--wx-space-8) var(--wx-space-10) var(--wx-space-6);\n}\n\n.wx-kanban--sm .wx-kanban__list {\n gap: var(--wx-space-6);\n padding: 0 var(--wx-space-6);\n}\n\n/*\n * On a phone a column of a fixed 288px leaves a slice of the next one showing, which\n * reads as clutter rather than as a hint. Below that width a column takes most of the\n * screen and the swipe snaps to it. Asked of the board, not of the window: the same\n * squeeze happens in a narrow panel on a wide monitor.\n */\n@container (max-width: 560px) {\n .wx-kanban__scroller {\n scroll-snap-type: inline mandatory;\n }\n\n .wx-kanban__column:not(.is-collapsed) {\n width: min(88cqw, 320px);\n }\n}\n\n/* A finger needs a bigger target, and a long press to tell a drag from a scroll. */\n@media (pointer: coarse) {\n .wx-kanban__card,\n .wx-kanban__grip {\n cursor: default;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-kanban__column {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { LinkEmits, LinkProps } from './types'\n\ndefineOptions({ name: 'WxLink', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<LinkProps>(), {\n href: undefined,\n target: undefined,\n rel: undefined,\n type: 'default',\n underline: 'hover',\n size: undefined,\n weight: undefined,\n disabled: false,\n external: false,\n as: undefined,\n})\n\nconst emit = defineEmits<LinkEmits>()\n\nconst tag = computed(() => props.as ?? 'a')\n\n/** `noopener` is not optional on a `_blank` link — the opened page can steal the tab. */\nconst linkAttrs = computed(() => {\n const target = props.target ?? (props.external ? '_blank' : undefined)\n const rel = props.rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined)\n const href = props.disabled ? undefined : props.href\n\n /*\n * Only the attributes we actually have: rendering through `RouterLink`, a stray\n * `href: undefined` in the fallthrough would wipe out the href the router writes.\n */\n const attrs: Record<string, unknown> = {}\n if (href !== undefined) attrs.href = href\n if (target !== undefined) attrs.target = target\n if (rel !== undefined) attrs.rel = rel\n if (props.disabled) {\n attrs['aria-disabled'] = 'true'\n attrs.tabindex = -1\n }\n return attrs\n})\n\nconst classes = computed(() => [\n 'wx-link',\n `wx-link--${props.type}`,\n `wx-link--underline-${props.underline}`,\n {\n [`wx-link--${props.size}`]: Boolean(props.size),\n [`wx-link--weight-${props.weight}`]: Boolean(props.weight),\n 'is-disabled': props.disabled,\n },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <component :is=\"tag\" v-bind=\"{ ...linkAttrs, ...$attrs }\" :class=\"classes\" @click=\"onClick\">\n <span v-if=\"$slots.icon\" class=\"wx-link__icon\">\n <slot name=\"icon\" />\n </span>\n <slot />\n <wx-icon v-if=\"external\" class=\"wx-link__external\" name=\"external-link\" size=\"0.85em\" />\n </component>\n</template>\n\n<style scoped>\n.wx-link {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n color: var(--wx-link-color, var(--wx-text-link));\n font-family: inherit;\n font-size: inherit;\n text-decoration: none;\n cursor: pointer;\n transition: color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-link:hover {\n color: var(--wx-link-hover, var(--wx-link-color));\n}\n\n.wx-link:focus-visible {\n outline: none;\n border-radius: var(--wx-radius-xs);\n box-shadow: var(--wx-ring-focus);\n}\n\n/* types */\n.wx-link--default {\n --wx-link-color: var(--wx-text-link);\n --wx-link-hover: var(--wx-color-primary-hover);\n}\n\n.wx-link--primary {\n --wx-link-color: var(--wx-color-primary);\n --wx-link-hover: var(--wx-color-primary-hover);\n}\n\n.wx-link--success {\n --wx-link-color: var(--wx-color-success-active);\n --wx-link-hover: var(--wx-color-success);\n}\n\n.wx-link--warning {\n --wx-link-color: var(--wx-color-warning-active);\n --wx-link-hover: var(--wx-color-warning);\n}\n\n.wx-link--danger {\n --wx-link-color: var(--wx-color-danger);\n --wx-link-hover: var(--wx-color-danger-hover);\n}\n\n.wx-link--info {\n --wx-link-color: var(--wx-color-info-active);\n --wx-link-hover: var(--wx-color-info);\n}\n\n.wx-link--muted {\n --wx-link-color: var(--wx-text-muted);\n --wx-link-hover: var(--wx-text-default);\n}\n\n/* underline */\n.wx-link--underline-always {\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-link--underline-hover:hover {\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-link--underline-never,\n.wx-link--underline-never:hover {\n text-decoration: none;\n}\n\n/* sizes */\n.wx-link--xs {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-link--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-link--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-link--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-link--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-link--weight-regular {\n font-weight: var(--wx-font-weight-regular);\n}\n\n.wx-link--weight-medium {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-link--weight-semibold {\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-link--weight-bold {\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-link.is-disabled {\n color: var(--wx-text-disabled);\n text-decoration: none;\n cursor: not-allowed;\n}\n\n.wx-link__icon {\n display: inline-flex;\n align-items: center;\n}\n\n.wx-link__external {\n opacity: 0.75;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { PaginationEmits, PaginationProps } from './types'\n\ndefineOptions({ name: 'WxPagination' })\n\nconst props = withDefaults(defineProps<PaginationProps>(), {\n paginator: null,\n total: undefined,\n lastPage: undefined,\n siblings: 1,\n perPageOptions: () => [],\n showTotal: true,\n disabled: false,\n size: 'md',\n ariaLabel: 'Pagination',\n})\n\nconst emit = defineEmits<PaginationEmits>()\n\n/**\n * Both models fall back to the paginator, so `:paginator=\"page\"` alone is a working\n * component and `v-model:page` is there for state the caller would rather own.\n */\nconst page = defineModel<number | undefined>('page', { default: undefined })\nconst perPage = defineModel<number | undefined>('perPage', { default: undefined })\n\nconst currentPerPage = computed(() => perPage.value ?? props.paginator?.per_page ?? 15)\nconst total = computed(() => props.total ?? props.paginator?.total ?? 0)\n\nconst lastPage = computed(() => {\n if (props.lastPage !== undefined) return Math.max(1, props.lastPage)\n if (props.paginator) return Math.max(1, props.paginator.last_page)\n return Math.max(1, Math.ceil(total.value / currentPerPage.value))\n})\n\n/**\n * Clamped to what exists. A remembered page can outlive the result it belonged to —\n * a filter narrows eleven pages down to two — and a pagination with no page marked\n * current tells the reader they are nowhere.\n */\nconst currentPage = computed(() => {\n const asked = page.value ?? props.paginator?.current_page ?? 1\n return Math.min(Math.max(1, asked), lastPage.value)\n})\n\n/** Laravel counts these for us; without it they follow from the page and its size. */\nconst from = computed(() => {\n if (props.paginator) return props.paginator.from\n return total.value === 0 ? null : (currentPage.value - 1) * currentPerPage.value + 1\n})\n\nconst to = computed(() => {\n if (props.paginator) return props.paginator.to\n return total.value === 0 ? null : Math.min(total.value, currentPage.value * currentPerPage.value)\n})\n\ntype PageItem = { type: 'page'; value: number } | { type: 'gap'; value: string }\n\n/**\n * First and last are always reachable, the current page keeps `siblings` neighbours,\n * and what is skipped becomes an ellipsis. A gap of exactly one page is spelled out\n * instead — an ellipsis hiding a single number helps nobody.\n */\nconst items = computed<PageItem[]>(() => {\n const last = lastPage.value\n const current = currentPage.value\n const span = props.siblings\n\n const wanted = new Set<number>([1, last])\n for (let i = current - span; i <= current + span; i++) {\n if (i >= 1 && i <= last) wanted.add(i)\n }\n\n const numbers = [...wanted].sort((a, b) => a - b)\n const result: PageItem[] = []\n let previous = 0\n\n for (const value of numbers) {\n const distance = value - previous\n if (previous && distance === 2) result.push({ type: 'page', value: value - 1 })\n else if (previous && distance > 2) result.push({ type: 'gap', value: `gap-${value}` })\n result.push({ type: 'page', value })\n previous = value\n }\n\n return result\n})\n\nconst classes = computed(() => [\n 'wx-pagination',\n `wx-pagination--${props.size}`,\n { 'is-disabled': props.disabled },\n])\n\nfunction go(next: number) {\n const target = Math.min(Math.max(1, next), lastPage.value)\n if (props.disabled || target === currentPage.value) return\n page.value = target\n emit('change', { page: target, perPage: currentPerPage.value })\n}\n\n/**\n * A bigger page can put the current position past the end, so the size change also\n * moves back to the first page — the alternative is asking for a page that is not there.\n */\nfunction setPerPage(event: Event) {\n const value = Number((event.target as HTMLSelectElement).value)\n if (!Number.isFinite(value) || value === currentPerPage.value) return\n perPage.value = value\n page.value = 1\n emit('change', { page: 1, perPage: value })\n}\n</script>\n\n<template>\n <nav :class=\"classes\" :aria-label=\"ariaLabel\">\n <p v-if=\"showTotal\" class=\"wx-pagination__total\">\n <slot name=\"total\" :from=\"from\" :to=\"to\" :total=\"total\">\n <template v-if=\"from === null\">Nothing to show</template>\n <template v-else>{{ from }}–{{ to }} of {{ total }}</template>\n </slot>\n </p>\n\n <div class=\"wx-pagination__controls\">\n <label v-if=\"perPageOptions.length\" class=\"wx-pagination__per-page\">\n <span class=\"wx-pagination__per-page-label\">Per page</span>\n <select\n class=\"wx-pagination__select\"\n :value=\"currentPerPage\"\n :disabled=\"disabled\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in perPageOptions\" :key=\"option\" :value=\"option\">\n {{ option }}\n </option>\n </select>\n </label>\n\n <ul class=\"wx-pagination__list\">\n <li>\n <button\n class=\"wx-pagination__button wx-pagination__button--arrow\"\n type=\"button\"\n :disabled=\"disabled || currentPage <= 1\"\n aria-label=\"Previous page\"\n @click=\"go(currentPage - 1)\"\n >\n <svg viewBox=\"0 0 8 12\" aria-hidden=\"true\"><path d=\"M6.5 1 1.5 6l5 5\" /></svg>\n </button>\n </li>\n\n <li v-for=\"item in items\" :key=\"item.value\">\n <span v-if=\"item.type === 'gap'\" class=\"wx-pagination__gap\" aria-hidden=\"true\"\n >…</span\n >\n <button\n v-else\n class=\"wx-pagination__button\"\n type=\"button\"\n :class=\"{ 'is-current': item.value === currentPage }\"\n :disabled=\"disabled\"\n :aria-current=\"item.value === currentPage ? 'page' : undefined\"\n :aria-label=\"`Page ${item.value}`\"\n @click=\"go(item.value)\"\n >\n {{ item.value }}\n </button>\n </li>\n\n <li>\n <button\n class=\"wx-pagination__button wx-pagination__button--arrow\"\n type=\"button\"\n :disabled=\"disabled || currentPage >= lastPage\"\n aria-label=\"Next page\"\n @click=\"go(currentPage + 1)\"\n >\n <svg viewBox=\"0 0 8 12\" aria-hidden=\"true\"><path d=\"M1.5 1 6.5 6l-5 5\" /></svg>\n </button>\n </li>\n </ul>\n </div>\n </nav>\n</template>\n\n<style scoped>\n.wx-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-12);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-pagination__total {\n margin: 0;\n padding: 0;\n}\n\n/*\n * Everything below wraps rather than overflows. On a phone the row of buttons is wider\n * than the screen well before the page count gets interesting, and a nav that runs off\n * the edge takes the last pages with it — including, often enough, the next arrow.\n */\n.wx-pagination__controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-12);\n margin-left: auto;\n}\n\n.wx-pagination__per-page {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-pagination__per-page-label {\n white-space: nowrap;\n}\n\n.wx-pagination__select {\n height: var(--wx-pagination-size, 34px);\n padding: 0 var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font: inherit;\n cursor: pointer;\n}\n\n.wx-pagination__select:focus-visible {\n outline: none;\n border-color: var(--wx-border-focus);\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The same explicit resets the table needs. A host stylesheet that puts space between\n * consecutive list items — VitePress adds 8px, and every CSS framework has a rule of\n * its own — lands inside the row of buttons and steps them down one by one, because\n * the margin arrives on all but the first item.\n */\n.wx-pagination__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-4);\n margin: 0;\n padding: 0;\n border: 0;\n list-style: none;\n}\n\n.wx-pagination__list li {\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-pagination__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: var(--wx-pagination-size, 34px);\n height: var(--wx-pagination-size, 34px);\n padding: 0 var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font: inherit;\n cursor: pointer;\n transition:\n background var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-pagination--sm {\n --wx-pagination-size: 28px;\n}\n\n.wx-pagination--lg {\n --wx-pagination-size: 42px;\n}\n\n.wx-pagination__button:hover:not(:disabled):not(.is-current) {\n border-color: var(--wx-border-strong);\n background: var(--wx-bg-fill);\n}\n\n.wx-pagination__button:focus-visible {\n outline: none;\n border-color: var(--wx-border-focus);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-pagination__button.is-current {\n background: var(--wx-color-primary);\n border-color: var(--wx-color-primary);\n color: var(--wx-color-primary-contrast);\n cursor: default;\n}\n\n.wx-pagination__button:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-pagination__button--arrow svg {\n width: 8px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.wx-pagination__gap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--wx-space-24);\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots, watch } from 'vue'\nimport {\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { PopoverEmits, PopoverProps } from './types'\n\ndefineOptions({ name: 'WxPopover', inheritAttrs: false })\n\n/*\n * A panel, not a menu. `WxDropdown` is the menu — it closes on any click inside,\n * because picking an item is the whole interaction. Here the click is part of the work\n * being done in the panel, so the panel stays until something closes it: the ×, a\n * button in the footer, Escape, or a click outside.\n */\nconst props = withDefaults(defineProps<PopoverProps>(), {\n side: 'bottom',\n align: 'center',\n offset: 8,\n alignOffset: 0,\n arrow: true,\n title: undefined,\n width: undefined,\n teleport: true,\n modal: false,\n disabled: false,\n closable: false,\n closeLabel: 'Close',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<PopoverEmits>()\n\ndefineSlots<{\n /** The control the panel hangs off. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The panel. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** A row under the panel — where the Save and Cancel usually go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\nconst hasHeader = computed(() => Boolean(props.title || slots.title || props.closable))\n\nconst panelStyle = computed(() => {\n const { width } = props\n if (width === undefined) return undefined\n\n /*\n * `width=\"280\"` in a template is the string \"280\", which is not a CSS length and\n * would be dropped without a word. A bare number means pixels, however it arrives.\n */\n const bare = typeof width === 'number' || /^\\d+(\\.\\d+)?$/.test(width)\n return { width: bare ? `${width}px` : width }\n})\n\ndefineExpose({ close })\n</script>\n\n<template>\n <popover-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, an icon\n button, a tab — and wrapping it in a button of ours would nest one inside another.\n -->\n <popover-trigger as-child :disabled=\"disabled\">\n <slot name=\"trigger\" :open=\"open\" />\n </popover-trigger>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content\n v-bind=\"$attrs\"\n class=\"wx-popover\"\n :style=\"panelStyle\"\n :side=\"side\"\n :align=\"align\"\n :side-offset=\"offset\"\n :align-offset=\"alignOffset\"\n :aria-label=\"ariaLabel\"\n >\n <header v-if=\"hasHeader\" class=\"wx-popover__header\">\n <div class=\"wx-popover__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <popover-close v-if=\"closable\" class=\"wx-popover__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </popover-close>\n </header>\n\n <div class=\"wx-popover__body\">\n <slot :close=\"close\" />\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-popover__footer\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <popover-arrow v-if=\"arrow\" class=\"wx-popover__arrow\" :width=\"12\" :height=\"6\" />\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-popover {\n /*\n * Every floating panel of ours sits on this one layer — a select opened inside a\n * popover has to cover it, and the panels are added to the document as they open, so\n * the last one opened is the one on top. Separate layers would rank them by kind\n * instead, and a list would disappear behind the panel it was opened from.\n */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n width: max-content;\n min-width: 200px;\n max-width: min(90vw, 360px);\n padding: var(--wx-space-14) var(--wx-space-16);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n/* Reka focuses the panel when it opens; the ring belongs on what is inside it. */\n.wx-popover:focus,\n.wx-popover:focus-visible {\n outline: none;\n}\n\n.wx-popover__header {\n display: flex;\n align-items: flex-start;\n gap: var(--wx-space-8);\n}\n\n.wx-popover__title {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-popover__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin: -4px -6px 0 0;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-popover__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-popover__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * A column rather than a plain block: two fields dropped into a panel with nothing\n * around them would otherwise sit against each other. A `WxForm` inside keeps its own\n * rhythm — one child has nothing to be spaced from.\n */\n.wx-popover__body {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n min-width: 0;\n}\n\n.wx-popover__footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n}\n\n/*\n * The arrow is an open path — filled it is the triangle, stroked it is only the two\n * slanted edges, which is exactly the panel's border continuing around the point. The\n * pixel of overlap hides the border line that would otherwise run across its base.\n */\n.wx-popover__arrow {\n transform: translateY(-1px);\n fill: var(--wx-bg-surface);\n stroke: var(--wx-border-default);\n stroke-width: 1px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ProseProps } from './types'\n\ndefineOptions({ name: 'WxProse' })\n\nconst props = withDefaults(defineProps<ProseProps>(), {\n html: undefined,\n size: 'md',\n as: 'div',\n})\n\nconst classes = computed(() => ['wx-prose', `wx-prose--${props.size}`])\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\">\n <!--\n The markup goes into a plain element rather than onto the dynamic tag itself:\n `v-html` on `<component :is>` is meaningless when `as` names a component, and\n every rule below matches descendants, so the extra div changes nothing visually.\n\n The rule is right that this is where an XSS would land, and there is nothing the\n component can do about it: what counts as allowed markup — an embed, an inline\n style, a class — is the application's decision, not a design system's. The prop\n is documented as server-sanitised, and this is the line that trusts it.\n -->\n <!-- eslint-disable-next-line vue/no-v-html -->\n <div v-if=\"html !== undefined\" class=\"wx-prose__content\" v-html=\"html\"></div>\n <slot v-else />\n </component>\n</template>\n\n<style scoped>\n/*\n * Every rule is a `:deep` one on purpose: the markup usually arrives through `v-html`\n * and therefore carries no scope attribute of its own.\n */\n.wx-prose {\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-prose-font-size, var(--wx-font-size-md));\n line-height: var(--wx-font-line-height-relaxed);\n /* The rhythm between blocks: one variable, so a caller can tighten the whole block. */\n --wx-prose-flow: var(--wx-space-16);\n}\n\n.wx-prose--sm {\n --wx-prose-font-size: var(--wx-font-size-sm);\n --wx-prose-flow: var(--wx-space-12);\n}\n\n.wx-prose--lg {\n --wx-prose-font-size: var(--wx-font-size-lg);\n --wx-prose-flow: var(--wx-space-18);\n}\n\n/* The rhythm: every block carries the gap below it, the last one drops it again. */\n.wx-prose :deep(p),\n.wx-prose :deep(ul),\n.wx-prose :deep(ol),\n.wx-prose :deep(dl),\n.wx-prose :deep(blockquote),\n.wx-prose :deep(pre),\n.wx-prose :deep(figure),\n.wx-prose :deep(table) {\n margin: 0 0 var(--wx-prose-flow);\n}\n\n.wx-prose :deep(:last-child) {\n margin-bottom: 0;\n}\n\n/* headings */\n.wx-prose :deep(h1),\n.wx-prose :deep(h2),\n.wx-prose :deep(h3),\n.wx-prose :deep(h4),\n.wx-prose :deep(h5),\n.wx-prose :deep(h6) {\n /* Air above a heading, tight to the paragraph it introduces. */\n margin: var(--wx-space-32) 0 var(--wx-space-12);\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-wrap: balance;\n}\n\n.wx-prose :deep(h1) {\n font-size: var(--wx-font-size-3xl);\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-prose :deep(h2) {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-prose :deep(h3) {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-prose :deep(h4) {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-prose :deep(h5),\n.wx-prose :deep(h6) {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-prose :deep(:first-child) {\n margin-top: 0;\n}\n\n.wx-prose :deep(a) {\n color: var(--wx-text-link);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-prose :deep(a:hover) {\n color: var(--wx-color-primary-hover);\n}\n\n.wx-prose :deep(strong),\n.wx-prose :deep(b) {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-prose :deep(small) {\n font-size: var(--wx-font-size-sm);\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(mark) {\n padding: 0 2px;\n background: var(--wx-color-warning-soft);\n border-radius: var(--wx-radius-none);\n color: inherit;\n}\n\n/* lists */\n.wx-prose :deep(ul),\n.wx-prose :deep(ol) {\n padding-left: var(--wx-space-24);\n}\n\n.wx-prose :deep(li + li) {\n margin-top: var(--wx-space-6);\n}\n\n.wx-prose :deep(li > ul),\n.wx-prose :deep(li > ol) {\n margin-top: var(--wx-space-6);\n}\n\n.wx-prose :deep(ul) {\n list-style: disc;\n}\n\n.wx-prose :deep(ol) {\n list-style: decimal;\n}\n\n.wx-prose :deep(li::marker) {\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(dt) {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-prose :deep(dd) {\n margin: 0 0 var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n/* quotes and rules */\n.wx-prose :deep(blockquote) {\n padding: var(--wx-space-4) var(--wx-space-16);\n border-left: 3px solid var(--wx-color-primary);\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(hr) {\n height: 0;\n margin: var(--wx-space-24) 0;\n border: none;\n border-top: 1px solid var(--wx-border-default);\n}\n\n/* code */\n.wx-prose :deep(code) {\n padding: 1px 5px;\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-family: var(--wx-font-family-mono);\n font-size: 0.9em;\n}\n\n.wx-prose :deep(pre) {\n padding: var(--wx-space-14) var(--wx-space-16);\n background: var(--wx-bg-muted);\n border-radius: var(--wx-radius-sm);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n overflow-x: auto;\n}\n\n.wx-prose :deep(pre code) {\n padding: 0;\n background: none;\n font-size: inherit;\n}\n\n/* media */\n.wx-prose :deep(img),\n.wx-prose :deep(video) {\n max-width: 100%;\n height: auto;\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-prose :deep(figcaption) {\n margin-top: var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n\n.wx-prose :deep(iframe) {\n max-width: 100%;\n border: none;\n border-radius: var(--wx-radius-sm);\n}\n\n/*\n * A pasted table is usually wider than the column it lands in, so it scrolls inside\n * its own box instead of pushing the page sideways.\n */\n.wx-prose :deep(table) {\n display: block;\n width: 100%;\n max-width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n overflow-x: auto;\n}\n\n.wx-prose :deep(th),\n.wx-prose :deep(td) {\n padding: var(--wx-space-8) var(--wx-space-12);\n border: 1px solid var(--wx-border-default);\n text-align: start;\n vertical-align: top;\n}\n\n.wx-prose :deep(th) {\n background: var(--wx-bg-subtle);\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n white-space: nowrap;\n}\n\n.wx-prose :deep(caption) {\n margin-bottom: var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: start;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport { radioGroupKey, useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport type { RadioEmits, RadioProps } from './types'\n\ndefineOptions({ name: 'WxRadio', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n label: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<RadioEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: null })\n\nconst group = inject(radioGroupKey, null)\nconst field = useFormField(props)\n\nconst checked = computed(() =>\n group ? group.modelValue.value === props.value : model.value === props.value,\n)\n\nconst disabled = computed(() => props.disabled || group?.disabled.value || field.disabled.value)\nconst size = computed(() => props.size ?? group?.size.value ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-radio',\n `wx-radio--${size.value}`,\n { 'is-checked': checked.value, 'is-disabled': disabled.value },\n])\n\nfunction onChange() {\n if (group) group.toggle(props.value, true)\n else model.value = props.value\n emit('change', props.value)\n}\n</script>\n\n<template>\n <label :class=\"classes\">\n <input\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-radio__native\"\n type=\"radio\"\n :name=\"name ?? group?.name.value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-radio__box\" aria-hidden=\"true\">\n <svg class=\"wx-radio__mark\" viewBox=\"0 0 20 20\">\n <circle class=\"wx-radio__ring\" cx=\"10\" cy=\"10\" r=\"9.5\" />\n <circle class=\"wx-radio__dot\" cx=\"10\" cy=\"10\" r=\"4\" />\n </svg>\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-radio__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-radio {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-radio.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-radio__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/*\n * The box only holds the size and the focus ring; the circles are drawn inside it. A CSS\n * border plus a centred child cannot stay concentric at a fractional device pixel ratio —\n * Windows at 125% or 150% rounds the 1px border to a whole device pixel on each side\n * independently, which moves the content box off the centre of the border box and takes\n * the dot with it. Ring and dot as two circles on one origin cannot drift apart: the\n * renderer resolves both against real geometry and antialiases, instead of snapping boxes.\n */\n.wx-radio__box {\n display: block;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-radio-size, 20px);\n height: var(--wx-radio-size, 20px);\n border-radius: var(--wx-radius-full);\n transition: box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio--sm {\n --wx-radio-size: 16px;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-radio--md {\n --wx-radio-size: 20px;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-radio--lg {\n --wx-radio-size: 24px;\n font-size: var(--wx-font-size-lg);\n}\n\n/* The ring's outer half of stroke sits on the viewport edge, so it must not be clipped. */\n.wx-radio__mark {\n display: block;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/*\n * `non-scaling-stroke` keeps the ring one pixel wide at every size, the way the checkbox\n * border is, instead of thinning to 0.8px on `sm` and thickening to 1.2px on `lg`.\n */\n.wx-radio__ring {\n fill: var(--wx-bg-surface);\n stroke: var(--wx-border-strong);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n transition: stroke var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio__dot {\n fill: var(--wx-color-primary);\n transform: scale(0);\n transform-box: fill-box;\n transform-origin: center;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio:hover:not(.is-disabled) .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio.is-checked .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio.is-checked .wx-radio__dot {\n transform: scale(1);\n}\n\n.wx-radio.is-disabled .wx-radio__ring {\n fill: var(--wx-bg-disabled);\n stroke: var(--wx-border-default);\n}\n\n.wx-radio.is-disabled .wx-radio__dot {\n fill: var(--wx-color-primary-disabled);\n}\n\n.wx-radio__native:focus-visible + .wx-radio__box {\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-radio__native:focus-visible + .wx-radio__box .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-radio__box,\n .wx-radio__ring,\n .wx-radio__dot {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport {\n radioGroupKey,\n useFormField,\n useId,\n type ChoiceValue,\n} from '../../composables/useFormField'\nimport WxRadio from '../Radio/Radio.vue'\nimport type { RadioGroupEmits, RadioGroupProps } from './types'\n\ndefineOptions({ name: 'WxRadioGroup' })\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n options: undefined,\n disabled: undefined,\n size: undefined,\n name: undefined,\n inline: false,\n})\n\nconst emit = defineEmits<RadioGroupEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: null })\n\nconst field = useFormField(props)\nconst fallbackName = useId('wx-radio-group')\n\n/** A group cannot be the target of a `for`, so the item label becomes a span. */\nfield.item?.registerLabelTarget(undefined)\n\nconst disabled = computed(() => props.disabled ?? field.disabled.value)\nconst size = computed(() => props.size ?? field.size.value)\n\n/**\n * Radios sharing a `name` are one roving-tabindex group in the browser, which is\n * what gives arrow-key navigation for free — so a name is always set.\n */\nconst name = computed(() => props.name ?? fallbackName)\n\nfunction toggle(value: ChoiceValue) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\nprovide(radioGroupKey, {\n name,\n modelValue: computed(() => model.value),\n disabled,\n size,\n toggle,\n})\n</script>\n\n<template>\n <div\n :class=\"['wx-radio-group', { 'wx-radio-group--inline': inline }]\"\n role=\"radiogroup\"\n :aria-labelledby=\"field.item ? `${field.item.id.value}-label` : undefined\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <slot>\n <wx-radio\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :label=\"option.label\"\n :disabled=\"option.disabled\"\n />\n </slot>\n </div>\n</template>\n\n<style scoped>\n.wx-radio-group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-radio-group--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--wx-space-16);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { RateEmits, RateProps } from './types'\n\ndefineOptions({ name: 'WxRate', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<RateProps>(), {\n max: 5,\n allowHalf: false,\n clearable: true,\n showValue: false,\n readonly: false,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<RateEmits>()\n\nconst model = defineModel<number>({ default: 0 })\n\nconst field = useFormField(props)\nconst hovered = ref<number | null>(null)\n\nconst interactive = computed(() => !field.disabled.value && !props.readonly)\n\n/** What the stars show right now: the hovered value while pointing, the model otherwise. */\nconst shown = computed(() => hovered.value ?? model.value ?? 0)\n\nconst stars = computed(() =>\n Array.from({ length: props.max }, (_, index) => {\n const position = index + 1\n const fill = Math.min(Math.max(shown.value - index, 0), 1)\n return { position, full: fill >= 1, half: fill > 0 && fill < 1 }\n }),\n)\n\nconst classes = computed(() => [\n 'wx-rate',\n `wx-rate--${field.size.value}`,\n { 'is-disabled': field.disabled.value, 'is-readonly': props.readonly },\n])\n\n/** Halves come from the pointer landing on the left side of a star. */\nfunction valueAt(position: number, event: MouseEvent): number {\n if (!props.allowHalf) return position\n const target = event.currentTarget as HTMLElement\n const { left, width } = target.getBoundingClientRect()\n return event.clientX - left < width / 2 ? position - 0.5 : position\n}\n\n/** `toggle` is what makes clicking the current value clear it — the arrow keys must not. */\nfunction set(value: number, toggle = false) {\n const next = toggle && props.clearable && model.value === value ? 0 : value\n if (next === model.value) return\n model.value = next\n emit('change', next)\n}\n\nfunction onClick(position: number, event: MouseEvent) {\n if (!interactive.value) return\n set(valueAt(position, event), true)\n}\n\nfunction onHover(position: number, event: MouseEvent) {\n if (!interactive.value) return\n hovered.value = valueAt(position, event)\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (!interactive.value) return\n const step = props.allowHalf ? 0.5 : 1\n const current = model.value ?? 0\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n event.preventDefault()\n set(Math.min(current + step, props.max))\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n event.preventDefault()\n set(Math.max(current - step, 0))\n } else if (event.key === 'Home') {\n event.preventDefault()\n set(0)\n } else if (event.key === 'End') {\n event.preventDefault()\n set(props.max)\n }\n}\n</script>\n\n<template>\n <div\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n :class=\"classes\"\n role=\"slider\"\n :tabindex=\"interactive ? 0 : -1\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"model ?? 0\"\n :aria-readonly=\"readonly || undefined\"\n :aria-disabled=\"field.disabled.value || undefined\"\n @keydown=\"onKeydown\"\n @mouseleave=\"hovered = null\"\n >\n <span\n v-for=\"star in stars\"\n :key=\"star.position\"\n class=\"wx-rate__star\"\n :class=\"{ 'is-full': star.full, 'is-half': star.half }\"\n @click=\"onClick(star.position, $event)\"\n @mousemove=\"onHover(star.position, $event)\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n class=\"wx-rate__outline\"\n d=\"M12 3.5l2.6 5.3 5.9.9-4.2 4.1 1 5.8-5.3-2.8-5.3 2.8 1-5.8-4.2-4.1 5.9-.9z\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linejoin=\"round\"\n />\n <path\n class=\"wx-rate__fill\"\n d=\"M12 3.5l2.6 5.3 5.9.9-4.2 4.1 1 5.8-5.3-2.8-5.3 2.8 1-5.8-4.2-4.1 5.9-.9z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n\n <span v-if=\"showValue\" class=\"wx-rate__value\">{{ model ?? 0 }}</span>\n\n <input v-if=\"name\" type=\"hidden\" :name=\"name\" :value=\"model ?? 0\" />\n </div>\n</template>\n\n<style scoped>\n.wx-rate {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-2);\n color: var(--wx-border-strong);\n}\n\n.wx-rate:focus-visible {\n outline: none;\n border-radius: var(--wx-radius-xs);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-rate--sm {\n --wx-rate-size: 18px;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rate--md {\n --wx-rate-size: 22px;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-rate--lg {\n --wx-rate-size: 28px;\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-rate__star {\n display: inline-flex;\n width: var(--wx-rate-size, 22px);\n height: var(--wx-rate-size, 22px);\n cursor: pointer;\n}\n\n.wx-rate.is-disabled .wx-rate__star,\n.wx-rate.is-readonly .wx-rate__star {\n cursor: default;\n}\n\n.wx-rate.is-disabled {\n opacity: 0.6;\n}\n\n.wx-rate__star svg {\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* The filled star is clipped to nothing, then revealed whole or by half. */\n.wx-rate__fill {\n color: var(--wx-color-warning);\n clip-path: inset(0 100% 0 0);\n transition: clip-path var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-rate__star.is-full .wx-rate__fill {\n clip-path: inset(0);\n}\n\n.wx-rate__star.is-half .wx-rate__fill {\n clip-path: inset(0 50% 0 0);\n}\n\n.wx-rate__star.is-full,\n.wx-rate__star.is-half {\n color: var(--wx-color-warning);\n}\n\n.wx-rate__value {\n margin-left: var(--wx-space-6);\n color: var(--wx-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-rate__fill {\n transition: none;\n }\n}\n</style>\n","/**\n * Toolbar glyphs as raw path data, drawn on a 24×24 grid with a 1.7 stroke.\n * Inline rather than an icon package: it is a dozen paths, and a dependency for\n * that would be worse than the duplication.\n */\nexport const richTextIcons: Record<string, string> = {\n bold: 'M7 5h6a3.5 3.5 0 0 1 0 7H7zm0 7h7a3.5 3.5 0 0 1 0 7H7z',\n italic: 'M15 5h-5M14 19H9M13.5 5 10.5 19',\n strike:\n 'M5 12h14M8 8.5A3 3 0 0 1 11 6h2a3 3 0 0 1 3 2.5M16 15.5A3 3 0 0 1 13 18h-2a3 3 0 0 1-3-2.5',\n code: 'm9 8-5 4 5 4M15 8l5 4-5 4',\n bulletList: 'M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01',\n orderedList: 'M10 6h10M10 12h10M10 18h10M4 6h1v4M4 10h2M4 14h2v2H4v2h2',\n blockquote: 'M7 15V9h4v6H7l-2 3M15 15V9h4v6h-4l-2 3',\n hr: 'M4 12h16',\n link: 'M10 13a4 4 0 0 0 5.7.4l2.6-2.6a4 4 0 0 0-5.7-5.7l-1.5 1.5M14 11a4 4 0 0 0-5.7-.4l-2.6 2.6a4 4 0 0 0 5.7 5.7l1.5-1.5',\n table: 'M4 6h16v12H4zM4 10h16M10 10v8M4 14h16',\n image: 'M4 6h16v12H4zM4 15l4-4 4 4 3-3 5 5M9 9.5h.01',\n youtube:\n 'M3 8.5A2.5 2.5 0 0 1 5.5 6h13A2.5 2.5 0 0 1 21 8.5v7a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 15.5zM10.5 9.5l4 2.5-4 2.5z',\n undo: 'M4 9h11a4.5 4.5 0 0 1 0 9h-4M4 9l4-4M4 9l4 4',\n redo: 'M20 9H9a4.5 4.5 0 0 0 0 9h4M20 9l-4-4M20 9l-4 4',\n rowAfter: 'M4 5h16M4 11h16M8 15v6M5 18h6',\n rowBefore: 'M4 19h16M4 13h16M8 3v6M5 6h6',\n columnAfter: 'M5 4v16M11 4v16M15 8h6M18 5v6',\n columnBefore: 'M19 4v16M13 4v16M3 8h6M6 5v6',\n deleteRow: 'M4 8h16M4 16h16M9 12h6',\n deleteColumn: 'M8 4v16M16 4v16M12 9v6',\n deleteTable: 'M5 7h14M9 7V5h6v2M7 7l1 12h8l1-12M10 11v4M14 11v4',\n mergeCells: 'M4 6h16v12H4zM12 6v3M12 15v3M9 12h6M9 12l2-2M9 12l2 2',\n check: 'm5 13 4 4L19 7',\n close: 'M6 6l12 12M18 6 6 18',\n}\n","<script setup lang=\"ts\">\nimport { richTextIcons } from './icons'\n\ndefineOptions({ name: 'WxRichTextToolbarButton' })\n\nwithDefaults(\n defineProps<{\n /** Key into the icon set. Omit it and the `text` shows instead. */\n icon?: string\n /** Short label used for headings, where a glyph reads worse than \"H2\". */\n text?: string\n label: string\n active?: boolean\n disabled?: boolean\n }>(),\n { icon: undefined, text: undefined, active: false, disabled: false },\n)\n\ndefineEmits<{ click: [] }>()\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"wx-rich-text__tool\"\n :class=\"{ 'is-active': active }\"\n :title=\"label\"\n :aria-label=\"label\"\n :aria-pressed=\"active\"\n :disabled=\"disabled\"\n @click=\"$emit('click')\"\n >\n <svg v-if=\"icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n :d=\"richTextIcons[icon]\"\n stroke=\"currentColor\"\n stroke-width=\"1.7\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span v-else class=\"wx-rich-text__tool-text\">{{ text }}</span>\n </button>\n</template>\n\n<style scoped>\n.wx-rich-text__tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n padding: 0;\n background: transparent;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-default);\n cursor: pointer;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-rich-text__tool svg {\n width: 18px;\n height: 18px;\n}\n\n.wx-rich-text__tool-text {\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-rich-text__tool:hover:not(:disabled) {\n background: var(--wx-bg-fill);\n}\n\n.wx-rich-text__tool.is-active {\n background: var(--wx-color-primary-soft);\n color: var(--wx-color-primary);\n}\n\n.wx-rich-text__tool:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-rich-text__tool:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n</style>\n","import type { RichTextTool } from './types'\n\n/**\n * Kept out of the component because `withDefaults` cannot reference a binding\n * declared inside `<script setup>` — it is hoisted out of `setup()`.\n */\nexport const DEFAULT_TOOLS: RichTextTool[] = [\n 'bold',\n 'italic',\n 'strike',\n 'code',\n 'divider',\n 'h2',\n 'h3',\n 'h4',\n 'divider',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'hr',\n 'divider',\n 'link',\n 'table',\n 'image',\n 'youtube',\n 'divider',\n 'undo',\n 'redo',\n]\n\nexport const DEFAULT_ACCEPT = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n]\n\nexport interface ToolMeta {\n label: string\n icon?: string\n text?: string\n}\n\nexport const TOOL_META: Record<Exclude<RichTextTool, 'divider'>, ToolMeta> = {\n bold: { label: 'Bold', icon: 'bold' },\n italic: { label: 'Italic', icon: 'italic' },\n strike: { label: 'Strikethrough', icon: 'strike' },\n code: { label: 'Inline code', icon: 'code' },\n h2: { label: 'Heading 2', text: 'H2' },\n h3: { label: 'Heading 3', text: 'H3' },\n h4: { label: 'Heading 4', text: 'H4' },\n bulletList: { label: 'Bulleted list', icon: 'bulletList' },\n orderedList: { label: 'Numbered list', icon: 'orderedList' },\n blockquote: { label: 'Quote', icon: 'blockquote' },\n hr: { label: 'Divider', icon: 'hr' },\n link: { label: 'Link', icon: 'link' },\n table: { label: 'Table', icon: 'table' },\n image: { label: 'Image', icon: 'image' },\n youtube: { label: 'YouTube video', icon: 'youtube' },\n undo: { label: 'Undo', icon: 'undo' },\n redo: { label: 'Redo', icon: 'redo' },\n}\n\n/** Shown as a second row while the caret sits inside a table. */\nexport const TABLE_TOOLS = [\n { key: 'addRowAfter', label: 'Row below', icon: 'rowAfter' },\n { key: 'addRowBefore', label: 'Row above', icon: 'rowBefore' },\n { key: 'addColumnAfter', label: 'Column after', icon: 'columnAfter' },\n { key: 'addColumnBefore', label: 'Column before', icon: 'columnBefore' },\n { key: 'deleteRow', label: 'Delete row', icon: 'deleteRow' },\n { key: 'deleteColumn', label: 'Delete column', icon: 'deleteColumn' },\n { key: 'mergeOrSplit', label: 'Merge or split cells', icon: 'mergeCells' },\n { key: 'deleteTable', label: 'Delete table', icon: 'deleteTable' },\n] as const\n\nexport type TableToolKey = (typeof TABLE_TOOLS)[number]['key']\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { EditorContent, useEditor } from '@tiptap/vue-3'\nimport StarterKit from '@tiptap/starter-kit'\nimport { TableKit } from '@tiptap/extension-table'\nimport Image from '@tiptap/extension-image'\nimport Youtube from '@tiptap/extension-youtube'\nimport FileHandler from '@tiptap/extension-file-handler'\nimport { useFormField } from '../../composables/useFormField'\nimport WxRichTextToolbarButton from './ToolbarButton.vue'\nimport { DEFAULT_ACCEPT, DEFAULT_TOOLS, TABLE_TOOLS, TOOL_META, type TableToolKey } from './tools'\nimport type { RichTextEmits, RichTextProps, RichTextTool } from './types'\n\ndefineOptions({ name: 'WxRichText', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<RichTextProps>(), {\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n ariaLabel: undefined,\n minHeight: '220px',\n tools: () => DEFAULT_TOOLS,\n upload: undefined,\n pickImage: undefined,\n accept: () => DEFAULT_ACCEPT,\n})\n\nconst emit = defineEmits<RichTextEmits>()\n\nconst model = defineModel<string>({ default: '' })\n\nconst field = useFormField(props)\nconst focused = ref(false)\nconst uploading = ref(0)\nconst fileInput = ref<HTMLInputElement | null>(null)\n\n/** The link and YouTube buttons open one shared bar rather than a `prompt()`. */\nconst prompt = ref<{ kind: 'link' | 'youtube'; value: string } | null>(null)\n\nconst editable = computed(() => !field.disabled.value && !props.readonly)\n\n/** Tiptap renders `<p></p>` for an empty document; a backend wants an empty string. */\nfunction readHtml(): string {\n const instance = editor.value\n if (!instance || instance.isEmpty) return ''\n return instance.getHTML()\n}\n\nconst editor = useEditor({\n content: model.value ?? '',\n editable: editable.value,\n extensions: [\n StarterKit.configure({\n link: {\n openOnClick: false,\n autolink: true,\n HTMLAttributes: { rel: 'noopener noreferrer nofollow', target: '_blank' },\n },\n }),\n TableKit.configure({ table: { resizable: true } }),\n Image.configure({ HTMLAttributes: { class: 'wx-rich-text__image' } }),\n Youtube.configure({ nocookie: true, width: 640, height: 360 }),\n FileHandler.configure({\n allowedMimeTypes: props.accept,\n onDrop: (_editor, files, pos) => void uploadFiles(files, pos),\n onPaste: (_editor, files) => void uploadFiles(files),\n }),\n ],\n onUpdate: () => {\n const html = readHtml()\n model.value = html\n emit('change', html)\n },\n onFocus: () => {\n focused.value = true\n emit('focus')\n },\n onBlur: () => {\n focused.value = false\n emit('blur')\n },\n})\n\n/** Only replaces the document when the value really differs, or the caret jumps. */\nwatch(model, (value) => {\n const instance = editor.value\n if (!instance) return\n if ((value ?? '') === readHtml()) return\n instance.commands.setContent(value ?? '', { emitUpdate: false })\n})\n\nwatch(editable, (value) => editor.value?.setEditable(value))\n\nconst isEmpty = computed(() => editor.value?.isEmpty ?? true)\nconst inTable = computed(() => editor.value?.isActive('table') ?? false)\n\nconst classes = computed(() => [\n 'wx-rich-text',\n `wx-rich-text--${field.size.value}`,\n {\n [`wx-rich-text--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n },\n])\n\nfunction insertImage(url: string, alt?: string, pos?: number) {\n const instance = editor.value\n if (!instance) return\n const at = pos ?? instance.state.selection.anchor\n instance\n .chain()\n .focus()\n .insertContentAt(at, { type: 'image', attrs: { src: url, alt } })\n .run()\n}\n\n/**\n * Uploads happen one file at a time and insert only on success — a failed upload\n * leaves nothing behind to clean up.\n */\nasync function uploadFiles(files: File[], pos?: number) {\n if (!props.upload) return\n for (const file of files) {\n uploading.value += 1\n try {\n const result = await props.upload(file)\n insertImage(result.url, result.alt, pos)\n } catch (error) {\n emit('uploadError', error, file)\n } finally {\n uploading.value -= 1\n }\n }\n}\n\nasync function onImageButton() {\n if (props.pickImage) {\n const url = await props.pickImage()\n if (url) insertImage(url)\n return\n }\n fileInput.value?.click()\n}\n\nfunction onFilePicked(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input.files ?? [])\n input.value = ''\n void uploadFiles(files)\n}\n\nfunction openPrompt(kind: 'link' | 'youtube') {\n const current = kind === 'link' ? (editor.value?.getAttributes('link').href ?? '') : ''\n prompt.value = { kind, value: String(current) }\n}\n\nfunction applyPrompt() {\n const instance = editor.value\n const current = prompt.value\n if (!instance || !current) return\n const value = current.value.trim()\n\n if (current.kind === 'link') {\n if (value) instance.chain().focus().extendMarkRange('link').setLink({ href: value }).run()\n else instance.chain().focus().extendMarkRange('link').unsetLink().run()\n } else if (value) {\n instance.commands.setYoutubeVideo({ src: value })\n }\n\n prompt.value = null\n}\n\n/** Whether a tool should render at all — the image button needs somewhere to get a file. */\nfunction toolVisible(tool: RichTextTool): boolean {\n if (tool === 'image') return Boolean(props.upload || props.pickImage)\n return true\n}\n\nconst visibleTools = computed(() => props.tools.filter(toolVisible))\n\nfunction isActive(tool: RichTextTool): boolean {\n const instance = editor.value\n if (!instance) return false\n switch (tool) {\n case 'h2':\n return instance.isActive('heading', { level: 2 })\n case 'h3':\n return instance.isActive('heading', { level: 3 })\n case 'h4':\n return instance.isActive('heading', { level: 4 })\n default:\n return instance.isActive(tool)\n }\n}\n\nfunction run(tool: RichTextTool) {\n const instance = editor.value\n if (!instance) return\n const chain = instance.chain().focus()\n\n switch (tool) {\n case 'bold':\n chain.toggleBold().run()\n break\n case 'italic':\n chain.toggleItalic().run()\n break\n case 'strike':\n chain.toggleStrike().run()\n break\n case 'code':\n chain.toggleCode().run()\n break\n case 'h2':\n chain.toggleHeading({ level: 2 }).run()\n break\n case 'h3':\n chain.toggleHeading({ level: 3 }).run()\n break\n case 'h4':\n chain.toggleHeading({ level: 4 }).run()\n break\n case 'bulletList':\n chain.toggleBulletList().run()\n break\n case 'orderedList':\n chain.toggleOrderedList().run()\n break\n case 'blockquote':\n chain.toggleBlockquote().run()\n break\n case 'hr':\n chain.setHorizontalRule().run()\n break\n case 'undo':\n chain.undo().run()\n break\n case 'redo':\n chain.redo().run()\n break\n case 'table':\n chain.insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()\n break\n case 'link':\n openPrompt('link')\n break\n case 'youtube':\n openPrompt('youtube')\n break\n case 'image':\n void onImageButton()\n break\n }\n}\n\nfunction runTableCommand(key: TableToolKey) {\n const instance = editor.value\n if (!instance) return\n const chain = instance.chain().focus() as unknown as Record<string, () => { run: () => void }>\n chain[key]().run()\n}\n\ndefineExpose({\n editor,\n focus: () => editor.value?.commands.focus(),\n clear: () => editor.value?.commands.clearContent(true),\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"wx-rich-text__toolbar\" role=\"toolbar\" :aria-label=\"ariaLabel ?? 'Text formatting'\">\n <template v-for=\"(tool, index) in visibleTools\" :key=\"`${tool}-${index}`\">\n <span v-if=\"tool === 'divider'\" class=\"wx-rich-text__divider\" aria-hidden=\"true\" />\n <wx-rich-text-toolbar-button\n v-else\n :icon=\"TOOL_META[tool].icon\"\n :text=\"TOOL_META[tool].text\"\n :label=\"TOOL_META[tool].label\"\n :active=\"isActive(tool)\"\n :disabled=\"!editable\"\n @click=\"run(tool)\"\n />\n </template>\n\n <span v-if=\"uploading > 0\" class=\"wx-rich-text__uploading\">Uploading…</span>\n </div>\n\n <div v-if=\"inTable && editable\" class=\"wx-rich-text__toolbar wx-rich-text__toolbar--table\">\n <wx-rich-text-toolbar-button\n v-for=\"tool in TABLE_TOOLS\"\n :key=\"tool.key\"\n :icon=\"tool.icon\"\n :label=\"tool.label\"\n @click=\"runTableCommand(tool.key)\"\n />\n </div>\n\n <form v-if=\"prompt\" class=\"wx-rich-text__prompt\" @submit.prevent=\"applyPrompt\">\n <label class=\"wx-rich-text__prompt-label\" :for=\"`${field.id.value}-prompt`\">\n {{ prompt.kind === 'link' ? 'Link address' : 'YouTube URL' }}\n </label>\n <input\n :id=\"`${field.id.value}-prompt`\"\n v-model=\"prompt.value\"\n class=\"wx-rich-text__prompt-input\"\n type=\"url\"\n :placeholder=\"prompt.kind === 'link' ? 'https://example.com' : 'https://youtu.be/…'\"\n @keydown.esc=\"prompt = null\"\n />\n <wx-rich-text-toolbar-button icon=\"check\" label=\"Apply\" @click=\"applyPrompt\" />\n <wx-rich-text-toolbar-button icon=\"close\" label=\"Cancel\" @click=\"prompt = null\" />\n </form>\n\n <div class=\"wx-rich-text__body\" :style=\"{ minHeight }\">\n <span v-if=\"placeholder && isEmpty\" class=\"wx-rich-text__placeholder\">{{ placeholder }}</span>\n <editor-content\n :editor=\"editor\"\n class=\"wx-rich-text__content\"\n :aria-describedby=\"field.describedBy.value\"\n />\n </div>\n\n <input\n v-if=\"upload && !pickImage\"\n ref=\"fileInput\"\n class=\"wx-rich-text__file\"\n type=\"file\"\n :accept=\"accept.join(',')\"\n multiple\n @change=\"onFilePicked\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-rich-text {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-rich-text.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-rich-text--error,\n.wx-rich-text--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-rich-text--success {\n border-color: var(--wx-color-success);\n}\n\n.wx-rich-text--warning {\n border-color: var(--wx-color-warning);\n}\n\n.wx-rich-text.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-rich-text__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-2);\n padding: var(--wx-space-6);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-rich-text__toolbar--table {\n background: var(--wx-bg-subtle);\n}\n\n.wx-rich-text__divider {\n width: 1px;\n height: 18px;\n margin: 0 var(--wx-space-4);\n background: var(--wx-border-default);\n}\n\n.wx-rich-text__uploading {\n margin-left: auto;\n padding: 0 var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n padding: var(--wx-space-8);\n background: var(--wx-bg-subtle);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-rich-text__prompt-label {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt-input {\n flex: 1 1 auto;\n min-width: 0;\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt-input:focus {\n border-color: var(--wx-border-focus);\n}\n\n.wx-rich-text__body {\n position: relative;\n flex: 1 1 auto;\n padding: var(--wx-space-12) var(--wx-space-16);\n}\n\n.wx-rich-text__placeholder {\n position: absolute;\n top: var(--wx-space-12);\n left: var(--wx-space-16);\n color: var(--wx-text-placeholder);\n pointer-events: none;\n}\n\n.wx-rich-text__file {\n display: none;\n}\n\n/* The editing surface itself is rendered by ProseMirror. */\n.wx-rich-text__content :deep(.ProseMirror) {\n outline: none;\n min-height: inherit;\n line-height: var(--wx-font-line-height-relaxed);\n}\n\n/*\n * Host applications decorate content tags globally — VitePress, which renders these\n * docs, gives every h2 a top border and 24px of padding, and turns tables into\n * `display: block`. The editing surface has to look the same wherever it is\n * embedded, so anything a host is likely to set is stated here instead of inherited.\n */\n.wx-rich-text__content :deep(h1),\n.wx-rich-text__content :deep(h2),\n.wx-rich-text__content :deep(h3),\n.wx-rich-text__content :deep(h4),\n.wx-rich-text__content :deep(h5),\n.wx-rich-text__content :deep(h6) {\n margin: var(--wx-space-18) 0 var(--wx-space-8);\n padding: 0;\n border: 0;\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-rich-text__content :deep(p) {\n margin: 0 0 var(--wx-space-12);\n}\n\n/* Nothing pushes the document away from the top or bottom edge of the field. */\n.wx-rich-text__content :deep(.ProseMirror > :first-child) {\n margin-top: 0;\n}\n\n.wx-rich-text__content :deep(.ProseMirror > :last-child) {\n margin-bottom: 0;\n}\n\n.wx-rich-text__content :deep(h2) {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-rich-text__content :deep(h3) {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-rich-text__content :deep(h4) {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-rich-text__content :deep(ul),\n.wx-rich-text__content :deep(ol) {\n margin: 0 0 var(--wx-space-12);\n padding-left: var(--wx-space-24);\n}\n\n.wx-rich-text__content :deep(blockquote) {\n margin: 0 0 var(--wx-space-12);\n padding-left: var(--wx-space-16);\n border-left: 3px solid var(--wx-color-primary-soft);\n color: var(--wx-text-muted);\n}\n\n.wx-rich-text__content :deep(a) {\n color: var(--wx-text-link);\n text-decoration: underline;\n}\n\n.wx-rich-text__content :deep(code) {\n padding: 2px var(--wx-space-4);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-family: var(--wx-font-family-mono);\n font-size: 0.9em;\n}\n\n.wx-rich-text__content :deep(pre) {\n margin: 0 0 var(--wx-space-12);\n padding: var(--wx-space-12);\n background: var(--wx-bg-inverse);\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-inverse);\n overflow-x: auto;\n}\n\n.wx-rich-text__content :deep(hr) {\n margin: var(--wx-space-18) 0;\n border: none;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-rich-text__content :deep(img),\n.wx-rich-text__content :deep(iframe) {\n max-width: 100%;\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-rich-text__content :deep(img.ProseMirror-selectednode) {\n outline: 2px solid var(--wx-color-primary);\n}\n\n.wx-rich-text__content :deep(table) {\n /* Stated because hosts turn tables into `display: block` for horizontal scrolling. */\n display: table;\n width: 100%;\n margin: 0 0 var(--wx-space-12);\n border-collapse: collapse;\n table-layout: fixed;\n overflow: hidden;\n}\n\n.wx-rich-text__content :deep(th),\n.wx-rich-text__content :deep(td) {\n position: relative;\n padding: var(--wx-space-6) var(--wx-space-10);\n border: 1px solid var(--wx-border-default);\n vertical-align: top;\n}\n\n.wx-rich-text__content :deep(th) {\n background: var(--wx-bg-fill);\n font-weight: var(--wx-font-weight-semibold);\n text-align: left;\n}\n\n.wx-rich-text__content :deep(.selectedCell::after) {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--wx-color-primary-soft);\n pointer-events: none;\n}\n\n.wx-rich-text__content :deep(.column-resize-handle) {\n position: absolute;\n top: 0;\n right: -2px;\n bottom: 0;\n width: 4px;\n background: var(--wx-color-primary);\n cursor: col-resize;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxItemIndicator,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { SelectEmits, SelectModelValue, SelectProps, SelectValue } from './types'\n\ndefineOptions({ name: 'WxSelect', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n options: () => [],\n multiple: false,\n filterable: false,\n clearable: false,\n placeholder: undefined,\n emptyText: 'Nothing found',\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SelectEmits>()\n\nconst model = defineModel<SelectModelValue>({ default: null })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\n/**\n * The text in the search field. Controlled here rather than left to the combobox:\n * with `multiple` the input has no display value to fall back on and renders the\n * model itself, so picking two tags leaves \"news,releases\" sitting in the box.\n */\nconst searchText = ref('')\n\n/** Reka wants an array for multiple and a bare value otherwise. */\nconst selection = computed({\n get: () => (props.multiple ? ((model.value as SelectValue[]) ?? []) : (model.value ?? null)),\n set: (value) => {\n model.value = value as SelectModelValue\n emit('change', value as SelectModelValue)\n },\n})\n\nconst labelOf = (value: SelectValue) =>\n props.options.find((option) => option.value === value)?.label ?? String(value)\n\nconst selectedOptions = computed(() => {\n if (!props.multiple) return []\n return ((model.value as SelectValue[]) ?? []).map((value) => ({ value, label: labelOf(value) }))\n})\n\nconst singleLabel = computed(() => {\n if (props.multiple) return ''\n const value = model.value as SelectValue | null\n return value === null || value === undefined ? '' : labelOf(value)\n})\n\nconst hasSelection = computed(() =>\n props.multiple\n ? selectedOptions.value.length > 0\n : model.value !== null && model.value !== undefined && model.value !== '',\n)\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && hasSelection.value)\n\nconst classes = computed(() => [\n 'wx-select',\n `wx-select--${field.size.value}`,\n {\n [`wx-select--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n 'is-multiple': props.multiple,\n },\n])\n\n/** A pick clears the search in multiple mode and shows the label in single mode. */\nwatch(\n () => model.value,\n () => {\n searchText.value = props.multiple ? '' : singleLabel.value\n },\n { immediate: true },\n)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n searchText.value = props.multiple ? '' : singleLabel.value\n emit('close')\n})\n\n/** Clicking the field is how everyone expects a select to open. */\nfunction openList() {\n if (!field.disabled.value) open.value = true\n}\n\n/**\n * What a filterable field shows once a value is picked. Without it the input falls\n * back to the raw value, so choosing \"Maria Kovalenko\" leaves \"12\" in the box.\n */\nfunction displayValue(value: unknown): string {\n return value === null || value === undefined ? '' : labelOf(value as SelectValue)\n}\n\n/**\n * Reka filters the list itself and keeps no public search term, so the value is read\n * straight off the input — that is what a caller loading options from a backend needs.\n */\nfunction onSearch(event: Event) {\n emit('search', (event.target as HTMLInputElement).value)\n}\n\nfunction clear() {\n model.value = props.multiple ? [] : null\n emit('change', model.value)\n emit('clear')\n}\n\nfunction removeTag(value: SelectValue) {\n const next = ((model.value as SelectValue[]) ?? []).filter((item) => item !== value)\n model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <combobox-root\n v-model=\"selection\"\n v-model:open=\"open\"\n :multiple=\"multiple\"\n :disabled=\"field.disabled.value\"\n :name=\"name\"\n :ignore-filter=\"!filterable\"\n :open-on-click=\"true\"\n :class=\"classes\"\n as=\"div\"\n >\n <combobox-anchor class=\"wx-select__anchor\" as=\"div\" @click=\"openList\">\n <div class=\"wx-select__value\">\n <template v-if=\"multiple\">\n <span\n v-for=\"option in selectedOptions\"\n :key=\"String(option.value)\"\n class=\"wx-select__tag\"\n >\n {{ option.label }}\n <button\n v-if=\"!field.disabled.value\"\n class=\"wx-select__tag-remove\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"`Remove ${option.label}`\"\n @click.stop=\"removeTag(option.value)\"\n >\n ✕\n </button>\n </span>\n </template>\n\n <combobox-input\n v-if=\"filterable\"\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n v-model=\"searchText\"\n class=\"wx-select__input\"\n :placeholder=\"placeholder\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :display-value=\"multiple ? undefined : displayValue\"\n auto-focus\n @input=\"onSearch\"\n />\n\n <template v-else>\n <span v-if=\"!multiple && hasSelection\" class=\"wx-select__single\">{{ singleLabel }}</span>\n <span v-else-if=\"!hasSelection\" class=\"wx-select__placeholder\">{{ placeholder }}</span>\n </template>\n </div>\n\n <button\n v-if=\"showClear\"\n class=\"wx-select__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n ✕\n </button>\n\n <combobox-trigger\n :id=\"filterable ? undefined : field.id.value\"\n class=\"wx-select__toggle\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m4 6 4 4 4-4\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </combobox-trigger>\n </combobox-anchor>\n\n <combobox-portal :disabled=\"!teleport\">\n <combobox-content class=\"wx-select__content\" position=\"popper\" :side-offset=\"4\">\n <combobox-viewport class=\"wx-select__viewport\">\n <combobox-empty class=\"wx-select__empty\">{{ emptyText }}</combobox-empty>\n\n <slot>\n <combobox-item\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n class=\"wx-select__option\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n <span class=\"wx-select__option-label\">{{ option.label }}</span>\n <combobox-item-indicator class=\"wx-select__check\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3.5 8.5 3 3 6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </combobox-item-indicator>\n </combobox-item>\n </slot>\n </combobox-viewport>\n </combobox-content>\n </combobox-portal>\n </combobox-root>\n</template>\n\n<style scoped>\n.wx-select {\n display: block;\n width: 100%;\n}\n\n.wx-select__anchor {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n min-height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-6) 0 var(--wx-space-12);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-select--sm .wx-select__anchor {\n min-height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-select--lg .wx-select__anchor {\n min-height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-select__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-select.is-open .wx-select__anchor {\n border-color: var(--wx-border-focus);\n}\n\n.wx-select--error .wx-select__anchor,\n.wx-select--error.is-open .wx-select__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-select--success .wx-select__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-select--warning .wx-select__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-select.is-disabled .wx-select__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-select__value {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4);\n flex: 1 1 auto;\n min-width: 0;\n padding: var(--wx-space-4) 0;\n}\n\n.wx-select__single,\n.wx-select__placeholder {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-select__placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-select__input {\n flex: 1 1 60px;\n min-width: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-select__input::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-select__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n padding: 2px var(--wx-space-6);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-select__tag-remove,\n.wx-select__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n}\n\n.wx-select__tag-remove:hover,\n.wx-select__clear:hover {\n color: var(--wx-text-default);\n}\n\n.wx-select__clear {\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n}\n\n.wx-select__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--wx-text-muted);\n cursor: inherit;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-select__toggle svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-select.is-open .wx-select__toggle {\n transform: rotate(180deg);\n}\n</style>\n\n<style>\n/* The list is teleported, so its styles cannot be scoped to the component. */\n.wx-select__content {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n width: var(--reka-combobox-trigger-width);\n max-height: 280px;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n overflow: hidden;\n}\n\n.wx-select__viewport {\n max-height: 272px;\n overflow-y: auto;\n}\n\n.wx-select__option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n user-select: none;\n}\n\n.wx-select__option[data-highlighted] {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-select__option[data-state='checked'] {\n color: var(--wx-color-primary);\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-select__option[data-disabled] {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-select__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-select__check {\n display: inline-flex;\n flex: 0 0 auto;\n color: var(--wx-color-primary);\n}\n\n.wx-select__check svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-select__empty {\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { SliderEmits, SliderModelValue, SliderProps } from './types'\n\ndefineOptions({ name: 'WxSlider', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n minStepsBetweenThumbs: 0,\n showValue: false,\n marks: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SliderEmits>()\n\nconst model = defineModel<SliderModelValue>({ default: null })\n\nconst field = useFormField(props)\n\n/**\n * The underlying slider always works with an array. A single slider keeps a plain\n * number in the model, because that is what a caller wants to store.\n */\nconst values = computed<number[]>(() => {\n if (props.range) {\n const pair = Array.isArray(model.value) ? model.value : []\n return [pair[0] ?? props.min, pair[1] ?? props.max]\n }\n const single = Array.isArray(model.value) ? model.value[0] : model.value\n return [single ?? props.min]\n})\n\nfunction onUpdate(next: number[] | undefined) {\n if (!next) return\n const value = props.range ? [...next] : next[0]\n model.value = value\n emit('change', value)\n}\n\nconst marks = computed(() =>\n Object.entries(props.marks ?? {}).map(([value, label]) => ({\n value: Number(value),\n label,\n offset: ((Number(value) - props.min) / (props.max - props.min)) * 100,\n })),\n)\n\nconst classes = computed(() => [\n 'wx-slider',\n `wx-slider--${field.size.value}`,\n { 'is-disabled': field.disabled.value, 'is-range': props.range },\n])\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"wx-slider__row\">\n <slider-root\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-slider__root\"\n :model-value=\"values\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"field.disabled.value\"\n :min-steps-between-thumbs=\"minStepsBetweenThumbs\"\n :name=\"name\"\n @update:model-value=\"onUpdate\"\n >\n <slider-track class=\"wx-slider__track\">\n <slider-range class=\"wx-slider__range\" />\n </slider-track>\n\n <slider-thumb\n v-for=\"index in values.length\"\n :key=\"index\"\n class=\"wx-slider__thumb\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n />\n </slider-root>\n\n <span v-if=\"showValue\" class=\"wx-slider__value\">\n {{ range ? `${values[0]} — ${values[1]}` : values[0] }}\n </span>\n </div>\n\n <div v-if=\"marks.length\" class=\"wx-slider__marks\" aria-hidden=\"true\">\n <span\n v-for=\"mark in marks\"\n :key=\"mark.value\"\n class=\"wx-slider__mark\"\n :style=\"{ left: `${mark.offset}%` }\"\n >\n {{ mark.label }}\n </span>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-slider {\n display: block;\n width: 100%;\n}\n\n.wx-slider__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-16);\n}\n\n.wx-slider__root {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n height: var(--wx-size-control-md);\n touch-action: none;\n user-select: none;\n}\n\n.wx-slider--sm .wx-slider__root {\n height: var(--wx-size-control-sm);\n}\n\n.wx-slider--lg .wx-slider__root {\n height: var(--wx-size-control-lg);\n}\n\n.wx-slider__track {\n position: relative;\n flex: 1 1 auto;\n height: 4px;\n background: var(--wx-bg-fill-hover);\n border-radius: var(--wx-radius-full);\n}\n\n.wx-slider__range {\n position: absolute;\n height: 100%;\n background: var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n}\n\n.wx-slider__thumb {\n display: block;\n width: 18px;\n height: 18px;\n background: var(--wx-bg-surface);\n border: 2px solid var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n box-shadow: var(--wx-shadow-card);\n cursor: grab;\n transition: box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-slider__thumb:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-slider__thumb:active {\n cursor: grabbing;\n}\n\n.wx-slider.is-disabled .wx-slider__range {\n background: var(--wx-color-primary-disabled);\n}\n\n.wx-slider.is-disabled .wx-slider__thumb {\n border-color: var(--wx-color-primary-disabled);\n cursor: not-allowed;\n}\n\n.wx-slider__value {\n flex: 0 0 auto;\n min-width: 4ch;\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n.wx-slider__marks {\n position: relative;\n height: 18px;\n margin-top: calc(var(--wx-space-4) * -1);\n}\n\n.wx-slider__mark {\n position: absolute;\n transform: translateX(-50%);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport type { SwitchEmits, SwitchProps } from './types'\n\ndefineOptions({ name: 'WxSwitch', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n activeValue: true,\n inactiveValue: false,\n label: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SwitchEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: false })\n\nconst field = useFormField(props)\n\nconst checked = computed(() => model.value === props.activeValue)\nconst size = computed(() => props.size ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-switch',\n `wx-switch--${size.value}`,\n { 'is-checked': checked.value, 'is-disabled': field.disabled.value },\n])\n\nfunction onChange(event: Event) {\n const next = (event.target as HTMLInputElement).checked ? props.activeValue : props.inactiveValue\n model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <label :class=\"classes\">\n <input\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n class=\"wx-switch__native\"\n type=\"checkbox\"\n role=\"switch\"\n :name=\"name\"\n :checked=\"checked\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-switch__track\" aria-hidden=\"true\">\n <span class=\"wx-switch__thumb\" />\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-switch__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-switch {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-switch.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-switch__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.wx-switch__track {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: calc(var(--wx-switch-height) * 1.8);\n height: var(--wx-switch-height);\n padding: 2px;\n background: var(--wx-border-strong);\n border-radius: var(--wx-radius-full);\n transition:\n background-color var(--wx-duration-normal) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-switch--sm {\n --wx-switch-height: 18px;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-switch--md {\n --wx-switch-height: 22px;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-switch--lg {\n --wx-switch-height: 26px;\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-switch__thumb {\n width: calc(var(--wx-switch-height) - 4px);\n height: calc(var(--wx-switch-height) - 4px);\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-full);\n box-shadow: var(--wx-shadow-card);\n transition: transform var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-switch.is-checked .wx-switch__track {\n background: var(--wx-color-primary);\n}\n\n.wx-switch.is-checked .wx-switch__thumb {\n transform: translateX(calc(var(--wx-switch-height) * 0.8));\n}\n\n.wx-switch.is-disabled .wx-switch__track {\n background: var(--wx-border-default);\n}\n\n.wx-switch.is-disabled.is-checked .wx-switch__track {\n background: var(--wx-color-primary-disabled);\n}\n\n.wx-switch__native:focus-visible + .wx-switch__track {\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-switch__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-switch__track,\n .wx-switch__thumb {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport type { TabProps } from './types'\n\ndefineOptions({ name: 'WxTab' })\n\n/*\n * A tab is written once and read twice: `WxTabs` looks at these props to build the\n * button in the strip, and the component itself renders only the panel. That is why\n * `label`, `icon` and `badge` live here rather than on a separate list of items —\n * a tab and its content stay together in the markup.\n */\nwithDefaults(defineProps<TabProps>(), {\n label: undefined,\n icon: undefined,\n badge: undefined,\n disabled: false,\n keepAlive: false,\n})\n\ndefineSlots<{\n /** The panel. */\n default?: () => unknown\n /** Replaces `label` in the strip — an avatar, a coloured dot, anything. */\n label?: () => unknown\n}>()\n</script>\n\n<template>\n <tabs-content class=\"wx-tab\" :value=\"value\" :force-mount=\"keepAlive || undefined\">\n <slot />\n </tabs-content>\n</template>\n\n<style scoped>\n.wx-tab:focus-visible {\n outline: none;\n}\n\n/* Reka hides an inactive panel with the attribute; our own display would win. */\n.wx-tab[hidden] {\n display: none;\n}\n</style>\n","<script setup lang=\"ts\" generic=\"T extends TableRow = TableRow\">\nimport { computed, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport WxCheckbox from '../Checkbox/Checkbox.vue'\nimport WxInput from '../Input/Input.vue'\nimport WxPagination from '../Pagination/Pagination.vue'\nimport type {\n RowKey,\n TableColumn,\n TableEmits,\n TableProps,\n TableRow,\n TableSort,\n TableState,\n TableSummaryRow,\n} from './types'\n\ndefineOptions({ name: 'WxTable' })\n\n/** The disclosure and checkbox columns are square and never resize. */\nconst UTILITY_WIDTH = 44\n\nconst props = withDefaults(defineProps<TableProps<T>>(), {\n data: null,\n rowKey: 'id',\n title: undefined,\n searchable: false,\n searchPlaceholder: 'Search',\n searchDebounce: 300,\n loading: false,\n emptyText: 'Nothing to show',\n stripe: false,\n bordered: false,\n hover: true,\n size: 'md',\n selectable: false,\n selectableIf: undefined,\n expandable: false,\n expandableIf: undefined,\n summary: () => [],\n pagination: undefined,\n perPageOptions: () => [],\n persist: undefined,\n maxHeight: undefined,\n rowClass: undefined,\n layout: 'auto',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TableEmits<T>>()\n\n/** Keys rather than rows: a selection outlives the page it was made on. */\nconst selected = defineModel<RowKey[]>('selected', { default: () => [] })\nconst expanded = defineModel<RowKey[]>('expanded', { default: () => [] })\nconst sort = defineModel<TableSort | null>('sort', { default: null })\nconst search = defineModel<string>('search', { default: '' })\nconst page = defineModel<number>('page', { default: 1 })\nconst perPage = defineModel<number>('perPage', { default: 15 })\n\n/** An array or a paginator; the table only ever needs the rows out of it. */\nconst rows = computed<T[]>(() => {\n const value = props.data\n if (!value) return []\n return Array.isArray(value) ? value : (value.data ?? [])\n})\n\n/** A paginated response is a promise that there are more pages to reach. */\nconst paginator = computed(() => (props.data && !Array.isArray(props.data) ? props.data : null))\n\nconst showPagination = computed(() => props.pagination ?? Boolean(paginator.value))\n\nconst visibleColumns = computed(() => props.columns.filter((column) => !column.hidden))\n\n/** Columns that carry no data of their own: the chevron and the checkbox. */\nconst utilityCount = computed(() => (props.expandable ? 1 : 0) + (props.selectable ? 1 : 0))\n\nconst columnCount = computed(() => visibleColumns.value.length + utilityCount.value)\n\n/*\n * The slots are declared rather than inferred. Left to infer, the type is read off a\n * template that builds slot names out of the column keys, and the circle that makes —\n * the slots depend on the template, the template on the slots — is answered with\n * `any`, which takes the table's props down with it.\n */\ndefineSlots<{\n title?: () => unknown\n actions?: () => unknown\n empty?: () => unknown\n footer?: () => unknown\n loading?: () => unknown\n expanded?: (props: { row: T; index: number }) => unknown\n [key: `header-${string}`]: ((props: { column: TableColumn<T> }) => unknown) | undefined\n [key: `cell-${string}`]:\n | ((props: { row: T; value: unknown; index: number; column: TableColumn<T> }) => unknown)\n | undefined\n [key: `summary-${string}`]:\n ((props: { row: TableSummaryRow; value: unknown }) => unknown) | undefined\n}>()\n\nconst slots = useSlots()\n\nconst hasHeader = computed<boolean>(() =>\n Boolean(props.title || props.searchable || slots.title || slots.actions),\n)\n\nconst classes = computed(() => [\n 'wx-table',\n `wx-table--${props.size}`,\n {\n 'wx-table--stripe': props.stripe,\n 'wx-table--bordered': props.bordered,\n 'wx-table--hover': props.hover,\n 'wx-table--sticky': props.maxHeight !== undefined,\n 'is-loading': props.loading,\n },\n])\n\nconst scrollStyle = computed(() =>\n props.maxHeight === undefined ? undefined : { maxHeight: length(props.maxHeight) },\n)\n\nfunction length(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\n/** Only a declared width can say where the column behind a pinned one begins. */\nfunction widthOf(column: TableColumn<T>): number {\n if (typeof column.width === 'number') return column.width\n if (typeof column.width === 'string') {\n const parsed = Number.parseFloat(column.width)\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n}\n\nfunction colStyle(column: TableColumn<T>) {\n return {\n width: column.width === undefined ? undefined : length(column.width),\n minWidth: column.minWidth === undefined ? undefined : length(column.minWidth),\n }\n}\n\n/**\n * Where every pinned column comes to rest, measured from its edge. The utility columns\n * are pinned too whenever anything else is: a checkbox that slides under a frozen name\n * column is worse than no freezing at all.\n */\nconst offsets = computed(() => {\n const map = new Map<string, { side: 'left' | 'right'; offset: number; edge: boolean }>()\n\n let left = utilityCount.value * UTILITY_WIDTH\n const lefts = visibleColumns.value.filter((column) => column.fixed === 'left')\n lefts.forEach((column, index) => {\n map.set(column.key, { side: 'left', offset: left, edge: index === lefts.length - 1 })\n left += widthOf(column)\n })\n\n let right = 0\n const rights = visibleColumns.value.filter((column) => column.fixed === 'right')\n for (let index = rights.length - 1; index >= 0; index--) {\n const column = rights[index]\n map.set(column.key, { side: 'right', offset: right, edge: index === 0 })\n right += widthOf(column)\n }\n\n return map\n})\n\nconst hasLeftFixed = computed(() => visibleColumns.value.some((column) => column.fixed === 'left'))\n\nconst hasFixed = computed(() => offsets.value.size > 0)\n\n/**\n * The resting place goes out as a custom property rather than as `left` itself. An\n * inline `left` would outrank every stylesheet rule, and the pinning has to be able to\n * switch itself off in CSS when the table is too narrow to afford it.\n */\nfunction fixedStyle(column: TableColumn<T>) {\n const pin = offsets.value.get(column.key)\n if (!pin) return undefined\n return { [`--wx-pin-${pin.side}`]: `${pin.offset}px` }\n}\n\nfunction fixedClass(column: TableColumn<T>) {\n const pin = offsets.value.get(column.key)\n if (!pin) return undefined\n return [`is-fixed-${pin.side}`, { 'is-fixed-edge': pin.edge }]\n}\n\n/** The utility columns ride along at the left edge once anything is pinned. */\nfunction utilityStyle(slot: 'expand' | 'select') {\n if (!hasFixed.value) return undefined\n const before = slot === 'select' && props.expandable ? UTILITY_WIDTH : 0\n return { '--wx-pin-left': `${before}px` }\n}\n\nconst utilityClass = computed(() =>\n hasFixed.value ? ['is-fixed-left', { 'is-fixed-edge': !hasLeftFixed.value }] : undefined,\n)\n\n/** A dotted key walks into the row, so an eager-loaded relation reads as `user.name`. */\nfunction read(row: T, path: string): unknown {\n if (!path.includes('.')) return (row as TableRow)[path]\n return path.split('.').reduce<unknown>((value, part) => {\n if (value === null || typeof value !== 'object') return undefined\n return (value as TableRow)[part]\n }, row)\n}\n\nfunction cellText(column: TableColumn<T>, row: T, index: number): string {\n const value = read(row, column.key)\n if (column.formatter) return column.formatter(value, row, index)\n return value === null || value === undefined ? '' : String(value)\n}\n\nfunction keyOf(row: T, index: number): RowKey {\n if (typeof props.rowKey === 'function') return props.rowKey(row, index)\n const value = read(row, props.rowKey)\n return typeof value === 'string' || typeof value === 'number' ? value : index\n}\n\nfunction canSelect(row: T): boolean {\n return props.selectableIf ? props.selectableIf(row) : true\n}\n\nfunction canExpand(row: T): boolean {\n return props.expandableIf ? props.expandableIf(row) : true\n}\n\nconst selectableRows = computed(() => rows.value.filter(canSelect))\n\nconst selectableKeys = computed(() =>\n selectableRows.value.map((row) => keyOf(row, rows.value.indexOf(row))),\n)\n\nconst selectedCount = computed(\n () => selectableKeys.value.filter((key) => selected.value.includes(key)).length,\n)\n\nconst allSelected = computed(\n () => selectableKeys.value.length > 0 && selectedCount.value === selectableKeys.value.length,\n)\n\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nfunction rowsFor(keys: RowKey[]): T[] {\n return rows.value.filter((row, index) => keys.includes(keyOf(row, index)))\n}\n\nfunction announce(keys: RowKey[]) {\n selected.value = keys\n emit('selection-change', keys, rowsFor(keys))\n}\n\n/**\n * The header checkbox works on this page only. Keys picked on other pages stay put —\n * clearing someone's selection because they paged forward would be a surprise.\n */\nfunction toggleAll(checked: boolean) {\n const page = selectableKeys.value\n if (checked) announce([...selected.value, ...page.filter((key) => !selected.value.includes(key))])\n else announce(selected.value.filter((key) => !page.includes(key)))\n}\n\nfunction toggleRow(row: T, index: number, checked: boolean) {\n const key = keyOf(row, index)\n if (checked) {\n if (!selected.value.includes(key)) announce([...selected.value, key])\n } else {\n announce(selected.value.filter((item) => item !== key))\n }\n}\n\nfunction isSelected(row: T, index: number): boolean {\n return selected.value.includes(keyOf(row, index))\n}\n\nfunction isExpanded(row: T, index: number): boolean {\n return expanded.value.includes(keyOf(row, index))\n}\n\nfunction toggleExpand(row: T, index: number) {\n if (!canExpand(row)) return\n const key = keyOf(row, index)\n const keys = expanded.value.includes(key)\n ? expanded.value.filter((item) => item !== key)\n : [...expanded.value, key]\n\n expanded.value = keys\n emit('expand-change', keys, rowsFor(keys))\n}\n\n/**\n * Sorting is reported, never applied: the rows on screen are one page out of a query,\n * and reordering them here would only shuffle the page. Three states, because a column\n * has to be able to give the ordering back.\n */\nfunction onSort(column: TableColumn<T>) {\n if (!column.sortable) return\n const current = sort.value\n let next: TableSort | null\n if (current?.key !== column.key) next = { key: column.key, order: 'asc' }\n else if (current.order === 'asc') next = { key: column.key, order: 'desc' }\n else next = null\n\n sort.value = next\n page.value = 1\n emit('sort-change', next)\n}\n\nfunction ariaSort(column: TableColumn<T>) {\n if (!column.sortable) return undefined\n if (sort.value?.key !== column.key) return 'none'\n return sort.value.order === 'asc' ? 'ascending' : 'descending'\n}\n\nfunction sortState(column: TableColumn<T>) {\n return sort.value?.key === column.key ? sort.value.order : null\n}\n\nfunction alignClass(column: TableColumn<T>) {\n return column.align && column.align !== 'left' ? `wx-table__cell--${column.align}` : undefined\n}\n\nlet timer: ReturnType<typeof setTimeout> | undefined\n\n/**\n * The field answers at once; the backend hears about it when the typing settles. The\n * settled term is what the state is built from, so a burst of keystrokes is one change\n * rather than one per letter — and filtering changes what page one is, so the page goes\n * back to the first.\n */\nconst settledSearch = ref(search.value)\n\nfunction onSearch(value: string | number | undefined) {\n search.value = value === undefined ? '' : String(value)\n}\n\nfunction onSearchChanged(term: string) {\n clearTimeout(timer)\n const settle = () => {\n settledSearch.value = term\n page.value = 1\n emit('search', term)\n }\n if (!props.searchDebounce) settle()\n else timer = setTimeout(settle, props.searchDebounce)\n}\n\nonBeforeUnmount(() => clearTimeout(timer))\n\n/** Everything the backend needs, in one object, so there is one thing to watch. */\nconst state = computed<TableState>(() => ({\n page: page.value,\n perPage: perPage.value,\n sort: sort.value,\n search: settledSearch.value,\n}))\n\nconst STORAGE_PREFIX = 'wx-table:'\n\n/**\n * Reading happens after mount rather than during setup: this renders on a server too,\n * and markup built from one machine's localStorage would not match what the browser\n * then hydrates.\n */\nfunction restore() {\n if (!props.persist) return\n let saved: Partial<TableState> | null = null\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + props.persist)\n saved = raw ? (JSON.parse(raw) as Partial<TableState>) : null\n } catch {\n // Unavailable, full, or holding something we did not write. Defaults will do.\n return\n }\n if (!saved) return\n\n if (typeof saved.page === 'number' && saved.page > 0) page.value = saved.page\n if (typeof saved.perPage === 'number' && saved.perPage > 0) perPage.value = saved.perPage\n if (typeof saved.search === 'string') search.value = saved.search\n if (saved.sort === null) sort.value = null\n else if (saved.sort && typeof saved.sort.key === 'string') {\n sort.value = { key: saved.sort.key, order: saved.sort.order === 'desc' ? 'desc' : 'asc' }\n }\n}\n\nfunction save(value: TableState) {\n if (!props.persist) return\n try {\n window.localStorage.setItem(STORAGE_PREFIX + props.persist, JSON.stringify(value))\n } catch {\n // A private window or a full quota. Remembering is a convenience, not a feature.\n }\n}\n\nonMounted(() => {\n restore()\n settledSearch.value = search.value\n emit('state-change', state.value)\n\n // Both watchers start here, so the restore above counts as the first state rather\n // than as a change — one fetch on load, not two.\n watch(search, onSearchChanged)\n watch(state, (value) => {\n save(value)\n emit('state-change', value)\n })\n})\n\n/** Columns ahead of the first figure belong to the caption. */\nfunction summaryStart(row: TableSummaryRow): number {\n const cells = row.cells ?? {}\n const index = visibleColumns.value.findIndex((column) => column.key in cells)\n return index === -1 ? visibleColumns.value.length : index\n}\n\nfunction summarySpan(row: TableSummaryRow): number {\n return utilityCount.value + summaryStart(row)\n}\n\nfunction summaryColumns(row: TableSummaryRow): TableColumn<T>[] {\n return visibleColumns.value.slice(summaryStart(row))\n}\n\nfunction summaryValue(row: TableSummaryRow, column: TableColumn<T>): unknown {\n return row.cells?.[column.key]\n}\n\nfunction summaryText(row: TableSummaryRow, column: TableColumn<T>): string {\n const value = summaryValue(row, column)\n return value === null || value === undefined ? '' : String(value)\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <header v-if=\"hasHeader\" class=\"wx-table__header\">\n <div class=\"wx-table__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <div class=\"wx-table__tools\">\n <slot name=\"actions\" />\n\n <div v-if=\"searchable\" class=\"wx-table__search\">\n <wx-input\n type=\"search\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n :size=\"size\"\n clearable\n :aria-label=\"searchPlaceholder\"\n @update:model-value=\"onSearch\"\n />\n </div>\n </div>\n </header>\n\n <div class=\"wx-table__scroll\" :style=\"scrollStyle\">\n <table\n class=\"wx-table__table\"\n :class=\"{ 'wx-table__table--fixed': layout === 'fixed' }\"\n :aria-label=\"ariaLabel\"\n :aria-busy=\"loading || undefined\"\n >\n <colgroup>\n <col v-if=\"expandable\" :style=\"{ width: `${UTILITY_WIDTH}px` }\" />\n <col v-if=\"selectable\" :style=\"{ width: `${UTILITY_WIDTH}px` }\" />\n <col v-for=\"column in visibleColumns\" :key=\"column.key\" :style=\"colStyle(column)\" />\n </colgroup>\n\n <thead class=\"wx-table__head\">\n <tr>\n <th\n v-if=\"expandable\"\n scope=\"col\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('expand')\"\n >\n <span class=\"wx-table__sr-only\">Expand</span>\n </th>\n\n <th\n v-if=\"selectable\"\n scope=\"col\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('select')\"\n >\n <wx-checkbox\n :model-value=\"allSelected\"\n :indeterminate=\"someSelected\"\n :disabled=\"!selectableKeys.length\"\n aria-label=\"Select every row on this page\"\n @update:model-value=\"toggleAll\"\n />\n </th>\n\n <th\n v-for=\"column in visibleColumns\"\n :key=\"column.key\"\n scope=\"col\"\n class=\"wx-table__cell\"\n :class=\"[alignClass(column), fixedClass(column), column.headerClass]\"\n :style=\"fixedStyle(column)\"\n :aria-sort=\"ariaSort(column)\"\n >\n <button\n v-if=\"column.sortable\"\n class=\"wx-table__sort\"\n type=\"button\"\n @click=\"onSort(column)\"\n >\n <slot :name=\"`header-${column.key}`\" :column=\"column\">\n {{ column.label ?? column.key }}\n </slot>\n <svg\n class=\"wx-table__sort-icon\"\n :class=\"sortState(column) ? `is-${sortState(column)}` : undefined\"\n viewBox=\"0 0 8 12\"\n aria-hidden=\"true\"\n >\n <path class=\"wx-table__sort-up\" d=\"M4 1 7 5 1 5Z\" />\n <path class=\"wx-table__sort-down\" d=\"M4 11 1 7 7 7Z\" />\n </svg>\n </button>\n\n <slot v-else :name=\"`header-${column.key}`\" :column=\"column\">\n {{ column.label ?? column.key }}\n </slot>\n </th>\n </tr>\n </thead>\n\n <tbody class=\"wx-table__body\">\n <template v-for=\"(row, index) in rows\" :key=\"keyOf(row, index)\">\n <tr\n class=\"wx-table__row\"\n :class=\"[\n rowClass?.(row, index),\n {\n 'is-striped': index % 2 === 1,\n 'is-selected': selectable && isSelected(row, index),\n 'is-expanded': expandable && isExpanded(row, index),\n },\n ]\"\n @click=\"emit('row-click', row, index, $event)\"\n >\n <td\n v-if=\"expandable\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('expand')\"\n @click.stop\n >\n <button\n v-if=\"canExpand(row)\"\n class=\"wx-table__expander\"\n type=\"button\"\n :aria-expanded=\"isExpanded(row, index)\"\n :aria-label=\"isExpanded(row, index) ? 'Collapse row' : 'Expand row'\"\n @click=\"toggleExpand(row, index)\"\n >\n <svg viewBox=\"0 0 12 12\" aria-hidden=\"true\">\n <path d=\"M4.5 2 8.5 6l-4 4\" />\n </svg>\n </button>\n </td>\n\n <td\n v-if=\"selectable\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('select')\"\n @click.stop\n >\n <wx-checkbox\n :model-value=\"isSelected(row, index)\"\n :disabled=\"!canSelect(row)\"\n aria-label=\"Select row\"\n @update:model-value=\"(checked: boolean) => toggleRow(row, index, checked)\"\n />\n </td>\n\n <td\n v-for=\"column in visibleColumns\"\n :key=\"column.key\"\n class=\"wx-table__cell\"\n :class=\"[alignClass(column), fixedClass(column), column.cellClass]\"\n :style=\"fixedStyle(column)\"\n >\n <slot\n :name=\"`cell-${column.key}`\"\n :row=\"row\"\n :value=\"read(row, column.key)\"\n :index=\"index\"\n :column=\"column\"\n >\n {{ cellText(column, row, index) }}\n </slot>\n </td>\n </tr>\n\n <tr v-if=\"expandable && isExpanded(row, index)\" class=\"wx-table__row--expansion\">\n <td class=\"wx-table__cell wx-table__expansion\" :colspan=\"columnCount\">\n <slot name=\"expanded\" :row=\"row\" :index=\"index\" />\n </td>\n </tr>\n </template>\n\n <tr v-if=\"!rows.length && !loading\" class=\"wx-table__row wx-table__row--empty\">\n <td class=\"wx-table__cell wx-table__empty\" :colspan=\"columnCount\">\n <slot name=\"empty\">{{ emptyText }}</slot>\n </td>\n </tr>\n </tbody>\n\n <tfoot v-if=\"summary.length || $slots.footer || showPagination\" class=\"wx-table__foot\">\n <tr\n v-for=\"(line, lineIndex) in summary\"\n :key=\"lineIndex\"\n class=\"wx-table__summary\"\n :class=\"[line.class, { 'is-strong': line.strong }]\"\n >\n <td\n v-if=\"summarySpan(line) > 0\"\n class=\"wx-table__cell wx-table__summary-label\"\n :colspan=\"summarySpan(line)\"\n >\n {{ line.label }}\n </td>\n\n <td\n v-for=\"column in summaryColumns(line)\"\n :key=\"column.key\"\n class=\"wx-table__cell\"\n :class=\"alignClass(column)\"\n >\n <slot :name=\"`summary-${column.key}`\" :row=\"line\" :value=\"summaryValue(line, column)\">\n {{ summaryText(line, column) }}\n </slot>\n </td>\n </tr>\n\n <tr v-if=\"$slots.footer || showPagination\" class=\"wx-table__footer-row\">\n <td class=\"wx-table__cell\" :colspan=\"columnCount\">\n <slot name=\"footer\">\n <wx-pagination\n v-model:page=\"page\"\n v-model:per-page=\"perPage\"\n :paginator=\"paginator\"\n :per-page-options=\"perPageOptions\"\n :size=\"size\"\n :disabled=\"loading\"\n />\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <div v-if=\"loading\" class=\"wx-table__loading\">\n <slot name=\"loading\">\n <span class=\"wx-table__spinner\" aria-hidden=\"true\" />\n <span class=\"wx-table__loading-text\">Loading</span>\n </slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-table {\n position: relative;\n z-index: 0;\n box-sizing: border-box;\n /*\n * A flex or grid item will not shrink below its content unless told to, and the\n * content here is a table that can be twice the width of the page. Without this the\n * inner scroller never scrolls and the whole document does instead.\n */\n min-width: 0;\n /*\n * Pinning asks about the table's own width, so the table is the thing being measured.\n * Containment means the width can no longer come from the contents, so it is stated:\n * inside a flex row the element would otherwise measure zero.\n */\n width: 100%;\n max-width: 100%;\n container-type: inline-size;\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n\n --wx-table-padding-y: var(--wx-space-10);\n --wx-table-padding-x: var(--wx-space-16);\n /* What a pinned cell paints itself with; every row state restates it. */\n --wx-table-row-bg: var(--wx-bg-surface);\n}\n\n.wx-table--sm {\n --wx-table-padding-y: var(--wx-space-6);\n --wx-table-padding-x: var(--wx-space-12);\n}\n\n.wx-table--lg {\n --wx-table-padding-y: var(--wx-space-14);\n}\n\n.wx-table__header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-space-12) var(--wx-table-padding-x);\n}\n\n.wx-table__title {\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-table__tools {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n margin-left: auto;\n}\n\n.wx-table__search {\n width: var(--wx-table-search-width, 240px);\n}\n\n.wx-table__scroll {\n overflow: auto;\n border-radius: inherit;\n}\n\n/*\n * Explicit resets rather than an assumption that nothing else styles a table. VitePress\n * turns every table into a scrolling block; Bootstrap and Tailwind's preflight have\n * opinions of their own. Left alone, a host stylesheet takes the layout away from the\n * table, the stickiness away from the header and the stripes away from the rows —\n * quietly, and only once the library is embedded somewhere real.\n */\n.wx-table__table {\n display: table;\n width: 100%;\n margin: 0;\n overflow: visible;\n border: 0;\n border-collapse: collapse;\n border-spacing: 0;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-table__table thead {\n display: table-header-group;\n}\n\n.wx-table__table tbody {\n display: table-row-group;\n}\n\n.wx-table__table tfoot {\n display: table-footer-group;\n}\n\n.wx-table__table tr {\n display: table-row;\n background: none;\n border: 0;\n}\n\n/*\n * A row's colour reaches the eye by two routes: the row paints it behind cells that are\n * transparent, and a pinned cell paints it itself. They therefore have to change at the\n * same speed, and that speed has to be stated — VitePress fades a `tr` over half a\n * second, which left the pinned columns snapping to the hover colour while the rest of\n * the row was still on its way there.\n *\n * The shadow goes with it: it is the same colour, covering the seam beside the cell.\n */\n.wx-table__row,\n.wx-table__cell.is-fixed-left,\n.wx-table__cell.is-fixed-right {\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-table__row,\n .wx-table__cell.is-fixed-left,\n .wx-table__cell.is-fixed-right {\n transition: none;\n }\n}\n\n.wx-table__table th,\n.wx-table__table td {\n display: table-cell;\n border: 0;\n}\n\n.wx-table__table--fixed {\n table-layout: fixed;\n}\n\n.wx-table--sm .wx-table__table {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-table--lg .wx-table__table {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-table__cell {\n box-sizing: border-box;\n padding: var(--wx-table-padding-y) var(--wx-table-padding-x);\n text-align: left;\n vertical-align: middle;\n}\n\n.wx-table__cell--center {\n text-align: center;\n}\n\n.wx-table__cell--right {\n text-align: right;\n}\n\n/*\n * The control is the whole content of a utility cell, and an inline-level box would sit\n * on a text baseline — three pixels above the middle of the row, which is exactly the\n * kind of misalignment that reads as sloppiness rather than as a bug.\n */\n.wx-table__cell--utility {\n width: 44px;\n padding-right: 0;\n line-height: 0;\n}\n\n.wx-table__cell--utility :deep(.wx-checkbox) {\n display: flex;\n}\n\n.wx-table__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.wx-table__head .wx-table__cell {\n --wx-table-row-bg: var(--wx-bg-subtle);\n\n background: var(--wx-bg-subtle);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n white-space: nowrap;\n}\n\n/* Sticky needs a painted background of its own, or the rows show through. */\n.wx-table--sticky .wx-table__head .wx-table__cell {\n position: sticky;\n top: 0;\n z-index: 2;\n}\n\n.wx-table--sticky .wx-table__foot .wx-table__cell {\n position: sticky;\n bottom: 0;\n z-index: 2;\n background: var(--wx-bg-surface);\n}\n\n/* A pinned column paints over the scrolling ones, and the header over both. The colour\n it paints with is whatever the row it belongs to is wearing. */\n.wx-table__cell.is-fixed-left,\n.wx-table__cell.is-fixed-right {\n position: sticky;\n z-index: 1;\n background: var(--wx-table-row-bg);\n}\n\n.wx-table__cell.is-fixed-left {\n left: var(--wx-pin-left, 0px);\n}\n\n.wx-table__cell.is-fixed-right {\n right: var(--wx-pin-right, 0px);\n}\n\n.wx-table__head .wx-table__cell.is-fixed-left,\n.wx-table__head .wx-table__cell.is-fixed-right,\n.wx-table--sticky .wx-table__foot .wx-table__cell.is-fixed-left,\n.wx-table--sticky .wx-table__foot .wx-table__cell.is-fixed-right {\n z-index: 3;\n}\n\n/*\n * A scrollport rarely begins on a whole pixel — at any display scale but 100% it begins\n * on a fraction of one — so the pinned cell is rasterised with its edge pixel only\n * partly covered, and a hairline of the scrolling column shows through it.\n *\n * The cover is a strip of its own rather than a box shadow: Firefox declines to paint a\n * shadow on a cell in a collapsed-border table, which is where the sliver was still\n * turning up. Two pixels wide and straddling the edge, so whichever pixel the boundary\n * falls in is covered outright instead of blended.\n */\n.wx-table__cell.is-fixed-left::before,\n.wx-table__cell.is-fixed-right::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--wx-table-row-bg);\n pointer-events: none;\n}\n\n.wx-table__cell.is-fixed-left::before {\n left: -1px;\n}\n\n.wx-table__cell.is-fixed-right::before {\n right: -1px;\n}\n\n/* The edge of the frozen block, so it reads as floating over what slides beneath. */\n.wx-table__cell.is-fixed-left.is-fixed-edge {\n box-shadow: 6px 0 6px -6px rgb(0 0 0 / 0.18);\n}\n\n.wx-table__cell.is-fixed-right.is-fixed-edge {\n box-shadow: -6px 0 6px -6px rgb(0 0 0 / 0.18);\n}\n\n/*\n * Pinning is a luxury of width. On a phone the frozen columns take most of the screen\n * and the ones the reader came for have nowhere to scroll into view, so the table gives\n * up freezing and simply scrolls as a whole.\n *\n * The question is asked of the table rather than of the window: the same thing happens\n * to a table in a narrow panel on a wide desktop. The offsets are custom properties for\n * exactly this reason — an inline `left` could not be talked out of it.\n */\n@container (max-width: 600px) {\n .wx-table__cell.is-fixed-left,\n .wx-table__cell.is-fixed-right,\n .wx-table__cell.is-fixed-left.is-fixed-edge,\n .wx-table__cell.is-fixed-right.is-fixed-edge {\n left: auto;\n right: auto;\n z-index: auto;\n box-shadow: none;\n }\n\n .wx-table__cell.is-fixed-left::before,\n .wx-table__cell.is-fixed-right::before {\n display: none;\n }\n}\n\n.wx-table__body .wx-table__cell {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-table--bordered .wx-table__cell + .wx-table__cell {\n border-left: 1px solid var(--wx-border-muted);\n}\n\n/* Striped by row index, not by position: an expansion row is a sibling too, and\n counting it would flip the pattern from wherever a row was opened. Each state names\n its colour once; the pinned cells read it back out of the variable. */\n.wx-table--stripe .wx-table__row.is-striped {\n --wx-table-row-bg: var(--wx-bg-subtle);\n\n background: var(--wx-bg-subtle);\n}\n\n.wx-table--hover .wx-table__row:hover {\n --wx-table-row-bg: var(--wx-bg-fill);\n\n background: var(--wx-bg-fill);\n}\n\n.wx-table__row.is-selected {\n --wx-table-row-bg: var(--wx-color-primary-soft);\n\n background: var(--wx-color-primary-soft);\n}\n\n.wx-table__expander {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-table__expander:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-table__expander:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-table__expander svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-table__row.is-expanded .wx-table__expander svg {\n transform: rotate(90deg);\n}\n\n.wx-table__expansion {\n background: var(--wx-bg-subtle);\n}\n\n.wx-table__sort {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-6);\n padding: 0;\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n\n.wx-table__sort:hover {\n color: var(--wx-text-default);\n}\n\n.wx-table__sort:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-table__sort-icon {\n flex: 0 0 auto;\n width: 8px;\n height: 12px;\n}\n\n.wx-table__sort-icon path {\n fill: var(--wx-border-strong);\n}\n\n.wx-table__sort-icon.is-asc .wx-table__sort-up,\n.wx-table__sort-icon.is-desc .wx-table__sort-down {\n fill: var(--wx-color-primary);\n}\n\n.wx-table__empty {\n padding: var(--wx-space-24) var(--wx-table-padding-x);\n color: var(--wx-text-muted);\n text-align: center;\n}\n\n.wx-table__foot .wx-table__cell {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-table__summary .wx-table__cell {\n color: var(--wx-text-muted);\n}\n\n.wx-table__summary-label {\n text-align: right;\n}\n\n.wx-table__summary.is-strong .wx-table__cell {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n/* The rows stay readable underneath: a page that is being refreshed still says what it said. */\n.wx-table__loading {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wx-space-8);\n background: color-mix(in srgb, var(--wx-bg-surface) 70%, transparent);\n border-radius: inherit;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-table__spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--wx-border-default);\n border-top-color: var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n animation: wx-table-spin var(--wx-duration-slow) linear infinite;\n}\n\n@keyframes wx-table-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-table__spinner {\n animation-duration: 3s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n computed,\n Fragment,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useSlots,\n watch,\n type VNode,\n} from 'vue'\nimport { TabsList, TabsRoot, TabsTrigger } from 'reka-ui'\nimport WxBadge from '../Badge/Badge.vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport WxTab from '../Tab/Tab.vue'\nimport type { IconName } from '../Icon/types'\nimport type { TabDescriptor, TabsEmits, TabsProps, TabValue } from './types'\n\ndefineOptions({ name: 'WxTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n variant: 'line',\n size: 'md',\n orientation: 'horizontal',\n align: 'start',\n activationMode: 'automatic',\n keepAlive: false,\n loop: true,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TabsEmits>()\n\ndefineSlots<{\n /** The `WxTab`s. */\n default?: () => unknown\n /** Sits at the end of the strip — a button, a filter, a count. */\n extra?: () => unknown\n}>()\n\nconst model = defineModel<TabValue | undefined>({ default: undefined })\n\nconst slots = useSlots()\n\n/** What the last render found, for the code that runs afterwards and cannot rescan. */\nlet rendered: TabDescriptor[] = []\n\n/**\n * The strip is built from the `WxTab`s in the slot, so a tab and its panel are written\n * in one place. The scan runs during render rather than in a computed: slot output is\n * not reactive state, and a cached copy would keep showing yesterday's labels.\n */\nfunction readTabs(): TabDescriptor[] {\n rendered = collect((slots.default?.() ?? []) as VNode[])\n scheduleSelect()\n return rendered\n}\n\nfunction collect(nodes: VNode[]): TabDescriptor[] {\n const found: TabDescriptor[] = []\n\n for (const node of nodes) {\n // `v-for` and `<template>` wrap what they render in a fragment.\n if (node.type === Fragment) {\n found.push(...collect((node.children ?? []) as VNode[]))\n continue\n }\n if (node.type !== WxTab) continue\n\n const tabProps = (node.props ?? {}) as Record<string, unknown>\n // A component's slots arrive as the vnode's children.\n const tabSlots = node.children as { label?: () => unknown } | null\n\n found.push({\n value: tabProps.value as TabValue,\n label: tabProps.label as string | undefined,\n icon: tabProps.icon as IconName | undefined,\n badge: tabProps.badge as string | number | undefined,\n // A bare `disabled` in a template is an empty string, not `true`.\n disabled: tabProps.disabled === '' || tabProps.disabled === true,\n labelSlot: typeof tabSlots?.label === 'function' ? tabSlots.label : undefined,\n })\n }\n\n return found\n}\n\n/**\n * Nothing selected shows an empty panel, so the first usable tab opens by itself. The\n * check is worth repeating: tabs often arrive from a request, and the tab that was open\n * can go away with the array it came from.\n */\nfunction selectFirst() {\n if (rendered.length === 0) return\n if (rendered.some((tab) => tab.value === model.value)) return\n\n model.value = (rendered.find((tab) => !tab.disabled) ?? rendered[0]).value\n}\n\nlet selectQueued = false\n\n/**\n * The check is asked for from the render and answered after it, because writing state\n * mid-render is how render loops start.\n *\n * It hangs off the scan rather than off `onUpdated` deliberately. Slot content belongs\n * to whoever wrote it: when the tabs come from a `v-for` in the parent, Vue patches the\n * new tabs straight into this component's output without re-rendering it, so no update\n * hook of ours would ever run — but the strip is rebuilt, and that is this function.\n */\nfunction scheduleSelect() {\n if (selectQueued) return\n\n selectQueued = true\n nextTick(() => {\n selectQueued = false\n selectFirst()\n })\n}\n\nwatch(model, (value) => {\n if (value !== undefined) emit('change', value)\n})\n\n/* ---------------------------------------------------------------------------\n * The strip on a small screen\n *\n * Tabs outgrow a phone long before they outgrow a desktop, so the strip scrolls\n * sideways rather than wrapping into a second row that pushes the panel down. Three\n * things follow. The active tab is scrolled into view whenever it changes, because it\n * is often changed from somewhere else — a wizard step, a route. The end that has more\n * behind it is faded, so the strip reads as scrollable without spending any width on\n * saying so. And the arrows are for a mouse only: a finger just swipes.\n * ------------------------------------------------------------------------- */\n\nconst scroller = ref<HTMLElement | null>(null)\nconst overflowStart = ref(false)\nconst overflowEnd = ref(false)\n\nconst scrollable = computed(() => props.orientation === 'horizontal')\n\nfunction measure() {\n const el = scroller.value\n if (!el || !scrollable.value) {\n overflowStart.value = false\n overflowEnd.value = false\n return\n }\n\n /* A pixel of slack: fractional widths never land exactly on the edge. */\n const max = el.scrollWidth - el.clientWidth\n overflowStart.value = el.scrollLeft > 1\n overflowEnd.value = el.scrollLeft < max - 1\n}\n\nfunction step(direction: 1 | -1) {\n const el = scroller.value\n if (!el) return\n\n /* Most of a screenful, so a tab or two stays behind as an anchor. */\n el.scrollLeft += direction * Math.max(el.clientWidth * 0.75, 120)\n measure()\n}\n\n/**\n * `instant` is for the first placement: a strip that opens on its eighth tab should\n * already be there, not slide there while the page is still settling.\n */\nfunction revealActive(instant = false) {\n const el = scroller.value\n if (!el || !scrollable.value) return\n\n const active = el.querySelector<HTMLElement>('[data-state=\"active\"]')\n if (!active) return\n\n /* `offsetLeft` is read against the scroller, which is positioned for exactly that. */\n const centred = active.offsetLeft - (el.clientWidth - active.offsetWidth) / 2\n\n if (instant) el.style.scrollBehavior = 'auto'\n /* Past the end it clamps by itself, which is what should happen for the last tab. */\n el.scrollLeft = Math.max(0, centred)\n if (instant) el.style.scrollBehavior = ''\n\n measure()\n}\n\nlet observer: ResizeObserver | undefined\n\nonMounted(() => {\n selectFirst()\n\n /* The strip overflows for two reasons: the container shrank, or the tabs changed. */\n observer = new ResizeObserver(() => measure())\n if (scroller.value) observer.observe(scroller.value)\n if (scroller.value?.firstElementChild) observer.observe(scroller.value.firstElementChild)\n\n measure()\n revealActive(true)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nwatch(model, async () => {\n await nextTick()\n revealActive()\n})\n\nconst classes = computed(() => [\n 'wx-tabs',\n `wx-tabs--${props.variant}`,\n `wx-tabs--${props.size}`,\n `wx-tabs--${props.orientation}`,\n `wx-tabs--align-${props.align}`,\n])\n\ndefineExpose({ measure, revealActive })\n</script>\n\n<template>\n <tabs-root\n v-model=\"model\"\n :class=\"classes\"\n :orientation=\"orientation\"\n :activation-mode=\"activationMode\"\n :unmount-on-hide=\"!keepAlive\"\n >\n <!--\n The root is the container the layout asks about, and a container query cannot\n style the container itself — so the strip and the panels are laid out one level in.\n -->\n <div class=\"wx-tabs__layout\">\n <div class=\"wx-tabs__bar\">\n <button\n v-if=\"overflowStart || overflowEnd\"\n class=\"wx-tabs__arrow\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :disabled=\"!overflowStart\"\n @click=\"step(-1)\"\n >\n <wx-icon name=\"chevron-left\" />\n </button>\n\n <div\n ref=\"scroller\"\n class=\"wx-tabs__scroller\"\n :class=\"{ 'is-overflow-start': overflowStart, 'is-overflow-end': overflowEnd }\"\n @scroll.passive=\"measure\"\n >\n <tabs-list class=\"wx-tabs__list\" :loop=\"loop\" :aria-label=\"ariaLabel\">\n <tabs-trigger\n v-for=\"tab in readTabs()\"\n :key=\"tab.value\"\n class=\"wx-tabs__tab\"\n :value=\"tab.value\"\n :disabled=\"tab.disabled\"\n >\n <wx-icon v-if=\"tab.icon\" class=\"wx-tabs__icon\" :name=\"tab.icon\" />\n <span class=\"wx-tabs__label\">\n <!-- A slot function renders as a functional component, in its own scope. -->\n <component :is=\"tab.labelSlot\" v-if=\"tab.labelSlot\" />\n <template v-else>{{ tab.label ?? tab.value }}</template>\n </span>\n <wx-badge v-if=\"tab.badge !== undefined\" class=\"wx-tabs__badge\" size=\"sm\" round>\n {{ tab.badge }}\n </wx-badge>\n </tabs-trigger>\n </tabs-list>\n </div>\n\n <button\n v-if=\"overflowStart || overflowEnd\"\n class=\"wx-tabs__arrow\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :disabled=\"!overflowEnd\"\n @click=\"step(1)\"\n >\n <wx-icon name=\"chevron-right\" />\n </button>\n\n <div v-if=\"$slots.extra\" class=\"wx-tabs__extra\">\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div class=\"wx-tabs__panels\">\n <slot />\n </div>\n </div>\n </tabs-root>\n</template>\n\n<style scoped>\n.wx-tabs {\n --wx-tabs-gap: var(--wx-space-4);\n --wx-tabs-fade: 24px;\n\n display: block;\n box-sizing: border-box;\n min-width: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n /* The strip reacts to the width it was given, not to the window's. */\n container-type: inline-size;\n}\n\n.wx-tabs__layout {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.wx-tabs__bar {\n display: flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-tabs__scroller {\n /* Positioned so a tab's `offsetLeft` is measured against the strip it scrolls in. */\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n /* A swipe along the strip must not become a page swipe or a browser back gesture. */\n overscroll-behavior-inline: contain;\n scroll-behavior: smooth;\n scrollbar-width: none;\n}\n\n.wx-tabs__scroller::-webkit-scrollbar {\n display: none;\n}\n\n/*\n * The fade says \"there is more this way\" and costs no width, which is the point on a\n * phone. Both ends share one mask, so a strip cut off at both ends fades at both.\n */\n.wx-tabs__scroller.is-overflow-start,\n.wx-tabs__scroller.is-overflow-end {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 var(--wx-tabs-fade-start, 0px),\n #000 calc(100% - var(--wx-tabs-fade-end, 0px)),\n transparent 100%\n );\n}\n\n.wx-tabs__scroller.is-overflow-start {\n --wx-tabs-fade-start: var(--wx-tabs-fade);\n}\n\n.wx-tabs__scroller.is-overflow-end {\n --wx-tabs-fade-end: var(--wx-tabs-fade);\n}\n\n.wx-tabs__list {\n display: flex;\n gap: var(--wx-tabs-gap);\n /* Narrower than the scroller, the list still has to span it for the rule under it. */\n width: max-content;\n min-width: 100%;\n}\n\n.wx-tabs__tab {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n margin: 0;\n padding: var(--wx-space-10) var(--wx-space-12);\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-muted);\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n white-space: nowrap;\n cursor: pointer;\n transition:\n color var(--wx-duration-fast) var(--wx-easing-standard),\n background var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-tabs--sm .wx-tabs__tab {\n padding: var(--wx-space-6) var(--wx-space-10);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-tabs__tab:hover:not(:disabled) {\n color: var(--wx-text-default);\n}\n\n.wx-tabs__tab:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-tabs__tab:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-tabs__tab[data-state='active'] {\n color: var(--wx-color-primary);\n}\n\n.wx-tabs__icon {\n flex: 0 0 auto;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-tabs__badge {\n flex: 0 0 auto;\n}\n\n.wx-tabs__arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-tabs__arrow:hover:not(:disabled) {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-tabs__arrow:disabled {\n color: var(--wx-text-disabled);\n cursor: default;\n}\n\n.wx-tabs__extra {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n padding-left: var(--wx-space-8);\n}\n\n.wx-tabs__panels {\n min-width: 0;\n padding-top: var(--wx-space-16);\n}\n\n/* Line — the default: a rule under the strip with the active tab standing on it. */\n.wx-tabs--line .wx-tabs__bar {\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n box-shadow: inset 0 -2px 0 transparent;\n}\n\n.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset 0 -2px 0 var(--wx-color-primary);\n}\n\n.wx-tabs--line .wx-tabs__tab:focus-visible {\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Pill — a segmented control: the list is the track, the active tab the thumb. */\n.wx-tabs--pill .wx-tabs__list {\n gap: var(--wx-space-2);\n padding: var(--wx-space-4);\n background: var(--wx-bg-muted);\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-tabs--pill .wx-tabs__tab {\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-tabs--pill .wx-tabs__tab[data-state='active'] {\n background: var(--wx-bg-surface);\n color: var(--wx-text-strong);\n box-shadow: var(--wx-shadow-card);\n}\n\n/* Card — folder tabs: the active one is a sheet that has risen through the rule. */\n.wx-tabs--card .wx-tabs__bar {\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-tabs--card .wx-tabs__list {\n gap: 0;\n}\n\n.wx-tabs--card .wx-tabs__tab {\n margin-bottom: -1px;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n}\n\n.wx-tabs--card .wx-tabs__tab[data-state='active'] {\n background: var(--wx-bg-surface);\n border-color: var(--wx-border-default);\n border-bottom-color: var(--wx-bg-surface);\n}\n\n/* Alignment only means anything while the tabs still fit. */\n.wx-tabs--align-center .wx-tabs__list {\n justify-content: center;\n}\n\n.wx-tabs--align-end .wx-tabs__list {\n justify-content: flex-end;\n}\n\n.wx-tabs--align-stretch .wx-tabs__list {\n width: 100%;\n}\n\n.wx-tabs--align-stretch .wx-tabs__tab {\n flex: 1 1 0;\n justify-content: center;\n}\n\n/* A column of tabs beside the panel. */\n.wx-tabs--vertical .wx-tabs__layout {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wx-space-16);\n}\n\n.wx-tabs--vertical .wx-tabs__bar {\n flex: 0 0 auto;\n flex-direction: column;\n align-items: stretch;\n}\n\n.wx-tabs--vertical .wx-tabs__scroller {\n overflow-x: visible;\n}\n\n.wx-tabs--vertical .wx-tabs__list {\n flex-direction: column;\n width: auto;\n min-width: 0;\n}\n\n.wx-tabs--vertical .wx-tabs__tab {\n justify-content: flex-start;\n}\n\n.wx-tabs--vertical .wx-tabs__panels {\n flex: 1 1 auto;\n padding-top: 0;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__bar {\n border-right: 1px solid var(--wx-border-default);\n border-bottom: none;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) 0 0 var(--wx-radius-xs);\n box-shadow: inset -2px 0 0 transparent;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset -2px 0 0 var(--wx-color-primary);\n}\n\n/*\n * A column of tabs and a panel do not both fit across a phone. Below the width where\n * that stops working the column lies back down into an ordinary scrolling strip and\n * the panel takes the full width. The question is put to the tabs rather than to the\n * window: the same squeeze happens inside a narrow drawer on a wide monitor.\n */\n@container (max-width: 480px) {\n .wx-tabs--vertical .wx-tabs__layout {\n flex-direction: column;\n gap: 0;\n }\n\n .wx-tabs--vertical .wx-tabs__bar {\n flex-direction: row;\n align-items: center;\n }\n\n .wx-tabs--vertical .wx-tabs__scroller {\n overflow-x: auto;\n }\n\n .wx-tabs--vertical .wx-tabs__list {\n flex-direction: row;\n width: max-content;\n min-width: 100%;\n }\n\n .wx-tabs--vertical .wx-tabs__panels {\n padding-top: var(--wx-space-16);\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__bar {\n border-right: none;\n border-bottom: 1px solid var(--wx-border-default);\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n box-shadow: inset 0 -2px 0 transparent;\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset 0 -2px 0 var(--wx-color-primary);\n }\n}\n\n/* A finger needs a target it can hit, and has no use for the arrows — it swipes. */\n@media (pointer: coarse) {\n .wx-tabs__tab {\n min-height: 44px;\n }\n\n .wx-tabs__arrow {\n display: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-tabs__scroller {\n scroll-behavior: auto;\n }\n\n .wx-tabs__tab {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { TagsInputEmits, TagsInputProps } from './types'\n\ndefineOptions({ name: 'WxTagsInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TagsInputProps>(), {\n suggestions: () => [],\n placeholder: undefined,\n emptyText: 'Nothing found',\n max: undefined,\n duplicates: false,\n allowCreate: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TagsInputEmits>()\n\nconst model = defineModel<string[]>({ default: () => [] })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst text = ref('')\nconst open = ref(false)\nconst highlighted = ref(-1)\n/** The tag Backspace has marked; the next Backspace removes it. */\nconst armed = ref(-1)\n\nconst tags = computed(() => model.value ?? [])\n\nconst suggestions = computed(() =>\n props.suggestions.filter((suggestion) => !tags.value.includes(suggestion)),\n)\n\nconst showList = computed(() => open.value && suggestions.value.length > 0)\n\nconst full = computed(() => props.max !== undefined && tags.value.length >= props.max)\n\nconst classes = computed(() => [\n 'wx-tags-input',\n `wx-tags-input--${field.size.value}`,\n {\n [`wx-tags-input--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': showList.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nwatch(suggestions, () => {\n highlighted.value = -1\n})\n\nfunction commit(next: string[]) {\n model.value = next\n emit('change', next)\n}\n\nfunction add(tag: string) {\n const value = tag.trim()\n if (!value || full.value) return\n if (!props.duplicates && tags.value.includes(value)) {\n text.value = ''\n return\n }\n commit([...tags.value, value])\n text.value = ''\n open.value = false\n armed.value = -1\n}\n\nfunction remove(index: number) {\n commit(tags.value.filter((_, position) => position !== index))\n armed.value = -1\n}\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n text.value = value\n armed.value = -1\n highlighted.value = -1\n if (value) open.value = true\n emit('search', value)\n}\n\n/**\n * Backspace on an empty field marks the last tag first and removes it on the second\n * press — deleting something the user cannot see would be worse than one extra key.\n */\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n open.value = false\n armed.value = -1\n return\n }\n\n if (event.key === 'Backspace' && text.value === '' && tags.value.length > 0) {\n event.preventDefault()\n if (armed.value === tags.value.length - 1) remove(armed.value)\n else armed.value = tags.value.length - 1\n return\n }\n\n if (event.key === 'ArrowDown' && showList.value) {\n event.preventDefault()\n highlighted.value = (highlighted.value + 1) % suggestions.value.length\n return\n }\n\n if (event.key === 'ArrowUp' && showList.value) {\n event.preventDefault()\n highlighted.value =\n highlighted.value <= 0 ? suggestions.value.length - 1 : highlighted.value - 1\n return\n }\n\n if (event.key === 'Enter') {\n event.preventDefault()\n if (showList.value && highlighted.value >= 0) add(suggestions.value[highlighted.value])\n else if (props.allowCreate) add(text.value)\n }\n}\n\nfunction onBlur() {\n armed.value = -1\n // Let a click on a suggestion land before the list disappears.\n window.setTimeout(() => {\n open.value = false\n }, 120)\n}\n\ndefineExpose({ focus: () => inputRef.value?.focus() })\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"wx-tags-input__anchor\" @click=\"inputRef?.focus()\">\n <span\n v-for=\"(tag, index) in tags\"\n :key=\"tag\"\n class=\"wx-tags-input__tag\"\n :class=\"{ 'is-armed': index === armed }\"\n >\n {{ tag }}\n <button\n v-if=\"!field.disabled.value\"\n class=\"wx-tags-input__remove\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"`Remove ${tag}`\"\n @click.stop=\"remove(index)\"\n >\n ✕\n </button>\n </span>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"$attrs\"\n class=\"wx-tags-input__field\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-expanded=\"showList\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @focus=\"open = true\"\n @blur=\"onBlur\"\n />\n\n <ul v-if=\"showList\" class=\"wx-tags-input__list\" role=\"listbox\">\n <li\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"suggestion\"\n class=\"wx-tags-input__option\"\n :class=\"{ 'is-highlighted': index === highlighted }\"\n role=\"option\"\n :aria-selected=\"index === highlighted\"\n @mousedown.prevent=\"add(suggestion)\"\n @mousemove=\"highlighted = index\"\n >\n {{ suggestion }}\n </li>\n </ul>\n </div>\n\n <select v-if=\"name\" class=\"wx-sr-only\" :name=\"name\" multiple tabindex=\"-1\" aria-hidden=\"true\">\n <option v-for=\"tag in tags\" :key=\"tag\" :value=\"tag\" selected>{{ tag }}</option>\n </select>\n </div>\n</template>\n\n<style scoped>\n.wx-tags-input {\n display: block;\n width: 100%;\n}\n\n.wx-tags-input__anchor {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4);\n box-sizing: border-box;\n min-height: var(--wx-size-control-md);\n padding: var(--wx-space-4) var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-md);\n cursor: text;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-tags-input--sm .wx-tags-input__anchor {\n min-height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-tags-input--lg .wx-tags-input__anchor {\n min-height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-tags-input__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-tags-input__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-tags-input--error .wx-tags-input__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-tags-input--success .wx-tags-input__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-tags-input--warning .wx-tags-input__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-tags-input.is-disabled .wx-tags-input__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-tags-input__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n padding: 2px var(--wx-space-6);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-tags-input__tag.is-armed {\n background: var(--wx-color-danger-soft);\n color: var(--wx-color-danger);\n}\n\n.wx-tags-input__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n color: currentcolor;\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n opacity: 0.65;\n cursor: pointer;\n}\n\n.wx-tags-input__remove:hover {\n opacity: 1;\n}\n\n.wx-tags-input__field {\n flex: 1 1 80px;\n min-width: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-tags-input__field::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-tags-input__list {\n position: absolute;\n top: calc(100% + var(--wx-space-4));\n left: 0;\n right: 0;\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n max-height: 220px;\n margin: 0;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n list-style: none;\n overflow-y: auto;\n}\n\n.wx-tags-input__option {\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n.wx-tags-input__option.is-highlighted {\n background: var(--wx-bg-fill);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { TextProps } from './types'\n\ndefineOptions({ name: 'WxText' })\n\nconst props = withDefaults(defineProps<TextProps>(), {\n as: 'span',\n size: 'md',\n weight: 'regular',\n tone: 'default',\n align: undefined,\n truncate: false,\n italic: false,\n mono: false,\n})\n\nconst clampLines = computed(() => (typeof props.truncate === 'number' ? props.truncate : undefined))\n\nconst classes = computed(() => [\n 'wx-text',\n `wx-text--${props.size}`,\n `wx-text--${props.weight}`,\n `wx-text--tone-${props.tone}`,\n {\n [`wx-text--align-${props.align}`]: Boolean(props.align),\n 'wx-text--italic': props.italic,\n 'wx-text--mono': props.mono,\n 'wx-text--truncate': props.truncate === true,\n 'wx-text--clamp': clampLines.value !== undefined,\n },\n])\n\nconst style = computed(() =>\n clampLines.value === undefined ? undefined : { '--wx-text-lines': clampLines.value },\n)\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\" :style=\"style\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-text {\n margin: 0;\n font-family: var(--wx-font-family-sans);\n line-height: var(--wx-font-line-height-normal);\n color: var(--wx-text-color, var(--wx-text-default));\n}\n\n/* sizes */\n.wx-text--xs {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-text--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-text--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-text--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-text--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n/* weights */\n.wx-text--regular {\n font-weight: var(--wx-font-weight-regular);\n}\n\n.wx-text--medium {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-text--semibold {\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-text--bold {\n font-weight: var(--wx-font-weight-bold);\n}\n\n/* tones */\n.wx-text--tone-default {\n --wx-text-color: var(--wx-text-default);\n}\n\n.wx-text--tone-strong {\n --wx-text-color: var(--wx-text-strong);\n}\n\n.wx-text--tone-muted {\n --wx-text-color: var(--wx-text-muted);\n}\n\n.wx-text--tone-placeholder {\n --wx-text-color: var(--wx-text-placeholder);\n}\n\n.wx-text--tone-primary {\n --wx-text-color: var(--wx-color-primary);\n}\n\n.wx-text--tone-success {\n --wx-text-color: var(--wx-color-success-active);\n}\n\n.wx-text--tone-warning {\n --wx-text-color: var(--wx-color-warning-active);\n}\n\n.wx-text--tone-danger {\n --wx-text-color: var(--wx-color-danger);\n}\n\n.wx-text--tone-info {\n --wx-text-color: var(--wx-color-info-active);\n}\n\n.wx-text--tone-inverse {\n --wx-text-color: var(--wx-text-inverse);\n}\n\n/* alignment */\n.wx-text--align-start {\n text-align: start;\n}\n\n.wx-text--align-center {\n text-align: center;\n}\n\n.wx-text--align-end {\n text-align: end;\n}\n\n.wx-text--align-justify {\n text-align: justify;\n}\n\n.wx-text--italic {\n font-style: italic;\n}\n\n.wx-text--mono {\n font-family: var(--wx-font-family-mono);\n font-variant-numeric: tabular-nums;\n}\n\n/* Truncation needs a block box: an inline span ignores overflow. */\n.wx-text--truncate {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-text--clamp {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: var(--wx-text-lines, 2);\n line-clamp: var(--wx-text-lines, 2);\n overflow: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { TextareaEmits, TextareaModelValue, TextareaProps } from './types'\n\ndefineOptions({ name: 'WxTextarea', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n size: undefined,\n status: undefined,\n id: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n rows: 3,\n autosize: false,\n maxlength: undefined,\n showCount: false,\n resize: 'vertical',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst model = defineModel<TextareaModelValue>({ default: '' })\n\nconst field = useFormField(props)\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst focused = ref(false)\n\nconst currentValue = computed(() => model.value ?? '')\n\nconst counter = computed(() =>\n props.showCount && props.maxlength ? `${currentValue.value.length}/${props.maxlength}` : null,\n)\n\nconst autosizeOptions = computed(() =>\n props.autosize === true ? {} : props.autosize === false ? null : props.autosize,\n)\n\nconst classes = computed(() => [\n 'wx-textarea',\n `wx-textarea--${field.size.value}`,\n {\n [`wx-textarea--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n 'is-autosize': Boolean(autosizeOptions.value),\n },\n])\n\n/** Grows the field to fit its content, clamped by minRows / maxRows. */\nfunction syncHeight() {\n const options = autosizeOptions.value\n const el = textareaRef.value\n if (!options || !el) return\n\n el.style.height = 'auto'\n const styles = getComputedStyle(el)\n const lineHeight = Number.parseFloat(styles.lineHeight) || 20\n const vertical =\n Number.parseFloat(styles.paddingTop) +\n Number.parseFloat(styles.paddingBottom) +\n Number.parseFloat(styles.borderTopWidth) +\n Number.parseFloat(styles.borderBottomWidth)\n\n let height = el.scrollHeight\n if (options.minRows) height = Math.max(height, options.minRows * lineHeight + vertical)\n if (options.maxRows) height = Math.min(height, options.maxRows * lineHeight + vertical)\n\n el.style.height = `${height}px`\n el.style.overflowY = options.maxRows && el.scrollHeight > height ? 'auto' : 'hidden'\n}\n\nonMounted(() => nextTick(syncHeight))\nwatch([currentValue, autosizeOptions], () => nextTick(syncHeight))\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value\n model.value = value\n emit('input', value)\n}\n\nfunction onChange(event: Event) {\n emit('change', (event.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n emit('blur', event)\n}\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n blur: () => textareaRef.value?.blur(),\n select: () => textareaRef.value?.select(),\n textarea: textareaRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <textarea\n :id=\"field.id.value\"\n ref=\"textareaRef\"\n v-bind=\"$attrs\"\n class=\"wx-textarea__inner\"\n :value=\"currentValue\"\n :rows=\"rows\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :maxlength=\"maxlength\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :style=\"{ resize }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <span v-if=\"counter\" class=\"wx-textarea__count\">{{ counter }}</span>\n </div>\n</template>\n\n<style scoped>\n.wx-textarea {\n position: relative;\n display: block;\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-textarea:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n.wx-textarea.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-textarea--error,\n.wx-textarea--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-textarea--success,\n.wx-textarea--success.is-focused {\n border-color: var(--wx-color-success);\n}\n\n.wx-textarea--warning,\n.wx-textarea--warning.is-focused {\n border-color: var(--wx-color-warning);\n}\n\n.wx-textarea.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-textarea__inner {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-textarea--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-textarea--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-textarea--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-textarea.is-autosize .wx-textarea__inner {\n resize: none !important;\n overflow-y: hidden;\n}\n\n.wx-textarea__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-textarea__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-textarea__count {\n position: absolute;\n right: var(--wx-space-8);\n bottom: var(--wx-space-4);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n font-variant-numeric: tabular-nums;\n pointer-events: none;\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\n\nexport type TimelineSize = 'sm' | 'md'\n\n/** What `WxTimeline` hands down to the items inside it. */\nexport interface TimelineContext {\n size: ComputedRef<TimelineSize>\n}\n\nexport const timelineKey: InjectionKey<TimelineContext> = Symbol('wx-timeline')\n\nexport function useTimeline(): TimelineContext | null {\n return inject(timelineKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { timelineKey } from '../../composables/useTimeline'\nimport type { TimelineProps } from './types'\n\ndefineOptions({ name: 'WxTimeline' })\n\nconst props = withDefaults(defineProps<TimelineProps>(), {\n size: 'md',\n})\n\nprovide(timelineKey, { size: computed(() => props.size) })\n</script>\n\n<template>\n <ul class=\"wx-timeline\" :class=\"`wx-timeline--${size}`\">\n <slot />\n </ul>\n</template>\n\n<style scoped>\n.wx-timeline {\n --wx-timeline-dot: 12px;\n --wx-timeline-gap: var(--wx-space-18);\n\n margin: 0;\n padding: 0;\n list-style: none;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-timeline--sm {\n --wx-timeline-dot: 9px;\n --wx-timeline-gap: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useTimeline } from '../../composables/useTimeline'\nimport type { TimelineItemProps } from './types'\n\ndefineOptions({ name: 'WxTimelineItem' })\n\nconst props = withDefaults(defineProps<TimelineItemProps>(), {\n timestamp: undefined,\n datetime: undefined,\n timestampPlacement: 'top',\n title: undefined,\n type: 'default',\n hollow: false,\n icon: undefined,\n hideLine: false,\n})\n\nconst timeline = useTimeline()\nconst slots = useSlots()\n\nconst hasMark = computed(() => Boolean(props.icon || slots.dot))\n\nconst classes = computed(() => [\n 'wx-timeline-item',\n `wx-timeline-item--${timeline?.size.value ?? 'md'}`,\n {\n 'wx-timeline-item--no-line': props.hideLine,\n // A mark needs a bigger dot to sit in; the line and the indent follow it.\n 'wx-timeline-item--mark': hasMark.value,\n },\n])\n\nconst dotClasses = computed(() => [\n 'wx-timeline-item__dot',\n `wx-timeline-item__dot--${props.type}`,\n { 'wx-timeline-item__dot--hollow': props.hollow },\n])\n</script>\n\n<template>\n <li :class=\"classes\">\n <span class=\"wx-timeline-item__line\" aria-hidden=\"true\" />\n\n <span :class=\"dotClasses\" aria-hidden=\"true\">\n <slot name=\"dot\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n\n <div class=\"wx-timeline-item__content\">\n <time\n v-if=\"timestamp && timestampPlacement === 'top'\"\n class=\"wx-timeline-item__timestamp\"\n :datetime=\"datetime\"\n >\n {{ timestamp }}\n </time>\n\n <p v-if=\"title || $slots.title\" class=\"wx-timeline-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </p>\n\n <div v-if=\"$slots.default\" class=\"wx-timeline-item__body\">\n <slot />\n </div>\n\n <time\n v-if=\"timestamp && timestampPlacement === 'bottom'\"\n class=\"wx-timeline-item__timestamp wx-timeline-item__timestamp--bottom\"\n :datetime=\"datetime\"\n >\n {{ timestamp }}\n </time>\n </div>\n </li>\n</template>\n\n<style scoped>\n/*\n * Everything hangs off one vertical axis: the dot is centred on it, the line runs\n * down it, and the text starts a fixed gap to its right. Changing the dot size —\n * a small marker, or a 24px circle holding an icon — never moves the text.\n */\n.wx-timeline-item {\n --wx-timeline-axis: 12px;\n --wx-timeline-mark: var(--wx-timeline-dot, 12px);\n --wx-timeline-mark-top: 3px;\n\n position: relative;\n padding-left: calc(var(--wx-timeline-axis) + var(--wx-space-16));\n padding-bottom: var(--wx-timeline-gap, var(--wx-space-18));\n}\n\n.wx-timeline-item--sm {\n --wx-timeline-axis: 10px;\n}\n\n.wx-timeline-item--mark {\n --wx-timeline-mark: 24px;\n --wx-timeline-mark-top: 0px;\n}\n\n/* The last entry ends at its content: no trailing stub of line under it. */\n.wx-timeline-item:last-child {\n padding-bottom: 0;\n}\n\n.wx-timeline-item__line {\n position: absolute;\n top: calc(var(--wx-timeline-mark-top) + var(--wx-timeline-mark) + 4px);\n bottom: 0;\n left: calc(var(--wx-timeline-axis) - 0.5px);\n width: 1px;\n background: var(--wx-border-default);\n}\n\n.wx-timeline-item:last-child .wx-timeline-item__line,\n.wx-timeline-item--no-line .wx-timeline-item__line {\n display: none;\n}\n\n.wx-timeline-item__dot {\n position: absolute;\n top: var(--wx-timeline-mark-top);\n left: calc(var(--wx-timeline-axis) - var(--wx-timeline-mark) / 2);\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--wx-timeline-mark);\n height: var(--wx-timeline-mark);\n background: var(--wx-timeline-dot-color, var(--wx-border-strong));\n border-radius: var(--wx-radius-full);\n color: var(--wx-timeline-dot-contrast, var(--wx-text-inverse));\n font-size: 14px;\n}\n\n.wx-timeline-item__dot--hollow {\n background: var(--wx-bg-surface);\n border: 2px solid var(--wx-timeline-dot-color, var(--wx-border-strong));\n color: var(--wx-timeline-dot-color, var(--wx-border-strong));\n}\n\n.wx-timeline-item__dot--default {\n --wx-timeline-dot-color: var(--wx-border-strong);\n --wx-timeline-dot-contrast: var(--wx-text-inverse);\n}\n\n.wx-timeline-item__dot--primary {\n --wx-timeline-dot-color: var(--wx-color-primary);\n --wx-timeline-dot-contrast: var(--wx-color-primary-contrast);\n}\n\n.wx-timeline-item__dot--success {\n --wx-timeline-dot-color: var(--wx-color-success);\n --wx-timeline-dot-contrast: var(--wx-color-success-contrast);\n}\n\n.wx-timeline-item__dot--warning {\n --wx-timeline-dot-color: var(--wx-color-warning);\n --wx-timeline-dot-contrast: var(--wx-color-warning-contrast);\n}\n\n.wx-timeline-item__dot--danger {\n --wx-timeline-dot-color: var(--wx-color-danger);\n --wx-timeline-dot-contrast: var(--wx-color-danger-contrast);\n}\n\n.wx-timeline-item__dot--info {\n --wx-timeline-dot-color: var(--wx-color-info);\n --wx-timeline-dot-contrast: var(--wx-color-info-contrast);\n}\n\n.wx-timeline-item__content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wx-timeline-item__timestamp {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-timeline-item__timestamp--bottom {\n margin-top: var(--wx-space-4);\n}\n\n.wx-timeline-item__title {\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-timeline-item--sm .wx-timeline-item__title {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-timeline-item__body {\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n</style>\n","<script setup lang=\"ts\">\nimport WxDatePicker from '../DatePicker/DatePicker.vue'\nimport type { DatePickerModelValue, DatePickerProps } from '../DatePicker/types'\n\ndefineOptions({ name: 'WxTimePicker' })\n\n/**\n * Every prop defaults to `undefined` on purpose. Vue casts an absent boolean prop\n * to `false`, and this preset forwards its whole prop object — without these the\n * preset would hand `WxDatePicker` an explicit `false` for `is24`, `clearable`,\n * `autoApply` and `teleport`, overriding that component's own defaults. Passing\n * `undefined` lets each default apply as if the prop had never been written.\n */\nwithDefaults(defineProps<Omit<DatePickerProps, 'type'>>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: undefined,\n minDate: undefined,\n maxDate: undefined,\n seconds: undefined,\n minutesIncrement: undefined,\n is24: undefined,\n weekStart: undefined,\n autoApply: undefined,\n textInput: undefined,\n teleport: undefined,\n disabled: undefined,\n readonly: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n</script>\n\n<template>\n <wx-date-picker v-model=\"model\" type=\"time\" v-bind=\"$props\">\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </wx-date-picker>\n</template>\n","import type { App, Component, Plugin } from 'vue'\nimport * as components from './components'\n\nexport interface WebxUiOptions {\n /**\n * Prefix used when registering components globally.\n * Components are declared as `WxButton`, so the default keeps that name.\n */\n prefix?: string\n}\n\n/**\n * Registers every component globally:\n *\n * ```ts\n * import { WebxUI } from '@webx-ui/core'\n * import '@webx-ui/core/style.css'\n *\n * app.use(WebxUI)\n * ```\n *\n * Prefer named imports when bundle size matters — they tree-shake.\n */\nexport const WebxUI: Plugin<[WebxUiOptions?]> = {\n install(app: App, options: WebxUiOptions = {}) {\n const { prefix = 'Wx' } = options\n\n /*\n * The barrel also exports helpers — the icon registry, the countdown formatter —\n * so the `Wx` prefix is what marks a component, and the cast follows that check.\n */\n for (const [name, exported] of Object.entries(components)) {\n if (!name.startsWith('Wx')) continue\n const registeredName = prefix === 'Wx' ? name : `${prefix}${name.slice(2)}`\n app.component(registeredName, exported as Component)\n }\n },\n}\n\nexport default WebxUI\n"],"names":["accordionKey","useAccordion","inject","props","__props","emit","__emit","model","_useModel","provide","computed","watch","value","classes","_createBlock","_unref","AccordionRoot","$event","_renderSlot","_ctx","builtinIcons","customIcons","registerIcons","icons","name","content","resolveIcon","iconNames","keywordSizes","boxSize","size","_createElementBlock","accordion","iconPosition","headingTag","AccordionItem","_createElementVNode","_hoisted_1","_createVNode","AccordionHeader","AccordionTrigger","WxIcon","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","$slots","_openBlock","_hoisted_5","AccordionContent","_hoisted_6","actionsKey","useActions","presets","group","preset","icon","tone","accessibleName","tag","nativeAttrs","onClick","event","_normalizeClass","_resolveDynamicComponent","_mergeProps","$attrs","dropdownKey","useDropdown","open","close","onPanelClick","PopoverRoot","PopoverTrigger","PopoverPortal","PopoverContent","root","ref","row","collapsed","measure","rowEl","parent","style","padding","available","observer","observe","onMounted","onBeforeUnmount","__expose","WxDropdown","WxAction","formContextKey","formItemContextKey","uid","useId","prefix","useFormField","form","item","fallbackId","id","disabled","status","describedBy","checkboxGroupKey","radioGroupKey","provideFormItem","context","field","debounceTimer","picking","cancelSearch","showClear","hasList","onSelect","option","clear","AutocompleteRoot","AutocompleteAnchor","AutocompletePortal","AutocompleteContent","AutocompleteViewport","AutocompleteEmpty","_Fragment","_renderList","AutocompleteItem","_cache","buttonGroupKey","useButtonGroup","type","variant","isDisabled","slots","useSlots","hasHeader","hasSidebar","_hoisted_7","_hoisted_8","activePath","panel","loadedChildren","loadingKeys","keyOf","path","rootOptions","childrenOf","parents","isLeaf","loaded","isLoading","columns","result","index","children","resolvePath","values","level","candidate","findPath","options","found","selectedPath","hasValue","displayLabel","formValue","loadLevel","key","expand","select","onOptionClick","leaf","onOptionHover","optionsIn","focusOption","items","bounded","onPanelKeydown","target","column","current","nextTick","PopoverAnchor","_createTextVNode","inputRef","checked","syncIndeterminate","onChange","next","toggle","WxCheckbox","HEX","text","toWorking","hex","convertToHsb","parseColor","working","colorToHex","areaStyle","getAreaBackgroundStyle","hueStyle","getSliderBackgroundStyle","swatch","commit","onInput","onBlur","onColor","color","onHex","openPicker","_normalizeStyle","ColorAreaRoot","ColorAreaArea","ColorAreaThumb","ColorSliderRoot","ColorSliderTrack","ColorSliderThumb","display","units","formatCountdown","ms","format","remaining","out","token","unit","toTimestamp","parsed","timer","stop","tick","left","start","running","WxStatistic","hasTime","modelType","displayFormat","time","config","timeConfig","inputAttrs","onUpdate","onCleared","_","_withCtx","slotProps","_normalizeProps","_guardReactiveProps","WxDatePicker","$props","_createSlots","cssLength","trimmed","pixelLength","clamp","min","max","usePanelMemory","storageKey","raw","GUTTER","hasTitle","hasHead","scrollsInPlace","movable","sizable","layout","memory","panelVars","vars","width","height","sidebar","dragging","resizing","gesture","begin","kind","element","rect","move","end","startDrag","startResize","dx","dy","top","stopListening","reset","restore","saved","onEscape","onInteractOutside","onViewportPointerDown","DialogRoot","DialogTrigger","DialogPortal","DialogOverlay","DialogContent","DialogTitle","DialogClose","STEP","horizontal","panelOf","currentSize","maxSize","sizeFrom","startSize","delta","store","onHandleKeydown","from","dropdown","defaultImageSize","imageSize","hasMedia","initial","hasMeta","errors","toRef","onSubmit","onReset","baseId","errorId","helpId","labelMode","controlId","registerLabelTarget","messages","hasError","labelWidth","isInline","sizeForLevel","isAttached","visible","markClasses","markStyle","x","y","focused","currentValue","counter","onFocus","precision","decimals","round","factor","canDecrease","canIncrease","stepBy","direction","base","normalize","onWheel","onKeydown","an","Pe","yt","wt","bt","t","e","n","fe","$e","o","Ht","mn","vn","St","bn","yn","Dt","_t","wn","En","Tt","Ke","Sn","Dn","_n","Tn","Ct","Cn","On","Ot","r","ne","In","Ye","ie","An","i","xn","Nn","re","ae","xe","It","Te","Lt","Wt","Gt","S","E","We","Pn","Q","At","V","h","ye","jt","te","P","a","l","u","d","f","m","b","w","xt","ce","we","p","ht","J","Nt","Mn","Fn","Je","Ce","zt","Rn","Ut","Vt","$t","q","Xn","s","Bn","Yn","ge","Ze","Ne","kn","L","G","R","j","Hn","z","c","O","g","T","pe","Be","C","ue","Se","Y","be","Oe","$","se","Zt","Qt","W","Me","ve","Ge","je","de","Z","Qe","et","Pt","Mt","me","Ie","Ae","Fe","ke","H","tt","lt","ze","Ve","Re","Ft","Ln","qt","Kt","Wn","Gn","Jt","he","jn","Zn","nt","He","ee","Ee","vt","rn","Xe","B","$n","Vn","X","K","oe","le","k","v","D","A","qn","I","M","F","Un","st","zn","Jn","Kn","N","De","ut","ct","ot","rt","Ue","_e","Qn","Rt","Le","it","en","pt","gt","eo","to","dt","sn","no","un","kt","tn","nn","Xt","oo","Yt","on","U","qe","mt","ln","ft","ro","lo","cn","Et","fn","dn","hn","pn","useTemplateRef","ownId","cardGroup","boardStyle","isFull","isCollapsed","isLocked","columnById","cardTitle","card","named","nameOf","groupFor","fromIndex","toIndex","via","onCardDrop","fromId","toId","columnOrder","moveColumn","onColumnDrop","grabbed","grabbedColumn","announcement","isGrabbed","isColumnGrabbed","positionOf","refocus","attribute","wanted","elements","onCardKeydown","held","state","origin","run","stepCard","shiftCard","offset","columnIndex","onColumnKeydown","at","VueDraggable","WxBadge","WxEntityCard","_hoisted_10","_hoisted_11","WxButton","_hoisted_12","_hoisted_13","_hoisted_14","linkAttrs","rel","href","attrs","page","perPage","currentPerPage","total","lastPage","currentPage","asked","last","span","numbers","previous","distance","go","setPerPage","_hoisted_9","panelStyle","PopoverClose","PopoverArrow","fallbackName","WxRadio","hovered","interactive","shown","stars","position","fill","valueAt","set","onHover","step","star","richTextIcons","$emit","DEFAULT_TOOLS","DEFAULT_ACCEPT","TOOL_META","TABLE_TOOLS","uploading","fileInput","prompt","editable","readHtml","instance","editor","useEditor","StarterKit","TableKit","Image","Youtube","FileHandler","_editor","files","pos","uploadFiles","html","isEmpty","inTable","insertImage","url","alt","file","error","onImageButton","onFilePicked","input","openPrompt","applyPrompt","toolVisible","tool","visibleTools","isActive","chain","runTableCommand","WxRichTextToolbarButton","_vModelText","EditorContent","searchText","selection","labelOf","selectedOptions","singleLabel","hasSelection","openList","displayValue","onSearch","removeTag","ComboboxRoot","ComboboxAnchor","_withModifiers","ComboboxTrigger","ComboboxPortal","ComboboxContent","ComboboxViewport","ComboboxEmpty","ComboboxItem","ComboboxItemIndicator","pair","marks","label","SliderTrack","SliderRange","SliderThumb","mark","TabsContent","UTILITY_WIDTH","STORAGE_PREFIX","selected","expanded","sort","search","rows","paginator","showPagination","visibleColumns","utilityCount","columnCount","scrollStyle","length","widthOf","colStyle","offsets","map","lefts","right","rights","hasLeftFixed","hasFixed","fixedStyle","pin","fixedClass","utilityStyle","slot","utilityClass","read","part","cellText","canSelect","canExpand","selectableRows","selectableKeys","selectedCount","allSelected","someSelected","rowsFor","keys","announce","toggleAll","toggleRow","isSelected","isExpanded","toggleExpand","onSort","ariaSort","sortState","alignClass","settledSearch","onSearchChanged","term","settle","save","summaryStart","cells","summarySpan","summaryColumns","summaryValue","summaryText","WxInput","_hoisted_16","line","lineIndex","_hoisted_17","_hoisted_18","WxPagination","_hoisted_20","rendered","readTabs","collect","scheduleSelect","nodes","node","Fragment","WxTab","tabProps","tabSlots","selectFirst","tab","selectQueued","scroller","overflowStart","overflowEnd","scrollable","el","revealActive","instant","active","centred","TabsRoot","TabsList","TabsTrigger","highlighted","armed","tags","suggestions","suggestion","showList","full","add","remove","clampLines","textareaRef","autosizeOptions","syncHeight","styles","lineHeight","vertical","timelineKey","useTimeline","timeline","hasMark","dotClasses","WebxUI","app","exported","components","registeredName"],"mappings":"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","x_google_ignoreList":[38]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/composables/useAccordion.ts","../src/components/Accordion/Accordion.vue","../src/components/Icon/icons.ts","../src/components/Icon/Icon.vue","../src/components/AccordionItem/AccordionItem.vue","../src/composables/useActions.ts","../src/components/Action/Action.vue","../src/composables/useDropdown.ts","../src/components/Dropdown/Dropdown.vue","../src/components/Actions/Actions.vue","../src/components/Alert/Alert.vue","../src/components/Aside/Aside.vue","../src/composables/useFormField.ts","../src/composables/useControlAttrs.ts","../src/components/Autocomplete/Autocomplete.vue","../src/components/Badge/Badge.vue","../src/composables/useBreadcrumb.ts","../src/components/Breadcrumb/Breadcrumb.vue","../src/components/BreadcrumbItem/BreadcrumbItem.vue","../src/composables/useButtonGroup.ts","../src/components/Button/Button.vue","../src/components/ButtonGroup/ButtonGroup.vue","../src/components/Card/Card.vue","../src/components/Cascader/Cascader.vue","../src/components/Checkbox/Checkbox.vue","../src/components/CheckboxGroup/CheckboxGroup.vue","../src/components/Col/Col.vue","../src/components/ColorPicker/ColorPicker.vue","../src/components/Container/Container.vue","../src/components/Statistic/Statistic.vue","../src/components/Countdown/format.ts","../src/components/Countdown/Countdown.vue","../src/components/DatePicker/DatePicker.vue","../src/components/DateRangePicker/DateRangePicker.vue","../src/components/DateTimePicker/DateTimePicker.vue","../src/composables/useOverlayPanel.ts","../src/components/Dialog/Dialog.vue","../src/components/Divider/Divider.vue","../src/components/Drawer/Drawer.vue","../src/components/DropdownItem/DropdownItem.vue","../src/components/EntityCard/EntityCard.vue","../src/components/Footer/Footer.vue","../src/components/Form/Form.vue","../src/components/FormItem/FormItem.vue","../src/components/Header/Header.vue","../src/components/Heading/Heading.vue","../src/components/Indicator/Indicator.vue","../src/components/Input/Input.vue","../src/components/InputNumber/InputNumber.vue","../../../node_modules/.pnpm/vue-draggable-plus@0.6.1_@types+sortablejs@1.15.9/node_modules/vue-draggable-plus/dist/vue-draggable-plus.js","../src/components/Kanban/Kanban.vue","../src/components/Link/Link.vue","../src/composables/useElementWidth.ts","../src/components/ListDetail/ListDetail.vue","../src/components/Main/Main.vue","../src/composables/useMenu.ts","../src/components/Submenu/Submenu.vue","../src/components/Menu/nodes.ts","../src/components/Menu/Menu.vue","../src/components/MenuGroup/MenuGroup.vue","../src/components/MenuItem/MenuItem.vue","../src/components/Pagination/Pagination.vue","../src/components/Popover/Popover.vue","../src/components/Prose/Prose.vue","../src/components/Radio/Radio.vue","../src/components/RadioGroup/RadioGroup.vue","../src/components/Rate/Rate.vue","../src/components/RichText/icons.ts","../src/components/RichText/ToolbarButton.vue","../src/components/RichText/tools.ts","../src/components/RichText/RichText.vue","../src/components/Row/Row.vue","../src/components/Scrollbar/Scrollbar.vue","../src/components/Select/Select.vue","../src/components/Slider/Slider.vue","../src/components/Space/Space.vue","../src/components/Switch/Switch.vue","../src/components/Tab/Tab.vue","../src/components/Table/Table.vue","../src/components/Tabs/Tabs.vue","../src/components/TagsInput/TagsInput.vue","../src/components/Text/Text.vue","../src/components/Textarea/Textarea.vue","../src/composables/useTimeline.ts","../src/components/Timeline/Timeline.vue","../src/components/TimelineItem/TimelineItem.vue","../src/components/TimePicker/TimePicker.vue","../src/plugin.ts","../src/composables/useResponsiveShell.ts"],"sourcesContent":["import { inject, type ComputedRef, type InjectionKey } from 'vue'\n\nexport type AccordionSize = 'sm' | 'md'\n\n/** Boxed as one list, each panel its own card, or nothing but rules between them. */\nexport type AccordionVariant = 'bordered' | 'separated' | 'plain'\n\n/** Which side of the header the chevron sits on. */\nexport type AccordionIconPosition = 'start' | 'end'\n\n/** What `WxAccordion` hands down to the items inside it. */\nexport interface AccordionContext {\n size: ComputedRef<AccordionSize>\n variant: ComputedRef<AccordionVariant>\n iconPosition: ComputedRef<AccordionIconPosition>\n /** The element each header is written as, so a page keeps one heading outline. */\n headingTag: ComputedRef<string>\n}\n\nexport const accordionKey: InjectionKey<AccordionContext> = Symbol('wx-accordion')\n\nexport function useAccordion(): AccordionContext | null {\n return inject(accordionKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionKey } from '../../composables/useAccordion'\nimport type { AccordionEmits, AccordionModelValue, AccordionProps } from './types'\n\ndefineOptions({ name: 'WxAccordion' })\n\nconst props = withDefaults(defineProps<AccordionProps>(), {\n multiple: false,\n collapsible: true,\n variant: 'bordered',\n size: 'md',\n iconPosition: 'end',\n headingTag: 'h3',\n disabled: false,\n})\n\nconst emit = defineEmits<AccordionEmits>()\n\ndefineSlots<{\n /** The `WxAccordionItem`s. */\n default?: () => unknown\n}>()\n\n/**\n * One value or a list of them, depending on `multiple` — the same shape Reka uses, and\n * the same shape a backend would store it in.\n */\nconst model = defineModel<AccordionModelValue>({ default: undefined })\n\nprovide(accordionKey, {\n size: computed(() => props.size),\n variant: computed(() => props.variant),\n iconPosition: computed(() => props.iconPosition),\n headingTag: computed(() => props.headingTag),\n})\n\nwatch(model, (value) => emit('change', value))\n\nconst classes = computed(() => [\n 'wx-accordion',\n `wx-accordion--${props.variant}`,\n `wx-accordion--${props.size}`,\n])\n</script>\n\n<template>\n <accordion-root\n v-model=\"model\"\n :class=\"classes\"\n :type=\"multiple ? 'multiple' : 'single'\"\n :collapsible=\"collapsible\"\n :disabled=\"disabled\"\n >\n <slot />\n </accordion-root>\n</template>\n\n<style scoped>\n.wx-accordion {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-accordion--bordered {\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n /* The items square off their own corners; the box rounds what sticks out. */\n overflow: hidden;\n}\n\n/* Each item is its own card, with air between them. */\n.wx-accordion--separated {\n gap: var(--wx-space-8);\n}\n</style>\n","/**\n * The built-in icon set.\n *\n * Every entry is the *inside* of a 24×24 `<svg>` drawn in `currentColor` with a\n * stroke — the wrapper in `Icon.vue` supplies the viewBox, the stroke width and the\n * colour, so an icon inherits the text it sits next to. Shapes that read better\n * filled (dots, pips) set `fill=\"currentColor\" stroke=\"none\"` themselves.\n */\nexport const builtinIcons = {\n // --- actions -------------------------------------------------------------\n check: '<path d=\"m5 13 4.5 4.5L19 7\"/>',\n 'check-circle': '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8.2 12.2 2.6 2.6 5-5.2\"/>',\n close: '<path d=\"M18 6 6 18M6 6l12 12\"/>',\n 'close-circle': '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m9 9 6 6m0-6-6 6\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n edit: '<path d=\"M4 20h4L19.5 8.5a2.83 2.83 0 0 0-4-4L4 16v4Z\"/><path d=\"m14.5 5.5 4 4\"/>',\n trash:\n '<path d=\"M4 7h16M10 7V5.5A1.5 1.5 0 0 1 11.5 4h1A1.5 1.5 0 0 1 14 5.5V7M6.5 7l.8 11.6a2 2 0 0 0 2 1.9h5.4a2 2 0 0 0 2-1.9L17.5 7\"/><path d=\"M10 11v5.5M14 11v5.5\"/>',\n copy: '<rect x=\"8.5\" y=\"8.5\" width=\"11\" height=\"11\" rx=\"2.2\"/><path d=\"M15.5 8.5v-2a2 2 0 0 0-2-2h-7a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h2\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"m16 16 4.5 4.5\"/>',\n filter: '<path d=\"M4 5.5h16l-6.2 7.2v5.1l-3.6 2v-7.1z\"/>',\n refresh:\n '<path d=\"M4 12a8 8 0 0 1 13.7-5.6L20 8.5\"/><path d=\"M20 4.5v4h-4\"/><path d=\"M20 12a8 8 0 0 1-13.7 5.6L4 15.5\"/><path d=\"M4 19.5v-4h4\"/>',\n upload:\n '<path d=\"M12 16V4m0 0-4.5 4.5M12 4l4.5 4.5\"/><path d=\"M4 15v3.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V15\"/>',\n download:\n '<path d=\"M12 4v12m0 0-4.5-4.5M12 16l4.5-4.5\"/><path d=\"M4 15v3.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V15\"/>',\n logout:\n '<path d=\"M14 6V5a1.5 1.5 0 0 0-1.5-1.5h-6A1.5 1.5 0 0 0 5 5v14a1.5 1.5 0 0 0 1.5 1.5h6A1.5 1.5 0 0 0 14 19v-1\"/><path d=\"M10 12h10m0 0-3-3m3 3-3 3\"/>',\n\n // --- direction -----------------------------------------------------------\n 'chevron-down': '<path d=\"m6 9.5 6 6 6-6\"/>',\n 'chevron-up': '<path d=\"m6 14.5 6-6 6 6\"/>',\n 'chevron-left': '<path d=\"m14.5 6-6 6 6 6\"/>',\n 'chevron-right': '<path d=\"m9.5 6 6 6-6 6\"/>',\n 'arrow-up': '<path d=\"M12 20V4m0 0 6 6m-6-6-6 6\"/>',\n 'arrow-down': '<path d=\"M12 4v16m0 0 6-6m-6 6-6-6\"/>',\n 'arrow-left': '<path d=\"M20 12H4m0 0 6-6m-6 6 6 6\"/>',\n 'arrow-right': '<path d=\"M4 12h16m0 0-6-6m6 6-6 6\"/>',\n menu: '<path d=\"M4 7h16M4 12h16M4 17h16\"/>',\n /* The sidebar toggle: a page with a column down its left. */\n sidebar: '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2.5\"/><path d=\"M9.5 4.5v15\"/>',\n 'more-horizontal':\n '<circle cx=\"5.5\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18.5\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n 'more-vertical':\n '<circle cx=\"12\" cy=\"5.5\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"18.5\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n drag: '<circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>',\n\n // --- objects -------------------------------------------------------------\n user: '<circle cx=\"12\" cy=\"8\" r=\"3.75\"/><path d=\"M4.5 20a7.5 7.5 0 0 1 15 0\"/>',\n users:\n '<circle cx=\"9.5\" cy=\"8.5\" r=\"3.4\"/><path d=\"M2.5 20a7 7 0 0 1 14 0\"/><path d=\"M16 5.5a3.4 3.4 0 0 1 0 6.6M17.5 14.2A6.3 6.3 0 0 1 21.5 20\"/>',\n settings:\n '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 4v2.5M12 17.5V20M4 12h2.5M17.5 12H20M6.34 6.34l1.77 1.77M15.89 15.89l1.77 1.77M17.66 6.34l-1.77 1.77M6.34 17.66l1.77-1.77\"/>',\n sliders:\n '<path d=\"M4 7h9M17 7h3M4 17h3M11 17h9\"/><circle cx=\"15\" cy=\"7\" r=\"2\"/><circle cx=\"9\" cy=\"17\" r=\"2\"/>',\n home: '<path d=\"M4 10.5 12 4l8 6.5V19a1.5 1.5 0 0 1-1.5 1.5H15V14H9v6.5H5.5A1.5 1.5 0 0 1 4 19Z\"/>',\n file: '<path d=\"M13.5 3.5H7a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9zm0 0V9H19\"/>',\n folder:\n '<path d=\"M3.5 7a2 2 0 0 1 2-2h3.2a2 2 0 0 1 1.5.7l1.3 1.5h7a2 2 0 0 1 2 2v8.3a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z\"/>',\n image:\n '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2.5\"/><circle cx=\"8.75\" cy=\"9.75\" r=\"1.75\"/><path d=\"m4 17 4.5-4.2a2 2 0 0 1 2.7 0l3 2.8 1.6-1.5a2 2 0 0 1 2.7 0L20 16\"/>',\n calendar:\n '<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2.5\"/><path d=\"M3.5 10h17M8 3.5V7M16 3.5V7\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/>',\n mail: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2.5\"/><path d=\"m4 7.5 6.9 5a2 2 0 0 0 2.2 0l6.9-5\"/>',\n phone:\n '<path d=\"M7 3.5 9.5 4l1.2 3.4-1.9 1.6a11 11 0 0 0 5.2 5.2l1.6-1.9 3.4 1.2.5 2.5a2 2 0 0 1-2 2.3A15.5 15.5 0 0 1 4.7 5.5a2 2 0 0 1 2.3-2Z\"/>',\n bell: '<path d=\"M7 10a5 5 0 0 1 10 0c0 4 1.5 5.5 1.5 5.5h-13S7 14 7 10Z\"/><path d=\"M10.2 18.5a2 2 0 0 0 3.6 0\"/>',\n cart: '<path d=\"M3 4.5h2.2l2.3 10.2a1.6 1.6 0 0 0 1.6 1.3h7.4a1.6 1.6 0 0 0 1.6-1.2L20 8H6\"/><circle cx=\"10\" cy=\"19.5\" r=\"1.5\"/><circle cx=\"17\" cy=\"19.5\" r=\"1.5\"/>',\n tag: '<path d=\"M4 11.2V5.5A1.5 1.5 0 0 1 5.5 4h5.7a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8l-5.2 5.2a2 2 0 0 1-2.8 0l-7-7a2 2 0 0 1-.6-1.4Z\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/>',\n link: '<path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7L11.5 7\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-3 3A4 4 0 0 0 11 18.7L12.5 17\"/>',\n 'external-link':\n '<path d=\"M13.5 4.5H20V11\"/><path d=\"m11 13 9-8.5\"/><path d=\"M19 14.5v4a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 5 18.5v-11A1.5 1.5 0 0 1 6.5 6h4\"/>',\n lock: '<rect x=\"4.5\" y=\"10\" width=\"15\" height=\"10\" rx=\"2.5\"/><path d=\"M8 10V7.8a4 4 0 0 1 8 0V10\"/>',\n unlock:\n '<rect x=\"4.5\" y=\"10\" width=\"15\" height=\"10\" rx=\"2.5\"/><path d=\"M8 10V7.8a4 4 0 0 1 7.6-1.8\"/>',\n grid: '<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.8\"/><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.8\"/>',\n list: '<path d=\"M9 6h11M9 12h11M9 18h11\"/><circle cx=\"5\" cy=\"6\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"12\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"18\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/>',\n eye: '<path d=\"M2.5 12S6.8 5.5 12 5.5 21.5 12 21.5 12 17.2 18.5 12 18.5 2.5 12 2.5 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.75\"/>',\n 'eye-off':\n '<path d=\"M10.2 6a9.9 9.9 0 0 1 1.8-.2c5.2 0 9.5 6.2 9.5 6.2a18 18 0 0 1-3.3 3.8M6.6 7.9A17.8 17.8 0 0 0 2.5 12s4.3 6.5 9.5 6.5a9.4 9.4 0 0 0 3.3-.6\"/><path d=\"m4 4 16 16\"/>',\n star: '<path d=\"m12 4 2.5 5.1 5.6.8-4 4 .9 5.6-5-2.7-5 2.7.9-5.6-4-4 5.6-.8z\"/>',\n heart:\n '<path d=\"M12 19.5S4 15 4 9.8A4.3 4.3 0 0 1 12 7.4 4.3 4.3 0 0 1 20 9.8c0 5.2-8 9.7-8 9.7Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M18.4 5.6 17 7M7 17l-1.4 1.4\"/>',\n moon: '<path d=\"M20 14.5A8.5 8.5 0 0 1 9.5 4a8.5 8.5 0 1 0 10.5 10.5Z\"/>',\n\n // --- status --------------------------------------------------------------\n info: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5\"/><circle cx=\"12\" cy=\"7.75\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n warning:\n '<path d=\"M10.3 4.9a2 2 0 0 1 3.4 0l7 12.1a2 2 0 0 1-1.7 3H5a2 2 0 0 1-1.7-3z\"/><path d=\"M12 9.5v4\"/><circle cx=\"12\" cy=\"16.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n question:\n '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M9.6 9.4a2.5 2.5 0 0 1 4.9.6c0 1.7-2.5 2-2.5 3.5\"/><circle cx=\"12\" cy=\"16.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n loader:\n '<path d=\"M12 3.5v4M12 16.5v4M3.5 12h4M16.5 12h4M6 6l2.8 2.8M15.2 15.2 18 18M18 6l-2.8 2.8M8.8 15.2 6 18\"/>',\n} as const satisfies Record<string, string>\n\n/** Every name the library ships with. */\nexport type BuiltinIconName = keyof typeof builtinIcons\n\nconst customIcons = new Map<string, string>()\n\n/**\n * Adds icons to the set, so `<wx-icon name=\"my-logo\" />` works anywhere in the app.\n *\n * ```ts\n * registerIcons({ 'my-logo': '<path d=\"M4 4h16v16H4z\" />' })\n * ```\n *\n * The markup is injected as-is, so register only icons you author or control —\n * never a string that arrived from a user or an API.\n */\nexport function registerIcons(icons: Record<string, string>): void {\n for (const [name, content] of Object.entries(icons)) customIcons.set(name, content)\n}\n\n/** The markup of an icon, or `undefined` when nothing is registered under that name. */\nexport function resolveIcon(name: string): string | undefined {\n return customIcons.get(name) ?? (builtinIcons as Record<string, string>)[name]\n}\n\n/** Names currently available, built-in plus registered — handy for a docs gallery. */\nexport function iconNames(): string[] {\n return [...new Set([...Object.keys(builtinIcons), ...customIcons.keys()])].sort()\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { resolveIcon } from './icons'\nimport type { IconProps } from './types'\n\ndefineOptions({ name: 'WxIcon' })\n\nconst props = withDefaults(defineProps<IconProps>(), {\n size: undefined,\n strokeWidth: 1.7,\n spin: false,\n label: undefined,\n})\n\nconst keywordSizes: Record<string, string> = {\n sm: 'var(--wx-font-size-sm)',\n md: 'var(--wx-font-size-lg)',\n lg: 'var(--wx-font-size-2xl)',\n}\n\n/**\n * The markup is authored in `icons.ts` or handed to `registerIcons` by the app —\n * both are developer-controlled, which is what makes `v-html` safe here.\n */\nconst content = computed(() => resolveIcon(props.name))\n\n/*\n * The rule cannot tell an icon registry from a request body, so it is switched off\n * for this file rather than left as a warning somebody would eventually \"fix\" by\n * deleting the directive. It is switched off here, in the script, because a comment\n * above the template's root element would make that template a fragment.\n */\n/* eslint-disable vue/no-v-html */\n\nconst boxSize = computed(() => {\n const { size } = props\n if (size === undefined) return '1em'\n if (typeof size === 'number') return `${size}px`\n return keywordSizes[size] ?? size\n})\n\nconst classes = computed(() => ['wx-icon', { 'wx-icon--spin': props.spin }])\n</script>\n\n<template>\n <svg\n v-if=\"content\"\n :class=\"classes\"\n :style=\"{ '--wx-icon-size': boxSize }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"content\"\n />\n</template>\n\n<style scoped>\n.wx-icon {\n display: inline-block;\n flex: 0 0 auto;\n width: var(--wx-icon-size, 1em);\n height: var(--wx-icon-size, 1em);\n /* Sits on the text baseline rather than hanging below it. */\n vertical-align: -0.125em;\n overflow: visible;\n}\n\n/*\n * A turn a second. The duration tokens size transitions, not loops: even the slow one\n * is 320ms, which spins an icon three times a second and reads as a blur.\n */\n.wx-icon--spin {\n animation: wx-icon-spin var(--wx-icon-spin-duration, 1s) linear infinite;\n}\n\n@keyframes wx-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-icon--spin {\n animation-duration: 2s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger } from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useAccordion } from '../../composables/useAccordion'\nimport type { AccordionItemProps } from './types'\n\ndefineOptions({ name: 'WxAccordionItem' })\n\nconst props = withDefaults(defineProps<AccordionItemProps>(), {\n title: undefined,\n subtitle: undefined,\n icon: undefined,\n disabled: false,\n})\n\ndefineSlots<{\n /** The panel. */\n default?: () => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /**\n * Sits at the end of the header, outside the button — so a switch or a menu there\n * can be operated without opening the item.\n */\n extra?: () => unknown\n}>()\n\nconst accordion = useAccordion()\n\nconst size = computed(() => accordion?.size.value ?? 'md')\nconst iconPosition = computed(() => accordion?.iconPosition.value ?? 'end')\nconst headingTag = computed(() => accordion?.headingTag.value ?? 'h3')\n\nconst classes = computed(() => [\n 'wx-accordion-item',\n `wx-accordion-item--${accordion?.variant.value ?? 'bordered'}`,\n `wx-accordion-item--${size.value}`,\n `wx-accordion-item--chevron-${iconPosition.value}`,\n // Everything standing before the title moves the panel text under it as well.\n { 'wx-accordion-item--icon': Boolean(props.icon) },\n])\n</script>\n\n<template>\n <accordion-item :class=\"classes\" :value=\"value\" :disabled=\"disabled\">\n <!--\n The heading holds the button and nothing else, which is what a screen reader\n reads out when it walks the headings of a page. Whatever the `extra` slot carries\n — a switch, a menu — sits beside the heading rather than inside it.\n -->\n <div class=\"wx-accordion-item__row\">\n <accordion-header class=\"wx-accordion-item__header\" :as=\"headingTag\">\n <accordion-trigger class=\"wx-accordion-item__trigger\">\n <wx-icon class=\"wx-accordion-item__chevron\" name=\"chevron-down\" />\n\n <wx-icon v-if=\"icon\" class=\"wx-accordion-item__icon\" :name=\"icon\" />\n\n <span class=\"wx-accordion-item__titles\">\n <span class=\"wx-accordion-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <span v-if=\"subtitle\" class=\"wx-accordion-item__subtitle\">{{ subtitle }}</span>\n </span>\n </accordion-trigger>\n </accordion-header>\n\n <span v-if=\"$slots.extra\" class=\"wx-accordion-item__extra\">\n <slot name=\"extra\" />\n </span>\n </div>\n\n <accordion-content class=\"wx-accordion-item__content\">\n <div class=\"wx-accordion-item__body\">\n <slot />\n </div>\n </accordion-content>\n </accordion-item>\n</template>\n\n<style scoped>\n.wx-accordion-item {\n --wx-accordion-padding-x: var(--wx-space-16);\n --wx-accordion-padding-y: var(--wx-space-14);\n /* Air between the header and what it opened — see the body's padding. */\n --wx-accordion-gap: var(--wx-space-8);\n /* One mark — the chevron, or the icon — plus the gap after it. */\n --wx-accordion-mark: calc(var(--wx-font-size-lg) + var(--wx-space-10));\n --wx-accordion-chevron-indent: 0px;\n --wx-accordion-icon-indent: 0px;\n\n min-width: 0;\n}\n\n/* The panel text lines up with the title, not with whatever stands to its left. */\n.wx-accordion-item--chevron-start {\n --wx-accordion-chevron-indent: var(--wx-accordion-mark);\n}\n\n.wx-accordion-item--icon {\n --wx-accordion-icon-indent: var(--wx-accordion-mark);\n}\n\n.wx-accordion-item--sm {\n --wx-accordion-padding-x: var(--wx-space-12);\n --wx-accordion-padding-y: var(--wx-space-8);\n --wx-accordion-gap: var(--wx-space-4);\n}\n\n/* Inside one box the items are told apart by a rule, not by a border each. */\n.wx-accordion-item--bordered + .wx-accordion-item--bordered,\n.wx-accordion-item--plain + .wx-accordion-item--plain {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-accordion-item--separated {\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n overflow: hidden;\n}\n\n.wx-accordion-item__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n transition: background var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__header {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n font-size: inherit;\n font-weight: inherit;\n}\n\n.wx-accordion-item__trigger {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n gap: var(--wx-space-10);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding: var(--wx-accordion-padding-y) var(--wx-accordion-padding-x);\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n/*\n * The tint belongs to the row, not to the button: the `extra` slot sits beside the\n * button, and a highlight that stopped at its edge left a seam down the header. It is\n * still the button that is being hovered — pointing at a switch in the `extra` must not\n * suggest that the section is about to open.\n */\n.wx-accordion-item__row:has(.wx-accordion-item__trigger:hover:not(:disabled)) {\n background: var(--wx-bg-subtle);\n}\n\n.wx-accordion-item__trigger:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-accordion-item__trigger:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/* The chevron is written first and moved by order, so the button's text order holds. */\n.wx-accordion-item--chevron-end .wx-accordion-item__chevron {\n order: 2;\n margin-left: auto;\n}\n\n.wx-accordion-item__chevron {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n transition: transform var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__trigger[data-state='open'] .wx-accordion-item__chevron {\n transform: rotate(180deg);\n}\n\n.wx-accordion-item__icon {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-accordion-item__titles {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wx-accordion-item__title {\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-accordion-item--sm .wx-accordion-item__title {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-accordion-item__subtitle {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n font-weight: var(--wx-font-weight-regular);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-accordion-item__extra {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n padding-right: var(--wx-accordion-padding-x);\n}\n\n/*\n * Reka measures the panel and publishes the height as a custom property, which is what\n * makes an animation from nothing to \"however tall this turns out to be\" possible.\n * The padding lives on the body inside, so the height being animated is only content.\n */\n.wx-accordion-item__content {\n overflow: hidden;\n}\n\n.wx-accordion-item__content[data-state='open'] {\n animation: wx-accordion-open var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-accordion-item__content[data-state='closed'] {\n animation: wx-accordion-close var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n/*\n * The header's own padding ends at the edge of the row it highlights, so without this\n * the panel starts flush against that edge and the two read as one block. The gap is\n * the panel's, and it is measured into the height that is animated.\n */\n.wx-accordion-item__body {\n padding-top: var(--wx-accordion-gap);\n padding-right: var(--wx-accordion-padding-x);\n padding-bottom: var(--wx-accordion-padding-y);\n padding-left: calc(\n var(--wx-accordion-padding-x) + var(--wx-accordion-chevron-indent) +\n var(--wx-accordion-icon-indent)\n );\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n@keyframes wx-accordion-open {\n from {\n height: 0;\n }\n\n to {\n height: var(--reka-accordion-content-height);\n }\n}\n\n@keyframes wx-accordion-close {\n from {\n height: var(--reka-accordion-content-height);\n }\n\n to {\n height: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-accordion-item__content[data-state='open'],\n .wx-accordion-item__content[data-state='closed'] {\n animation: none;\n }\n\n .wx-accordion-item__chevron,\n .wx-accordion-item__row {\n transition: none;\n }\n}\n\n/* A header is a tap target; on a touch screen it needs the height of one. */\n@media (pointer: coarse) {\n .wx-accordion-item__trigger {\n min-height: 48px;\n }\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\nimport type { ActionSize } from '../components/Action/types'\n\n/** What a `WxActions` row hands down to the actions inside it. */\nexport interface ActionsContext {\n size: ComputedRef<ActionSize | undefined>\n}\n\nexport const actionsKey: InjectionKey<ActionsContext> = Symbol('wx-actions')\n\nexport function useActions(): ActionsContext | null {\n return inject(actionsKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useActions } from '../../composables/useActions'\nimport type { ActionEmits, ActionProps, ActionTone, ActionType } from './types'\nimport type { IconName } from '../Icon/types'\n\ndefineOptions({ name: 'WxAction', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ActionProps>(), {\n type: 'edit',\n icon: undefined,\n tone: undefined,\n title: undefined,\n label: undefined,\n href: undefined,\n target: undefined,\n as: undefined,\n disabled: false,\n hidden: false,\n size: undefined,\n})\n\nconst emit = defineEmits<ActionEmits>()\n\n/** Icon, colour and English fallback name for each kind of action. */\nconst presets: Record<ActionType, { icon: IconName; tone: ActionTone; label: string }> = {\n add: { icon: 'plus', tone: 'primary', label: 'Add' },\n edit: { icon: 'edit', tone: 'primary', label: 'Edit' },\n remove: { icon: 'trash', tone: 'danger', label: 'Delete' },\n copy: { icon: 'copy', tone: 'primary', label: 'Copy' },\n link: { icon: 'link', tone: 'primary', label: 'Link' },\n goto: { icon: 'external-link', tone: 'primary', label: 'Open' },\n details: { icon: 'info', tone: 'primary', label: 'Details' },\n view: { icon: 'eye', tone: 'primary', label: 'View' },\n hide: { icon: 'eye-off', tone: 'neutral', label: 'Hide' },\n upload: { icon: 'upload', tone: 'primary', label: 'Upload' },\n download: { icon: 'download', tone: 'primary', label: 'Download' },\n sort: { icon: 'drag', tone: 'neutral', label: 'Reorder' },\n search: { icon: 'search', tone: 'primary', label: 'Search' },\n restore: { icon: 'refresh', tone: 'success', label: 'Restore' },\n settings: { icon: 'settings', tone: 'neutral', label: 'Settings' },\n send: { icon: 'mail', tone: 'primary', label: 'Send' },\n more: { icon: 'more-horizontal', tone: 'neutral', label: 'More' },\n}\n\nconst group = useActions()\n\nconst preset = computed(() => presets[props.type] ?? presets.edit)\nconst icon = computed(() => props.icon ?? preset.value.icon)\nconst tone = computed(() => props.tone ?? preset.value.tone)\nconst size = computed(() => props.size ?? group?.size.value ?? 'md')\nconst accessibleName = computed(() => props.label ?? props.title ?? preset.value.label)\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n\nconst nativeAttrs = computed(() => {\n if (props.href) {\n return {\n href: props.disabled ? undefined : props.href,\n target: props.target,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n tabindex: props.disabled ? -1 : undefined,\n }\n }\n if (props.as) return { 'aria-disabled': props.disabled ? 'true' : undefined }\n return { type: 'button' as const, disabled: props.disabled }\n})\n\nconst classes = computed(() => [\n 'wx-action',\n `wx-action--${size.value}`,\n `wx-action--${tone.value}`,\n { 'is-disabled': props.disabled },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <span\n v-if=\"hidden\"\n class=\"wx-action wx-action--placeholder\"\n :class=\"`wx-action--${size}`\"\n aria-hidden=\"true\"\n />\n\n <component\n :is=\"tag\"\n v-else\n v-bind=\"{ ...nativeAttrs, ...$attrs }\"\n :class=\"classes\"\n :title=\"title\"\n :aria-label=\"accessibleName\"\n @click=\"onClick\"\n >\n <slot>\n <wx-icon :name=\"icon\" />\n </slot>\n </component>\n</template>\n\n<style scoped>\n.wx-action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-action-size, 36px);\n height: var(--wx-action-size, 36px);\n padding: 0;\n background: var(--wx-action-bg, var(--wx-bg-fill));\n border: 1px solid transparent;\n border-radius: var(--wx-radius-control);\n color: var(--wx-action-color, var(--wx-color-primary));\n font-size: var(--wx-action-icon, 18px);\n line-height: 1;\n text-decoration: none;\n cursor: pointer;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-action:hover:not(.is-disabled) {\n background: var(--wx-bg-fill-hover);\n}\n\n.wx-action:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-action.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/* An empty square: no background, no pointer, just the space. */\n.wx-action--placeholder {\n background: transparent;\n cursor: default;\n pointer-events: none;\n}\n\n/* sizes */\n.wx-action--sm {\n --wx-action-size: 30px;\n --wx-action-icon: 16px;\n}\n\n.wx-action--md {\n --wx-action-size: 36px;\n --wx-action-icon: 18px;\n}\n\n.wx-action--lg {\n --wx-action-size: 42px;\n --wx-action-icon: 20px;\n}\n\n/* tones */\n.wx-action--primary {\n --wx-action-color: var(--wx-color-primary);\n}\n\n.wx-action--danger {\n --wx-action-color: var(--wx-color-danger);\n}\n\n.wx-action--success {\n --wx-action-color: var(--wx-color-success-active);\n}\n\n.wx-action--warning {\n --wx-action-color: var(--wx-color-warning-active);\n}\n\n.wx-action--neutral {\n --wx-action-color: var(--wx-text-muted);\n}\n</style>\n","import { inject, type InjectionKey } from 'vue'\n\n/** What a `WxDropdown` hands down, so an item inside it can close the panel. */\nexport interface DropdownContext {\n close: () => void\n /** Whether a click on an item closes the panel — the dropdown's `closeOnClick`. */\n closeOnSelect: () => boolean\n}\n\nexport const dropdownKey: InjectionKey<DropdownContext> = Symbol('wx-dropdown')\n\nexport function useDropdown(): DropdownContext | null {\n return inject(dropdownKey, null)\n}\n","<script setup lang=\"ts\">\nimport { provide, watch } from 'vue'\nimport { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\nimport { dropdownKey } from '../../composables/useDropdown'\nimport type { DropdownEmits, DropdownProps } from './types'\n\ndefineOptions({ name: 'WxDropdown', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DropdownProps>(), {\n side: 'bottom',\n align: 'start',\n offset: 6,\n alignOffset: 0,\n closeOnClick: true,\n matchTriggerWidth: false,\n teleport: true,\n modal: false,\n disabled: false,\n})\n\nconst emit = defineEmits<DropdownEmits>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nfunction close() {\n open.value = false\n}\n\nprovide(dropdownKey, { close, closeOnSelect: () => props.closeOnClick })\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\n/**\n * A click anywhere in the panel closes it, the way a menu behaves. Items that run\n * their own logic still close through the same path, and a panel that should stay\n * open while it is worked in turns this off with `:close-on-click=\"false\"`.\n */\nfunction onPanelClick() {\n if (props.closeOnClick) close()\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child` rather than a button of our own: the trigger is nearly always a\n control that is already a button — WxButton, WxAction — and nesting one button\n inside another is invalid HTML. The slot must hold exactly one element.\n -->\n <popover-trigger as-child :disabled=\"disabled\">\n <slot name=\"trigger\" :open=\"open\" />\n </popover-trigger>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content\n v-bind=\"$attrs\"\n class=\"wx-dropdown\"\n :class=\"{ 'wx-dropdown--match-width': matchTriggerWidth }\"\n :side=\"side\"\n :align=\"align\"\n :side-offset=\"offset\"\n :align-offset=\"alignOffset\"\n @click=\"onPanelClick\"\n >\n <slot :close=\"close\" />\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-dropdown {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 160px;\n max-width: min(90vw, 320px);\n padding: var(--wx-space-6);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-dropdown:focus-visible {\n outline: none;\n}\n\n.wx-dropdown--match-width {\n min-width: var(--reka-popover-trigger-width);\n}\n\n/* A rule between groups of items. */\n.wx-dropdown hr,\n.wx-dropdown .wx-dropdown__divider {\n height: 0;\n margin: var(--wx-space-4) 0;\n border: none;\n border-top: 1px solid var(--wx-border-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, provide, ref, watch } from 'vue'\nimport WxAction from '../Action/Action.vue'\nimport WxDropdown from '../Dropdown/Dropdown.vue'\nimport { actionsKey } from '../../composables/useActions'\nimport type { ActionsEmits, ActionsProps } from './types'\n\ndefineOptions({ name: 'WxActions' })\n\nconst props = withDefaults(defineProps<ActionsProps>(), {\n align: 'start',\n size: undefined,\n collapse: false,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<ActionsEmits>()\n\nprovide(actionsKey, { size: computed(() => props.size) })\n\nconst root = ref<HTMLElement | null>(null)\nconst row = ref<HTMLElement | null>(null)\nconst collapsed = ref(false)\n\n/**\n * The row is measured against the space its container gives it. When it collapses\n * the row is not unmounted, only taken out of the flow — it keeps its natural width,\n * which is the only way to know when there is room for it again.\n */\nfunction measure() {\n const rowEl = row.value\n const parent = root.value?.parentElement\n if (!props.collapse || !rowEl || !parent) return\n\n /* `|| 0`: a padding that was never set reads as an empty string, not as `0px`. */\n const style = getComputedStyle(parent)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n const available = parent.clientWidth - padding\n\n /* jsdom and a container that has not been laid out yet both report zero. */\n if (available <= 0) return\n\n collapsed.value = rowEl.scrollWidth > available\n}\n\nlet observer: ResizeObserver | undefined\n\nfunction observe() {\n observer?.disconnect()\n if (!props.collapse) return\n\n observer = new ResizeObserver(() => measure())\n if (root.value?.parentElement) observer.observe(root.value.parentElement)\n if (row.value) observer.observe(row.value)\n measure()\n}\n\nonMounted(observe)\nwatch(() => props.collapse, observe)\nwatch(collapsed, (value) => emit('collapse', value))\nonBeforeUnmount(() => observer?.disconnect())\n\nconst classes = computed(() => [\n 'wx-actions',\n `wx-actions--${props.align}`,\n { 'is-collapsed': collapsed.value },\n])\n\ndefineExpose({ collapsed, measure })\n</script>\n\n<template>\n <div ref=\"root\" :class=\"classes\" role=\"group\" :aria-label=\"ariaLabel\">\n <div ref=\"row\" class=\"wx-actions__row\">\n <slot />\n </div>\n\n <!-- The dropdown teleports its panel, so the class that hides it lives on a wrapper. -->\n <span v-if=\"collapse\" class=\"wx-actions__menu\">\n <wx-dropdown align=\"end\">\n <template #trigger>\n <slot name=\"trigger\">\n <wx-action type=\"more\" :size=\"size\" />\n </slot>\n </template>\n\n <!-- Falls back to the row itself, so a plain list of actions needs no second copy. -->\n <slot name=\"collapsed\">\n <slot />\n </slot>\n </wx-dropdown>\n </span>\n </div>\n</template>\n\n<style scoped>\n.wx-actions {\n display: flex;\n align-items: center;\n /* The row is taken out of the flow when collapsed, so it anchors here. */\n position: relative;\n}\n\n.wx-actions--start {\n justify-content: flex-start;\n}\n\n.wx-actions--center {\n justify-content: center;\n}\n\n.wx-actions--end {\n justify-content: flex-end;\n}\n\n.wx-actions__row {\n display: flex;\n align-items: center;\n gap: var(--wx-actions-gap, var(--wx-space-6));\n}\n\n/* Hidden, but still measurable: that is what lets the row come back. */\n.wx-actions.is-collapsed .wx-actions__row {\n position: absolute;\n z-index: -1;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.wx-actions:not(.is-collapsed) .wx-actions__menu {\n display: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { AlertEmits, AlertProps } from './types'\nimport type { IconName } from '../Icon/types'\n\ndefineOptions({ name: 'WxAlert' })\n\nconst props = withDefaults(defineProps<AlertProps>(), {\n type: 'info',\n variant: 'soft',\n title: undefined,\n description: undefined,\n icon: undefined,\n closable: false,\n closeLabel: 'Dismiss',\n live: false,\n})\n\nconst emit = defineEmits<AlertEmits>()\n\n/**\n * Kept as a model so `<wx-alert closable />` dismisses itself, while a page that\n * needs the alert back — a validation summary, say — binds `v-model:visible`.\n */\nconst visible = defineModel<boolean>('visible', { default: true })\n\nconst typeIcons: Record<string, IconName> = {\n info: 'info',\n success: 'check-circle',\n warning: 'warning',\n danger: 'close-circle',\n}\n\nconst iconName = computed(() => {\n if (props.icon === false) return undefined\n return props.icon ?? typeIcons[props.type]\n})\n\nconst classes = computed(() => [\n 'wx-alert',\n `wx-alert--${props.type}`,\n `wx-alert--${props.variant}`,\n { 'wx-alert--titled': Boolean(props.title) },\n])\n\nfunction onClose(event: MouseEvent) {\n visible.value = false\n emit('close', event)\n}\n</script>\n\n<template>\n <div v-if=\"visible\" :class=\"classes\" :role=\"live ? 'alert' : undefined\">\n <span v-if=\"iconName || $slots.icon\" class=\"wx-alert__icon\">\n <slot name=\"icon\">\n <wx-icon v-if=\"iconName\" :name=\"iconName\" size=\"1.15em\" />\n </slot>\n </span>\n\n <div class=\"wx-alert__content\">\n <p v-if=\"title || $slots.title\" class=\"wx-alert__title\">\n <slot name=\"title\">{{ title }}</slot>\n </p>\n <div v-if=\"description || $slots.default\" class=\"wx-alert__body\">\n <slot>{{ description }}</slot>\n </div>\n </div>\n\n <div v-if=\"$slots.actions\" class=\"wx-alert__actions\">\n <slot name=\"actions\" />\n </div>\n\n <button\n v-if=\"closable\"\n class=\"wx-alert__close\"\n type=\"button\"\n :aria-label=\"closeLabel\"\n @click=\"onClose\"\n >\n <wx-icon name=\"close\" />\n </button>\n </div>\n</template>\n\n<style scoped>\n.wx-alert {\n display: flex;\n align-items: flex-start;\n gap: var(--wx-space-10);\n box-sizing: border-box;\n padding: var(--wx-space-12) var(--wx-space-14);\n border: 1px solid transparent;\n border-radius: var(--wx-radius-sm);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n/* Each type names its colours once; the variants below stay type-agnostic. */\n.wx-alert--info {\n --wx-alert-accent: var(--wx-color-info-active);\n --wx-alert-soft: var(--wx-color-info-soft);\n --wx-alert-solid: var(--wx-color-info);\n --wx-alert-contrast: var(--wx-color-info-contrast);\n}\n\n.wx-alert--success {\n --wx-alert-accent: var(--wx-color-success-active);\n --wx-alert-soft: var(--wx-color-success-soft);\n --wx-alert-solid: var(--wx-color-success);\n --wx-alert-contrast: var(--wx-color-success-contrast);\n}\n\n.wx-alert--warning {\n --wx-alert-accent: var(--wx-color-warning-active);\n --wx-alert-soft: var(--wx-color-warning-soft);\n --wx-alert-solid: var(--wx-color-warning);\n --wx-alert-contrast: var(--wx-color-warning-contrast);\n}\n\n.wx-alert--danger {\n --wx-alert-accent: var(--wx-color-danger);\n --wx-alert-soft: var(--wx-color-danger-soft);\n --wx-alert-solid: var(--wx-color-danger);\n --wx-alert-contrast: var(--wx-color-danger-contrast);\n}\n\n/* variants */\n.wx-alert--soft {\n background: var(--wx-alert-soft);\n color: var(--wx-text-default);\n}\n\n.wx-alert--outline {\n background: var(--wx-bg-surface);\n border-color: var(--wx-alert-accent);\n color: var(--wx-text-default);\n}\n\n.wx-alert--solid {\n background: var(--wx-alert-solid);\n color: var(--wx-alert-contrast);\n}\n\n/* The icon carries the colour in the quiet variants; in `solid` everything already has it. */\n.wx-alert--soft .wx-alert__icon,\n.wx-alert--outline .wx-alert__icon {\n color: var(--wx-alert-accent);\n}\n\n.wx-alert__icon {\n display: inline-flex;\n flex: 0 0 auto;\n /* Lines the icon up with the first line of text rather than the box. */\n padding-top: 0.1em;\n}\n\n.wx-alert__content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.wx-alert__title {\n margin: 0;\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-alert--titled .wx-alert__body {\n margin-top: var(--wx-space-4);\n}\n\n.wx-alert--soft .wx-alert__body,\n.wx-alert--outline .wx-alert__body {\n color: var(--wx-text-muted);\n}\n\n.wx-alert__body :deep(p) {\n margin: 0;\n}\n\n.wx-alert__body :deep(p + p) {\n margin-top: var(--wx-space-8);\n}\n\n.wx-alert__actions {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n flex: 0 0 auto;\n}\n\n.wx-alert__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: inherit;\n font-size: var(--wx-font-size-lg);\n line-height: 1;\n opacity: 0.65;\n cursor: pointer;\n}\n\n.wx-alert__close:hover {\n opacity: 1;\n}\n\n.wx-alert__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* A stack of alerts on a narrow screen reads better with the actions on their own line. */\n@media (max-width: 480px) {\n .wx-alert {\n flex-wrap: wrap;\n }\n\n .wx-alert__actions {\n width: 100%;\n padding-left: calc(1.15em + var(--wx-space-10));\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { AsideProps } from './types'\n\ndefineOptions({ name: 'WxAside' })\n\nconst props = withDefaults(defineProps<AsideProps>(), {\n width: undefined,\n collapsedWidth: undefined,\n collapsed: false,\n side: 'start',\n bordered: true,\n scroll: false,\n})\n\nfunction toLength(value: number | string | undefined) {\n if (value === undefined) return undefined\n return typeof value === 'number' ? `${value}px` : value\n}\n\nconst style = computed(() => {\n const vars: Record<string, string> = {}\n const width = toLength(props.width)\n const collapsedWidth = toLength(props.collapsedWidth)\n if (width) vars['--wx-aside-width'] = width\n if (collapsedWidth) vars['--wx-aside-collapsed-width'] = collapsedWidth\n return vars\n})\n\nconst classes = computed(() => [\n 'wx-aside',\n `wx-aside--${props.side}`,\n {\n 'wx-aside--bordered': props.bordered,\n 'wx-aside--collapsed': props.collapsed,\n 'wx-aside--scroll': props.scroll,\n },\n])\n</script>\n\n<template>\n <aside :class=\"classes\" :style=\"style\">\n <slot />\n </aside>\n</template>\n\n<style scoped>\n.wx-aside {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n /* Fixed width, and it never shrinks when the main column is crowded. */\n flex: 0 0 var(--wx-aside-width, 240px);\n width: var(--wx-aside-width, 240px);\n min-height: 0;\n background: var(--wx-bg-surface);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n transition: flex-basis var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n/*\n * The rail is one icon wide plus the air around it — 56px, not the 64 it started\n * at, which left the icons floating in a column of their own.\n */\n.wx-aside--collapsed {\n flex-basis: var(--wx-aside-collapsed-width, 56px);\n width: var(--wx-aside-collapsed-width, 56px);\n}\n\n.wx-aside--bordered.wx-aside--start {\n border-right: 1px solid var(--wx-border-default);\n}\n\n.wx-aside--bordered.wx-aside--end {\n border-left: 1px solid var(--wx-border-default);\n}\n\n/*\n * A sidebar that scrolls on its own sticks to the viewport, so a long menu can be\n * reached while a long page scrolls behind it.\n *\n * `max-height` rather than `height`: the column has to answer to both shapes it is\n * used in. Under a header in a shell that fills the screen it is already the height\n * of its row, and a hard `100dvh` there is a header taller than the window — the\n * whole layout then overflows by exactly the header. On a page that scrolls, the row\n * is as tall as the content, and the cap is what keeps the sticky column in view.\n */\n.wx-aside--scroll {\n position: sticky;\n top: 0;\n max-height: 100dvh;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-aside {\n transition: none;\n }\n}\n</style>\n","import { computed, inject, provide, type ComputedRef, type InjectionKey, type Ref } from 'vue'\n\nexport type ControlSize = 'sm' | 'md' | 'lg'\nexport type ControlStatus = 'default' | 'success' | 'warning' | 'error'\n\n/** Field name -> messages, the shape Laravel returns on a 422. */\nexport type ValidationErrors = Record<string, string[]>\n\nexport interface FormContext {\n /** Server-side errors, keyed by field name. */\n errors: Ref<ValidationErrors>\n disabled: Ref<boolean>\n size: Ref<ControlSize>\n labelPosition: Ref<'top' | 'left'>\n labelWidth: Ref<string | undefined>\n}\n\nexport interface FormItemContext {\n /** Id given to the control, so the label's `for` matches. */\n id: ComputedRef<string>\n /** Ids of the help and error nodes, for `aria-describedby`. */\n describedBy: ComputedRef<string | undefined>\n status: ComputedRef<ControlStatus>\n disabled: ComputedRef<boolean>\n size: ComputedRef<ControlSize | undefined>\n /** Set by grouped controls so the label points at the group, not one input. */\n registerLabelTarget: (id: string | undefined) => void\n}\n\nexport const formContextKey: InjectionKey<FormContext> = Symbol('wx-form')\nexport const formItemContextKey: InjectionKey<FormItemContext> = Symbol('wx-form-item')\n\nlet uid = 0\nexport function useId(prefix = 'wx'): string {\n uid += 1\n return `${prefix}-${uid}`\n}\n\nexport interface FormFieldProps {\n disabled?: boolean\n size?: ControlSize\n status?: ControlStatus\n id?: string\n}\n\n/**\n * Resolves what a control should render as, given its own props, the enclosing\n * `WxFormItem` and the enclosing `WxForm`. The control's own prop always wins;\n * `WxFormItem` beats `WxForm`.\n */\nexport function useFormField(props: FormFieldProps) {\n const form = inject(formContextKey, null)\n const item = inject(formItemContextKey, null)\n const fallbackId = useId('wx-control')\n\n const id = computed(() => props.id ?? item?.id.value ?? fallbackId)\n\n const disabled = computed(\n () => props.disabled || item?.disabled.value || form?.disabled.value || false,\n )\n\n const size = computed<ControlSize>(\n () => props.size ?? item?.size.value ?? form?.size.value ?? 'md',\n )\n\n const status = computed<ControlStatus>(() => {\n if (props.status && props.status !== 'default') return props.status\n return item?.status.value ?? 'default'\n })\n\n const describedBy = computed(() => item?.describedBy.value)\n\n return { id, disabled, size, status, describedBy, form, item }\n}\n\n/**\n * What a checkbox, radio or switch may carry. Deliberately narrower than `unknown`:\n * a `v-model` that hands back `unknown` is useless to the caller, and object values\n * would need identity comparison rather than `===`.\n */\nexport type ChoiceValue = string | number | boolean | null\n\n/** Used by `WxCheckboxGroup` / `WxRadioGroup` to share state with their children. */\nexport interface ChoiceGroupContext<T> {\n name: ComputedRef<string | undefined>\n modelValue: Ref<T>\n disabled: ComputedRef<boolean>\n size: ComputedRef<ControlSize>\n toggle: (value: ChoiceValue, checked: boolean) => void\n}\n\nexport const checkboxGroupKey: InjectionKey<ChoiceGroupContext<ChoiceValue[]>> =\n Symbol('wx-checkbox-group')\nexport const radioGroupKey: InjectionKey<ChoiceGroupContext<ChoiceValue | undefined>> =\n Symbol('wx-radio-group')\n\nexport function provideFormItem(context: FormItemContext): void {\n provide(formItemContextKey, context)\n}\n","import { computed, useAttrs, type ComputedRef } from 'vue'\n\n/**\n * Splits what the caller wrote on a control between its two halves.\n *\n * Every control here sets `inheritAttrs: false` and hands `$attrs` to the element\n * inside it, so that `placeholder`, `autocomplete`, `data-*` and the ARIA attributes\n * reach the real `<input>` rather than the wrapper around it. Taken literally that\n * sends `class` and `style` there too, and both are then in the wrong place:\n *\n * - The caller means the control, not its input. `class=\"w-60\"` on a `<wx-select>` is\n * asking for a narrower select, and the select is the wrapper.\n * - A parent's scoped CSS cannot reach it. Scoped styles carry an attribute that is\n * stamped on a child component's *root*, so a class that lands three elements deep\n * matches nothing — silently.\n * - And where `$attrs` is bound to an element that is only sometimes rendered — the\n * search field of a filterable `WxSelect` — the class disappears altogether.\n *\n * So `class` and `style` go on the root, and everything else goes on the control.\n *\n * ```ts\n * const { rootAttrs, controlAttrs } = useControlAttrs()\n * ```\n * ```vue\n * <div :class=\"classes\" v-bind=\"rootAttrs\">\n * <input v-bind=\"controlAttrs\" />\n * </div>\n * ```\n */\nexport interface ControlAttrs {\n /** `class` and `style` — for the wrapper the caller can see. */\n rootAttrs: ComputedRef<Record<string, unknown>>\n /** Everything else — for the element the browser focuses and reads out. */\n controlAttrs: ComputedRef<Record<string, unknown>>\n}\n\nexport function useControlAttrs(): ControlAttrs {\n const attrs = useAttrs()\n\n const rootAttrs = computed(() => {\n const picked: Record<string, unknown> = {}\n if (attrs.class !== undefined) picked.class = attrs.class\n if (attrs.style !== undefined) picked.style = attrs.style\n return picked\n })\n\n const controlAttrs = computed(() => {\n const rest: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(attrs)) {\n if (key !== 'class' && key !== 'style') rest[key] = value\n }\n return rest\n })\n\n return { rootAttrs, controlAttrs }\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport {\n AutocompleteAnchor,\n AutocompleteContent,\n AutocompleteEmpty,\n AutocompleteInput,\n AutocompleteItem,\n AutocompletePortal,\n AutocompleteRoot,\n AutocompleteViewport,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { AutocompleteEmits, AutocompleteOption, AutocompleteProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxAutocomplete', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<AutocompleteProps>(), {\n options: () => [],\n remote: false,\n debounce: 300,\n loading: false,\n loadingText: 'Searching…',\n emptyText: 'Nothing found',\n minLength: 0,\n placeholder: undefined,\n clearable: false,\n openOnFocus: true,\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<AutocompleteEmits>()\n\n/** The model is the text in the field — an autocomplete suggests, it does not constrain. */\nconst model = defineModel<string>({ default: '' })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\nlet debounceTimer: ReturnType<typeof setTimeout> | undefined\n/** Set while a pick is being applied, so choosing a suggestion does not search for it. */\nlet picking = false\n\nfunction cancelSearch() {\n if (debounceTimer === undefined) return\n clearTimeout(debounceTimer)\n debounceTimer = undefined\n}\n\nwatch(model, (value) => {\n emit('change', value)\n\n if (picking) {\n picking = false\n cancelSearch()\n return\n }\n\n cancelSearch()\n if (value.length < props.minLength) {\n open.value = false\n return\n }\n\n debounceTimer = setTimeout(() => {\n debounceTimer = undefined\n emit('search', value)\n }, props.debounce)\n})\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\nonBeforeUnmount(cancelSearch)\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && model.value.length > 0)\n\n/** Nothing to drop down yet: below `min-length`, or still waiting on the first response. */\nconst hasList = computed(\n () => props.options.length > 0 || props.loading || model.value.length >= props.minLength,\n)\n\nconst classes = computed(() => [\n 'wx-autocomplete',\n `wx-autocomplete--${field.size.value}`,\n {\n [`wx-autocomplete--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction onSelect(option: AutocompleteOption) {\n picking = true\n emit('select', option)\n}\n\nfunction clear() {\n picking = true\n model.value = ''\n open.value = false\n emit('clear')\n}\n</script>\n\n<template>\n <autocomplete-root\n v-model=\"model\"\n v-model:open=\"open\"\n as=\"div\"\n :class=\"classes\"\n v-bind=\"rootAttrs\"\n :disabled=\"field.disabled.value\"\n :name=\"name\"\n :ignore-filter=\"remote\"\n :open-on-focus=\"openOnFocus\"\n :open-on-click=\"openOnFocus\"\n >\n <autocomplete-anchor class=\"wx-autocomplete__anchor\" as=\"div\">\n <span v-if=\"$slots.prefix\" class=\"wx-autocomplete__affix\">\n <slot name=\"prefix\" />\n </span>\n\n <autocomplete-input\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-autocomplete__input\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n />\n\n <wx-icon v-if=\"loading\" class=\"wx-autocomplete__spinner\" name=\"loader\" spin />\n\n <button\n v-else-if=\"showClear\"\n class=\"wx-autocomplete__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click=\"clear\"\n >\n <wx-icon name=\"close\" />\n </button>\n\n <span v-if=\"$slots.suffix\" class=\"wx-autocomplete__affix\">\n <slot name=\"suffix\" />\n </span>\n </autocomplete-anchor>\n\n <autocomplete-portal :disabled=\"!teleport\">\n <autocomplete-content\n v-if=\"hasList\"\n class=\"wx-autocomplete__content\"\n position=\"popper\"\n :side-offset=\"4\"\n >\n <autocomplete-viewport class=\"wx-autocomplete__viewport\">\n <div v-if=\"loading && options.length === 0\" class=\"wx-autocomplete__status\">\n {{ loadingText }}\n </div>\n <autocomplete-empty v-else class=\"wx-autocomplete__status\">\n {{ emptyText }}\n </autocomplete-empty>\n\n <autocomplete-item\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"wx-autocomplete__option\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n @select=\"onSelect(option)\"\n >\n <slot name=\"option\" :option=\"option\">\n <span class=\"wx-autocomplete__option-label\">{{ option.label ?? option.value }}</span>\n <span v-if=\"option.description\" class=\"wx-autocomplete__option-description\">\n {{ option.description }}\n </span>\n </slot>\n </autocomplete-item>\n </autocomplete-viewport>\n </autocomplete-content>\n </autocomplete-portal>\n </autocomplete-root>\n</template>\n\n<style scoped>\n.wx-autocomplete {\n display: block;\n width: 100%;\n}\n\n.wx-autocomplete__anchor {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-10) 0 var(--wx-space-12);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-control-md);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-autocomplete--sm .wx-autocomplete__anchor {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-autocomplete--lg .wx-autocomplete__anchor {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-autocomplete__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-autocomplete.is-open .wx-autocomplete__anchor,\n.wx-autocomplete__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-autocomplete--error .wx-autocomplete__anchor,\n.wx-autocomplete--error.is-open .wx-autocomplete__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-autocomplete--success .wx-autocomplete__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-autocomplete--warning .wx-autocomplete__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-autocomplete.is-disabled .wx-autocomplete__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-autocomplete__input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-autocomplete__input::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-autocomplete__input:disabled {\n cursor: not-allowed;\n}\n\n.wx-autocomplete__affix,\n.wx-autocomplete__spinner {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-autocomplete__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 20px;\n height: 20px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-autocomplete__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* The list is teleported, so its styles cannot be scoped to the component. */\n.wx-autocomplete__content {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n width: var(--reka-combobox-trigger-width);\n max-height: 300px;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-control-md);\n overflow: hidden;\n}\n\n.wx-autocomplete__viewport {\n max-height: 292px;\n overflow-y: auto;\n}\n\n.wx-autocomplete__option {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n user-select: none;\n}\n\n.wx-autocomplete__option[data-highlighted] {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-autocomplete__option[data-disabled] {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-autocomplete__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-autocomplete__option-description {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-autocomplete__status {\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { BadgeEmits, BadgeProps } from './types'\n\ndefineOptions({ name: 'WxBadge' })\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n type: 'default',\n variant: 'soft',\n size: 'md',\n round: false,\n dot: false,\n closable: false,\n closeLabel: 'Remove',\n})\n\nconst emit = defineEmits<BadgeEmits>()\n\nconst classes = computed(() => [\n 'wx-badge',\n `wx-badge--${props.type}`,\n `wx-badge--${props.variant}`,\n `wx-badge--${props.size}`,\n {\n 'wx-badge--round': props.round,\n 'wx-badge--closable': props.closable,\n },\n])\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"wx-badge__dot\" aria-hidden=\"true\" />\n <span v-if=\"$slots.icon\" class=\"wx-badge__icon\">\n <slot name=\"icon\" />\n </span>\n <span class=\"wx-badge__label\">\n <slot />\n </span>\n <button\n v-if=\"closable\"\n class=\"wx-badge__close\"\n type=\"button\"\n :aria-label=\"closeLabel\"\n @click=\"emit('close', $event)\"\n >\n <wx-icon name=\"close\" />\n </button>\n </span>\n</template>\n\n<style scoped>\n.wx-badge {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n box-sizing: border-box;\n max-width: 100%;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs);\n font-family: inherit;\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n white-space: nowrap;\n vertical-align: middle;\n}\n\n/* sizes */\n.wx-badge--sm {\n padding: 1px var(--wx-space-6);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-badge--md {\n padding: 3px var(--wx-space-8);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-badge--lg {\n padding: 5px var(--wx-space-10);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-badge--round {\n border-radius: var(--wx-radius-full);\n}\n\n/* Each type names its colours once; the variants below stay type-agnostic. */\n.wx-badge--default {\n --wx-badge-accent: var(--wx-text-muted);\n --wx-badge-soft: var(--wx-bg-fill);\n --wx-badge-solid: var(--wx-bg-inverse);\n --wx-badge-contrast: var(--wx-text-inverse);\n --wx-badge-border: var(--wx-border-default);\n}\n\n.wx-badge--primary {\n --wx-badge-accent: var(--wx-color-primary);\n --wx-badge-soft: var(--wx-color-primary-soft);\n --wx-badge-solid: var(--wx-color-primary);\n --wx-badge-contrast: var(--wx-color-primary-contrast);\n --wx-badge-border: var(--wx-color-primary);\n}\n\n.wx-badge--success {\n --wx-badge-accent: var(--wx-color-success-active);\n --wx-badge-soft: var(--wx-color-success-soft);\n --wx-badge-solid: var(--wx-color-success);\n --wx-badge-contrast: var(--wx-color-success-contrast);\n --wx-badge-border: var(--wx-color-success);\n}\n\n.wx-badge--warning {\n --wx-badge-accent: var(--wx-color-warning-active);\n --wx-badge-soft: var(--wx-color-warning-soft);\n --wx-badge-solid: var(--wx-color-warning);\n --wx-badge-contrast: var(--wx-color-warning-contrast);\n --wx-badge-border: var(--wx-color-warning);\n}\n\n.wx-badge--danger {\n --wx-badge-accent: var(--wx-color-danger);\n --wx-badge-soft: var(--wx-color-danger-soft);\n --wx-badge-solid: var(--wx-color-danger);\n --wx-badge-contrast: var(--wx-color-danger-contrast);\n --wx-badge-border: var(--wx-color-danger);\n}\n\n.wx-badge--info {\n --wx-badge-accent: var(--wx-color-info-active);\n --wx-badge-soft: var(--wx-color-info-soft);\n --wx-badge-solid: var(--wx-color-info);\n --wx-badge-contrast: var(--wx-color-info-contrast);\n --wx-badge-border: var(--wx-color-info);\n}\n\n/* variants */\n.wx-badge--soft {\n background: var(--wx-badge-soft);\n color: var(--wx-badge-accent);\n}\n\n.wx-badge--solid {\n background: var(--wx-badge-solid);\n color: var(--wx-badge-contrast);\n}\n\n.wx-badge--outline {\n background: transparent;\n border-color: var(--wx-badge-border);\n color: var(--wx-badge-accent);\n}\n\n.wx-badge__dot {\n width: 6px;\n height: 6px;\n flex: 0 0 auto;\n background: currentcolor;\n border-radius: var(--wx-radius-full);\n}\n\n.wx-badge__icon {\n display: inline-flex;\n align-items: center;\n}\n\n.wx-badge__label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wx-badge__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n /* Keeps the badge from growing taller than its text. */\n margin-right: -2px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: inherit;\n font-size: 1em;\n line-height: 1;\n opacity: 0.65;\n cursor: pointer;\n}\n\n.wx-badge__close:hover {\n opacity: 1;\n}\n\n.wx-badge__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\nimport type { IconName } from '../components/Icon/types'\n\nexport type BreadcrumbSize = 'sm' | 'md'\n\n/** What `WxBreadcrumb` hands down to the items inside it. */\nexport interface BreadcrumbContext {\n /** The character drawn between items. */\n separator: ComputedRef<string>\n /** An icon drawn instead of that character. */\n separatorIcon: ComputedRef<IconName | undefined>\n size: ComputedRef<BreadcrumbSize>\n}\n\nexport const breadcrumbKey: InjectionKey<BreadcrumbContext> = Symbol('wx-breadcrumb')\n\nexport function useBreadcrumb(): BreadcrumbContext | null {\n return inject(breadcrumbKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { breadcrumbKey } from '../../composables/useBreadcrumb'\nimport type { BreadcrumbProps } from './types'\n\ndefineOptions({ name: 'WxBreadcrumb' })\n\nconst props = withDefaults(defineProps<BreadcrumbProps>(), {\n separator: '/',\n separatorIcon: undefined,\n size: 'md',\n label: 'Breadcrumb',\n})\n\nprovide(breadcrumbKey, {\n separator: computed(() => props.separator),\n separatorIcon: computed(() => props.separatorIcon),\n size: computed(() => props.size),\n})\n</script>\n\n<template>\n <nav class=\"wx-breadcrumb\" :class=\"`wx-breadcrumb--${size}`\" :aria-label=\"label\">\n <!-- An ordered list, because a trail read out of order is not a trail. -->\n <ol class=\"wx-breadcrumb__list\">\n <slot />\n </ol>\n </nav>\n</template>\n\n<style scoped>\n.wx-breadcrumb {\n color: var(--wx-text-muted);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-breadcrumb--sm {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-breadcrumb__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useBreadcrumb } from '../../composables/useBreadcrumb'\nimport type { BreadcrumbItemEmits, BreadcrumbItemProps } from './types'\n\ndefineOptions({ name: 'WxBreadcrumbItem', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<BreadcrumbItemProps>(), {\n href: undefined,\n target: undefined,\n as: undefined,\n icon: undefined,\n current: undefined,\n})\n\nconst emit = defineEmits<BreadcrumbItemEmits>()\n\nconst breadcrumb = useBreadcrumb()\n\nconst isLink = computed(() => Boolean(props.href || props.as))\n\n/*\n * A crumb that links nowhere is where you already are. Saying so with `aria-current`\n * is the whole reason a screen reader can tell the trail from a row of links.\n */\nconst isCurrent = computed(() => props.current ?? !isLink.value)\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'span'))\n\nconst linkAttrs = computed(() => {\n const attrs: Record<string, unknown> = {}\n if (props.href) attrs.href = props.href\n if (props.target) attrs.target = props.target\n if (props.target === '_blank') attrs.rel = 'noopener noreferrer'\n if (isCurrent.value) attrs['aria-current'] = 'page'\n return attrs\n})\n\nconst separatorIcon = computed(() => breadcrumb?.separatorIcon.value)\nconst separator = computed(() => breadcrumb?.separator.value ?? '/')\n</script>\n\n<template>\n <li class=\"wx-breadcrumb-item\" :class=\"{ 'is-current': isCurrent }\">\n <component\n :is=\"tag\"\n v-bind=\"{ ...linkAttrs, ...$attrs }\"\n class=\"wx-breadcrumb-item__link\"\n @click=\"emit('click', $event)\"\n >\n <wx-icon v-if=\"icon\" class=\"wx-breadcrumb-item__icon\" :name=\"icon\" />\n <slot />\n </component>\n\n <!--\n The separator belongs to the item before it, and the stylesheet drops it on the\n last one — which is the only way an item can know it is last without the list\n counting its children.\n -->\n <span class=\"wx-breadcrumb-item__separator\" aria-hidden=\"true\">\n <wx-icon v-if=\"separatorIcon\" :name=\"separatorIcon\" />\n <template v-else>{{ separator }}</template>\n </span>\n </li>\n</template>\n\n<style scoped>\n.wx-breadcrumb-item {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-6);\n min-width: 0;\n /*\n * The crumb owns its margins. A host stylesheet that spaces list items — VitePress\n * puts 8px between every `li + li`, and a CMS theme will have its own — otherwise\n * walks the trail down the page like a staircase.\n */\n margin: 0;\n}\n\n.wx-breadcrumb-item__link {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n padding: 0;\n background: none;\n border: 0;\n border-radius: var(--wx-radius-xs);\n color: inherit;\n font: inherit;\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\na.wx-breadcrumb-item__link,\nbutton.wx-breadcrumb-item__link {\n cursor: pointer;\n transition: color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\na.wx-breadcrumb-item__link:hover,\nbutton.wx-breadcrumb-item__link:hover {\n color: var(--wx-text-link);\n}\n\n.wx-breadcrumb-item__link:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-breadcrumb-item.is-current .wx-breadcrumb-item__link {\n color: var(--wx-text-default);\n font-weight: var(--wx-font-weight-medium);\n cursor: default;\n}\n\n.wx-breadcrumb-item__icon {\n flex: 0 0 auto;\n opacity: 0.9;\n}\n\n.wx-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n color: var(--wx-text-placeholder);\n user-select: none;\n}\n\n.wx-breadcrumb-item:last-child .wx-breadcrumb-item__separator {\n display: none;\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\nimport type { ButtonSize, ButtonType, ButtonVariant } from '../components/Button/types'\n\n/**\n * What a `WxButtonGroup` hands down to the buttons inside it. Every field is\n * optional: a button's own prop always wins, the group only fills the gaps.\n */\nexport interface ButtonGroupContext {\n type: ComputedRef<ButtonType | undefined>\n variant: ComputedRef<ButtonVariant | undefined>\n size: ComputedRef<ButtonSize | undefined>\n disabled: ComputedRef<boolean>\n vertical: ComputedRef<boolean>\n}\n\nexport const buttonGroupKey: InjectionKey<ButtonGroupContext> = Symbol('wx-button-group')\n\nexport function useButtonGroup(): ButtonGroupContext | null {\n return inject(buttonGroupKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useButtonGroup } from '../../composables/useButtonGroup'\nimport type { ButtonEmits, ButtonProps } from './types'\n\ndefineOptions({ name: 'WxButton', inheritAttrs: false })\n\n/*\n * The look defaults to `undefined` rather than to its documented value: inside a\n * `WxButtonGroup` the button has to tell \"caller said default\" from \"caller said\n * nothing\", and a prop default would erase that difference.\n */\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: undefined,\n variant: undefined,\n size: undefined,\n disabled: false,\n loading: false,\n block: false,\n round: false,\n href: undefined,\n target: undefined,\n nativeType: 'button',\n})\n\nconst emit = defineEmits<ButtonEmits>()\n\nconst group = useButtonGroup()\n\nconst type = computed(() => props.type ?? group?.type.value ?? 'default')\nconst variant = computed(() => props.variant ?? group?.variant.value ?? 'solid')\nconst size = computed(() => props.size ?? group?.size.value ?? 'md')\n\nconst isDisabled = computed(() => props.disabled || props.loading || group?.disabled.value || false)\nconst tag = computed(() => (props.href ? 'a' : 'button'))\n\nconst classes = computed(() => [\n 'wx-button',\n `wx-button--${type.value}`,\n `wx-button--${variant.value}`,\n `wx-button--${size.value}`,\n {\n 'wx-button--block': props.block,\n 'wx-button--round': props.round,\n 'wx-button--loading': props.loading,\n 'is-disabled': isDisabled.value,\n },\n])\n\nconst nativeAttrs = computed(() =>\n props.href\n ? {\n href: isDisabled.value ? undefined : props.href,\n target: props.target,\n role: 'button',\n 'aria-disabled': isDisabled.value ? 'true' : undefined,\n tabindex: isDisabled.value ? -1 : undefined,\n }\n : {\n type: props.nativeType,\n disabled: isDisabled.value,\n },\n)\n\nfunction onClick(event: MouseEvent) {\n if (isDisabled.value) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"{ ...nativeAttrs, ...$attrs }\"\n :class=\"classes\"\n :aria-busy=\"loading || undefined\"\n @click=\"onClick\"\n >\n <span v-if=\"loading\" class=\"wx-button__spinner\" aria-hidden=\"true\" />\n <span v-else-if=\"$slots.icon\" class=\"wx-button__icon\">\n <slot name=\"icon\" />\n </span>\n <span v-if=\"$slots.default\" class=\"wx-button__label\">\n <slot />\n </span>\n </component>\n</template>\n\n<style scoped>\n.wx-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-control);\n font-family: inherit;\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--wx-duration-normal) var(--wx-easing-standard),\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n color var(--wx-duration-normal) var(--wx-easing-standard),\n box-shadow var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-button:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* sizes */\n.wx-button--sm {\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-12);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-button--md {\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-18);\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-button--lg {\n height: var(--wx-size-control-lg);\n padding: 0 var(--wx-space-24);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-button--block {\n display: flex;\n width: 100%;\n}\n\n.wx-button--round {\n border-radius: var(--wx-radius-full);\n}\n\n/*\n * Each type exposes its own palette through local variables, so the variant rules\n * below stay type-agnostic.\n */\n.wx-button--default {\n --wx-button-bg: var(--wx-bg-surface);\n --wx-button-bg-hover: var(--wx-bg-fill);\n --wx-button-bg-active: var(--wx-bg-fill-hover);\n --wx-button-bg-disabled: var(--wx-bg-surface);\n --wx-button-fg: var(--wx-text-default);\n --wx-button-border: var(--wx-border-default);\n}\n\n.wx-button--primary {\n --wx-button-bg: var(--wx-color-primary);\n --wx-button-bg-hover: var(--wx-color-primary-hover);\n --wx-button-bg-active: var(--wx-color-primary-active);\n --wx-button-bg-disabled: var(--wx-color-primary-disabled);\n --wx-button-fg: var(--wx-color-primary-contrast);\n --wx-button-border: var(--wx-color-primary);\n --wx-button-accent: var(--wx-color-primary);\n --wx-button-soft: var(--wx-color-primary-soft);\n}\n\n.wx-button--success {\n --wx-button-bg: var(--wx-color-success);\n --wx-button-bg-hover: var(--wx-color-success-hover);\n --wx-button-bg-active: var(--wx-color-success-active);\n --wx-button-bg-disabled: var(--wx-color-success-disabled);\n --wx-button-fg: var(--wx-color-success-contrast);\n --wx-button-border: var(--wx-color-success);\n --wx-button-accent: var(--wx-color-success);\n --wx-button-soft: var(--wx-color-success-soft);\n}\n\n.wx-button--warning {\n --wx-button-bg: var(--wx-color-warning);\n --wx-button-bg-hover: var(--wx-color-warning-hover);\n --wx-button-bg-active: var(--wx-color-warning-active);\n --wx-button-bg-disabled: var(--wx-color-warning-disabled);\n --wx-button-fg: var(--wx-color-warning-contrast);\n --wx-button-border: var(--wx-color-warning);\n --wx-button-accent: var(--wx-color-warning);\n --wx-button-soft: var(--wx-color-warning-soft);\n}\n\n.wx-button--danger {\n --wx-button-bg: var(--wx-color-danger);\n --wx-button-bg-hover: var(--wx-color-danger-hover);\n --wx-button-bg-active: var(--wx-color-danger-active);\n --wx-button-bg-disabled: var(--wx-color-danger-disabled);\n --wx-button-fg: var(--wx-color-danger-contrast);\n --wx-button-border: var(--wx-color-danger);\n --wx-button-accent: var(--wx-color-danger);\n --wx-button-soft: var(--wx-color-danger-soft);\n}\n\n/* solid */\n.wx-button--solid {\n background: var(--wx-button-bg);\n border-color: var(--wx-button-border);\n color: var(--wx-button-fg);\n}\n\n.wx-button--solid:hover:not(.is-disabled) {\n background: var(--wx-button-bg-hover);\n border-color: var(--wx-button-bg-hover);\n}\n\n.wx-button--solid:active:not(.is-disabled) {\n background: var(--wx-button-bg-active);\n border-color: var(--wx-button-bg-active);\n}\n\n.wx-button--solid.is-disabled {\n background: var(--wx-button-bg-disabled);\n border-color: var(--wx-button-bg-disabled);\n}\n\n.wx-button--solid.wx-button--default.is-disabled {\n border-color: var(--wx-border-default);\n color: var(--wx-text-disabled);\n}\n\n/* outline */\n.wx-button--outline {\n background: transparent;\n border-color: var(--wx-button-accent, var(--wx-border-default));\n color: var(--wx-button-accent, var(--wx-text-default));\n}\n\n.wx-button--outline:hover:not(.is-disabled) {\n background: var(--wx-button-soft, var(--wx-bg-fill));\n}\n\n.wx-button--outline:active:not(.is-disabled) {\n border-color: var(--wx-button-bg-active);\n color: var(--wx-button-bg-active);\n}\n\n.wx-button--outline.is-disabled {\n border-color: var(--wx-button-bg-disabled);\n color: var(--wx-button-bg-disabled);\n}\n\n/* text */\n.wx-button--text {\n background: transparent;\n border-color: transparent;\n color: var(--wx-button-accent, var(--wx-text-default));\n}\n\n.wx-button--text:hover:not(.is-disabled) {\n background: var(--wx-bg-fill);\n}\n\n.wx-button--text:active:not(.is-disabled) {\n background: var(--wx-bg-fill-hover);\n}\n\n.wx-button--text.is-disabled {\n color: var(--wx-text-disabled);\n}\n\n/* states */\n.wx-button.is-disabled {\n cursor: not-allowed;\n}\n\n.wx-button--loading {\n cursor: progress;\n}\n\n.wx-button__spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-right-color: transparent;\n border-radius: var(--wx-radius-full);\n /* Same pace as a spinning WxIcon — a turn a second, not three. */\n animation: wx-button-spin var(--wx-button-spin-duration, 1s) linear infinite;\n}\n\n.wx-button__icon {\n display: inline-flex;\n align-items: center;\n}\n\n@keyframes wx-button-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-button {\n transition: none;\n }\n\n .wx-button__spinner {\n animation-duration: 2s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { buttonGroupKey } from '../../composables/useButtonGroup'\nimport type { ButtonGroupProps } from './types'\n\ndefineOptions({ name: 'WxButtonGroup' })\n\nconst props = withDefaults(defineProps<ButtonGroupProps>(), {\n type: undefined,\n variant: undefined,\n size: undefined,\n disabled: false,\n vertical: false,\n attached: true,\n ariaLabel: undefined,\n})\n\nprovide(buttonGroupKey, {\n type: computed(() => props.type),\n variant: computed(() => props.variant),\n size: computed(() => props.size),\n disabled: computed(() => props.disabled),\n vertical: computed(() => props.vertical),\n})\n\nconst classes = computed(() => [\n 'wx-button-group',\n {\n 'wx-button-group--vertical': props.vertical,\n 'wx-button-group--attached': props.attached,\n },\n])\n</script>\n\n<template>\n <div :class=\"classes\" role=\"group\" :aria-label=\"ariaLabel\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.wx-button-group {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n vertical-align: middle;\n}\n\n.wx-button-group--vertical {\n flex-direction: column;\n align-items: stretch;\n}\n\n/* Joined: the buttons share one outline, so the gap goes and the borders overlap. */\n.wx-button-group--attached {\n gap: 0;\n}\n\n.wx-button-group--attached :deep(.wx-button) {\n position: relative;\n border-radius: 0;\n}\n\n.wx-button-group--attached :deep(.wx-button:first-child) {\n border-start-start-radius: var(--wx-radius-control);\n border-end-start-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached :deep(.wx-button:last-child) {\n border-start-end-radius: var(--wx-radius-control);\n border-end-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached :deep(.wx-button:not(:first-child)) {\n margin-left: -1px;\n}\n\n/* The hovered or focused button owns the shared border, so it is not half-covered. */\n.wx-button-group--attached :deep(.wx-button:hover),\n.wx-button-group--attached :deep(.wx-button:focus-visible),\n.wx-button-group--attached :deep(.wx-button:active) {\n z-index: 1;\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button) {\n border-radius: 0;\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:first-child) {\n border-start-start-radius: var(--wx-radius-control);\n border-start-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:last-child) {\n border-end-start-radius: var(--wx-radius-control);\n border-end-end-radius: var(--wx-radius-control);\n}\n\n.wx-button-group--attached.wx-button-group--vertical :deep(.wx-button:not(:first-child)) {\n margin-left: 0;\n margin-top: -1px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { CardProps } from './types'\n\ndefineOptions({ name: 'WxCard' })\n\nconst props = withDefaults(defineProps<CardProps>(), {\n title: undefined,\n shadow: 'always',\n padding: 'md',\n bordered: false,\n})\n\nconst slots = useSlots()\n\nconst hasHeader = computed(() => Boolean(props.title || slots.header || slots.extra))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\nconst classes = computed(() => [\n 'wx-card',\n `wx-card--shadow-${props.shadow}`,\n `wx-card--padding-${props.padding}`,\n {\n 'wx-card--bordered': props.bordered,\n 'wx-card--with-sidebar': hasSidebar.value,\n },\n])\n</script>\n\n<template>\n <section :class=\"classes\">\n <header v-if=\"hasHeader\" class=\"wx-card__header\">\n <div class=\"wx-card__title\">\n <slot name=\"header\">{{ title }}</slot>\n </div>\n <div v-if=\"$slots.extra\" class=\"wx-card__extra\">\n <slot name=\"extra\" />\n </div>\n </header>\n\n <div class=\"wx-card__body\">\n <div v-if=\"hasSidebar\" class=\"wx-card__layout\">\n <aside class=\"wx-card__sidebar\">\n <slot name=\"sidebar\" />\n </aside>\n <div class=\"wx-card__content\">\n <slot />\n </div>\n </div>\n <slot v-else />\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-card__footer\">\n <slot name=\"footer\" />\n </footer>\n </section>\n</template>\n\n<style scoped>\n.wx-card {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background: var(--wx-bg-surface);\n border: 1px solid transparent;\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n transition: box-shadow var(--wx-duration-normal) var(--wx-easing-standard);\n /* The sidebar layout reacts to the card's own width, not the viewport's. */\n container-type: inline-size;\n}\n\n.wx-card--bordered {\n border-color: var(--wx-border-default);\n}\n\n.wx-card--shadow-always {\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-card--shadow-hover:hover {\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-card__header,\n.wx-card__body,\n.wx-card__footer {\n padding: var(--wx-card-padding, var(--wx-space-16));\n}\n\n.wx-card--padding-none {\n --wx-card-padding: 0px;\n}\n\n.wx-card--padding-sm {\n --wx-card-padding: var(--wx-space-12);\n}\n\n.wx-card--padding-md {\n --wx-card-padding: var(--wx-space-16);\n}\n\n.wx-card--padding-lg {\n --wx-card-padding: var(--wx-space-24);\n}\n\n.wx-card__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-16);\n padding-bottom: 0;\n}\n\n.wx-card__title {\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-card__extra {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-card__body {\n flex: 1 1 auto;\n}\n\n.wx-card__footer {\n padding-top: 0;\n}\n\n/* Sidebar layout: stacked by default, two columns once the card is wide enough. */\n.wx-card__layout {\n display: flex;\n flex-direction: column;\n gap: var(--wx-card-padding, var(--wx-space-16));\n}\n\n.wx-card__sidebar,\n.wx-card__content {\n min-width: 0;\n}\n\n.wx-card__content {\n flex: 1 1 auto;\n}\n\n@container (min-width: 560px) {\n .wx-card__layout {\n flex-direction: row;\n }\n\n .wx-card__sidebar {\n flex: 0 0 auto;\n width: var(--wx-card-sidebar-width, 240px);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue'\nimport { PopoverAnchor, PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useFormField } from '../../composables/useFormField'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\nimport type {\n CascaderEmits,\n CascaderModelValue,\n CascaderOption,\n CascaderProps,\n CascaderValue,\n} from './types'\n\ndefineOptions({ name: 'WxCascader', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<CascaderProps>(), {\n options: () => [],\n expandTrigger: 'click',\n checkStrictly: false,\n emitPath: true,\n showAllLevels: true,\n separator: ' / ',\n lazy: false,\n load: undefined,\n placeholder: undefined,\n emptyText: 'Nothing here',\n clearable: false,\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<CascaderEmits>()\n\nconst model = defineModel<CascaderModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst open = ref(false)\n/** The chain of opened nodes — one column per entry, plus the root column. */\nconst activePath = ref<CascaderOption[]>([])\nconst panel = ref<HTMLElement | null>(null)\n\n/** Levels fetched by `load`, keyed by the path that asked for them. */\nconst loadedChildren = ref(new Map<string, CascaderOption[]>())\nconst loadingKeys = ref(new Set<string>())\n\n/**\n * A path is keyed by the values along it, serialised — no separator character to\n * clash with a value that happens to contain one. The root is the empty path.\n */\nfunction keyOf(path: CascaderOption[]): string {\n return JSON.stringify(path.map((option) => option.value))\n}\n\nconst rootOptions = computed<CascaderOption[]>(() =>\n props.options.length > 0 ? props.options : (loadedChildren.value.get(keyOf([])) ?? []),\n)\n\nfunction childrenOf(option: CascaderOption, parents: CascaderOption[]): CascaderOption[] {\n if (option.children?.length) return option.children\n return loadedChildren.value.get(keyOf([...parents, option])) ?? []\n}\n\nfunction isLeaf(option: CascaderOption, parents: CascaderOption[]): boolean {\n if (option.leaf === true) return true\n if (option.children?.length) return false\n if (!props.lazy) return true\n\n /* Lazily: a node is a leaf once its level came back empty, not before. */\n const loaded = loadedChildren.value.get(keyOf([...parents, option]))\n return loaded !== undefined && loaded.length === 0\n}\n\nfunction isLoading(option: CascaderOption, parents: CascaderOption[]): boolean {\n return loadingKeys.value.has(keyOf([...parents, option]))\n}\n\n/** The root column, then one column per opened node that has something under it. */\nconst columns = computed<CascaderOption[][]>(() => {\n const result: CascaderOption[][] = [rootOptions.value]\n\n activePath.value.forEach((option, index) => {\n const children = childrenOf(option, activePath.value.slice(0, index))\n if (children.length > 0) result.push(children)\n })\n\n return result\n})\n\n/** Walks a stored path of values back into the options they name. */\nfunction resolvePath(values: CascaderValue[]): CascaderOption[] {\n const path: CascaderOption[] = []\n let level = rootOptions.value\n\n for (const value of values) {\n const option = level.find((candidate) => candidate.value === value)\n if (!option) break\n path.push(option)\n level = childrenOf(option, path.slice(0, -1))\n }\n\n return path\n}\n\n/** Depth-first search, for a model that holds the last value alone. */\nfunction findPath(\n options: CascaderOption[],\n value: CascaderValue,\n parents: CascaderOption[] = [],\n): CascaderOption[] | undefined {\n for (const option of options) {\n const path = [...parents, option]\n if (option.value === value) return path\n\n const found = findPath(childrenOf(option, parents), value, path)\n if (found) return found\n }\n return undefined\n}\n\nconst selectedPath = computed<CascaderOption[]>(() => {\n const value = model.value\n if (value === null || value === undefined || value === '') return []\n if (Array.isArray(value)) return resolvePath(value)\n return findPath(rootOptions.value, value) ?? []\n})\n\nconst hasValue = computed(() => {\n const value = model.value\n if (value === null || value === undefined || value === '') return false\n /* An empty path is \"nothing picked\" — that is what `clear` leaves behind. */\n if (Array.isArray(value)) return value.length > 0\n return true\n})\n\nconst displayLabel = computed(() => {\n const path = selectedPath.value\n\n /* Nothing resolved — usually a lazy tree that has not loaded the branch yet. */\n if (path.length === 0) {\n const value = model.value\n if (!hasValue.value) return ''\n return Array.isArray(value) ? value.join(props.separator) : String(value)\n }\n\n if (!props.showAllLevels) return path[path.length - 1].label\n return path.map((option) => option.label).join(props.separator)\n})\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && hasValue.value)\n\n/** What a plain form post carries: the path as `content,news`, or the single value. */\nconst formValue = computed(() => {\n const value = model.value\n if (!hasValue.value) return ''\n return Array.isArray(value) ? value.join(',') : String(value)\n})\n\nconst classes = computed(() => [\n 'wx-cascader',\n `wx-cascader--${field.size.value}`,\n {\n [`wx-cascader--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nasync function loadLevel(path: CascaderOption[]): Promise<void> {\n if (!props.load) return\n\n const key = keyOf(path)\n if (loadedChildren.value.has(key) || loadingKeys.value.has(key)) return\n\n loadingKeys.value.add(key)\n try {\n const children = await props.load(path[path.length - 1] ?? null, path)\n loadedChildren.value.set(key, children)\n } finally {\n loadingKeys.value.delete(key)\n }\n}\n\nfunction expand(option: CascaderOption, level: number) {\n if (option.disabled) return\n\n const parents = activePath.value.slice(0, level)\n activePath.value = [...parents, option]\n emit('expand', activePath.value)\n\n if (props.lazy && !isLeaf(option, parents)) void loadLevel([...parents, option])\n}\n\nfunction select(path: CascaderOption[]) {\n const value: CascaderModelValue = props.emitPath\n ? path.map((option) => option.value)\n : (path[path.length - 1]?.value ?? null)\n\n model.value = value\n emit('change', value)\n}\n\nfunction onOptionClick(option: CascaderOption, level: number) {\n if (option.disabled) return\n\n const parents = activePath.value.slice(0, level)\n const path = [...parents, option]\n const leaf = isLeaf(option, parents)\n\n expand(option, level)\n\n if (leaf || props.checkStrictly) select(path)\n if (leaf) open.value = false\n}\n\nfunction onOptionHover(option: CascaderOption, level: number) {\n if (props.expandTrigger !== 'hover' || option.disabled) return\n if (isLeaf(option, activePath.value.slice(0, level))) return\n expand(option, level)\n}\n\nfunction clear() {\n model.value = props.emitPath ? [] : null\n activePath.value = []\n emit('change', model.value)\n emit('clear')\n}\n\nwatch(open, (value) => {\n if (value) {\n /* Reopening lands where the current value sits, not where the last poke left it. */\n activePath.value = selectedPath.value.slice(0, -1)\n if (props.lazy && rootOptions.value.length === 0) void loadLevel([])\n emit('open')\n return\n }\n emit('close')\n})\n\n// --- keyboard ---------------------------------------------------------------\n\nfunction optionsIn(level: number): HTMLButtonElement[] {\n if (!panel.value) return []\n return [\n ...panel.value.querySelectorAll<HTMLButtonElement>(\n `[data-column=\"${level}\"] .wx-cascader__option:not(:disabled)`,\n ),\n ]\n}\n\nfunction focusOption(level: number, index: number) {\n const items = optionsIn(level)\n if (items.length === 0) return\n const bounded = ((index % items.length) + items.length) % items.length\n items[bounded]?.focus()\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n const target = event.target as HTMLElement | null\n const column = target?.closest<HTMLElement>('[data-column]')\n\n /* The panel itself has focus right after opening: the first arrow enters the list. */\n if (!column) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault()\n focusOption(0, 0)\n }\n return\n }\n\n const level = Number(column.dataset.column)\n const items = optionsIn(level)\n const current = items.indexOf(target as HTMLButtonElement)\n const option = columns.value[level]?.[Number((target as HTMLElement).dataset.index)]\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusOption(level, current + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusOption(level, current - 1)\n break\n case 'ArrowRight': {\n if (!option || isLeaf(option, activePath.value.slice(0, level))) return\n event.preventDefault()\n expand(option, level)\n void nextTick(() => focusOption(level + 1, 0))\n break\n }\n case 'ArrowLeft': {\n if (level === 0) return\n event.preventDefault()\n activePath.value = activePath.value.slice(0, level - 1)\n void nextTick(() => {\n const parent = columns.value[level - 1]?.findIndex(\n (candidate) => candidate.value === activePath.value[level - 1]?.value,\n )\n focusOption(level - 1, parent === undefined || parent < 0 ? 0 : parent)\n })\n break\n }\n default:\n break\n }\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\">\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <popover-anchor as=\"div\" class=\"wx-cascader__anchor\">\n <popover-trigger\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-cascader__trigger\"\n type=\"button\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n >\n <span v-if=\"hasValue\" class=\"wx-cascader__value\">{{ displayLabel }}</span>\n <span v-else class=\"wx-cascader__placeholder\">{{ placeholder }}</span>\n <wx-icon class=\"wx-cascader__arrow\" name=\"chevron-down\" />\n </popover-trigger>\n\n <button\n v-if=\"showClear\"\n class=\"wx-cascader__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n <wx-icon name=\"close\" />\n </button>\n </popover-anchor>\n\n <input v-if=\"name\" type=\"hidden\" :name=\"name\" :value=\"formValue\" />\n </div>\n\n <popover-portal :disabled=\"!teleport\">\n <!--\n The panel itself takes focus when it opens — that is what makes the arrow keys\n work — so the key handler sits on it rather than on the columns inside.\n -->\n <popover-content\n class=\"wx-cascader__panel\"\n align=\"start\"\n :side-offset=\"4\"\n @keydown=\"onPanelKeydown\"\n >\n <div ref=\"panel\" class=\"wx-cascader__columns\">\n <div\n v-for=\"(column, level) in columns\"\n :key=\"level\"\n class=\"wx-cascader__column\"\n :data-column=\"level\"\n role=\"listbox\"\n :aria-label=\"`Level ${level + 1}`\"\n >\n <button\n v-for=\"(option, index) in column\"\n :key=\"String(option.value)\"\n class=\"wx-cascader__option\"\n type=\"button\"\n role=\"option\"\n :data-index=\"index\"\n :disabled=\"option.disabled\"\n :aria-selected=\"selectedPath[level]?.value === option.value\"\n :class=\"{\n 'is-active': activePath[level]?.value === option.value,\n 'is-selected': selectedPath[level]?.value === option.value,\n }\"\n @click=\"onOptionClick(option, level)\"\n @mouseenter=\"onOptionHover(option, level)\"\n >\n <span class=\"wx-cascader__label\">\n <slot name=\"option\" :option=\"option\" :level=\"level\">{{ option.label }}</slot>\n </span>\n\n <wx-icon\n v-if=\"isLoading(option, activePath.slice(0, level))\"\n class=\"wx-cascader__mark\"\n name=\"loader\"\n spin\n />\n <wx-icon\n v-else-if=\"!isLeaf(option, activePath.slice(0, level))\"\n class=\"wx-cascader__mark\"\n name=\"chevron-right\"\n />\n <wx-icon\n v-else-if=\"selectedPath[level]?.value === option.value\"\n class=\"wx-cascader__mark wx-cascader__mark--check\"\n name=\"check\"\n />\n </button>\n\n <p v-if=\"column.length === 0\" class=\"wx-cascader__empty\">{{ emptyText }}</p>\n </div>\n </div>\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style scoped>\n.wx-cascader {\n display: block;\n width: 100%;\n}\n\n.wx-cascader__anchor {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding-right: var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-control-md);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-cascader--sm .wx-cascader__anchor {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-cascader--lg .wx-cascader__anchor {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-cascader__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-cascader.is-open .wx-cascader__anchor,\n.wx-cascader__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-cascader--error .wx-cascader__anchor,\n.wx-cascader--error.is-open .wx-cascader__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-cascader--success .wx-cascader__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-cascader--warning .wx-cascader__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-cascader.is-disabled .wx-cascader__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-cascader__trigger {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0 0 0 var(--wx-space-12);\n background: transparent;\n border: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-cascader__trigger:focus-visible {\n outline: none;\n}\n\n.wx-cascader.is-disabled .wx-cascader__trigger {\n cursor: not-allowed;\n}\n\n.wx-cascader__value,\n.wx-cascader__placeholder {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-cascader__placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-cascader__arrow {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: 16px;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-cascader.is-open .wx-cascader__arrow {\n transform: rotate(180deg);\n}\n\n.wx-cascader__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 20px;\n height: 20px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-cascader__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-cascader__panel {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-control-md);\n overflow: hidden;\n}\n\n.wx-cascader__columns {\n display: flex;\n align-items: stretch;\n max-width: min(90vw, 720px);\n /* Columns scroll sideways rather than push the panel off a narrow screen. */\n overflow-x: auto;\n}\n\n.wx-cascader__column {\n display: flex;\n flex-direction: column;\n flex: 0 0 auto;\n gap: 1px;\n min-width: 180px;\n max-height: 280px;\n padding: var(--wx-space-4);\n overflow-y: auto;\n}\n\n.wx-cascader__column + .wx-cascader__column {\n border-left: 1px solid var(--wx-border-muted);\n}\n\n.wx-cascader__option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n width: 100%;\n padding: var(--wx-space-6) var(--wx-space-10);\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: inherit;\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n text-align: start;\n cursor: pointer;\n}\n\n.wx-cascader__option:hover:not(:disabled),\n.wx-cascader__option:focus-visible {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-cascader__option.is-active {\n background: var(--wx-bg-fill);\n}\n\n.wx-cascader__option.is-selected {\n color: var(--wx-color-primary);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-cascader__option:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-cascader__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-cascader__mark {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: 14px;\n}\n\n.wx-cascader__mark--check {\n color: var(--wx-color-primary);\n}\n\n.wx-cascader__empty {\n margin: 0;\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, ref, watch } from 'vue'\nimport { checkboxGroupKey, useFormField } from '../../composables/useFormField'\nimport type { CheckboxEmits, CheckboxProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxCheckbox', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n value: undefined,\n label: undefined,\n indeterminate: false,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<CheckboxEmits>()\n\nconst model = defineModel<boolean>({ default: false })\n\nconst group = inject(checkboxGroupKey, null)\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst checked = computed(() =>\n group ? group.modelValue.value.includes(props.value ?? null) : model.value === true,\n)\n\nconst disabled = computed(() => props.disabled || group?.disabled.value || field.disabled.value)\nconst size = computed(() => props.size ?? group?.size.value ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-checkbox',\n `wx-checkbox--${size.value}`,\n {\n 'is-checked': checked.value,\n 'is-indeterminate': props.indeterminate && !checked.value,\n 'is-disabled': disabled.value,\n },\n])\n\n/** `indeterminate` only exists as a DOM property, never as an attribute. */\nfunction syncIndeterminate() {\n if (inputRef.value) inputRef.value.indeterminate = props.indeterminate && !checked.value\n}\n\nonMounted(syncIndeterminate)\nwatch([() => props.indeterminate, checked], syncIndeterminate)\n\nfunction onChange(event: Event) {\n const next = (event.target as HTMLInputElement).checked\n if (group) group.toggle(props.value ?? null, next)\n else model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <label :class=\"classes\" v-bind=\"rootAttrs\">\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"controlAttrs\"\n class=\"wx-checkbox__native\"\n type=\"checkbox\"\n :name=\"name ?? group?.name.value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-checkbox__box\" aria-hidden=\"true\">\n <svg class=\"wx-checkbox__mark\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n v-if=\"indeterminate && !checked\"\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n <path\n v-else\n d=\"M3.5 8.5l3 3 6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-checkbox__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-checkbox {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-checkbox.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-checkbox__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.wx-checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-checkbox-size, 20px);\n height: var(--wx-checkbox-size, 20px);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-strong);\n border-radius: var(--wx-radius-xs);\n color: transparent;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-checkbox--sm {\n --wx-checkbox-size: 16px;\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-checkbox--md {\n --wx-checkbox-size: 20px;\n /* A tick beside a label is a choice in a list, and reads at the list size. */\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-checkbox--lg {\n --wx-checkbox-size: 24px;\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-checkbox:hover:not(.is-disabled) .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n}\n\n.wx-checkbox.is-checked .wx-checkbox__box,\n.wx-checkbox.is-indeterminate .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n color: var(--wx-color-primary);\n}\n\n.wx-checkbox.is-disabled .wx-checkbox__box {\n background: var(--wx-bg-disabled);\n border-color: var(--wx-border-default);\n}\n\n.wx-checkbox.is-disabled.is-checked .wx-checkbox__box,\n.wx-checkbox.is-disabled.is-indeterminate .wx-checkbox__box {\n color: var(--wx-color-primary-disabled);\n border-color: var(--wx-color-primary-disabled);\n}\n\n.wx-checkbox__native:focus-visible + .wx-checkbox__box {\n border-color: var(--wx-color-primary);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-checkbox__mark {\n width: 100%;\n height: 100%;\n}\n\n.wx-checkbox__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-checkbox__box {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { checkboxGroupKey, useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport WxCheckbox from '../Checkbox/Checkbox.vue'\nimport type { CheckboxGroupEmits, CheckboxGroupProps } from './types'\n\ndefineOptions({ name: 'WxCheckboxGroup' })\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n options: undefined,\n disabled: undefined,\n size: undefined,\n name: undefined,\n inline: false,\n min: undefined,\n max: undefined,\n})\n\nconst emit = defineEmits<CheckboxGroupEmits>()\n\nconst model = defineModel<ChoiceValue[]>({ default: () => [] })\n\nconst field = useFormField(props)\n\n/** A group cannot be the target of a `for`, so the item label becomes a span. */\nfield.item?.registerLabelTarget(undefined)\n\nconst disabled = computed(() => props.disabled ?? field.disabled.value)\nconst size = computed(() => props.size ?? field.size.value)\n\nfunction toggle(value: ChoiceValue, checked: boolean) {\n const current = model.value ?? []\n if (checked) {\n if (current.includes(value)) return\n if (props.max !== undefined && current.length >= props.max) return\n model.value = [...current, value]\n } else {\n if (props.min !== undefined && current.length <= props.min) return\n model.value = current.filter((item) => item !== value)\n }\n emit('change', model.value)\n}\n\nprovide(checkboxGroupKey, {\n name: computed(() => props.name),\n modelValue: computed(() => model.value ?? []),\n disabled,\n size,\n toggle,\n})\n</script>\n\n<template>\n <div\n :class=\"['wx-checkbox-group', { 'wx-checkbox-group--inline': inline }]\"\n role=\"group\"\n :aria-labelledby=\"field.item ? `${field.item.id.value}-label` : undefined\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <slot>\n <wx-checkbox\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :label=\"option.label\"\n :disabled=\"option.disabled\"\n />\n </slot>\n </div>\n</template>\n\n<style scoped>\n.wx-checkbox-group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-checkbox-group--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--wx-space-16);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ColBreakpoint, ColProps } from './types'\n\ndefineOptions({ name: 'WxCol' })\n\nconst props = withDefaults(defineProps<ColProps>(), {\n span: 24,\n offset: undefined,\n sm: undefined,\n md: undefined,\n lg: undefined,\n xl: undefined,\n order: undefined,\n as: 'div',\n})\n\nconst breakpoints = ['sm', 'md', 'lg', 'xl'] as const\n\nfunction normalize(value: ColBreakpoint) {\n return typeof value === 'number' ? { span: value } : value\n}\n\n/**\n * Every width is published as a variable and the media queries in the stylesheet\n * pick which one wins, each falling back to the breakpoint below it. That keeps the\n * component down to one rule per breakpoint instead of the 24 spans × 4 widths a\n * class-per-span grid needs.\n */\nconst style = computed(() => {\n const vars: Record<string, string> = { '--wx-col-span': String(props.span) }\n if (props.offset !== undefined) vars['--wx-col-offset'] = String(props.offset)\n if (props.order !== undefined) vars['--wx-col-order'] = String(props.order)\n\n for (const name of breakpoints) {\n const value = props[name]\n if (value === undefined) continue\n const { span, offset } = normalize(value)\n if (span !== undefined) vars[`--wx-col-span-${name}`] = String(span)\n if (offset !== undefined) vars[`--wx-col-offset-${name}`] = String(offset)\n }\n\n return vars\n})\n</script>\n\n<template>\n <component :is=\"as\" class=\"wx-col\" :style=\"style\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-col {\n box-sizing: border-box;\n /* Half the gutter on each side; the row pulls the outer halves back. */\n flex: 0 0 auto;\n min-width: 0;\n padding-inline: calc(var(--wx-row-gutter, 0px) / 2);\n width: calc(var(--wx-col-span, 24) / 24 * 100%);\n margin-inline-start: calc(var(--wx-col-offset, 0) / 24 * 100%);\n order: var(--wx-col-order, 0);\n}\n\n/*\n * The breakpoints measure the row, not the window: `@container` against the\n * `wx-row` container `WxRow` establishes. A grid inside a drawer, a card or a main\n * column that lost half its width to a sidebar then reflows because *it* is narrow,\n * which is the question a column actually wants answered. The names in the props\n * keep their usual widths, so `:md=\"12\"` still means \"from 768px of room\".\n */\n@container wx-row (min-width: 640px) {\n .wx-col {\n width: calc(var(--wx-col-span-sm, var(--wx-col-span, 24)) / 24 * 100%);\n margin-inline-start: calc(var(--wx-col-offset-sm, var(--wx-col-offset, 0)) / 24 * 100%);\n }\n}\n\n@container wx-row (min-width: 768px) {\n .wx-col {\n width: calc(var(--wx-col-span-md, var(--wx-col-span-sm, var(--wx-col-span, 24))) / 24 * 100%);\n margin-inline-start: calc(\n var(--wx-col-offset-md, var(--wx-col-offset-sm, var(--wx-col-offset, 0))) / 24 * 100%\n );\n }\n}\n\n@container wx-row (min-width: 1024px) {\n .wx-col {\n width: calc(\n var(--wx-col-span-lg, var(--wx-col-span-md, var(--wx-col-span-sm, var(--wx-col-span, 24)))) /\n 24 * 100%\n );\n margin-inline-start: calc(\n var(\n --wx-col-offset-lg,\n var(--wx-col-offset-md, var(--wx-col-offset-sm, var(--wx-col-offset, 0)))\n ) /\n 24 * 100%\n );\n }\n}\n\n@container wx-row (min-width: 1280px) {\n .wx-col {\n width: calc(\n var(\n --wx-col-span-xl,\n var(\n --wx-col-span-lg,\n var(--wx-col-span-md, var(--wx-col-span-sm, var(--wx-col-span, 24)))\n )\n ) /\n 24 * 100%\n );\n margin-inline-start: calc(\n var(\n --wx-col-offset-xl,\n var(\n --wx-col-offset-lg,\n var(--wx-col-offset-md, var(--wx-col-offset-sm, var(--wx-col-offset, 0)))\n )\n ) /\n 24 * 100%\n );\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n ColorAreaArea,\n ColorAreaRoot,\n ColorAreaThumb,\n ColorSliderRoot,\n ColorSliderThumb,\n ColorSliderTrack,\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n colorToHex,\n convertToHsb,\n getAreaBackgroundStyle,\n getSliderBackgroundStyle,\n parseColor,\n} from 'reka-ui'\nimport type { Color } from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { ColorPickerEmits, ColorPickerProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxColorPicker', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n presets: () => [],\n clearable: false,\n placeholder: '#000000',\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<ColorPickerEmits>()\n\nconst model = defineModel<string | null>({ default: null })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\n/** What the text box shows. Kept separate so a half-typed hex is not thrown away. */\nconst text = ref(model.value ?? '')\n\nwatch(model, (value) => {\n text.value = value ?? ''\n})\n\n/**\n * A hex parses into an RGB colour, and the picker works in HSB. Both the gradients and\n * the primitives take the space from the object unless told otherwise, so an unconverted\n * colour draws an RGB area — where the brightness gradient runs the other way and the\n * square looks upside down until the first drag replaces the object.\n */\nfunction toWorking(hex: string): Color {\n return convertToHsb(parseColor(hex))\n}\n\n/**\n * The picker works on a colour object, not on the hex string.\n *\n * A grey has no hue to speak of, so parsing #919191 back into channels invents one —\n * and re-deriving it on every pointer move is what made the hue strip jump from blue\n * to teal to red as the pointer travelled into the desaturated corner. Holding the\n * object keeps the hue the user chose even where the colour cannot express it.\n */\nconst working = ref<Color>(\n toWorking(model.value && HEX.test(model.value) ? model.value : '#427edd'),\n)\n\nwatch(model, (value) => {\n const hex = value && HEX.test(value) ? value : null\n if (!hex || hex === colorToHex(working.value).toLowerCase()) return\n working.value = toWorking(hex)\n})\n\n// The space is stated rather than read off the colour, so the gradients cannot drift\n// away from the channels the area and the slider are pinned to.\nconst areaStyle = computed(() =>\n getAreaBackgroundStyle(working.value, 'saturation', 'brightness', 'hsb'),\n)\nconst hueStyle = computed(() => getSliderBackgroundStyle(working.value, 'hue', 'hsb'))\n\nconst swatch = computed(() => (model.value && HEX.test(model.value) ? model.value : null))\n\nconst classes = computed(() => [\n 'wx-color-picker',\n `wx-color-picker--${field.size.value}`,\n {\n [`wx-color-picker--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction commit(value: string | null) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\n/** Typing is free-form; only a complete hex reaches the model. */\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n text.value = value\n if (HEX.test(value)) commit(value.toLowerCase())\n else if (value === '') commit(null)\n}\n\n/** On blur the box either shows a valid colour or goes back to the last one. */\nfunction onBlur() {\n if (text.value === '') {\n commit(null)\n return\n }\n const candidate = text.value.startsWith('#') ? text.value : `#${text.value}`\n if (HEX.test(candidate)) {\n commit(candidate.toLowerCase())\n text.value = candidate.toLowerCase()\n } else {\n text.value = model.value ?? ''\n }\n}\n\n/**\n * The two primitives do not agree on which event carries the new colour: the hue\n * slider reports through `change`, the saturation area through `update:modelValue`.\n * Both are bound on both, and only string payloads are taken — the slider can also\n * hand back a colour object. Committing twice is harmless: an unchanged value is\n * dropped.\n */\nfunction onColor(color: Color) {\n working.value = convertToHsb(color)\n commit(colorToHex(color).toLowerCase())\n}\n\n/** Presets and typing come in as hex and have to be parsed back into the picker. */\nfunction onHex(value: string) {\n const hex = value.toLowerCase()\n working.value = toWorking(hex)\n commit(hex)\n}\n\nfunction clear() {\n commit(null)\n text.value = ''\n}\n\nfunction openPicker() {\n if (!field.disabled.value && !props.readonly) open.value = true\n}\n</script>\n\n<template>\n <popover-root v-model:open=\"open\">\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <popover-anchor as-child>\n <div class=\"wx-color-picker__field\" @click=\"openPicker\">\n <button\n class=\"wx-color-picker__swatch\"\n type=\"button\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel ?? 'Pick a colour'\"\n :style=\"swatch ? { background: swatch } : undefined\"\n :class=\"{ 'is-empty': !swatch }\"\n />\n\n <input\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-color-picker__input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n :value=\"text\"\n :name=\"name\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n @input=\"onInput\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"clearable && swatch && !field.disabled.value\"\n class=\"wx-color-picker__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n ✕\n </button>\n </div>\n </popover-anchor>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content class=\"wx-color-picker__panel\" :side-offset=\"4\" align=\"start\">\n <!-- Channels are stated: the defaults are RGB, which would move the hue as\n the pointer travels and disagree with the gradient drawn underneath. -->\n <color-area-root\n class=\"wx-color-picker__area\"\n color-space=\"hsb\"\n x-channel=\"saturation\"\n y-channel=\"brightness\"\n :model-value=\"working\"\n @update:color=\"onColor\"\n >\n <color-area-area class=\"wx-color-picker__area-surface\" :style=\"areaStyle\">\n <color-area-thumb class=\"wx-color-picker__thumb\" />\n </color-area-area>\n </color-area-root>\n\n <color-slider-root\n class=\"wx-color-picker__hue\"\n color-space=\"hsb\"\n channel=\"hue\"\n :model-value=\"working\"\n @update:color=\"onColor\"\n >\n <color-slider-track class=\"wx-color-picker__hue-track\" :style=\"hueStyle\">\n <color-slider-thumb class=\"wx-color-picker__thumb\" />\n </color-slider-track>\n </color-slider-root>\n\n <div v-if=\"presets.length\" class=\"wx-color-picker__presets\">\n <button\n v-for=\"preset in presets\"\n :key=\"preset\"\n class=\"wx-color-picker__preset\"\n type=\"button\"\n :style=\"{ background: preset }\"\n :aria-label=\"preset\"\n :aria-pressed=\"model === preset\"\n @click=\"onHex(preset)\"\n />\n </div>\n </popover-content>\n </popover-portal>\n </div>\n </popover-root>\n</template>\n\n<style scoped>\n.wx-color-picker {\n display: block;\n width: 100%;\n}\n\n.wx-color-picker__field {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-8) 0 var(--wx-space-6);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-control-md);\n cursor: text;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-color-picker--sm .wx-color-picker__field {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-color-picker--lg .wx-color-picker__field {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-color-picker__field:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-color-picker.is-open .wx-color-picker__field,\n.wx-color-picker__field:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-color-picker--error .wx-color-picker__field {\n border-color: var(--wx-color-danger);\n}\n\n.wx-color-picker--success .wx-color-picker__field {\n border-color: var(--wx-color-success);\n}\n\n.wx-color-picker--warning .wx-color-picker__field {\n border-color: var(--wx-color-warning);\n}\n\n.wx-color-picker.is-disabled .wx-color-picker__field {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-color-picker__swatch {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n/* A chequerboard says \"no colour\" more clearly than an empty box. */\n.wx-color-picker__swatch.is-empty {\n background-image:\n linear-gradient(45deg, var(--wx-bg-fill) 25%, transparent 25%),\n linear-gradient(-45deg, var(--wx-bg-fill) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--wx-bg-fill) 75%),\n linear-gradient(-45deg, transparent 75%, var(--wx-bg-fill) 75%);\n background-size: 8px 8px;\n background-position:\n 0 0,\n 0 4px,\n 4px -4px,\n -4px 0;\n}\n\n.wx-color-picker__input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: var(--wx-font-family-mono);\n font-size: inherit;\n text-transform: lowercase;\n}\n\n.wx-color-picker__input::placeholder {\n color: var(--wx-text-placeholder);\n text-transform: none;\n}\n\n.wx-color-picker__clear {\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n}\n\n.wx-color-picker__clear:hover {\n color: var(--wx-text-default);\n}\n</style>\n\n<style>\n/* Teleported panel. */\n.wx-color-picker__panel {\n z-index: var(--wx-z-index-popover);\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n width: 232px;\n padding: var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n}\n\n.wx-color-picker__area,\n.wx-color-picker__area-surface {\n position: relative;\n width: 100%;\n height: 140px;\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-color-picker__hue {\n position: relative;\n height: 14px;\n}\n\n.wx-color-picker__hue-track {\n /* Reka renders the track as an inline element, where width and height do nothing. */\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: var(--wx-radius-full);\n}\n\n.wx-color-picker__thumb {\n width: 14px;\n height: 14px;\n background: transparent;\n border: 2px solid #fff;\n border-radius: var(--wx-radius-full);\n box-shadow: 0 0 0 1px rgb(0 0 0 / 0.35);\n}\n\n.wx-color-picker__thumb:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 1px rgb(0 0 0 / 0.35),\n var(--wx-ring-focus);\n}\n\n.wx-color-picker__presets {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n}\n\n.wx-color-picker__preset {\n width: 20px;\n height: 20px;\n padding: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n.wx-color-picker__preset[aria-pressed='true'] {\n box-shadow: 0 0 0 2px var(--wx-color-primary);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ContainerProps } from './types'\n\ndefineOptions({ name: 'WxContainer' })\n\nconst props = withDefaults(defineProps<ContainerProps>(), {\n direction: 'vertical',\n fullHeight: false,\n viewport: false,\n as: 'div',\n})\n\nconst classes = computed(() => [\n 'wx-container',\n `wx-container--${props.direction}`,\n {\n 'wx-container--full-height': props.fullHeight,\n 'wx-container--viewport': props.viewport,\n },\n])\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-container {\n display: flex;\n box-sizing: border-box;\n flex: 1 1 auto;\n /*\n * A flex item refuses to shrink below its content by default, which is what makes\n * a scrolling main column overflow the page instead of scrolling inside it.\n */\n min-width: 0;\n min-height: 0;\n background: var(--wx-bg-body);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-container--vertical {\n flex-direction: column;\n}\n\n.wx-container--horizontal {\n flex-direction: row;\n}\n\n.wx-container--full-height {\n /* `dvh` rather than `vh`: on a phone the browser chrome eats the difference. */\n min-height: 100dvh;\n}\n\n/*\n * An application shell rather than a document: the container *is* the viewport, and\n * a column inside it scrolls instead of the page. Without the cap, a `WxMain` marked\n * `scroll` has nothing to scroll against — the container grows with the content, and\n * the pane never overflows, so it never scrolls and the page ends up clipped.\n */\n.wx-container--viewport {\n height: 100dvh;\n max-height: 100dvh;\n overflow: hidden;\n}\n\n/* Nested: an inner container fills the shell it is in rather than the window again. */\n.wx-container--viewport .wx-container--viewport {\n height: auto;\n max-height: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { StatisticProps } from './types'\n\ndefineOptions({ name: 'WxStatistic' })\n\nconst props = withDefaults(defineProps<StatisticProps>(), {\n value: undefined,\n title: undefined,\n precision: undefined,\n locale: undefined,\n grouping: true,\n prefix: undefined,\n suffix: undefined,\n formatter: undefined,\n size: 'md',\n tone: 'strong',\n align: undefined,\n})\n\nconst display = computed(() => {\n if (props.formatter) return props.formatter(props.value)\n if (typeof props.value !== 'number') return props.value ?? ''\n\n /*\n * `Intl` rather than a hand-rolled separator: 268 500 in one locale is 268,500 in\n * another, and an admin panel that ships in several languages should not decide.\n */\n return new Intl.NumberFormat(props.locale, {\n useGrouping: props.grouping,\n minimumFractionDigits: props.precision,\n maximumFractionDigits: props.precision,\n }).format(props.value)\n})\n\nconst classes = computed(() => [\n 'wx-statistic',\n `wx-statistic--${props.size}`,\n `wx-statistic--tone-${props.tone}`,\n { [`wx-statistic--align-${props.align}`]: Boolean(props.align) },\n])\n</script>\n\n<template>\n <div :class=\"classes\">\n <div v-if=\"title || $slots.title\" class=\"wx-statistic__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <div class=\"wx-statistic__value\">\n <span v-if=\"prefix || $slots.prefix\" class=\"wx-statistic__affix\">\n <slot name=\"prefix\">{{ prefix }}</slot>\n </span>\n\n <span class=\"wx-statistic__number\">\n <slot name=\"value\">{{ display }}</slot>\n </span>\n\n <span v-if=\"suffix || $slots.suffix\" class=\"wx-statistic__affix\">\n <slot name=\"suffix\">{{ suffix }}</slot>\n </span>\n </div>\n\n <div v-if=\"$slots.default\" class=\"wx-statistic__footer\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-statistic {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-statistic--align-center {\n text-align: center;\n align-items: center;\n}\n\n.wx-statistic--align-end {\n text-align: end;\n align-items: flex-end;\n}\n\n.wx-statistic--align-start {\n text-align: start;\n align-items: flex-start;\n}\n\n.wx-statistic--align-justify {\n text-align: justify;\n}\n\n.wx-statistic__title {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-statistic--sm .wx-statistic__title {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-statistic__value {\n display: flex;\n align-items: baseline;\n gap: var(--wx-space-4);\n color: var(--wx-statistic-color, var(--wx-text-strong));\n /* Digits of equal width, so a ticking number does not jitter. */\n font-variant-numeric: tabular-nums;\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-statistic--sm .wx-statistic__value {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-statistic--md .wx-statistic__value {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-statistic--lg .wx-statistic__value {\n font-size: var(--wx-font-size-3xl);\n}\n\n.wx-statistic__number {\n min-width: 0;\n}\n\n.wx-statistic__affix {\n color: var(--wx-text-muted);\n font-size: 0.65em;\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-statistic__footer {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n/* tones */\n.wx-statistic--tone-default {\n --wx-statistic-color: var(--wx-text-default);\n}\n\n.wx-statistic--tone-strong {\n --wx-statistic-color: var(--wx-text-strong);\n}\n\n.wx-statistic--tone-muted {\n --wx-statistic-color: var(--wx-text-muted);\n}\n\n.wx-statistic--tone-placeholder {\n --wx-statistic-color: var(--wx-text-placeholder);\n}\n\n.wx-statistic--tone-primary {\n --wx-statistic-color: var(--wx-color-primary);\n}\n\n.wx-statistic--tone-success {\n --wx-statistic-color: var(--wx-color-success-active);\n}\n\n.wx-statistic--tone-warning {\n --wx-statistic-color: var(--wx-color-warning-active);\n}\n\n.wx-statistic--tone-danger {\n --wx-statistic-color: var(--wx-color-danger);\n}\n\n.wx-statistic--tone-info {\n --wx-statistic-color: var(--wx-color-info-active);\n}\n\n.wx-statistic--tone-inverse {\n --wx-statistic-color: var(--wx-text-inverse);\n}\n</style>\n","import type { CountdownTarget } from './types'\n\n/** Largest unit first: each token takes its share of what the previous ones left. */\nconst units: [token: string, ms: number][] = [\n ['DD', 86_400_000],\n ['HH', 3_600_000],\n ['mm', 60_000],\n ['ss', 1_000],\n ['SSS', 1],\n]\n\n/**\n * Renders a span of milliseconds against a pattern of `DD`, `HH`, `mm`, `ss`, `SSS`.\n *\n * Only the tokens the pattern actually contains consume time, so `mm:ss` on two hours\n * prints `120:00` rather than silently dropping the hours. Everything else in the\n * pattern is copied through — mind that a literal word containing a token (`ss` in\n * \"passed\") would be replaced.\n */\nexport function formatCountdown(ms: number, format = 'HH:mm:ss'): string {\n let remaining = Math.max(0, Math.floor(ms))\n let out = format\n\n for (const [token, unit] of units) {\n if (!out.includes(token)) continue\n const value = Math.floor(remaining / unit)\n remaining -= value * unit\n out = out.replace(token, String(value).padStart(token.length, '0'))\n }\n\n return out\n}\n\n/** Normalises whatever the caller passed as a target into a timestamp. */\nexport function toTimestamp(value: CountdownTarget): number {\n if (typeof value === 'number') return value\n if (value instanceof Date) return value.getTime()\n const parsed = Date.parse(value)\n return Number.isNaN(parsed) ? 0 : parsed\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport WxStatistic from '../Statistic/Statistic.vue'\nimport { formatCountdown, toTimestamp } from './format'\nimport type { CountdownEmits, CountdownProps } from './types'\n\ndefineOptions({ name: 'WxCountdown' })\n\nconst props = withDefaults(defineProps<CountdownProps>(), {\n format: 'HH:mm:ss',\n interval: 1000,\n title: undefined,\n prefix: undefined,\n suffix: undefined,\n size: 'md',\n tone: 'strong',\n align: undefined,\n})\n\nconst emit = defineEmits<CountdownEmits>()\n\nconst target = computed(() => toTimestamp(props.value))\nconst remaining = ref(Math.max(0, target.value - Date.now()))\n\nlet timer: ReturnType<typeof setInterval> | undefined\n\nfunction stop() {\n if (timer === undefined) return\n clearInterval(timer)\n timer = undefined\n}\n\nfunction tick() {\n const left = Math.max(0, target.value - Date.now())\n remaining.value = left\n emit('change', left)\n\n /* `finish` fires once: the timer stops before the next tick can repeat it. */\n if (left === 0) {\n stop()\n emit('finish')\n }\n}\n\nfunction start() {\n stop()\n if (remaining.value === 0) return\n timer = setInterval(tick, Math.max(16, props.interval))\n}\n\n/*\n * A new target — or a new tick rate — restarts the clock rather than letting it\n * drift. The value is recomputed either way; the timer only exists once the\n * component is mounted, which is what keeps it off the server: an interval started\n * during SSR is never cleared, and it holds the render process open forever.\n */\nlet running = false\n\nwatch(\n [target, () => props.interval],\n () => {\n remaining.value = Math.max(0, target.value - Date.now())\n if (running) start()\n },\n { immediate: true },\n)\n\nonMounted(() => {\n running = true\n start()\n})\n\nonBeforeUnmount(() => {\n running = false\n stop()\n})\n\nconst text = computed(() => formatCountdown(remaining.value, props.format))\n\ndefineExpose({ remaining })\n</script>\n\n<template>\n <wx-statistic\n class=\"wx-countdown\"\n :value=\"text\"\n :title=\"title\"\n :prefix=\"prefix\"\n :suffix=\"suffix\"\n :size=\"size\"\n :tone=\"tone\"\n :align=\"align\"\n >\n <template v-if=\"$slots.title\" #title><slot name=\"title\" /></template>\n <template v-if=\"$slots.prefix\" #prefix><slot name=\"prefix\" /></template>\n <template v-if=\"$slots.suffix\" #suffix><slot name=\"suffix\" /></template>\n <template v-if=\"$slots.value\" #value\n ><slot name=\"value\" :remaining=\"remaining\" :text=\"text\"\n /></template>\n <template v-if=\"$slots.default\" #default><slot /></template>\n </wx-statistic>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { VueDatePicker } from '@vuepic/vue-datepicker'\nimport { useFormField } from '../../composables/useFormField'\nimport '../../styles/datepicker.css'\nimport type { DatePickerEmits, DatePickerModelValue, DatePickerProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxDatePicker', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<DatePickerProps>(), {\n type: 'date',\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: true,\n minDate: undefined,\n maxDate: undefined,\n seconds: false,\n minutesIncrement: 1,\n is24: true,\n weekStart: 1,\n autoApply: true,\n textInput: false,\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DatePickerEmits>()\n\n/*\n * Every slot is passed straight through to the underlying picker, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates `$slots`, and TypeScript answers that circle by emitting `any` — which\n * takes the props of this component down with it.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst hasTime = computed(() => props.type !== 'date')\n\n/**\n * What the model holds. Defaults match the column types a Laravel migration\n * produces, so the value can go to the API untouched; `'date'` opts out and keeps\n * `Date` objects.\n */\nconst modelType = computed(() => {\n if (props.valueFormat === 'date') return undefined\n if (props.valueFormat) return props.valueFormat\n if (props.type === 'time') return props.seconds ? 'HH:mm:ss' : 'HH:mm'\n if (props.type === 'datetime') return props.seconds ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd HH:mm'\n return 'yyyy-MM-dd'\n})\n\n/** What the field shows. Day-first, because this kit is aimed at European admins. */\nconst displayFormat = computed(() => {\n if (props.format) return props.format\n const time = props.seconds ? 'HH:mm:ss' : 'HH:mm'\n if (props.type === 'time') return time\n if (props.type === 'datetime') return `dd.MM.yyyy ${time}`\n return 'dd.MM.yyyy'\n})\n\n/**\n * The overlay is sized to a calendar (`modeHeight`, 255 by default) so switching\n * between panes does not resize the menu. A time-only picker has no calendar to\n * match, and the default leaves ~150px of empty space around the columns.\n */\nconst config = computed(() => (props.type === 'time' ? { modeHeight: 125 } : undefined))\n\nconst timeConfig = computed(() => ({\n enableTimePicker: hasTime.value,\n enableSeconds: props.seconds,\n is24: props.is24,\n minutesIncrement: props.minutesIncrement,\n}))\n\nconst inputAttrs = computed(() => ({\n id: field.id.value,\n name: props.name,\n clearable: props.clearable,\n // The library reads `state: false` as invalid; leaving it undefined means neutral.\n state: field.status.value === 'error' ? false : undefined,\n 'aria-label': props.ariaLabel,\n 'aria-describedby': field.describedBy.value,\n}))\n\nconst classes = computed(() => [\n 'wx-datepicker',\n `wx-datepicker--${field.size.value}`,\n {\n [`wx-datepicker--${field.status.value}`]: field.status.value !== 'default',\n 'is-disabled': field.disabled.value,\n },\n])\n\nfunction onUpdate(value: DatePickerModelValue) {\n model.value = value\n emit('change', value)\n}\n\nfunction onCleared() {\n model.value = null\n emit('change', null)\n emit('clear')\n}\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <vue-date-picker\n :model-value=\"model\"\n :model-type=\"modelType\"\n :formats=\"{ input: displayFormat }\"\n :time-picker=\"type === 'time'\"\n :time-config=\"timeConfig\"\n :config=\"config\"\n :input-attrs=\"inputAttrs\"\n :ui=\"{ input: 'wx-datepicker__input', menu: 'wx-datepicker__menu' }\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :week-start=\"weekStart\"\n :auto-apply=\"autoApply\"\n :text-input=\"textInput\"\n :teleport=\"teleport\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n v-bind=\"controlAttrs\"\n @update:model-value=\"onUpdate\"\n @cleared=\"onCleared\"\n @open=\"emit('open')\"\n @closed=\"emit('close')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </vue-date-picker>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { VueDatePicker } from '@vuepic/vue-datepicker'\nimport { useFormField } from '../../composables/useFormField'\nimport '../../styles/datepicker.css'\nimport type { DateRangePickerEmits, DateRangePickerModelValue, DateRangePickerProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxDateRangePicker', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<DateRangePickerProps>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: true,\n minDate: undefined,\n maxDate: undefined,\n months: 2,\n weekStart: 1,\n autoApply: true,\n textInput: false,\n teleport: true,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DateRangePickerEmits>()\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DateRangePickerModelValue>({ default: null })\n\nconst field = useFormField(props)\n\nconst modelType = computed(() =>\n props.valueFormat === 'date' ? undefined : (props.valueFormat ?? 'yyyy-MM-dd'),\n)\nconst displayFormat = computed(() => props.format ?? 'dd.MM.yyyy')\n\nconst inputAttrs = computed(() => ({\n id: field.id.value,\n name: props.name,\n clearable: props.clearable,\n state: field.status.value === 'error' ? false : undefined,\n 'aria-label': props.ariaLabel,\n 'aria-describedby': field.describedBy.value,\n}))\n\nconst classes = computed(() => [\n 'wx-datepicker',\n 'wx-datepicker--range',\n `wx-datepicker--${field.size.value}`,\n {\n [`wx-datepicker--${field.status.value}`]: field.status.value !== 'default',\n 'is-disabled': field.disabled.value,\n },\n])\n\n/** The library hands back `null` while only the first date has been picked. */\nfunction onUpdate(value: DateRangePickerModelValue) {\n model.value = value\n emit('change', value)\n}\n\nfunction onCleared() {\n model.value = null\n emit('change', null)\n emit('clear')\n}\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <vue-date-picker\n range\n :model-value=\"model\"\n :model-type=\"modelType\"\n :formats=\"{ input: displayFormat }\"\n :multi-calendars=\"months\"\n :input-attrs=\"inputAttrs\"\n :ui=\"{ input: 'wx-datepicker__input', menu: 'wx-datepicker__menu' }\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :week-start=\"weekStart\"\n :auto-apply=\"autoApply\"\n :text-input=\"textInput\"\n :teleport=\"teleport\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n v-bind=\"controlAttrs\"\n @update:model-value=\"onUpdate\"\n @cleared=\"onCleared\"\n @open=\"emit('open')\"\n @closed=\"emit('close')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </vue-date-picker>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport WxDatePicker from '../DatePicker/DatePicker.vue'\nimport type { DatePickerModelValue, DatePickerProps } from '../DatePicker/types'\n\ndefineOptions({ name: 'WxDateTimePicker' })\n\n/**\n * Every prop defaults to `undefined` on purpose. Vue casts an absent boolean prop\n * to `false`, and this preset forwards its whole prop object — without these the\n * preset would hand `WxDatePicker` an explicit `false` for `is24`, `clearable`,\n * `autoApply` and `teleport`, overriding that component's own defaults. Passing\n * `undefined` lets each default apply as if the prop had never been written.\n */\nwithDefaults(defineProps<Omit<DatePickerProps, 'type'>>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: undefined,\n minDate: undefined,\n maxDate: undefined,\n seconds: undefined,\n minutesIncrement: undefined,\n is24: undefined,\n weekStart: undefined,\n autoApply: undefined,\n textInput: undefined,\n teleport: undefined,\n disabled: undefined,\n readonly: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n</script>\n\n<template>\n <wx-date-picker v-model=\"model\" type=\"datetime\" v-bind=\"$props\">\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </wx-date-picker>\n</template>\n","/**\n * The pieces `WxDialog` and `WxDrawer` have in common: both take a size in pixels or\n * per cent, both can be dragged to a new one, and both can be told to remember it.\n */\n\n/** A number is pixels, however it arrives — `width=\"520\"` in a template is a string. */\nexport function cssLength(value: number | string | undefined): string | undefined {\n if (value === undefined || value === null || value === '') return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? `${value}px` : undefined\n\n const trimmed = value.trim()\n return /^-?\\d+(\\.\\d+)?$/.test(trimmed) ? `${trimmed}px` : trimmed\n}\n\n/**\n * The pixels behind a size prop, when there are any — `'60%'` has none, and a gesture\n * that starts on such a panel has to measure it instead.\n */\nexport function pixelLength(value: number | string | undefined): number | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string') return undefined\n\n const trimmed = value.trim()\n if (!/^-?\\d+(\\.\\d+)?(px)?$/.test(trimmed)) return undefined\n return Number.parseFloat(trimmed)\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), Math.max(min, max))\n}\n\nexport interface PanelMemory<T> {\n read: () => Partial<T> | null\n write: (value: T) => void\n clear: () => void\n}\n\n/**\n * `localStorage`, with every way it can fail treated the same way: remembering a panel's\n * size is a convenience, and a private window or a full quota only costs the default.\n */\nexport function usePanelMemory<T>(prefix: string, key: () => string | undefined): PanelMemory<T> {\n const storageKey = () => {\n const name = key()\n return name ? prefix + name : null\n }\n\n return {\n read() {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(id)\n return raw ? (JSON.parse(raw) as Partial<T>) : null\n } catch {\n // Unavailable, or holding something we did not write.\n return null\n }\n },\n write(value: T) {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return\n try {\n window.localStorage.setItem(id, JSON.stringify(value))\n } catch {\n // A private window or a full quota.\n }\n },\n clear() {\n const id = storageKey()\n if (!id || typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(id)\n } catch {\n // Nothing to undo if it cannot be removed.\n }\n },\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport {\n DialogClose,\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { clamp, cssLength, pixelLength, usePanelMemory } from '../../composables/useOverlayPanel'\nimport type { DialogEmits, DialogLayout, DialogProps } from './types'\n\ndefineOptions({ name: 'WxDialog', inheritAttrs: false })\n\n/*\n * A window over the page: a heading with its actions, a body that scrolls, a row of\n * buttons under it. `WxDrawer` is the same panel anchored to an edge of the screen —\n * reach for that one when what is behind it has to stay visible.\n *\n * What has no appearance of its own — the focus trap, the scroll lock, Escape, the\n * portal, `aria-modal` — comes from Reka's dialog primitive. Everything that can be\n * seen is ours.\n */\nconst props = withDefaults(defineProps<DialogProps>(), {\n title: undefined,\n width: 520,\n height: undefined,\n scroll: 'body',\n stickyFooter: true,\n minWidth: 320,\n minHeight: 200,\n sidebarWidth: 200,\n closable: true,\n closeLabel: 'Close',\n closeOnOverlay: true,\n closeOnEscape: true,\n overlay: true,\n modal: true,\n draggable: false,\n resizable: false,\n persist: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<DialogEmits>()\n\ndefineSlots<{\n /** The control that opens the panel. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The body. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** Next to the heading — badges, or actions that belong to the whole panel. */\n extra?: (props: { close: () => void }) => unknown\n /** A column beside the body. Its presence is what splits the body in two. */\n sidebar?: (props: { close: () => void }) => unknown\n /** A row under the body — where the Save and Cancel go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nconst hasTitle = computed(() => Boolean(props.title || slots.title))\nconst hasHead = computed(() => Boolean(hasTitle.value || slots.extra || props.closable))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\n/* Reka needs a `DialogTitle` to name the panel; without a visible one it is hidden. */\nconst accessibleName = computed(() => props.title ?? props.ariaLabel ?? 'Dialog')\n\n/*\n * A panel taller than the screen is not a panel that can be moved or stretched: the\n * gesture would fight the scroll it sits in, and there is no free space around it to move\n * into. Both are ignored rather than refused, so one prop can turn a dialog into the long\n * kind without having to unpick the rest.\n */\nconst scrollsInPlace = computed(() => props.scroll === 'body')\nconst movable = computed(() => props.draggable && scrollsInPlace.value)\nconst sizable = computed(() => props.resizable && scrollsInPlace.value)\n\n/** Pixels the panel was last left at. Empty until it is dragged, resized or restored. */\nconst layout = ref<DialogLayout>({})\n\nconst memory = usePanelMemory<DialogLayout>('wx-dialog:', () => props.persist)\n\n/*\n * Sizes travel as custom properties rather than as `width` and `height`: the small-screen\n * rules then override them by being a later rule, instead of having to out-shout an\n * inline style with `!important`.\n */\nconst panelVars = computed(() => {\n const vars: Record<string, string> = {}\n\n const width = layout.value.width != null ? `${layout.value.width}px` : cssLength(props.width)\n if (width) vars['--wx-dialog-width'] = width\n\n const height = layout.value.height != null ? `${layout.value.height}px` : cssLength(props.height)\n if (height) vars['--wx-dialog-height'] = height\n\n if (layout.value.x) vars['--wx-dialog-x'] = `${layout.value.x}px`\n if (layout.value.y) vars['--wx-dialog-y'] = `${layout.value.y}px`\n\n const sidebar = cssLength(props.sidebarWidth)\n if (sidebar) vars['--wx-dialog-sidebar-width'] = sidebar\n\n return vars\n})\n\nconst panel = ref<HTMLElement | null>(null)\nconst dragging = ref(false)\nconst resizing = ref(false)\n\n/** The panel as it stood when the pointer went down, so every move is measured once. */\ninterface Gesture {\n kind: 'move' | 'resize'\n pointerX: number\n pointerY: number\n left: number\n top: number\n width: number\n height: number\n x: number\n y: number\n}\n\nlet gesture: Gesture | null = null\n\n/** Room left around the panel when a resize runs into the edge of the screen. */\nconst GUTTER = 32\n\nfunction begin(kind: 'move' | 'resize', event: PointerEvent) {\n /*\n * Touch is left out on purpose: a finger dragging the heading is a finger not\n * scrolling, and on a screen that small the panel fills it anyway.\n */\n if (event.button !== 0 || event.pointerType === 'touch') return\n\n const element = panel.value\n if (!element) return\n\n const rect = element.getBoundingClientRect()\n\n gesture = {\n kind,\n pointerX: event.clientX,\n pointerY: event.clientY,\n left: rect.left,\n top: rect.top,\n /* A panel sized in per cent has no pixels of its own until it is measured. */\n width: rect.width || layout.value.width || pixelLength(props.width) || props.minWidth,\n height: rect.height || layout.value.height || pixelLength(props.height) || props.minHeight,\n x: layout.value.x ?? 0,\n y: layout.value.y ?? 0,\n }\n\n if (kind === 'move') dragging.value = true\n else resizing.value = true\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', end)\n window.addEventListener('pointercancel', end)\n event.preventDefault()\n}\n\nfunction startDrag(event: PointerEvent) {\n if (!movable.value) return\n /* The heading holds the × and whatever `extra` put there; those keep their clicks. */\n const target = event.target as HTMLElement | null\n if (target?.closest('button, a, input, select, textarea, [contenteditable]')) return\n begin('move', event)\n}\n\nfunction startResize(event: PointerEvent) {\n if (!sizable.value) return\n begin('resize', event)\n}\n\nfunction move(event: PointerEvent) {\n if (!gesture) return\n\n const dx = event.clientX - gesture.pointerX\n const dy = event.clientY - gesture.pointerY\n\n if (gesture.kind === 'move') {\n /* Held by its own edges, so the panel cannot be dragged off the screen. */\n const left = clamp(gesture.left + dx, 0, window.innerWidth - gesture.width)\n const top = clamp(gesture.top + dy, 0, window.innerHeight - gesture.height)\n\n layout.value = {\n ...layout.value,\n x: gesture.x + (left - gesture.left),\n y: gesture.y + (top - gesture.top),\n }\n return\n }\n\n const width = clamp(gesture.width + dx, props.minWidth, window.innerWidth - GUTTER)\n const height = clamp(gesture.height + dy, props.minHeight, window.innerHeight - GUTTER)\n\n /*\n * The panel is centred, so it grows by half in each direction. Shifting it by that\n * half pins the top-left corner and leaves only the one under the pointer moving.\n */\n layout.value = {\n width,\n height,\n x: gesture.x + (width - gesture.width) / 2,\n y: gesture.y + (height - gesture.height) / 2,\n }\n}\n\nfunction stopListening() {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', end)\n window.removeEventListener('pointercancel', end)\n}\n\nfunction end() {\n if (!gesture) return\n\n gesture = null\n dragging.value = false\n resizing.value = false\n stopListening()\n\n memory.write(layout.value)\n emit('layout', { ...layout.value })\n}\n\n/** Back to the declared size, in the middle of the screen, and forgotten. */\nfunction reset() {\n layout.value = {}\n memory.clear()\n}\n\nfunction restore() {\n const saved = memory.read()\n if (!saved) return\n\n const next: DialogLayout = {}\n for (const key of ['width', 'height', 'x', 'y'] as const) {\n const value = saved[key]\n if (typeof value === 'number' && Number.isFinite(value)) next[key] = value\n }\n layout.value = next\n}\n\n/*\n * After mount rather than during setup: this renders on a server too, and a panel sized\n * from one machine's `localStorage` would not match the markup the browser hydrates.\n */\nonMounted(restore)\nonBeforeUnmount(stopListening)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n\n emit('close')\n /* Without a key to remember it by, every opening starts from the declared size. */\n if (!props.persist) layout.value = {}\n})\n\nfunction onEscape(event: Event) {\n if (!props.closeOnEscape) event.preventDefault()\n}\n\nfunction onInteractOutside(event: Event) {\n if (!props.closeOnOverlay) event.preventDefault()\n}\n\n/*\n * The wrapper covers the screen, so a click beside the panel is a click inside the\n * dialog as far as Reka is concerned — and in modal mode it gives the wrapper its own\n * `pointer-events: auto`, which the overlay underneath can then never be handed. The\n * space around the panel is therefore closed here, by the element that receives it.\n */\nfunction onViewportPointerDown() {\n if (props.closeOnOverlay) close()\n}\n\ndefineExpose({ close, reset })\n</script>\n\n<template>\n <dialog-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, a menu item,\n a row in a table — and wrapping it in a button of ours would nest one inside another.\n -->\n <dialog-trigger v-if=\"$slots.trigger\" as-child>\n <slot name=\"trigger\" :open=\"open\" />\n </dialog-trigger>\n\n <dialog-portal>\n <dialog-overlay v-if=\"overlay\" class=\"wx-dialog__overlay\" />\n\n <!--\n The content element covers the screen: it centres the panel and gives it room to\n be dragged in. `aria-describedby` is cleared because there is no description —\n Reka warns about a missing one otherwise.\n -->\n <dialog-content\n class=\"wx-dialog__viewport\"\n :class=\"{ 'wx-dialog__viewport--scrolls': !scrollsInPlace }\"\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"onInteractOutside\"\n @mousedown.self=\"onViewportPointerDown\"\n >\n <div\n ref=\"panel\"\n v-bind=\"$attrs\"\n class=\"wx-dialog\"\n :class=\"{\n 'wx-dialog--draggable': movable,\n 'wx-dialog--dragging': dragging,\n 'wx-dialog--resizing': resizing,\n 'wx-dialog--split': hasSidebar,\n 'wx-dialog--long': !scrollsInPlace,\n 'wx-dialog--sticky-foot': !scrollsInPlace && stickyFooter,\n }\"\n :style=\"panelVars\"\n >\n <header v-if=\"hasHead\" class=\"wx-dialog__head\" @pointerdown=\"startDrag\">\n <dialog-title class=\"wx-dialog__title\" :class=\"{ 'wx-sr-only': !hasTitle }\">\n <slot name=\"title\">{{ hasTitle ? title : accessibleName }}</slot>\n </dialog-title>\n\n <div v-if=\"$slots.extra\" class=\"wx-dialog__extra\">\n <slot name=\"extra\" :close=\"close\" />\n </div>\n\n <dialog-close v-if=\"closable\" class=\"wx-dialog__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </dialog-close>\n </header>\n\n <dialog-title v-else class=\"wx-sr-only\">{{ accessibleName }}</dialog-title>\n\n <div class=\"wx-dialog__body\">\n <aside v-if=\"hasSidebar\" class=\"wx-dialog__sidebar\">\n <slot name=\"sidebar\" :close=\"close\" />\n </aside>\n\n <div class=\"wx-dialog__content\">\n <slot :close=\"close\" />\n </div>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-dialog__foot\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <!-- Pointer-only, and hidden with it: a corner this size cannot be hit by a finger. -->\n <div\n v-if=\"sizable\"\n class=\"wx-dialog__grip\"\n aria-hidden=\"true\"\n @pointerdown=\"startResize\"\n />\n </div>\n </dialog-content>\n </dialog-portal>\n </dialog-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-dialog__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-overlay);\n background: var(--wx-bg-overlay);\n}\n\n.wx-dialog__viewport {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-dialog);\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n padding: var(--wx-space-16);\n /*\n * The wrapper only places the panel. Left to itself it would swallow every click\n * beside it, so it lets them through to the overlay — except in modal mode, where Reka\n * writes `pointer-events: auto` back onto it and the wrapper closes the dialog itself.\n */\n pointer-events: none;\n}\n\n/* Reka focuses the content when it opens; the ring belongs on what is inside it. */\n.wx-dialog__viewport:focus,\n.wx-dialog__viewport:focus-visible {\n outline: none;\n}\n\n.wx-dialog {\n /* One set of paddings for the three parts, so the small screens can halve them once. */\n --wx-dialog-pad-x: var(--wx-space-18);\n --wx-dialog-pad-y: var(--wx-space-14);\n --wx-dialog-body-pad: var(--wx-space-18);\n position: relative;\n pointer-events: auto;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: min(var(--wx-dialog-width, 520px), 100%);\n height: var(--wx-dialog-height, auto);\n max-height: 100%;\n translate: var(--wx-dialog-x, 0) var(--wx-dialog-y, 0);\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-md);\n box-shadow: var(--wx-shadow-dialog);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-dialog__head {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-dialog--draggable .wx-dialog__head {\n cursor: grab;\n user-select: none;\n}\n\n.wx-dialog--dragging .wx-dialog__head {\n cursor: grabbing;\n}\n\n/* A gesture that strays over the body would otherwise paint it blue as it goes. */\n.wx-dialog--dragging,\n.wx-dialog--resizing {\n user-select: none;\n}\n\n.wx-dialog__title {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-dialog__extra {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n.wx-dialog__close {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin-right: -6px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-dialog__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-dialog__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The body is the only part that scrolls, so the heading and the buttons stay put however\n * long the content is. Split in two, each column scrolls on its own instead.\n */\n.wx-dialog__body {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n overflow: hidden;\n}\n\n.wx-dialog__content {\n flex: 1 1 auto;\n min-width: 0;\n overflow: auto;\n padding: var(--wx-dialog-body-pad);\n}\n\n.wx-dialog__sidebar {\n flex: 0 0 auto;\n width: var(--wx-dialog-sidebar-width, 200px);\n overflow: auto;\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n background: var(--wx-bg-subtle);\n border-right: 1px solid var(--wx-border-muted);\n border-bottom-left-radius: var(--wx-radius-md);\n}\n\n.wx-dialog__foot {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n padding: var(--wx-dialog-pad-y) var(--wx-dialog-pad-x);\n border-top: 1px solid var(--wx-border-muted);\n}\n\n/*\n * The long kind: the panel is as tall as its content and the wrapper around it scrolls.\n * `margin: auto` rather than `align-items: center` — a centred flex item taller than its\n * container is clipped at the top and cannot be scrolled back to, while an auto margin\n * simply gives up when there is no room left to share.\n */\n.wx-dialog__viewport--scrolls {\n align-items: flex-start;\n overflow-y: auto;\n /* The wrapper is the scroller now, so it has to take its own events. */\n pointer-events: auto;\n}\n\n.wx-dialog--long {\n height: auto;\n max-height: none;\n margin-block: auto;\n translate: none;\n}\n\n.wx-dialog--long .wx-dialog__body,\n.wx-dialog--long .wx-dialog__content,\n.wx-dialog--long .wx-dialog__sidebar {\n overflow: visible;\n}\n\n/*\n * Stuck to the bottom of the screen while the rest of the panel scrolls past it. The\n * background is what makes it a bar rather than a transparent strip over the content, and\n * the rounded corners are the panel's own, borrowed for the moment it rests on them.\n */\n.wx-dialog--long.wx-dialog--sticky-foot .wx-dialog__foot {\n position: sticky;\n bottom: 0;\n z-index: 1;\n background: var(--wx-bg-surface);\n border-bottom-left-radius: var(--wx-radius-md);\n border-bottom-right-radius: var(--wx-radius-md);\n}\n\n.wx-dialog__grip {\n position: absolute;\n right: 0;\n bottom: 0;\n width: 20px;\n height: 20px;\n cursor: nwse-resize;\n touch-action: none;\n}\n\n.wx-dialog__grip::after {\n content: '';\n position: absolute;\n right: 5px;\n bottom: 5px;\n width: 7px;\n height: 7px;\n border-right: 2px solid var(--wx-border-strong);\n border-bottom: 2px solid var(--wx-border-strong);\n opacity: 0.5;\n}\n\n.wx-dialog__grip:hover::after {\n opacity: 1;\n}\n\n@keyframes wx-dialog-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.97);\n }\n}\n\n@keyframes wx-dialog-out {\n to {\n opacity: 0;\n transform: scale(0.98);\n }\n}\n\n@keyframes wx-dialog-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes wx-dialog-fade-out {\n to {\n opacity: 0;\n }\n}\n\n/*\n * The wrapper is what animates, not the panel inside it: Reka waits for the animation on\n * the element it owns before unmounting, and a centred panel scaled from the middle of\n * the screen is a panel scaled from its own middle.\n */\n.wx-dialog__viewport[data-state='open'] {\n animation: wx-dialog-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-dialog__viewport[data-state='closed'] {\n animation: wx-dialog-out var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-dialog__overlay[data-state='open'] {\n animation: wx-dialog-fade-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-dialog__overlay[data-state='closed'] {\n animation: wx-dialog-fade-out var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n/*\n * Small screens: the panel takes what there is, and the remembered size and position go\n * with it — a dialog dragged into a corner on a desktop must not open half off a phone.\n */\n@media (max-width: 640px) {\n .wx-dialog__viewport {\n padding: var(--wx-space-8);\n }\n\n .wx-dialog {\n /* Tighter than on a desktop: every pixel of padding is a line of content lost. */\n --wx-dialog-pad-x: var(--wx-space-12);\n --wx-dialog-pad-y: var(--wx-space-10);\n --wx-dialog-body-pad: var(--wx-space-12);\n width: 100%;\n height: auto;\n translate: none;\n }\n\n .wx-dialog__head {\n gap: var(--wx-space-8);\n }\n\n .wx-dialog--split .wx-dialog__body {\n flex-direction: column;\n overflow: auto;\n }\n\n .wx-dialog--split .wx-dialog__sidebar,\n .wx-dialog--split .wx-dialog__content {\n overflow: visible;\n }\n\n .wx-dialog__sidebar {\n width: auto;\n border-right: none;\n border-bottom: 1px solid var(--wx-border-muted);\n border-radius: 0;\n }\n}\n\n/* Nothing here can be aimed at with a finger. */\n@media (pointer: coarse) {\n .wx-dialog__grip {\n display: none;\n }\n\n .wx-dialog--draggable .wx-dialog__head {\n cursor: default;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-dialog__viewport,\n .wx-dialog__overlay {\n animation: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { DividerProps } from './types'\n\ndefineOptions({ name: 'WxDivider' })\n\nconst props = withDefaults(defineProps<DividerProps>(), {\n direction: 'horizontal',\n variant: 'solid',\n align: 'center',\n spacing: 'md',\n label: undefined,\n})\n\nconst slots = useSlots()\n\n/*\n * A plain rule is a separator and says so; one carrying a label is a small heading\n * in disguise, and `role=\"separator\"` on an element with text confuses a screen\n * reader more than it helps. The note lives here rather than above the template's\n * root element, where a comment would turn the template into a fragment.\n */\nconst hasLabel = computed(() => Boolean(props.label || slots.default))\n\nconst classes = computed(() => [\n 'wx-divider',\n `wx-divider--${props.direction}`,\n `wx-divider--${props.variant}`,\n `wx-divider--spacing-${props.spacing}`,\n {\n 'wx-divider--labelled': hasLabel.value,\n [`wx-divider--align-${props.align}`]: hasLabel.value,\n },\n])\n</script>\n\n<template>\n <div\n :class=\"classes\"\n :role=\"hasLabel ? undefined : 'separator'\"\n :aria-orientation=\"hasLabel || direction === 'horizontal' ? undefined : 'vertical'\"\n >\n <span v-if=\"hasLabel\" class=\"wx-divider__label\">\n <slot>{{ label }}</slot>\n </span>\n </div>\n</template>\n\n<style scoped>\n.wx-divider {\n --wx-divider-color: var(--wx-border-default);\n --wx-divider-style: solid;\n\n box-sizing: border-box;\n border: 0;\n color: var(--wx-text-muted);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-divider--dashed {\n --wx-divider-style: dashed;\n}\n\n.wx-divider--dotted {\n --wx-divider-style: dotted;\n}\n\n/* horizontal */\n.wx-divider--horizontal {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n width: 100%;\n margin-block: var(--wx-divider-gap, var(--wx-space-16));\n}\n\n/*\n * The rule is drawn by the pseudo-elements rather than a border on the box, so a\n * label can sit between two of them without a background of its own — which is what\n * keeps it readable on a card, a table row or a tinted panel alike.\n */\n.wx-divider--horizontal::before,\n.wx-divider--horizontal::after {\n content: '';\n flex: 1 1 auto;\n border-top: 1px var(--wx-divider-style) var(--wx-divider-color);\n}\n\n.wx-divider--horizontal:not(.wx-divider--labelled) {\n /* No label, no gap — the two halves have to meet or the rule shows a notch. */\n gap: 0;\n}\n\n.wx-divider--horizontal:not(.wx-divider--labelled)::after {\n display: none;\n}\n\n.wx-divider--align-start::before {\n flex: 0 0 var(--wx-space-24);\n}\n\n.wx-divider--align-end::after {\n flex: 0 0 var(--wx-space-24);\n}\n\n/* vertical */\n.wx-divider--vertical {\n display: inline-block;\n width: 0;\n height: 1em;\n margin-inline: var(--wx-divider-gap, var(--wx-space-8));\n border-left: 1px var(--wx-divider-style) var(--wx-divider-color);\n vertical-align: middle;\n}\n\n/* A vertical rule never carries a label — there is no room for one. */\n.wx-divider--vertical .wx-divider__label {\n display: none;\n}\n\n.wx-divider--spacing-none {\n --wx-divider-gap: 0px;\n}\n\n.wx-divider--spacing-sm {\n --wx-divider-gap: var(--wx-space-8);\n}\n\n.wx-divider--spacing-md {\n --wx-divider-gap: var(--wx-space-16);\n}\n\n.wx-divider--spacing-lg {\n --wx-divider-gap: var(--wx-space-24);\n}\n\n.wx-divider--vertical.wx-divider--spacing-md {\n --wx-divider-gap: var(--wx-space-8);\n}\n\n.wx-divider--vertical.wx-divider--spacing-lg {\n --wx-divider-gap: var(--wx-space-12);\n}\n\n.wx-divider__label {\n flex: 0 0 auto;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport {\n DialogClose,\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport { clamp, cssLength, pixelLength, usePanelMemory } from '../../composables/useOverlayPanel'\nimport type { DrawerEmits, DrawerLayout, DrawerProps } from './types'\n\ndefineOptions({ name: 'WxDrawer', inheritAttrs: false })\n\n/*\n * The same panel as `WxDialog` — heading, body, footer — anchored to an edge of the\n * screen instead of floating in the middle of it. It is the one to reach for when the\n * page behind it is the point: a record opened beside the table it came from.\n *\n * The dialog primitive underneath is Reka's, so the focus trap, the scroll lock, Escape\n * and `aria-modal` are the same as everywhere else. What can be seen is ours.\n */\nconst props = withDefaults(defineProps<DrawerProps>(), {\n title: undefined,\n side: 'right',\n size: 380,\n minSize: 280,\n sidebarWidth: 200,\n closable: true,\n closeLabel: 'Close',\n closeOnOverlay: true,\n closeOnEscape: true,\n overlay: true,\n modal: true,\n resizable: false,\n persist: undefined,\n ariaLabel: undefined,\n resizeLabel: 'Resize the panel',\n})\n\nconst emit = defineEmits<DrawerEmits>()\n\ndefineSlots<{\n /** The control that opens the panel. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The body. The one part of the panel that scrolls. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** Next to the heading — badges, or actions that belong to the whole panel. */\n extra?: (props: { close: () => void }) => unknown\n /** A column beside the body. Its presence is what splits the body in two. */\n sidebar?: (props: { close: () => void }) => unknown\n /** A row under the body — where the Save and Cancel go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nconst hasTitle = computed(() => Boolean(props.title || slots.title))\nconst hasHead = computed(() => Boolean(hasTitle.value || slots.extra || props.closable))\nconst hasSidebar = computed(() => Boolean(slots.sidebar))\n\n/* Reka needs a `DialogTitle` to name the panel; without a visible one it is hidden. */\nconst accessibleName = computed(() => props.title ?? props.ariaLabel ?? 'Panel')\n\n/** Which way the panel grows: across the screen, or down it. */\nconst horizontal = computed(() => props.side === 'left' || props.side === 'right')\n\n/** Pixels the panel was last left at. Empty until it is resized or restored. */\nconst layout = ref<DrawerLayout>({})\n\nconst memory = usePanelMemory<DrawerLayout>('wx-drawer:', () => props.persist)\n\n/*\n * The size travels as a custom property rather than as `width` or `height`: the\n * small-screen rule then takes the panel full-screen by being a later rule, instead of\n * having to out-shout an inline style with `!important`.\n */\nconst panelVars = computed(() => {\n const vars: Record<string, string> = {}\n\n const size = layout.value.size != null ? `${layout.value.size}px` : cssLength(props.size)\n if (size) vars['--wx-drawer-size'] = size\n\n const sidebar = cssLength(props.sidebarWidth)\n if (sidebar) vars['--wx-drawer-sidebar-width'] = sidebar\n\n return vars\n})\n\nconst resizing = ref(false)\n\n/** Room left between the panel and the far edge of the screen. */\nconst GUTTER = 32\n\n/** The panel as it stood when the gesture began, so every move is measured once. */\nlet gesture: { pointerX: number; pointerY: number; size: number } | null = null\n\n/**\n * The panel around the handle. Taken from the event rather than from a template ref: the\n * panel is a Reka component, and what a ref on one holds is the component, not the box\n * that has to be measured.\n */\nfunction panelOf(event: Event): HTMLElement | null {\n return (event.currentTarget as HTMLElement | null)?.closest('.wx-drawer') ?? null\n}\n\n/** What the panel measures now, falling back to what it was told to be. */\nfunction currentSize(element: HTMLElement | null): number {\n const rect = element?.getBoundingClientRect()\n const measured = horizontal.value ? rect?.width : rect?.height\n /* A panel sized in per cent has no pixels of its own until it is measured. */\n return measured || layout.value.size || pixelLength(props.size) || props.minSize\n}\n\nfunction maxSize(): number {\n const room = horizontal.value ? window.innerWidth : window.innerHeight\n return room - GUTTER\n}\n\n/** Pointer movement, turned into a size: every side grows towards the middle. */\nfunction sizeFrom(startSize: number, dx: number, dy: number): number {\n const delta =\n props.side === 'right' ? -dx : props.side === 'left' ? dx : props.side === 'top' ? dy : -dy\n return clamp(startSize + delta, props.minSize, maxSize())\n}\n\nfunction startResize(event: PointerEvent) {\n /*\n * Touch is left out on purpose: a handle this narrow cannot be aimed at with a finger,\n * and on a screen that small the panel covers everything anyway.\n */\n if (!props.resizable || event.button !== 0 || event.pointerType === 'touch') return\n\n gesture = { pointerX: event.clientX, pointerY: event.clientY, size: currentSize(panelOf(event)) }\n resizing.value = true\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', end)\n window.addEventListener('pointercancel', end)\n event.preventDefault()\n}\n\nfunction move(event: PointerEvent) {\n if (!gesture) return\n\n layout.value = {\n size: sizeFrom(\n gesture.size,\n event.clientX - gesture.pointerX,\n event.clientY - gesture.pointerY,\n ),\n }\n}\n\nfunction stopListening() {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', end)\n window.removeEventListener('pointercancel', end)\n}\n\nfunction end() {\n if (!gesture) return\n\n gesture = null\n resizing.value = false\n stopListening()\n store()\n}\n\n/** The same resize from the keyboard, which is the only way to reach it without a mouse. */\nconst STEP = 24\n\nfunction onHandleKeydown(event: KeyboardEvent) {\n if (!props.resizable) return\n\n const towards = horizontal.value\n ? { ArrowLeft: -STEP, ArrowRight: STEP }\n : { ArrowUp: -STEP, ArrowDown: STEP }\n const delta = (towards as Record<string, number | undefined>)[event.key]\n if (delta === undefined) return\n\n event.preventDefault()\n const from = currentSize(panelOf(event))\n layout.value = {\n size: sizeFrom(from, horizontal.value ? delta : 0, horizontal.value ? 0 : delta),\n }\n store()\n}\n\nfunction store() {\n memory.write(layout.value)\n emit('layout', { ...layout.value })\n}\n\n/** Back to the declared size, and forgotten. */\nfunction reset() {\n layout.value = {}\n memory.clear()\n}\n\nfunction restore() {\n const saved = memory.read()\n if (!saved) return\n if (typeof saved.size === 'number' && Number.isFinite(saved.size)) {\n layout.value = { size: saved.size }\n }\n}\n\n/*\n * After mount rather than during setup: this renders on a server too, and a panel sized\n * from one machine's `localStorage` would not match the markup the browser hydrates.\n */\nonMounted(restore)\nonBeforeUnmount(stopListening)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n\n emit('close')\n /* Without a key to remember it by, every opening starts from the declared size. */\n if (!props.persist) layout.value = {}\n})\n\nfunction onEscape(event: Event) {\n if (!props.closeOnEscape) event.preventDefault()\n}\n\nfunction onInteractOutside(event: Event) {\n if (!props.closeOnOverlay) event.preventDefault()\n}\n\ndefineExpose({ close, reset })\n</script>\n\n<template>\n <dialog-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, a menu item,\n a row in a table — and wrapping it in a button of ours would nest one inside another.\n -->\n <dialog-trigger v-if=\"$slots.trigger\" as-child>\n <slot name=\"trigger\" :open=\"open\" />\n </dialog-trigger>\n\n <dialog-portal>\n <dialog-overlay v-if=\"overlay\" class=\"wx-drawer__overlay\" />\n\n <!--\n Here the content element is the panel itself — nothing has to be centred, and it\n is the element Reka slides in. `aria-describedby` is cleared because there is no\n description; Reka warns about a missing one otherwise.\n -->\n <dialog-content\n v-bind=\"$attrs\"\n class=\"wx-drawer\"\n :class=\"[\n `wx-drawer--${side}`,\n { 'wx-drawer--resizing': resizing, 'wx-drawer--split': hasSidebar },\n ]\"\n :style=\"panelVars\"\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"onInteractOutside\"\n >\n <header v-if=\"hasHead\" class=\"wx-drawer__head\">\n <dialog-title class=\"wx-drawer__title\" :class=\"{ 'wx-sr-only': !hasTitle }\">\n <slot name=\"title\">{{ hasTitle ? title : accessibleName }}</slot>\n </dialog-title>\n\n <div v-if=\"$slots.extra\" class=\"wx-drawer__extra\">\n <slot name=\"extra\" :close=\"close\" />\n </div>\n\n <dialog-close v-if=\"closable\" class=\"wx-drawer__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </dialog-close>\n </header>\n\n <dialog-title v-else class=\"wx-sr-only\">{{ accessibleName }}</dialog-title>\n\n <div class=\"wx-drawer__body\">\n <aside v-if=\"hasSidebar\" class=\"wx-drawer__sidebar\">\n <slot name=\"sidebar\" :close=\"close\" />\n </aside>\n\n <div class=\"wx-drawer__content\">\n <slot :close=\"close\" />\n </div>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-drawer__foot\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <!--\n A separator rather than a decoration: it takes focus and answers the arrow keys,\n which is the only way to resize the panel without a pointer.\n -->\n <div\n v-if=\"resizable\"\n class=\"wx-drawer__handle\"\n role=\"separator\"\n tabindex=\"0\"\n :aria-label=\"resizeLabel\"\n :aria-orientation=\"horizontal ? 'vertical' : 'horizontal'\"\n @pointerdown=\"startResize\"\n @keydown=\"onHandleKeydown\"\n />\n </dialog-content>\n </dialog-portal>\n </dialog-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-drawer__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wx-z-index-overlay);\n background: var(--wx-bg-overlay);\n}\n\n.wx-drawer {\n /* One set of paddings for the three parts, so the small screens can halve them once. */\n --wx-drawer-pad-x: var(--wx-space-18);\n --wx-drawer-pad-y: var(--wx-space-14);\n --wx-drawer-body-pad: var(--wx-space-18);\n position: fixed;\n z-index: var(--wx-z-index-dialog);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n background: var(--wx-bg-surface);\n box-shadow: var(--wx-shadow-dialog);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-md);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-drawer:focus,\n.wx-drawer:focus-visible {\n outline: none;\n}\n\n/*\n * `dvh` rather than `vh`: on a phone the address bar comes and goes, and a panel measured\n * against the taller of the two would keep its footer under it.\n */\n.wx-drawer--left,\n.wx-drawer--right {\n top: 0;\n height: 100dvh;\n width: min(var(--wx-drawer-size, 380px), 100%);\n}\n\n.wx-drawer--right {\n right: 0;\n border-left: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--left {\n left: 0;\n border-right: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--top,\n.wx-drawer--bottom {\n left: 0;\n width: 100%;\n height: min(var(--wx-drawer-size, 380px), 100dvh);\n}\n\n.wx-drawer--top {\n top: 0;\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer--bottom {\n bottom: 0;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-drawer__head {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-drawer__title {\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-drawer__extra {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n.wx-drawer__close {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin-right: -6px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-drawer__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-drawer__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The body is the only part that scrolls: the heading and the buttons stay where they are\n * however long the content is. Split in two, each column scrolls on its own instead.\n */\n.wx-drawer__body {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n overflow: hidden;\n}\n\n.wx-drawer__content {\n flex: 1 1 auto;\n min-width: 0;\n overflow: auto;\n padding: var(--wx-drawer-body-pad);\n}\n\n.wx-drawer__sidebar {\n flex: 0 0 auto;\n width: var(--wx-drawer-sidebar-width, 200px);\n overflow: auto;\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n background: var(--wx-bg-subtle);\n border-right: 1px solid var(--wx-border-muted);\n}\n\n.wx-drawer__foot {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n padding: var(--wx-drawer-pad-y) var(--wx-drawer-pad-x);\n border-top: 1px solid var(--wx-border-muted);\n}\n\n/* The handle sits on the edge the panel faces the page with. */\n.wx-drawer__handle {\n position: absolute;\n touch-action: none;\n background: transparent;\n transition: background var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-drawer__handle:hover,\n.wx-drawer--resizing .wx-drawer__handle {\n background: var(--wx-color-primary-soft);\n}\n\n.wx-drawer__handle:focus-visible {\n outline: none;\n background: var(--wx-color-primary);\n}\n\n.wx-drawer--right .wx-drawer__handle,\n.wx-drawer--left .wx-drawer__handle {\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: col-resize;\n}\n\n.wx-drawer--right .wx-drawer__handle {\n left: 0;\n}\n\n.wx-drawer--left .wx-drawer__handle {\n right: 0;\n}\n\n.wx-drawer--top .wx-drawer__handle,\n.wx-drawer--bottom .wx-drawer__handle {\n left: 0;\n right: 0;\n height: 6px;\n cursor: row-resize;\n}\n\n.wx-drawer--top .wx-drawer__handle {\n bottom: 0;\n}\n\n.wx-drawer--bottom .wx-drawer__handle {\n top: 0;\n}\n\n/*\n * One pair of keyframes for all four sides: the side sets where the panel sits when it is\n * off-screen, and `translate` is a property of its own, so nothing here collides with a\n * `transform` set elsewhere.\n */\n.wx-drawer--right {\n --wx-drawer-from: 100% 0;\n}\n\n.wx-drawer--left {\n --wx-drawer-from: -100% 0;\n}\n\n.wx-drawer--top {\n --wx-drawer-from: 0 -100%;\n}\n\n.wx-drawer--bottom {\n --wx-drawer-from: 0 100%;\n}\n\n@keyframes wx-drawer-in {\n from {\n translate: var(--wx-drawer-from);\n }\n}\n\n@keyframes wx-drawer-out {\n to {\n translate: var(--wx-drawer-from);\n }\n}\n\n@keyframes wx-drawer-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes wx-drawer-fade-out {\n to {\n opacity: 0;\n }\n}\n\n.wx-drawer[data-state='open'] {\n animation: wx-drawer-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer[data-state='closed'] {\n animation: wx-drawer-out var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer__overlay[data-state='open'] {\n animation: wx-drawer-fade-in var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-drawer__overlay[data-state='closed'] {\n animation: wx-drawer-fade-out var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n/*\n * Small screens: a panel that leaves a strip of the page visible is a panel too narrow to\n * work in, so it takes the whole screen — the remembered size with it.\n */\n@media (max-width: 640px) {\n .wx-drawer {\n /* Tighter than on a desktop: every pixel of padding is a line of content lost. */\n --wx-drawer-pad-x: var(--wx-space-12);\n --wx-drawer-pad-y: var(--wx-space-10);\n --wx-drawer-body-pad: var(--wx-space-12);\n inset: 0;\n width: 100%;\n height: 100dvh;\n border: none;\n }\n\n .wx-drawer__head {\n gap: var(--wx-space-8);\n }\n\n .wx-drawer--split .wx-drawer__body {\n flex-direction: column;\n overflow: auto;\n }\n\n .wx-drawer--split .wx-drawer__sidebar,\n .wx-drawer--split .wx-drawer__content {\n overflow: visible;\n }\n\n .wx-drawer__sidebar {\n width: auto;\n border-right: none;\n border-bottom: 1px solid var(--wx-border-muted);\n }\n\n .wx-drawer__handle {\n display: none;\n }\n}\n\n/* A handle six pixels wide cannot be aimed at with a finger. */\n@media (pointer: coarse) {\n .wx-drawer__handle {\n display: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-drawer,\n .wx-drawer__overlay {\n animation: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useDropdown } from '../../composables/useDropdown'\nimport type { DropdownItemEmits, DropdownItemProps } from './types'\n\ndefineOptions({ name: 'WxDropdownItem', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DropdownItemProps>(), {\n icon: undefined,\n href: undefined,\n target: undefined,\n as: undefined,\n tone: 'default',\n active: false,\n disabled: false,\n})\n\nconst emit = defineEmits<DropdownItemEmits>()\n\nconst dropdown = useDropdown()\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n\nconst nativeAttrs = computed(() => {\n if (props.href) {\n return {\n href: props.disabled ? undefined : props.href,\n target: props.target,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n tabindex: props.disabled ? -1 : undefined,\n }\n }\n if (props.as) return { 'aria-disabled': props.disabled ? 'true' : undefined }\n return { type: 'button' as const, disabled: props.disabled }\n})\n\nconst classes = computed(() => [\n 'wx-dropdown-item',\n `wx-dropdown-item--${props.tone}`,\n { 'is-active': props.active, 'is-disabled': props.disabled },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n emit('click', event)\n\n /*\n * The panel closes here as well as on its own click handler: an item rendered\n * outside the dropdown's panel — in a collapsed actions row, say — still behaves.\n */\n if (dropdown?.closeOnSelect()) dropdown.close()\n}\n</script>\n\n<template>\n <component :is=\"tag\" v-bind=\"{ ...nativeAttrs, ...$attrs }\" :class=\"classes\" @click=\"onClick\">\n <span v-if=\"icon || $slots.before\" class=\"wx-dropdown-item__before\">\n <slot name=\"before\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n\n <span class=\"wx-dropdown-item__label\"><slot /></span>\n\n <span v-if=\"$slots.after\" class=\"wx-dropdown-item__after\">\n <slot name=\"after\" />\n </span>\n </component>\n</template>\n\n<style scoped>\n.wx-dropdown-item {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 100%;\n padding: var(--wx-space-6) var(--wx-space-10);\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-dropdown-item-color, var(--wx-text-default));\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-normal);\n text-align: start;\n text-decoration: none;\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-dropdown-item:hover:not(.is-disabled),\n.wx-dropdown-item.is-active {\n background: var(--wx-dropdown-item-bg, var(--wx-bg-fill));\n}\n\n.wx-dropdown-item:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-dropdown-item--default {\n --wx-dropdown-item-color: var(--wx-text-default);\n}\n\n.wx-dropdown-item--default:hover:not(.is-disabled),\n.wx-dropdown-item--default.is-active {\n --wx-dropdown-item-color: var(--wx-color-primary);\n}\n\n.wx-dropdown-item--primary {\n --wx-dropdown-item-color: var(--wx-color-primary);\n --wx-dropdown-item-bg: var(--wx-color-primary-soft);\n}\n\n.wx-dropdown-item--danger {\n --wx-dropdown-item-color: var(--wx-color-danger);\n --wx-dropdown-item-bg: var(--wx-color-danger-soft);\n}\n\n.wx-dropdown-item--success {\n --wx-dropdown-item-color: var(--wx-color-success-active);\n --wx-dropdown-item-bg: var(--wx-color-success-soft);\n}\n\n.wx-dropdown-item--warning {\n --wx-dropdown-item-color: var(--wx-color-warning-active);\n --wx-dropdown-item-bg: var(--wx-color-warning-soft);\n}\n\n.wx-dropdown-item.is-disabled,\n.wx-dropdown-item:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-dropdown-item__before,\n.wx-dropdown-item__after {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n font-size: 16px;\n}\n\n.wx-dropdown-item__after {\n margin-left: auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-dropdown-item__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { EntityCardEmits, EntityCardProps } from './types'\n\ndefineOptions({ name: 'WxEntityCard' })\n\nconst props = withDefaults(defineProps<EntityCardProps>(), {\n title: undefined,\n href: undefined,\n subtitle: undefined,\n image: undefined,\n imageAlt: undefined,\n shape: 'rounded',\n imageSize: undefined,\n meta: () => [],\n size: 'md',\n variant: 'card',\n bordered: false,\n selected: false,\n})\n\nconst emit = defineEmits<EntityCardEmits>()\n\nconst slots = useSlots()\n\nconst defaultImageSize: Record<string, string> = { sm: '32px', md: '44px', lg: '64px' }\n\nconst imageSize = computed(() => {\n if (props.imageSize === undefined) return defaultImageSize[props.size]\n return typeof props.imageSize === 'number' ? `${props.imageSize}px` : props.imageSize\n})\n\nconst hasMedia = computed(() => Boolean(props.image || slots.media))\n\n/** With no picture, the first letter stands in — a list of rows stays aligned. */\nconst initial = computed(() => props.title?.trim().charAt(0).toUpperCase() ?? '')\n\nconst hasMeta = computed(() => Boolean(slots.meta || props.meta.length > 0))\n\nconst classes = computed(() => [\n 'wx-entity-card',\n `wx-entity-card--${props.size}`,\n `wx-entity-card--${props.variant}`,\n {\n 'wx-entity-card--bordered': props.bordered,\n 'is-selected': props.selected,\n },\n])\n</script>\n\n<template>\n <div\n :class=\"classes\"\n :style=\"{ '--wx-entity-card-image': imageSize }\"\n @click=\"emit('click', $event)\"\n >\n <div v-if=\"hasMedia\" class=\"wx-entity-card__media\" :class=\"`wx-entity-card__media--${shape}`\">\n <slot name=\"media\">\n <img :src=\"image\" :alt=\"imageAlt ?? title ?? ''\" class=\"wx-entity-card__image\" />\n </slot>\n </div>\n <div\n v-else-if=\"title\"\n class=\"wx-entity-card__media wx-entity-card__media--empty\"\n :class=\"`wx-entity-card__media--${shape}`\"\n aria-hidden=\"true\"\n >\n {{ initial }}\n </div>\n\n <div class=\"wx-entity-card__body\">\n <component\n :is=\"href ? 'a' : 'span'\"\n v-if=\"title || $slots.title\"\n class=\"wx-entity-card__title\"\n :href=\"href\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </component>\n\n <span v-if=\"subtitle || $slots.subtitle\" class=\"wx-entity-card__subtitle\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </span>\n\n <div v-if=\"hasMeta\" class=\"wx-entity-card__meta\">\n <slot name=\"meta\">\n <span v-for=\"(item, index) in meta\" :key=\"index\" class=\"wx-entity-card__meta-item\">\n <span v-if=\"item.label\" class=\"wx-entity-card__meta-label\">{{ item.label }}:</span>\n <span v-if=\"item.text\" class=\"wx-entity-card__meta-text\">{{ item.text }}</span>\n </span>\n </slot>\n </div>\n\n <div v-if=\"$slots.default\" class=\"wx-entity-card__content\">\n <slot />\n </div>\n </div>\n\n <div v-if=\"$slots.actions\" class=\"wx-entity-card__actions\" @click.stop>\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-entity-card {\n display: flex;\n align-items: center;\n /* Wrapping is what makes a narrow card work: the actions drop to their own line\n instead of squeezing the title into two characters. */\n flex-wrap: wrap;\n gap: var(--wx-space-12);\n box-sizing: border-box;\n padding: var(--wx-entity-card-padding, var(--wx-space-12));\n border: 1px solid transparent;\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-entity-card--sm {\n --wx-entity-card-padding: var(--wx-space-8);\n gap: var(--wx-space-8);\n}\n\n.wx-entity-card--lg {\n --wx-entity-card-padding: var(--wx-space-16);\n gap: var(--wx-space-16);\n}\n\n.wx-entity-card--card {\n background: var(--wx-bg-surface);\n box-shadow: var(--wx-shadow-card);\n}\n\n.wx-entity-card--plain {\n padding: 0;\n background: transparent;\n}\n\n.wx-entity-card--bordered {\n border-color: var(--wx-border-default);\n}\n\n/*\n * A border needs something to enclose: without this a plain card — which drops its\n * padding so it can sit inside another one — glues the thumbnail and the actions to\n * the outline.\n */\n.wx-entity-card--plain.wx-entity-card--bordered,\n.wx-entity-card--plain.is-selected {\n padding: var(--wx-entity-card-padding, var(--wx-space-12));\n}\n\n.wx-entity-card.is-selected {\n border-color: var(--wx-color-primary);\n background: var(--wx-color-primary-soft);\n}\n\n.wx-entity-card__media {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: var(--wx-entity-card-image, 44px);\n height: var(--wx-entity-card-image, 44px);\n overflow: hidden;\n background: var(--wx-bg-fill);\n}\n\n.wx-entity-card__media--rounded {\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-entity-card__media--square {\n border-radius: 0;\n}\n\n.wx-entity-card__media--circle {\n border-radius: var(--wx-radius-full);\n}\n\n.wx-entity-card__media--empty {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n user-select: none;\n}\n\n.wx-entity-card__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.wx-entity-card__body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n /* The basis is the point where the actions wrap; `min-width: 0` is what lets a long\n title be cut rather than stretch the row. */\n flex: 1 1 180px;\n min-width: 0;\n}\n\n.wx-entity-card__title {\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card--sm .wx-entity-card__title {\n font-size: var(--wx-font-size-sm);\n}\n\na.wx-entity-card__title:hover {\n color: var(--wx-text-link);\n}\n\n.wx-entity-card__subtitle {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-12);\n margin-top: 2px;\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-entity-card__meta-item {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-entity-card__meta-label {\n color: var(--wx-text-muted);\n}\n\n.wx-entity-card__meta-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-entity-card__content {\n margin-top: var(--wx-space-8);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-entity-card__actions {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n flex: 0 0 auto;\n margin-left: auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FooterProps } from './types'\n\ndefineOptions({ name: 'WxFooter' })\n\nconst props = withDefaults(defineProps<FooterProps>(), {\n height: undefined,\n bordered: true,\n padding: 'md',\n})\n\nconst height = computed(() => {\n if (props.height === undefined) return undefined\n return typeof props.height === 'number' ? `${props.height}px` : props.height\n})\n\nconst classes = computed(() => [\n 'wx-footer',\n `wx-footer--padding-${props.padding}`,\n { 'wx-footer--bordered': props.bordered },\n])\n</script>\n\n<template>\n <footer :class=\"classes\" :style=\"height ? { '--wx-footer-height': height } : undefined\">\n <slot />\n <!-- The far end of the bar: the copyright, a version, a link to the status page. -->\n <div v-if=\"$slots.end\" class=\"wx-footer__end\">\n <slot name=\"end\" />\n </div>\n </footer>\n</template>\n\n<style scoped>\n.wx-footer {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n box-sizing: border-box;\n flex: 0 0 auto;\n /* No fixed height by default: a footer of links grows with what it holds. */\n min-height: var(--wx-footer-height, 48px);\n padding-block: var(--wx-space-8);\n padding-inline: var(--wx-footer-padding, var(--wx-space-16));\n background: var(--wx-bg-surface);\n color: var(--wx-text-muted);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-footer__end {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n /* Everything before it keeps its place; this group takes the far end. */\n margin-inline-start: auto;\n min-width: 0;\n}\n\n.wx-footer--padding-none {\n --wx-footer-padding: 0px;\n}\n\n.wx-footer--padding-sm {\n --wx-footer-padding: var(--wx-space-6);\n}\n\n/* The same gutter as the header, so the two bars stay a pair. */\n.wx-footer--padding-md {\n --wx-footer-padding: var(--wx-space-10);\n}\n\n.wx-footer--padding-lg {\n --wx-footer-padding: var(--wx-space-16);\n}\n\n.wx-footer--bordered {\n border-top: 1px solid var(--wx-border-default);\n}\n\n/* The same give as the header on a small screen. */\n@media (max-width: 640px) {\n .wx-footer--padding-lg {\n --wx-footer-padding: var(--wx-space-10);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide, toRef } from 'vue'\nimport { formContextKey, type ValidationErrors } from '../../composables/useFormField'\nimport type { FormEmits, FormProps } from './types'\n\ndefineOptions({ name: 'WxForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), {\n errors: undefined,\n disabled: false,\n size: 'md',\n labelPosition: 'top',\n labelWidth: undefined,\n gap: 'md',\n})\n\nconst emit = defineEmits<FormEmits>()\n\nconst errors = computed<ValidationErrors>(() => props.errors ?? {})\n\nprovide(formContextKey, {\n errors,\n disabled: toRef(props, 'disabled'),\n size: toRef(props, 'size'),\n labelPosition: toRef(props, 'labelPosition'),\n labelWidth: toRef(props, 'labelWidth'),\n})\n\n/** Native submit is always prevented: forms here talk to a data adapter, not a URL. */\nfunction onSubmit(event: SubmitEvent) {\n event.preventDefault()\n emit('submit', event)\n}\n\nfunction onReset(event: Event) {\n emit('reset', event)\n}\n</script>\n\n<template>\n <form\n :class=\"['wx-form', `wx-form--gap-${gap}`, `wx-form--label-${labelPosition}`]\"\n novalidate\n @submit=\"onSubmit\"\n @reset=\"onReset\"\n >\n <slot />\n </form>\n</template>\n\n<style scoped>\n.wx-form {\n display: flex;\n flex-direction: column;\n}\n\n.wx-form--gap-sm {\n gap: var(--wx-space-8);\n}\n\n.wx-form--gap-md {\n gap: var(--wx-space-24);\n}\n\n.wx-form--gap-lg {\n gap: var(--wx-space-32);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref } from 'vue'\nimport {\n formContextKey,\n provideFormItem,\n useId,\n type ControlSize,\n type ControlStatus,\n} from '../../composables/useFormField'\nimport type { FormItemProps } from './types'\n\ndefineOptions({ name: 'WxFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), {\n label: undefined,\n name: undefined,\n required: false,\n error: undefined,\n help: undefined,\n disabled: false,\n size: undefined,\n labelWidth: undefined,\n reserveErrorSpace: false,\n})\n\nconst form = inject(formContextKey, null)\n\nconst baseId = useId('wx-field')\nconst errorId = `${baseId}-error`\nconst helpId = `${baseId}-help`\n\n/**\n * Grouped controls (checkbox and radio groups) cannot be targeted by `for`,\n * so they register themselves and the label becomes a plain span instead.\n */\nconst labelMode = ref<'control' | 'group'>('control')\nconst controlId = ref<string>(baseId)\n\nfunction registerLabelTarget(id: string | undefined) {\n if (id === undefined) {\n labelMode.value = 'group'\n return\n }\n labelMode.value = 'control'\n controlId.value = id\n}\n\nconst messages = computed<string[]>(() => {\n if (props.error !== undefined) {\n return Array.isArray(props.error) ? props.error : [props.error]\n }\n if (props.name && form) return form.errors.value[props.name] ?? []\n return []\n})\n\nconst hasError = computed(() => messages.value.length > 0)\nconst status = computed<ControlStatus>(() => (hasError.value ? 'error' : 'default'))\n\n/**\n * Only ever names nodes that are actually rendered — the help text gives way to the\n * error, and a dangling `aria-describedby` is worse than none.\n */\nconst describedBy = computed(() => {\n if (hasError.value) return errorId\n return props.help ? helpId : undefined\n})\n\nconst size = computed<ControlSize | undefined>(() => props.size)\nconst disabled = computed(() => props.disabled)\n\nconst labelWidth = computed(() => props.labelWidth ?? form?.labelWidth.value)\nconst isInline = computed(() => form?.labelPosition.value === 'left')\n\nprovideFormItem({\n id: computed(() => baseId),\n describedBy,\n status,\n disabled,\n size,\n registerLabelTarget,\n})\n\ndefineExpose({ messages, hasError })\n</script>\n\n<template>\n <div\n :class=\"[\n 'wx-form-item',\n { 'wx-form-item--inline': isInline, 'is-error': hasError, 'is-required': required },\n ]\"\n :style=\"isInline && labelWidth ? { '--wx-form-item-label-width': labelWidth } : undefined\"\n >\n <component\n :is=\"labelMode === 'group' ? 'span' : 'label'\"\n v-if=\"label || $slots.label\"\n :id=\"`${baseId}-label`\"\n class=\"wx-form-item__label\"\n :for=\"labelMode === 'group' ? undefined : controlId\"\n >\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"wx-form-item__required\" aria-hidden=\"true\">*</span>\n </component>\n\n <div class=\"wx-form-item__control\">\n <slot />\n\n <p v-if=\"hasError\" :id=\"errorId\" class=\"wx-form-item__error\" role=\"alert\">\n {{ messages[0] }}\n </p>\n <p v-else-if=\"help\" :id=\"helpId\" class=\"wx-form-item__help\">{{ help }}</p>\n <p v-else-if=\"reserveErrorSpace\" class=\"wx-form-item__error\" aria-hidden=\"true\"> </p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-form-item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-form-item--inline {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wx-space-16);\n}\n\n.wx-form-item--inline .wx-form-item__label {\n flex: 0 0 auto;\n width: var(--wx-form-item-label-width, 160px);\n /* Line the label up with the first line of a control's text. */\n padding-top: calc((var(--wx-size-control-md) - 1lh) / 2);\n}\n\n.wx-form-item--inline .wx-form-item__control {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.wx-form-item__label {\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-form-item__required {\n margin-left: var(--wx-space-2);\n color: var(--wx-color-danger);\n}\n\n.wx-form-item__control {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-form-item__error,\n.wx-form-item__help {\n margin: 0;\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-form-item__error {\n color: var(--wx-color-danger);\n}\n\n.wx-form-item__help {\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { HeaderProps } from './types'\n\ndefineOptions({ name: 'WxHeader' })\n\nconst props = withDefaults(defineProps<HeaderProps>(), {\n height: undefined,\n bordered: true,\n sticky: false,\n padding: 'md',\n})\n\nconst height = computed(() => {\n if (props.height === undefined) return undefined\n return typeof props.height === 'number' ? `${props.height}px` : props.height\n})\n\nconst classes = computed(() => [\n 'wx-header',\n `wx-header--padding-${props.padding}`,\n {\n 'wx-header--bordered': props.bordered,\n 'wx-header--sticky': props.sticky,\n },\n])\n</script>\n\n<template>\n <header :class=\"classes\" :style=\"height ? { '--wx-header-height': height } : undefined\">\n <slot />\n <!--\n The far end of the bar, where the user menu and the notifications live. It is a\n group of its own rather than a `margin-inline-start: auto` every admin panel\n would otherwise write for itself — and one everybody would spell differently.\n -->\n <div v-if=\"$slots.end\" class=\"wx-header__end\">\n <slot name=\"end\" />\n </div>\n </header>\n</template>\n\n<style scoped>\n.wx-header {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n box-sizing: border-box;\n flex: 0 0 auto;\n height: var(--wx-header-height, 56px);\n padding-inline: var(--wx-header-padding, var(--wx-space-16));\n background: var(--wx-bg-surface);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-header__end {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n /* Everything before it keeps its place; this group takes the far end. */\n margin-inline-start: auto;\n /*\n * And keeps it. Left to shrink like any other flex item, the account menu is the\n * first thing a wide navigation bar squeezes — it slides under the bar and off the\n * edge of the header. Whatever is short of room, it is not this.\n */\n flex: 0 0 auto;\n}\n\n/*\n * A bar is chrome, not content: it is padded to the gutter the sidebar's icons stand\n * in — 10px, which puts the centre of a 36px control in the header exactly above the\n * centre of the rail below it. A header carrying nothing but a title can take `lg`.\n */\n.wx-header--padding-none {\n --wx-header-padding: 0px;\n}\n\n.wx-header--padding-sm {\n --wx-header-padding: var(--wx-space-6);\n}\n\n.wx-header--padding-md {\n --wx-header-padding: var(--wx-space-10);\n}\n\n.wx-header--padding-lg {\n --wx-header-padding: var(--wx-space-16);\n}\n\n.wx-header--bordered {\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-header--sticky {\n position: sticky;\n top: 0;\n z-index: var(--wx-z-index-sticky);\n}\n\n/* On a phone the bar is mostly the title and one button; the roomy option gives way. */\n@media (max-width: 640px) {\n .wx-header--padding-lg {\n --wx-header-padding: var(--wx-space-10);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { HeadingLevel, HeadingProps, HeadingSize } from './types'\n\ndefineOptions({ name: 'WxHeading' })\n\nconst props = withDefaults(defineProps<HeadingProps>(), {\n level: 2,\n size: undefined,\n tone: 'strong',\n align: undefined,\n truncate: false,\n})\n\n/** What each level looks like when `size` is left alone. */\nconst sizeForLevel: Record<HeadingLevel, HeadingSize> = {\n 1: '3xl',\n 2: '2xl',\n 3: 'xl',\n 4: 'lg',\n 5: 'md',\n 6: 'sm',\n}\n\nconst size = computed(() => props.size ?? sizeForLevel[props.level])\n\nconst classes = computed(() => [\n 'wx-heading',\n `wx-heading--${size.value}`,\n `wx-heading--tone-${props.tone}`,\n {\n [`wx-heading--align-${props.align}`]: Boolean(props.align),\n 'wx-heading--truncate': props.truncate,\n },\n])\n</script>\n\n<template>\n <component :is=\"`h${level}`\" :class=\"classes\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n/*\n * No margin: spacing belongs to the layout around the heading, not to the heading\n * itself. `WxProse` puts the rhythm back for free-flowing content.\n */\n.wx-heading {\n margin: 0;\n color: var(--wx-heading-color, var(--wx-text-strong));\n font-family: var(--wx-font-family-sans);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-wrap: balance;\n}\n\n.wx-heading--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-heading--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-heading--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-heading--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-heading--2xl {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-heading--3xl {\n font-size: var(--wx-font-size-3xl);\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-heading--tone-default {\n --wx-heading-color: var(--wx-text-default);\n}\n\n.wx-heading--tone-strong {\n --wx-heading-color: var(--wx-text-strong);\n}\n\n.wx-heading--tone-muted {\n --wx-heading-color: var(--wx-text-muted);\n}\n\n.wx-heading--tone-placeholder {\n --wx-heading-color: var(--wx-text-placeholder);\n}\n\n.wx-heading--tone-primary {\n --wx-heading-color: var(--wx-color-primary);\n}\n\n.wx-heading--tone-success {\n --wx-heading-color: var(--wx-color-success-active);\n}\n\n.wx-heading--tone-warning {\n --wx-heading-color: var(--wx-color-warning-active);\n}\n\n.wx-heading--tone-danger {\n --wx-heading-color: var(--wx-color-danger);\n}\n\n.wx-heading--tone-info {\n --wx-heading-color: var(--wx-color-info-active);\n}\n\n.wx-heading--tone-inverse {\n --wx-heading-color: var(--wx-text-inverse);\n}\n\n.wx-heading--align-start {\n text-align: start;\n}\n\n.wx-heading--align-center {\n text-align: center;\n}\n\n.wx-heading--align-end {\n text-align: end;\n}\n\n.wx-heading--align-justify {\n text-align: justify;\n}\n\n.wx-heading--truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { IndicatorProps } from './types'\n\ndefineOptions({ name: 'WxIndicator' })\n\nconst props = withDefaults(defineProps<IndicatorProps>(), {\n value: undefined,\n max: 99,\n dot: false,\n showZero: false,\n placement: 'top-right',\n offset: undefined,\n type: 'danger',\n hidden: false,\n label: undefined,\n})\n\nconst slots = useSlots()\n\n/** Without a wrapped element the mark is the whole component — a count in a menu row. */\nconst isAttached = computed(() => Boolean(slots.default))\n\nconst text = computed(() => {\n if (props.dot) return ''\n if (typeof props.value === 'number') {\n return props.value > props.max ? `${props.max}+` : String(props.value)\n }\n return props.value ?? ''\n})\n\nconst visible = computed(() => {\n if (props.hidden) return false\n if (props.dot) return true\n if (props.value === 0) return props.showZero\n return text.value !== ''\n})\n\nconst markClasses = computed(() => [\n 'wx-indicator__mark',\n `wx-indicator__mark--${props.type}`,\n {\n 'wx-indicator__mark--dot': props.dot,\n 'wx-indicator__mark--attached': isAttached.value,\n [`wx-indicator__mark--${props.placement}`]: isAttached.value,\n },\n])\n\nconst markStyle = computed(() => {\n if (!props.offset) return undefined\n const [x, y] = props.offset\n return { '--wx-indicator-offset-x': `${x}px`, '--wx-indicator-offset-y': `${y}px` }\n})\n</script>\n\n<template>\n <span class=\"wx-indicator\" :class=\"{ 'wx-indicator--attached': isAttached }\">\n <slot />\n <span v-if=\"visible\" :class=\"markClasses\" :style=\"markStyle\" :aria-label=\"label\">\n <slot name=\"mark\">{{ text }}</slot>\n </span>\n </span>\n</template>\n\n<style scoped>\n.wx-indicator {\n display: inline-flex;\n vertical-align: middle;\n}\n\n.wx-indicator--attached {\n position: relative;\n}\n\n.wx-indicator__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: var(--wx-radius-full);\n color: var(--wx-indicator-fg);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-xs);\n font-weight: var(--wx-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n background: var(--wx-indicator-bg);\n}\n\n/*\n * The ring is the surface behind the mark, not a fixed white — a counter pinned to a\n * dark sidebar icon needs the sidebar's colour, which callers set on the wrapper.\n */\n.wx-indicator__mark--attached {\n position: absolute;\n z-index: 1;\n border: 2px solid var(--wx-indicator-ring, var(--wx-bg-surface));\n height: 20px;\n min-width: 20px;\n pointer-events: none;\n}\n\n.wx-indicator__mark--top-right {\n top: 0;\n right: 0;\n transform: translate(\n calc(50% + var(--wx-indicator-offset-x, 0px)),\n calc(-50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--top-left {\n top: 0;\n left: 0;\n transform: translate(\n calc(-50% + var(--wx-indicator-offset-x, 0px)),\n calc(-50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--bottom-right {\n bottom: 0;\n right: 0;\n transform: translate(\n calc(50% + var(--wx-indicator-offset-x, 0px)),\n calc(50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--bottom-left {\n bottom: 0;\n left: 0;\n transform: translate(\n calc(-50% + var(--wx-indicator-offset-x, 0px)),\n calc(50% + var(--wx-indicator-offset-y, 0px))\n );\n}\n\n.wx-indicator__mark--dot {\n min-width: 10px;\n width: 10px;\n height: 10px;\n padding: 0;\n}\n\n.wx-indicator__mark--dot.wx-indicator__mark--attached {\n min-width: 12px;\n width: 12px;\n height: 12px;\n}\n\n/* colours */\n.wx-indicator__mark--danger {\n --wx-indicator-bg: var(--wx-color-danger);\n --wx-indicator-fg: var(--wx-color-danger-contrast);\n}\n\n.wx-indicator__mark--primary {\n --wx-indicator-bg: var(--wx-color-primary);\n --wx-indicator-fg: var(--wx-color-primary-contrast);\n}\n\n.wx-indicator__mark--success {\n --wx-indicator-bg: var(--wx-color-success);\n --wx-indicator-fg: var(--wx-color-success-contrast);\n}\n\n.wx-indicator__mark--warning {\n --wx-indicator-bg: var(--wx-color-warning);\n --wx-indicator-fg: var(--wx-color-warning-contrast);\n}\n\n.wx-indicator__mark--info {\n --wx-indicator-bg: var(--wx-color-info);\n --wx-indicator-fg: var(--wx-color-info-contrast);\n}\n\n.wx-indicator__mark--neutral {\n --wx-indicator-bg: var(--wx-bg-fill-hover);\n --wx-indicator-fg: var(--wx-text-default);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { InputEmits, InputModelValue, InputProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxInput', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n size: undefined,\n status: undefined,\n id: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n clearable: false,\n maxlength: undefined,\n showCount: false,\n autocomplete: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<InputEmits>()\n\nconst model = defineModel<InputModelValue>({ default: '' })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst focused = ref(false)\n\nconst currentValue = computed(() => (model.value == null ? '' : String(model.value)))\n\nconst showClear = computed(\n () =>\n props.clearable && !field.disabled.value && !props.readonly && currentValue.value.length > 0,\n)\n\nconst counter = computed(() =>\n props.showCount && props.maxlength ? `${currentValue.value.length}/${props.maxlength}` : null,\n)\n\nconst classes = computed(() => [\n 'wx-input',\n `wx-input--${field.size.value}`,\n {\n [`wx-input--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n },\n])\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n model.value = value\n emit('input', value)\n}\n\nfunction onChange(event: Event) {\n emit('change', (event.target as HTMLInputElement).value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n emit('blur', event)\n}\n\nfunction clear() {\n model.value = ''\n emit('input', '')\n emit('change', '')\n emit('clear')\n inputRef.value?.focus()\n}\n\ndefineExpose({\n focus: () => inputRef.value?.focus(),\n blur: () => inputRef.value?.blur(),\n select: () => inputRef.value?.select(),\n input: inputRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <span v-if=\"$slots.prefix\" class=\"wx-input__affix wx-input__affix--prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"controlAttrs\"\n class=\"wx-input__inner\"\n :type=\"type\"\n :value=\"currentValue\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :maxlength=\"maxlength\"\n :autocomplete=\"autocomplete\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n class=\"wx-input__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click=\"clear\"\n >\n ✕\n </button>\n\n <span v-if=\"counter\" class=\"wx-input__count\">{{ counter }}</span>\n\n <span v-if=\"$slots.suffix\" class=\"wx-input__affix wx-input__affix--suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\n</template>\n\n<style scoped>\n.wx-input {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-input:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n/* The reference marks focus with a tinted border rather than a ring. */\n.wx-input.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-input--sm {\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-10);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-input--md {\n height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-12);\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-input--lg {\n height: var(--wx-size-control-lg);\n padding: 0 var(--wx-space-16);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-input--error,\n.wx-input--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-input--success,\n.wx-input--success.is-focused {\n border-color: var(--wx-color-success);\n}\n\n.wx-input--warning,\n.wx-input--warning.is-focused {\n border-color: var(--wx-color-warning);\n}\n\n.wx-input.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-input__inner {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.wx-input__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-input__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-input__affix,\n.wx-input__count {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n}\n\n.wx-input__count {\n font-size: var(--wx-font-size-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.wx-input__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-input__clear:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { InputNumberEmits, InputNumberModelValue, InputNumberProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxInputNumber', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<InputNumberProps>(), {\n min: undefined,\n max: undefined,\n step: 1,\n precision: undefined,\n controls: true,\n controlsPosition: 'sides',\n wheel: false,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<InputNumberEmits>()\n\nconst model = defineModel<InputNumberModelValue>({ default: null })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst focused = ref(false)\n\n/** Decimals to keep: explicit `precision`, otherwise whatever `step` implies. */\nconst precision = computed(() => {\n if (props.precision !== undefined) return props.precision\n const [, decimals = ''] = String(props.step).split('.')\n return decimals.length\n})\n\n/** Rounds through a scaled integer so 0.1 + 0.2 does not leak into the model. */\nfunction round(value: number): number {\n const factor = 10 ** precision.value\n return Math.round((value + Number.EPSILON) * factor) / factor\n}\n\nfunction clamp(value: number): number {\n let next = value\n if (props.min !== undefined) next = Math.max(next, props.min)\n if (props.max !== undefined) next = Math.min(next, props.max)\n return round(next)\n}\n\nconst current = computed<number | null>(() =>\n typeof model.value === 'number' && Number.isFinite(model.value) ? model.value : null,\n)\n\n/** What the user sees. Kept as text so a half-typed \"-\" or \"1.\" survives. */\nconst display = ref(current.value === null ? '' : current.value.toFixed(precision.value))\n\nwatch(current, (value) => {\n if (focused.value) return\n display.value = value === null ? '' : value.toFixed(precision.value)\n})\n\nconst disabled = computed(() => field.disabled.value)\nconst canDecrease = computed(\n () =>\n !disabled.value &&\n !props.readonly &&\n (props.min === undefined || (current.value ?? 0) > props.min),\n)\nconst canIncrease = computed(\n () =>\n !disabled.value &&\n !props.readonly &&\n (props.max === undefined || (current.value ?? 0) < props.max),\n)\n\nconst classes = computed(() => [\n 'wx-input-number',\n `wx-input-number--${field.size.value}`,\n `wx-input-number--controls-${props.controls ? props.controlsPosition : 'none'}`,\n {\n [`wx-input-number--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': disabled.value,\n },\n])\n\nfunction commit(value: number | null) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\nfunction stepBy(direction: 1 | -1) {\n if (disabled.value || props.readonly) return\n const base = current.value ?? clamp(0)\n const next = clamp(base + direction * props.step)\n commit(next)\n display.value = next.toFixed(precision.value)\n}\n\nfunction onInput(event: Event) {\n display.value = (event.target as HTMLInputElement).value\n const parsed = Number.parseFloat(display.value)\n // While typing, only push through values that already make sense.\n if (display.value === '') commit(null)\n else if (Number.isFinite(parsed)) commit(round(parsed))\n}\n\n/** Clamping and formatting happen on blur, so typing 5 into a min=10 field is possible. */\nfunction normalize() {\n if (display.value.trim() === '') {\n commit(null)\n display.value = ''\n return\n }\n const parsed = Number.parseFloat(display.value)\n if (!Number.isFinite(parsed)) {\n display.value = current.value === null ? '' : current.value.toFixed(precision.value)\n return\n }\n const next = clamp(parsed)\n commit(next)\n display.value = next.toFixed(precision.value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n normalize()\n emit('blur', event)\n}\n\n/**\n * Only ever acts on a focused field, and swallows the scroll while it does — a\n * hovered field must not steal the page's scrolling.\n */\nfunction onWheel(event: WheelEvent) {\n if (!props.wheel || !focused.value || disabled.value || props.readonly) return\n event.preventDefault()\n stepBy(event.deltaY < 0 ? 1 : -1)\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n stepBy(1)\n } else if (event.key === 'ArrowDown') {\n event.preventDefault()\n stepBy(-1)\n } else if (event.key === 'Enter') {\n normalize()\n }\n}\n\ndefineExpose({\n focus: () => inputRef.value?.focus(),\n blur: () => inputRef.value?.blur(),\n increase: () => stepBy(1),\n decrease: () => stepBy(-1),\n input: inputRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <button\n v-if=\"controls\"\n class=\"wx-input-number__button wx-input-number__button--decrease\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Decrease\"\n :disabled=\"!canDecrease\"\n @click=\"stepBy(-1)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 8h9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"controlAttrs\"\n class=\"wx-input-number__inner\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n :name=\"name\"\n :value=\"display\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n role=\"spinbutton\"\n :aria-valuenow=\"current ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n @wheel=\"onWheel\"\n />\n\n <button\n v-if=\"controls\"\n class=\"wx-input-number__button wx-input-number__button--increase\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Increase\"\n :disabled=\"!canIncrease\"\n @click=\"stepBy(1)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 3.5v9M3.5 8h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n</template>\n\n<style scoped>\n.wx-input-number {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n height: var(--wx-size-control-md);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n overflow: hidden;\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-input-number--sm {\n height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-input-number--md {\n height: var(--wx-size-control-md);\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-input-number--lg {\n height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-input-number:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n.wx-input-number.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-input-number--error,\n.wx-input-number--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-input-number--success {\n border-color: var(--wx-color-success);\n}\n\n.wx-input-number--warning {\n border-color: var(--wx-color-warning);\n}\n\n.wx-input-number.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-input-number__inner {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0 var(--wx-space-12);\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n.wx-input-number--controls-none .wx-input-number__inner {\n text-align: left;\n}\n\n.wx-input-number__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-input-number__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-input-number__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: calc(var(--wx-size-control-md) - 8px);\n height: 100%;\n padding: 0;\n background: var(--wx-bg-fill);\n border: none;\n color: var(--wx-text-default);\n cursor: pointer;\n transition: background-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-input-number__button svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-input-number__button:hover:not(:disabled) {\n background: var(--wx-bg-fill-hover);\n color: var(--wx-color-primary);\n}\n\n.wx-input-number__button:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n/*\n * Stacked layout: the DOM order stays decrease → input → increase (which is what a\n * screen reader and the tab order want); grid puts the buttons where they belong.\n */\n.wx-input-number--controls-right {\n display: grid;\n grid-template-columns: 1fr auto;\n grid-template-rows: 1fr 1fr;\n}\n\n.wx-input-number--controls-right .wx-input-number__inner {\n grid-column: 1;\n grid-row: 1 / span 2;\n text-align: left;\n}\n\n.wx-input-number--controls-right .wx-input-number__button {\n width: calc(var(--wx-size-control-md) - 16px);\n height: 100%;\n border-left: 1px solid var(--wx-border-default);\n}\n\n.wx-input-number--controls-right .wx-input-number__button--increase {\n grid-column: 2;\n grid-row: 1;\n}\n\n.wx-input-number--controls-right .wx-input-number__button--decrease {\n grid-column: 2;\n grid-row: 2;\n border-top: 1px solid var(--wx-border-default);\n}\n</style>\n","var an = Object.defineProperty;\nvar Pe = Object.getOwnPropertySymbols;\nvar yt = Object.prototype.hasOwnProperty, wt = Object.prototype.propertyIsEnumerable;\nvar bt = (t, e, n) => e in t ? an(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n, fe = (t, e) => {\n for (var n in e || (e = {}))\n yt.call(e, n) && bt(t, n, e[n]);\n if (Pe)\n for (var n of Pe(e))\n wt.call(e, n) && bt(t, n, e[n]);\n return t;\n};\nvar $e = (t, e) => {\n var n = {};\n for (var o in t)\n yt.call(t, o) && e.indexOf(o) < 0 && (n[o] = t[o]);\n if (t != null && Pe)\n for (var o of Pe(t))\n e.indexOf(o) < 0 && wt.call(t, o) && (n[o] = t[o]);\n return n;\n};\nimport { getCurrentInstance as dt, unref as U, watch as ln, onUnmounted as sn, onMounted as un, nextTick as kt, isRef as qe, defineComponent as cn, computed as Et, toRefs as fn, ref as dn, reactive as hn, h as pn, isProxy as gn } from \"vue\";\nconst Ht = \"[vue-draggable-plus]: \";\nfunction mn(t) {\n console.warn(Ht + t);\n}\nfunction vn(t) {\n console.error(Ht + t);\n}\nfunction St(t, e, n) {\n return n >= 0 && n < t.length && t.splice(n, 0, t.splice(e, 1)[0]), t;\n}\nfunction bn(t) {\n return t.replace(/-(\\w)/g, (e, n) => n ? n.toUpperCase() : \"\");\n}\nfunction yn(t) {\n return Object.keys(t).reduce((e, n) => (typeof t[n] != \"undefined\" && (e[bn(n)] = t[n]), e), {});\n}\nfunction Dt(t, e) {\n return Array.isArray(t) && t.splice(e, 1), t;\n}\nfunction _t(t, e, n) {\n return Array.isArray(t) && t.splice(e, 0, n), t;\n}\nfunction wn(t) {\n return typeof t == \"undefined\";\n}\nfunction En(t) {\n return typeof t == \"string\";\n}\nfunction Tt(t, e, n) {\n const o = t.children[n];\n t.insertBefore(e, o);\n}\nfunction Ke(t) {\n t.parentNode && t.parentNode.removeChild(t);\n}\nfunction Sn(t, e = document) {\n var o;\n let n = null;\n return typeof (e == null ? void 0 : e.querySelector) == \"function\" ? n = (o = e == null ? void 0 : e.querySelector) == null ? void 0 : o.call(e, t) : n = document.querySelector(t), n || mn(`Element not found: ${t}`), n;\n}\nfunction Dn(t, e, n = null) {\n return function(...o) {\n return t.apply(n, o), e.apply(n, o);\n };\n}\nfunction _n(t, e) {\n const n = fe({}, t);\n return Object.keys(e).forEach((o) => {\n n[o] ? n[o] = Dn(t[o], e[o]) : n[o] = e[o];\n }), n;\n}\nfunction Tn(t) {\n return t instanceof HTMLElement;\n}\nfunction Ct(t, e) {\n Object.keys(t).forEach((n) => {\n e(n, t[n]);\n });\n}\nfunction Cn(t) {\n return t.charCodeAt(0) === 111 && t.charCodeAt(1) === 110 && (t.charCodeAt(2) > 122 || t.charCodeAt(2) < 97);\n}\nconst On = Object.assign;\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction Ot(t, e) {\n var n = Object.keys(t);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(t);\n e && (o = o.filter(function(r) {\n return Object.getOwnPropertyDescriptor(t, r).enumerable;\n })), n.push.apply(n, o);\n }\n return n;\n}\nfunction ne(t) {\n for (var e = 1; e < arguments.length; e++) {\n var n = arguments[e] != null ? arguments[e] : {};\n e % 2 ? Ot(Object(n), !0).forEach(function(o) {\n In(t, o, n[o]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : Ot(Object(n)).forEach(function(o) {\n Object.defineProperty(t, o, Object.getOwnPropertyDescriptor(n, o));\n });\n }\n return t;\n}\nfunction Ye(t) {\n \"@babel/helpers - typeof\";\n return typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\" ? Ye = function(e) {\n return typeof e;\n } : Ye = function(e) {\n return e && typeof Symbol == \"function\" && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n }, Ye(t);\n}\nfunction In(t, e, n) {\n return e in t ? Object.defineProperty(t, e, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : t[e] = n, t;\n}\nfunction ie() {\n return ie = Object.assign || function(t) {\n for (var e = 1; e < arguments.length; e++) {\n var n = arguments[e];\n for (var o in n)\n Object.prototype.hasOwnProperty.call(n, o) && (t[o] = n[o]);\n }\n return t;\n }, ie.apply(this, arguments);\n}\nfunction An(t, e) {\n if (t == null)\n return {};\n var n = {}, o = Object.keys(t), r, i;\n for (i = 0; i < o.length; i++)\n r = o[i], !(e.indexOf(r) >= 0) && (n[r] = t[r]);\n return n;\n}\nfunction xn(t, e) {\n if (t == null)\n return {};\n var n = An(t, e), o, r;\n if (Object.getOwnPropertySymbols) {\n var i = Object.getOwnPropertySymbols(t);\n for (r = 0; r < i.length; r++)\n o = i[r], !(e.indexOf(o) >= 0) && Object.prototype.propertyIsEnumerable.call(t, o) && (n[o] = t[o]);\n }\n return n;\n}\nvar Nn = \"1.15.2\";\nfunction re(t) {\n if (typeof window != \"undefined\" && window.navigator)\n return !!/* @__PURE__ */ navigator.userAgent.match(t);\n}\nvar ae = re(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i), xe = re(/Edge/i), It = re(/firefox/i), Te = re(/safari/i) && !re(/chrome/i) && !re(/android/i), Lt = re(/iP(ad|od|hone)/i), Wt = re(/chrome/i) && re(/android/i), Gt = {\n capture: !1,\n passive: !1\n};\nfunction S(t, e, n) {\n t.addEventListener(e, n, !ae && Gt);\n}\nfunction E(t, e, n) {\n t.removeEventListener(e, n, !ae && Gt);\n}\nfunction We(t, e) {\n if (e) {\n if (e[0] === \">\" && (e = e.substring(1)), t)\n try {\n if (t.matches)\n return t.matches(e);\n if (t.msMatchesSelector)\n return t.msMatchesSelector(e);\n if (t.webkitMatchesSelector)\n return t.webkitMatchesSelector(e);\n } catch (n) {\n return !1;\n }\n return !1;\n }\n}\nfunction Pn(t) {\n return t.host && t !== document && t.host.nodeType ? t.host : t.parentNode;\n}\nfunction Q(t, e, n, o) {\n if (t) {\n n = n || document;\n do {\n if (e != null && (e[0] === \">\" ? t.parentNode === n && We(t, e) : We(t, e)) || o && t === n)\n return t;\n if (t === n)\n break;\n } while (t = Pn(t));\n }\n return null;\n}\nvar At = /\\s+/g;\nfunction V(t, e, n) {\n if (t && e)\n if (t.classList)\n t.classList[n ? \"add\" : \"remove\"](e);\n else {\n var o = (\" \" + t.className + \" \").replace(At, \" \").replace(\" \" + e + \" \", \" \");\n t.className = (o + (n ? \" \" + e : \"\")).replace(At, \" \");\n }\n}\nfunction h(t, e, n) {\n var o = t && t.style;\n if (o) {\n if (n === void 0)\n return document.defaultView && document.defaultView.getComputedStyle ? n = document.defaultView.getComputedStyle(t, \"\") : t.currentStyle && (n = t.currentStyle), e === void 0 ? n : n[e];\n !(e in o) && e.indexOf(\"webkit\") === -1 && (e = \"-webkit-\" + e), o[e] = n + (typeof n == \"string\" ? \"\" : \"px\");\n }\n}\nfunction ye(t, e) {\n var n = \"\";\n if (typeof t == \"string\")\n n = t;\n else\n do {\n var o = h(t, \"transform\");\n o && o !== \"none\" && (n = o + \" \" + n);\n } while (!e && (t = t.parentNode));\n var r = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n return r && new r(n);\n}\nfunction jt(t, e, n) {\n if (t) {\n var o = t.getElementsByTagName(e), r = 0, i = o.length;\n if (n)\n for (; r < i; r++)\n n(o[r], r);\n return o;\n }\n return [];\n}\nfunction te() {\n var t = document.scrollingElement;\n return t || document.documentElement;\n}\nfunction P(t, e, n, o, r) {\n if (!(!t.getBoundingClientRect && t !== window)) {\n var i, a, l, s, u, d, f;\n if (t !== window && t.parentNode && t !== te() ? (i = t.getBoundingClientRect(), a = i.top, l = i.left, s = i.bottom, u = i.right, d = i.height, f = i.width) : (a = 0, l = 0, s = window.innerHeight, u = window.innerWidth, d = window.innerHeight, f = window.innerWidth), (e || n) && t !== window && (r = r || t.parentNode, !ae))\n do\n if (r && r.getBoundingClientRect && (h(r, \"transform\") !== \"none\" || n && h(r, \"position\") !== \"static\")) {\n var m = r.getBoundingClientRect();\n a -= m.top + parseInt(h(r, \"border-top-width\")), l -= m.left + parseInt(h(r, \"border-left-width\")), s = a + i.height, u = l + i.width;\n break;\n }\n while (r = r.parentNode);\n if (o && t !== window) {\n var y = ye(r || t), b = y && y.a, w = y && y.d;\n y && (a /= w, l /= b, f /= b, d /= w, s = a + d, u = l + f);\n }\n return {\n top: a,\n left: l,\n bottom: s,\n right: u,\n width: f,\n height: d\n };\n }\n}\nfunction xt(t, e, n) {\n for (var o = ce(t, !0), r = P(t)[e]; o; ) {\n var i = P(o)[n], a = void 0;\n if (a = r >= i, !a)\n return o;\n if (o === te())\n break;\n o = ce(o, !1);\n }\n return !1;\n}\nfunction we(t, e, n, o) {\n for (var r = 0, i = 0, a = t.children; i < a.length; ) {\n if (a[i].style.display !== \"none\" && a[i] !== p.ghost && (o || a[i] !== p.dragged) && Q(a[i], n.draggable, t, !1)) {\n if (r === e)\n return a[i];\n r++;\n }\n i++;\n }\n return null;\n}\nfunction ht(t, e) {\n for (var n = t.lastElementChild; n && (n === p.ghost || h(n, \"display\") === \"none\" || e && !We(n, e)); )\n n = n.previousElementSibling;\n return n || null;\n}\nfunction J(t, e) {\n var n = 0;\n if (!t || !t.parentNode)\n return -1;\n for (; t = t.previousElementSibling; )\n t.nodeName.toUpperCase() !== \"TEMPLATE\" && t !== p.clone && (!e || We(t, e)) && n++;\n return n;\n}\nfunction Nt(t) {\n var e = 0, n = 0, o = te();\n if (t)\n do {\n var r = ye(t), i = r.a, a = r.d;\n e += t.scrollLeft * i, n += t.scrollTop * a;\n } while (t !== o && (t = t.parentNode));\n return [e, n];\n}\nfunction Mn(t, e) {\n for (var n in t)\n if (t.hasOwnProperty(n)) {\n for (var o in e)\n if (e.hasOwnProperty(o) && e[o] === t[n][o])\n return Number(n);\n }\n return -1;\n}\nfunction ce(t, e) {\n if (!t || !t.getBoundingClientRect)\n return te();\n var n = t, o = !1;\n do\n if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) {\n var r = h(n);\n if (n.clientWidth < n.scrollWidth && (r.overflowX == \"auto\" || r.overflowX == \"scroll\") || n.clientHeight < n.scrollHeight && (r.overflowY == \"auto\" || r.overflowY == \"scroll\")) {\n if (!n.getBoundingClientRect || n === document.body)\n return te();\n if (o || e)\n return n;\n o = !0;\n }\n }\n while (n = n.parentNode);\n return te();\n}\nfunction Fn(t, e) {\n if (t && e)\n for (var n in e)\n e.hasOwnProperty(n) && (t[n] = e[n]);\n return t;\n}\nfunction Je(t, e) {\n return Math.round(t.top) === Math.round(e.top) && Math.round(t.left) === Math.round(e.left) && Math.round(t.height) === Math.round(e.height) && Math.round(t.width) === Math.round(e.width);\n}\nvar Ce;\nfunction zt(t, e) {\n return function() {\n if (!Ce) {\n var n = arguments, o = this;\n n.length === 1 ? t.call(o, n[0]) : t.apply(o, n), Ce = setTimeout(function() {\n Ce = void 0;\n }, e);\n }\n };\n}\nfunction Rn() {\n clearTimeout(Ce), Ce = void 0;\n}\nfunction Ut(t, e, n) {\n t.scrollLeft += e, t.scrollTop += n;\n}\nfunction Vt(t) {\n var e = window.Polymer, n = window.jQuery || window.Zepto;\n return e && e.dom ? e.dom(t).cloneNode(!0) : n ? n(t).clone(!0)[0] : t.cloneNode(!0);\n}\nfunction $t(t, e, n) {\n var o = {};\n return Array.from(t.children).forEach(function(r) {\n var i, a, l, s;\n if (!(!Q(r, e.draggable, t, !1) || r.animated || r === n)) {\n var u = P(r);\n o.left = Math.min((i = o.left) !== null && i !== void 0 ? i : 1 / 0, u.left), o.top = Math.min((a = o.top) !== null && a !== void 0 ? a : 1 / 0, u.top), o.right = Math.max((l = o.right) !== null && l !== void 0 ? l : -1 / 0, u.right), o.bottom = Math.max((s = o.bottom) !== null && s !== void 0 ? s : -1 / 0, u.bottom);\n }\n }), o.width = o.right - o.left, o.height = o.bottom - o.top, o.x = o.left, o.y = o.top, o;\n}\nvar q = \"Sortable\" + (/* @__PURE__ */ new Date()).getTime();\nfunction Xn() {\n var t = [], e;\n return {\n captureAnimationState: function() {\n if (t = [], !!this.options.animation) {\n var o = [].slice.call(this.el.children);\n o.forEach(function(r) {\n if (!(h(r, \"display\") === \"none\" || r === p.ghost)) {\n t.push({\n target: r,\n rect: P(r)\n });\n var i = ne({}, t[t.length - 1].rect);\n if (r.thisAnimationDuration) {\n var a = ye(r, !0);\n a && (i.top -= a.f, i.left -= a.e);\n }\n r.fromRect = i;\n }\n });\n }\n },\n addAnimationState: function(o) {\n t.push(o);\n },\n removeAnimationState: function(o) {\n t.splice(Mn(t, {\n target: o\n }), 1);\n },\n animateAll: function(o) {\n var r = this;\n if (!this.options.animation) {\n clearTimeout(e), typeof o == \"function\" && o();\n return;\n }\n var i = !1, a = 0;\n t.forEach(function(l) {\n var s = 0, u = l.target, d = u.fromRect, f = P(u), m = u.prevFromRect, y = u.prevToRect, b = l.rect, w = ye(u, !0);\n w && (f.top -= w.f, f.left -= w.e), u.toRect = f, u.thisAnimationDuration && Je(m, f) && !Je(d, f) && // Make sure animatingRect is on line between toRect & fromRect\n (b.top - f.top) / (b.left - f.left) === (d.top - f.top) / (d.left - f.left) && (s = Bn(b, m, y, r.options)), Je(f, d) || (u.prevFromRect = d, u.prevToRect = f, s || (s = r.options.animation), r.animate(u, b, f, s)), s && (i = !0, a = Math.max(a, s), clearTimeout(u.animationResetTimer), u.animationResetTimer = setTimeout(function() {\n u.animationTime = 0, u.prevFromRect = null, u.fromRect = null, u.prevToRect = null, u.thisAnimationDuration = null;\n }, s), u.thisAnimationDuration = s);\n }), clearTimeout(e), i ? e = setTimeout(function() {\n typeof o == \"function\" && o();\n }, a) : typeof o == \"function\" && o(), t = [];\n },\n animate: function(o, r, i, a) {\n if (a) {\n h(o, \"transition\", \"\"), h(o, \"transform\", \"\");\n var l = ye(this.el), s = l && l.a, u = l && l.d, d = (r.left - i.left) / (s || 1), f = (r.top - i.top) / (u || 1);\n o.animatingX = !!d, o.animatingY = !!f, h(o, \"transform\", \"translate3d(\" + d + \"px,\" + f + \"px,0)\"), this.forRepaintDummy = Yn(o), h(o, \"transition\", \"transform \" + a + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\")), h(o, \"transform\", \"translate3d(0,0,0)\"), typeof o.animated == \"number\" && clearTimeout(o.animated), o.animated = setTimeout(function() {\n h(o, \"transition\", \"\"), h(o, \"transform\", \"\"), o.animated = !1, o.animatingX = !1, o.animatingY = !1;\n }, a);\n }\n }\n };\n}\nfunction Yn(t) {\n return t.offsetWidth;\n}\nfunction Bn(t, e, n, o) {\n return Math.sqrt(Math.pow(e.top - t.top, 2) + Math.pow(e.left - t.left, 2)) / Math.sqrt(Math.pow(e.top - n.top, 2) + Math.pow(e.left - n.left, 2)) * o.animation;\n}\nvar ge = [], Ze = {\n initializeByDefault: !0\n}, Ne = {\n mount: function(e) {\n for (var n in Ze)\n Ze.hasOwnProperty(n) && !(n in e) && (e[n] = Ze[n]);\n ge.forEach(function(o) {\n if (o.pluginName === e.pluginName)\n throw \"Sortable: Cannot mount plugin \".concat(e.pluginName, \" more than once\");\n }), ge.push(e);\n },\n pluginEvent: function(e, n, o) {\n var r = this;\n this.eventCanceled = !1, o.cancel = function() {\n r.eventCanceled = !0;\n };\n var i = e + \"Global\";\n ge.forEach(function(a) {\n n[a.pluginName] && (n[a.pluginName][i] && n[a.pluginName][i](ne({\n sortable: n\n }, o)), n.options[a.pluginName] && n[a.pluginName][e] && n[a.pluginName][e](ne({\n sortable: n\n }, o)));\n });\n },\n initializePlugins: function(e, n, o, r) {\n ge.forEach(function(l) {\n var s = l.pluginName;\n if (!(!e.options[s] && !l.initializeByDefault)) {\n var u = new l(e, n, e.options);\n u.sortable = e, u.options = e.options, e[s] = u, ie(o, u.defaults);\n }\n });\n for (var i in e.options)\n if (e.options.hasOwnProperty(i)) {\n var a = this.modifyOption(e, i, e.options[i]);\n typeof a != \"undefined\" && (e.options[i] = a);\n }\n },\n getEventProperties: function(e, n) {\n var o = {};\n return ge.forEach(function(r) {\n typeof r.eventProperties == \"function\" && ie(o, r.eventProperties.call(n[r.pluginName], e));\n }), o;\n },\n modifyOption: function(e, n, o) {\n var r;\n return ge.forEach(function(i) {\n e[i.pluginName] && i.optionListeners && typeof i.optionListeners[n] == \"function\" && (r = i.optionListeners[n].call(e[i.pluginName], o));\n }), r;\n }\n};\nfunction kn(t) {\n var e = t.sortable, n = t.rootEl, o = t.name, r = t.targetEl, i = t.cloneEl, a = t.toEl, l = t.fromEl, s = t.oldIndex, u = t.newIndex, d = t.oldDraggableIndex, f = t.newDraggableIndex, m = t.originalEvent, y = t.putSortable, b = t.extraEventProperties;\n if (e = e || n && n[q], !!e) {\n var w, L = e.options, G = \"on\" + o.charAt(0).toUpperCase() + o.substr(1);\n window.CustomEvent && !ae && !xe ? w = new CustomEvent(o, {\n bubbles: !0,\n cancelable: !0\n }) : (w = document.createEvent(\"Event\"), w.initEvent(o, !0, !0)), w.to = a || n, w.from = l || n, w.item = r || n, w.clone = i, w.oldIndex = s, w.newIndex = u, w.oldDraggableIndex = d, w.newDraggableIndex = f, w.originalEvent = m, w.pullMode = y ? y.lastPutMode : void 0;\n var R = ne(ne({}, b), Ne.getEventProperties(o, e));\n for (var j in R)\n w[j] = R[j];\n n && n.dispatchEvent(w), L[G] && L[G].call(e, w);\n }\n}\nvar Hn = [\"evt\"], z = function(e, n) {\n var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, i = xn(o, Hn);\n Ne.pluginEvent.bind(p)(e, n, ne({\n dragEl: c,\n parentEl: O,\n ghostEl: g,\n rootEl: T,\n nextEl: pe,\n lastDownEl: Be,\n cloneEl: C,\n cloneHidden: ue,\n dragStarted: Se,\n putSortable: Y,\n activeSortable: p.active,\n originalEvent: r,\n oldIndex: be,\n oldDraggableIndex: Oe,\n newIndex: $,\n newDraggableIndex: se,\n hideGhostForTarget: Zt,\n unhideGhostForTarget: Qt,\n cloneNowHidden: function() {\n ue = !0;\n },\n cloneNowShown: function() {\n ue = !1;\n },\n dispatchSortableEvent: function(l) {\n W({\n sortable: n,\n name: l,\n originalEvent: r\n });\n }\n }, i));\n};\nfunction W(t) {\n kn(ne({\n putSortable: Y,\n cloneEl: C,\n targetEl: c,\n rootEl: T,\n oldIndex: be,\n oldDraggableIndex: Oe,\n newIndex: $,\n newDraggableIndex: se\n }, t));\n}\nvar c, O, g, T, pe, Be, C, ue, be, $, Oe, se, Me, Y, ve = !1, Ge = !1, je = [], de, Z, Qe, et, Pt, Mt, Se, me, Ie, Ae = !1, Fe = !1, ke, H, tt = [], lt = !1, ze = [], Ve = typeof document != \"undefined\", Re = Lt, Ft = xe || ae ? \"cssFloat\" : \"float\", Ln = Ve && !Wt && !Lt && \"draggable\" in document.createElement(\"div\"), qt = function() {\n if (Ve) {\n if (ae)\n return !1;\n var t = document.createElement(\"x\");\n return t.style.cssText = \"pointer-events:auto\", t.style.pointerEvents === \"auto\";\n }\n}(), Kt = function(e, n) {\n var o = h(e), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), i = we(e, 0, n), a = we(e, 1, n), l = i && h(i), s = a && h(a), u = l && parseInt(l.marginLeft) + parseInt(l.marginRight) + P(i).width, d = s && parseInt(s.marginLeft) + parseInt(s.marginRight) + P(a).width;\n if (o.display === \"flex\")\n return o.flexDirection === \"column\" || o.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (o.display === \"grid\")\n return o.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (i && l.float && l.float !== \"none\") {\n var f = l.float === \"left\" ? \"left\" : \"right\";\n return a && (s.clear === \"both\" || s.clear === f) ? \"vertical\" : \"horizontal\";\n }\n return i && (l.display === \"block\" || l.display === \"flex\" || l.display === \"table\" || l.display === \"grid\" || u >= r && o[Ft] === \"none\" || a && o[Ft] === \"none\" && u + d > r) ? \"vertical\" : \"horizontal\";\n}, Wn = function(e, n, o) {\n var r = o ? e.left : e.top, i = o ? e.right : e.bottom, a = o ? e.width : e.height, l = o ? n.left : n.top, s = o ? n.right : n.bottom, u = o ? n.width : n.height;\n return r === l || i === s || r + a / 2 === l + u / 2;\n}, Gn = function(e, n) {\n var o;\n return je.some(function(r) {\n var i = r[q].options.emptyInsertThreshold;\n if (!(!i || ht(r))) {\n var a = P(r), l = e >= a.left - i && e <= a.right + i, s = n >= a.top - i && n <= a.bottom + i;\n if (l && s)\n return o = r;\n }\n }), o;\n}, Jt = function(e) {\n function n(i, a) {\n return function(l, s, u, d) {\n var f = l.options.group.name && s.options.group.name && l.options.group.name === s.options.group.name;\n if (i == null && (a || f))\n return !0;\n if (i == null || i === !1)\n return !1;\n if (a && i === \"clone\")\n return i;\n if (typeof i == \"function\")\n return n(i(l, s, u, d), a)(l, s, u, d);\n var m = (a ? l : s).options.group.name;\n return i === !0 || typeof i == \"string\" && i === m || i.join && i.indexOf(m) > -1;\n };\n }\n var o = {}, r = e.group;\n (!r || Ye(r) != \"object\") && (r = {\n name: r\n }), o.name = r.name, o.checkPull = n(r.pull, !0), o.checkPut = n(r.put), o.revertClone = r.revertClone, e.group = o;\n}, Zt = function() {\n !qt && g && h(g, \"display\", \"none\");\n}, Qt = function() {\n !qt && g && h(g, \"display\", \"\");\n};\nVe && !Wt && document.addEventListener(\"click\", function(t) {\n if (Ge)\n return t.preventDefault(), t.stopPropagation && t.stopPropagation(), t.stopImmediatePropagation && t.stopImmediatePropagation(), Ge = !1, !1;\n}, !0);\nvar he = function(e) {\n if (c) {\n e = e.touches ? e.touches[0] : e;\n var n = Gn(e.clientX, e.clientY);\n if (n) {\n var o = {};\n for (var r in e)\n e.hasOwnProperty(r) && (o[r] = e[r]);\n o.target = o.rootEl = n, o.preventDefault = void 0, o.stopPropagation = void 0, n[q]._onDragOver(o);\n }\n }\n}, jn = function(e) {\n c && c.parentNode[q]._isOutsideThisEl(e.target);\n};\nfunction p(t, e) {\n if (!(t && t.nodeType && t.nodeType === 1))\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(t));\n this.el = t, this.options = e = ie({}, e), t[q] = this;\n var n = {\n group: null,\n sort: !0,\n disabled: !1,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(t.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: !1,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: !0,\n direction: function() {\n return Kt(t, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: !0,\n animation: 0,\n easing: null,\n setData: function(a, l) {\n a.setData(\"Text\", l.textContent);\n },\n dropBubble: !1,\n dragoverBubble: !1,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: !1,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: !1,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: !1,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: p.supportPointer !== !1 && \"PointerEvent\" in window && !Te,\n emptyInsertThreshold: 5\n };\n Ne.initializePlugins(this, t, n);\n for (var o in n)\n !(o in e) && (e[o] = n[o]);\n Jt(e);\n for (var r in this)\n r.charAt(0) === \"_\" && typeof this[r] == \"function\" && (this[r] = this[r].bind(this));\n this.nativeDraggable = e.forceFallback ? !1 : Ln, this.nativeDraggable && (this.options.touchStartThreshold = 1), e.supportPointer ? S(t, \"pointerdown\", this._onTapStart) : (S(t, \"mousedown\", this._onTapStart), S(t, \"touchstart\", this._onTapStart)), this.nativeDraggable && (S(t, \"dragover\", this), S(t, \"dragenter\", this)), je.push(this.el), e.store && e.store.get && this.sort(e.store.get(this) || []), ie(this, Xn());\n}\np.prototype = /** @lends Sortable.prototype */\n{\n constructor: p,\n _isOutsideThisEl: function(e) {\n !this.el.contains(e) && e !== this.el && (me = null);\n },\n _getDirection: function(e, n) {\n return typeof this.options.direction == \"function\" ? this.options.direction.call(this, e, n, c) : this.options.direction;\n },\n _onTapStart: function(e) {\n if (e.cancelable) {\n var n = this, o = this.el, r = this.options, i = r.preventOnFilter, a = e.type, l = e.touches && e.touches[0] || e.pointerType && e.pointerType === \"touch\" && e, s = (l || e).target, u = e.target.shadowRoot && (e.path && e.path[0] || e.composedPath && e.composedPath()[0]) || s, d = r.filter;\n if (Zn(o), !c && !(/mousedown|pointerdown/.test(a) && e.button !== 0 || r.disabled) && !u.isContentEditable && !(!this.nativeDraggable && Te && s && s.tagName.toUpperCase() === \"SELECT\") && (s = Q(s, r.draggable, o, !1), !(s && s.animated) && Be !== s)) {\n if (be = J(s), Oe = J(s, r.draggable), typeof d == \"function\") {\n if (d.call(this, e, s, this)) {\n W({\n sortable: n,\n rootEl: u,\n name: \"filter\",\n targetEl: s,\n toEl: o,\n fromEl: o\n }), z(\"filter\", n, {\n evt: e\n }), i && e.cancelable && e.preventDefault();\n return;\n }\n } else if (d && (d = d.split(\",\").some(function(f) {\n if (f = Q(u, f.trim(), o, !1), f)\n return W({\n sortable: n,\n rootEl: f,\n name: \"filter\",\n targetEl: s,\n fromEl: o,\n toEl: o\n }), z(\"filter\", n, {\n evt: e\n }), !0;\n }), d)) {\n i && e.cancelable && e.preventDefault();\n return;\n }\n r.handle && !Q(u, r.handle, o, !1) || this._prepareDragStart(e, l, s);\n }\n }\n },\n _prepareDragStart: function(e, n, o) {\n var r = this, i = r.el, a = r.options, l = i.ownerDocument, s;\n if (o && !c && o.parentNode === i) {\n var u = P(o);\n if (T = i, c = o, O = c.parentNode, pe = c.nextSibling, Be = o, Me = a.group, p.dragged = c, de = {\n target: c,\n clientX: (n || e).clientX,\n clientY: (n || e).clientY\n }, Pt = de.clientX - u.left, Mt = de.clientY - u.top, this._lastX = (n || e).clientX, this._lastY = (n || e).clientY, c.style[\"will-change\"] = \"all\", s = function() {\n if (z(\"delayEnded\", r, {\n evt: e\n }), p.eventCanceled) {\n r._onDrop();\n return;\n }\n r._disableDelayedDragEvents(), !It && r.nativeDraggable && (c.draggable = !0), r._triggerDragStart(e, n), W({\n sortable: r,\n name: \"choose\",\n originalEvent: e\n }), V(c, a.chosenClass, !0);\n }, a.ignore.split(\",\").forEach(function(d) {\n jt(c, d.trim(), nt);\n }), S(l, \"dragover\", he), S(l, \"mousemove\", he), S(l, \"touchmove\", he), S(l, \"mouseup\", r._onDrop), S(l, \"touchend\", r._onDrop), S(l, \"touchcancel\", r._onDrop), It && this.nativeDraggable && (this.options.touchStartThreshold = 4, c.draggable = !0), z(\"delayStart\", this, {\n evt: e\n }), a.delay && (!a.delayOnTouchOnly || n) && (!this.nativeDraggable || !(xe || ae))) {\n if (p.eventCanceled) {\n this._onDrop();\n return;\n }\n S(l, \"mouseup\", r._disableDelayedDrag), S(l, \"touchend\", r._disableDelayedDrag), S(l, \"touchcancel\", r._disableDelayedDrag), S(l, \"mousemove\", r._delayedDragTouchMoveHandler), S(l, \"touchmove\", r._delayedDragTouchMoveHandler), a.supportPointer && S(l, \"pointermove\", r._delayedDragTouchMoveHandler), r._dragStartTimer = setTimeout(s, a.delay);\n } else\n s();\n }\n },\n _delayedDragTouchMoveHandler: function(e) {\n var n = e.touches ? e.touches[0] : e;\n Math.max(Math.abs(n.clientX - this._lastX), Math.abs(n.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1)) && this._disableDelayedDrag();\n },\n _disableDelayedDrag: function() {\n c && nt(c), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function() {\n var e = this.el.ownerDocument;\n E(e, \"mouseup\", this._disableDelayedDrag), E(e, \"touchend\", this._disableDelayedDrag), E(e, \"touchcancel\", this._disableDelayedDrag), E(e, \"mousemove\", this._delayedDragTouchMoveHandler), E(e, \"touchmove\", this._delayedDragTouchMoveHandler), E(e, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function(e, n) {\n n = n || e.pointerType == \"touch\" && e, !this.nativeDraggable || n ? this.options.supportPointer ? S(document, \"pointermove\", this._onTouchMove) : n ? S(document, \"touchmove\", this._onTouchMove) : S(document, \"mousemove\", this._onTouchMove) : (S(c, \"dragend\", this), S(T, \"dragstart\", this._onDragStart));\n try {\n document.selection ? He(function() {\n document.selection.empty();\n }) : window.getSelection().removeAllRanges();\n } catch (o) {\n }\n },\n _dragStarted: function(e, n) {\n if (ve = !1, T && c) {\n z(\"dragStarted\", this, {\n evt: n\n }), this.nativeDraggable && S(document, \"dragover\", jn);\n var o = this.options;\n !e && V(c, o.dragClass, !1), V(c, o.ghostClass, !0), p.active = this, e && this._appendGhost(), W({\n sortable: this,\n name: \"start\",\n originalEvent: n\n });\n } else\n this._nulling();\n },\n _emulateDragOver: function() {\n if (Z) {\n this._lastX = Z.clientX, this._lastY = Z.clientY, Zt();\n for (var e = document.elementFromPoint(Z.clientX, Z.clientY), n = e; e && e.shadowRoot && (e = e.shadowRoot.elementFromPoint(Z.clientX, Z.clientY), e !== n); )\n n = e;\n if (c.parentNode[q]._isOutsideThisEl(e), n)\n do {\n if (n[q]) {\n var o = void 0;\n if (o = n[q]._onDragOver({\n clientX: Z.clientX,\n clientY: Z.clientY,\n target: e,\n rootEl: n\n }), o && !this.options.dragoverBubble)\n break;\n }\n e = n;\n } while (n = n.parentNode);\n Qt();\n }\n },\n _onTouchMove: function(e) {\n if (de) {\n var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, i = e.touches ? e.touches[0] : e, a = g && ye(g, !0), l = g && a && a.a, s = g && a && a.d, u = Re && H && Nt(H), d = (i.clientX - de.clientX + r.x) / (l || 1) + (u ? u[0] - tt[0] : 0) / (l || 1), f = (i.clientY - de.clientY + r.y) / (s || 1) + (u ? u[1] - tt[1] : 0) / (s || 1);\n if (!p.active && !ve) {\n if (o && Math.max(Math.abs(i.clientX - this._lastX), Math.abs(i.clientY - this._lastY)) < o)\n return;\n this._onDragStart(e, !0);\n }\n if (g) {\n a ? (a.e += d - (Qe || 0), a.f += f - (et || 0)) : a = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: d,\n f\n };\n var m = \"matrix(\".concat(a.a, \",\").concat(a.b, \",\").concat(a.c, \",\").concat(a.d, \",\").concat(a.e, \",\").concat(a.f, \")\");\n h(g, \"webkitTransform\", m), h(g, \"mozTransform\", m), h(g, \"msTransform\", m), h(g, \"transform\", m), Qe = d, et = f, Z = i;\n }\n e.cancelable && e.preventDefault();\n }\n },\n _appendGhost: function() {\n if (!g) {\n var e = this.options.fallbackOnBody ? document.body : T, n = P(c, !0, Re, !0, e), o = this.options;\n if (Re) {\n for (H = e; h(H, \"position\") === \"static\" && h(H, \"transform\") === \"none\" && H !== document; )\n H = H.parentNode;\n H !== document.body && H !== document.documentElement ? (H === document && (H = te()), n.top += H.scrollTop, n.left += H.scrollLeft) : H = te(), tt = Nt(H);\n }\n g = c.cloneNode(!0), V(g, o.ghostClass, !1), V(g, o.fallbackClass, !0), V(g, o.dragClass, !0), h(g, \"transition\", \"\"), h(g, \"transform\", \"\"), h(g, \"box-sizing\", \"border-box\"), h(g, \"margin\", 0), h(g, \"top\", n.top), h(g, \"left\", n.left), h(g, \"width\", n.width), h(g, \"height\", n.height), h(g, \"opacity\", \"0.8\"), h(g, \"position\", Re ? \"absolute\" : \"fixed\"), h(g, \"zIndex\", \"100000\"), h(g, \"pointerEvents\", \"none\"), p.ghost = g, e.appendChild(g), h(g, \"transform-origin\", Pt / parseInt(g.style.width) * 100 + \"% \" + Mt / parseInt(g.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function(e, n) {\n var o = this, r = e.dataTransfer, i = o.options;\n if (z(\"dragStart\", this, {\n evt: e\n }), p.eventCanceled) {\n this._onDrop();\n return;\n }\n z(\"setupClone\", this), p.eventCanceled || (C = Vt(c), C.removeAttribute(\"id\"), C.draggable = !1, C.style[\"will-change\"] = \"\", this._hideClone(), V(C, this.options.chosenClass, !1), p.clone = C), o.cloneId = He(function() {\n z(\"clone\", o), !p.eventCanceled && (o.options.removeCloneOnHide || T.insertBefore(C, c), o._hideClone(), W({\n sortable: o,\n name: \"clone\"\n }));\n }), !n && V(c, i.dragClass, !0), n ? (Ge = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (E(document, \"mouseup\", o._onDrop), E(document, \"touchend\", o._onDrop), E(document, \"touchcancel\", o._onDrop), r && (r.effectAllowed = \"move\", i.setData && i.setData.call(o, r, c)), S(document, \"drop\", o), h(c, \"transform\", \"translateZ(0)\")), ve = !0, o._dragStartId = He(o._dragStarted.bind(o, n, e)), S(document, \"selectstart\", o), Se = !0, Te && h(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function(e) {\n var n = this.el, o = e.target, r, i, a, l = this.options, s = l.group, u = p.active, d = Me === s, f = l.sort, m = Y || u, y, b = this, w = !1;\n if (lt)\n return;\n function L(ee, Ee) {\n z(ee, b, ne({\n evt: e,\n isOwner: d,\n axis: y ? \"vertical\" : \"horizontal\",\n revert: a,\n dragRect: r,\n targetRect: i,\n canSort: f,\n fromSortable: m,\n target: o,\n completed: R,\n onMove: function(vt, rn) {\n return Xe(T, n, c, r, vt, P(vt), e, rn);\n },\n changed: j\n }, Ee));\n }\n function G() {\n L(\"dragOverAnimationCapture\"), b.captureAnimationState(), b !== m && m.captureAnimationState();\n }\n function R(ee) {\n return L(\"dragOverCompleted\", {\n insertion: ee\n }), ee && (d ? u._hideClone() : u._showClone(b), b !== m && (V(c, Y ? Y.options.ghostClass : u.options.ghostClass, !1), V(c, l.ghostClass, !0)), Y !== b && b !== p.active ? Y = b : b === p.active && Y && (Y = null), m === b && (b._ignoreWhileAnimating = o), b.animateAll(function() {\n L(\"dragOverAnimationComplete\"), b._ignoreWhileAnimating = null;\n }), b !== m && (m.animateAll(), m._ignoreWhileAnimating = null)), (o === c && !c.animated || o === n && !o.animated) && (me = null), !l.dragoverBubble && !e.rootEl && o !== document && (c.parentNode[q]._isOutsideThisEl(e.target), !ee && he(e)), !l.dragoverBubble && e.stopPropagation && e.stopPropagation(), w = !0;\n }\n function j() {\n $ = J(c), se = J(c, l.draggable), W({\n sortable: b,\n name: \"change\",\n toEl: n,\n newIndex: $,\n newDraggableIndex: se,\n originalEvent: e\n });\n }\n if (e.preventDefault !== void 0 && e.cancelable && e.preventDefault(), o = Q(o, l.draggable, n, !0), L(\"dragOver\"), p.eventCanceled)\n return w;\n if (c.contains(e.target) || o.animated && o.animatingX && o.animatingY || b._ignoreWhileAnimating === o)\n return R(!1);\n if (Ge = !1, u && !l.disabled && (d ? f || (a = O !== T) : Y === this || (this.lastPutMode = Me.checkPull(this, u, c, e)) && s.checkPut(this, u, c, e))) {\n if (y = this._getDirection(e, o) === \"vertical\", r = P(c), L(\"dragOverValid\"), p.eventCanceled)\n return w;\n if (a)\n return O = T, G(), this._hideClone(), L(\"revert\"), p.eventCanceled || (pe ? T.insertBefore(c, pe) : T.appendChild(c)), R(!0);\n var B = ht(n, l.draggable);\n if (!B || $n(e, y, this) && !B.animated) {\n if (B === c)\n return R(!1);\n if (B && n === e.target && (o = B), o && (i = P(o)), Xe(T, n, c, r, o, i, e, !!o) !== !1)\n return G(), B && B.nextSibling ? n.insertBefore(c, B.nextSibling) : n.appendChild(c), O = n, j(), R(!0);\n } else if (B && Vn(e, y, this)) {\n var X = we(n, 0, l, !0);\n if (X === c)\n return R(!1);\n if (o = X, i = P(o), Xe(T, n, c, r, o, i, e, !1) !== !1)\n return G(), n.insertBefore(c, X), O = n, j(), R(!0);\n } else if (o.parentNode === n) {\n i = P(o);\n var K = 0, oe, le = c.parentNode !== n, k = !Wn(c.animated && c.toRect || r, o.animated && o.toRect || i, y), v = y ? \"top\" : \"left\", D = xt(o, \"top\", \"top\") || xt(c, \"top\", \"top\"), A = D ? D.scrollTop : void 0;\n me !== o && (oe = i[v], Ae = !1, Fe = !k && l.invertSwap || le), K = qn(e, o, i, y, k ? 1 : l.swapThreshold, l.invertedSwapThreshold == null ? l.swapThreshold : l.invertedSwapThreshold, Fe, me === o);\n var I;\n if (K !== 0) {\n var _ = J(c);\n do\n _ -= K, I = O.children[_];\n while (I && (h(I, \"display\") === \"none\" || I === g));\n }\n if (K === 0 || I === o)\n return R(!1);\n me = o, Ie = K;\n var x = o.nextElementSibling, M = !1;\n M = K === 1;\n var F = Xe(T, n, c, r, o, i, e, M);\n if (F !== !1)\n return (F === 1 || F === -1) && (M = F === 1), lt = !0, setTimeout(Un, 30), G(), M && !x ? n.appendChild(c) : o.parentNode.insertBefore(c, M ? x : o), D && Ut(D, 0, A - D.scrollTop), O = c.parentNode, oe !== void 0 && !Fe && (ke = Math.abs(oe - P(o)[v])), j(), R(!0);\n }\n if (n.contains(c))\n return R(!1);\n }\n return !1;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function() {\n E(document, \"mousemove\", this._onTouchMove), E(document, \"touchmove\", this._onTouchMove), E(document, \"pointermove\", this._onTouchMove), E(document, \"dragover\", he), E(document, \"mousemove\", he), E(document, \"touchmove\", he);\n },\n _offUpEvents: function() {\n var e = this.el.ownerDocument;\n E(e, \"mouseup\", this._onDrop), E(e, \"touchend\", this._onDrop), E(e, \"pointerup\", this._onDrop), E(e, \"touchcancel\", this._onDrop), E(document, \"selectstart\", this);\n },\n _onDrop: function(e) {\n var n = this.el, o = this.options;\n if ($ = J(c), se = J(c, o.draggable), z(\"drop\", this, {\n evt: e\n }), O = c && c.parentNode, $ = J(c), se = J(c, o.draggable), p.eventCanceled) {\n this._nulling();\n return;\n }\n ve = !1, Fe = !1, Ae = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), st(this.cloneId), st(this._dragStartId), this.nativeDraggable && (E(document, \"drop\", this), E(n, \"dragstart\", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Te && h(document.body, \"user-select\", \"\"), h(c, \"transform\", \"\"), e && (Se && (e.cancelable && e.preventDefault(), !o.dropBubble && e.stopPropagation()), g && g.parentNode && g.parentNode.removeChild(g), (T === O || Y && Y.lastPutMode !== \"clone\") && C && C.parentNode && C.parentNode.removeChild(C), c && (this.nativeDraggable && E(c, \"dragend\", this), nt(c), c.style[\"will-change\"] = \"\", Se && !ve && V(c, Y ? Y.options.ghostClass : this.options.ghostClass, !1), V(c, this.options.chosenClass, !1), W({\n sortable: this,\n name: \"unchoose\",\n toEl: O,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: e\n }), T !== O ? ($ >= 0 && (W({\n rootEl: O,\n name: \"add\",\n toEl: O,\n fromEl: T,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"remove\",\n toEl: O,\n originalEvent: e\n }), W({\n rootEl: O,\n name: \"sort\",\n toEl: O,\n fromEl: T,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"sort\",\n toEl: O,\n originalEvent: e\n })), Y && Y.save()) : $ !== be && $ >= 0 && (W({\n sortable: this,\n name: \"update\",\n toEl: O,\n originalEvent: e\n }), W({\n sortable: this,\n name: \"sort\",\n toEl: O,\n originalEvent: e\n })), p.active && (($ == null || $ === -1) && ($ = be, se = Oe), W({\n sortable: this,\n name: \"end\",\n toEl: O,\n originalEvent: e\n }), this.save()))), this._nulling();\n },\n _nulling: function() {\n z(\"nulling\", this), T = c = O = g = pe = C = Be = ue = de = Z = Se = $ = se = be = Oe = me = Ie = Y = Me = p.dragged = p.ghost = p.clone = p.active = null, ze.forEach(function(e) {\n e.checked = !0;\n }), ze.length = Qe = et = 0;\n },\n handleEvent: function(e) {\n switch (e.type) {\n case \"drop\":\n case \"dragend\":\n this._onDrop(e);\n break;\n case \"dragenter\":\n case \"dragover\":\n c && (this._onDragOver(e), zn(e));\n break;\n case \"selectstart\":\n e.preventDefault();\n break;\n }\n },\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function() {\n for (var e = [], n, o = this.el.children, r = 0, i = o.length, a = this.options; r < i; r++)\n n = o[r], Q(n, a.draggable, this.el, !1) && e.push(n.getAttribute(a.dataIdAttr) || Jn(n));\n return e;\n },\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function(e, n) {\n var o = {}, r = this.el;\n this.toArray().forEach(function(i, a) {\n var l = r.children[a];\n Q(l, this.options.draggable, r, !1) && (o[i] = l);\n }, this), n && this.captureAnimationState(), e.forEach(function(i) {\n o[i] && (r.removeChild(o[i]), r.appendChild(o[i]));\n }), n && this.animateAll();\n },\n /**\n * Save the current sorting\n */\n save: function() {\n var e = this.options.store;\n e && e.set && e.set(this);\n },\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function(e, n) {\n return Q(e, n || this.options.draggable, this.el, !1);\n },\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function(e, n) {\n var o = this.options;\n if (n === void 0)\n return o[e];\n var r = Ne.modifyOption(this, e, n);\n typeof r != \"undefined\" ? o[e] = r : o[e] = n, e === \"group\" && Jt(o);\n },\n /**\n * Destroy\n */\n destroy: function() {\n z(\"destroy\", this);\n var e = this.el;\n e[q] = null, E(e, \"mousedown\", this._onTapStart), E(e, \"touchstart\", this._onTapStart), E(e, \"pointerdown\", this._onTapStart), this.nativeDraggable && (E(e, \"dragover\", this), E(e, \"dragenter\", this)), Array.prototype.forEach.call(e.querySelectorAll(\"[draggable]\"), function(n) {\n n.removeAttribute(\"draggable\");\n }), this._onDrop(), this._disableDelayedDragEvents(), je.splice(je.indexOf(this.el), 1), this.el = e = null;\n },\n _hideClone: function() {\n if (!ue) {\n if (z(\"hideClone\", this), p.eventCanceled)\n return;\n h(C, \"display\", \"none\"), this.options.removeCloneOnHide && C.parentNode && C.parentNode.removeChild(C), ue = !0;\n }\n },\n _showClone: function(e) {\n if (e.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if (ue) {\n if (z(\"showClone\", this), p.eventCanceled)\n return;\n c.parentNode == T && !this.options.group.revertClone ? T.insertBefore(C, c) : pe ? T.insertBefore(C, pe) : T.appendChild(C), this.options.group.revertClone && this.animate(c, C), h(C, \"display\", \"\"), ue = !1;\n }\n }\n};\nfunction zn(t) {\n t.dataTransfer && (t.dataTransfer.dropEffect = \"move\"), t.cancelable && t.preventDefault();\n}\nfunction Xe(t, e, n, o, r, i, a, l) {\n var s, u = t[q], d = u.options.onMove, f;\n return window.CustomEvent && !ae && !xe ? s = new CustomEvent(\"move\", {\n bubbles: !0,\n cancelable: !0\n }) : (s = document.createEvent(\"Event\"), s.initEvent(\"move\", !0, !0)), s.to = e, s.from = t, s.dragged = n, s.draggedRect = o, s.related = r || e, s.relatedRect = i || P(e), s.willInsertAfter = l, s.originalEvent = a, t.dispatchEvent(s), d && (f = d.call(u, s, a)), f;\n}\nfunction nt(t) {\n t.draggable = !1;\n}\nfunction Un() {\n lt = !1;\n}\nfunction Vn(t, e, n) {\n var o = P(we(n.el, 0, n.options, !0)), r = $t(n.el, n.options, g), i = 10;\n return e ? t.clientX < r.left - i || t.clientY < o.top && t.clientX < o.right : t.clientY < r.top - i || t.clientY < o.bottom && t.clientX < o.left;\n}\nfunction $n(t, e, n) {\n var o = P(ht(n.el, n.options.draggable)), r = $t(n.el, n.options, g), i = 10;\n return e ? t.clientX > r.right + i || t.clientY > o.bottom && t.clientX > o.left : t.clientY > r.bottom + i || t.clientX > o.right && t.clientY > o.top;\n}\nfunction qn(t, e, n, o, r, i, a, l) {\n var s = o ? t.clientY : t.clientX, u = o ? n.height : n.width, d = o ? n.top : n.left, f = o ? n.bottom : n.right, m = !1;\n if (!a) {\n if (l && ke < u * r) {\n if (!Ae && (Ie === 1 ? s > d + u * i / 2 : s < f - u * i / 2) && (Ae = !0), Ae)\n m = !0;\n else if (Ie === 1 ? s < d + ke : s > f - ke)\n return -Ie;\n } else if (s > d + u * (1 - r) / 2 && s < f - u * (1 - r) / 2)\n return Kn(e);\n }\n return m = m || a, m && (s < d + u * i / 2 || s > f - u * i / 2) ? s > d + u / 2 ? 1 : -1 : 0;\n}\nfunction Kn(t) {\n return J(c) < J(t) ? 1 : -1;\n}\nfunction Jn(t) {\n for (var e = t.tagName + t.className + t.src + t.href + t.textContent, n = e.length, o = 0; n--; )\n o += e.charCodeAt(n);\n return o.toString(36);\n}\nfunction Zn(t) {\n ze.length = 0;\n for (var e = t.getElementsByTagName(\"input\"), n = e.length; n--; ) {\n var o = e[n];\n o.checked && ze.push(o);\n }\n}\nfunction He(t) {\n return setTimeout(t, 0);\n}\nfunction st(t) {\n return clearTimeout(t);\n}\nVe && S(document, \"touchmove\", function(t) {\n (p.active || ve) && t.cancelable && t.preventDefault();\n});\np.utils = {\n on: S,\n off: E,\n css: h,\n find: jt,\n is: function(e, n) {\n return !!Q(e, n, e, !1);\n },\n extend: Fn,\n throttle: zt,\n closest: Q,\n toggleClass: V,\n clone: Vt,\n index: J,\n nextTick: He,\n cancelNextTick: st,\n detectDirection: Kt,\n getChild: we\n};\np.get = function(t) {\n return t[q];\n};\np.mount = function() {\n for (var t = arguments.length, e = new Array(t), n = 0; n < t; n++)\n e[n] = arguments[n];\n e[0].constructor === Array && (e = e[0]), e.forEach(function(o) {\n if (!o.prototype || !o.prototype.constructor)\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(o));\n o.utils && (p.utils = ne(ne({}, p.utils), o.utils)), Ne.mount(o);\n });\n};\np.create = function(t, e) {\n return new p(t, e);\n};\np.version = Nn;\nvar N = [], De, ut, ct = !1, ot, rt, Ue, _e;\nfunction Qn() {\n function t() {\n this.defaults = {\n scroll: !0,\n forceAutoScrollFallback: !1,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: !0\n };\n for (var e in this)\n e.charAt(0) === \"_\" && typeof this[e] == \"function\" && (this[e] = this[e].bind(this));\n }\n return t.prototype = {\n dragStarted: function(n) {\n var o = n.originalEvent;\n this.sortable.nativeDraggable ? S(document, \"dragover\", this._handleAutoScroll) : this.options.supportPointer ? S(document, \"pointermove\", this._handleFallbackAutoScroll) : o.touches ? S(document, \"touchmove\", this._handleFallbackAutoScroll) : S(document, \"mousemove\", this._handleFallbackAutoScroll);\n },\n dragOverCompleted: function(n) {\n var o = n.originalEvent;\n !this.options.dragOverBubble && !o.rootEl && this._handleAutoScroll(o);\n },\n drop: function() {\n this.sortable.nativeDraggable ? E(document, \"dragover\", this._handleAutoScroll) : (E(document, \"pointermove\", this._handleFallbackAutoScroll), E(document, \"touchmove\", this._handleFallbackAutoScroll), E(document, \"mousemove\", this._handleFallbackAutoScroll)), Rt(), Le(), Rn();\n },\n nulling: function() {\n Ue = ut = De = ct = _e = ot = rt = null, N.length = 0;\n },\n _handleFallbackAutoScroll: function(n) {\n this._handleAutoScroll(n, !0);\n },\n _handleAutoScroll: function(n, o) {\n var r = this, i = (n.touches ? n.touches[0] : n).clientX, a = (n.touches ? n.touches[0] : n).clientY, l = document.elementFromPoint(i, a);\n if (Ue = n, o || this.options.forceAutoScrollFallback || xe || ae || Te) {\n it(n, this.options, l, o);\n var s = ce(l, !0);\n ct && (!_e || i !== ot || a !== rt) && (_e && Rt(), _e = setInterval(function() {\n var u = ce(document.elementFromPoint(i, a), !0);\n u !== s && (s = u, Le()), it(n, r.options, u, o);\n }, 10), ot = i, rt = a);\n } else {\n if (!this.options.bubbleScroll || ce(l, !0) === te()) {\n Le();\n return;\n }\n it(n, this.options, ce(l, !1), !1);\n }\n }\n }, ie(t, {\n pluginName: \"scroll\",\n initializeByDefault: !0\n });\n}\nfunction Le() {\n N.forEach(function(t) {\n clearInterval(t.pid);\n }), N = [];\n}\nfunction Rt() {\n clearInterval(_e);\n}\nvar it = zt(function(t, e, n, o) {\n if (e.scroll) {\n var r = (t.touches ? t.touches[0] : t).clientX, i = (t.touches ? t.touches[0] : t).clientY, a = e.scrollSensitivity, l = e.scrollSpeed, s = te(), u = !1, d;\n ut !== n && (ut = n, Le(), De = e.scroll, d = e.scrollFn, De === !0 && (De = ce(n, !0)));\n var f = 0, m = De;\n do {\n var y = m, b = P(y), w = b.top, L = b.bottom, G = b.left, R = b.right, j = b.width, B = b.height, X = void 0, K = void 0, oe = y.scrollWidth, le = y.scrollHeight, k = h(y), v = y.scrollLeft, D = y.scrollTop;\n y === s ? (X = j < oe && (k.overflowX === \"auto\" || k.overflowX === \"scroll\" || k.overflowX === \"visible\"), K = B < le && (k.overflowY === \"auto\" || k.overflowY === \"scroll\" || k.overflowY === \"visible\")) : (X = j < oe && (k.overflowX === \"auto\" || k.overflowX === \"scroll\"), K = B < le && (k.overflowY === \"auto\" || k.overflowY === \"scroll\"));\n var A = X && (Math.abs(R - r) <= a && v + j < oe) - (Math.abs(G - r) <= a && !!v), I = K && (Math.abs(L - i) <= a && D + B < le) - (Math.abs(w - i) <= a && !!D);\n if (!N[f])\n for (var _ = 0; _ <= f; _++)\n N[_] || (N[_] = {});\n (N[f].vx != A || N[f].vy != I || N[f].el !== y) && (N[f].el = y, N[f].vx = A, N[f].vy = I, clearInterval(N[f].pid), (A != 0 || I != 0) && (u = !0, N[f].pid = setInterval(function() {\n o && this.layer === 0 && p.active._onTouchMove(Ue);\n var x = N[this.layer].vy ? N[this.layer].vy * l : 0, M = N[this.layer].vx ? N[this.layer].vx * l : 0;\n typeof d == \"function\" && d.call(p.dragged.parentNode[q], M, x, t, Ue, N[this.layer].el) !== \"continue\" || Ut(N[this.layer].el, M, x);\n }.bind({\n layer: f\n }), 24))), f++;\n } while (e.bubbleScroll && m !== s && (m = ce(m, !1)));\n ct = u;\n }\n}, 30), en = function(e) {\n var n = e.originalEvent, o = e.putSortable, r = e.dragEl, i = e.activeSortable, a = e.dispatchSortableEvent, l = e.hideGhostForTarget, s = e.unhideGhostForTarget;\n if (n) {\n var u = o || i;\n l();\n var d = n.changedTouches && n.changedTouches.length ? n.changedTouches[0] : n, f = document.elementFromPoint(d.clientX, d.clientY);\n s(), u && !u.el.contains(f) && (a(\"spill\"), this.onSpill({\n dragEl: r,\n putSortable: o\n }));\n }\n};\nfunction pt() {\n}\npt.prototype = {\n startIndex: null,\n dragStart: function(e) {\n var n = e.oldDraggableIndex;\n this.startIndex = n;\n },\n onSpill: function(e) {\n var n = e.dragEl, o = e.putSortable;\n this.sortable.captureAnimationState(), o && o.captureAnimationState();\n var r = we(this.sortable.el, this.startIndex, this.options);\n r ? this.sortable.el.insertBefore(n, r) : this.sortable.el.appendChild(n), this.sortable.animateAll(), o && o.animateAll();\n },\n drop: en\n};\nie(pt, {\n pluginName: \"revertOnSpill\"\n});\nfunction gt() {\n}\ngt.prototype = {\n onSpill: function(e) {\n var n = e.dragEl, o = e.putSortable, r = o || this.sortable;\n r.captureAnimationState(), n.parentNode && n.parentNode.removeChild(n), r.animateAll();\n },\n drop: en\n};\nie(gt, {\n pluginName: \"removeOnSpill\"\n});\np.mount(new Qn());\np.mount(gt, pt);\nfunction eo(t) {\n return t == null ? t : JSON.parse(JSON.stringify(t));\n}\nfunction to(t) {\n dt() && sn(t);\n}\nfunction no(t) {\n dt() ? un(t) : kt(t);\n}\nlet tn = null, nn = null;\nfunction Xt(t = null, e = null) {\n tn = t, nn = e;\n}\nfunction oo() {\n return {\n data: tn,\n clonedData: nn\n };\n}\nconst Yt = Symbol(\"cloneElement\");\nfunction on(...t) {\n var le, k;\n const e = (le = dt()) == null ? void 0 : le.proxy;\n let n = null;\n const o = t[0];\n let [, r, i] = t;\n Array.isArray(U(r)) || (i = r, r = null);\n let a = null;\n const {\n immediate: l = !0,\n clone: s = eo,\n forceFallback: u,\n fallbackOnBody: d,\n customUpdate: f\n } = (k = U(i)) != null ? k : {};\n function m(v) {\n var F;\n const { from: D, oldIndex: A, item: I } = v, _ = Array.from(D.childNodes);\n n = u && !d ? _.slice(0, -1) : _;\n const x = U((F = U(r)) == null ? void 0 : F[A]), M = s(x);\n Xt(x, M), I[Yt] = M;\n }\n function y(v) {\n const D = v.item[Yt];\n if (!wn(D)) {\n if (Ke(v.item), qe(r)) {\n const A = [...U(r)];\n r.value = _t(A, v.newDraggableIndex, D);\n return;\n }\n _t(U(r), v.newDraggableIndex, D);\n }\n }\n function b(v) {\n const { from: D, item: A, oldIndex: I, oldDraggableIndex: _, pullMode: x, clone: M } = v;\n if (Tt(D, A, I), x === \"clone\") {\n Ke(M);\n return;\n }\n if (qe(r)) {\n const F = [...U(r)];\n r.value = Dt(F, _);\n return;\n }\n Dt(U(r), _);\n }\n function w(v) {\n if (f) {\n f(v);\n return;\n }\n const { from: D, item: A, oldIndex: I, oldDraggableIndex: _, newDraggableIndex: x } = v;\n if (Ke(A), Tt(D, A, I), qe(r)) {\n const M = [...U(r)];\n r.value = St(\n M,\n _,\n x\n );\n return;\n }\n St(U(r), _, x);\n }\n function L(v) {\n const { newIndex: D, oldIndex: A, from: I, to: _ } = v;\n let x = null;\n const M = D === A && I === _;\n try {\n if (M) {\n let F = null;\n n == null || n.some((ee, Ee) => {\n if (F && (n == null ? void 0 : n.length) !== _.childNodes.length)\n return I.insertBefore(F, ee.nextSibling), !0;\n const mt = _.childNodes[Ee];\n F = _ == null ? void 0 : _.replaceChild(ee, mt);\n });\n }\n } catch (F) {\n x = F;\n } finally {\n n = null;\n }\n kt(() => {\n if (Xt(), x)\n throw x;\n });\n }\n const G = {\n onUpdate: w,\n onStart: m,\n onAdd: y,\n onRemove: b,\n onEnd: L\n };\n function R(v) {\n const D = U(o);\n return v || (v = En(D) ? Sn(D, e == null ? void 0 : e.$el) : D), v && !Tn(v) && (v = v.$el), v || vn(\"Root element not found\"), v;\n }\n function j() {\n var I;\n const _ = (I = U(i)) != null ? I : {}, { immediate: v, clone: D } = _, A = $e(_, [\"immediate\", \"clone\"]);\n return Ct(A, (x, M) => {\n Cn(x) && (A[x] = (F, ...ee) => {\n const Ee = oo();\n return On(F, Ee), M(F, ...ee);\n });\n }), _n(\n r === null ? {} : G,\n A\n );\n }\n const B = (v) => {\n v = R(v), a && X.destroy(), a = new p(v, j());\n };\n ln(\n () => i,\n () => {\n a && Ct(j(), (v, D) => {\n a == null || a.option(v, D);\n });\n },\n { deep: !0 }\n );\n const X = {\n option: (v, D) => a == null ? void 0 : a.option(v, D),\n destroy: () => {\n a == null || a.destroy(), a = null;\n },\n save: () => a == null ? void 0 : a.save(),\n toArray: () => a == null ? void 0 : a.toArray(),\n closest: (...v) => a == null ? void 0 : a.closest(...v)\n }, K = () => X == null ? void 0 : X.option(\"disabled\", !0), oe = () => X == null ? void 0 : X.option(\"disabled\", !1);\n return no(() => {\n l && B();\n }), to(X.destroy), fe({ start: B, pause: K, resume: oe }, X);\n}\nconst ft = [\n \"update\",\n \"start\",\n \"add\",\n \"remove\",\n \"choose\",\n \"unchoose\",\n \"end\",\n \"sort\",\n \"filter\",\n \"clone\",\n \"move\",\n \"change\"\n], ro = [\n \"clone\",\n \"animation\",\n \"ghostClass\",\n \"group\",\n \"sort\",\n \"disabled\",\n \"store\",\n \"handle\",\n \"draggable\",\n \"swapThreshold\",\n \"invertSwap\",\n \"invertedSwapThreshold\",\n \"removeCloneOnHide\",\n \"direction\",\n \"chosenClass\",\n \"dragClass\",\n \"ignore\",\n \"filter\",\n \"preventOnFilter\",\n \"easing\",\n \"setData\",\n \"dropBubble\",\n \"dragoverBubble\",\n \"dataIdAttr\",\n \"delay\",\n \"delayOnTouchOnly\",\n \"touchStartThreshold\",\n \"forceFallback\",\n \"fallbackClass\",\n \"fallbackOnBody\",\n \"fallbackTolerance\",\n \"fallbackOffset\",\n \"supportPointer\",\n \"emptyInsertThreshold\",\n \"scroll\",\n \"forceAutoScrollFallback\",\n \"scrollSensitivity\",\n \"scrollSpeed\",\n \"bubbleScroll\",\n \"modelValue\",\n \"tag\",\n \"target\",\n \"customUpdate\",\n ...ft.map((t) => `on${t.replace(/^\\S/, (e) => e.toUpperCase())}`)\n], lo = cn({\n name: \"VueDraggable\",\n model: {\n prop: \"modelValue\",\n event: \"update:modelValue\"\n },\n props: ro,\n emits: [\"update:modelValue\", ...ft],\n setup(t, { slots: e, emit: n, expose: o, attrs: r }) {\n const i = ft.reduce((d, f) => {\n const m = `on${f.replace(/^\\S/, (y) => y.toUpperCase())}`;\n return d[m] = (...y) => n(f, ...y), d;\n }, {}), a = Et(() => {\n const y = fn(t), { modelValue: d } = y, f = $e(y, [\"modelValue\"]), m = Object.entries(f).reduce((b, [w, L]) => {\n const G = U(L);\n return G !== void 0 && (b[w] = G), b;\n }, {});\n return fe(fe({}, i), yn(fe(fe({}, r), m)));\n }), l = Et({\n get: () => t.modelValue,\n set: (d) => n(\"update:modelValue\", d)\n }), s = dn(), u = hn(\n on(t.target || s, l, a)\n );\n return o(u), () => {\n var d;\n return pn(t.tag || \"div\", { ref: s }, (d = e == null ? void 0 : e.default) == null ? void 0 : d.call(e, u));\n };\n }\n}), Bt = {\n mounted: \"mounted\",\n unmounted: \"unmounted\"\n}, at = /* @__PURE__ */ new WeakMap(), so = {\n [Bt.mounted](t, e) {\n const n = gn(e.value) ? [e.value] : e.value, [o, r] = n, i = on(t, o, r);\n at.set(t, i.destroy);\n },\n [Bt.unmounted](t) {\n var e;\n (e = at.get(t)) == null || e(), at.delete(t);\n }\n};\nexport {\n lo as VueDraggable,\n on as useDraggable,\n so as vDraggable\n};\n","<script setup lang=\"ts\" generic=\"T extends KanbanCard = KanbanCard\">\nimport { computed, nextTick, ref, useId, useTemplateRef } from 'vue'\nimport { VueDraggable } from 'vue-draggable-plus'\nimport WxBadge from '../Badge/Badge.vue'\nimport WxButton from '../Button/Button.vue'\nimport WxEntityCard from '../EntityCard/EntityCard.vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type {\n KanbanCard,\n KanbanColumn,\n KanbanEmits,\n KanbanId,\n KanbanProps,\n KanbanVia,\n} from './types'\n\ndefineOptions({ name: 'WxKanban', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<KanbanProps<T>>(), {\n group: undefined,\n size: 'md',\n columnWidth: 288,\n disabled: false,\n handle: undefined,\n addable: false,\n addLabel: 'Add a card',\n collapsible: false,\n reorderColumns: false,\n columnAddable: false,\n addColumnLabel: 'Add a column',\n emptyText: 'Nothing here yet',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<KanbanEmits<T>>()\n\ndefineSlots<{\n /** One card. Without it the board falls back to the card's own title. */\n card?: (props: { card: T; column: KanbanColumn<T>; index: number }) => unknown\n /** Replaces the title and the count above a column. */\n 'column-header'?: (props: {\n column: KanbanColumn<T>\n count: number\n overLimit: boolean\n }) => unknown\n /** The end of a column's heading — a plus, a menu, whatever the column can do. */\n 'column-actions'?: (props: { column: KanbanColumn<T>; collapsed: boolean }) => unknown\n /** Under the cards, where the add button would be. */\n 'column-footer'?: (props: { column: KanbanColumn<T> }) => unknown\n /** Shown in a column holding no cards. */\n empty?: (props: { column: KanbanColumn<T> }) => unknown\n /** After the last column, in place of the add-a-column button. */\n default?: () => unknown\n}>()\n\n/** Which columns are folded down. Bind it to remember them between visits. */\nconst collapsed = defineModel<KanbanId[]>('collapsed', { default: () => [] })\n\nconst root = useTemplateRef<HTMLElement>('root')\n\n/** Boards exchange cards only when they are told to share a name. */\nconst ownId = useId()\nconst cardGroup = computed(() => props.group ?? `wx-kanban-cards-${ownId}`)\n\nconst boardStyle = computed(() => ({\n '--wx-kanban-column-width':\n typeof props.columnWidth === 'number' ? `${props.columnWidth}px` : props.columnWidth,\n}))\n\nfunction isFull(column: KanbanColumn<T>) {\n return column.limit !== undefined && column.items.length >= column.limit\n}\n\nfunction isCollapsed(column: KanbanColumn<T>) {\n return collapsed.value.includes(column.id)\n}\n\n/** A folded column has nowhere to put a card, so it is closed to them as well. */\nfunction isLocked(column: KanbanColumn<T>) {\n return props.disabled || Boolean(column.disabled) || isCollapsed(column)\n}\n\nfunction columnById(id: KanbanId | string) {\n return props.columns.find((column) => String(column.id) === String(id))\n}\n\nfunction cardTitle(card: T) {\n const named = card as { title?: unknown; name?: unknown; label?: unknown }\n return String(named.title ?? named.name ?? named.label ?? card.id)\n}\n\nfunction nameOf(column: KanbanColumn<T>) {\n return String(column.title ?? column.id)\n}\n\nfunction toggle(column: KanbanColumn<T>) {\n collapsed.value = isCollapsed(column)\n ? collapsed.value.filter((id) => id !== column.id)\n : [...collapsed.value, column.id]\n}\n\n/**\n * A work-in-progress limit is only worth drawing if it also refuses the card. The\n * column's own group decides what may be dropped into it; reordering inside a full\n * column stays allowed, since that does not make it any fuller.\n */\nfunction groupFor(column: KanbanColumn<T>) {\n return {\n name: cardGroup.value,\n pull: !isLocked(column),\n put: (to: unknown, from: unknown) => {\n if (isLocked(column)) return false\n return to === from || !isFull(column)\n },\n }\n}\n\n/* ---------------------------------------------------------------------------\n * Moving a card\n * ------------------------------------------------------------------------- */\n\nfunction move(\n from: KanbanColumn<T>,\n fromIndex: number,\n to: KanbanColumn<T>,\n toIndex: number,\n via: KanbanVia,\n) {\n const [card] = from.items.splice(fromIndex, 1)\n if (!card) return\n\n to.items.splice(toIndex, 0, card)\n emit('move', {\n card,\n from: { column: from.id, index: fromIndex },\n to: { column: to.id, index: toIndex },\n via,\n })\n}\n\n/**\n * A pointer drag is over by the time this runs — the library moved the card between\n * the arrays itself, and all that is left is to say what happened. Each list carries\n * its column id in the DOM so the event can be read back into our own terms.\n */\nfunction onCardDrop(event: {\n from: HTMLElement\n to: HTMLElement\n oldIndex?: number\n newIndex?: number\n}) {\n const fromId = event.from.dataset.columnId\n const toId = event.to.dataset.columnId\n const fromIndex = event.oldIndex ?? -1\n const toIndex = event.newIndex ?? -1\n if (fromId === undefined || toId === undefined || fromIndex < 0 || toIndex < 0) return\n if (fromId === toId && fromIndex === toIndex) return\n\n const to = columnById(toId)\n const card = to?.items[toIndex]\n if (!to || !card) return\n\n emit('move', {\n card,\n from: { column: columnById(fromId)?.id ?? fromId, index: fromIndex },\n to: { column: to.id, index: toIndex },\n via: 'pointer',\n })\n}\n\n/* ---------------------------------------------------------------------------\n * Moving a column\n * ------------------------------------------------------------------------- */\n\n/*\n * Writing into `columns` is the board's contract rather than an accident: a move has\n * to be visible the moment it happens, and the array the caller passed is the one\n * their own `ref` holds — the cards are moved between `column.items` the same way, a\n * level deeper than the rule can see. Assigning to the prop itself is still off the\n * table; only its contents are rearranged.\n */\n/* eslint-disable vue/no-mutating-props */\n\n/**\n * The new order of the columns, written back into the array it came from.\n */\nconst columnOrder = computed({\n get: () => props.columns,\n set: (next) => {\n props.columns.splice(0, props.columns.length, ...next)\n },\n})\n\nfunction moveColumn(from: number, to: number, via: KanbanVia) {\n if (to < 0 || to >= props.columns.length || from === to) return\n\n const [column] = props.columns.splice(from, 1)\n if (!column) return\n\n props.columns.splice(to, 0, column)\n emit('column-move', { column, from, to, via })\n}\n\n/* eslint-enable vue/no-mutating-props */\n\nfunction onColumnDrop(event: { oldDraggableIndex?: number; newDraggableIndex?: number }) {\n const from = event.oldDraggableIndex ?? -1\n const to = event.newDraggableIndex ?? -1\n if (from < 0 || to < 0 || from === to) return\n\n const column = props.columns[to]\n if (!column) return\n\n emit('column-move', { column, from, to, via: 'pointer' })\n}\n\n/* ---------------------------------------------------------------------------\n * Moving without a mouse\n *\n * SortableJS is a pointer library and has nothing to say to a keyboard, so the board\n * carries its own: space picks a card — or a column — up, the arrows move it, space\n * drops it, escape puts it back. It is the same two array operations a drag performs;\n * what a keyboard needs on top is somewhere to read the result, and that is the live\n * region.\n * ------------------------------------------------------------------------- */\n\nconst grabbed = ref<{\n id: KanbanId\n column: KanbanId\n origin: { column: KanbanId; index: number }\n} | null>(null)\n\nconst grabbedColumn = ref<{ id: KanbanId; origin: number } | null>(null)\n\nconst announcement = ref('')\n\nfunction isGrabbed(card: T) {\n return grabbed.value?.id === card.id\n}\n\nfunction isColumnGrabbed(column: KanbanColumn<T>) {\n return grabbedColumn.value?.id === column.id\n}\n\nfunction positionOf(card: T, column: KanbanColumn<T>) {\n return `${column.items.indexOf(card) + 1} of ${column.items.length}`\n}\n\n/**\n * Whatever moved is in a different element now, so the focus has to follow it there.\n * The id is compared rather than written into a selector: an id belongs to the\n * application, and quoting one into CSS needs an escape not every environment has.\n */\nasync function refocus(attribute: 'data-card-id' | 'data-column-grip', id: KanbanId) {\n await nextTick()\n\n const wanted = String(id)\n const elements = root.value?.querySelectorAll<HTMLElement>(`[${attribute}]`) ?? []\n for (const element of elements) {\n if (element.getAttribute(attribute) === wanted) {\n element.focus()\n return\n }\n }\n}\n\nfunction onCardKeydown(event: KeyboardEvent, card: T, column: KanbanColumn<T>, index: number) {\n /* A button or a link inside a card keeps its own keys. */\n if (event.target !== event.currentTarget) return\n if (isLocked(column)) return\n\n const held = isGrabbed(card)\n\n if (event.key === ' ' || event.key === 'Spacebar' || event.key === 'Enter') {\n event.preventDefault()\n if (held) {\n grabbed.value = null\n announcement.value = `Dropped ${cardTitle(card)} in ${nameOf(column)}, ${positionOf(card, column)}.`\n } else {\n grabbed.value = { id: card.id, column: column.id, origin: { column: column.id, index } }\n announcement.value = `Picked up ${cardTitle(card)}. Use the arrow keys to move it, space to drop it, escape to put it back.`\n }\n return\n }\n\n if (!held) return\n\n if (event.key === 'Escape') {\n event.preventDefault()\n const state = grabbed.value\n grabbed.value = null\n if (!state) return\n\n const current = columnById(state.column)\n const origin = columnById(state.origin.column)\n if (current && origin) {\n const at = current.items.indexOf(card)\n if (at >= 0) move(current, at, origin, state.origin.index, 'keyboard')\n }\n\n announcement.value = 'Move cancelled.'\n void refocus('data-card-id', card.id)\n return\n }\n\n const steps: Record<string, () => void> = {\n ArrowUp: () => stepCard(card, column, -1),\n ArrowDown: () => stepCard(card, column, 1),\n ArrowLeft: () => shiftCard(card, column, -1),\n ArrowRight: () => shiftCard(card, column, 1),\n }\n\n const run = steps[event.key]\n if (!run) return\n\n event.preventDefault()\n run()\n}\n\nfunction stepCard(card: T, column: KanbanColumn<T>, offset: number) {\n const index = column.items.indexOf(card)\n const next = index + offset\n if (next < 0 || next >= column.items.length) return\n\n move(column, index, column, next, 'keyboard')\n announcement.value = `${cardTitle(card)} is now ${positionOf(card, column)} in ${nameOf(column)}.`\n void refocus('data-card-id', card.id)\n}\n\nfunction shiftCard(card: T, column: KanbanColumn<T>, offset: number) {\n const columnIndex = props.columns.indexOf(column)\n\n /* Past a column that refuses the card there may still be one that takes it. */\n for (let i = columnIndex + offset; i >= 0 && i < props.columns.length; i += offset) {\n const target = props.columns[i]\n if (isLocked(target) || isFull(target)) continue\n\n const index = column.items.indexOf(card)\n move(column, index, target, Math.min(index, target.items.length), 'keyboard')\n\n if (grabbed.value) grabbed.value = { ...grabbed.value, column: target.id }\n announcement.value = `${cardTitle(card)} moved to ${nameOf(target)}, ${positionOf(card, target)}.`\n void refocus('data-card-id', card.id)\n return\n }\n\n announcement.value = `${nameOf(column)} is the last column that can take ${cardTitle(card)}.`\n}\n\nfunction onColumnKeydown(event: KeyboardEvent, column: KanbanColumn<T>, index: number) {\n if (event.target !== event.currentTarget) return\n if (!props.reorderColumns || props.disabled) return\n\n const held = isColumnGrabbed(column)\n\n if (event.key === ' ' || event.key === 'Spacebar' || event.key === 'Enter') {\n event.preventDefault()\n if (held) {\n grabbedColumn.value = null\n announcement.value = `Dropped ${nameOf(column)}, ${index + 1} of ${props.columns.length}.`\n } else {\n grabbedColumn.value = { id: column.id, origin: index }\n announcement.value = `Picked up the ${nameOf(column)} column. Use the left and right arrows to move it.`\n }\n return\n }\n\n if (!held) return\n\n if (event.key === 'Escape') {\n event.preventDefault()\n const state = grabbedColumn.value\n grabbedColumn.value = null\n if (state) moveColumn(props.columns.indexOf(column), state.origin, 'keyboard')\n\n announcement.value = 'Move cancelled.'\n void refocus('data-column-grip', column.id)\n return\n }\n\n const offsets: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1 }\n const offset = offsets[event.key]\n if (offset === undefined) return\n\n event.preventDefault()\n const at = props.columns.indexOf(column)\n moveColumn(at, at + offset, 'keyboard')\n announcement.value = `${nameOf(column)} is now ${props.columns.indexOf(column) + 1} of ${props.columns.length}.`\n void refocus('data-column-grip', column.id)\n}\n\nconst classes = computed(() => ['wx-kanban', `wx-kanban--${props.size}`])\n\ndefineExpose({ move, moveColumn, toggle })\n</script>\n\n<template>\n <div\n ref=\"root\"\n v-bind=\"$attrs\"\n :class=\"classes\"\n :style=\"boardStyle\"\n role=\"group\"\n :aria-label=\"ariaLabel\"\n >\n <!--\n Only the columns are items of this list; the tail that adds a column rides along\n inside the same scroller so it stays at the end of the row wherever that is.\n -->\n <vue-draggable\n v-model=\"columnOrder\"\n class=\"wx-kanban__scroller\"\n :group=\"{ name: `wx-kanban-columns-${ownId}`, pull: false, put: false }\"\n :disabled=\"!reorderColumns || disabled\"\n draggable=\".wx-kanban__column\"\n handle=\".wx-kanban__grip\"\n filter=\"button, a, .wx-kanban__actions\"\n :prevent-on-filter=\"false\"\n :animation=\"160\"\n @end=\"onColumnDrop\"\n >\n <section\n v-for=\"(column, columnIndex) in columns\"\n :key=\"column.id\"\n class=\"wx-kanban__column\"\n :class=\"[\n `wx-kanban__column--${column.tone ?? 'default'}`,\n {\n 'is-collapsed': isCollapsed(column),\n 'is-locked': disabled || column.disabled,\n 'is-grabbed': isColumnGrabbed(column),\n },\n ]\"\n >\n <!-- Folded down, a column is a strip with its name read the long way. -->\n <div\n v-if=\"isCollapsed(column)\"\n class=\"wx-kanban__strip wx-kanban__grip\"\n :data-column-grip=\"column.id\"\n :tabindex=\"reorderColumns && !disabled ? 0 : -1\"\n @keydown=\"onColumnKeydown($event, column, columnIndex)\"\n >\n <button\n class=\"wx-kanban__expand\"\n type=\"button\"\n :aria-expanded=\"false\"\n :aria-label=\"`Expand ${nameOf(column)}`\"\n @click=\"toggle(column)\"\n >\n <wx-icon name=\"chevron-right\" />\n </button>\n <span class=\"wx-kanban__title wx-kanban__title--vertical\">{{ nameOf(column) }}</span>\n <wx-badge size=\"sm\" round :type=\"isFull(column) ? 'danger' : 'default'\">\n {{ column.items.length }}\n </wx-badge>\n </div>\n\n <template v-else>\n <header\n class=\"wx-kanban__head wx-kanban__grip\"\n :data-column-grip=\"column.id\"\n :tabindex=\"reorderColumns && !disabled ? 0 : -1\"\n :role=\"reorderColumns && !disabled ? 'button' : undefined\"\n :aria-roledescription=\"reorderColumns && !disabled ? 'Draggable column' : undefined\"\n :aria-pressed=\"reorderColumns && !disabled ? isColumnGrabbed(column) : undefined\"\n @keydown=\"onColumnKeydown($event, column, columnIndex)\"\n >\n <button\n v-if=\"collapsible\"\n class=\"wx-kanban__collapse\"\n type=\"button\"\n :aria-expanded=\"true\"\n :aria-label=\"`Collapse ${nameOf(column)}`\"\n @click=\"toggle(column)\"\n >\n <wx-icon name=\"chevron-left\" />\n </button>\n\n <slot\n name=\"column-header\"\n :column=\"column\"\n :count=\"column.items.length\"\n :over-limit=\"isFull(column)\"\n >\n <span class=\"wx-kanban__title\">{{ nameOf(column) }}</span>\n <wx-badge\n class=\"wx-kanban__count\"\n size=\"sm\"\n round\n :type=\"isFull(column) ? 'danger' : 'default'\"\n >\n {{ column.items.length\n }}<template v-if=\"column.limit\">/{{ column.limit }}</template>\n </wx-badge>\n </slot>\n\n <span v-if=\"$slots['column-actions']\" class=\"wx-kanban__actions\">\n <slot name=\"column-actions\" :column=\"column\" :collapsed=\"false\" />\n </span>\n </header>\n\n <vue-draggable\n v-model=\"column.items\"\n class=\"wx-kanban__list\"\n :data-column-id=\"column.id\"\n :group=\"groupFor(column)\"\n :disabled=\"isLocked(column)\"\n :handle=\"handle\"\n :animation=\"160\"\n :delay=\"150\"\n :delay-on-touch-only=\"true\"\n ghost-class=\"wx-kanban__card--ghost\"\n chosen-class=\"wx-kanban__card--chosen\"\n @end=\"onCardDrop\"\n >\n <div\n v-for=\"(card, index) in column.items\"\n :key=\"card.id\"\n class=\"wx-kanban__card\"\n :class=\"{ 'is-grabbed': isGrabbed(card) }\"\n :data-card-id=\"card.id\"\n :tabindex=\"isLocked(column) ? -1 : 0\"\n role=\"button\"\n aria-roledescription=\"Draggable card\"\n :aria-pressed=\"isGrabbed(card)\"\n @keydown=\"onCardKeydown($event, card, column, index)\"\n >\n <slot name=\"card\" :card=\"card\" :column=\"column\" :index=\"index\">\n <wx-entity-card :title=\"cardTitle(card)\" variant=\"card\" bordered size=\"sm\" />\n </slot>\n </div>\n </vue-draggable>\n\n <p v-if=\"column.items.length === 0\" class=\"wx-kanban__empty\">\n <slot name=\"empty\" :column=\"column\">{{ emptyText }}</slot>\n </p>\n\n <footer v-if=\"addable || $slots['column-footer']\" class=\"wx-kanban__foot\">\n <slot name=\"column-footer\" :column=\"column\">\n <wx-button\n class=\"wx-kanban__add\"\n variant=\"text\"\n size=\"sm\"\n block\n :disabled=\"isLocked(column) || isFull(column)\"\n @click=\"emit('add', column)\"\n >\n <template #icon><wx-icon name=\"plus\" /></template>\n {{ addLabel }}\n </wx-button>\n </slot>\n </footer>\n </template>\n </section>\n\n <div v-if=\"columnAddable || $slots.default\" class=\"wx-kanban__tail\">\n <slot>\n <button class=\"wx-kanban__add-column\" type=\"button\" @click=\"emit('add-column')\">\n <wx-icon name=\"plus\" />\n <span class=\"wx-kanban__title--vertical\">{{ addColumnLabel }}</span>\n </button>\n </slot>\n </div>\n </vue-draggable>\n\n <!-- What a keyboard move says out loud. -->\n <div class=\"wx-kanban__live\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style scoped>\n.wx-kanban {\n --wx-kanban-column-width: 288px;\n\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n /* The board is as tall as it is given; the columns scroll inside it, not the page. */\n min-height: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n container-type: inline-size;\n}\n\n.wx-kanban__scroller {\n display: flex;\n align-items: stretch;\n gap: var(--wx-space-12);\n min-height: 0;\n padding-bottom: var(--wx-space-6);\n overflow-x: auto;\n /* A swipe across the board must not turn into a page swipe or a back gesture. */\n overscroll-behavior-inline: contain;\n scroll-snap-type: inline proximity;\n}\n\n.wx-kanban__column {\n display: flex;\n flex: 0 0 auto;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--wx-kanban-column-width);\n min-height: 0;\n background: var(--wx-bg-muted);\n border-top: 3px solid var(--wx-kanban-tone, var(--wx-border-default));\n border-radius: var(--wx-radius-md);\n scroll-snap-align: start;\n transition: width var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-kanban__column--primary {\n --wx-kanban-tone: var(--wx-color-primary);\n}\n\n.wx-kanban__column--success {\n --wx-kanban-tone: var(--wx-color-success);\n}\n\n.wx-kanban__column--warning {\n --wx-kanban-tone: var(--wx-color-warning);\n}\n\n.wx-kanban__column--danger {\n --wx-kanban-tone: var(--wx-color-danger);\n}\n\n.wx-kanban__column--info {\n --wx-kanban-tone: var(--wx-color-info);\n}\n\n.wx-kanban__column.is-locked {\n opacity: 0.7;\n}\n\n.wx-kanban__column.is-collapsed {\n width: 48px;\n}\n\n.wx-kanban__column.is-grabbed {\n box-shadow: var(--wx-ring-focus), var(--wx-shadow-md);\n}\n\n.wx-kanban__head {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n padding: var(--wx-space-12) var(--wx-space-12) var(--wx-space-8);\n border-radius: var(--wx-radius-md) var(--wx-radius-md) 0 0;\n}\n\n/* The heading is what a column is dragged by, so it says so under the pointer. */\n.wx-kanban__grip {\n cursor: grab;\n}\n\n.wx-kanban__grip:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-kanban__title {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Read down the strip of a folded column, the way a spine is. */\n.wx-kanban__title--vertical {\n flex: 0 1 auto;\n max-height: 100%;\n writing-mode: vertical-rl;\n}\n\n.wx-kanban__count,\n.wx-kanban__actions {\n flex: 0 0 auto;\n}\n\n.wx-kanban__actions {\n display: flex;\n align-items: center;\n gap: var(--wx-space-2);\n cursor: default;\n}\n\n.wx-kanban__collapse,\n.wx-kanban__expand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-kanban__collapse:hover,\n.wx-kanban__expand:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-kanban__collapse:focus-visible,\n.wx-kanban__expand:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-kanban__strip {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n gap: var(--wx-space-8);\n min-height: 0;\n padding: var(--wx-space-10) 0;\n overflow: hidden;\n}\n\n.wx-kanban__list {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--wx-space-8);\n /* Room to drop a card into a column that has none. */\n min-height: 40px;\n padding: 0 var(--wx-space-8);\n overflow-y: auto;\n}\n\n.wx-kanban__card {\n border-radius: var(--wx-radius-sm);\n cursor: grab;\n}\n\n.wx-kanban__card:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Held by the keyboard: the same ring, plus the lift a dragged card has. */\n.wx-kanban__card.is-grabbed {\n box-shadow: var(--wx-ring-focus), var(--wx-shadow-md);\n}\n\n/* What is left behind in the list while the card is being dragged. */\n.wx-kanban__card--ghost {\n opacity: 0.4;\n}\n\n.wx-kanban__card--chosen {\n cursor: grabbing;\n}\n\n.wx-kanban__empty {\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12) 0;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-kanban__foot {\n padding: var(--wx-space-8);\n}\n\n.wx-kanban__tail {\n display: flex;\n flex: 0 0 auto;\n align-items: stretch;\n}\n\n/* A column-shaped button, so the end of the row reads as a place for one more. */\n.wx-kanban__add-column {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wx-space-8);\n box-sizing: border-box;\n width: 48px;\n padding: var(--wx-space-10) 0;\n background: var(--wx-bg-subtle);\n border: 1px dashed var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-muted);\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n cursor: pointer;\n transition: color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-kanban__add-column:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-kanban__add-column:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Read out, never drawn. */\n.wx-kanban__live {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.wx-kanban--sm .wx-kanban__head {\n padding: var(--wx-space-8) var(--wx-space-10) var(--wx-space-6);\n}\n\n.wx-kanban--sm .wx-kanban__list {\n gap: var(--wx-space-6);\n padding: 0 var(--wx-space-6);\n}\n\n/*\n * On a phone a column of a fixed 288px leaves a slice of the next one showing, which\n * reads as clutter rather than as a hint. Below that width a column takes most of the\n * screen and the swipe snaps to it. Asked of the board, not of the window: the same\n * squeeze happens in a narrow panel on a wide monitor.\n */\n@container (max-width: 560px) {\n .wx-kanban__scroller {\n scroll-snap-type: inline mandatory;\n }\n\n .wx-kanban__column:not(.is-collapsed) {\n width: min(88cqw, 320px);\n }\n}\n\n/* A finger needs a bigger target, and a long press to tell a drag from a scroll. */\n@media (pointer: coarse) {\n .wx-kanban__card,\n .wx-kanban__grip {\n cursor: default;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-kanban__column {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { LinkEmits, LinkProps } from './types'\n\ndefineOptions({ name: 'WxLink', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<LinkProps>(), {\n href: undefined,\n target: undefined,\n rel: undefined,\n type: 'default',\n underline: 'hover',\n size: undefined,\n weight: undefined,\n disabled: false,\n external: false,\n as: undefined,\n})\n\nconst emit = defineEmits<LinkEmits>()\n\nconst tag = computed(() => props.as ?? 'a')\n\n/** `noopener` is not optional on a `_blank` link — the opened page can steal the tab. */\nconst linkAttrs = computed(() => {\n const target = props.target ?? (props.external ? '_blank' : undefined)\n const rel = props.rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined)\n const href = props.disabled ? undefined : props.href\n\n /*\n * Only the attributes we actually have: rendering through `RouterLink`, a stray\n * `href: undefined` in the fallthrough would wipe out the href the router writes.\n */\n const attrs: Record<string, unknown> = {}\n if (href !== undefined) attrs.href = href\n if (target !== undefined) attrs.target = target\n if (rel !== undefined) attrs.rel = rel\n if (props.disabled) {\n attrs['aria-disabled'] = 'true'\n attrs.tabindex = -1\n }\n return attrs\n})\n\nconst classes = computed(() => [\n 'wx-link',\n `wx-link--${props.type}`,\n `wx-link--underline-${props.underline}`,\n {\n [`wx-link--${props.size}`]: Boolean(props.size),\n [`wx-link--weight-${props.weight}`]: Boolean(props.weight),\n 'is-disabled': props.disabled,\n },\n])\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n}\n</script>\n\n<template>\n <component :is=\"tag\" v-bind=\"{ ...linkAttrs, ...$attrs }\" :class=\"classes\" @click=\"onClick\">\n <span v-if=\"$slots.icon\" class=\"wx-link__icon\">\n <slot name=\"icon\" />\n </span>\n <slot />\n <wx-icon v-if=\"external\" class=\"wx-link__external\" name=\"external-link\" size=\"0.85em\" />\n </component>\n</template>\n\n<style scoped>\n.wx-link {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n color: var(--wx-link-color, var(--wx-text-link));\n font-family: inherit;\n font-size: inherit;\n text-decoration: none;\n cursor: pointer;\n transition: color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-link:hover {\n color: var(--wx-link-hover, var(--wx-link-color));\n}\n\n.wx-link:focus-visible {\n outline: none;\n border-radius: var(--wx-radius-xs);\n box-shadow: var(--wx-ring-focus);\n}\n\n/* types */\n.wx-link--default {\n --wx-link-color: var(--wx-text-link);\n --wx-link-hover: var(--wx-color-primary-hover);\n}\n\n.wx-link--primary {\n --wx-link-color: var(--wx-color-primary);\n --wx-link-hover: var(--wx-color-primary-hover);\n}\n\n.wx-link--success {\n --wx-link-color: var(--wx-color-success-active);\n --wx-link-hover: var(--wx-color-success);\n}\n\n.wx-link--warning {\n --wx-link-color: var(--wx-color-warning-active);\n --wx-link-hover: var(--wx-color-warning);\n}\n\n.wx-link--danger {\n --wx-link-color: var(--wx-color-danger);\n --wx-link-hover: var(--wx-color-danger-hover);\n}\n\n.wx-link--info {\n --wx-link-color: var(--wx-color-info-active);\n --wx-link-hover: var(--wx-color-info);\n}\n\n.wx-link--muted {\n --wx-link-color: var(--wx-text-muted);\n --wx-link-hover: var(--wx-text-default);\n}\n\n/* underline */\n.wx-link--underline-always {\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-link--underline-hover:hover {\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-link--underline-never,\n.wx-link--underline-never:hover {\n text-decoration: none;\n}\n\n/* sizes */\n.wx-link--xs {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-link--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-link--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-link--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-link--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-link--weight-regular {\n font-weight: var(--wx-font-weight-regular);\n}\n\n.wx-link--weight-medium {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-link--weight-semibold {\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-link--weight-bold {\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-link.is-disabled {\n color: var(--wx-text-disabled);\n text-decoration: none;\n cursor: not-allowed;\n}\n\n.wx-link__icon {\n display: inline-flex;\n align-items: center;\n}\n\n.wx-link__external {\n opacity: 0.75;\n}\n</style>\n","import { onBeforeUnmount, onMounted, ref, watch, type Ref } from 'vue'\n\n/**\n * The width of an element, kept up to date — the measurement every layout that\n * answers to its own box rather than to the window is built on.\n *\n * `0` means nothing has been measured yet: on the server, and until the element is\n * mounted. Treat it as \"assume the roomy case\" rather than as zero width, the way\n * `useResponsiveShell` does — the real number arrives before paint.\n *\n * ```ts\n * const el = ref<HTMLElement | null>(null)\n * const width = useElementWidth(el)\n * ```\n *\n * Pass nothing to measure the page itself.\n */\nexport function useElementWidth(target?: Ref<HTMLElement | null | undefined>): Ref<number> {\n const width = ref(0)\n\n let observer: ResizeObserver | null = null\n let observed: HTMLElement | null = null\n\n function element() {\n if (target) return target.value ?? null\n return typeof document === 'undefined' ? null : document.documentElement\n }\n\n function observe() {\n const el = element()\n /* Mounting and the watch on `target` both land here; the same element is measured once. */\n if (el === observed) return\n\n observer?.disconnect()\n observed = el\n if (!el || typeof ResizeObserver === 'undefined') return\n\n /* A first reading, since an observer only reports once something changes. */\n const measured = Math.round(el.getBoundingClientRect().width)\n if (measured > 0) width.value = measured\n\n observer = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) width.value = Math.round(entry.contentRect.width)\n })\n observer.observe(el)\n }\n\n onMounted(observe)\n\n if (target) watch(target, observe)\n\n onBeforeUnmount(() => {\n observer?.disconnect()\n observer = null\n observed = null\n })\n\n return width\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport WxDrawer from '../Drawer/Drawer.vue'\nimport { useElementWidth } from '../../composables/useElementWidth'\nimport type { ListDetailProps } from './types'\n\ndefineOptions({ name: 'WxListDetail' })\n\nconst props = withDefaults(defineProps<ListDetailProps>(), {\n filtersWidth: 240,\n listWidth: 380,\n detailMin: 420,\n filtersTitle: 'Filters',\n detailLabel: 'Details',\n})\n\ndefineSlots<{\n /** What narrows the list: views, folders, filters. The column is optional. */\n filters?: (props: { inline: boolean; close: () => void }) => unknown\n /** The records. */\n list?: (props: { filtersInline: boolean; openFilters: () => void }) => unknown\n /** The record that is open. */\n detail?: (props: { inline: boolean; back: () => void }) => unknown\n /** Shown in the pane's place while nothing is selected. */\n empty?: () => unknown\n}>()\n\n/**\n * Whether a record is open. One idea, two jobs: beside the list it picks the detail\n * over the empty state, and on a narrow screen it is what raises the panel.\n */\nconst open = defineModel<boolean>('open', { default: false })\nconst filtersOpen = defineModel<boolean>('filtersOpen', { default: false })\n\nconst root = ref<HTMLElement | null>(null)\n\n/*\n * The screen measures itself, not the window: this is a pane inside a page inside a\n * shell, and a viewport media query would count the sidebar it does not have.\n */\nconst width = useElementWidth(root)\n\nfunction toPx(value: number | string) {\n return typeof value === 'number' ? value : Number.parseFloat(value) || 0\n}\n\n/*\n * Both thresholds are the widths the caller gave, added up — not numbers of their\n * own. A wider list or a roomier detail moves them by itself, which is the only way\n * they stay right for a screen we have never seen.\n */\nconst filtersInline = computed(\n () =>\n width.value === 0 ||\n width.value >= toPx(props.filtersWidth) + toPx(props.listWidth) + props.detailMin,\n)\n\nconst detailInline = computed(\n () => width.value === 0 || width.value >= toPx(props.listWidth) + props.detailMin,\n)\n\nconst style = computed(() => ({\n '--wx-list-detail-filters': toLength(props.filtersWidth),\n '--wx-list-detail-list': toLength(props.listWidth),\n}))\n\nfunction toLength(value: number | string) {\n return typeof value === 'number' ? `${value}px` : value\n}\n\nfunction openFilters() {\n filtersOpen.value = true\n}\n\nfunction closeFilters() {\n filtersOpen.value = false\n}\n\nfunction back() {\n open.value = false\n}\n\n/*\n * A record stays open when the screen grows — it just stops being a panel and\n * becomes the column it always wanted to be. The filters have no such continuity:\n * their column is back, so the panel has nothing left to show.\n */\nwatch(filtersInline, (inline) => {\n if (inline) filtersOpen.value = false\n})\n</script>\n\n<template>\n <div ref=\"root\" class=\"wx-list-detail\" :style=\"style\">\n <div v-if=\"$slots.filters && filtersInline\" class=\"wx-list-detail__filters\">\n <slot name=\"filters\" :inline=\"true\" :close=\"closeFilters\" />\n </div>\n\n <div class=\"wx-list-detail__list\" :class=\"{ 'wx-list-detail__list--alone': !detailInline }\">\n <slot name=\"list\" :filters-inline=\"filtersInline\" :open-filters=\"openFilters\" />\n </div>\n\n <section v-if=\"detailInline\" class=\"wx-list-detail__detail\">\n <slot v-if=\"open\" name=\"detail\" :inline=\"true\" :back=\"back\" />\n <div v-else class=\"wx-list-detail__empty\">\n <slot name=\"empty\" />\n </div>\n </section>\n\n <!--\n Narrow: the detail is not a column but a screen of its own, and the filters are\n a panel. Both are the same slots — the caller writes them once.\n -->\n <wx-drawer\n v-if=\"!detailInline\"\n v-model:open=\"open\"\n side=\"right\"\n size=\"100%\"\n :closable=\"false\"\n :aria-label=\"detailLabel\"\n class=\"wx-list-detail__drawer\"\n >\n <slot name=\"detail\" :inline=\"false\" :back=\"back\" />\n </wx-drawer>\n\n <wx-drawer\n v-if=\"$slots.filters && !filtersInline\"\n v-model:open=\"filtersOpen\"\n side=\"left\"\n :size=\"filtersWidth\"\n :title=\"filtersTitle\"\n closable\n >\n <slot name=\"filters\" :inline=\"false\" :close=\"closeFilters\" />\n </wx-drawer>\n </div>\n</template>\n\n<style scoped>\n.wx-list-detail {\n display: flex;\n /* It fills what it is given: a route inside a padding-less `WxMain`, usually. */\n height: 100%;\n min-height: 0;\n min-width: 0;\n background: var(--wx-bg-body);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-list-detail__filters,\n.wx-list-detail__list,\n.wx-list-detail__detail {\n display: flex;\n flex-direction: column;\n /* Columns clip; what scrolls inside them is the caller's to say. */\n min-height: 0;\n box-sizing: border-box;\n}\n\n.wx-list-detail__filters {\n width: var(--wx-list-detail-filters, 240px);\n flex: 0 0 var(--wx-list-detail-filters, 240px);\n background: var(--wx-bg-surface);\n border-right: 1px solid var(--wx-border-default);\n}\n\n.wx-list-detail__list {\n width: var(--wx-list-detail-list, 380px);\n flex: 0 0 var(--wx-list-detail-list, 380px);\n /* A row whose contents refuse to wrap must not widen the column. */\n min-width: 0;\n background: var(--wx-bg-surface);\n border-right: 1px solid var(--wx-border-default);\n}\n\n/* Alone, the list is the screen. */\n.wx-list-detail__list--alone {\n width: auto;\n flex: 1 1 auto;\n border-right: none;\n}\n\n.wx-list-detail__detail {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.wx-list-detail__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wx-space-10);\n height: 100%;\n color: var(--wx-text-muted);\n text-align: center;\n}\n</style>\n\n<style>\n/* The panel is teleported, so its padding cannot be set from a scoped rule. */\n.wx-list-detail__drawer .wx-drawer__body {\n padding: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { MainProps } from './types'\n\ndefineOptions({ name: 'WxMain' })\n\nconst props = withDefaults(defineProps<MainProps>(), {\n padding: 'md',\n scroll: false,\n maxWidth: undefined,\n})\n\nconst maxWidth = computed(() => {\n if (props.maxWidth === undefined) return undefined\n return typeof props.maxWidth === 'number' ? `${props.maxWidth}px` : props.maxWidth\n})\n\nconst classes = computed(() => [\n 'wx-main',\n `wx-main--padding-${props.padding}`,\n { 'wx-main--scroll': props.scroll },\n])\n</script>\n\n<template>\n <main :class=\"classes\" :style=\"maxWidth ? { '--wx-main-max-width': maxWidth } : undefined\">\n <!--\n The inner element is what the cap applies to, so the padding and the background\n still run the full width of the column.\n -->\n <div class=\"wx-main__inner\">\n <slot />\n </div>\n </main>\n</template>\n\n<style scoped>\n.wx-main {\n /*\n * A column rather than a block, so that a screen asked to fill the page — a\n * `WxListDetail` under a `<router-view />`, say — actually can. As a block, the\n * inner element was content-tall and a `height: 100%` child measured itself\n * against that instead of against the column.\n */\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n padding: var(--wx-main-padding, var(--wx-space-24));\n background: var(--wx-bg-body);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-main--padding-none {\n --wx-main-padding: 0px;\n}\n\n.wx-main--padding-sm {\n --wx-main-padding: var(--wx-space-12);\n}\n\n.wx-main--padding-md {\n --wx-main-padding: var(--wx-space-24);\n}\n\n.wx-main--padding-lg {\n --wx-main-padding: var(--wx-space-40);\n}\n\n.wx-main--scroll {\n overflow-y: auto;\n}\n\n/*\n * The inner element fills the column, so a screen that asks for `height: 100%` —\n * a `WxListDetail` under a `<router-view />` — gets the column's height rather than\n * its own content's.\n */\n.wx-main__inner {\n flex: 1 1 auto;\n min-height: 0;\n width: 100%;\n max-width: var(--wx-main-max-width, none);\n /* The cap is centred, but only once there is a cap to centre. */\n margin-inline: auto;\n}\n\n/*\n * A scrolling column is the exception: there the inner element has to be as tall as\n * its content, or the padding at the bottom never makes it into the scrollable area\n * and the last card ends flush against the edge. Measured: 1288px of content in a\n * 216px column scrolls 1312px with this rule and 1300px without it.\n */\n.wx-main--scroll .wx-main__inner {\n flex: 0 0 auto;\n min-height: 100%;\n}\n\n/*\n * Padding is the first thing to give way on a small screen: 24px of margin around a\n * form is air on a desktop and a third of the line on a phone.\n */\n@media (max-width: 640px) {\n .wx-main--padding-lg {\n --wx-main-padding: var(--wx-space-16);\n }\n\n .wx-main--padding-md {\n --wx-main-padding: var(--wx-space-16);\n }\n\n .wx-main--padding-sm {\n --wx-main-padding: var(--wx-space-8);\n }\n}\n\n@media (max-width: 420px) {\n .wx-main--padding-lg,\n .wx-main--padding-md {\n --wx-main-padding: var(--wx-space-12);\n }\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\n\nexport type MenuMode = 'vertical' | 'horizontal'\nexport type MenuSize = 'sm' | 'md'\n\n/** What identifies an entry: whatever you would put in a route table. */\nexport type MenuValue = string | number\n\n/** What `WxMenu` hands down to everything inside it. */\nexport interface MenuContext {\n mode: ComputedRef<MenuMode>\n size: ComputedRef<MenuSize>\n /** The icon rail: labels hidden, submenus opening as flyouts. */\n collapsed: ComputedRef<boolean>\n /** The entry that is currently selected. */\n active: ComputedRef<MenuValue | undefined>\n /** The submenus the active entry sits in, outermost first. */\n trail: ComputedRef<MenuValue[]>\n select: (value: MenuValue, event: MouseEvent) => void\n isOpen: (value: MenuValue) => boolean\n setOpen: (value: MenuValue, open: boolean, ancestors: MenuValue[]) => void\n /**\n * Bumped when every open flyout should close — an entry inside one was chosen.\n * A panel cannot close on any click of its own: the branches inside it are opened\n * by clicking too, and that would shut the panel before they could unfold.\n */\n closeSignal: ComputedRef<number>\n closeFlyouts: () => void\n /**\n * An entry says where it sits so a submenu can tell it holds the active one —\n * the highlight on a collapsed branch, and what `autoExpand` follows.\n */\n register: (value: MenuValue, ancestors: MenuValue[]) => void\n unregister: (value: MenuValue) => void\n}\n\n/** What a `WxSubmenu` hands down to the entries it holds. */\nexport interface SubmenuContext {\n /** The submenus above this one, outermost first, including itself. */\n ancestors: MenuValue[]\n /** How deep the entries below sit — what the indent is counted from. */\n depth: number\n /**\n * Whether these entries are already inside a flyout panel. A panel is a fresh\n * surface: the depth restarts at its edge, and the branches in it open inline\n * rather than throwing a second panel beside the first.\n */\n inFlyout: boolean\n}\n\nexport const menuKey: InjectionKey<MenuContext> = Symbol('wx-menu')\nexport const submenuKey: InjectionKey<SubmenuContext> = Symbol('wx-submenu')\n\nexport function useMenu(): MenuContext | null {\n return inject(menuKey, null)\n}\n\nexport function useSubmenu(): SubmenuContext {\n return inject(submenuKey, { ancestors: [], depth: 0, inFlyout: false })\n}\n","<script setup lang=\"ts\">\nimport { computed, provide, ref, useId, watch } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport WxDropdown from '../Dropdown/Dropdown.vue'\nimport { submenuKey, useMenu, useSubmenu } from '../../composables/useMenu'\nimport '../../styles/menu.css'\nimport type { SubmenuEmits, SubmenuProps } from './types'\n\ndefineOptions({ name: 'WxSubmenu' })\n\nconst props = withDefaults(defineProps<SubmenuProps>(), {\n icon: undefined,\n title: undefined,\n disabled: false,\n})\n\nconst emit = defineEmits<SubmenuEmits>()\n\nconst menu = useMenu()\nconst parent = useSubmenu()\n\nconst panelId = useId()\n\nconst ancestors = computed(() => [...parent.ancestors, props.value])\n\nconst collapsed = computed(() => menu?.collapsed.value ?? false)\nconst isTrail = computed(() => menu?.trail.value.includes(props.value) ?? false)\n\n/**\n * Inline the branch drops open under its title; there is no room for that in a bar\n * or on an icon rail, so those open it as a panel beside the trigger instead.\n *\n * Only the first branch does, though. Inside a panel there is room again, and the\n * branches below open inline in it — a second panel hanging off the first is both\n * harder to keep under the pointer and harder to place near the edge of a screen.\n */\nconst asFlyout = computed(\n () => !parent.inFlyout && (collapsed.value || menu?.mode.value === 'horizontal'),\n)\n\nprovide(submenuKey, {\n /*\n * A submenu is an ancestor of everything below it, so it puts itself on the list\n * it hands down. The entries indent by one and report the branch they sit in.\n */\n get ancestors() {\n return ancestors.value\n },\n /* A panel is a fresh surface: what it holds is indented from its own edge. */\n get depth() {\n return asFlyout.value ? 0 : parent.depth + 1\n },\n get inFlyout() {\n return parent.inFlyout || asFlyout.value\n },\n})\n\n/*\n * A flyout is transient — it belongs to the pointer, not to the menu — so it keeps\n * its own state rather than joining `v-model:open`. Otherwise collapsing a sidebar\n * would throw open a panel for every branch that happened to be expanded.\n */\nconst flyoutOpen = ref(false)\n\nconst isOpen = computed(() =>\n asFlyout.value ? flyoutOpen.value : (menu?.isOpen(props.value) ?? false),\n)\n\nwatch(asFlyout, () => {\n flyoutOpen.value = false\n})\n\n/* An entry was chosen somewhere in the menu — every panel standing open has served. */\nwatch(\n () => menu?.closeSignal.value,\n () => {\n flyoutOpen.value = false\n },\n)\n\nconst flyoutSide = computed(() =>\n menu?.mode.value === 'horizontal' && parent.depth === 0 ? 'bottom' : 'right',\n)\n\nconst chevron = computed(() => {\n if (!asFlyout.value) return 'chevron-down'\n return flyoutSide.value === 'bottom' ? 'chevron-down' : 'chevron-right'\n})\n\nconst triggerClasses = computed(() => [\n 'wx-menu-row',\n {\n 'is-open': isOpen.value,\n 'is-trail': isTrail.value && !isOpen.value,\n 'is-disabled': props.disabled,\n },\n])\n\nfunction setOpen(open: boolean) {\n if (props.disabled) return\n if (asFlyout.value) flyoutOpen.value = open\n else menu?.setOpen(props.value, open, parent.ancestors)\n emit('toggle', open)\n}\n\nfunction onTriggerClick() {\n setOpen(!isOpen.value)\n}\n</script>\n\n<template>\n <li class=\"wx-submenu\" :class=\"{ 'is-open': isOpen }\">\n <wx-dropdown\n v-if=\"asFlyout\"\n class=\"wx-menu-flyout\"\n :open=\"isOpen\"\n :side=\"flyoutSide\"\n align=\"start\"\n :disabled=\"disabled\"\n :close-on-click=\"false\"\n @update:open=\"setOpen\"\n >\n <template #trigger>\n <button\n type=\"button\"\n :class=\"triggerClasses\"\n :disabled=\"disabled\"\n :style=\"{ '--wx-menu-depth': parent.depth }\"\n :title=\"collapsed ? title : undefined\"\n >\n <span v-if=\"icon || $slots.icon\" class=\"wx-menu-row__icon\">\n <slot name=\"icon\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n <span class=\"wx-menu-row__label\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <wx-icon class=\"wx-menu-row__chevron\" :name=\"chevron\" size=\"0.9em\" />\n </button>\n </template>\n\n <ul class=\"wx-menu-flyout__list\">\n <slot />\n </ul>\n </wx-dropdown>\n\n <template v-else>\n <button\n type=\"button\"\n :class=\"triggerClasses\"\n :disabled=\"disabled\"\n :style=\"{ '--wx-menu-depth': parent.depth }\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"panelId\"\n @click=\"onTriggerClick\"\n >\n <span v-if=\"icon || $slots.icon\" class=\"wx-menu-row__icon\">\n <slot name=\"icon\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n <span class=\"wx-menu-row__label\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <wx-icon class=\"wx-menu-row__chevron\" :name=\"chevron\" size=\"0.9em\" />\n </button>\n\n <!--\n The panel animates between `0fr` and `1fr` rather than a measured height, so\n a branch of any length opens without JavaScript measuring it. `inert` keeps\n the links inside a closed branch out of the tab order while it is shut.\n -->\n <div :id=\"panelId\" class=\"wx-submenu__panel\" :class=\"{ 'is-open': isOpen }\" :inert=\"!isOpen\">\n <ul class=\"wx-submenu__list\">\n <slot />\n </ul>\n </div>\n </template>\n </li>\n</template>\n\n<style scoped>\n.wx-submenu {\n min-width: 0;\n /* Scoped, so a host stylesheet spacing `li + li` cannot step the branch down. */\n margin: 0;\n}\n\n.wx-submenu__panel {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-submenu__panel.is-open {\n grid-template-rows: 1fr;\n}\n\n.wx-submenu__list {\n display: flex;\n flex-direction: column;\n gap: var(--wx-menu-gap, 2px);\n /* The grid row is what collapses; the list has to be allowed to be clipped by it. */\n min-height: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-submenu__panel {\n transition: none;\n }\n}\n</style>\n","import { Comment, Fragment, Text, defineComponent, type PropType, type VNode } from 'vue'\n\n/**\n * The entries of a menu as a flat list, so they can be counted and split between the\n * bar and the branch that holds what did not fit.\n *\n * A `v-for` arrives as one fragment holding many entries, and a `v-if` that is false\n * arrives as a comment. Both have to go: the list is lined up index for index against\n * the `<li>` elements the browser actually laid out, and a comment is not one.\n */\nexport function flattenEntries(nodes: VNode[]): VNode[] {\n return nodes.flatMap((node) => {\n if (node.type === Fragment) return flattenEntries((node.children ?? []) as VNode[])\n if (node.type === Comment || node.type === Text) return []\n return [node]\n })\n}\n\n/**\n * Renders vnodes that have already been created — the two halves of a split menu.\n *\n * It exists because a template can render a slot but not a slice of one, and the\n * entries must be rendered *once*: an entry that appeared in both halves would\n * register itself twice and report the wrong branch to the menu above it.\n */\nexport const WxMenuNodes = defineComponent({\n name: 'WxMenuNodes',\n props: {\n nodes: { type: Array as PropType<VNode[]>, required: true },\n },\n setup(props) {\n return () => props.nodes\n },\n})\n","<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n provide,\n reactive,\n ref,\n useSlots,\n watch,\n type VNode,\n} from 'vue'\nimport WxSubmenu from '../Submenu/Submenu.vue'\nimport { menuKey, type MenuValue } from '../../composables/useMenu'\nimport { useElementWidth } from '../../composables/useElementWidth'\nimport { WxMenuNodes, flattenEntries } from './nodes'\nimport type { MenuEmits, MenuProps } from './types'\n\ndefineOptions({ name: 'WxMenu' })\n\nconst props = withDefaults(defineProps<MenuProps>(), {\n mode: 'vertical',\n size: 'md',\n overflow: 'menu',\n overflowTitle: 'More',\n collapsed: false,\n accordion: false,\n autoExpand: true,\n label: undefined,\n})\n\nconst emit = defineEmits<MenuEmits>()\n\n/** The branch the overflow moves into. Reserved: an entry may not use this value. */\nconst OVERFLOW = '__wx-menu-overflow'\n\nconst active = defineModel<MenuValue | undefined>({ default: undefined })\nconst openKeys = defineModel<MenuValue[]>('open', { default: () => [] })\n\n/* ---------------------------------------------------------------- overflow --- */\n\n/**\n * A bar gets whatever room the header has left over, which is rarely as much as the\n * sections need. Rather than clip them or scroll them out of sight, the entries that\n * do not fit move into a branch at the end of the bar.\n *\n * They *move*: every entry is rendered once, in the bar or in the branch, so it\n * registers its position once and the branch can report that it holds the page you\n * are on. That is why the entries are split as vnodes, rather than rendered twice\n * and hidden with CSS in whichever half is not wanted.\n */\nconst slots = useSlots()\nconst list = ref<HTMLElement | null>(null)\nconst listWidth = useElementWidth(list)\n\nconst splits = computed(() => props.mode === 'horizontal' && props.overflow === 'menu')\n\n/** How many entries stand in the bar. All of them, until a measurement says fewer. */\nconst fits = ref(Number.POSITIVE_INFINITY)\n\n/* While this is on everything is in the bar, and the branch is there to be measured. */\nconst measuring = ref(false)\n\n/**\n * Whether anything is in the branch. It is read off the last measurement rather than\n * off the entries, because everything that asks the slot for its entries has to do\n * so while rendering — Vue tracks a slot's dependencies only there — and this is\n * wanted outside the template.\n */\nconst overflowing = ref(false)\n\n/*\n * Only the template reads these. Keep it that way: evaluating them is invoking the\n * slot, and that belongs in a render.\n */\nconst entries = computed<VNode[]>(() =>\n splits.value ? flattenEntries(slots.default?.() ?? []) : [],\n)\n\nconst inBar = computed(() => entries.value.slice(0, fits.value))\nconst inBranch = computed(() => entries.value.slice(fits.value))\n\nfunction lengthOf(value: string) {\n const parsed = Number.parseFloat(value)\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nasync function measure() {\n if (!splits.value) {\n fits.value = Number.POSITIVE_INFINITY\n overflowing.value = false\n return\n }\n\n /* Everything back in the bar, at its natural width, before anything is read. */\n measuring.value = true\n fits.value = Number.POSITIVE_INFINITY\n await nextTick()\n\n const el = list.value\n if (!el) {\n measuring.value = false\n return\n }\n\n const style = getComputedStyle(el)\n const gap = lengthOf(style.columnGap)\n const room = el.clientWidth - lengthOf(style.paddingLeft) - lengthOf(style.paddingRight)\n\n /* The branch is the last child; the entries are everything before it. */\n const children = [...el.children] as HTMLElement[]\n const branch = children.at(-1)\n const widths = children.slice(0, -1).map((child) => child.getBoundingClientRect().width)\n\n const needed = widths.reduce((total, width, index) => total + width + (index ? gap : 0), 0)\n\n if (needed <= room) {\n fits.value = widths.length\n } else {\n /* Room for the branch comes out of the budget before any entry is counted. */\n const budget = room - (branch?.getBoundingClientRect().width ?? 0) - gap\n let used = 0\n let count = 0\n\n for (const width of widths) {\n const next = used + width + (count ? gap : 0)\n if (next > budget) break\n used = next\n count += 1\n }\n\n fits.value = count\n }\n\n /* Counted off the elements just measured, so the slot is not asked again. */\n overflowing.value = fits.value < widths.length\n\n await nextTick()\n measuring.value = false\n}\n\nwatch(\n [listWidth, splits],\n () => {\n /* The bar changing width is what asks for a measurement — and measuring it back\n * to its natural width can change it again, which is not a new question. */\n if (!measuring.value) void measure()\n },\n { immediate: true },\n)\n\nonMounted(() => {\n /*\n * And again once the typeface has arrived. The first measurement is taken in the\n * fallback face, which is a few pixels narrower per label — enough, over a row of\n * them, to leave one entry in the bar that the real face has no room for.\n */\n void document.fonts?.ready.then(() => measure())\n})\n\n/** Where every entry sits: its value against the submenus above it. */\nconst positions = reactive(new Map<MenuValue, MenuValue[]>())\n\n/*\n * Where entries have been seen, which is not the same thing. A flyout unmounts what\n * it holds as it closes, so an entry that moved into the overflow branch stops\n * reporting its position the moment the panel shuts — and the bar still has to show\n * which branch the page you are on is in.\n */\nconst seen = new Map<MenuValue, MenuValue[]>()\n\nconst collapsed = computed(() => props.collapsed && props.mode === 'vertical')\n\nconst trail = computed(() => {\n if (active.value === undefined) return []\n\n const here = positions.get(active.value)\n if (here) {\n seen.set(active.value, here)\n return here\n }\n\n /*\n * Nothing on the page reports holding it. The one place an entry can be and not be\n * on the page is inside a shut overflow panel, so that is where it is — in front of\n * wherever it last said it sat.\n */\n const known = seen.get(active.value) ?? []\n return overflowing.value ? [OVERFLOW, ...known] : known\n})\n\nfunction setOpen(value: MenuValue, open: boolean, ancestors: MenuValue[]) {\n if (!open) {\n openKeys.value = openKeys.value.filter((key) => key !== value)\n return\n }\n\n /*\n * In accordion mode the branch that opens is the whole answer: its own ancestors\n * stay open, everything else closes. Listing the ancestors beats hunting for\n * siblings, which would mean knowing the depth of every open key.\n */\n openKeys.value = props.accordion\n ? [...ancestors, value]\n : [...openKeys.value.filter((key) => key !== value), value]\n}\n\n/* Every open flyout listens for this to change; nothing reads the number itself. */\nconst closeSignal = ref(0)\n\nprovide(menuKey, {\n mode: computed(() => props.mode),\n size: computed(() => props.size),\n collapsed,\n active: computed(() => active.value),\n trail,\n select: (value, event) => {\n active.value = value\n emit('select', value, event)\n },\n isOpen: (value) => openKeys.value.includes(value),\n setOpen,\n closeSignal: computed(() => closeSignal.value),\n closeFlyouts: () => {\n closeSignal.value += 1\n },\n register: (value, ancestors) => positions.set(value, ancestors),\n unregister: (value) => positions.delete(value),\n})\n\n/*\n * Following the active entry rather than the click: a sidebar is normally rendered\n * against the current route, so the branch has to open for a value that arrived\n * with the page instead of through a trigger.\n */\nwatch(\n [trail, () => props.autoExpand],\n ([ancestors, autoExpand]) => {\n if (!autoExpand || ancestors.length === 0) return\n const missing = ancestors.filter((key) => !openKeys.value.includes(key))\n if (missing.length === 0) return\n openKeys.value = props.accordion ? [...ancestors] : [...openKeys.value, ...missing]\n },\n { immediate: true },\n)\n\nconst classes = computed(() => [\n 'wx-menu',\n `wx-menu--${props.mode}`,\n `wx-menu--${props.size}`,\n {\n 'wx-menu--collapsed': collapsed.value,\n 'wx-menu--overflow': splits.value,\n },\n])\n</script>\n\n<template>\n <ul ref=\"list\" :class=\"classes\" :aria-label=\"label\">\n <template v-if=\"splits\">\n <wx-menu-nodes :nodes=\"inBar\" />\n\n <!--\n Rendered whether or not it is needed, because its own width is part of the\n sum that decides how many entries fit beside it.\n -->\n <wx-submenu\n :value=\"OVERFLOW\"\n class=\"wx-menu__overflow\"\n icon=\"more-horizontal\"\n :title=\"overflowTitle\"\n :hidden=\"inBranch.length === 0 && !measuring\"\n >\n <wx-menu-nodes :nodes=\"inBranch\" />\n </wx-submenu>\n </template>\n\n <slot v-else />\n </ul>\n</template>\n\n<style scoped>\n/*\n * A list of links in a list of items, not `role=\"menu\"`. That role promises the\n * keyboard model of a desktop application menu — arrow keys, type-ahead, one tab\n * stop — and navigation that is really a list of links is easier to use, and to\n * read out, exactly as what it is.\n */\n.wx-menu {\n --wx-menu-row-height: 36px;\n --wx-menu-row-padding: var(--wx-space-10);\n --wx-menu-indent: var(--wx-space-16);\n --wx-menu-gap: 2px;\n\n display: flex;\n box-sizing: border-box;\n margin: 0;\n padding: var(--wx-space-8);\n list-style: none;\n background: transparent;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-menu--sm {\n --wx-menu-row-height: 30px;\n --wx-menu-row-padding: var(--wx-space-8);\n --wx-menu-indent: var(--wx-space-12);\n\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-menu--vertical {\n flex-direction: column;\n gap: var(--wx-menu-gap);\n width: 100%;\n}\n\n.wx-menu--horizontal {\n flex-direction: row;\n align-items: center;\n gap: var(--wx-space-2);\n overflow-x: auto;\n /* A bar that has to scroll should not show a bar of its own doing it. */\n scrollbar-width: none;\n}\n\n.wx-menu--horizontal::-webkit-scrollbar {\n display: none;\n}\n\n/*\n * A bar that folds its overflow away never scrolls: what does not fit has somewhere\n * to be. It is still clipped, for the frame in which everything is measured.\n */\n.wx-menu--overflow {\n overflow-x: hidden;\n}\n\n/*\n * The rail is a column of squares, so the padding around it comes down to the gap\n * that keeps them off the edge — the width of the sidebar is doing the spacing.\n */\n.wx-menu--collapsed {\n align-items: center;\n padding: var(--wx-space-6) var(--wx-space-4);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useMenu, useSubmenu } from '../../composables/useMenu'\nimport '../../styles/menu.css'\nimport type { MenuGroupProps } from './types'\n\ndefineOptions({ name: 'WxMenuGroup' })\n\nconst props = withDefaults(defineProps<MenuGroupProps>(), {\n title: undefined,\n})\n\nconst menu = useMenu()\nconst submenu = useSubmenu()\n\n/*\n * A group labels entries; it does not contain them the way a submenu does. It adds\n * no depth, so the entries under it line up with everything else at their level.\n */\nconst collapsed = computed(() => menu?.collapsed.value ?? false)\nconst hasTitle = computed(() => Boolean(props.title || !collapsed.value))\n</script>\n\n<template>\n <li class=\"wx-menu-group\" :class=\"{ 'wx-menu-group--collapsed': collapsed }\">\n <span\n v-if=\"hasTitle && !collapsed\"\n class=\"wx-menu-group__title\"\n :style=\"{ '--wx-menu-depth': submenu.depth }\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <!-- On the rail there is no room for a heading, so the group becomes a rule. -->\n <span v-else class=\"wx-menu-group__rule\" role=\"separator\" />\n\n <ul class=\"wx-menu-group__list\">\n <slot />\n </ul>\n </li>\n</template>\n\n<style scoped>\n.wx-menu-group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-menu-gap, 2px);\n min-width: 0;\n /*\n * Air above the heading, so a group reads as a break in the list — and nothing but\n * that air: a scoped rule, to outweigh a host stylesheet spacing `li + li`.\n */\n margin: var(--wx-space-8) 0 0;\n}\n\n.wx-menu-group:first-child {\n margin-top: 0;\n}\n\n.wx-menu-group__title {\n padding-inline: calc(\n var(--wx-menu-row-padding, 10px) + var(--wx-menu-depth, 0) * var(--wx-menu-indent, 16px)\n )\n var(--wx-menu-row-padding, 10px);\n padding-block: var(--wx-space-4);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n font-weight: var(--wx-font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.wx-menu-group__rule {\n height: 1px;\n margin-block: var(--wx-space-4);\n margin-inline: var(--wx-space-6);\n background: var(--wx-border-muted);\n}\n\n.wx-menu-group__list {\n display: flex;\n flex-direction: column;\n gap: var(--wx-menu-gap, 2px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-menu-group--collapsed .wx-menu-group__list {\n align-items: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, watch } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useMenu, useSubmenu } from '../../composables/useMenu'\nimport '../../styles/menu.css'\nimport type { MenuItemEmits, MenuItemProps } from './types'\n\ndefineOptions({ name: 'WxMenuItem', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<MenuItemProps>(), {\n value: undefined,\n icon: undefined,\n label: undefined,\n href: undefined,\n target: undefined,\n as: undefined,\n disabled: false,\n})\n\nconst emit = defineEmits<MenuItemEmits>()\n\nconst menu = useMenu()\nconst submenu = useSubmenu()\n\nconst collapsed = computed(() => menu?.collapsed.value ?? false)\nconst isActive = computed(() => props.value !== undefined && menu?.active.value === props.value)\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n\nconst nativeAttrs = computed(() => {\n const attrs: Record<string, unknown> = {}\n\n if (props.href) {\n attrs.href = props.disabled ? undefined : props.href\n attrs.target = props.target\n if (props.target === '_blank') attrs.rel = 'noopener noreferrer'\n } else if (!props.as) {\n attrs.type = 'button'\n attrs.disabled = props.disabled\n }\n\n if (props.disabled) {\n attrs['aria-disabled'] = 'true'\n if (props.href || props.as) attrs.tabindex = -1\n }\n\n /*\n * `aria-current` on a link, `aria-pressed` on a button: the entry is either the\n * page you are on or a control that is switched on, and a screen reader is told\n * which of the two this menu is made of.\n */\n if (isActive.value) {\n if (props.href || props.as) attrs['aria-current'] = 'page'\n else attrs['aria-pressed'] = 'true'\n }\n\n return attrs\n})\n\nconst classes = computed(() => [\n 'wx-menu-row',\n { 'is-active': isActive.value, 'is-disabled': props.disabled },\n])\n\n/*\n * The entry reports where it sits so its branch can be highlighted and expanded\n * without the menu walking the component tree to find out.\n */\nwatch(\n () => props.value,\n (value, previous) => {\n if (previous !== undefined) menu?.unregister(previous)\n if (value !== undefined) menu?.register(value, submenu.ancestors)\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n if (props.value !== undefined) menu?.unregister(props.value)\n})\n\nfunction onClick(event: MouseEvent) {\n if (props.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n emit('click', event)\n if (props.value !== undefined) menu?.select(props.value, event)\n\n /*\n * Choosing an entry is what a flyout was opened for, so it closes here rather than\n * on any click inside the panel — the branches in a panel are opened by clicking\n * too, and a panel that shut on that could never be opened past its first level.\n */\n menu?.closeFlyouts()\n}\n</script>\n\n<template>\n <li class=\"wx-menu-item\">\n <component\n :is=\"tag\"\n v-bind=\"{ ...nativeAttrs, ...$attrs }\"\n :class=\"classes\"\n :style=\"{ '--wx-menu-depth': submenu.depth }\"\n :title=\"collapsed ? label : undefined\"\n @click=\"onClick\"\n >\n <span v-if=\"icon || $slots.icon\" class=\"wx-menu-row__icon\">\n <slot name=\"icon\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n\n <span class=\"wx-menu-row__label\">\n <slot>{{ label }}</slot>\n </span>\n\n <span v-if=\"$slots.trailing\" class=\"wx-menu-row__trailing\">\n <slot name=\"trailing\" />\n </span>\n </component>\n </li>\n</template>\n\n<style scoped>\n/*\n * The entry owns its margins, and says so from a scoped rule so that it outweighs a\n * host stylesheet spacing list items — VitePress puts 8px between every `li + li`,\n * and a CMS theme will have its own. Left alone, that walks a menu bar down the page\n * like a staircase and pulls a sidebar's rows apart.\n */\n.wx-menu-item {\n min-width: 0;\n margin: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { PaginationEmits, PaginationProps } from './types'\n\ndefineOptions({ name: 'WxPagination' })\n\nconst props = withDefaults(defineProps<PaginationProps>(), {\n paginator: null,\n total: undefined,\n lastPage: undefined,\n siblings: 1,\n perPageOptions: () => [],\n showTotal: true,\n disabled: false,\n size: 'md',\n ariaLabel: 'Pagination',\n})\n\nconst emit = defineEmits<PaginationEmits>()\n\n/**\n * Both models fall back to the paginator, so `:paginator=\"page\"` alone is a working\n * component and `v-model:page` is there for state the caller would rather own.\n */\nconst page = defineModel<number | undefined>('page', { default: undefined })\nconst perPage = defineModel<number | undefined>('perPage', { default: undefined })\n\nconst currentPerPage = computed(() => perPage.value ?? props.paginator?.per_page ?? 15)\nconst total = computed(() => props.total ?? props.paginator?.total ?? 0)\n\nconst lastPage = computed(() => {\n if (props.lastPage !== undefined) return Math.max(1, props.lastPage)\n if (props.paginator) return Math.max(1, props.paginator.last_page)\n return Math.max(1, Math.ceil(total.value / currentPerPage.value))\n})\n\n/**\n * Clamped to what exists. A remembered page can outlive the result it belonged to —\n * a filter narrows eleven pages down to two — and a pagination with no page marked\n * current tells the reader they are nowhere.\n */\nconst currentPage = computed(() => {\n const asked = page.value ?? props.paginator?.current_page ?? 1\n return Math.min(Math.max(1, asked), lastPage.value)\n})\n\n/** Laravel counts these for us; without it they follow from the page and its size. */\nconst from = computed(() => {\n if (props.paginator) return props.paginator.from\n return total.value === 0 ? null : (currentPage.value - 1) * currentPerPage.value + 1\n})\n\nconst to = computed(() => {\n if (props.paginator) return props.paginator.to\n return total.value === 0 ? null : Math.min(total.value, currentPage.value * currentPerPage.value)\n})\n\ntype PageItem = { type: 'page'; value: number } | { type: 'gap'; value: string }\n\n/**\n * First and last are always reachable, the current page keeps `siblings` neighbours,\n * and what is skipped becomes an ellipsis. A gap of exactly one page is spelled out\n * instead — an ellipsis hiding a single number helps nobody.\n */\nconst items = computed<PageItem[]>(() => {\n const last = lastPage.value\n const current = currentPage.value\n const span = props.siblings\n\n const wanted = new Set<number>([1, last])\n for (let i = current - span; i <= current + span; i++) {\n if (i >= 1 && i <= last) wanted.add(i)\n }\n\n const numbers = [...wanted].sort((a, b) => a - b)\n const result: PageItem[] = []\n let previous = 0\n\n for (const value of numbers) {\n const distance = value - previous\n if (previous && distance === 2) result.push({ type: 'page', value: value - 1 })\n else if (previous && distance > 2) result.push({ type: 'gap', value: `gap-${value}` })\n result.push({ type: 'page', value })\n previous = value\n }\n\n return result\n})\n\nconst classes = computed(() => [\n 'wx-pagination',\n `wx-pagination--${props.size}`,\n { 'is-disabled': props.disabled },\n])\n\nfunction go(next: number) {\n const target = Math.min(Math.max(1, next), lastPage.value)\n if (props.disabled || target === currentPage.value) return\n page.value = target\n emit('change', { page: target, perPage: currentPerPage.value })\n}\n\n/**\n * A bigger page can put the current position past the end, so the size change also\n * moves back to the first page — the alternative is asking for a page that is not there.\n */\nfunction setPerPage(event: Event) {\n const value = Number((event.target as HTMLSelectElement).value)\n if (!Number.isFinite(value) || value === currentPerPage.value) return\n perPage.value = value\n page.value = 1\n emit('change', { page: 1, perPage: value })\n}\n</script>\n\n<template>\n <nav :class=\"classes\" :aria-label=\"ariaLabel\">\n <p v-if=\"showTotal\" class=\"wx-pagination__total\">\n <slot name=\"total\" :from=\"from\" :to=\"to\" :total=\"total\">\n <template v-if=\"from === null\">Nothing to show</template>\n <template v-else>{{ from }}–{{ to }} of {{ total }}</template>\n </slot>\n </p>\n\n <div class=\"wx-pagination__controls\">\n <label v-if=\"perPageOptions.length\" class=\"wx-pagination__per-page\">\n <span class=\"wx-pagination__per-page-label\">Per page</span>\n <select\n class=\"wx-pagination__select\"\n :value=\"currentPerPage\"\n :disabled=\"disabled\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in perPageOptions\" :key=\"option\" :value=\"option\">\n {{ option }}\n </option>\n </select>\n </label>\n\n <ul class=\"wx-pagination__list\">\n <li>\n <button\n class=\"wx-pagination__button wx-pagination__button--arrow\"\n type=\"button\"\n :disabled=\"disabled || currentPage <= 1\"\n aria-label=\"Previous page\"\n @click=\"go(currentPage - 1)\"\n >\n <svg viewBox=\"0 0 8 12\" aria-hidden=\"true\"><path d=\"M6.5 1 1.5 6l5 5\" /></svg>\n </button>\n </li>\n\n <li v-for=\"item in items\" :key=\"item.value\">\n <span v-if=\"item.type === 'gap'\" class=\"wx-pagination__gap\" aria-hidden=\"true\"\n >…</span\n >\n <button\n v-else\n class=\"wx-pagination__button\"\n type=\"button\"\n :class=\"{ 'is-current': item.value === currentPage }\"\n :disabled=\"disabled\"\n :aria-current=\"item.value === currentPage ? 'page' : undefined\"\n :aria-label=\"`Page ${item.value}`\"\n @click=\"go(item.value)\"\n >\n {{ item.value }}\n </button>\n </li>\n\n <li>\n <button\n class=\"wx-pagination__button wx-pagination__button--arrow\"\n type=\"button\"\n :disabled=\"disabled || currentPage >= lastPage\"\n aria-label=\"Next page\"\n @click=\"go(currentPage + 1)\"\n >\n <svg viewBox=\"0 0 8 12\" aria-hidden=\"true\"><path d=\"M1.5 1 6.5 6l-5 5\" /></svg>\n </button>\n </li>\n </ul>\n </div>\n </nav>\n</template>\n\n<style scoped>\n.wx-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-12);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-pagination__total {\n margin: 0;\n padding: 0;\n}\n\n/*\n * Everything below wraps rather than overflows. On a phone the row of buttons is wider\n * than the screen well before the page count gets interesting, and a nav that runs off\n * the edge takes the last pages with it — including, often enough, the next arrow.\n */\n.wx-pagination__controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-12);\n margin-left: auto;\n}\n\n.wx-pagination__per-page {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-pagination__per-page-label {\n white-space: nowrap;\n}\n\n.wx-pagination__select {\n height: var(--wx-pagination-size, 34px);\n padding: 0 var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font: inherit;\n cursor: pointer;\n}\n\n.wx-pagination__select:focus-visible {\n outline: none;\n border-color: var(--wx-border-focus);\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * The same explicit resets the table needs. A host stylesheet that puts space between\n * consecutive list items — VitePress adds 8px, and every CSS framework has a rule of\n * its own — lands inside the row of buttons and steps them down one by one, because\n * the margin arrives on all but the first item.\n */\n.wx-pagination__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-4);\n margin: 0;\n padding: 0;\n border: 0;\n list-style: none;\n}\n\n.wx-pagination__list li {\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-pagination__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: var(--wx-pagination-size, 34px);\n height: var(--wx-pagination-size, 34px);\n padding: 0 var(--wx-space-8);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font: inherit;\n cursor: pointer;\n transition:\n background var(--wx-duration-fast) var(--wx-easing-standard),\n border-color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-pagination--sm {\n --wx-pagination-size: 28px;\n}\n\n.wx-pagination--lg {\n --wx-pagination-size: 42px;\n}\n\n.wx-pagination__button:hover:not(:disabled):not(.is-current) {\n border-color: var(--wx-border-strong);\n background: var(--wx-bg-fill);\n}\n\n.wx-pagination__button:focus-visible {\n outline: none;\n border-color: var(--wx-border-focus);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-pagination__button.is-current {\n background: var(--wx-color-primary);\n border-color: var(--wx-color-primary);\n color: var(--wx-color-primary-contrast);\n cursor: default;\n}\n\n.wx-pagination__button:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-pagination__button--arrow svg {\n width: 8px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.wx-pagination__gap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--wx-space-24);\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots, watch } from 'vue'\nimport {\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport WxIcon from '../Icon/Icon.vue'\nimport type { PopoverEmits, PopoverProps } from './types'\n\ndefineOptions({ name: 'WxPopover', inheritAttrs: false })\n\n/*\n * A panel, not a menu. `WxDropdown` is the menu — it closes on any click inside,\n * because picking an item is the whole interaction. Here the click is part of the work\n * being done in the panel, so the panel stays until something closes it: the ×, a\n * button in the footer, Escape, or a click outside.\n */\nconst props = withDefaults(defineProps<PopoverProps>(), {\n side: 'bottom',\n align: 'center',\n offset: 8,\n alignOffset: 0,\n arrow: true,\n title: undefined,\n width: undefined,\n teleport: true,\n modal: false,\n disabled: false,\n closable: false,\n closeLabel: 'Close',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<PopoverEmits>()\n\ndefineSlots<{\n /** The control the panel hangs off. Exactly one element. */\n trigger?: (props: { open: boolean }) => unknown\n /** The panel. */\n default?: (props: { close: () => void }) => unknown\n /** Replaces `title`. */\n title?: () => unknown\n /** A row under the panel — where the Save and Cancel usually go. */\n footer?: (props: { close: () => void }) => unknown\n}>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst slots = useSlots()\n\nfunction close() {\n open.value = false\n}\n\nwatch(open, (value) => {\n if (value) emit('open')\n else emit('close')\n})\n\nconst hasHeader = computed(() => Boolean(props.title || slots.title || props.closable))\n\nconst panelStyle = computed(() => {\n const { width } = props\n if (width === undefined) return undefined\n\n /*\n * `width=\"280\"` in a template is the string \"280\", which is not a CSS length and\n * would be dropped without a word. A bare number means pixels, however it arrives.\n */\n const bare = typeof width === 'number' || /^\\d+(\\.\\d+)?$/.test(width)\n return { width: bare ? `${width}px` : width }\n})\n\ndefineExpose({ close })\n</script>\n\n<template>\n <popover-root v-model:open=\"open\" :modal=\"modal\">\n <!--\n `as-child`: the trigger is whatever the caller already has — a button, an icon\n button, a tab — and wrapping it in a button of ours would nest one inside another.\n -->\n <popover-trigger as-child :disabled=\"disabled\">\n <slot name=\"trigger\" :open=\"open\" />\n </popover-trigger>\n\n <popover-portal :disabled=\"!teleport\">\n <popover-content\n v-bind=\"$attrs\"\n class=\"wx-popover\"\n :style=\"panelStyle\"\n :side=\"side\"\n :align=\"align\"\n :side-offset=\"offset\"\n :align-offset=\"alignOffset\"\n :aria-label=\"ariaLabel\"\n >\n <header v-if=\"hasHeader\" class=\"wx-popover__header\">\n <div class=\"wx-popover__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <popover-close v-if=\"closable\" class=\"wx-popover__close\" :aria-label=\"closeLabel\">\n <wx-icon name=\"close\" />\n </popover-close>\n </header>\n\n <div class=\"wx-popover__body\">\n <slot :close=\"close\" />\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"wx-popover__footer\">\n <slot name=\"footer\" :close=\"close\" />\n </footer>\n\n <popover-arrow v-if=\"arrow\" class=\"wx-popover__arrow\" :width=\"12\" :height=\"6\" />\n </popover-content>\n </popover-portal>\n </popover-root>\n</template>\n\n<style>\n/* The panel is teleported, so its styles cannot be scoped to the component. */\n.wx-popover {\n /*\n * Every floating panel of ours sits on this one layer — a select opened inside a\n * popover has to cover it, and the panels are added to the document as they open, so\n * the last one opened is the one on top. Separate layers would rank them by kind\n * instead, and a list would disappear behind the panel it was opened from.\n */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n width: max-content;\n min-width: 200px;\n max-width: min(90vw, 360px);\n padding: var(--wx-space-14) var(--wx-space-16);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n\n/* Reka focuses the panel when it opens; the ring belongs on what is inside it. */\n.wx-popover:focus,\n.wx-popover:focus-visible {\n outline: none;\n}\n\n.wx-popover__header {\n display: flex;\n align-items: flex-start;\n gap: var(--wx-space-8);\n}\n\n.wx-popover__title {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-popover__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n /* Pulled into the padding so the × sits in the corner, not inside the text block. */\n margin: -4px -6px 0 0;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-md);\n cursor: pointer;\n}\n\n.wx-popover__close:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-popover__close:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n/*\n * A column rather than a plain block: two fields dropped into a panel with nothing\n * around them would otherwise sit against each other. A `WxForm` inside keeps its own\n * rhythm — one child has nothing to be spaced from.\n */\n.wx-popover__body {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-10);\n min-width: 0;\n}\n\n.wx-popover__footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wx-space-8);\n}\n\n/*\n * The arrow is an open path — filled it is the triangle, stroked it is only the two\n * slanted edges, which is exactly the panel's border continuing around the point. The\n * pixel of overlap hides the border line that would otherwise run across its base.\n */\n.wx-popover__arrow {\n transform: translateY(-1px);\n fill: var(--wx-bg-surface);\n stroke: var(--wx-border-default);\n stroke-width: 1px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ProseProps } from './types'\n\ndefineOptions({ name: 'WxProse' })\n\nconst props = withDefaults(defineProps<ProseProps>(), {\n html: undefined,\n size: 'md',\n as: 'div',\n})\n\nconst classes = computed(() => ['wx-prose', `wx-prose--${props.size}`])\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\">\n <!--\n The markup goes into a plain element rather than onto the dynamic tag itself:\n `v-html` on `<component :is>` is meaningless when `as` names a component, and\n every rule below matches descendants, so the extra div changes nothing visually.\n\n The rule is right that this is where an XSS would land, and there is nothing the\n component can do about it: what counts as allowed markup — an embed, an inline\n style, a class — is the application's decision, not a design system's. The prop\n is documented as server-sanitised, and this is the line that trusts it.\n -->\n <!-- eslint-disable-next-line vue/no-v-html -->\n <div v-if=\"html !== undefined\" class=\"wx-prose__content\" v-html=\"html\"></div>\n <slot v-else />\n </component>\n</template>\n\n<style scoped>\n/*\n * Every rule is a `:deep` one on purpose: the markup usually arrives through `v-html`\n * and therefore carries no scope attribute of its own.\n */\n.wx-prose {\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-prose-font-size, var(--wx-font-size-md));\n line-height: var(--wx-font-line-height-relaxed);\n /* The rhythm between blocks: one variable, so a caller can tighten the whole block. */\n --wx-prose-flow: var(--wx-space-16);\n}\n\n.wx-prose--sm {\n --wx-prose-font-size: var(--wx-font-size-sm);\n --wx-prose-flow: var(--wx-space-12);\n}\n\n.wx-prose--lg {\n --wx-prose-font-size: var(--wx-font-size-lg);\n --wx-prose-flow: var(--wx-space-18);\n}\n\n/* The rhythm: every block carries the gap below it, the last one drops it again. */\n.wx-prose :deep(p),\n.wx-prose :deep(ul),\n.wx-prose :deep(ol),\n.wx-prose :deep(dl),\n.wx-prose :deep(blockquote),\n.wx-prose :deep(pre),\n.wx-prose :deep(figure),\n.wx-prose :deep(table) {\n margin: 0 0 var(--wx-prose-flow);\n}\n\n.wx-prose :deep(:last-child) {\n margin-bottom: 0;\n}\n\n/* headings */\n.wx-prose :deep(h1),\n.wx-prose :deep(h2),\n.wx-prose :deep(h3),\n.wx-prose :deep(h4),\n.wx-prose :deep(h5),\n.wx-prose :deep(h6) {\n /* Air above a heading, tight to the paragraph it introduces. */\n margin: var(--wx-space-32) 0 var(--wx-space-12);\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n text-wrap: balance;\n}\n\n.wx-prose :deep(h1) {\n font-size: var(--wx-font-size-3xl);\n font-weight: var(--wx-font-weight-bold);\n}\n\n.wx-prose :deep(h2) {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-prose :deep(h3) {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-prose :deep(h4) {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-prose :deep(h5),\n.wx-prose :deep(h6) {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-prose :deep(:first-child) {\n margin-top: 0;\n}\n\n.wx-prose :deep(a) {\n color: var(--wx-text-link);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n\n.wx-prose :deep(a:hover) {\n color: var(--wx-color-primary-hover);\n}\n\n.wx-prose :deep(strong),\n.wx-prose :deep(b) {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-prose :deep(small) {\n font-size: var(--wx-font-size-sm);\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(mark) {\n padding: 0 2px;\n background: var(--wx-color-warning-soft);\n border-radius: var(--wx-radius-none);\n color: inherit;\n}\n\n/* lists */\n.wx-prose :deep(ul),\n.wx-prose :deep(ol) {\n padding-left: var(--wx-space-24);\n}\n\n.wx-prose :deep(li + li) {\n margin-top: var(--wx-space-6);\n}\n\n.wx-prose :deep(li > ul),\n.wx-prose :deep(li > ol) {\n margin-top: var(--wx-space-6);\n}\n\n.wx-prose :deep(ul) {\n list-style: disc;\n}\n\n.wx-prose :deep(ol) {\n list-style: decimal;\n}\n\n.wx-prose :deep(li::marker) {\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(dt) {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-prose :deep(dd) {\n margin: 0 0 var(--wx-space-8);\n color: var(--wx-text-muted);\n}\n\n/* quotes and rules */\n.wx-prose :deep(blockquote) {\n padding: var(--wx-space-4) var(--wx-space-16);\n border-left: 3px solid var(--wx-color-primary);\n color: var(--wx-text-muted);\n}\n\n.wx-prose :deep(hr) {\n height: 0;\n margin: var(--wx-space-24) 0;\n border: none;\n border-top: 1px solid var(--wx-border-default);\n}\n\n/* code */\n.wx-prose :deep(code) {\n padding: 1px 5px;\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-family: var(--wx-font-family-mono);\n font-size: 0.9em;\n}\n\n.wx-prose :deep(pre) {\n padding: var(--wx-space-14) var(--wx-space-16);\n background: var(--wx-bg-muted);\n border-radius: var(--wx-radius-sm);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n overflow-x: auto;\n}\n\n.wx-prose :deep(pre code) {\n padding: 0;\n background: none;\n font-size: inherit;\n}\n\n/* media */\n.wx-prose :deep(img),\n.wx-prose :deep(video) {\n max-width: 100%;\n height: auto;\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-prose :deep(figcaption) {\n margin-top: var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n\n.wx-prose :deep(iframe) {\n max-width: 100%;\n border: none;\n border-radius: var(--wx-radius-sm);\n}\n\n/*\n * A pasted table is usually wider than the column it lands in, so it scrolls inside\n * its own box instead of pushing the page sideways.\n */\n.wx-prose :deep(table) {\n display: block;\n width: 100%;\n max-width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n overflow-x: auto;\n}\n\n.wx-prose :deep(th),\n.wx-prose :deep(td) {\n padding: var(--wx-space-8) var(--wx-space-12);\n border: 1px solid var(--wx-border-default);\n text-align: start;\n vertical-align: top;\n}\n\n.wx-prose :deep(th) {\n background: var(--wx-bg-subtle);\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n white-space: nowrap;\n}\n\n.wx-prose :deep(caption) {\n margin-bottom: var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: start;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport { radioGroupKey, useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport type { RadioEmits, RadioProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxRadio', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n label: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<RadioEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: null })\n\nconst group = inject(radioGroupKey, null)\nconst field = useFormField(props)\n\nconst checked = computed(() =>\n group ? group.modelValue.value === props.value : model.value === props.value,\n)\n\nconst disabled = computed(() => props.disabled || group?.disabled.value || field.disabled.value)\nconst size = computed(() => props.size ?? group?.size.value ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-radio',\n `wx-radio--${size.value}`,\n { 'is-checked': checked.value, 'is-disabled': disabled.value },\n])\n\nfunction onChange() {\n if (group) group.toggle(props.value, true)\n else model.value = props.value\n emit('change', props.value)\n}\n</script>\n\n<template>\n <label :class=\"classes\" v-bind=\"rootAttrs\">\n <input\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-radio__native\"\n type=\"radio\"\n :name=\"name ?? group?.name.value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-radio__box\" aria-hidden=\"true\">\n <svg class=\"wx-radio__mark\" viewBox=\"0 0 20 20\">\n <circle class=\"wx-radio__ring\" cx=\"10\" cy=\"10\" r=\"9.5\" />\n <circle class=\"wx-radio__dot\" cx=\"10\" cy=\"10\" r=\"4\" />\n </svg>\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-radio__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-radio {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-radio.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-radio__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/*\n * The box only holds the size and the focus ring; the circles are drawn inside it. A CSS\n * border plus a centred child cannot stay concentric at a fractional device pixel ratio —\n * Windows at 125% or 150% rounds the 1px border to a whole device pixel on each side\n * independently, which moves the content box off the centre of the border box and takes\n * the dot with it. Ring and dot as two circles on one origin cannot drift apart: the\n * renderer resolves both against real geometry and antialiases, instead of snapping boxes.\n */\n.wx-radio__box {\n display: block;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: var(--wx-radio-size, 20px);\n height: var(--wx-radio-size, 20px);\n border-radius: var(--wx-radius-full);\n transition: box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio--sm {\n --wx-radio-size: 16px;\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-radio--md {\n --wx-radio-size: 20px;\n /* A tick beside a label is a choice in a list, and reads at the list size. */\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-radio--lg {\n --wx-radio-size: 24px;\n font-size: var(--wx-font-size-control-lg);\n}\n\n/* The ring's outer half of stroke sits on the viewport edge, so it must not be clipped. */\n.wx-radio__mark {\n display: block;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/*\n * `non-scaling-stroke` keeps the ring one pixel wide at every size, the way the checkbox\n * border is, instead of thinning to 0.8px on `sm` and thickening to 1.2px on `lg`.\n */\n.wx-radio__ring {\n fill: var(--wx-bg-surface);\n stroke: var(--wx-border-strong);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n transition: stroke var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio__dot {\n fill: var(--wx-color-primary);\n transform: scale(0);\n transform-box: fill-box;\n transform-origin: center;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-radio:hover:not(.is-disabled) .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio.is-checked .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio.is-checked .wx-radio__dot {\n transform: scale(1);\n}\n\n.wx-radio.is-disabled .wx-radio__ring {\n fill: var(--wx-bg-disabled);\n stroke: var(--wx-border-default);\n}\n\n.wx-radio.is-disabled .wx-radio__dot {\n fill: var(--wx-color-primary-disabled);\n}\n\n.wx-radio__native:focus-visible + .wx-radio__box {\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-radio__native:focus-visible + .wx-radio__box .wx-radio__ring {\n stroke: var(--wx-color-primary);\n}\n\n.wx-radio__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-radio__box,\n .wx-radio__ring,\n .wx-radio__dot {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport {\n radioGroupKey,\n useFormField,\n useId,\n type ChoiceValue,\n} from '../../composables/useFormField'\nimport WxRadio from '../Radio/Radio.vue'\nimport type { RadioGroupEmits, RadioGroupProps } from './types'\n\ndefineOptions({ name: 'WxRadioGroup' })\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n options: undefined,\n disabled: undefined,\n size: undefined,\n name: undefined,\n inline: false,\n})\n\nconst emit = defineEmits<RadioGroupEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: null })\n\nconst field = useFormField(props)\nconst fallbackName = useId('wx-radio-group')\n\n/** A group cannot be the target of a `for`, so the item label becomes a span. */\nfield.item?.registerLabelTarget(undefined)\n\nconst disabled = computed(() => props.disabled ?? field.disabled.value)\nconst size = computed(() => props.size ?? field.size.value)\n\n/**\n * Radios sharing a `name` are one roving-tabindex group in the browser, which is\n * what gives arrow-key navigation for free — so a name is always set.\n */\nconst name = computed(() => props.name ?? fallbackName)\n\nfunction toggle(value: ChoiceValue) {\n if (model.value === value) return\n model.value = value\n emit('change', value)\n}\n\nprovide(radioGroupKey, {\n name,\n modelValue: computed(() => model.value),\n disabled,\n size,\n toggle,\n})\n</script>\n\n<template>\n <div\n :class=\"['wx-radio-group', { 'wx-radio-group--inline': inline }]\"\n role=\"radiogroup\"\n :aria-labelledby=\"field.item ? `${field.item.id.value}-label` : undefined\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <slot>\n <wx-radio\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :label=\"option.label\"\n :disabled=\"option.disabled\"\n />\n </slot>\n </div>\n</template>\n\n<style scoped>\n.wx-radio-group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-radio-group--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--wx-space-16);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { RateEmits, RateProps } from './types'\n\ndefineOptions({ name: 'WxRate', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<RateProps>(), {\n max: 5,\n allowHalf: false,\n clearable: true,\n showValue: false,\n readonly: false,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<RateEmits>()\n\nconst model = defineModel<number>({ default: 0 })\n\nconst field = useFormField(props)\nconst hovered = ref<number | null>(null)\n\nconst interactive = computed(() => !field.disabled.value && !props.readonly)\n\n/** What the stars show right now: the hovered value while pointing, the model otherwise. */\nconst shown = computed(() => hovered.value ?? model.value ?? 0)\n\nconst stars = computed(() =>\n Array.from({ length: props.max }, (_, index) => {\n const position = index + 1\n const fill = Math.min(Math.max(shown.value - index, 0), 1)\n return { position, full: fill >= 1, half: fill > 0 && fill < 1 }\n }),\n)\n\nconst classes = computed(() => [\n 'wx-rate',\n `wx-rate--${field.size.value}`,\n { 'is-disabled': field.disabled.value, 'is-readonly': props.readonly },\n])\n\n/** Halves come from the pointer landing on the left side of a star. */\nfunction valueAt(position: number, event: MouseEvent): number {\n if (!props.allowHalf) return position\n const target = event.currentTarget as HTMLElement\n const { left, width } = target.getBoundingClientRect()\n return event.clientX - left < width / 2 ? position - 0.5 : position\n}\n\n/** `toggle` is what makes clicking the current value clear it — the arrow keys must not. */\nfunction set(value: number, toggle = false) {\n const next = toggle && props.clearable && model.value === value ? 0 : value\n if (next === model.value) return\n model.value = next\n emit('change', next)\n}\n\nfunction onClick(position: number, event: MouseEvent) {\n if (!interactive.value) return\n set(valueAt(position, event), true)\n}\n\nfunction onHover(position: number, event: MouseEvent) {\n if (!interactive.value) return\n hovered.value = valueAt(position, event)\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (!interactive.value) return\n const step = props.allowHalf ? 0.5 : 1\n const current = model.value ?? 0\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n event.preventDefault()\n set(Math.min(current + step, props.max))\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n event.preventDefault()\n set(Math.max(current - step, 0))\n } else if (event.key === 'Home') {\n event.preventDefault()\n set(0)\n } else if (event.key === 'End') {\n event.preventDefault()\n set(props.max)\n }\n}\n</script>\n\n<template>\n <div\n :id=\"field.id.value\"\n v-bind=\"$attrs\"\n :class=\"classes\"\n role=\"slider\"\n :tabindex=\"interactive ? 0 : -1\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"model ?? 0\"\n :aria-readonly=\"readonly || undefined\"\n :aria-disabled=\"field.disabled.value || undefined\"\n @keydown=\"onKeydown\"\n @mouseleave=\"hovered = null\"\n >\n <span\n v-for=\"star in stars\"\n :key=\"star.position\"\n class=\"wx-rate__star\"\n :class=\"{ 'is-full': star.full, 'is-half': star.half }\"\n @click=\"onClick(star.position, $event)\"\n @mousemove=\"onHover(star.position, $event)\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n class=\"wx-rate__outline\"\n d=\"M12 3.5l2.6 5.3 5.9.9-4.2 4.1 1 5.8-5.3-2.8-5.3 2.8 1-5.8-4.2-4.1 5.9-.9z\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linejoin=\"round\"\n />\n <path\n class=\"wx-rate__fill\"\n d=\"M12 3.5l2.6 5.3 5.9.9-4.2 4.1 1 5.8-5.3-2.8-5.3 2.8 1-5.8-4.2-4.1 5.9-.9z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n\n <span v-if=\"showValue\" class=\"wx-rate__value\">{{ model ?? 0 }}</span>\n\n <input v-if=\"name\" type=\"hidden\" :name=\"name\" :value=\"model ?? 0\" />\n </div>\n</template>\n\n<style scoped>\n.wx-rate {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-2);\n color: var(--wx-border-strong);\n}\n\n.wx-rate:focus-visible {\n outline: none;\n border-radius: var(--wx-radius-xs);\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-rate--sm {\n --wx-rate-size: 18px;\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-rate--md {\n --wx-rate-size: 22px;\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-rate--lg {\n --wx-rate-size: 28px;\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-rate__star {\n display: inline-flex;\n width: var(--wx-rate-size, 22px);\n height: var(--wx-rate-size, 22px);\n cursor: pointer;\n}\n\n.wx-rate.is-disabled .wx-rate__star,\n.wx-rate.is-readonly .wx-rate__star {\n cursor: default;\n}\n\n.wx-rate.is-disabled {\n opacity: 0.6;\n}\n\n.wx-rate__star svg {\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* The filled star is clipped to nothing, then revealed whole or by half. */\n.wx-rate__fill {\n color: var(--wx-color-warning);\n clip-path: inset(0 100% 0 0);\n transition: clip-path var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-rate__star.is-full .wx-rate__fill {\n clip-path: inset(0);\n}\n\n.wx-rate__star.is-half .wx-rate__fill {\n clip-path: inset(0 50% 0 0);\n}\n\n.wx-rate__star.is-full,\n.wx-rate__star.is-half {\n color: var(--wx-color-warning);\n}\n\n.wx-rate__value {\n margin-left: var(--wx-space-6);\n color: var(--wx-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-rate__fill {\n transition: none;\n }\n}\n</style>\n","/**\n * Toolbar glyphs as raw path data, drawn on a 24×24 grid with a 1.7 stroke.\n * Inline rather than an icon package: it is a dozen paths, and a dependency for\n * that would be worse than the duplication.\n */\nexport const richTextIcons: Record<string, string> = {\n bold: 'M7 5h6a3.5 3.5 0 0 1 0 7H7zm0 7h7a3.5 3.5 0 0 1 0 7H7z',\n italic: 'M15 5h-5M14 19H9M13.5 5 10.5 19',\n strike:\n 'M5 12h14M8 8.5A3 3 0 0 1 11 6h2a3 3 0 0 1 3 2.5M16 15.5A3 3 0 0 1 13 18h-2a3 3 0 0 1-3-2.5',\n code: 'm9 8-5 4 5 4M15 8l5 4-5 4',\n bulletList: 'M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01',\n orderedList: 'M10 6h10M10 12h10M10 18h10M4 6h1v4M4 10h2M4 14h2v2H4v2h2',\n blockquote: 'M7 15V9h4v6H7l-2 3M15 15V9h4v6h-4l-2 3',\n hr: 'M4 12h16',\n link: 'M10 13a4 4 0 0 0 5.7.4l2.6-2.6a4 4 0 0 0-5.7-5.7l-1.5 1.5M14 11a4 4 0 0 0-5.7-.4l-2.6 2.6a4 4 0 0 0 5.7 5.7l1.5-1.5',\n table: 'M4 6h16v12H4zM4 10h16M10 10v8M4 14h16',\n image: 'M4 6h16v12H4zM4 15l4-4 4 4 3-3 5 5M9 9.5h.01',\n youtube:\n 'M3 8.5A2.5 2.5 0 0 1 5.5 6h13A2.5 2.5 0 0 1 21 8.5v7a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 15.5zM10.5 9.5l4 2.5-4 2.5z',\n undo: 'M4 9h11a4.5 4.5 0 0 1 0 9h-4M4 9l4-4M4 9l4 4',\n redo: 'M20 9H9a4.5 4.5 0 0 0 0 9h4M20 9l-4-4M20 9l-4 4',\n rowAfter: 'M4 5h16M4 11h16M8 15v6M5 18h6',\n rowBefore: 'M4 19h16M4 13h16M8 3v6M5 6h6',\n columnAfter: 'M5 4v16M11 4v16M15 8h6M18 5v6',\n columnBefore: 'M19 4v16M13 4v16M3 8h6M6 5v6',\n deleteRow: 'M4 8h16M4 16h16M9 12h6',\n deleteColumn: 'M8 4v16M16 4v16M12 9v6',\n deleteTable: 'M5 7h14M9 7V5h6v2M7 7l1 12h8l1-12M10 11v4M14 11v4',\n mergeCells: 'M4 6h16v12H4zM12 6v3M12 15v3M9 12h6M9 12l2-2M9 12l2 2',\n check: 'm5 13 4 4L19 7',\n close: 'M6 6l12 12M18 6 6 18',\n}\n","<script setup lang=\"ts\">\nimport { richTextIcons } from './icons'\n\ndefineOptions({ name: 'WxRichTextToolbarButton' })\n\nwithDefaults(\n defineProps<{\n /** Key into the icon set. Omit it and the `text` shows instead. */\n icon?: string\n /** Short label used for headings, where a glyph reads worse than \"H2\". */\n text?: string\n label: string\n active?: boolean\n disabled?: boolean\n }>(),\n { icon: undefined, text: undefined, active: false, disabled: false },\n)\n\ndefineEmits<{ click: [] }>()\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"wx-rich-text__tool\"\n :class=\"{ 'is-active': active }\"\n :title=\"label\"\n :aria-label=\"label\"\n :aria-pressed=\"active\"\n :disabled=\"disabled\"\n @click=\"$emit('click')\"\n >\n <svg v-if=\"icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n :d=\"richTextIcons[icon]\"\n stroke=\"currentColor\"\n stroke-width=\"1.7\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span v-else class=\"wx-rich-text__tool-text\">{{ text }}</span>\n </button>\n</template>\n\n<style scoped>\n.wx-rich-text__tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n padding: 0;\n background: transparent;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-default);\n cursor: pointer;\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n color var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-rich-text__tool svg {\n width: 18px;\n height: 18px;\n}\n\n.wx-rich-text__tool-text {\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-rich-text__tool:hover:not(:disabled) {\n background: var(--wx-bg-fill);\n}\n\n.wx-rich-text__tool.is-active {\n background: var(--wx-color-primary-soft);\n color: var(--wx-color-primary);\n}\n\n.wx-rich-text__tool:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-rich-text__tool:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n</style>\n","import type { RichTextTool } from './types'\n\n/**\n * Kept out of the component because `withDefaults` cannot reference a binding\n * declared inside `<script setup>` — it is hoisted out of `setup()`.\n */\nexport const DEFAULT_TOOLS: RichTextTool[] = [\n 'bold',\n 'italic',\n 'strike',\n 'code',\n 'divider',\n 'h2',\n 'h3',\n 'h4',\n 'divider',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'hr',\n 'divider',\n 'link',\n 'table',\n 'image',\n 'youtube',\n 'divider',\n 'undo',\n 'redo',\n]\n\nexport const DEFAULT_ACCEPT = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n]\n\nexport interface ToolMeta {\n label: string\n icon?: string\n text?: string\n}\n\nexport const TOOL_META: Record<Exclude<RichTextTool, 'divider'>, ToolMeta> = {\n bold: { label: 'Bold', icon: 'bold' },\n italic: { label: 'Italic', icon: 'italic' },\n strike: { label: 'Strikethrough', icon: 'strike' },\n code: { label: 'Inline code', icon: 'code' },\n h2: { label: 'Heading 2', text: 'H2' },\n h3: { label: 'Heading 3', text: 'H3' },\n h4: { label: 'Heading 4', text: 'H4' },\n bulletList: { label: 'Bulleted list', icon: 'bulletList' },\n orderedList: { label: 'Numbered list', icon: 'orderedList' },\n blockquote: { label: 'Quote', icon: 'blockquote' },\n hr: { label: 'Divider', icon: 'hr' },\n link: { label: 'Link', icon: 'link' },\n table: { label: 'Table', icon: 'table' },\n image: { label: 'Image', icon: 'image' },\n youtube: { label: 'YouTube video', icon: 'youtube' },\n undo: { label: 'Undo', icon: 'undo' },\n redo: { label: 'Redo', icon: 'redo' },\n}\n\n/** Shown as a second row while the caret sits inside a table. */\nexport const TABLE_TOOLS = [\n { key: 'addRowAfter', label: 'Row below', icon: 'rowAfter' },\n { key: 'addRowBefore', label: 'Row above', icon: 'rowBefore' },\n { key: 'addColumnAfter', label: 'Column after', icon: 'columnAfter' },\n { key: 'addColumnBefore', label: 'Column before', icon: 'columnBefore' },\n { key: 'deleteRow', label: 'Delete row', icon: 'deleteRow' },\n { key: 'deleteColumn', label: 'Delete column', icon: 'deleteColumn' },\n { key: 'mergeOrSplit', label: 'Merge or split cells', icon: 'mergeCells' },\n { key: 'deleteTable', label: 'Delete table', icon: 'deleteTable' },\n] as const\n\nexport type TableToolKey = (typeof TABLE_TOOLS)[number]['key']\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { EditorContent, useEditor } from '@tiptap/vue-3'\nimport StarterKit from '@tiptap/starter-kit'\nimport { TableKit } from '@tiptap/extension-table'\nimport Image from '@tiptap/extension-image'\nimport Youtube from '@tiptap/extension-youtube'\nimport FileHandler from '@tiptap/extension-file-handler'\nimport { useFormField } from '../../composables/useFormField'\nimport WxRichTextToolbarButton from './ToolbarButton.vue'\nimport { DEFAULT_ACCEPT, DEFAULT_TOOLS, TABLE_TOOLS, TOOL_META, type TableToolKey } from './tools'\nimport type { RichTextEmits, RichTextProps, RichTextTool } from './types'\n\ndefineOptions({ name: 'WxRichText', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<RichTextProps>(), {\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n size: undefined,\n status: undefined,\n id: undefined,\n ariaLabel: undefined,\n minHeight: '220px',\n tools: () => DEFAULT_TOOLS,\n upload: undefined,\n pickImage: undefined,\n accept: () => DEFAULT_ACCEPT,\n})\n\nconst emit = defineEmits<RichTextEmits>()\n\nconst model = defineModel<string>({ default: '' })\n\nconst field = useFormField(props)\nconst focused = ref(false)\nconst uploading = ref(0)\nconst fileInput = ref<HTMLInputElement | null>(null)\n\n/** The link and YouTube buttons open one shared bar rather than a `prompt()`. */\nconst prompt = ref<{ kind: 'link' | 'youtube'; value: string } | null>(null)\n\nconst editable = computed(() => !field.disabled.value && !props.readonly)\n\n/** Tiptap renders `<p></p>` for an empty document; a backend wants an empty string. */\nfunction readHtml(): string {\n const instance = editor.value\n if (!instance || instance.isEmpty) return ''\n return instance.getHTML()\n}\n\nconst editor = useEditor({\n content: model.value ?? '',\n editable: editable.value,\n extensions: [\n StarterKit.configure({\n link: {\n openOnClick: false,\n autolink: true,\n HTMLAttributes: { rel: 'noopener noreferrer nofollow', target: '_blank' },\n },\n }),\n TableKit.configure({ table: { resizable: true } }),\n Image.configure({ HTMLAttributes: { class: 'wx-rich-text__image' } }),\n Youtube.configure({ nocookie: true, width: 640, height: 360 }),\n FileHandler.configure({\n allowedMimeTypes: props.accept,\n onDrop: (_editor, files, pos) => void uploadFiles(files, pos),\n onPaste: (_editor, files) => void uploadFiles(files),\n }),\n ],\n onUpdate: () => {\n const html = readHtml()\n model.value = html\n emit('change', html)\n },\n onFocus: () => {\n focused.value = true\n emit('focus')\n },\n onBlur: () => {\n focused.value = false\n emit('blur')\n },\n})\n\n/** Only replaces the document when the value really differs, or the caret jumps. */\nwatch(model, (value) => {\n const instance = editor.value\n if (!instance) return\n if ((value ?? '') === readHtml()) return\n instance.commands.setContent(value ?? '', { emitUpdate: false })\n})\n\nwatch(editable, (value) => editor.value?.setEditable(value))\n\nconst isEmpty = computed(() => editor.value?.isEmpty ?? true)\nconst inTable = computed(() => editor.value?.isActive('table') ?? false)\n\nconst classes = computed(() => [\n 'wx-rich-text',\n `wx-rich-text--${field.size.value}`,\n {\n [`wx-rich-text--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n },\n])\n\nfunction insertImage(url: string, alt?: string, pos?: number) {\n const instance = editor.value\n if (!instance) return\n const at = pos ?? instance.state.selection.anchor\n instance\n .chain()\n .focus()\n .insertContentAt(at, { type: 'image', attrs: { src: url, alt } })\n .run()\n}\n\n/**\n * Uploads happen one file at a time and insert only on success — a failed upload\n * leaves nothing behind to clean up.\n */\nasync function uploadFiles(files: File[], pos?: number) {\n if (!props.upload) return\n for (const file of files) {\n uploading.value += 1\n try {\n const result = await props.upload(file)\n insertImage(result.url, result.alt, pos)\n } catch (error) {\n emit('uploadError', error, file)\n } finally {\n uploading.value -= 1\n }\n }\n}\n\nasync function onImageButton() {\n if (props.pickImage) {\n const url = await props.pickImage()\n if (url) insertImage(url)\n return\n }\n fileInput.value?.click()\n}\n\nfunction onFilePicked(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input.files ?? [])\n input.value = ''\n void uploadFiles(files)\n}\n\nfunction openPrompt(kind: 'link' | 'youtube') {\n const current = kind === 'link' ? (editor.value?.getAttributes('link').href ?? '') : ''\n prompt.value = { kind, value: String(current) }\n}\n\nfunction applyPrompt() {\n const instance = editor.value\n const current = prompt.value\n if (!instance || !current) return\n const value = current.value.trim()\n\n if (current.kind === 'link') {\n if (value) instance.chain().focus().extendMarkRange('link').setLink({ href: value }).run()\n else instance.chain().focus().extendMarkRange('link').unsetLink().run()\n } else if (value) {\n instance.commands.setYoutubeVideo({ src: value })\n }\n\n prompt.value = null\n}\n\n/** Whether a tool should render at all — the image button needs somewhere to get a file. */\nfunction toolVisible(tool: RichTextTool): boolean {\n if (tool === 'image') return Boolean(props.upload || props.pickImage)\n return true\n}\n\nconst visibleTools = computed(() => props.tools.filter(toolVisible))\n\nfunction isActive(tool: RichTextTool): boolean {\n const instance = editor.value\n if (!instance) return false\n switch (tool) {\n case 'h2':\n return instance.isActive('heading', { level: 2 })\n case 'h3':\n return instance.isActive('heading', { level: 3 })\n case 'h4':\n return instance.isActive('heading', { level: 4 })\n default:\n return instance.isActive(tool)\n }\n}\n\nfunction run(tool: RichTextTool) {\n const instance = editor.value\n if (!instance) return\n const chain = instance.chain().focus()\n\n switch (tool) {\n case 'bold':\n chain.toggleBold().run()\n break\n case 'italic':\n chain.toggleItalic().run()\n break\n case 'strike':\n chain.toggleStrike().run()\n break\n case 'code':\n chain.toggleCode().run()\n break\n case 'h2':\n chain.toggleHeading({ level: 2 }).run()\n break\n case 'h3':\n chain.toggleHeading({ level: 3 }).run()\n break\n case 'h4':\n chain.toggleHeading({ level: 4 }).run()\n break\n case 'bulletList':\n chain.toggleBulletList().run()\n break\n case 'orderedList':\n chain.toggleOrderedList().run()\n break\n case 'blockquote':\n chain.toggleBlockquote().run()\n break\n case 'hr':\n chain.setHorizontalRule().run()\n break\n case 'undo':\n chain.undo().run()\n break\n case 'redo':\n chain.redo().run()\n break\n case 'table':\n chain.insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()\n break\n case 'link':\n openPrompt('link')\n break\n case 'youtube':\n openPrompt('youtube')\n break\n case 'image':\n void onImageButton()\n break\n }\n}\n\nfunction runTableCommand(key: TableToolKey) {\n const instance = editor.value\n if (!instance) return\n const chain = instance.chain().focus() as unknown as Record<string, () => { run: () => void }>\n chain[key]().run()\n}\n\ndefineExpose({\n editor,\n focus: () => editor.value?.commands.focus(),\n clear: () => editor.value?.commands.clearContent(true),\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"wx-rich-text__toolbar\" role=\"toolbar\" :aria-label=\"ariaLabel ?? 'Text formatting'\">\n <template v-for=\"(tool, index) in visibleTools\" :key=\"`${tool}-${index}`\">\n <span v-if=\"tool === 'divider'\" class=\"wx-rich-text__divider\" aria-hidden=\"true\" />\n <wx-rich-text-toolbar-button\n v-else\n :icon=\"TOOL_META[tool].icon\"\n :text=\"TOOL_META[tool].text\"\n :label=\"TOOL_META[tool].label\"\n :active=\"isActive(tool)\"\n :disabled=\"!editable\"\n @click=\"run(tool)\"\n />\n </template>\n\n <span v-if=\"uploading > 0\" class=\"wx-rich-text__uploading\">Uploading…</span>\n </div>\n\n <div v-if=\"inTable && editable\" class=\"wx-rich-text__toolbar wx-rich-text__toolbar--table\">\n <wx-rich-text-toolbar-button\n v-for=\"tool in TABLE_TOOLS\"\n :key=\"tool.key\"\n :icon=\"tool.icon\"\n :label=\"tool.label\"\n @click=\"runTableCommand(tool.key)\"\n />\n </div>\n\n <form v-if=\"prompt\" class=\"wx-rich-text__prompt\" @submit.prevent=\"applyPrompt\">\n <label class=\"wx-rich-text__prompt-label\" :for=\"`${field.id.value}-prompt`\">\n {{ prompt.kind === 'link' ? 'Link address' : 'YouTube URL' }}\n </label>\n <input\n :id=\"`${field.id.value}-prompt`\"\n v-model=\"prompt.value\"\n class=\"wx-rich-text__prompt-input\"\n type=\"url\"\n :placeholder=\"prompt.kind === 'link' ? 'https://example.com' : 'https://youtu.be/…'\"\n @keydown.esc=\"prompt = null\"\n />\n <wx-rich-text-toolbar-button icon=\"check\" label=\"Apply\" @click=\"applyPrompt\" />\n <wx-rich-text-toolbar-button icon=\"close\" label=\"Cancel\" @click=\"prompt = null\" />\n </form>\n\n <div class=\"wx-rich-text__body\" :style=\"{ minHeight }\">\n <span v-if=\"placeholder && isEmpty\" class=\"wx-rich-text__placeholder\">{{ placeholder }}</span>\n <editor-content\n :editor=\"editor\"\n class=\"wx-rich-text__content\"\n :aria-describedby=\"field.describedBy.value\"\n />\n </div>\n\n <input\n v-if=\"upload && !pickImage\"\n ref=\"fileInput\"\n class=\"wx-rich-text__file\"\n type=\"file\"\n :accept=\"accept.join(',')\"\n multiple\n @change=\"onFilePicked\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-rich-text {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-rich-text.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-rich-text--error,\n.wx-rich-text--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-rich-text--success {\n border-color: var(--wx-color-success);\n}\n\n.wx-rich-text--warning {\n border-color: var(--wx-color-warning);\n}\n\n.wx-rich-text.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-rich-text__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-2);\n padding: var(--wx-space-6);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-rich-text__toolbar--table {\n background: var(--wx-bg-subtle);\n}\n\n.wx-rich-text__divider {\n width: 1px;\n height: 18px;\n margin: 0 var(--wx-space-4);\n background: var(--wx-border-default);\n}\n\n.wx-rich-text__uploading {\n margin-left: auto;\n padding: 0 var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n padding: var(--wx-space-8);\n background: var(--wx-bg-subtle);\n border-bottom: 1px solid var(--wx-border-muted);\n}\n\n.wx-rich-text__prompt-label {\n flex: 0 0 auto;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt-input {\n flex: 1 1 auto;\n min-width: 0;\n height: var(--wx-size-control-sm);\n padding: 0 var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-xs);\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-rich-text__prompt-input:focus {\n border-color: var(--wx-border-focus);\n}\n\n.wx-rich-text__body {\n position: relative;\n flex: 1 1 auto;\n padding: var(--wx-space-12) var(--wx-space-16);\n}\n\n.wx-rich-text__placeholder {\n position: absolute;\n top: var(--wx-space-12);\n left: var(--wx-space-16);\n color: var(--wx-text-placeholder);\n pointer-events: none;\n}\n\n.wx-rich-text__file {\n display: none;\n}\n\n/* The editing surface itself is rendered by ProseMirror. */\n.wx-rich-text__content :deep(.ProseMirror) {\n outline: none;\n min-height: inherit;\n line-height: var(--wx-font-line-height-relaxed);\n}\n\n/*\n * Host applications decorate content tags globally — VitePress, which renders these\n * docs, gives every h2 a top border and 24px of padding, and turns tables into\n * `display: block`. The editing surface has to look the same wherever it is\n * embedded, so anything a host is likely to set is stated here instead of inherited.\n */\n.wx-rich-text__content :deep(h1),\n.wx-rich-text__content :deep(h2),\n.wx-rich-text__content :deep(h3),\n.wx-rich-text__content :deep(h4),\n.wx-rich-text__content :deep(h5),\n.wx-rich-text__content :deep(h6) {\n margin: var(--wx-space-18) 0 var(--wx-space-8);\n padding: 0;\n border: 0;\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-rich-text__content :deep(p) {\n margin: 0 0 var(--wx-space-12);\n}\n\n/* Nothing pushes the document away from the top or bottom edge of the field. */\n.wx-rich-text__content :deep(.ProseMirror > :first-child) {\n margin-top: 0;\n}\n\n.wx-rich-text__content :deep(.ProseMirror > :last-child) {\n margin-bottom: 0;\n}\n\n.wx-rich-text__content :deep(h2) {\n font-size: var(--wx-font-size-2xl);\n}\n\n.wx-rich-text__content :deep(h3) {\n font-size: var(--wx-font-size-xl);\n}\n\n.wx-rich-text__content :deep(h4) {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-rich-text__content :deep(ul),\n.wx-rich-text__content :deep(ol) {\n margin: 0 0 var(--wx-space-12);\n padding-left: var(--wx-space-24);\n}\n\n.wx-rich-text__content :deep(blockquote) {\n margin: 0 0 var(--wx-space-12);\n padding-left: var(--wx-space-16);\n border-left: 3px solid var(--wx-color-primary-soft);\n color: var(--wx-text-muted);\n}\n\n.wx-rich-text__content :deep(a) {\n color: var(--wx-text-link);\n text-decoration: underline;\n}\n\n.wx-rich-text__content :deep(code) {\n padding: 2px var(--wx-space-4);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-family: var(--wx-font-family-mono);\n font-size: 0.9em;\n}\n\n.wx-rich-text__content :deep(pre) {\n margin: 0 0 var(--wx-space-12);\n padding: var(--wx-space-12);\n background: var(--wx-bg-inverse);\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-inverse);\n overflow-x: auto;\n}\n\n.wx-rich-text__content :deep(hr) {\n margin: var(--wx-space-18) 0;\n border: none;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-rich-text__content :deep(img),\n.wx-rich-text__content :deep(iframe) {\n max-width: 100%;\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-rich-text__content :deep(img.ProseMirror-selectednode) {\n outline: 2px solid var(--wx-color-primary);\n}\n\n.wx-rich-text__content :deep(table) {\n /* Stated because hosts turn tables into `display: block` for horizontal scrolling. */\n display: table;\n width: 100%;\n margin: 0 0 var(--wx-space-12);\n border-collapse: collapse;\n table-layout: fixed;\n overflow: hidden;\n}\n\n.wx-rich-text__content :deep(th),\n.wx-rich-text__content :deep(td) {\n position: relative;\n padding: var(--wx-space-6) var(--wx-space-10);\n border: 1px solid var(--wx-border-default);\n vertical-align: top;\n}\n\n.wx-rich-text__content :deep(th) {\n background: var(--wx-bg-fill);\n font-weight: var(--wx-font-weight-semibold);\n text-align: left;\n}\n\n.wx-rich-text__content :deep(.selectedCell::after) {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--wx-color-primary-soft);\n pointer-events: none;\n}\n\n.wx-rich-text__content :deep(.column-resize-handle) {\n position: absolute;\n top: 0;\n right: -2px;\n bottom: 0;\n width: 4px;\n background: var(--wx-color-primary);\n cursor: col-resize;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { RowProps } from './types'\n\ndefineOptions({ name: 'WxRow' })\n\nconst props = withDefaults(defineProps<RowProps>(), {\n gutter: 16,\n gutterY: undefined,\n justify: undefined,\n align: undefined,\n wrap: true,\n as: 'div',\n})\n\nfunction toLength(value: number | string) {\n return typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * The gutter is published as a variable rather than passed down through a provide:\n * a custom property inherits through the DOM, so `WxCol` picks it up wherever it\n * sits — even wrapped in a `<template v-for>` or a component of your own.\n */\nconst style = computed(() => ({\n '--wx-row-gutter': toLength(props.gutter),\n '--wx-row-gutter-y': toLength(props.gutterY ?? props.gutter),\n}))\n\nconst classes = computed(() => [\n 'wx-row',\n {\n 'wx-row--nowrap': !props.wrap,\n [`wx-row--justify-${props.justify}`]: Boolean(props.justify),\n [`wx-row--align-${props.align}`]: Boolean(props.align),\n },\n])\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\" :style=\"style\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-row {\n display: flex;\n flex-wrap: wrap;\n box-sizing: border-box;\n /*\n * The row is what its columns measure themselves against: they reflow on the width\n * of the row, not of the window, so a grid dropped into a drawer or into a main\n * column squeezed by a sidebar behaves like the narrow thing it is. The container\n * is named so that a stray column outside a row does not start answering to the\n * nearest card instead.\n */\n container: wx-row / inline-size;\n /*\n * The gutter is padding on the columns, pulled back by this negative margin, so a\n * column's width stays an honest percentage of the row. A `column-gap` would be\n * subtracted from the track and leave `span=\"12\"` twice over a line too wide.\n */\n margin-inline: calc(var(--wx-row-gutter, 0px) / -2);\n row-gap: var(--wx-row-gutter-y, 0px);\n}\n\n.wx-row--nowrap {\n flex-wrap: nowrap;\n}\n\n.wx-row--justify-start {\n justify-content: flex-start;\n}\n\n.wx-row--justify-center {\n justify-content: center;\n}\n\n.wx-row--justify-end {\n justify-content: flex-end;\n}\n\n.wx-row--justify-between {\n justify-content: space-between;\n}\n\n.wx-row--justify-around {\n justify-content: space-around;\n}\n\n.wx-row--justify-evenly {\n justify-content: space-evenly;\n}\n\n.wx-row--align-start {\n align-items: flex-start;\n}\n\n.wx-row--align-center {\n align-items: center;\n}\n\n.wx-row--align-end {\n align-items: flex-end;\n}\n\n.wx-row--align-stretch {\n align-items: stretch;\n}\n\n.wx-row--align-baseline {\n align-items: baseline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { ScrollbarEmits, ScrollbarProps, ScrollMotion, ScrollTarget } from './types'\n\ndefineOptions({ name: 'WxScrollbar' })\n\nconst props = withDefaults(defineProps<ScrollbarProps>(), {\n height: undefined,\n maxHeight: undefined,\n axis: 'y',\n size: 'md',\n always: false,\n chainScroll: false,\n})\n\nconst emit = defineEmits<ScrollbarEmits>()\n\nconst viewport = ref<HTMLElement | null>(null)\n\nfunction toLength(value: number | string | undefined) {\n if (value === undefined) return undefined\n return typeof value === 'number' ? `${value}px` : value\n}\n\nconst style = computed(() => {\n const vars: Record<string, string> = {}\n const height = toLength(props.height)\n const maxHeight = toLength(props.maxHeight)\n if (height) vars['--wx-scrollbar-height'] = height\n if (maxHeight) vars['--wx-scrollbar-max-height'] = maxHeight\n return vars\n})\n\nconst classes = computed(() => [\n 'wx-scrollbar',\n `wx-scrollbar--${props.axis}`,\n `wx-scrollbar--${props.size}`,\n {\n 'wx-scrollbar--always': props.always,\n 'wx-scrollbar--chain': props.chainScroll,\n },\n])\n\n/*\n * The element itself is exposed alongside the helpers: a virtual list or a chat\n * panel needs `scrollHeight` and `scrollTop` directly, and hiding them behind a\n * wrapper would only mean re-inventing them one method at a time.\n */\ndefineExpose({\n /** The scrolling element. */\n el: viewport,\n scrollTo: (options: ScrollTarget) => viewport.value?.scrollTo(options),\n scrollToTop: (behavior: ScrollMotion = 'auto') => viewport.value?.scrollTo({ top: 0, behavior }),\n scrollToBottom: (behavior: ScrollMotion = 'auto') =>\n viewport.value?.scrollTo({ top: viewport.value.scrollHeight, behavior }),\n})\n</script>\n\n<template>\n <div ref=\"viewport\" :class=\"classes\" :style=\"style\" @scroll=\"emit('scroll', $event)\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n/*\n * Native scrolling, themed — not a pair of divs moved about in JavaScript. The\n * browser keeps keyboard scrolling, momentum and the trackpad overlay bar; all this\n * adds is the colour and the thickness.\n */\n.wx-scrollbar {\n --wx-scrollbar-thickness: 10px;\n --wx-scrollbar-thumb: color-mix(in srgb, var(--wx-text-muted) 45%, transparent);\n --wx-scrollbar-thumb-hover: color-mix(in srgb, var(--wx-text-muted) 70%, transparent);\n\n box-sizing: border-box;\n height: var(--wx-scrollbar-height, auto);\n max-height: var(--wx-scrollbar-max-height, none);\n /* The thin bar in Firefox takes layout space; reserving it keeps text from jumping. */\n scrollbar-gutter: stable;\n scrollbar-width: thin;\n scrollbar-color: var(--wx-scrollbar-thumb) transparent;\n overscroll-behavior: contain;\n}\n\n.wx-scrollbar--chain {\n overscroll-behavior: auto;\n}\n\n.wx-scrollbar--sm {\n --wx-scrollbar-thickness: 6px;\n}\n\n.wx-scrollbar--y {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.wx-scrollbar--x {\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-gutter: auto;\n}\n\n.wx-scrollbar--both {\n overflow: auto;\n}\n\n/* WebKit and Blink ignore `scrollbar-color`, so the same look is spelled out again. */\n.wx-scrollbar::-webkit-scrollbar {\n width: var(--wx-scrollbar-thickness);\n height: var(--wx-scrollbar-thickness);\n}\n\n.wx-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.wx-scrollbar::-webkit-scrollbar-thumb {\n background: var(--wx-scrollbar-thumb);\n /* Clipping to the padding box insets the thumb without a track of its own. */\n background-clip: padding-box;\n border: 2px solid transparent;\n border-radius: var(--wx-radius-full);\n}\n\n.wx-scrollbar::-webkit-scrollbar-thumb:hover {\n background: var(--wx-scrollbar-thumb-hover);\n background-clip: padding-box;\n}\n\n.wx-scrollbar::-webkit-scrollbar-corner {\n background: transparent;\n}\n\n/*\n * Quiet until the pointer is in the box or something inside it has focus — the bar\n * reports a scroll position, it is not a border, and a page of panels reads calmer\n * without a stack of them.\n */\n.wx-scrollbar:not(.wx-scrollbar--always) {\n scrollbar-color: transparent transparent;\n}\n\n.wx-scrollbar:not(.wx-scrollbar--always):hover,\n.wx-scrollbar:not(.wx-scrollbar--always):focus-within {\n scrollbar-color: var(--wx-scrollbar-thumb) transparent;\n}\n\n.wx-scrollbar:not(.wx-scrollbar--always)::-webkit-scrollbar-thumb {\n background: transparent;\n}\n\n.wx-scrollbar:not(.wx-scrollbar--always):hover::-webkit-scrollbar-thumb,\n.wx-scrollbar:not(.wx-scrollbar--always):focus-within::-webkit-scrollbar-thumb {\n background: var(--wx-scrollbar-thumb);\n background-clip: padding-box;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxItemIndicator,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { SelectEmits, SelectModelValue, SelectProps, SelectValue } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxSelect', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n options: () => [],\n multiple: false,\n filterable: false,\n clearable: false,\n placeholder: undefined,\n emptyText: 'Nothing found',\n teleport: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SelectEmits>()\n\nconst model = defineModel<SelectModelValue>({ default: null })\n\nconst field = useFormField(props)\nconst open = ref(false)\n\n/**\n * The text in the search field. Controlled here rather than left to the combobox:\n * with `multiple` the input has no display value to fall back on and renders the\n * model itself, so picking two tags leaves \"news,releases\" sitting in the box.\n */\nconst searchText = ref('')\n\n/** Reka wants an array for multiple and a bare value otherwise. */\nconst selection = computed({\n get: () => (props.multiple ? ((model.value as SelectValue[]) ?? []) : (model.value ?? null)),\n set: (value) => {\n model.value = value as SelectModelValue\n emit('change', value as SelectModelValue)\n },\n})\n\nconst labelOf = (value: SelectValue) =>\n props.options.find((option) => option.value === value)?.label ?? String(value)\n\nconst selectedOptions = computed(() => {\n if (!props.multiple) return []\n return ((model.value as SelectValue[]) ?? []).map((value) => ({ value, label: labelOf(value) }))\n})\n\nconst singleLabel = computed(() => {\n if (props.multiple) return ''\n const value = model.value as SelectValue | null\n return value === null || value === undefined ? '' : labelOf(value)\n})\n\nconst hasSelection = computed(() =>\n props.multiple\n ? selectedOptions.value.length > 0\n : model.value !== null && model.value !== undefined && model.value !== '',\n)\n\nconst showClear = computed(() => props.clearable && !field.disabled.value && hasSelection.value)\n\nconst classes = computed(() => [\n 'wx-select',\n `wx-select--${field.size.value}`,\n {\n [`wx-select--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': open.value,\n 'is-disabled': field.disabled.value,\n 'is-multiple': props.multiple,\n },\n])\n\n/** A pick clears the search in multiple mode and shows the label in single mode. */\nwatch(\n () => model.value,\n () => {\n searchText.value = props.multiple ? '' : singleLabel.value\n },\n { immediate: true },\n)\n\nwatch(open, (value) => {\n if (value) {\n emit('open')\n return\n }\n searchText.value = props.multiple ? '' : singleLabel.value\n emit('close')\n})\n\n/** Clicking the field is how everyone expects a select to open. */\nfunction openList() {\n if (!field.disabled.value) open.value = true\n}\n\n/**\n * What a filterable field shows once a value is picked. Without it the input falls\n * back to the raw value, so choosing \"Maria Kovalenko\" leaves \"12\" in the box.\n */\nfunction displayValue(value: unknown): string {\n return value === null || value === undefined ? '' : labelOf(value as SelectValue)\n}\n\n/**\n * Reka filters the list itself and keeps no public search term, so the value is read\n * straight off the input — that is what a caller loading options from a backend needs.\n */\nfunction onSearch(event: Event) {\n emit('search', (event.target as HTMLInputElement).value)\n}\n\nfunction clear() {\n model.value = props.multiple ? [] : null\n emit('change', model.value)\n emit('clear')\n}\n\nfunction removeTag(value: SelectValue) {\n const next = ((model.value as SelectValue[]) ?? []).filter((item) => item !== value)\n model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <combobox-root\n v-model=\"selection\"\n v-model:open=\"open\"\n :multiple=\"multiple\"\n :disabled=\"field.disabled.value\"\n :name=\"name\"\n :ignore-filter=\"!filterable\"\n :open-on-click=\"true\"\n :class=\"classes\"\n v-bind=\"rootAttrs\"\n as=\"div\"\n >\n <combobox-anchor class=\"wx-select__anchor\" as=\"div\" @click=\"openList\">\n <div class=\"wx-select__value\">\n <template v-if=\"multiple\">\n <span\n v-for=\"option in selectedOptions\"\n :key=\"String(option.value)\"\n class=\"wx-select__tag\"\n >\n {{ option.label }}\n <button\n v-if=\"!field.disabled.value\"\n class=\"wx-select__tag-remove\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"`Remove ${option.label}`\"\n @click.stop=\"removeTag(option.value)\"\n >\n ✕\n </button>\n </span>\n </template>\n\n <combobox-input\n v-if=\"filterable\"\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n v-model=\"searchText\"\n class=\"wx-select__input\"\n :placeholder=\"placeholder\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :display-value=\"multiple ? undefined : displayValue\"\n auto-focus\n @input=\"onSearch\"\n />\n\n <template v-else>\n <span v-if=\"!multiple && hasSelection\" class=\"wx-select__single\">{{ singleLabel }}</span>\n <span v-else-if=\"!hasSelection\" class=\"wx-select__placeholder\">{{ placeholder }}</span>\n </template>\n </div>\n\n <button\n v-if=\"showClear\"\n class=\"wx-select__clear\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear\"\n @click.stop=\"clear\"\n >\n ✕\n </button>\n\n <combobox-trigger\n :id=\"filterable ? undefined : field.id.value\"\n class=\"wx-select__toggle\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m4 6 4 4 4-4\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </combobox-trigger>\n </combobox-anchor>\n\n <combobox-portal :disabled=\"!teleport\">\n <combobox-content class=\"wx-select__content\" position=\"popper\" :side-offset=\"4\">\n <combobox-viewport class=\"wx-select__viewport\">\n <combobox-empty class=\"wx-select__empty\">{{ emptyText }}</combobox-empty>\n\n <slot>\n <combobox-item\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n class=\"wx-select__option\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n <span class=\"wx-select__option-label\">{{ option.label }}</span>\n <combobox-item-indicator class=\"wx-select__check\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3.5 8.5 3 3 6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </combobox-item-indicator>\n </combobox-item>\n </slot>\n </combobox-viewport>\n </combobox-content>\n </combobox-portal>\n </combobox-root>\n</template>\n\n<style scoped>\n.wx-select {\n display: block;\n width: 100%;\n}\n\n.wx-select__anchor {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n min-height: var(--wx-size-control-md);\n padding: 0 var(--wx-space-6) 0 var(--wx-space-12);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n /* A select is a list of choices, and it reads like the one in the sidebar does. */\n font-size: var(--wx-font-size-control-md);\n font-weight: var(--wx-font-weight-medium);\n cursor: pointer;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-select--sm .wx-select__anchor {\n min-height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-select--lg .wx-select__anchor {\n min-height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-select__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-select.is-open .wx-select__anchor {\n border-color: var(--wx-border-focus);\n}\n\n.wx-select--error .wx-select__anchor,\n.wx-select--error.is-open .wx-select__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-select--success .wx-select__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-select--warning .wx-select__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-select.is-disabled .wx-select__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-select__value {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4);\n flex: 1 1 auto;\n min-width: 0;\n padding: var(--wx-space-4) 0;\n}\n\n.wx-select__single,\n.wx-select__placeholder {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-select__placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-select__input {\n flex: 1 1 60px;\n min-width: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-select__input::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-select__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n padding: 2px var(--wx-space-6);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-select__tag-remove,\n.wx-select__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n cursor: pointer;\n}\n\n.wx-select__tag-remove:hover,\n.wx-select__clear:hover {\n color: var(--wx-text-default);\n}\n\n.wx-select__clear {\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n}\n\n.wx-select__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--wx-text-muted);\n cursor: inherit;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-select__toggle svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-select.is-open .wx-select__toggle {\n transform: rotate(180deg);\n}\n</style>\n\n<style>\n/* The list is teleported, so its styles cannot be scoped to the component. */\n.wx-select__content {\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n box-sizing: border-box;\n width: var(--reka-combobox-trigger-width);\n max-height: 280px;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n font-size: var(--wx-font-size-control-md);\n font-weight: var(--wx-font-weight-medium);\n overflow: hidden;\n}\n\n.wx-select__viewport {\n max-height: 272px;\n overflow-y: auto;\n}\n\n.wx-select__option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n user-select: none;\n}\n\n.wx-select__option[data-highlighted] {\n background: var(--wx-bg-fill);\n outline: none;\n}\n\n.wx-select__option[data-state='checked'] {\n color: var(--wx-color-primary);\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-select__option[data-disabled] {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-select__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-select__check {\n display: inline-flex;\n flex: 0 0 auto;\n color: var(--wx-color-primary);\n}\n\n.wx-select__check svg {\n width: 16px;\n height: 16px;\n}\n\n.wx-select__empty {\n padding: var(--wx-space-10);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'reka-ui'\nimport { useFormField } from '../../composables/useFormField'\nimport type { SliderEmits, SliderModelValue, SliderProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxSlider', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n minStepsBetweenThumbs: 0,\n showValue: false,\n marks: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SliderEmits>()\n\nconst model = defineModel<SliderModelValue>({ default: null })\n\nconst field = useFormField(props)\n\n/**\n * The underlying slider always works with an array. A single slider keeps a plain\n * number in the model, because that is what a caller wants to store.\n */\nconst values = computed<number[]>(() => {\n if (props.range) {\n const pair = Array.isArray(model.value) ? model.value : []\n return [pair[0] ?? props.min, pair[1] ?? props.max]\n }\n const single = Array.isArray(model.value) ? model.value[0] : model.value\n return [single ?? props.min]\n})\n\nfunction onUpdate(next: number[] | undefined) {\n if (!next) return\n const value = props.range ? [...next] : next[0]\n model.value = value\n emit('change', value)\n}\n\nconst marks = computed(() =>\n Object.entries(props.marks ?? {}).map(([value, label]) => ({\n value: Number(value),\n label,\n offset: ((Number(value) - props.min) / (props.max - props.min)) * 100,\n })),\n)\n\nconst classes = computed(() => [\n 'wx-slider',\n `wx-slider--${field.size.value}`,\n { 'is-disabled': field.disabled.value, 'is-range': props.range },\n])\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <div class=\"wx-slider__row\">\n <slider-root\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-slider__root\"\n :model-value=\"values\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"field.disabled.value\"\n :min-steps-between-thumbs=\"minStepsBetweenThumbs\"\n :name=\"name\"\n @update:model-value=\"onUpdate\"\n >\n <slider-track class=\"wx-slider__track\">\n <slider-range class=\"wx-slider__range\" />\n </slider-track>\n\n <slider-thumb\n v-for=\"index in values.length\"\n :key=\"index\"\n class=\"wx-slider__thumb\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n />\n </slider-root>\n\n <span v-if=\"showValue\" class=\"wx-slider__value\">\n {{ range ? `${values[0]} — ${values[1]}` : values[0] }}\n </span>\n </div>\n\n <div v-if=\"marks.length\" class=\"wx-slider__marks\" aria-hidden=\"true\">\n <span\n v-for=\"mark in marks\"\n :key=\"mark.value\"\n class=\"wx-slider__mark\"\n :style=\"{ left: `${mark.offset}%` }\"\n >\n {{ mark.label }}\n </span>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-slider {\n display: block;\n width: 100%;\n}\n\n.wx-slider__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-16);\n}\n\n.wx-slider__root {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n height: var(--wx-size-control-md);\n touch-action: none;\n user-select: none;\n}\n\n.wx-slider--sm .wx-slider__root {\n height: var(--wx-size-control-sm);\n}\n\n.wx-slider--lg .wx-slider__root {\n height: var(--wx-size-control-lg);\n}\n\n.wx-slider__track {\n position: relative;\n flex: 1 1 auto;\n height: 4px;\n background: var(--wx-bg-fill-hover);\n border-radius: var(--wx-radius-full);\n}\n\n.wx-slider__range {\n position: absolute;\n height: 100%;\n background: var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n}\n\n.wx-slider__thumb {\n display: block;\n width: 18px;\n height: 18px;\n background: var(--wx-bg-surface);\n border: 2px solid var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n box-shadow: var(--wx-shadow-card);\n cursor: grab;\n transition: box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-slider__thumb:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-slider__thumb:active {\n cursor: grabbing;\n}\n\n.wx-slider.is-disabled .wx-slider__range {\n background: var(--wx-color-primary-disabled);\n}\n\n.wx-slider.is-disabled .wx-slider__thumb {\n border-color: var(--wx-color-primary-disabled);\n cursor: not-allowed;\n}\n\n.wx-slider__value {\n flex: 0 0 auto;\n min-width: 4ch;\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n.wx-slider__marks {\n position: relative;\n height: 18px;\n margin-top: calc(var(--wx-space-4) * -1);\n}\n\n.wx-slider__mark {\n position: absolute;\n transform: translateX(-50%);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { SpaceProps } from './types'\n\ndefineOptions({ name: 'WxSpace' })\n\nconst props = withDefaults(defineProps<SpaceProps>(), {\n direction: 'horizontal',\n size: 'md',\n align: undefined,\n justify: undefined,\n wrap: true,\n fill: false,\n inline: false,\n as: 'div',\n})\n\nconst sizes: Record<string, string> = {\n xs: 'var(--wx-space-4)',\n sm: 'var(--wx-space-8)',\n md: 'var(--wx-space-12)',\n lg: 'var(--wx-space-16)',\n xl: 'var(--wx-space-24)',\n}\n\nconst gap = computed(() => {\n const { size } = props\n if (typeof size === 'number') return `${size}px`\n return sizes[size] ?? size\n})\n\nconst classes = computed(() => [\n 'wx-space',\n `wx-space--${props.direction}`,\n {\n 'wx-space--inline': props.inline,\n 'wx-space--wrap': props.wrap && props.direction === 'horizontal',\n 'wx-space--fill': props.fill,\n [`wx-space--align-${props.align}`]: Boolean(props.align),\n [`wx-space--justify-${props.justify}`]: Boolean(props.justify),\n },\n])\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\" :style=\"{ '--wx-space-gap': gap }\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-space {\n display: flex;\n gap: var(--wx-space-gap, var(--wx-space-12));\n /* Nothing may spill sideways out of a row that is told not to wrap. */\n min-width: 0;\n}\n\n.wx-space--inline {\n display: inline-flex;\n vertical-align: middle;\n}\n\n.wx-space--horizontal {\n flex-direction: row;\n align-items: center;\n}\n\n.wx-space--vertical {\n flex-direction: column;\n align-items: stretch;\n}\n\n.wx-space--wrap {\n flex-wrap: wrap;\n}\n\n/* alignment across the line */\n.wx-space--align-start {\n align-items: flex-start;\n}\n\n.wx-space--align-center {\n align-items: center;\n}\n\n.wx-space--align-end {\n align-items: flex-end;\n}\n\n.wx-space--align-baseline {\n align-items: baseline;\n}\n\n.wx-space--align-stretch {\n align-items: stretch;\n}\n\n/* distribution along it */\n.wx-space--justify-start {\n justify-content: flex-start;\n}\n\n.wx-space--justify-center {\n justify-content: center;\n}\n\n.wx-space--justify-end {\n justify-content: flex-end;\n}\n\n.wx-space--justify-between {\n justify-content: space-between;\n}\n\n.wx-space--justify-around {\n justify-content: space-around;\n}\n\n.wx-space--justify-evenly {\n justify-content: space-evenly;\n}\n\n/*\n * `fill` divides the line evenly. `min-width: 0` on the children matters more than\n * it looks: without it a long label makes its child refuse to shrink, and the row\n * overflows instead of sharing the space.\n */\n.wx-space--fill > :deep(*) {\n flex: 1 1 0;\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useFormField, type ChoiceValue } from '../../composables/useFormField'\nimport type { SwitchEmits, SwitchProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxSwitch', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n activeValue: true,\n inactiveValue: false,\n label: undefined,\n disabled: undefined,\n size: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<SwitchEmits>()\n\nconst model = defineModel<ChoiceValue>({ default: false })\n\nconst field = useFormField(props)\n\nconst checked = computed(() => model.value === props.activeValue)\nconst size = computed(() => props.size ?? field.size.value)\n\nconst classes = computed(() => [\n 'wx-switch',\n `wx-switch--${size.value}`,\n { 'is-checked': checked.value, 'is-disabled': field.disabled.value },\n])\n\nfunction onChange(event: Event) {\n const next = (event.target as HTMLInputElement).checked ? props.activeValue : props.inactiveValue\n model.value = next\n emit('change', next)\n}\n</script>\n\n<template>\n <label :class=\"classes\" v-bind=\"rootAttrs\">\n <input\n :id=\"field.id.value\"\n v-bind=\"controlAttrs\"\n class=\"wx-switch__native\"\n type=\"checkbox\"\n role=\"switch\"\n :name=\"name\"\n :checked=\"checked\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n @change=\"onChange\"\n />\n\n <span class=\"wx-switch__track\" aria-hidden=\"true\">\n <span class=\"wx-switch__thumb\" />\n </span>\n\n <span v-if=\"label || $slots.default\" class=\"wx-switch__label\">\n <slot>{{ label }}</slot>\n </span>\n </label>\n</template>\n\n<style scoped>\n.wx-switch {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n cursor: pointer;\n user-select: none;\n color: var(--wx-text-default);\n}\n\n.wx-switch.is-disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-switch__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.wx-switch__track {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: calc(var(--wx-switch-height) * 1.8);\n height: var(--wx-switch-height);\n padding: 2px;\n background: var(--wx-border-strong);\n border-radius: var(--wx-radius-full);\n transition:\n background-color var(--wx-duration-normal) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-switch--sm {\n --wx-switch-height: 18px;\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-switch--md {\n --wx-switch-height: 22px;\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-switch--lg {\n --wx-switch-height: 26px;\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-switch__thumb {\n width: calc(var(--wx-switch-height) - 4px);\n height: calc(var(--wx-switch-height) - 4px);\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-full);\n box-shadow: var(--wx-shadow-card);\n transition: transform var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-switch.is-checked .wx-switch__track {\n background: var(--wx-color-primary);\n}\n\n.wx-switch.is-checked .wx-switch__thumb {\n transform: translateX(calc(var(--wx-switch-height) * 0.8));\n}\n\n.wx-switch.is-disabled .wx-switch__track {\n background: var(--wx-border-default);\n}\n\n.wx-switch.is-disabled.is-checked .wx-switch__track {\n background: var(--wx-color-primary-disabled);\n}\n\n.wx-switch__native:focus-visible + .wx-switch__track {\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-switch__label {\n line-height: var(--wx-font-line-height-normal);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-switch__track,\n .wx-switch__thumb {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport type { TabProps } from './types'\n\ndefineOptions({ name: 'WxTab' })\n\n/*\n * A tab is written once and read twice: `WxTabs` looks at these props to build the\n * button in the strip, and the component itself renders only the panel. That is why\n * `label`, `icon` and `badge` live here rather than on a separate list of items —\n * a tab and its content stay together in the markup.\n */\nwithDefaults(defineProps<TabProps>(), {\n label: undefined,\n icon: undefined,\n badge: undefined,\n disabled: false,\n keepAlive: false,\n})\n\ndefineSlots<{\n /** The panel. */\n default?: () => unknown\n /** Replaces `label` in the strip — an avatar, a coloured dot, anything. */\n label?: () => unknown\n}>()\n</script>\n\n<template>\n <tabs-content class=\"wx-tab\" :value=\"value\" :force-mount=\"keepAlive || undefined\">\n <slot />\n </tabs-content>\n</template>\n\n<style scoped>\n.wx-tab:focus-visible {\n outline: none;\n}\n\n/* Reka hides an inactive panel with the attribute; our own display would win. */\n.wx-tab[hidden] {\n display: none;\n}\n</style>\n","<script setup lang=\"ts\" generic=\"T extends TableRow = TableRow\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\nimport WxCheckbox from '../Checkbox/Checkbox.vue'\nimport WxInput from '../Input/Input.vue'\nimport WxPagination from '../Pagination/Pagination.vue'\nimport type {\n RowKey,\n TableColumn,\n TableEmits,\n TableProps,\n TableRow,\n TableSort,\n TableState,\n TableSummaryRow,\n} from './types'\n\ndefineOptions({ name: 'WxTable' })\n\n/** The disclosure and checkbox columns are square and never resize. */\nconst UTILITY_WIDTH = 44\n\nconst props = withDefaults(defineProps<TableProps<T>>(), {\n data: null,\n rowKey: 'id',\n title: undefined,\n searchable: false,\n searchPlaceholder: 'Search',\n searchDebounce: 300,\n loading: false,\n emptyText: 'Nothing to show',\n stripe: false,\n bordered: false,\n hover: true,\n size: 'md',\n selectable: false,\n selectableIf: undefined,\n expandable: false,\n expandableIf: undefined,\n summary: () => [],\n pagination: undefined,\n perPageOptions: () => [],\n persist: undefined,\n maxHeight: undefined,\n rowClass: undefined,\n layout: 'auto',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TableEmits<T>>()\n\n/** Keys rather than rows: a selection outlives the page it was made on. */\nconst selected = defineModel<RowKey[]>('selected', { default: () => [] })\nconst expanded = defineModel<RowKey[]>('expanded', { default: () => [] })\nconst sort = defineModel<TableSort | null>('sort', { default: null })\nconst search = defineModel<string>('search', { default: '' })\nconst page = defineModel<number>('page', { default: 1 })\nconst perPage = defineModel<number>('perPage', { default: 15 })\n\n/** An array or a paginator; the table only ever needs the rows out of it. */\nconst rows = computed<T[]>(() => {\n const value = props.data\n if (!value) return []\n return Array.isArray(value) ? value : (value.data ?? [])\n})\n\n/** A paginated response is a promise that there are more pages to reach. */\nconst paginator = computed(() => (props.data && !Array.isArray(props.data) ? props.data : null))\n\nconst showPagination = computed(() => props.pagination ?? Boolean(paginator.value))\n\nconst visibleColumns = computed(() => props.columns.filter((column) => !column.hidden))\n\n/** Columns that carry no data of their own: the chevron and the checkbox. */\nconst utilityCount = computed(() => (props.expandable ? 1 : 0) + (props.selectable ? 1 : 0))\n\nconst columnCount = computed(() => visibleColumns.value.length + utilityCount.value)\n\n/*\n * The slots are declared rather than inferred. Left to infer, the type is read off a\n * template that builds slot names out of the column keys, and the circle that makes —\n * the slots depend on the template, the template on the slots — is answered with\n * `any`, which takes the table's props down with it.\n */\ndefineSlots<{\n title?: () => unknown\n actions?: () => unknown\n empty?: () => unknown\n footer?: () => unknown\n loading?: () => unknown\n expanded?: (props: { row: T; index: number }) => unknown\n [key: `header-${string}`]: ((props: { column: TableColumn<T> }) => unknown) | undefined\n [key: `cell-${string}`]:\n | ((props: { row: T; value: unknown; index: number; column: TableColumn<T> }) => unknown)\n | undefined\n [key: `summary-${string}`]:\n ((props: { row: TableSummaryRow; value: unknown }) => unknown) | undefined\n}>()\n\nconst slots = useSlots()\n\nconst hasHeader = computed<boolean>(() =>\n Boolean(props.title || props.searchable || slots.title || slots.actions),\n)\n\nconst classes = computed(() => [\n 'wx-table',\n `wx-table--${props.size}`,\n {\n 'wx-table--stripe': props.stripe,\n 'wx-table--bordered': props.bordered,\n 'wx-table--hover': props.hover,\n 'wx-table--sticky': props.maxHeight !== undefined,\n 'wx-table--has-header': hasHeader.value,\n 'has-more-left': moreLeft.value,\n 'has-more-right': moreRight.value,\n 'is-loading': props.loading,\n },\n])\n\nconst scrollStyle = computed(() =>\n props.maxHeight === undefined ? undefined : { maxHeight: length(props.maxHeight) },\n)\n\nfunction length(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\n/** Only a declared width can say where the column behind a pinned one begins. */\nfunction widthOf(column: TableColumn<T>): number {\n if (typeof column.width === 'number') return column.width\n if (typeof column.width === 'string') {\n const parsed = Number.parseFloat(column.width)\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n}\n\nfunction colStyle(column: TableColumn<T>) {\n return {\n width: column.width === undefined ? undefined : length(column.width),\n minWidth: column.minWidth === undefined ? undefined : length(column.minWidth),\n }\n}\n\n/* ------------------------------------------------------------- measurement --- */\n\nconst scroller = ref<HTMLElement | null>(null)\nconst headRow = ref<HTMLElement | null>(null)\n\n/**\n * The widths the browser actually handed the columns, in the order they sit in — the\n * utility columns first, then the declared ones.\n *\n * A declared width is what the caller *asked* for, and it is honoured only while\n * there is room. In `auto` layout a table that has to scroll squeezes every column\n * proportionally, so the declared numbers stop being true exactly when pinning\n * starts to matter — and a pinned column parked at a declared offset then leaves a\n * gap for the scrolling ones to show through.\n */\nconst laidOut = ref<number[]>([])\n\nfunction measureColumns() {\n const cells = headRow.value?.children\n if (!cells) return\n\n const next = [...cells].map((cell) => (cell as HTMLElement).getBoundingClientRect().width)\n const same =\n next.length === laidOut.value.length &&\n next.every((width, index) => Math.abs(width - laidOut.value[index]) < 0.5)\n\n if (!same) laidOut.value = next\n}\n\n/** How far the columns have slid, which is what the edge shadows are about. */\nconst moreLeft = ref(false)\nconst moreRight = ref(false)\n\nfunction readScroll() {\n const el = scroller.value\n if (!el) return\n moreLeft.value = el.scrollLeft > 1\n moreRight.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\n\nfunction remeasure() {\n measureColumns()\n readScroll()\n}\n\nlet observer: ResizeObserver | null = null\n\nonMounted(() => {\n remeasure()\n if (typeof ResizeObserver === 'undefined' || !scroller.value) return\n observer = new ResizeObserver(remeasure)\n observer.observe(scroller.value)\n})\n\nonBeforeUnmount(() => {\n observer?.disconnect()\n observer = null\n})\n\n/* Rows and columns both change what the browser gives each column. */\nwatch([() => rows.value.length, () => visibleColumns.value.length], async () => {\n await nextTick()\n remeasure()\n})\n\n/** What the browser gave the column at this position, or what was asked for. */\nfunction laidOutWidth(index: number, asked: number) {\n const measured = laidOut.value[index]\n return measured === undefined || measured === 0 ? asked : measured\n}\n\n/**\n * Where every pinned column comes to rest, measured from its edge. The utility columns\n * are pinned too whenever anything else is: a checkbox that slides under a frozen name\n * column is worse than no freezing at all.\n */\nconst offsets = computed(() => {\n const map = new Map<string, { side: 'left' | 'right'; offset: number; edge: boolean }>()\n const utilities = utilityCount.value\n\n let left = 0\n for (let index = 0; index < utilities; index += 1) {\n left += laidOutWidth(index, UTILITY_WIDTH)\n }\n\n const lefts = visibleColumns.value\n .map((column, index) => ({ column, index }))\n .filter((entry) => entry.column.fixed === 'left')\n\n lefts.forEach((entry, order) => {\n map.set(entry.column.key, { side: 'left', offset: left, edge: order === lefts.length - 1 })\n left += laidOutWidth(utilities + entry.index, widthOf(entry.column))\n })\n\n const rights = visibleColumns.value\n .map((column, index) => ({ column, index }))\n .filter((entry) => entry.column.fixed === 'right')\n\n let right = 0\n for (let order = rights.length - 1; order >= 0; order -= 1) {\n const entry = rights[order]\n map.set(entry.column.key, { side: 'right', offset: right, edge: order === 0 })\n right += laidOutWidth(utilities + entry.index, widthOf(entry.column))\n }\n\n return map\n})\n\nconst hasLeftFixed = computed(() => visibleColumns.value.some((column) => column.fixed === 'left'))\n\nconst hasFixed = computed(() => offsets.value.size > 0)\n\n/**\n * The resting place goes out as a custom property rather than as `left` itself. An\n * inline `left` would outrank every stylesheet rule, and the pinning has to be able to\n * switch itself off in CSS when the table is too narrow to afford it.\n */\nfunction fixedStyle(column: TableColumn<T>) {\n const pin = offsets.value.get(column.key)\n if (!pin) return undefined\n return { [`--wx-pin-${pin.side}`]: `${pin.offset}px` }\n}\n\nfunction fixedClass(column: TableColumn<T>) {\n const pin = offsets.value.get(column.key)\n if (!pin) return undefined\n return [`is-fixed-${pin.side}`, { 'is-fixed-edge': pin.edge }]\n}\n\n/** The utility columns ride along at the left edge once anything is pinned. */\nfunction utilityStyle(slot: 'expand' | 'select') {\n if (!hasFixed.value) return undefined\n const before = slot === 'select' && props.expandable ? laidOutWidth(0, UTILITY_WIDTH) : 0\n return { '--wx-pin-left': `${before}px` }\n}\n\nconst utilityClass = computed(() =>\n hasFixed.value ? ['is-fixed-left', { 'is-fixed-edge': !hasLeftFixed.value }] : undefined,\n)\n\n/** A dotted key walks into the row, so an eager-loaded relation reads as `user.name`. */\nfunction read(row: T, path: string): unknown {\n if (!path.includes('.')) return (row as TableRow)[path]\n return path.split('.').reduce<unknown>((value, part) => {\n if (value === null || typeof value !== 'object') return undefined\n return (value as TableRow)[part]\n }, row)\n}\n\nfunction cellText(column: TableColumn<T>, row: T, index: number): string {\n const value = read(row, column.key)\n if (column.formatter) return column.formatter(value, row, index)\n return value === null || value === undefined ? '' : String(value)\n}\n\nfunction keyOf(row: T, index: number): RowKey {\n if (typeof props.rowKey === 'function') return props.rowKey(row, index)\n const value = read(row, props.rowKey)\n return typeof value === 'string' || typeof value === 'number' ? value : index\n}\n\nfunction canSelect(row: T): boolean {\n return props.selectableIf ? props.selectableIf(row) : true\n}\n\nfunction canExpand(row: T): boolean {\n return props.expandableIf ? props.expandableIf(row) : true\n}\n\nconst selectableRows = computed(() => rows.value.filter(canSelect))\n\nconst selectableKeys = computed(() =>\n selectableRows.value.map((row) => keyOf(row, rows.value.indexOf(row))),\n)\n\nconst selectedCount = computed(\n () => selectableKeys.value.filter((key) => selected.value.includes(key)).length,\n)\n\nconst allSelected = computed(\n () => selectableKeys.value.length > 0 && selectedCount.value === selectableKeys.value.length,\n)\n\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nfunction rowsFor(keys: RowKey[]): T[] {\n return rows.value.filter((row, index) => keys.includes(keyOf(row, index)))\n}\n\nfunction announce(keys: RowKey[]) {\n selected.value = keys\n emit('selection-change', keys, rowsFor(keys))\n}\n\n/**\n * The header checkbox works on this page only. Keys picked on other pages stay put —\n * clearing someone's selection because they paged forward would be a surprise.\n */\nfunction toggleAll(checked: boolean) {\n const page = selectableKeys.value\n if (checked) announce([...selected.value, ...page.filter((key) => !selected.value.includes(key))])\n else announce(selected.value.filter((key) => !page.includes(key)))\n}\n\nfunction toggleRow(row: T, index: number, checked: boolean) {\n const key = keyOf(row, index)\n if (checked) {\n if (!selected.value.includes(key)) announce([...selected.value, key])\n } else {\n announce(selected.value.filter((item) => item !== key))\n }\n}\n\nfunction isSelected(row: T, index: number): boolean {\n return selected.value.includes(keyOf(row, index))\n}\n\nfunction isExpanded(row: T, index: number): boolean {\n return expanded.value.includes(keyOf(row, index))\n}\n\nfunction toggleExpand(row: T, index: number) {\n if (!canExpand(row)) return\n const key = keyOf(row, index)\n const keys = expanded.value.includes(key)\n ? expanded.value.filter((item) => item !== key)\n : [...expanded.value, key]\n\n expanded.value = keys\n emit('expand-change', keys, rowsFor(keys))\n}\n\n/**\n * Sorting is reported, never applied: the rows on screen are one page out of a query,\n * and reordering them here would only shuffle the page. Three states, because a column\n * has to be able to give the ordering back.\n */\nfunction onSort(column: TableColumn<T>) {\n if (!column.sortable) return\n const current = sort.value\n let next: TableSort | null\n if (current?.key !== column.key) next = { key: column.key, order: 'asc' }\n else if (current.order === 'asc') next = { key: column.key, order: 'desc' }\n else next = null\n\n sort.value = next\n page.value = 1\n emit('sort-change', next)\n}\n\nfunction ariaSort(column: TableColumn<T>) {\n if (!column.sortable) return undefined\n if (sort.value?.key !== column.key) return 'none'\n return sort.value.order === 'asc' ? 'ascending' : 'descending'\n}\n\nfunction sortState(column: TableColumn<T>) {\n return sort.value?.key === column.key ? sort.value.order : null\n}\n\nfunction alignClass(column: TableColumn<T>) {\n return column.align && column.align !== 'left' ? `wx-table__cell--${column.align}` : undefined\n}\n\nlet timer: ReturnType<typeof setTimeout> | undefined\n\n/**\n * The field answers at once; the backend hears about it when the typing settles. The\n * settled term is what the state is built from, so a burst of keystrokes is one change\n * rather than one per letter — and filtering changes what page one is, so the page goes\n * back to the first.\n */\nconst settledSearch = ref(search.value)\n\nfunction onSearch(value: string | number | undefined) {\n search.value = value === undefined ? '' : String(value)\n}\n\nfunction onSearchChanged(term: string) {\n clearTimeout(timer)\n const settle = () => {\n settledSearch.value = term\n page.value = 1\n emit('search', term)\n }\n if (!props.searchDebounce) settle()\n else timer = setTimeout(settle, props.searchDebounce)\n}\n\nonBeforeUnmount(() => clearTimeout(timer))\n\n/** Everything the backend needs, in one object, so there is one thing to watch. */\nconst state = computed<TableState>(() => ({\n page: page.value,\n perPage: perPage.value,\n sort: sort.value,\n search: settledSearch.value,\n}))\n\nconst STORAGE_PREFIX = 'wx-table:'\n\n/**\n * Reading happens after mount rather than during setup: this renders on a server too,\n * and markup built from one machine's localStorage would not match what the browser\n * then hydrates.\n */\nfunction restore() {\n if (!props.persist) return\n let saved: Partial<TableState> | null = null\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + props.persist)\n saved = raw ? (JSON.parse(raw) as Partial<TableState>) : null\n } catch {\n // Unavailable, full, or holding something we did not write. Defaults will do.\n return\n }\n if (!saved) return\n\n if (typeof saved.page === 'number' && saved.page > 0) page.value = saved.page\n if (typeof saved.perPage === 'number' && saved.perPage > 0) perPage.value = saved.perPage\n if (typeof saved.search === 'string') search.value = saved.search\n if (saved.sort === null) sort.value = null\n else if (saved.sort && typeof saved.sort.key === 'string') {\n sort.value = { key: saved.sort.key, order: saved.sort.order === 'desc' ? 'desc' : 'asc' }\n }\n}\n\nfunction save(value: TableState) {\n if (!props.persist) return\n try {\n window.localStorage.setItem(STORAGE_PREFIX + props.persist, JSON.stringify(value))\n } catch {\n // A private window or a full quota. Remembering is a convenience, not a feature.\n }\n}\n\nonMounted(() => {\n restore()\n settledSearch.value = search.value\n emit('state-change', state.value)\n\n // Both watchers start here, so the restore above counts as the first state rather\n // than as a change — one fetch on load, not two.\n watch(search, onSearchChanged)\n watch(state, (value) => {\n save(value)\n emit('state-change', value)\n })\n})\n\n/** Columns ahead of the first figure belong to the caption. */\nfunction summaryStart(row: TableSummaryRow): number {\n const cells = row.cells ?? {}\n const index = visibleColumns.value.findIndex((column) => column.key in cells)\n return index === -1 ? visibleColumns.value.length : index\n}\n\nfunction summarySpan(row: TableSummaryRow): number {\n return utilityCount.value + summaryStart(row)\n}\n\nfunction summaryColumns(row: TableSummaryRow): TableColumn<T>[] {\n return visibleColumns.value.slice(summaryStart(row))\n}\n\nfunction summaryValue(row: TableSummaryRow, column: TableColumn<T>): unknown {\n return row.cells?.[column.key]\n}\n\nfunction summaryText(row: TableSummaryRow, column: TableColumn<T>): string {\n const value = summaryValue(row, column)\n return value === null || value === undefined ? '' : String(value)\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <header v-if=\"hasHeader\" class=\"wx-table__header\">\n <div class=\"wx-table__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n\n <div class=\"wx-table__tools\">\n <slot name=\"actions\" />\n\n <div v-if=\"searchable\" class=\"wx-table__search\">\n <wx-input\n type=\"search\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n :size=\"size\"\n clearable\n :aria-label=\"searchPlaceholder\"\n @update:model-value=\"onSearch\"\n />\n </div>\n </div>\n </header>\n\n <div ref=\"scroller\" class=\"wx-table__scroll\" :style=\"scrollStyle\" @scroll=\"readScroll\">\n <table\n class=\"wx-table__table\"\n :class=\"{ 'wx-table__table--fixed': layout === 'fixed' }\"\n :aria-label=\"ariaLabel\"\n :aria-busy=\"loading || undefined\"\n >\n <colgroup>\n <col v-if=\"expandable\" :style=\"{ width: `${UTILITY_WIDTH}px` }\" />\n <col v-if=\"selectable\" :style=\"{ width: `${UTILITY_WIDTH}px` }\" />\n <col v-for=\"column in visibleColumns\" :key=\"column.key\" :style=\"colStyle(column)\" />\n </colgroup>\n\n <thead class=\"wx-table__head\">\n <!-- The row the pin offsets are measured off: one cell per column, always. -->\n <tr ref=\"headRow\">\n <th\n v-if=\"expandable\"\n scope=\"col\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('expand')\"\n >\n <span class=\"wx-table__sr-only\">Expand</span>\n </th>\n\n <th\n v-if=\"selectable\"\n scope=\"col\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('select')\"\n >\n <wx-checkbox\n :model-value=\"allSelected\"\n :indeterminate=\"someSelected\"\n :disabled=\"!selectableKeys.length\"\n aria-label=\"Select every row on this page\"\n @update:model-value=\"toggleAll\"\n />\n </th>\n\n <th\n v-for=\"column in visibleColumns\"\n :key=\"column.key\"\n scope=\"col\"\n class=\"wx-table__cell\"\n :class=\"[alignClass(column), fixedClass(column), column.headerClass]\"\n :style=\"fixedStyle(column)\"\n :aria-sort=\"ariaSort(column)\"\n >\n <button\n v-if=\"column.sortable\"\n class=\"wx-table__sort\"\n type=\"button\"\n @click=\"onSort(column)\"\n >\n <slot :name=\"`header-${column.key}`\" :column=\"column\">\n {{ column.label ?? column.key }}\n </slot>\n <svg\n class=\"wx-table__sort-icon\"\n :class=\"sortState(column) ? `is-${sortState(column)}` : undefined\"\n viewBox=\"0 0 8 12\"\n aria-hidden=\"true\"\n >\n <path class=\"wx-table__sort-up\" d=\"M4 1 7 5 1 5Z\" />\n <path class=\"wx-table__sort-down\" d=\"M4 11 1 7 7 7Z\" />\n </svg>\n </button>\n\n <slot v-else :name=\"`header-${column.key}`\" :column=\"column\">\n {{ column.label ?? column.key }}\n </slot>\n </th>\n </tr>\n </thead>\n\n <tbody class=\"wx-table__body\">\n <template v-for=\"(row, index) in rows\" :key=\"keyOf(row, index)\">\n <tr\n class=\"wx-table__row\"\n :class=\"[\n rowClass?.(row, index),\n {\n 'is-striped': index % 2 === 1,\n 'is-selected': selectable && isSelected(row, index),\n 'is-expanded': expandable && isExpanded(row, index),\n },\n ]\"\n @click=\"emit('row-click', row, index, $event)\"\n >\n <td\n v-if=\"expandable\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('expand')\"\n @click.stop\n >\n <button\n v-if=\"canExpand(row)\"\n class=\"wx-table__expander\"\n type=\"button\"\n :aria-expanded=\"isExpanded(row, index)\"\n :aria-label=\"isExpanded(row, index) ? 'Collapse row' : 'Expand row'\"\n @click=\"toggleExpand(row, index)\"\n >\n <svg viewBox=\"0 0 12 12\" aria-hidden=\"true\">\n <path d=\"M4.5 2 8.5 6l-4 4\" />\n </svg>\n </button>\n </td>\n\n <td\n v-if=\"selectable\"\n class=\"wx-table__cell wx-table__cell--utility\"\n :class=\"utilityClass\"\n :style=\"utilityStyle('select')\"\n @click.stop\n >\n <wx-checkbox\n :model-value=\"isSelected(row, index)\"\n :disabled=\"!canSelect(row)\"\n aria-label=\"Select row\"\n @update:model-value=\"(checked: boolean) => toggleRow(row, index, checked)\"\n />\n </td>\n\n <td\n v-for=\"column in visibleColumns\"\n :key=\"column.key\"\n class=\"wx-table__cell\"\n :class=\"[alignClass(column), fixedClass(column), column.cellClass]\"\n :style=\"fixedStyle(column)\"\n >\n <slot\n :name=\"`cell-${column.key}`\"\n :row=\"row\"\n :value=\"read(row, column.key)\"\n :index=\"index\"\n :column=\"column\"\n >\n {{ cellText(column, row, index) }}\n </slot>\n </td>\n </tr>\n\n <tr v-if=\"expandable && isExpanded(row, index)\" class=\"wx-table__row--expansion\">\n <td class=\"wx-table__cell wx-table__expansion\" :colspan=\"columnCount\">\n <slot name=\"expanded\" :row=\"row\" :index=\"index\" />\n </td>\n </tr>\n </template>\n\n <tr v-if=\"!rows.length && !loading\" class=\"wx-table__row wx-table__row--empty\">\n <td class=\"wx-table__cell wx-table__empty\" :colspan=\"columnCount\">\n <slot name=\"empty\">{{ emptyText }}</slot>\n </td>\n </tr>\n </tbody>\n\n <tfoot v-if=\"summary.length || $slots.footer || showPagination\" class=\"wx-table__foot\">\n <tr\n v-for=\"(line, lineIndex) in summary\"\n :key=\"lineIndex\"\n class=\"wx-table__summary\"\n :class=\"[line.class, { 'is-strong': line.strong }]\"\n >\n <td\n v-if=\"summarySpan(line) > 0\"\n class=\"wx-table__cell wx-table__summary-label\"\n :colspan=\"summarySpan(line)\"\n >\n {{ line.label }}\n </td>\n\n <td\n v-for=\"column in summaryColumns(line)\"\n :key=\"column.key\"\n class=\"wx-table__cell\"\n :class=\"alignClass(column)\"\n >\n <slot :name=\"`summary-${column.key}`\" :row=\"line\" :value=\"summaryValue(line, column)\">\n {{ summaryText(line, column) }}\n </slot>\n </td>\n </tr>\n\n <tr v-if=\"$slots.footer || showPagination\" class=\"wx-table__footer-row\">\n <td class=\"wx-table__cell\" :colspan=\"columnCount\">\n <slot name=\"footer\">\n <wx-pagination\n v-model:page=\"page\"\n v-model:per-page=\"perPage\"\n :paginator=\"paginator\"\n :per-page-options=\"perPageOptions\"\n :size=\"size\"\n :disabled=\"loading\"\n />\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <div v-if=\"loading\" class=\"wx-table__loading\">\n <slot name=\"loading\">\n <span class=\"wx-table__spinner\" aria-hidden=\"true\" />\n <span class=\"wx-table__loading-text\">Loading</span>\n </slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-table {\n position: relative;\n z-index: 0;\n box-sizing: border-box;\n /*\n * A flex or grid item will not shrink below its content unless told to, and the\n * content here is a table that can be twice the width of the page. Without this the\n * inner scroller never scrolls and the whole document does instead.\n */\n min-width: 0;\n /*\n * Pinning asks about the table's own width, so the table is the thing being measured.\n * Containment means the width can no longer come from the contents, so it is stated:\n * inside a flex row the element would otherwise measure zero.\n */\n width: 100%;\n max-width: 100%;\n container-type: inline-size;\n background: var(--wx-bg-surface);\n border-radius: var(--wx-radius-md);\n color: var(--wx-text-default);\n\n --wx-table-padding-y: var(--wx-space-10);\n --wx-table-padding-x: var(--wx-space-16);\n /* What a pinned cell paints itself with; every row state restates it. */\n --wx-table-row-bg: var(--wx-bg-surface);\n}\n\n.wx-table--sm {\n --wx-table-padding-y: var(--wx-space-6);\n --wx-table-padding-x: var(--wx-space-12);\n}\n\n.wx-table--lg {\n --wx-table-padding-y: var(--wx-space-14);\n}\n\n.wx-table__header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-space-12) var(--wx-table-padding-x);\n}\n\n.wx-table__title {\n min-width: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-lg);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-table__tools {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n margin-left: auto;\n}\n\n.wx-table__search {\n width: var(--wx-table-search-width, 240px);\n}\n\n.wx-table__scroll {\n overflow: auto;\n border-radius: inherit;\n}\n\n/*\n * A rounded corner belongs to the outside of the card, and once a title or a search\n * field sits above the rows, the top of the rows is no longer the outside. Left\n * rounded, the heading strip curves away from two square corners and leaves a white\n * wedge in each — small on a wide table, and the first thing you see on a narrow one.\n */\n.wx-table--has-header .wx-table__scroll {\n border-start-start-radius: 0;\n border-start-end-radius: 0;\n}\n\n/*\n * Explicit resets rather than an assumption that nothing else styles a table. VitePress\n * turns every table into a scrolling block; Bootstrap and Tailwind's preflight have\n * opinions of their own. Left alone, a host stylesheet takes the layout away from the\n * table, the stickiness away from the header and the stripes away from the rows —\n * quietly, and only once the library is embedded somewhere real.\n */\n.wx-table__table {\n display: table;\n width: 100%;\n margin: 0;\n overflow: visible;\n border: 0;\n border-collapse: collapse;\n border-spacing: 0;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-table__table thead {\n display: table-header-group;\n}\n\n.wx-table__table tbody {\n display: table-row-group;\n}\n\n.wx-table__table tfoot {\n display: table-footer-group;\n}\n\n.wx-table__table tr {\n display: table-row;\n background: none;\n border: 0;\n}\n\n/*\n * A row's colour reaches the eye by two routes: the row paints it behind cells that are\n * transparent, and a pinned cell paints it itself. They therefore have to change at the\n * same speed, and that speed has to be stated — VitePress fades a `tr` over half a\n * second, which left the pinned columns snapping to the hover colour while the rest of\n * the row was still on its way there.\n *\n * The shadow goes with it: it is the same colour, covering the seam beside the cell.\n */\n.wx-table__row,\n.wx-table__cell.is-fixed-left,\n.wx-table__cell.is-fixed-right {\n transition:\n background-color var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-table__row,\n .wx-table__cell.is-fixed-left,\n .wx-table__cell.is-fixed-right {\n transition: none;\n }\n}\n\n.wx-table__table th,\n.wx-table__table td {\n display: table-cell;\n border: 0;\n}\n\n.wx-table__table--fixed {\n table-layout: fixed;\n}\n\n.wx-table--sm .wx-table__table {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-table--lg .wx-table__table {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-table__cell {\n box-sizing: border-box;\n padding: var(--wx-table-padding-y) var(--wx-table-padding-x);\n text-align: left;\n vertical-align: middle;\n}\n\n.wx-table__cell--center {\n text-align: center;\n}\n\n.wx-table__cell--right {\n text-align: right;\n}\n\n/*\n * The control is the whole content of a utility cell, and an inline-level box would sit\n * on a text baseline — three pixels above the middle of the row, which is exactly the\n * kind of misalignment that reads as sloppiness rather than as a bug.\n */\n.wx-table__cell--utility {\n width: 44px;\n padding-right: 0;\n line-height: 0;\n}\n\n.wx-table__cell--utility :deep(.wx-checkbox) {\n display: flex;\n}\n\n.wx-table__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.wx-table__head .wx-table__cell {\n --wx-table-row-bg: var(--wx-bg-subtle);\n\n background: var(--wx-bg-subtle);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-semibold);\n white-space: nowrap;\n}\n\n/* Sticky needs a painted background of its own, or the rows show through. */\n.wx-table--sticky .wx-table__head .wx-table__cell {\n position: sticky;\n top: 0;\n z-index: 2;\n}\n\n.wx-table--sticky .wx-table__foot .wx-table__cell {\n position: sticky;\n bottom: 0;\n z-index: 2;\n background: var(--wx-bg-surface);\n}\n\n/* A pinned column paints over the scrolling ones, and the header over both. The colour\n it paints with is whatever the row it belongs to is wearing. */\n.wx-table__cell.is-fixed-left,\n.wx-table__cell.is-fixed-right {\n position: sticky;\n z-index: 1;\n background: var(--wx-table-row-bg);\n}\n\n.wx-table__cell.is-fixed-left {\n left: var(--wx-pin-left, 0px);\n}\n\n.wx-table__cell.is-fixed-right {\n right: var(--wx-pin-right, 0px);\n}\n\n.wx-table__head .wx-table__cell.is-fixed-left,\n.wx-table__head .wx-table__cell.is-fixed-right,\n.wx-table--sticky .wx-table__foot .wx-table__cell.is-fixed-left,\n.wx-table--sticky .wx-table__foot .wx-table__cell.is-fixed-right {\n z-index: 3;\n}\n\n/*\n * A scrollport rarely begins on a whole pixel — at any display scale but 100% it begins\n * on a fraction of one — so the pinned cell is rasterised with its edge pixel only\n * partly covered, and a hairline of the scrolling column shows through it.\n *\n * The cover is a strip of its own rather than a box shadow: Firefox declines to paint a\n * shadow on a cell in a collapsed-border table, which is where the sliver was still\n * turning up. Two pixels wide and straddling the edge, so whichever pixel the boundary\n * falls in is covered outright instead of blended.\n */\n.wx-table__cell.is-fixed-left::before,\n.wx-table__cell.is-fixed-right::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--wx-table-row-bg);\n pointer-events: none;\n}\n\n.wx-table__cell.is-fixed-left::before {\n left: -1px;\n}\n\n/*\n * Flush with the edge rather than a pixel past it. The rightmost pinned cell ends\n * where the table does, so a strip hanging over that edge is a pixel of scrollable\n * width — enough for a horizontal scrollbar to appear under a table that fits.\n */\n.wx-table__cell.is-fixed-right::before {\n right: 0;\n}\n\n/*\n * The edge of the frozen block, so it reads as floating over what slides beneath —\n * and only while something is sliding beneath it. A shadow on a table with nothing\n * hidden either side is a line drawn across the middle of it for no reason.\n */\n.wx-table.has-more-left .wx-table__cell.is-fixed-left.is-fixed-edge {\n box-shadow: 6px 0 6px -6px rgb(0 0 0 / 0.18);\n}\n\n.wx-table.has-more-right .wx-table__cell.is-fixed-right.is-fixed-edge {\n box-shadow: -6px 0 6px -6px rgb(0 0 0 / 0.18);\n}\n\n/*\n * Pinning is a luxury of width. On a phone the frozen columns take most of the screen\n * and the ones the reader came for have nowhere to scroll into view, so the table gives\n * up freezing and simply scrolls as a whole.\n *\n * The question is asked of the table rather than of the window: the same thing happens\n * to a table in a narrow panel on a wide desktop. The offsets are custom properties for\n * exactly this reason — an inline `left` could not be talked out of it.\n */\n@container (max-width: 600px) {\n .wx-table__cell.is-fixed-left,\n .wx-table__cell.is-fixed-right,\n .wx-table__cell.is-fixed-left.is-fixed-edge,\n .wx-table__cell.is-fixed-right.is-fixed-edge {\n left: auto;\n right: auto;\n z-index: auto;\n box-shadow: none;\n }\n\n .wx-table__cell.is-fixed-left::before,\n .wx-table__cell.is-fixed-right::before {\n display: none;\n }\n}\n\n.wx-table__body .wx-table__cell {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-table--bordered .wx-table__cell + .wx-table__cell {\n border-left: 1px solid var(--wx-border-muted);\n}\n\n/* Striped by row index, not by position: an expansion row is a sibling too, and\n counting it would flip the pattern from wherever a row was opened. Each state names\n its colour once; the pinned cells read it back out of the variable. */\n.wx-table--stripe .wx-table__row.is-striped {\n --wx-table-row-bg: var(--wx-bg-subtle);\n\n background: var(--wx-bg-subtle);\n}\n\n.wx-table--hover .wx-table__row:hover {\n --wx-table-row-bg: var(--wx-bg-fill);\n\n background: var(--wx-bg-fill);\n}\n\n.wx-table__row.is-selected {\n --wx-table-row-bg: var(--wx-color-primary-soft);\n\n background: var(--wx-color-primary-soft);\n}\n\n.wx-table__expander {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-table__expander:hover {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-table__expander:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-table__expander svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n transition: transform var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n.wx-table__row.is-expanded .wx-table__expander svg {\n transform: rotate(90deg);\n}\n\n.wx-table__expansion {\n background: var(--wx-bg-subtle);\n}\n\n.wx-table__sort {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-6);\n padding: 0;\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n\n.wx-table__sort:hover {\n color: var(--wx-text-default);\n}\n\n.wx-table__sort:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-table__sort-icon {\n flex: 0 0 auto;\n width: 8px;\n height: 12px;\n}\n\n.wx-table__sort-icon path {\n fill: var(--wx-border-strong);\n}\n\n.wx-table__sort-icon.is-asc .wx-table__sort-up,\n.wx-table__sort-icon.is-desc .wx-table__sort-down {\n fill: var(--wx-color-primary);\n}\n\n.wx-table__empty {\n padding: var(--wx-space-24) var(--wx-table-padding-x);\n color: var(--wx-text-muted);\n text-align: center;\n}\n\n.wx-table__foot .wx-table__cell {\n border-top: 1px solid var(--wx-border-muted);\n}\n\n.wx-table__summary .wx-table__cell {\n color: var(--wx-text-muted);\n}\n\n.wx-table__summary-label {\n text-align: right;\n}\n\n.wx-table__summary.is-strong .wx-table__cell {\n color: var(--wx-text-strong);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n/* The rows stay readable underneath: a page that is being refreshed still says what it said. */\n.wx-table__loading {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wx-space-8);\n background: color-mix(in srgb, var(--wx-bg-surface) 70%, transparent);\n border-radius: inherit;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-table__spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--wx-border-default);\n border-top-color: var(--wx-color-primary);\n border-radius: var(--wx-radius-full);\n animation: wx-table-spin var(--wx-duration-slow) linear infinite;\n}\n\n@keyframes wx-table-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-table__spinner {\n animation-duration: 3s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n computed,\n Fragment,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useSlots,\n watch,\n type VNode,\n} from 'vue'\nimport { TabsList, TabsRoot, TabsTrigger } from 'reka-ui'\nimport WxBadge from '../Badge/Badge.vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport WxTab from '../Tab/Tab.vue'\nimport type { IconName } from '../Icon/types'\nimport type { TabDescriptor, TabsEmits, TabsProps, TabValue } from './types'\n\ndefineOptions({ name: 'WxTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n variant: 'line',\n size: 'md',\n orientation: 'horizontal',\n align: 'start',\n activationMode: 'automatic',\n keepAlive: false,\n loop: true,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TabsEmits>()\n\ndefineSlots<{\n /** The `WxTab`s. */\n default?: () => unknown\n /** Sits at the end of the strip — a button, a filter, a count. */\n extra?: () => unknown\n}>()\n\nconst model = defineModel<TabValue | undefined>({ default: undefined })\n\nconst slots = useSlots()\n\n/** What the last render found, for the code that runs afterwards and cannot rescan. */\nlet rendered: TabDescriptor[] = []\n\n/**\n * The strip is built from the `WxTab`s in the slot, so a tab and its panel are written\n * in one place. The scan runs during render rather than in a computed: slot output is\n * not reactive state, and a cached copy would keep showing yesterday's labels.\n */\nfunction readTabs(): TabDescriptor[] {\n rendered = collect((slots.default?.() ?? []) as VNode[])\n scheduleSelect()\n return rendered\n}\n\nfunction collect(nodes: VNode[]): TabDescriptor[] {\n const found: TabDescriptor[] = []\n\n for (const node of nodes) {\n // `v-for` and `<template>` wrap what they render in a fragment.\n if (node.type === Fragment) {\n found.push(...collect((node.children ?? []) as VNode[]))\n continue\n }\n if (node.type !== WxTab) continue\n\n const tabProps = (node.props ?? {}) as Record<string, unknown>\n // A component's slots arrive as the vnode's children.\n const tabSlots = node.children as { label?: () => unknown } | null\n\n found.push({\n value: tabProps.value as TabValue,\n label: tabProps.label as string | undefined,\n icon: tabProps.icon as IconName | undefined,\n badge: tabProps.badge as string | number | undefined,\n // A bare `disabled` in a template is an empty string, not `true`.\n disabled: tabProps.disabled === '' || tabProps.disabled === true,\n labelSlot: typeof tabSlots?.label === 'function' ? tabSlots.label : undefined,\n })\n }\n\n return found\n}\n\n/**\n * Nothing selected shows an empty panel, so the first usable tab opens by itself. The\n * check is worth repeating: tabs often arrive from a request, and the tab that was open\n * can go away with the array it came from.\n */\nfunction selectFirst() {\n if (rendered.length === 0) return\n if (rendered.some((tab) => tab.value === model.value)) return\n\n model.value = (rendered.find((tab) => !tab.disabled) ?? rendered[0]).value\n}\n\nlet selectQueued = false\n\n/**\n * The check is asked for from the render and answered after it, because writing state\n * mid-render is how render loops start.\n *\n * It hangs off the scan rather than off `onUpdated` deliberately. Slot content belongs\n * to whoever wrote it: when the tabs come from a `v-for` in the parent, Vue patches the\n * new tabs straight into this component's output without re-rendering it, so no update\n * hook of ours would ever run — but the strip is rebuilt, and that is this function.\n */\nfunction scheduleSelect() {\n if (selectQueued) return\n\n selectQueued = true\n nextTick(() => {\n selectQueued = false\n selectFirst()\n })\n}\n\nwatch(model, (value) => {\n if (value !== undefined) emit('change', value)\n})\n\n/* ---------------------------------------------------------------------------\n * The strip on a small screen\n *\n * Tabs outgrow a phone long before they outgrow a desktop, so the strip scrolls\n * sideways rather than wrapping into a second row that pushes the panel down. Three\n * things follow. The active tab is scrolled into view whenever it changes, because it\n * is often changed from somewhere else — a wizard step, a route. The end that has more\n * behind it is faded, so the strip reads as scrollable without spending any width on\n * saying so. And the arrows are for a mouse only: a finger just swipes.\n * ------------------------------------------------------------------------- */\n\nconst scroller = ref<HTMLElement | null>(null)\nconst overflowStart = ref(false)\nconst overflowEnd = ref(false)\n\nconst scrollable = computed(() => props.orientation === 'horizontal')\n\nfunction measure() {\n const el = scroller.value\n if (!el || !scrollable.value) {\n overflowStart.value = false\n overflowEnd.value = false\n return\n }\n\n /* A pixel of slack: fractional widths never land exactly on the edge. */\n const max = el.scrollWidth - el.clientWidth\n overflowStart.value = el.scrollLeft > 1\n overflowEnd.value = el.scrollLeft < max - 1\n}\n\nfunction step(direction: 1 | -1) {\n const el = scroller.value\n if (!el) return\n\n /* Most of a screenful, so a tab or two stays behind as an anchor. */\n el.scrollLeft += direction * Math.max(el.clientWidth * 0.75, 120)\n measure()\n}\n\n/**\n * `instant` is for the first placement: a strip that opens on its eighth tab should\n * already be there, not slide there while the page is still settling.\n */\nfunction revealActive(instant = false) {\n const el = scroller.value\n if (!el || !scrollable.value) return\n\n const active = el.querySelector<HTMLElement>('[data-state=\"active\"]')\n if (!active) return\n\n /* `offsetLeft` is read against the scroller, which is positioned for exactly that. */\n const centred = active.offsetLeft - (el.clientWidth - active.offsetWidth) / 2\n\n if (instant) el.style.scrollBehavior = 'auto'\n /* Past the end it clamps by itself, which is what should happen for the last tab. */\n el.scrollLeft = Math.max(0, centred)\n if (instant) el.style.scrollBehavior = ''\n\n measure()\n}\n\nlet observer: ResizeObserver | undefined\n\nonMounted(() => {\n selectFirst()\n\n /* The strip overflows for two reasons: the container shrank, or the tabs changed. */\n observer = new ResizeObserver(() => measure())\n if (scroller.value) observer.observe(scroller.value)\n if (scroller.value?.firstElementChild) observer.observe(scroller.value.firstElementChild)\n\n measure()\n revealActive(true)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nwatch(model, async () => {\n await nextTick()\n revealActive()\n})\n\nconst classes = computed(() => [\n 'wx-tabs',\n `wx-tabs--${props.variant}`,\n `wx-tabs--${props.size}`,\n `wx-tabs--${props.orientation}`,\n `wx-tabs--align-${props.align}`,\n])\n\ndefineExpose({ measure, revealActive })\n</script>\n\n<template>\n <tabs-root\n v-model=\"model\"\n :class=\"classes\"\n :orientation=\"orientation\"\n :activation-mode=\"activationMode\"\n :unmount-on-hide=\"!keepAlive\"\n >\n <!--\n The root is the container the layout asks about, and a container query cannot\n style the container itself — so the strip and the panels are laid out one level in.\n -->\n <div class=\"wx-tabs__layout\">\n <div class=\"wx-tabs__bar\">\n <button\n v-if=\"overflowStart || overflowEnd\"\n class=\"wx-tabs__arrow\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :disabled=\"!overflowStart\"\n @click=\"step(-1)\"\n >\n <wx-icon name=\"chevron-left\" />\n </button>\n\n <div\n ref=\"scroller\"\n class=\"wx-tabs__scroller\"\n :class=\"{ 'is-overflow-start': overflowStart, 'is-overflow-end': overflowEnd }\"\n @scroll.passive=\"measure\"\n >\n <tabs-list class=\"wx-tabs__list\" :loop=\"loop\" :aria-label=\"ariaLabel\">\n <tabs-trigger\n v-for=\"tab in readTabs()\"\n :key=\"tab.value\"\n class=\"wx-tabs__tab\"\n :value=\"tab.value\"\n :disabled=\"tab.disabled\"\n >\n <wx-icon v-if=\"tab.icon\" class=\"wx-tabs__icon\" :name=\"tab.icon\" />\n <span class=\"wx-tabs__label\">\n <!-- A slot function renders as a functional component, in its own scope. -->\n <component :is=\"tab.labelSlot\" v-if=\"tab.labelSlot\" />\n <template v-else>{{ tab.label ?? tab.value }}</template>\n </span>\n <wx-badge v-if=\"tab.badge !== undefined\" class=\"wx-tabs__badge\" size=\"sm\" round>\n {{ tab.badge }}\n </wx-badge>\n </tabs-trigger>\n </tabs-list>\n </div>\n\n <button\n v-if=\"overflowStart || overflowEnd\"\n class=\"wx-tabs__arrow\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :disabled=\"!overflowEnd\"\n @click=\"step(1)\"\n >\n <wx-icon name=\"chevron-right\" />\n </button>\n\n <div v-if=\"$slots.extra\" class=\"wx-tabs__extra\">\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div class=\"wx-tabs__panels\">\n <slot />\n </div>\n </div>\n </tabs-root>\n</template>\n\n<style scoped>\n.wx-tabs {\n --wx-tabs-gap: var(--wx-space-4);\n --wx-tabs-fade: 24px;\n\n display: block;\n box-sizing: border-box;\n min-width: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n /* The strip reacts to the width it was given, not to the window's. */\n container-type: inline-size;\n}\n\n.wx-tabs__layout {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.wx-tabs__bar {\n display: flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-tabs__scroller {\n /* Positioned so a tab's `offsetLeft` is measured against the strip it scrolls in. */\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n /* A swipe along the strip must not become a page swipe or a browser back gesture. */\n overscroll-behavior-inline: contain;\n scroll-behavior: smooth;\n scrollbar-width: none;\n}\n\n.wx-tabs__scroller::-webkit-scrollbar {\n display: none;\n}\n\n/*\n * The fade says \"there is more this way\" and costs no width, which is the point on a\n * phone. Both ends share one mask, so a strip cut off at both ends fades at both.\n */\n.wx-tabs__scroller.is-overflow-start,\n.wx-tabs__scroller.is-overflow-end {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 var(--wx-tabs-fade-start, 0px),\n #000 calc(100% - var(--wx-tabs-fade-end, 0px)),\n transparent 100%\n );\n}\n\n.wx-tabs__scroller.is-overflow-start {\n --wx-tabs-fade-start: var(--wx-tabs-fade);\n}\n\n.wx-tabs__scroller.is-overflow-end {\n --wx-tabs-fade-end: var(--wx-tabs-fade);\n}\n\n.wx-tabs__list {\n display: flex;\n gap: var(--wx-tabs-gap);\n /* Narrower than the scroller, the list still has to span it for the rule under it. */\n width: max-content;\n min-width: 100%;\n}\n\n.wx-tabs__tab {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n box-sizing: border-box;\n margin: 0;\n padding: var(--wx-space-10) var(--wx-space-12);\n background: none;\n border: none;\n border-radius: var(--wx-radius-xs);\n color: var(--wx-text-muted);\n font-family: inherit;\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n line-height: var(--wx-font-line-height-tight);\n white-space: nowrap;\n cursor: pointer;\n transition:\n color var(--wx-duration-fast) var(--wx-easing-standard),\n background var(--wx-duration-fast) var(--wx-easing-standard),\n box-shadow var(--wx-duration-fast) var(--wx-easing-standard);\n}\n\n/*\n * Given room, the tabs are page-level navigation and read as such. The question is\n * put to the strip rather than to the window: tabs in a narrow panel on a wide\n * desktop are still tabs in a narrow panel. The compact scale keeps its own size —\n * the rule below is more specific, so it wins wherever it applies.\n */\n@container (min-width: 600px) {\n .wx-tabs__tab {\n font-size: var(--wx-font-size-md);\n }\n}\n\n.wx-tabs--sm .wx-tabs__tab {\n padding: var(--wx-space-6) var(--wx-space-10);\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-tabs__tab:hover:not(:disabled) {\n color: var(--wx-text-default);\n}\n\n.wx-tabs__tab:focus-visible {\n outline: none;\n box-shadow: var(--wx-ring-focus);\n}\n\n.wx-tabs__tab:disabled {\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-tabs__tab[data-state='active'] {\n color: var(--wx-color-primary);\n}\n\n.wx-tabs__icon {\n flex: 0 0 auto;\n font-size: var(--wx-font-size-md);\n}\n\n.wx-tabs__badge {\n flex: 0 0 auto;\n}\n\n.wx-tabs__arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n padding: 0;\n background: none;\n border: none;\n border-radius: var(--wx-radius-full);\n color: var(--wx-text-muted);\n cursor: pointer;\n}\n\n.wx-tabs__arrow:hover:not(:disabled) {\n background: var(--wx-bg-fill);\n color: var(--wx-text-default);\n}\n\n.wx-tabs__arrow:disabled {\n color: var(--wx-text-disabled);\n cursor: default;\n}\n\n.wx-tabs__extra {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--wx-space-6);\n padding-left: var(--wx-space-8);\n}\n\n.wx-tabs__panels {\n min-width: 0;\n padding-top: var(--wx-space-16);\n}\n\n/* Line — the default: a rule under the strip with the active tab standing on it. */\n.wx-tabs--line .wx-tabs__bar {\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n box-shadow: inset 0 -2px 0 transparent;\n}\n\n.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset 0 -2px 0 var(--wx-color-primary);\n}\n\n.wx-tabs--line .wx-tabs__tab:focus-visible {\n box-shadow: var(--wx-ring-focus);\n}\n\n/* Pill — a segmented control: the list is the track, the active tab the thumb. */\n.wx-tabs--pill .wx-tabs__list {\n gap: var(--wx-space-2);\n padding: var(--wx-space-4);\n background: var(--wx-bg-muted);\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-tabs--pill .wx-tabs__tab {\n border-radius: var(--wx-radius-xs);\n}\n\n.wx-tabs--pill .wx-tabs__tab[data-state='active'] {\n background: var(--wx-bg-surface);\n color: var(--wx-text-strong);\n box-shadow: var(--wx-shadow-card);\n}\n\n/* Card — folder tabs: the active one is a sheet that has risen through the rule. */\n.wx-tabs--card .wx-tabs__bar {\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-tabs--card .wx-tabs__list {\n gap: 0;\n}\n\n.wx-tabs--card .wx-tabs__tab {\n margin-bottom: -1px;\n border: 1px solid transparent;\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n}\n\n.wx-tabs--card .wx-tabs__tab[data-state='active'] {\n background: var(--wx-bg-surface);\n border-color: var(--wx-border-default);\n border-bottom-color: var(--wx-bg-surface);\n}\n\n/* Alignment only means anything while the tabs still fit. */\n.wx-tabs--align-center .wx-tabs__list {\n justify-content: center;\n}\n\n.wx-tabs--align-end .wx-tabs__list {\n justify-content: flex-end;\n}\n\n.wx-tabs--align-stretch .wx-tabs__list {\n width: 100%;\n}\n\n.wx-tabs--align-stretch .wx-tabs__tab {\n flex: 1 1 0;\n justify-content: center;\n}\n\n/* A column of tabs beside the panel. */\n.wx-tabs--vertical .wx-tabs__layout {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wx-space-16);\n}\n\n.wx-tabs--vertical .wx-tabs__bar {\n flex: 0 0 auto;\n flex-direction: column;\n align-items: stretch;\n}\n\n.wx-tabs--vertical .wx-tabs__scroller {\n overflow-x: visible;\n}\n\n.wx-tabs--vertical .wx-tabs__list {\n flex-direction: column;\n width: auto;\n min-width: 0;\n}\n\n.wx-tabs--vertical .wx-tabs__tab {\n justify-content: flex-start;\n}\n\n.wx-tabs--vertical .wx-tabs__panels {\n flex: 1 1 auto;\n padding-top: 0;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__bar {\n border-right: 1px solid var(--wx-border-default);\n border-bottom: none;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) 0 0 var(--wx-radius-xs);\n box-shadow: inset -2px 0 0 transparent;\n}\n\n.wx-tabs--vertical.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset -2px 0 0 var(--wx-color-primary);\n}\n\n/*\n * A column of tabs and a panel do not both fit across a phone. Below the width where\n * that stops working the column lies back down into an ordinary scrolling strip and\n * the panel takes the full width. The question is put to the tabs rather than to the\n * window: the same squeeze happens inside a narrow drawer on a wide monitor.\n */\n@container (max-width: 480px) {\n .wx-tabs--vertical .wx-tabs__layout {\n flex-direction: column;\n gap: 0;\n }\n\n .wx-tabs--vertical .wx-tabs__bar {\n flex-direction: row;\n align-items: center;\n }\n\n .wx-tabs--vertical .wx-tabs__scroller {\n overflow-x: auto;\n }\n\n .wx-tabs--vertical .wx-tabs__list {\n flex-direction: row;\n width: max-content;\n min-width: 100%;\n }\n\n .wx-tabs--vertical .wx-tabs__panels {\n padding-top: var(--wx-space-16);\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__bar {\n border-right: none;\n border-bottom: 1px solid var(--wx-border-default);\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__tab {\n border-radius: var(--wx-radius-xs) var(--wx-radius-xs) 0 0;\n box-shadow: inset 0 -2px 0 transparent;\n }\n\n .wx-tabs--vertical.wx-tabs--line .wx-tabs__tab[data-state='active'] {\n box-shadow: inset 0 -2px 0 var(--wx-color-primary);\n }\n}\n\n/* A finger needs a target it can hit, and has no use for the arrows — it swipes. */\n@media (pointer: coarse) {\n .wx-tabs__tab {\n min-height: 44px;\n }\n\n .wx-tabs__arrow {\n display: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wx-tabs__scroller {\n scroll-behavior: auto;\n }\n\n .wx-tabs__tab {\n transition: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { TagsInputEmits, TagsInputProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxTagsInput', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<TagsInputProps>(), {\n suggestions: () => [],\n placeholder: undefined,\n emptyText: 'Nothing found',\n max: undefined,\n duplicates: false,\n allowCreate: true,\n disabled: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TagsInputEmits>()\n\nconst model = defineModel<string[]>({ default: () => [] })\n\nconst field = useFormField(props)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst text = ref('')\nconst open = ref(false)\nconst highlighted = ref(-1)\n/** The tag Backspace has marked; the next Backspace removes it. */\nconst armed = ref(-1)\n\nconst tags = computed(() => model.value ?? [])\n\nconst suggestions = computed(() =>\n props.suggestions.filter((suggestion) => !tags.value.includes(suggestion)),\n)\n\nconst showList = computed(() => open.value && suggestions.value.length > 0)\n\nconst full = computed(() => props.max !== undefined && tags.value.length >= props.max)\n\nconst classes = computed(() => [\n 'wx-tags-input',\n `wx-tags-input--${field.size.value}`,\n {\n [`wx-tags-input--${field.status.value}`]: field.status.value !== 'default',\n 'is-open': showList.value,\n 'is-disabled': field.disabled.value,\n },\n])\n\nwatch(suggestions, () => {\n highlighted.value = -1\n})\n\nfunction commit(next: string[]) {\n model.value = next\n emit('change', next)\n}\n\nfunction add(tag: string) {\n const value = tag.trim()\n if (!value || full.value) return\n if (!props.duplicates && tags.value.includes(value)) {\n text.value = ''\n return\n }\n commit([...tags.value, value])\n text.value = ''\n open.value = false\n armed.value = -1\n}\n\nfunction remove(index: number) {\n commit(tags.value.filter((_, position) => position !== index))\n armed.value = -1\n}\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n text.value = value\n armed.value = -1\n highlighted.value = -1\n if (value) open.value = true\n emit('search', value)\n}\n\n/**\n * Backspace on an empty field marks the last tag first and removes it on the second\n * press — deleting something the user cannot see would be worse than one extra key.\n */\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n open.value = false\n armed.value = -1\n return\n }\n\n if (event.key === 'Backspace' && text.value === '' && tags.value.length > 0) {\n event.preventDefault()\n if (armed.value === tags.value.length - 1) remove(armed.value)\n else armed.value = tags.value.length - 1\n return\n }\n\n if (event.key === 'ArrowDown' && showList.value) {\n event.preventDefault()\n highlighted.value = (highlighted.value + 1) % suggestions.value.length\n return\n }\n\n if (event.key === 'ArrowUp' && showList.value) {\n event.preventDefault()\n highlighted.value =\n highlighted.value <= 0 ? suggestions.value.length - 1 : highlighted.value - 1\n return\n }\n\n if (event.key === 'Enter') {\n event.preventDefault()\n if (showList.value && highlighted.value >= 0) add(suggestions.value[highlighted.value])\n else if (props.allowCreate) add(text.value)\n }\n}\n\nfunction onBlur() {\n armed.value = -1\n // Let a click on a suggestion land before the list disappears.\n window.setTimeout(() => {\n open.value = false\n }, 120)\n}\n\ndefineExpose({ focus: () => inputRef.value?.focus() })\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <div class=\"wx-tags-input__anchor\" @click=\"inputRef?.focus()\">\n <span\n v-for=\"(tag, index) in tags\"\n :key=\"tag\"\n class=\"wx-tags-input__tag\"\n :class=\"{ 'is-armed': index === armed }\"\n >\n {{ tag }}\n <button\n v-if=\"!field.disabled.value\"\n class=\"wx-tags-input__remove\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"`Remove ${tag}`\"\n @click.stop=\"remove(index)\"\n >\n ✕\n </button>\n </span>\n\n <input\n :id=\"field.id.value\"\n ref=\"inputRef\"\n v-bind=\"controlAttrs\"\n class=\"wx-tags-input__field\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-expanded=\"showList\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @focus=\"open = true\"\n @blur=\"onBlur\"\n />\n\n <ul v-if=\"showList\" class=\"wx-tags-input__list\" role=\"listbox\">\n <li\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"suggestion\"\n class=\"wx-tags-input__option\"\n :class=\"{ 'is-highlighted': index === highlighted }\"\n role=\"option\"\n :aria-selected=\"index === highlighted\"\n @mousedown.prevent=\"add(suggestion)\"\n @mousemove=\"highlighted = index\"\n >\n {{ suggestion }}\n </li>\n </ul>\n </div>\n\n <select v-if=\"name\" class=\"wx-sr-only\" :name=\"name\" multiple tabindex=\"-1\" aria-hidden=\"true\">\n <option v-for=\"tag in tags\" :key=\"tag\" :value=\"tag\" selected>{{ tag }}</option>\n </select>\n </div>\n</template>\n\n<style scoped>\n.wx-tags-input {\n display: block;\n width: 100%;\n}\n\n.wx-tags-input__anchor {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4);\n box-sizing: border-box;\n min-height: var(--wx-size-control-md);\n padding: var(--wx-space-4) var(--wx-space-10);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-control-md);\n cursor: text;\n transition: border-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-tags-input--sm .wx-tags-input__anchor {\n min-height: var(--wx-size-control-sm);\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-tags-input--lg .wx-tags-input__anchor {\n min-height: var(--wx-size-control-lg);\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-tags-input__anchor:hover {\n border-color: var(--wx-border-strong);\n}\n\n.wx-tags-input__anchor:focus-within {\n border-color: var(--wx-border-focus);\n}\n\n.wx-tags-input--error .wx-tags-input__anchor {\n border-color: var(--wx-color-danger);\n}\n\n.wx-tags-input--success .wx-tags-input__anchor {\n border-color: var(--wx-color-success);\n}\n\n.wx-tags-input--warning .wx-tags-input__anchor {\n border-color: var(--wx-color-warning);\n}\n\n.wx-tags-input.is-disabled .wx-tags-input__anchor {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n cursor: not-allowed;\n}\n\n.wx-tags-input__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n padding: 2px var(--wx-space-6);\n background: var(--wx-bg-fill);\n border-radius: var(--wx-radius-xs);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-tags-input__tag.is-armed {\n background: var(--wx-color-danger-soft);\n color: var(--wx-color-danger);\n}\n\n.wx-tags-input__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n color: currentcolor;\n font-size: var(--wx-font-size-xs);\n line-height: 1;\n opacity: 0.65;\n cursor: pointer;\n}\n\n.wx-tags-input__remove:hover {\n opacity: 1;\n}\n\n.wx-tags-input__field {\n flex: 1 1 80px;\n min-width: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n}\n\n.wx-tags-input__field::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-tags-input__list {\n position: absolute;\n top: calc(100% + var(--wx-space-4));\n left: 0;\n right: 0;\n /* One layer for every floating panel, so the one opened last is the one on top. */\n z-index: var(--wx-z-index-popover);\n max-height: 220px;\n margin: 0;\n padding: var(--wx-space-4);\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n box-shadow: var(--wx-shadow-popover);\n list-style: none;\n overflow-y: auto;\n}\n\n.wx-tags-input__option {\n padding: var(--wx-space-6) var(--wx-space-10);\n border-radius: var(--wx-radius-xs);\n cursor: pointer;\n}\n\n.wx-tags-input__option.is-highlighted {\n background: var(--wx-bg-fill);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { TextProps } from './types'\n\ndefineOptions({ name: 'WxText' })\n\nconst props = withDefaults(defineProps<TextProps>(), {\n as: 'span',\n size: 'md',\n weight: 'regular',\n tone: 'default',\n align: undefined,\n truncate: false,\n italic: false,\n mono: false,\n})\n\nconst clampLines = computed(() => (typeof props.truncate === 'number' ? props.truncate : undefined))\n\nconst classes = computed(() => [\n 'wx-text',\n `wx-text--${props.size}`,\n `wx-text--${props.weight}`,\n `wx-text--tone-${props.tone}`,\n {\n [`wx-text--align-${props.align}`]: Boolean(props.align),\n 'wx-text--italic': props.italic,\n 'wx-text--mono': props.mono,\n 'wx-text--truncate': props.truncate === true,\n 'wx-text--clamp': clampLines.value !== undefined,\n },\n])\n\nconst style = computed(() =>\n clampLines.value === undefined ? undefined : { '--wx-text-lines': clampLines.value },\n)\n</script>\n\n<template>\n <component :is=\"as\" :class=\"classes\" :style=\"style\">\n <slot />\n </component>\n</template>\n\n<style scoped>\n.wx-text {\n margin: 0;\n font-family: var(--wx-font-family-sans);\n line-height: var(--wx-font-line-height-normal);\n color: var(--wx-text-color, var(--wx-text-default));\n}\n\n/* sizes */\n.wx-text--xs {\n font-size: var(--wx-font-size-xs);\n}\n\n.wx-text--sm {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-text--md {\n font-size: var(--wx-font-size-md);\n}\n\n.wx-text--lg {\n font-size: var(--wx-font-size-lg);\n}\n\n.wx-text--xl {\n font-size: var(--wx-font-size-xl);\n}\n\n/* weights */\n.wx-text--regular {\n font-weight: var(--wx-font-weight-regular);\n}\n\n.wx-text--medium {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-text--semibold {\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-text--bold {\n font-weight: var(--wx-font-weight-bold);\n}\n\n/* tones */\n.wx-text--tone-default {\n --wx-text-color: var(--wx-text-default);\n}\n\n.wx-text--tone-strong {\n --wx-text-color: var(--wx-text-strong);\n}\n\n.wx-text--tone-muted {\n --wx-text-color: var(--wx-text-muted);\n}\n\n.wx-text--tone-placeholder {\n --wx-text-color: var(--wx-text-placeholder);\n}\n\n.wx-text--tone-primary {\n --wx-text-color: var(--wx-color-primary);\n}\n\n.wx-text--tone-success {\n --wx-text-color: var(--wx-color-success-active);\n}\n\n.wx-text--tone-warning {\n --wx-text-color: var(--wx-color-warning-active);\n}\n\n.wx-text--tone-danger {\n --wx-text-color: var(--wx-color-danger);\n}\n\n.wx-text--tone-info {\n --wx-text-color: var(--wx-color-info-active);\n}\n\n.wx-text--tone-inverse {\n --wx-text-color: var(--wx-text-inverse);\n}\n\n/* alignment */\n.wx-text--align-start {\n text-align: start;\n}\n\n.wx-text--align-center {\n text-align: center;\n}\n\n.wx-text--align-end {\n text-align: end;\n}\n\n.wx-text--align-justify {\n text-align: justify;\n}\n\n.wx-text--italic {\n font-style: italic;\n}\n\n.wx-text--mono {\n font-family: var(--wx-font-family-mono);\n font-variant-numeric: tabular-nums;\n}\n\n/* Truncation needs a block box: an inline span ignores overflow. */\n.wx-text--truncate {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-text--clamp {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: var(--wx-text-lines, 2);\n line-clamp: var(--wx-text-lines, 2);\n overflow: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\nimport { useFormField } from '../../composables/useFormField'\nimport type { TextareaEmits, TextareaModelValue, TextareaProps } from './types'\nimport { useControlAttrs } from '../../composables/useControlAttrs'\n\ndefineOptions({ name: 'WxTextarea', inheritAttrs: false })\n\n/* `class` and `style` belong to the control; the rest belongs to its input. */\nconst { rootAttrs, controlAttrs } = useControlAttrs()\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n size: undefined,\n status: undefined,\n id: undefined,\n placeholder: undefined,\n disabled: undefined,\n readonly: false,\n rows: 3,\n autosize: false,\n maxlength: undefined,\n showCount: false,\n resize: 'vertical',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst model = defineModel<TextareaModelValue>({ default: '' })\n\nconst field = useFormField(props)\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst focused = ref(false)\n\nconst currentValue = computed(() => model.value ?? '')\n\nconst counter = computed(() =>\n props.showCount && props.maxlength ? `${currentValue.value.length}/${props.maxlength}` : null,\n)\n\nconst autosizeOptions = computed(() =>\n props.autosize === true ? {} : props.autosize === false ? null : props.autosize,\n)\n\nconst classes = computed(() => [\n 'wx-textarea',\n `wx-textarea--${field.size.value}`,\n {\n [`wx-textarea--${field.status.value}`]: field.status.value !== 'default',\n 'is-focused': focused.value,\n 'is-disabled': field.disabled.value,\n 'is-readonly': props.readonly,\n 'is-autosize': Boolean(autosizeOptions.value),\n },\n])\n\n/** Grows the field to fit its content, clamped by minRows / maxRows. */\nfunction syncHeight() {\n const options = autosizeOptions.value\n const el = textareaRef.value\n if (!options || !el) return\n\n el.style.height = 'auto'\n const styles = getComputedStyle(el)\n const lineHeight = Number.parseFloat(styles.lineHeight) || 20\n const vertical =\n Number.parseFloat(styles.paddingTop) +\n Number.parseFloat(styles.paddingBottom) +\n Number.parseFloat(styles.borderTopWidth) +\n Number.parseFloat(styles.borderBottomWidth)\n\n let height = el.scrollHeight\n if (options.minRows) height = Math.max(height, options.minRows * lineHeight + vertical)\n if (options.maxRows) height = Math.min(height, options.maxRows * lineHeight + vertical)\n\n el.style.height = `${height}px`\n el.style.overflowY = options.maxRows && el.scrollHeight > height ? 'auto' : 'hidden'\n}\n\nonMounted(() => nextTick(syncHeight))\nwatch([currentValue, autosizeOptions], () => nextTick(syncHeight))\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value\n model.value = value\n emit('input', value)\n}\n\nfunction onChange(event: Event) {\n emit('change', (event.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n emit('blur', event)\n}\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n blur: () => textareaRef.value?.blur(),\n select: () => textareaRef.value?.select(),\n textarea: textareaRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\" v-bind=\"rootAttrs\">\n <textarea\n :id=\"field.id.value\"\n ref=\"textareaRef\"\n v-bind=\"controlAttrs\"\n class=\"wx-textarea__inner\"\n :value=\"currentValue\"\n :rows=\"rows\"\n :placeholder=\"placeholder\"\n :disabled=\"field.disabled.value\"\n :readonly=\"readonly\"\n :maxlength=\"maxlength\"\n :aria-label=\"ariaLabel\"\n :aria-describedby=\"field.describedBy.value\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :style=\"{ resize }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <span v-if=\"counter\" class=\"wx-textarea__count\">{{ counter }}</span>\n </div>\n</template>\n\n<style scoped>\n.wx-textarea {\n position: relative;\n display: block;\n box-sizing: border-box;\n width: 100%;\n background: var(--wx-bg-surface);\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-control);\n color: var(--wx-text-default);\n transition:\n border-color var(--wx-duration-normal) var(--wx-easing-standard),\n background-color var(--wx-duration-normal) var(--wx-easing-standard);\n}\n\n.wx-textarea:hover:not(.is-disabled) {\n border-color: var(--wx-border-strong);\n}\n\n.wx-textarea.is-focused {\n border-color: var(--wx-border-focus);\n}\n\n.wx-textarea--error,\n.wx-textarea--error.is-focused {\n border-color: var(--wx-color-danger);\n}\n\n.wx-textarea--success,\n.wx-textarea--success.is-focused {\n border-color: var(--wx-color-success);\n}\n\n.wx-textarea--warning,\n.wx-textarea--warning.is-focused {\n border-color: var(--wx-color-warning);\n}\n\n.wx-textarea.is-disabled {\n background: var(--wx-bg-disabled);\n color: var(--wx-text-disabled);\n}\n\n.wx-textarea__inner {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-textarea--sm {\n font-size: var(--wx-font-size-control-sm);\n}\n\n.wx-textarea--md {\n font-size: var(--wx-font-size-control-md);\n}\n\n.wx-textarea--lg {\n font-size: var(--wx-font-size-control-lg);\n}\n\n.wx-textarea.is-autosize .wx-textarea__inner {\n resize: none !important;\n overflow-y: hidden;\n}\n\n.wx-textarea__inner::placeholder {\n color: var(--wx-text-placeholder);\n}\n\n.wx-textarea__inner:disabled {\n cursor: not-allowed;\n}\n\n.wx-textarea__count {\n position: absolute;\n right: var(--wx-space-8);\n bottom: var(--wx-space-4);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n font-variant-numeric: tabular-nums;\n pointer-events: none;\n}\n</style>\n","import { inject, type ComputedRef, type InjectionKey } from 'vue'\n\nexport type TimelineSize = 'sm' | 'md'\n\n/** What `WxTimeline` hands down to the items inside it. */\nexport interface TimelineContext {\n size: ComputedRef<TimelineSize>\n}\n\nexport const timelineKey: InjectionKey<TimelineContext> = Symbol('wx-timeline')\n\nexport function useTimeline(): TimelineContext | null {\n return inject(timelineKey, null)\n}\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport { timelineKey } from '../../composables/useTimeline'\nimport type { TimelineProps } from './types'\n\ndefineOptions({ name: 'WxTimeline' })\n\nconst props = withDefaults(defineProps<TimelineProps>(), {\n size: 'md',\n})\n\nprovide(timelineKey, { size: computed(() => props.size) })\n</script>\n\n<template>\n <ul class=\"wx-timeline\" :class=\"`wx-timeline--${size}`\">\n <slot />\n </ul>\n</template>\n\n<style scoped>\n.wx-timeline {\n --wx-timeline-dot: 12px;\n --wx-timeline-gap: var(--wx-space-18);\n\n margin: 0;\n padding: 0;\n list-style: none;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-sans);\n}\n\n.wx-timeline--sm {\n --wx-timeline-dot: 9px;\n --wx-timeline-gap: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport WxIcon from '../Icon/Icon.vue'\nimport { useTimeline } from '../../composables/useTimeline'\nimport type { TimelineItemProps } from './types'\n\ndefineOptions({ name: 'WxTimelineItem' })\n\nconst props = withDefaults(defineProps<TimelineItemProps>(), {\n timestamp: undefined,\n datetime: undefined,\n timestampPlacement: 'top',\n title: undefined,\n type: 'default',\n hollow: false,\n icon: undefined,\n hideLine: false,\n})\n\nconst timeline = useTimeline()\nconst slots = useSlots()\n\nconst hasMark = computed(() => Boolean(props.icon || slots.dot))\n\nconst classes = computed(() => [\n 'wx-timeline-item',\n `wx-timeline-item--${timeline?.size.value ?? 'md'}`,\n {\n 'wx-timeline-item--no-line': props.hideLine,\n // A mark needs a bigger dot to sit in; the line and the indent follow it.\n 'wx-timeline-item--mark': hasMark.value,\n },\n])\n\nconst dotClasses = computed(() => [\n 'wx-timeline-item__dot',\n `wx-timeline-item__dot--${props.type}`,\n { 'wx-timeline-item__dot--hollow': props.hollow },\n])\n</script>\n\n<template>\n <li :class=\"classes\">\n <span class=\"wx-timeline-item__line\" aria-hidden=\"true\" />\n\n <span :class=\"dotClasses\" aria-hidden=\"true\">\n <slot name=\"dot\">\n <wx-icon v-if=\"icon\" :name=\"icon\" />\n </slot>\n </span>\n\n <div class=\"wx-timeline-item__content\">\n <time\n v-if=\"timestamp && timestampPlacement === 'top'\"\n class=\"wx-timeline-item__timestamp\"\n :datetime=\"datetime\"\n >\n {{ timestamp }}\n </time>\n\n <p v-if=\"title || $slots.title\" class=\"wx-timeline-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </p>\n\n <div v-if=\"$slots.default\" class=\"wx-timeline-item__body\">\n <slot />\n </div>\n\n <time\n v-if=\"timestamp && timestampPlacement === 'bottom'\"\n class=\"wx-timeline-item__timestamp wx-timeline-item__timestamp--bottom\"\n :datetime=\"datetime\"\n >\n {{ timestamp }}\n </time>\n </div>\n </li>\n</template>\n\n<style scoped>\n/*\n * Everything hangs off one vertical axis: the dot is centred on it, the line runs\n * down it, and the text starts a fixed gap to its right. Changing the dot size —\n * a small marker, or a 24px circle holding an icon — never moves the text.\n */\n.wx-timeline-item {\n --wx-timeline-axis: 12px;\n --wx-timeline-mark: var(--wx-timeline-dot, 12px);\n --wx-timeline-mark-top: 3px;\n\n position: relative;\n padding-left: calc(var(--wx-timeline-axis) + var(--wx-space-16));\n padding-bottom: var(--wx-timeline-gap, var(--wx-space-18));\n}\n\n.wx-timeline-item--sm {\n --wx-timeline-axis: 10px;\n}\n\n.wx-timeline-item--mark {\n --wx-timeline-mark: 24px;\n --wx-timeline-mark-top: 0px;\n}\n\n/* The last entry ends at its content: no trailing stub of line under it. */\n.wx-timeline-item:last-child {\n padding-bottom: 0;\n}\n\n.wx-timeline-item__line {\n position: absolute;\n top: calc(var(--wx-timeline-mark-top) + var(--wx-timeline-mark) + 4px);\n bottom: 0;\n left: calc(var(--wx-timeline-axis) - 0.5px);\n width: 1px;\n background: var(--wx-border-default);\n}\n\n.wx-timeline-item:last-child .wx-timeline-item__line,\n.wx-timeline-item--no-line .wx-timeline-item__line {\n display: none;\n}\n\n.wx-timeline-item__dot {\n position: absolute;\n top: var(--wx-timeline-mark-top);\n left: calc(var(--wx-timeline-axis) - var(--wx-timeline-mark) / 2);\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--wx-timeline-mark);\n height: var(--wx-timeline-mark);\n background: var(--wx-timeline-dot-color, var(--wx-border-strong));\n border-radius: var(--wx-radius-full);\n color: var(--wx-timeline-dot-contrast, var(--wx-text-inverse));\n font-size: 14px;\n}\n\n.wx-timeline-item__dot--hollow {\n background: var(--wx-bg-surface);\n border: 2px solid var(--wx-timeline-dot-color, var(--wx-border-strong));\n color: var(--wx-timeline-dot-color, var(--wx-border-strong));\n}\n\n.wx-timeline-item__dot--default {\n --wx-timeline-dot-color: var(--wx-border-strong);\n --wx-timeline-dot-contrast: var(--wx-text-inverse);\n}\n\n.wx-timeline-item__dot--primary {\n --wx-timeline-dot-color: var(--wx-color-primary);\n --wx-timeline-dot-contrast: var(--wx-color-primary-contrast);\n}\n\n.wx-timeline-item__dot--success {\n --wx-timeline-dot-color: var(--wx-color-success);\n --wx-timeline-dot-contrast: var(--wx-color-success-contrast);\n}\n\n.wx-timeline-item__dot--warning {\n --wx-timeline-dot-color: var(--wx-color-warning);\n --wx-timeline-dot-contrast: var(--wx-color-warning-contrast);\n}\n\n.wx-timeline-item__dot--danger {\n --wx-timeline-dot-color: var(--wx-color-danger);\n --wx-timeline-dot-contrast: var(--wx-color-danger-contrast);\n}\n\n.wx-timeline-item__dot--info {\n --wx-timeline-dot-color: var(--wx-color-info);\n --wx-timeline-dot-contrast: var(--wx-color-info-contrast);\n}\n\n.wx-timeline-item__content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wx-timeline-item__timestamp {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-normal);\n}\n\n.wx-timeline-item__timestamp--bottom {\n margin-top: var(--wx-space-4);\n}\n\n.wx-timeline-item__title {\n margin: 0;\n color: var(--wx-text-strong);\n font-size: var(--wx-font-size-md);\n font-weight: var(--wx-font-weight-semibold);\n line-height: var(--wx-font-line-height-tight);\n}\n\n.wx-timeline-item--sm .wx-timeline-item__title {\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-timeline-item__body {\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-normal);\n}\n</style>\n","<script setup lang=\"ts\">\nimport WxDatePicker from '../DatePicker/DatePicker.vue'\nimport type { DatePickerModelValue, DatePickerProps } from '../DatePicker/types'\n\ndefineOptions({ name: 'WxTimePicker' })\n\n/**\n * Every prop defaults to `undefined` on purpose. Vue casts an absent boolean prop\n * to `false`, and this preset forwards its whole prop object — without these the\n * preset would hand `WxDatePicker` an explicit `false` for `is24`, `clearable`,\n * `autoApply` and `teleport`, overriding that component's own defaults. Passing\n * `undefined` lets each default apply as if the prop had never been written.\n */\nwithDefaults(defineProps<Omit<DatePickerProps, 'type'>>(), {\n valueFormat: undefined,\n format: undefined,\n placeholder: undefined,\n clearable: undefined,\n minDate: undefined,\n maxDate: undefined,\n seconds: undefined,\n minutesIncrement: undefined,\n is24: undefined,\n weekStart: undefined,\n autoApply: undefined,\n textInput: undefined,\n teleport: undefined,\n disabled: undefined,\n readonly: undefined,\n size: undefined,\n status: undefined,\n id: undefined,\n name: undefined,\n ariaLabel: undefined,\n})\n\n/*\n * Every slot is passed straight through to the picker underneath, so this component's\n * slots are whatever the caller hands it. Saying so explicitly is what keeps the\n * declaration honest: left to infer, the slot type is read off a template that\n * enumerates the slots themselves, and TypeScript answers that circle by emitting\n * `any`.\n */\ndefineSlots<Record<string, (props: Record<string, unknown>) => unknown>>()\n\nconst model = defineModel<DatePickerModelValue>({ default: null })\n</script>\n\n<template>\n <wx-date-picker v-model=\"model\" type=\"time\" v-bind=\"$props\">\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </wx-date-picker>\n</template>\n","import type { App, Component, Plugin } from 'vue'\nimport * as components from './components'\n\nexport interface WebxUiOptions {\n /**\n * Prefix used when registering components globally.\n * Components are declared as `WxButton`, so the default keeps that name.\n */\n prefix?: string\n}\n\n/**\n * Registers every component globally:\n *\n * ```ts\n * import { WebxUI } from '@webx-ui/core'\n * import '@webx-ui/core/style.css'\n *\n * app.use(WebxUI)\n * ```\n *\n * Prefer named imports when bundle size matters — they tree-shake.\n */\nexport const WebxUI: Plugin<[WebxUiOptions?]> = {\n install(app: App, options: WebxUiOptions = {}) {\n const { prefix = 'Wx' } = options\n\n /*\n * The barrel also exports helpers — the icon registry, the countdown formatter —\n * so the `Wx` prefix is what marks a component, and the cast follows that check.\n */\n for (const [name, exported] of Object.entries(components)) {\n if (!name.startsWith('Wx')) continue\n const registeredName = prefix === 'Wx' ? name : `${prefix}${name.slice(2)}`\n app.component(registeredName, exported as Component)\n }\n },\n}\n\nexport default WebxUI\n","import { computed, onMounted, ref, watch, type ComputedRef, type Ref } from 'vue'\nimport { useElementWidth } from './useElementWidth'\nimport { usePanelMemory } from './useOverlayPanel'\n\n/** What shape the navigation takes at the width it has been given. */\nexport type ShellLayout = 'sidebar' | 'rail' | 'drawer'\n\nexport interface ResponsiveShellOptions {\n /** Under this width the menu leaves the page for a drawer behind a burger. */\n phone?: number\n /** Under this width the sidebar starts as an icon rail. */\n tablet?: number\n /** Whether it starts as a rail on a screen wide enough for the full sidebar. */\n collapsed?: boolean\n /**\n * Remembers a sidebar that was closed by hand, under this key in `localStorage`.\n * Only the closing is kept: a sidebar left open goes back to following the width,\n * so a desktop opens it and a tablet still starts with the rail.\n */\n persist?: string\n}\n\nexport interface ResponsiveShell {\n /** Width of what is being measured, in pixels. `0` until it has been measured. */\n width: Ref<number>\n layout: ComputedRef<ShellLayout>\n /** Hand this to `WxAside` and `WxMenu` — true for both the rail and the drawer. */\n collapsed: ComputedRef<boolean>\n /** Whether there is room for a sidebar at all. False on a phone. */\n showAside: ComputedRef<boolean>\n drawerOpen: Ref<boolean>\n /**\n * What the one button in the header does: it collapses and expands the sidebar\n * while the sidebar is on the page, and opens the drawer once the menu is gone.\n * The icon follows `layout` — a burger belongs to the drawer alone.\n */\n toggle: () => void\n close: () => void\n}\n\n/** What `persist` keeps: a sidebar that was closed by hand, and nothing else. */\ninterface ShellMemory {\n collapsed: boolean\n}\n\nconst PHONE = 640\nconst TABLET = 1024\n\n/**\n * The rule on its own, so it can be read — and tested — without a browser.\n *\n * `collapsed` is the answer to \"is the sidebar a rail\", and `null` leaves it to the\n * width: a rail from the tablet breakpoint down. Only the phone breakpoint is\n * absolute, because a menu that has nowhere to stand has to leave the page.\n *\n * A width of `0` means nothing has been measured yet: on the server, and on the very\n * first render. The widest shape is the right guess there, since it is the one a\n * desktop gets, and the measurement that follows corrects it before paint.\n */\nexport function shellLayoutFor(\n width: number,\n collapsed: boolean | null,\n options: ResponsiveShellOptions = {},\n): ShellLayout {\n const { phone = PHONE, tablet = TABLET } = options\n\n if (width > 0 && width < phone) return 'drawer'\n\n const rail = collapsed ?? (width > 0 && width < tablet)\n return rail ? 'rail' : 'sidebar'\n}\n\n/**\n * Drives the three shapes an admin sidebar takes — full, icon rail, drawer — from\n * the width of the shell rather than from the viewport's. The two are the same\n * thing on a real page, and they are not inside a preview, a split screen or the\n * demo box on this page, which is the case that catches a viewport media query out.\n *\n * ```ts\n * const shell = useResponsiveShell(shellRef)\n * ```\n *\n * Pass nothing to measure the page itself.\n */\nexport function useResponsiveShell(\n target?: Ref<HTMLElement | null | undefined>,\n options: ResponsiveShellOptions = {},\n): ResponsiveShell {\n const width = useElementWidth(target)\n const drawerOpen = ref(false)\n\n /*\n * What the reader last asked for, or `null` for \"whatever the width suggests\".\n * The two answers are not equal: closing a sidebar is a decision that holds at\n * every width and across reloads, while opening one only says \"not here, not now\"\n * — it is dropped as soon as the screen changes size class, and the width decides\n * again. Otherwise a sidebar opened on a desktop would be waiting on a tablet.\n */\n const preference = ref<boolean | null>(options.collapsed ?? null)\n\n const memory = usePanelMemory<ShellMemory>('wx-shell:', () => options.persist)\n\n const layout = computed(() => shellLayoutFor(width.value, preference.value, options))\n const collapsed = computed(() => layout.value !== 'sidebar')\n const showAside = computed(() => layout.value !== 'drawer')\n\n onMounted(() => {\n /* Read after mounting: the server has no storage, and the markup must match. */\n if (memory.read()?.collapsed) preference.value = true\n })\n\n /** Which size class the screen is in — what an open sidebar is remembered against. */\n const sizeClass = computed<ShellLayout>(() => shellLayoutFor(width.value, null, options))\n\n watch(sizeClass, () => {\n /* The screen changed class, so \"open, here\" has been answered and is let go. */\n if (preference.value === false) preference.value = null\n /* And once the menu is back on the page, the drawer has nothing left to show. */\n if (sizeClass.value !== 'drawer') drawerOpen.value = false\n })\n\n /**\n * The button does the one thing that is visible from where the reader is standing:\n * where the sidebar is on the page it collapses and expands it, and where the menu\n * is gone entirely it is the burger that brings the drawer back.\n */\n function toggle() {\n if (layout.value === 'drawer') {\n drawerOpen.value = !drawerOpen.value\n return\n }\n\n const closing = layout.value !== 'rail'\n preference.value = closing ? true : false\n\n /* Only the closing is worth keeping; an open sidebar is the default anyway. */\n if (closing) memory.write({ collapsed: true })\n else memory.clear()\n }\n\n function close() {\n drawerOpen.value = false\n }\n\n return { width, layout, collapsed, showAside, drawerOpen, toggle, close }\n}\n"],"names":["accordionKey","useAccordion","inject","props","__props","emit","__emit","model","_useModel","provide","computed","watch","value","classes","_createBlock","_unref","AccordionRoot","$event","_renderSlot","_ctx","builtinIcons","customIcons","registerIcons","icons","name","content","resolveIcon","iconNames","keywordSizes","boxSize","size","_createElementBlock","accordion","iconPosition","headingTag","AccordionItem","_createElementVNode","_hoisted_1","_createVNode","AccordionHeader","AccordionTrigger","WxIcon","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","$slots","_openBlock","_hoisted_5","AccordionContent","_hoisted_6","actionsKey","useActions","presets","group","preset","icon","tone","accessibleName","tag","nativeAttrs","onClick","event","_normalizeClass","_resolveDynamicComponent","_mergeProps","$attrs","dropdownKey","useDropdown","open","close","onPanelClick","PopoverRoot","PopoverTrigger","PopoverPortal","PopoverContent","root","ref","row","collapsed","measure","rowEl","parent","style","padding","available","observer","observe","onMounted","onBeforeUnmount","__expose","WxDropdown","WxAction","visible","typeIcons","iconName","onClose","toLength","vars","width","collapsedWidth","formContextKey","formItemContextKey","uid","useId","prefix","useFormField","form","item","fallbackId","id","disabled","status","describedBy","checkboxGroupKey","radioGroupKey","provideFormItem","context","useControlAttrs","attrs","useAttrs","rootAttrs","picked","controlAttrs","rest","key","field","debounceTimer","picking","cancelSearch","showClear","hasList","onSelect","option","clear","AutocompleteAnchor","AutocompletePortal","AutocompleteContent","AutocompleteViewport","AutocompleteEmpty","_Fragment","_renderList","AutocompleteItem","_cache","breadcrumbKey","useBreadcrumb","breadcrumb","isLink","isCurrent","linkAttrs","separatorIcon","separator","buttonGroupKey","useButtonGroup","type","variant","isDisabled","slots","useSlots","hasHeader","hasSidebar","_hoisted_7","_hoisted_8","activePath","panel","loadedChildren","loadingKeys","keyOf","path","rootOptions","childrenOf","parents","isLeaf","loaded","isLoading","columns","result","index","children","resolvePath","values","level","candidate","findPath","options","found","selectedPath","hasValue","displayLabel","formValue","loadLevel","expand","select","onOptionClick","leaf","onOptionHover","optionsIn","focusOption","items","bounded","onPanelKeydown","target","column","current","nextTick","PopoverAnchor","_createTextVNode","inputRef","checked","syncIndeterminate","onChange","next","toggle","WxCheckbox","breakpoints","normalize","span","offset","HEX","text","toWorking","hex","convertToHsb","parseColor","working","colorToHex","areaStyle","getAreaBackgroundStyle","hueStyle","getSliderBackgroundStyle","swatch","commit","onInput","onBlur","onColor","color","onHex","openPicker","_normalizeStyle","ColorAreaRoot","ColorAreaArea","ColorAreaThumb","ColorSliderRoot","ColorSliderTrack","ColorSliderThumb","display","units","formatCountdown","ms","format","remaining","out","token","unit","toTimestamp","parsed","timer","stop","tick","left","start","running","WxStatistic","hasTime","modelType","displayFormat","time","config","timeConfig","inputAttrs","onUpdate","onCleared","_","_withCtx","slotProps","_normalizeProps","_guardReactiveProps","WxDatePicker","$props","_createSlots","cssLength","trimmed","pixelLength","clamp","min","max","usePanelMemory","storageKey","raw","GUTTER","hasTitle","hasHead","scrollsInPlace","movable","sizable","layout","memory","panelVars","height","sidebar","dragging","resizing","gesture","begin","kind","element","rect","move","end","startDrag","startResize","dx","dy","top","stopListening","reset","restore","saved","onEscape","onInteractOutside","onViewportPointerDown","DialogRoot","DialogTrigger","DialogPortal","DialogOverlay","DialogContent","DialogTitle","DialogClose","hasLabel","STEP","horizontal","panelOf","currentSize","maxSize","sizeFrom","startSize","delta","store","onHandleKeydown","from","dropdown","defaultImageSize","imageSize","hasMedia","initial","hasMeta","errors","toRef","onSubmit","onReset","baseId","errorId","helpId","labelMode","controlId","registerLabelTarget","messages","hasError","labelWidth","isInline","sizeForLevel","isAttached","markClasses","markStyle","x","y","focused","currentValue","counter","onFocus","precision","decimals","round","factor","canDecrease","canIncrease","stepBy","direction","base","onWheel","onKeydown","an","Pe","yt","wt","bt","t","e","n","fe","$e","o","Ht","mn","vn","St","bn","yn","Dt","_t","wn","En","Tt","Ke","Sn","Dn","_n","Tn","Ct","Cn","On","Ot","r","ne","In","Ye","ie","An","i","xn","Nn","re","ae","xe","It","Te","Lt","Wt","Gt","S","E","We","Pn","Q","At","V","h","ye","jt","te","P","a","l","s","u","d","f","m","b","w","xt","ce","we","p","ht","J","Nt","Mn","Fn","Je","Ce","zt","Rn","Ut","Vt","$t","q","Xn","Bn","Yn","ge","Ze","Ne","kn","L","G","R","j","Hn","z","c","O","g","T","pe","Be","C","ue","Se","Y","be","Oe","$","se","Zt","Qt","W","Me","ve","Ge","je","de","Z","Qe","et","Pt","Mt","me","Ie","Ae","Fe","ke","H","tt","lt","ze","Ve","Re","Ft","Ln","qt","Kt","Wn","Gn","Jt","he","jn","Zn","nt","He","ee","Ee","vt","rn","Xe","B","$n","Vn","X","K","oe","le","k","v","A","qn","I","M","F","Un","st","zn","Jn","Kn","N","De","ut","ct","ot","rt","Ue","_e","Qn","Rt","Le","it","D","en","pt","gt","eo","to","dt","sn","no","un","kt","tn","nn","Xt","oo","Yt","on","U","qe","mt","ln","ft","ro","lo","cn","Et","fn","dn","hn","pn","useTemplateRef","ownId","cardGroup","boardStyle","isFull","isCollapsed","isLocked","columnById","cardTitle","card","named","nameOf","groupFor","fromIndex","toIndex","via","onCardDrop","fromId","toId","columnOrder","moveColumn","onColumnDrop","grabbed","grabbedColumn","announcement","isGrabbed","isColumnGrabbed","positionOf","refocus","attribute","wanted","elements","onCardKeydown","held","state","origin","at","run","stepCard","shiftCard","columnIndex","onColumnKeydown","VueDraggable","WxBadge","WxEntityCard","_hoisted_10","_hoisted_11","WxButton","_hoisted_12","_hoisted_13","_hoisted_14","rel","href","useElementWidth","observed","el","measured","entries","entry","filtersOpen","toPx","filtersInline","detailInline","openFilters","closeFilters","back","inline","WxDrawer","maxWidth","menuKey","submenuKey","useMenu","useSubmenu","menu","panelId","ancestors","isTrail","asFlyout","flyoutOpen","isOpen","flyoutSide","chevron","triggerClasses","setOpen","onTriggerClick","_hoisted_9","flattenEntries","nodes","node","Fragment","Comment","Text","WxMenuNodes","defineComponent","OVERFLOW","active","openKeys","list","listWidth","splits","fits","measuring","overflowing","inBar","inBranch","lengthOf","gap","room","branch","widths","child","total","budget","used","count","positions","reactive","seen","trail","here","known","closeSignal","autoExpand","missing","WxSubmenu","submenu","isActive","previous","page","perPage","currentPerPage","lastPage","currentPage","asked","last","numbers","distance","go","setPerPage","panelStyle","PopoverClose","PopoverArrow","fallbackName","WxRadio","hovered","interactive","shown","stars","position","fill","valueAt","set","onHover","step","star","richTextIcons","$emit","DEFAULT_TOOLS","DEFAULT_ACCEPT","TOOL_META","TABLE_TOOLS","uploading","fileInput","prompt","editable","readHtml","instance","editor","useEditor","StarterKit","TableKit","Image","Youtube","FileHandler","_editor","files","pos","uploadFiles","html","isEmpty","inTable","insertImage","url","alt","file","error","onImageButton","onFilePicked","input","openPrompt","applyPrompt","toolVisible","tool","visibleTools","chain","runTableCommand","WxRichTextToolbarButton","_vModelText","EditorContent","viewport","maxHeight","behavior","searchText","selection","labelOf","selectedOptions","singleLabel","hasSelection","openList","displayValue","onSearch","removeTag","ComboboxAnchor","_withModifiers","ComboboxTrigger","ComboboxPortal","ComboboxContent","ComboboxViewport","ComboboxEmpty","ComboboxItem","ComboboxItemIndicator","pair","marks","label","SliderTrack","SliderRange","SliderThumb","mark","sizes","TabsContent","UTILITY_WIDTH","STORAGE_PREFIX","selected","expanded","sort","search","rows","paginator","showPagination","visibleColumns","utilityCount","columnCount","moreLeft","moreRight","scrollStyle","length","widthOf","colStyle","scroller","headRow","laidOut","measureColumns","cells","cell","readScroll","remeasure","laidOutWidth","offsets","map","utilities","lefts","order","rights","right","hasLeftFixed","hasFixed","fixedStyle","pin","fixedClass","utilityStyle","slot","utilityClass","read","part","cellText","canSelect","canExpand","selectableRows","selectableKeys","selectedCount","allSelected","someSelected","rowsFor","keys","announce","toggleAll","toggleRow","isSelected","isExpanded","toggleExpand","onSort","ariaSort","sortState","alignClass","settledSearch","onSearchChanged","term","settle","save","summaryStart","summarySpan","summaryColumns","summaryValue","summaryText","WxInput","_hoisted_16","line","lineIndex","_hoisted_17","_hoisted_18","WxPagination","_hoisted_20","rendered","readTabs","collect","scheduleSelect","WxTab","tabProps","tabSlots","selectFirst","tab","selectQueued","overflowStart","overflowEnd","scrollable","revealActive","instant","centred","TabsRoot","TabsList","TabsTrigger","highlighted","armed","tags","suggestions","suggestion","showList","full","add","remove","clampLines","textareaRef","autosizeOptions","syncHeight","styles","lineHeight","vertical","timelineKey","useTimeline","timeline","hasMark","dotClasses","WebxUI","app","exported","components","registeredName","PHONE","TABLET","shellLayoutFor","phone","tablet","useResponsiveShell","drawerOpen","preference","showAside","sizeClass","closing"],"mappings":"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","x_google_ignoreList":[49]}
|