@k2b/ui 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/browser/actions/Dropdown.js +8 -1
  2. package/dist/browser/actions/Dropdown.js.map +1 -1
  3. package/dist/browser/actions/FilterChip.js +11 -5
  4. package/dist/browser/actions/FilterChip.js.map +1 -1
  5. package/dist/browser/actions/Tabs.js +3 -4
  6. package/dist/browser/actions/Tabs.js.map +1 -1
  7. package/dist/browser/actions/ViewTabs.js +225 -93
  8. package/dist/browser/actions/ViewTabs.js.map +1 -1
  9. package/dist/browser/actions/menu-sheet.js +2 -3
  10. package/dist/browser/actions/menu-sheet.js.map +1 -1
  11. package/dist/browser/actions/phone-sheet.js +4 -0
  12. package/dist/browser/actions/phone-sheet.js.map +1 -0
  13. package/dist/browser/content/DataTable.js +47 -51
  14. package/dist/browser/content/DataTable.js.map +1 -1
  15. package/dist/browser/content/FileGrid.js +125 -99
  16. package/dist/browser/content/FileGrid.js.map +1 -1
  17. package/dist/browser/feedback/dialog-core.js +5 -1
  18. package/dist/browser/feedback/dialog-core.js.map +1 -1
  19. package/dist/browser/feedback/dialog-tone.js +26 -0
  20. package/dist/browser/feedback/dialog-tone.js.map +1 -0
  21. package/dist/browser/feedback/index.js.map +1 -1
  22. package/dist/browser/feedback/prompt-confirm.js +223 -0
  23. package/dist/browser/feedback/prompt-confirm.js.map +1 -0
  24. package/dist/browser/feedback/prompts.js +195 -343
  25. package/dist/browser/feedback/prompts.js.map +1 -1
  26. package/dist/browser/inputs/ChoiceList.js +45 -17
  27. package/dist/browser/inputs/ChoiceList.js.map +1 -1
  28. package/dist/browser/inputs/DatePicker.js +1647 -334
  29. package/dist/browser/inputs/DatePicker.js.map +1 -1
  30. package/dist/browser/inputs/TextInput.js +5 -4
  31. package/dist/browser/inputs/TextInput.js.map +1 -1
  32. package/dist/browser/inputs/choice.js +36 -9
  33. package/dist/browser/inputs/choice.js.map +1 -1
  34. package/dist/browser/inputs/date-input-messages.js +128 -0
  35. package/dist/browser/inputs/date-input-messages.js.map +1 -0
  36. package/dist/browser/inputs/date-input-status.js +132 -0
  37. package/dist/browser/inputs/date-input-status.js.map +1 -0
  38. package/dist/browser/inputs/date-input.js +334 -0
  39. package/dist/browser/inputs/date-input.js.map +1 -0
  40. package/dist/browser/inputs/date-sheet.js +49 -0
  41. package/dist/browser/inputs/date-sheet.js.map +1 -0
  42. package/dist/browser/internal/reveal-in-scroller.js +28 -0
  43. package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
  44. package/dist/browser/intl/messages.js +6 -0
  45. package/dist/browser/intl/messages.js.map +1 -1
  46. package/dist/browser/layout/AppWorkspace.js +556 -528
  47. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  48. package/dist/browser/layout/BottomSheet.js +3 -0
  49. package/dist/browser/layout/BottomSheet.js.map +1 -1
  50. package/dist/browser/layout/DetailPanel.js +130 -108
  51. package/dist/browser/layout/DetailPanel.js.map +1 -1
  52. package/dist/browser/layout/DetailSections.js +1019 -0
  53. package/dist/browser/layout/DetailSections.js.map +1 -0
  54. package/dist/browser/layout/DetailsToggle.js +32 -0
  55. package/dist/browser/layout/DetailsToggle.js.map +1 -0
  56. package/dist/browser/layout/Discussion.js +3 -0
  57. package/dist/browser/layout/Discussion.js.map +1 -1
  58. package/dist/browser/layout/MobileShell.js +116 -94
  59. package/dist/browser/layout/MobileShell.js.map +1 -1
  60. package/dist/browser/layout/PageTitle.js +33 -10
  61. package/dist/browser/layout/PageTitle.js.map +1 -1
  62. package/dist/browser/layout/PanelDialog.js +167 -132
  63. package/dist/browser/layout/PanelDialog.js.map +1 -1
  64. package/dist/browser/layout/Settings.js +175 -139
  65. package/dist/browser/layout/Settings.js.map +1 -1
  66. package/dist/browser/layout/SettingsModal.js +2 -4
  67. package/dist/browser/layout/SettingsModal.js.map +1 -1
  68. package/dist/browser/layout/app-workspace-controller.js +12 -0
  69. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  70. package/dist/browser/layout/detail-sections-messages.js +123 -0
  71. package/dist/browser/layout/detail-sections-messages.js.map +1 -0
  72. package/dist/browser/layout/index.js +2 -0
  73. package/dist/browser/layout/index.js.map +1 -1
  74. package/dist/browser/surfaces/Avatar.js +3 -1
  75. package/dist/browser/surfaces/Avatar.js.map +1 -1
  76. package/dist/browser/surfaces/AvatarStack.js +95 -61
  77. package/dist/browser/surfaces/AvatarStack.js.map +1 -1
  78. package/dist/browser/surfaces/ChangeList.js +77 -0
  79. package/dist/browser/surfaces/ChangeList.js.map +1 -0
  80. package/dist/browser/surfaces/StatusBadge.js +47 -14
  81. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  82. package/dist/browser/surfaces/index.js +2 -1
  83. package/dist/browser/surfaces/index.js.map +1 -1
  84. package/dist/browser/text-editor/TextEditor.js +26 -8
  85. package/dist/browser/text-editor/TextEditor.js.map +1 -1
  86. package/dist/ssr/actions/Dropdown.js +6 -0
  87. package/dist/ssr/actions/Dropdown.js.map +1 -1
  88. package/dist/ssr/actions/FilterChip.js +1 -1
  89. package/dist/ssr/actions/FilterChip.js.map +1 -1
  90. package/dist/ssr/actions/Tabs.js +3 -4
  91. package/dist/ssr/actions/Tabs.js.map +1 -1
  92. package/dist/ssr/actions/ViewTabs.js +144 -37
  93. package/dist/ssr/actions/ViewTabs.js.map +1 -1
  94. package/dist/ssr/actions/menu-sheet.js +2 -3
  95. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  96. package/dist/ssr/actions/phone-sheet.js +4 -0
  97. package/dist/ssr/actions/phone-sheet.js.map +1 -0
  98. package/dist/ssr/content/DataTable.js +1 -2
  99. package/dist/ssr/content/DataTable.js.map +1 -1
  100. package/dist/ssr/content/FileGrid.js +36 -22
  101. package/dist/ssr/content/FileGrid.js.map +1 -1
  102. package/dist/ssr/feedback/dialog-core.js +5 -1
  103. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  104. package/dist/ssr/feedback/dialog-tone.js +26 -0
  105. package/dist/ssr/feedback/dialog-tone.js.map +1 -0
  106. package/dist/ssr/feedback/index.js.map +1 -1
  107. package/dist/ssr/feedback/prompt-confirm.js +123 -0
  108. package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
  109. package/dist/ssr/feedback/prompts.js +60 -132
  110. package/dist/ssr/feedback/prompts.js.map +1 -1
  111. package/dist/ssr/inputs/ChoiceList.js +29 -9
  112. package/dist/ssr/inputs/ChoiceList.js.map +1 -1
  113. package/dist/ssr/inputs/DatePicker.js +1183 -166
  114. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  115. package/dist/ssr/inputs/TextInput.js +5 -4
  116. package/dist/ssr/inputs/TextInput.js.map +1 -1
  117. package/dist/ssr/inputs/choice.js +36 -9
  118. package/dist/ssr/inputs/choice.js.map +1 -1
  119. package/dist/ssr/inputs/date-input-messages.js +128 -0
  120. package/dist/ssr/inputs/date-input-messages.js.map +1 -0
  121. package/dist/ssr/inputs/date-input-status.js +132 -0
  122. package/dist/ssr/inputs/date-input-status.js.map +1 -0
  123. package/dist/ssr/inputs/date-input.js +334 -0
  124. package/dist/ssr/inputs/date-input.js.map +1 -0
  125. package/dist/ssr/inputs/date-sheet.js +44 -0
  126. package/dist/ssr/inputs/date-sheet.js.map +1 -0
  127. package/dist/ssr/internal/reveal-in-scroller.js +28 -0
  128. package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
  129. package/dist/ssr/intl/messages.js +6 -0
  130. package/dist/ssr/intl/messages.js.map +1 -1
  131. package/dist/ssr/layout/AppWorkspace.js +71 -50
  132. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  133. package/dist/ssr/layout/BottomSheet.js +3 -0
  134. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  135. package/dist/ssr/layout/DetailPanel.js +17 -0
  136. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  137. package/dist/ssr/layout/DetailSections.js +762 -0
  138. package/dist/ssr/layout/DetailSections.js.map +1 -0
  139. package/dist/ssr/layout/DetailsToggle.js +29 -0
  140. package/dist/ssr/layout/DetailsToggle.js.map +1 -0
  141. package/dist/ssr/layout/Discussion.js +3 -0
  142. package/dist/ssr/layout/Discussion.js.map +1 -1
  143. package/dist/ssr/layout/MobileShell.js +45 -28
  144. package/dist/ssr/layout/MobileShell.js.map +1 -1
  145. package/dist/ssr/layout/PageTitle.js +29 -6
  146. package/dist/ssr/layout/PageTitle.js.map +1 -1
  147. package/dist/ssr/layout/PanelDialog.js +48 -30
  148. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  149. package/dist/ssr/layout/Settings.js +34 -18
  150. package/dist/ssr/layout/Settings.js.map +1 -1
  151. package/dist/ssr/layout/SettingsModal.js +2 -4
  152. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  153. package/dist/ssr/layout/app-workspace-controller.js +12 -0
  154. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  155. package/dist/ssr/layout/detail-sections-messages.js +123 -0
  156. package/dist/ssr/layout/detail-sections-messages.js.map +1 -0
  157. package/dist/ssr/layout/index.js +2 -0
  158. package/dist/ssr/layout/index.js.map +1 -1
  159. package/dist/ssr/surfaces/Avatar.js +3 -1
  160. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  161. package/dist/ssr/surfaces/AvatarStack.js +61 -32
  162. package/dist/ssr/surfaces/AvatarStack.js.map +1 -1
  163. package/dist/ssr/surfaces/ChangeList.js +37 -0
  164. package/dist/ssr/surfaces/ChangeList.js.map +1 -0
  165. package/dist/ssr/surfaces/StatusBadge.js +26 -8
  166. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  167. package/dist/ssr/surfaces/index.js +2 -1
  168. package/dist/ssr/surfaces/index.js.map +1 -1
  169. package/dist/ssr/text-editor/TextEditor.js +26 -8
  170. package/dist/ssr/text-editor/TextEditor.js.map +1 -1
  171. package/dist/styles.css +1 -1
  172. package/dist/types/actions/FilterChip.d.ts +4 -0
  173. package/dist/types/actions/ViewTabs.d.ts +11 -1
  174. package/dist/types/actions/menu-sheet.d.ts +1 -3
  175. package/dist/types/actions/phone-sheet.d.ts +3 -0
  176. package/dist/types/content/FileGrid.d.ts +6 -0
  177. package/dist/types/feedback/dialog-tone.d.ts +10 -0
  178. package/dist/types/feedback/index.d.ts +1 -0
  179. package/dist/types/feedback/prompt-confirm.d.ts +19 -0
  180. package/dist/types/feedback/prompts.d.ts +4 -8
  181. package/dist/types/inputs/ChoiceList.d.ts +7 -3
  182. package/dist/types/inputs/DatePicker.d.ts +13 -3
  183. package/dist/types/inputs/TextInput.d.ts +1 -1
  184. package/dist/types/inputs/choice.d.ts +9 -3
  185. package/dist/types/inputs/date-input-messages.d.ts +64 -0
  186. package/dist/types/inputs/date-input-status.d.ts +35 -0
  187. package/dist/types/inputs/date-input.d.ts +90 -0
  188. package/dist/types/inputs/date-sheet.d.ts +14 -0
  189. package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
  190. package/dist/types/intl/messages.d.ts +3 -0
  191. package/dist/types/layout/AppWorkspace.d.ts +14 -0
  192. package/dist/types/layout/BottomSheet.d.ts +3 -0
  193. package/dist/types/layout/DetailPanel.d.ts +9 -0
  194. package/dist/types/layout/DetailSections.d.ts +156 -0
  195. package/dist/types/layout/DetailsToggle.d.ts +13 -0
  196. package/dist/types/layout/PageTitle.d.ts +7 -0
  197. package/dist/types/layout/PanelDialog.d.ts +3 -0
  198. package/dist/types/layout/Settings.d.ts +17 -1
  199. package/dist/types/layout/detail-sections-messages.d.ts +59 -0
  200. package/dist/types/layout/index.d.ts +5 -2
  201. package/dist/types/surfaces/Avatar.d.ts +3 -0
  202. package/dist/types/surfaces/AvatarStack.d.ts +20 -1
  203. package/dist/types/surfaces/ChangeList.d.ts +20 -0
  204. package/dist/types/surfaces/StatusBadge.d.ts +5 -0
  205. package/dist/types/surfaces/index.d.ts +5 -3
  206. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n splitProps,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Tooltip, type TooltipPlacement, useLabelTooltip } from \"../feedback/Tooltip\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { KeyedFor } from \"../internal/keyed-for\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant, iconTitle } from \"./Button\";\nimport { focusMenuRow, focusRowSegment } from \"./menu-rows\";\nimport { MenuSearch, type MenuSearchApi } from \"./menu-search\";\nimport { openMenuSheet, prefersMenuSheet } from \"./menu-sheet\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\nconst closeOnSelectOf = (item: DropdownAction) => (\"closeOnSelect\" in item ? item.closeOnSelect : undefined);\nconst hrefOf = (item: DropdownAction) => (\"href\" in item ? item.href : undefined);\nconst externalOf = (item: DropdownAction) => (\"external\" in item ? item.external : undefined);\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n/** Where a menu opened without its trigger appears: an element, or any box such as a point inside one. */\nexport type DropdownAnchor = { getBoundingClientRect(): Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\"> };\n/** Where focus returns as a menu opened by `openAt` closes, read at that moment when it is a function. */\nexport type DropdownReturnFocus = HTMLElement | (() => HTMLElement | undefined);\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n /**\n * Accessible name when it must say more than the visible label, such as the current value and what the next\n * activation does. It must contain the visible label.\n */\n ariaLabel?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n /** `danger` for destructive entries; `accent` for the entry most people want, such as creating a blank item. */\n variant?: \"danger\" | \"accent\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n /**\n * Set `false` for an action that changes a value in place, such as cycling a setting: the menu stays open and\n * the focus stays on the row. Defaults to `true`.\n */\n closeOnSelect?: boolean;\n /**\n * In a phone sheet, run while the tap still counts as the person's gesture, before the sheet closes, as browsers\n * require for clipboard writes. Other actions run after the sheet has left the history. Such an action must\n * not navigate or open a dialog.\n */\n immediate?: boolean;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n /** Runs on a plain click instead of following the link; modified clicks, middle-click, and the link's menu keep it. */\n action?: () => void;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** A second, smaller action at the end of a row, such as \"Only\" beside a checkbox; it keeps the menu open. */\nexport type DropdownSecondaryAction = {\n label: string;\n /** Accessible name when the visible label alone does not say what it acts on, such as \"Only Team Logistik\". */\n ariaLabel?: string;\n action: () => void;\n};\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n href?: string;\n closeOnSelect?: boolean;\n color?: string;\n /**\n * A second action at the end of the row. It shows while the row is hovered or focused, always on a touch screen,\n * and keeps its place when hidden, so the row never changes width. Right and Left move between the two.\n */\n secondary?: DropdownSecondaryAction;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n /**\n * `row` sets a few short radio choices, such as a sort direction, side by side as one segmented row. Give it a\n * `sectionLabel`: the label names the choice above the row and for screen readers.\n */\n layout?: \"row\";\n /** A quiet action at the end of the section label, such as \"All\"; it needs a `sectionLabel` and keeps the menu open. */\n labelAction?: DropdownSecondaryAction;\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\n/** A search field above the entries, for a menu long enough that finding an entry takes reading. */\nexport type DropdownSearch = {\n /** Names the field and is its placeholder unless `placeholder` is set, such as \"Find template\". */\n label: string;\n placeholder?: string;\n /**\n * The entries for a query that is not blank. Defaults to the actions and choices whose label or description contains\n * the query, kept in their sections.\n */\n filter?: (query: string) => readonly DropdownItem[];\n /** What a screen reader hears after the query changes; defaults to the number of matching entries. */\n status?: (query: string, matches: number) => string;\n};\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n /** The `Dropdown.Trigger`; leave it out for a menu opened through `attach` or `openAt`. */\n children?: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /**\n * Exact menu width as a CSS length. Without it the menu sizes to its longest\n * entry: at least `12rem` (`18rem` for touch), at most the viewport width\n * less `1rem` per side, where longer entries wrap.\n */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n /**\n * `sheet` opens the same items as a bottom sheet on phones (below 48rem) instead of a menu beside the trigger.\n * Defaults to `menu`. A controlled menu (`open`) always stays a menu.\n */\n phone?: \"menu\" | \"sheet\";\n /** Content above the phone sheet's menu. `close` dismisses it with normal history and focus restoration. */\n sheetTop?: (close: () => void) => JSX.Element;\n /**\n * Renders the entries only once the menu first opens, for a menu repeated on every row of a long list: the page\n * then carries each row's trigger, not each row's entries. Fixed for the menu's lifetime.\n */\n lazy?: boolean;\n /**\n * Receives `open`, which shows the menu without its trigger beside `anchor`, as for a context menu, a key or a\n * grip. Focus returns to `returnFocus` when the menu or sheet closes; pass a function when an entry can move the\n * place focus belongs to. Phones get the sheet as from the trigger.\n */\n openAt?: (open: (anchor: DropdownAnchor, returnFocus?: DropdownReturnFocus) => void) => void;\n /** Receives `close`, which closes the menu or sheet and returns focus. */\n closeWith?: (close: () => void) => void;\n /**\n * Puts a search field above the entries. Focus starts in the field; Up and Down move through the matching entries,\n * Enter chooses one, and the first stays marked while the query changes.\n */\n search?: DropdownSearch;\n /**\n * Adopts an element rendered elsewhere as the trigger, such as a server-rendered link: a plain click, Enter, Space,\n * Up, or Down opens the menu, while a modified or middle click keeps the link. The element gets `aria-expanded` and\n * `aria-controls`; render `aria-haspopup` with it, so the server HTML already says it opens a menu. Read once on mount.\n */\n attach?: () => HTMLElement | null | undefined;\n /** `tile` sets every entry's icon on a quiet square, for menus whose icons tell entries apart, such as templates. */\n icons?: \"plain\" | \"tile\";\n /** One quiet sentence below the entries that explains them all, such as what choosing one keeps; it describes the menu. */\n note?: string;\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n closeOnSelect?: boolean;\n ariaLabel?: string;\n icon?: string;\n image?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\" | \"accent\";\n href?: string;\n external?: boolean;\n /** Runs when the item is chosen. With `href`, a plain click runs it instead of following the link. */\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n /** `option` inside a searchable menu's list box, whose field keeps the focus. */\n role: \"menuitem\" | \"option\";\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n popup: () => \"dialog\" | \"menu\";\n registerTrigger: (element: HTMLElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n \"[role='option']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu).filter((item) => !item.classList.contains(\"k2b-dropdown__secondary\"));\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\">,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: {\n description?: string;\n icon?: string;\n image?: string;\n trailing?: JSX.Element;\n children: JSX.Element;\n}): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const role = () => menu?.role ?? \"menuitem\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role={role()}\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n data-accent={props.variant === \"accent\" ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n // Read before closing: a searchable menu clears its query as it closes, and the row then shows another entry.\n const select = props.onSelect;\n if (props.closeOnSelect !== false) menu?.close();\n select?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role={role()}\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n data-accent={props.variant === \"accent\" ? \"true\" : undefined}\n onClick={(event) => {\n // With `onSelect`, a plain click runs it in place of the link; a modified click keeps its browser meaning.\n const select = props.onSelect;\n if (select && !(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n event.preventDefault();\n menu?.close();\n select();\n return;\n }\n menu?.close(false);\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n // A searchable menu's field keeps the focus, so a second button in a row could not be reached; it is left out.\n return (\n <Show when={menu?.role !== \"option\" && props.secondary} fallback={<DropdownChoiceRow {...props} />}>\n {(secondary) => (\n <div class=\"k2b-dropdown__pair\">\n <DropdownChoiceRow {...props} />\n <DropdownSecondaryButton {...secondary()} class=\"k2b-dropdown__secondary\" />\n </div>\n )}\n </Show>\n );\n}\n\nfunction DropdownSecondaryButton(props: DropdownSecondaryAction & { class: string }): JSX.Element {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n class={props.class}\n aria-label={props.ariaLabel}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.action();\n }}\n >\n {props.label}\n </button>\n );\n}\n\nfunction DropdownChoiceRow(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n let element: HTMLElement | undefined;\n return (\n <Dynamic\n ref={(node: HTMLAnchorElement | HTMLButtonElement) => {\n element = node;\n }}\n component={!props.disabled && props.href ? \"a\" : \"button\"}\n href={!props.disabled ? props.href : undefined}\n type={!props.disabled && props.href ? undefined : \"button\"}\n role={menu?.role === \"option\" ? \"option\" : props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-label={props.ariaLabel}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event: MouseEvent) => {\n if (props.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n menu?.close(false);\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const action = props.action;\n if (props.closeOnSelect !== false) menu?.close();\n action();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n // A link answers only Enter; as a menu choice it also answers Space, like the button form.\n if (event.key !== \" \" || props.disabled || !props.href) return;\n event.preventDefault();\n element?.click();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n {/* Always present for radios, so selecting the widest entry cannot widen a content-sized menu. */}\n <Show when={props.choice === \"radio\"}>\n <i class=\"ti ti-check k2b-dropdown__check\" data-hidden={checked() ? undefined : \"true\"} aria-hidden=\"true\" />\n </Show>\n </Dynamic>\n );\n}\n\nexport function DropdownItems(props: {\n items: readonly DropdownItem[];\n close: (restoreFocus?: boolean) => void;\n role?: \"menuitem\" | \"option\";\n}): JSX.Element {\n const messages = useUiMessages();\n // Rows read their current item: a host that rebuilds equal items while the menu is open keeps each row element (#2140).\n const renderItem = (item: () => DropdownAction | DropdownChoice): JSX.Element => {\n const initial = untrack(item);\n if (\"choice\" in initial) return <DropdownChoiceItem {...mergeProps(() => item() as DropdownChoice)} />;\n const action = () => item() as DropdownAction;\n return (\n <DropdownItem\n ariaLabel={action().ariaLabel}\n closeOnSelect={closeOnSelectOf(action())}\n icon={action().icon}\n image={action().image}\n description={action().description}\n trailing={action().trailing}\n variant={action().variant}\n disabled={action().disabled}\n class={action().class}\n href={hrefOf(action())}\n external={externalOf(action())}\n onSelect={selectAction(action())}\n >\n {action().label}\n </DropdownItem>\n );\n };\n\n return (\n <MenuContext.Provider value={{ close: props.close, role: props.role ?? \"menuitem\" }}>\n <KeyedFor each={props.items} by={(item) => (\"items\" in item ? `section:${item.sectionLabel ?? \"\"}` : `item:${item.label}`)}>\n {(current, index) => {\n const item = current();\n return (\n <Show when={\"items\" in item} fallback={renderItem(current as () => DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n // A row of choices is no set of actions: without a label it stays unnamed rather than misnamed.\n aria-label={\n (current() as DropdownSection).sectionLabel ??\n ((current() as DropdownSection).layout === \"row\" ? undefined : messages().actions)\n }\n >\n <Show when={(current() as DropdownSection).sectionLabel}>\n {(label) => (\n <Show\n when={props.role !== \"option\" && (current() as DropdownSection).labelAction}\n fallback={<div class=\"k2b-dropdown__label\">{label()}</div>}\n >\n {(action) => (\n <div class=\"k2b-dropdown__label k2b-dropdown__label--action\">\n <span>{label()}</span>\n <DropdownSecondaryButton {...action()} class=\"k2b-dropdown__label-action\" />\n </div>\n )}\n </Show>\n )}\n </Show>\n <Show\n when={(current() as DropdownSection).layout === \"row\"}\n fallback={\n <KeyedFor each={(current() as DropdownSection).items} by={(row) => row.label}>\n {renderItem}\n </KeyedFor>\n }\n >\n <div class=\"k2b-dropdown__row\">\n <KeyedFor each={(current() as DropdownSection).items} by={(row) => row.label}>\n {renderItem}\n </KeyedFor>\n </div>\n </Show>\n </div>\n </Show>\n );\n }}\n </KeyedFor>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"title\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n // An icon-only trigger shows its label as a hint, like IconButton.\n const tooltip = useLabelTooltip(\n () => local.tooltip,\n () => (local.iconOnly ? (local.title ?? local.label) : undefined),\n );\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup={context.popup()}\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n title={iconTitle(local.title, tooltip())}\n tooltip={tooltip()}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup={context.popup()}\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n title={iconTitle(local.title, tooltip())}\n >\n {local.children}\n </button>\n <Show when={tooltip() !== false && tooltip() !== undefined}>\n <Tooltip\n content={tooltip() as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n /** The open phone sheet's cancel switch: it closes when the menu goes or is disabled, as the popover does. */\n let sheet: AbortController | undefined;\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n const [entriesShown, setEntriesShown] = createSignal(!props.lazy);\n let triggerRef: HTMLElement | undefined;\n const [query, setQuery] = createSignal(\"\");\n let searchApi: MenuSearchApi | undefined;\n /** Set while the menu is open from `openAt`: it appears beside `anchor`, and focus returns to `origin`. */\n let anchor: DropdownAnchor | undefined;\n let origin: DropdownReturnFocus | undefined;\n const originElement = () => (typeof origin === \"function\" ? origin() : origin);\n let menuRef: HTMLDivElement | undefined;\n let triggerRing = true;\n let mounted = false;\n /** Where a key on the trigger asked the focus to go; a controlled menu opens later, in its owner's update. */\n let keyFocus: \"first\" | \"last\" | false = false;\n let viewportListenersAttached = false;\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n const at = anchor ?? triggerRef;\n if (!at || !menuRef) return;\n const rect = dropdownPosition(at.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n // A content-sized menu changes size when its items change while it is open.\n if (menuRef && typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(reposition);\n resizeObserver.observe(menuRef);\n }\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n resizeObserver?.disconnect();\n };\n const close = (restoreFocus = true) => {\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(originElement() ?? triggerRef, triggerRing);\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n setQuery(\"\");\n // Like `open`, expose the closed state now: the toggle event can arrive after the next key press, and a trigger\n // that still reads as open would ignore Enter (Escape, then Enter at once, must reopen).\n setInternalOpen(false);\n detachViewportListeners();\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n triggerRing = ringOnReturn(originElement() ?? triggerRef);\n // A lazy menu's entries exist before it shows, so it places and focuses them as any other.\n setEntriesShown(true);\n menuRef.showPopover();\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (!focus) return;\n if (searchApi) searchApi.focus(focus);\n else focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next && props.phone === \"sheet\" && prefersMenuSheet()) {\n if (sheet) return;\n const current = new AbortController();\n sheet = current;\n // A sheet opened without its trigger returns focus to its own target, which an entry may have moved,\n // rather than to whatever had focus as it opened.\n const anchored = origin !== undefined;\n const ring = anchored && ringOnReturn(originElement());\n if (anchored && document.activeElement instanceof HTMLElement) document.activeElement.blur();\n // The sheet is this menu's open state: the trigger reports it and the owner hears both ends.\n setInternalOpen(true);\n props.onOpenChange?.(true);\n void openMenuSheet({\n Items: DropdownItems,\n items: props.items,\n label: props.label ?? messages().dropdownMenu,\n locale: locale(),\n top: props.sheetTop,\n search: props.search,\n icons: props.icons,\n note: props.note,\n signal: current.signal,\n }).finally(() => {\n sheet = undefined;\n // An entry that moved focus elsewhere, such as into a field, keeps it.\n const target = anchored ? originElement() : undefined;\n const focused = document.activeElement;\n if (target?.isConnected && (!focused || focused === document.body)) returnFocus(target, ring);\n setInternalOpen(false);\n props.onOpenChange?.(false);\n props.onClose?.();\n });\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n // A searchable menu's field keeps the focus and moves the marked entry itself.\n if (!props.search && (focusMenuRow(items, event.key) || focusRowSegment(items, event.key))) {\n event.preventDefault();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n returnFocus(originElement() ?? triggerRef, triggerRing);\n requestOpen(false);\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const triggerKey = (event: KeyboardEvent) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n // Ctrl+Enter and the like keep their browser meaning on an adopted link, such as opening it in a new tab.\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n if (searchApi) searchApi.focus(event.key === \"ArrowUp\" ? \"last\" : \"first\");\n else focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n anchor = origin = undefined;\n keyFocus = event.key === \"ArrowUp\" ? \"last\" : \"first\";\n requestOpen(true, keyFocus);\n keyFocus = false;\n };\n const toggle = () => {\n if (!isOpen()) anchor = origin = undefined;\n requestOpen(!isOpen());\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle,\n popup: () => (props.search ? \"dialog\" : \"menu\"),\n triggerKeyDown: (event) => triggerKey(event),\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(keyFocus);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (!props.disabled) return;\n sheet?.abort();\n if (mounted) close(false);\n });\n props.openAt?.((at, focus) => {\n if (isOpen()) return;\n anchor = at;\n origin = focus;\n requestOpen(true);\n });\n props.closeWith?.(() => {\n sheet?.abort();\n if (isOpen()) close();\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n const adopted = props.attach?.();\n if (!adopted) return;\n triggerRef = adopted;\n adopted.setAttribute(\"aria-controls\", menuId);\n const onClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n event.stopPropagation();\n toggle();\n };\n adopted.addEventListener(\"click\", onClick);\n adopted.addEventListener(\"keydown\", triggerKey);\n createEffect(() => adopted.setAttribute(\"aria-expanded\", String(isOpen())));\n onCleanup(() => {\n adopted.removeEventListener(\"click\", onClick);\n adopted.removeEventListener(\"keydown\", triggerKey);\n });\n });\n onCleanup(() => sheet?.abort());\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the role is menu, or dialog with search; both take a name. */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: a menu or dialog popup owns its keys. */}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role={props.search ? \"dialog\" : \"menu\"}\n aria-label={props.label ?? messages().dropdownMenu}\n aria-describedby={props.note ? `${menuId}-note` : undefined}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-width={props.width ? \"fixed\" : undefined}\n data-variant={props.variant ?? \"default\"}\n data-icons={props.icons === \"tile\" ? \"tile\" : undefined}\n data-search={props.search ? \"\" : undefined}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = (event as ToggleEvent).oldState === \"open\";\n setInternalOpen(nextOpen);\n if (nextOpen) setEntriesShown(true);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n // A light dismiss hides the menu with focus inside it; an opener without a trigger takes it back.\n const focused = document.activeElement;\n const target = wasOpen && !nextOpen ? originElement() : undefined;\n if (target?.isConnected && (!focused || focused === document.body || menuRef?.contains(focused)))\n returnFocus(target, triggerRing);\n if (wasOpen && !nextOpen) setQuery(\"\");\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <Show when={entriesShown()}>\n <Show when={props.search} fallback={<DropdownItems items={props.items} close={close} />}>\n {(search) => (\n <MenuSearch\n Items={DropdownItems}\n items={props.items}\n search={search()}\n label={props.label ?? messages().dropdownMenu}\n query={query}\n setQuery={setQuery}\n close={close}\n api={(api) => {\n searchApi = api;\n onCleanup(() => {\n if (searchApi === api) searchApi = undefined;\n });\n }}\n />\n )}\n </Show>\n {/* Hidden from the menu's children, which are entries only; the menu reads it as its description. */}\n <Show when={props.note}>\n <p id={`${menuId}-note`} class=\"k2b-dropdown__note\" aria-hidden=\"true\">\n {props.note}\n </p>\n </Show>\n </Show>\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SACE,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EAEd,UAAU,EACV,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,OAAO,EACP,UAAU,QACL,UAAU;AACjB,SAAS,OAAO,QAAQ,cAAc;AACtC,SAAS,OAAO,EAAyB,eAAe,QAAQ,qBAAqB;AACrF,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,QAAQ,QAAQ,uBAAuB;AAChD,SAAS,SAAS,QAAQ,gBAAgB;AAC1C,SAAS,aAAa,QAAQ,kBAAkB;AAChD,SAAS,MAAM,EAAyD,SAAS,QAAQ,UAAU;AACnG,SAAS,YAAY,EAAE,eAAe,QAAQ,aAAa;AAC3D,SAAS,UAAU,QAA4B,eAAe;AAC9D,SAAS,aAAa,EAAE,gBAAgB,QAAQ,cAAc;;AAE9D;AACA,MAAM,YAAY,GAAI,IAA6B,IAAK,IAAI,CAAC,MAAM;AACnE,MAAM,eAAe,GAAI,IAAoB,IAAM,eAAe,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,GAAG,SAAU;AAC5G,MAAM,MAAM,GAAI,IAAoB,IAAM,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,SAAU;AACjF,MAAM,UAAU,GAAI,IAAoB,IAAM,UAAU,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAU;;AAG7F;;AAEA;;AAmDA;;AAQA;;AA6BA;;AA4HA,MAAM,WAAW,GAAG,aAAa,CAAmB,CAAC;AACrD,MAAM,eAAe,GAAG,aAAa,CAAuB,CAAC;AAE7D,MAAM,eAAe,GAAI,IAA6B,IACpD,IAAI,GACA,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,gBAAgB,CACnB,CACE,+CAA+C,EAC/C,uDAAuD,EACvD,oDAAoD,EACpD,6CAA6C,CAC9C,CAAC,IAAI,CAAC,IAAI,CACb,CACF,CAAC,GACD,EAAE;AAER,MAAM,aAAa,GAAG,CAAC,IAA6B,EAAE,KAAa,KAAW;EAC5E,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;EACzG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;EACxB,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,MAAM,gBAAgB,GAAG,CAC9B,OAA2D,EAC3D,IAAuC,EACvC,QAA0B,EAC1B,QAA2C,EAC3C,GAAG,GAAG,CAAC,KAC2B;EAClC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI;EACvB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG;EAE9B,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;EAC5F,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG;EAC9F,IAAI,QAAQ,KAAK,aAAa,EAAE;IAC9B,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG;IAC1B,GAAG,GAAG,OAAO,CAAC,GAAG;EACnB;EAEA,OAAO;IACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAClE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;EACnE,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAI,KAMpB,uBAEI,IAAI;EAAA,IAAC,IAAI;IAAA,OAAE,KAAK,CAAC,KAAK;EAAA;EAAA,IAAE,QAAQ;IAAA,yBAAG,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,IAAI;MAAA;MAAA,UAAI,IAAI,oDAAe,IAAI,CAAC,CAAC;IAAuB;EAAA;EAAA,UACzG,KAAK,kDAA2C,KAAK,CAAC,CAAC;AAAW,2BAG7D,KAAK,CAAC,QAAQ,8BACpB,IAAI;EAAA,IAAC,IAAI;IAAA,OAAE,KAAK,CAAC,WAAW;EAAA;EAAA,UAAI,WAAW,4BAAa,WAAW,CAAC,CAAC;AAAS,MAEhF,KAAK,CAAC,QAAQ,CAElB;AAED,OAAO,SAAS,YAAY,CAAC,KAAwB,EAAe;EAClE,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;EACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;EAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,IAAI,IAAI,UAAU;EAC3C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC;EAElC,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,gBAAC,KAAK,CAAC,QAAQ,MAAG,KAAK,CAAC,IAAI,GAAG,SAAS;IAAA;IAAA,IAC9C,QAAQ;MAAA,sDAGE,IAAI,CAAC,CAAC,wDACA,KAAK,CAAC,SAAS,iBAEpB,+BAAsB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,gCACnC,MAAM,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,gDAC7B,KAAK,CAAC,OAAO,KAAK,QAAQ,GAAG,MAAM,YAAG,SAAS,4CAClD,KAAK,CAAC,QAAQ,0CACT,KAAK,CAAC,QAAQ,GAAG,MAAM,YAAG,SAAS,0BAUjD,OAAO;IAAA;IAAA,UAIV,IAAI,mDAEI,IAAI,CAAC,CAAC,2CACJ,KAAK,CAAC,QAAQ,GAAG,QAAQ,YAAG,SAAS,wCACxC,KAAK,CAAC,QAAQ,GAAG,qBAAqB,YAAG,SAAS,kDACjD,IAAI,CAAC,CAAC,wDACA,KAAK,CAAC,SAAS,iBAEpB,+BAAsB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,gCACnC,MAAM,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,gDAC7B,KAAK,CAAC,OAAO,KAAK,QAAQ,GAAG,MAAM,YAAG,SAAS,0BAa3D,OAAO;EAEX;AAGP;AAEA,SAAS,kBAAkB,CAAC,KAAqB,EAAe;EAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;EACpC;EACA,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,iBAAI,EAAE,IAAI,KAAK,QAAQ,OAAI,KAAK,CAAC,SAAS;IAAA;IAAA,IAAE,QAAQ;MAAA,yBAAG,iBAAiB,EAAK,KAAK;IAAA;IAAA,UAC1F,SAAS,8CAEN,iBAAiB,EAAK,KAAK,+BAC3B,uBAAuB,eAAK,SAAS;MAAA;IAAA;EAEzC;AAGP;AAEA,SAAS,uBAAuB,CAAC,KAAkD,EAAe;EAChG,uDAKW,KAAK,CAAC,KAAK,wDACN,KAAK,CAAC,SAAS,0BAO1B,KAAK,CAAC,KAAK;AAGlB;AAEA,SAAS,iBAAiB,CAAC,KAAqB,EAAe;EAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;EACpC,MAAM,OAAO,GAAG,MAAO,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAQ;EAC7F,IAAI,OAAgC;EACpC,yBACG,OAAO;IAAA,IAIN,SAAS;MAAA,OAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,QAAQ;IAAA;IAAA,IACzD,IAAI;MAAA,OAAE,gBAAC,KAAK,CAAC,QAAQ,MAAG,KAAK,CAAC,IAAI,GAAG,SAAS;IAAA;IAAA,IAC9C,IAAI;MAAA,OAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,SAAS,GAAG,QAAQ;IAAA;IAAA,IAC1D,IAAI;MAAA,OAAE,iBAAI,EAAE,IAAI,KAAK,QAAQ,MAAG,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,GAAG,kBAAkB,GAAG,eAAe;IAAA;IAAA;MAAA,OACjG,KAAK,CAAC,SAAS;IAAA;IAAA;MAAA,OACb,OAAO,CAAC,CAAC;IAAA;IAAA;MAAA,OACR,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS;IAAA;IAClD,QAAQ,EAAE,CAAC,CAAC;IAAA;MAAA,OACL,sBAAsB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA;MAAA,OACjC,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;IAAA;IAAA,IAC7C,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IACxB,OAAO,EAAG,KAAiB,IAAK;MAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;QACpF,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;QAClB;MACF;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,eAAe,CAAC,CAAC;MACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;MAChD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,SAAS,EAAG,KAAoB,IAAK;MACnC;MACA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;MACxD,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,OAAO,EAAE,KAAK,CAAC,CAAC;IAClB,CAAC;IAAA;MAAA,0BAEA,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,MAAM,KAAK,UAAU;QAAA;QAAA;UAAA,iDAElC,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,OAAO,CAAC,CAAC;YAAA;YAAA;cAAA;YAAA;UAAA;QAAA;MAAA,sBAKxB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,IAAE,QAAQ;UAAA,yBAAG,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,IAAI;YAAA;YAAA,UAAI,IAAI,oDAAe,IAAI,CAAC,CAAC;UAAuB;QAAA;QAAA,UACzG,KAAK,kDAA2C,KAAK,CAAC,CAAC;MAAW,sBAErE,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,UACnB,KAAK,yEAAwE,KAAK,CAAC,CAAC;MAAyB,2BAGxG,KAAK,CAAC,KAAK,8BACjB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,WAAW;QAAA;QAAA,UAAI,WAAW,4BAAa,WAAW,CAAC,CAAC;MAAS,MAEhF,KAAK,CAAC,QAAQ,oBAEd,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,MAAM,KAAK,OAAO;QAAA;QAAA;UAAA,oDACsB,OAAO,CAAC,CAAC,YAAG,SAAS,UAAG,MAAM;QAAA;MAAA;IAAA;EAAA;AAI9F;AAEA,OAAO,SAAS,aAAa,CAAC,KAI7B,EAAe;EACd,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC;EACA,MAAM,UAAU,GAAI,IAA2C,IAAkB;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7B,IAAI,QAAQ,IAAI,OAAO,EAAE,yBAAQ,kBAAkB,qBAAK,UAAU,CAAC,MAAM,IAAI,CAAC,CAAmB,CAAC;IAClG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAmB;IAC7C,yBACG,YAAY;MAAA,IACX,SAAS;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,SAAS;MAAA;MAAA,IAC7B,aAAa;QAAA,OAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;MAAA;MAAA,IACxC,IAAI;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,IAAI;MAAA;MAAA,IACnB,KAAK;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,KAAK;MAAA;MAAA,IACrB,WAAW;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,WAAW;MAAA;MAAA,IACjC,QAAQ;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA,IAC3B,OAAO;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,OAAO;MAAA;MAAA,IACzB,QAAQ;QAAA,OAAE,MAAM,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA;QAAA,OACpB,MAAM,CAAC,CAAC,CAAC,KAAK;MAAA;MAAA,IACrB,IAAI;QAAA,OAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;MAAA;MAAA,IACtB,QAAQ;QAAA,OAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;MAAA;MAAA,IAC9B,QAAQ;QAAA,OAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;MAAA;MAAA;QAAA,OAE/B,MAAM,CAAC,CAAC,CAAC,KAAK;MAAA;IAAA;EAGrB,CAAC;EAED,yBACG,WAAW,CAAC,QAAQ;IAAA,IAAC,KAAK;MAAA,OAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK;QAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI;MAAW,CAAC;IAAA;IAAA;MAAA,yBAChF,QAAQ;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAE,EAAE,EAAG,IAAI,IAAM,OAAO,IAAI,IAAI,GAAG,WAAW,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,QAAQ,IAAI,CAAC,KAAK,EAAG;QAAA,UACvH,CAAC,OAAO,EAAE,KAAK,KAAK;UACnB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC;UACtB,yBACG,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,OAAO,IAAI,IAAI;YAAA;YAAA,IAAE,QAAQ;cAAA,OAAE,UAAU,CAAC,OAAgD,CAAC;YAAA;YAAA;cAAA,sDAGjF,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,YAAG,SAAS,uDAI3C,OAAO,CAAC,CAAC,CAAqB,YAAY,KACzC,OAAO,CAAC,CAAC,CAAqB,MAAM,KAAK,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,4CAGnF,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAG,OAAO,CAAC,CAAC,CAAqB,YAAY;gBAAA;gBAAA,UACnD,KAAK,sBACJ,IAAI;kBAAA,IACH,IAAI;oBAAA,OAAE,kBAAK,CAAC,IAAI,KAAK,QAAQ,OAAK,OAAO,CAAC,CAAC,CAAqB,WAAW;kBAAA;kBAAA,IAC3E,QAAQ;oBAAA,gCAAoC,KAAK,CAAC,CAAC;kBAAA;kBAAA,UAEjD,MAAM,6BAEG,KAAK,CAAC,CAAC,8BACb,uBAAuB,eAAK,MAAM;oBAAA;kBAAA;gBAEtC;cAEJ,gCAEF,IAAI;gBAAA,IACH,IAAI;kBAAA,OAAG,OAAO,CAAC,CAAC,CAAqB,MAAM,KAAK,KAAK;gBAAA;gBAAA,IACrD,QAAQ;kBAAA,yBACL,QAAQ;oBAAA,IAAC,IAAI;sBAAA,OAAG,OAAO,CAAC,CAAC,CAAqB,KAAK;oBAAA;oBAAE,EAAE,EAAG,GAAG,IAAK,GAAG,CAAC,KAAK;oBAAA,UACzE;kBAAU;gBAAA;gBAAA;kBAAA,kDAKZ,QAAQ;oBAAA,IAAC,IAAI;sBAAA,OAAG,OAAO,CAAC,CAAC,CAAqB,KAAK;oBAAA;oBAAE,EAAE,EAAG,GAAG,IAAK,GAAG,CAAC,KAAK;oBAAA,UACzE;kBAAU;gBAAA;cAAA;YAAA;UAAA;QAOzB;MAAC;IAAA;EAAA;AAIT;AAEA,SAAS,eAAe,CAAC,KAA2B,EAAe;EACjE,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;EAC3C,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC;EACnF,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CACtC,YAAY,EACZ,UAAU,EACV,OAAO,EACP,UAAU,EACV,UAAU,EACV,OAAO,EACP,KAAK,EACL,MAAM,EACN,UAAU,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,MAAM,EACN,SAAS,CACV,CAAC;EACF,IAAI,MAAqC;EACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC;EACpE;EACA,MAAM,OAAO,GAAG,eAAe,CAC7B,MAAM,KAAK,CAAC,OAAO,EACnB,MAAO,KAAK,CAAC,QAAQ,GAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAI,SACzD,CAAC;EACD,MAAM,QAAQ,GAAI,OAA0B,IAAK;IAC/C,MAAM,GAAG,OAAO;IAChB,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;EACzD,CAAC;EACD,MAAM,KAA2D,GAAI,KAAK,IAAK;IAC7E,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,CAAC;EAClB,CAAC;EAED,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE;IAChC,yBACG,MAAM,eACD,IAAI;MAAA;QAAA,OAEO,OAAO,CAAC,MAAM;MAAA;MAAA;QAAA,OACd,OAAO,CAAC,IAAI,CAAC,CAAC;MAAA;MAAA;QAAA,OACd,OAAO,CAAC,KAAK,CAAC,CAAC;MAAA;MAAA;QAAA,OAClB,KAAK,CAAC,KAAK;MAAA;MAAA,IACvB,QAAQ;QAAA,OAAE,QAAQ,CAAC,CAAC;MAAA;MAAA,IACpB,QAAQ;QAAA,OAAE,uBAAQ,CAAC,CAAC,MAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ;MAAA;MAC1C,OAAO,EAAE,KAAK;MAAA,IACd,SAAS;QAAA,OAAE,OAAO,CAAC,cAAc;MAAA;MAAA,IACjC,IAAI;QAAA,OAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;MAAA;MAAA;QAAA,OACrB,GAAG,KAAK,CAAC,QAAQ,GAAG,iBAAiB,GAAG,EAAE,0BAA0B,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;MAAA;MAAA,IAC9F,IAAI;QAAA,OAAE,KAAK,CAAC,IAAI;MAAA;MAAA,IAChB,OAAO;QAAA,OAAE,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;MAAA;MAAA,IAChE,KAAK;QAAA,OAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;MAAA;MAAA,IACxC,OAAO;QAAA,OAAE,OAAO,CAAC,CAAC;MAAA;MAAA,IAClB,YAAY;QAAA,OAAE,KAAK,CAAC,YAAY;MAAA;MAAA,IAChC,gBAAgB;QAAA,OAAE,KAAK,CAAC,gBAAgB;MAAA;MAAA;QAAA,OAEvC,KAAK,CAAC,QAAQ;MAAA;IAAA;EAGrB;EAEA,4CAGU,IAAI;IAAA;MAAA,OAEO,OAAO,CAAC,MAAM;IAAA;IAAA;MAAA,OACd,OAAO,CAAC,IAAI,CAAC,CAAC;IAAA;IAAA;MAAA,OACd,OAAO,CAAC,KAAK,CAAC,CAAC;IAAA;IAAA;MAAA,OAClB,KAAK,CAAC,KAAK;IAAA;IAAA,IACvB,QAAQ;MAAA,OAAE,QAAQ,CAAC,CAAC;IAAA;IAAA,IACpB,QAAQ;MAAA,OAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ;IAAA;IAAA,IAG1C,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;IAAA;IAAA;MAAA,OACrB,yBAAyB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA,IACnD,KAAK;MAAA,OAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAAA;EAAA,aAEvC,KAAK,CAAC,QAAQ,6BAEhB,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,oBAAO,CAAC,CAAC,KAAK,KAAK,OAAI,OAAO,CAAC,CAAC,KAAK,SAAS;IAAA;IAAA;MAAA,yBACvD,OAAO;QAAA,IACN,OAAO;UAAA,OAAE,OAAO,CAAC,CAAC;QAAA;QAClB,MAAM,EAAE,MAAM,MAAM;QAAA,IACpB,KAAK;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA,IACzB,QAAQ;UAAA,OAAE,QAAQ,CAAC,CAAC;QAAA;QAAA,IACpB,SAAS;UAAA,OAAE,KAAK,CAAC,gBAAgB;QAAA;MAAA;IAAA;EAAA;AAK3C;;AAEA;AACA,SAAS,YAAY,CAAC,KAAoB,EAAe;EACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B;EACA,IAAI,KAAkC;EACtC,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;EAC3D,MAAM,MAAM,GAAG,gBAAgB,EAAE,EAAE;EACnC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;EACjE,IAAI,UAAmC;EACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,IAAI,SAAoC;EACxC;EACA,IAAI,MAAkC;EACtC,IAAI,MAAuC;EAC3C,MAAM,aAAa,GAAG,MAAO,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,MAAO;EAC9E,IAAI,OAAmC;EACvC,IAAI,WAAW,GAAG,IAAI;EACtB,IAAI,OAAO,GAAG,KAAK;EACnB;EACA,IAAI,QAAkC,GAAG,KAAK;EAC9C,IAAI,yBAAyB,GAAG,KAAK;EACrC,IAAI,cAA0C;EAE9C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;EACjD,MAAM,QAAQ,GAAG,MACf,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG,aAAa,GAAG,cAAc,CAAE;EAExI,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,EAAE,GAAG,MAAM,IAAI,UAAU;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE;IACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;MACrG,KAAK,EAAE,MAAM,CAAC,UAAU;MACxB,MAAM,EAAE,MAAM,CAAC;IACjB,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI;IACrC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI;EACrC,CAAC;EACD,MAAM,UAAU,GAAG,MAAM;IACvB,IAAI,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;EACvB,CAAC;EACD,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,yBAAyB,EAAE;IAC/B,yBAAyB,GAAG,IAAI;IAChC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACnD;IACA,IAAI,OAAO,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;MACpD,cAAc,KAAK,IAAI,cAAc,CAAC,UAAU,CAAC;MACjD,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;IACjC;EACF,CAAC;EACD,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,CAAC,yBAAyB,EAAE;IAChC,yBAAyB,GAAG,KAAK;IACjC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC;IAChD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACtD,cAAc,EAAE,UAAU,CAAC,CAAC;EAC9B,CAAC;EACD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,IAAI,KAAK;IACrC;IACA,IAAI,YAAY,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,UAAU,EAAE,WAAW,CAAC;IACzE,IAAI,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,QAAQ,CAAC,EAAE,CAAC;IACZ;IACA;IACA,eAAe,CAAC,KAAK,CAAC;IACtB,uBAAuB,CAAC,CAAC;EAC3B,CAAC;EACD,MAAM,IAAI,GAAG,CAAC,KAA+B,GAAG,OAAO,KAAK;IAC1D,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;IACpE,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,IAAI,UAAU,CAAC;IACzD;IACA,eAAe,CAAC,IAAI,CAAC;IACrB,OAAO,CAAC,WAAW,CAAC,CAAC;IACrB;IACA,eAAe,CAAC,IAAI,CAAC;IACrB,uBAAuB,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC;IACP,cAAc,CAAC,MAAM;MACnB,IAAI,CAAC,KAAK,EAAE;MACZ,IAAI,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KACjC,aAAa,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC;EACJ,CAAC;EACD,MAAM,WAAW,GAAG,CAAC,IAAa,EAAE,KAA+B,GAAG,OAAO,KAAK;IAChF,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE;IAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;MAC5B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;MAC1B;IACF;IACA,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,gBAAgB,CAAC,CAAC,EAAE;MACzD,IAAI,KAAK,EAAE;MACX,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,CAAC;MACrC,KAAK,GAAG,OAAO;MACf;MACA;MACA,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS;MACrC,MAAM,IAAI,GAAG,QAAQ,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;MACtD,IAAI,QAAQ,IAAI,QAAQ,CAAC,aAAa,YAAY,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;MAC5F;MACA,eAAe,CAAC,IAAI,CAAC;MACrB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;MAC1B,KAAK,aAAa,CAAC;QACjB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY;QAC7C,MAAM,EAAE,MAAM,CAAC,CAAC;QAChB,GAAG,EAAE,KAAK,CAAC,QAAQ;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,OAAO,CAAC;MAClB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;QACf,KAAK,GAAG,SAAS;QACjB;QACA,MAAM,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC,GAAG,SAAS;QACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa;QACtC,IAAI,MAAM,EAAE,WAAW,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7F,eAAe,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,KAAK,CAAC,OAAO,GAAG,CAAC;MACnB,CAAC,CAAC;MACF;IACF;IACA,IAAI,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KACjB,KAAK,CAAC,KAAK,CAAC;EACnB,CAAC;EACD,MAAM,iBAAiB,GAAI,KAAoB,IAAK;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC;IACtC;IACA,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;MAC1F,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;MACjC,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,UAAU,EAAE,WAAW,CAAC;MACvD,WAAW,CAAC,KAAK,CAAC;IACpB,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;MAC9B,WAAW,CAAC,KAAK,CAAC;IACpB;EACF,CAAC;EAED,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjE;IACA,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE;IACtE,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,IAAI,MAAM,CAAC,CAAC,EAAE;MACZ,IAAI,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,KACtE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MAC7D;IACF;IACA,MAAM,GAAG,MAAM,GAAG,SAAS;IAC3B,QAAQ,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO;IACrD,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;IAC3B,QAAQ,GAAG,KAAK;EAClB,CAAC;EACD,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAC1C,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;EACxB,CAAC;EAED,MAAM,OAA6B,GAAG;IACpC,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;IACvC,MAAM;IACN,IAAI,EAAE,MAAM;IACZ,eAAe,EAAG,OAAO,IAAK;MAC5B,UAAU,GAAG,OAAO;IACtB,CAAC;IACD,MAAM;IACN,KAAK,EAAE,MAAO,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAO;IAC/C,cAAc,EAAG,KAAK,IAAK,UAAU,CAAC,KAAK;EAC7C,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI;IAC7B,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE;IACtD,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;EACnE,CAAC,CAAC;EACF,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;IACrB,KAAK,EAAE,KAAK,CAAC,CAAC;IACd,IAAI,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;EAC3B,CAAC,CAAC;EACF,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,KAAK;IAC5B,IAAI,MAAM,CAAC,CAAC,EAAE;IACd,MAAM,GAAG,EAAE;IACX,MAAM,GAAG,KAAK;IACd,WAAW,CAAC,IAAI,CAAC;EACnB,CAAC,CAAC;EACF,KAAK,CAAC,SAAS,GAAG,MAAM;IACtB,KAAK,EAAE,KAAK,CAAC,CAAC;IACd,IAAI,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;EACvB,CAAC,CAAC;EACF,OAAO,CAAC,MAAM;IACZ,OAAO,GAAG,IAAI;IACd,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,CAAC,uBAAuB,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE;IACd,UAAU,GAAG,OAAO;IACpB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;IAC7C,MAAM,OAAO,GAAI,KAAiB,IAAK;MACrC,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE;MACtH,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,eAAe,CAAC,CAAC;MACvB,MAAM,CAAC,CAAC;IACV,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/C,YAAY,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,SAAS,CAAC,MAAM;MACd,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;MAC7C,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC;IACpD,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,SAAS,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;EAE/B,yBACG,eAAe,CAAC,QAAQ;IAAC,KAAK,EAAE,OAAO;IAAA;MAAA,uBACzB,yBAAgB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,WAC7C,KAAK,CAAC,QAAQ,iCAKT,MAAM,wCAEJ,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,iDAC1B,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,qDAChC,KAAK,CAAC,IAAI,GAAG,YAAG,MAAM,cAAO,YAAG,SAAS,iBACpD,+BAAsB,KAAK,CAAC,SAAS,IAAI,EAAE,SAAE,aAC7C,KAAK,CAAC,KAAK,GAAG;QAAE,sBAAsB,EAAE,KAAK,CAAC;MAAM,CAAC,GAAG,SAAS,gCAC5D,KAAK,CAAC,KAAK,GAAG,OAAO,YAAG,SAAS,0DAC/B,KAAK,CAAC,OAAO,IAAI,SAAS,+CAC5B,KAAK,CAAC,KAAK,KAAK,MAAM,GAAG,MAAM,YAAG,SAAS,gDAC1C,KAAK,CAAC,MAAM,GAAG,EAAE,YAAG,SAAS,2DAC3B,QAAQ,CAAC,CAAC,4CAoBxB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,YAAY,CAAC,CAAC;QAAA;QAAA;UAAA,0BACvB,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,MAAM;YAAA;YAAA,IAAE,QAAQ;cAAA,yBAAG,aAAa;gBAAA,IAAC,KAAK;kBAAA,OAAE,KAAK,CAAC,KAAK;gBAAA;gBAAE,KAAK,EAAE;cAAK;YAAA;YAAA,UAC/E,MAAM,sBACL,UAAU;cACT,KAAK,EAAE,aAAa;cAAA,IACpB,KAAK;gBAAA,OAAE,KAAK,CAAC,KAAK;cAAA;cAAA,IAClB,MAAM;gBAAA,OAAE,MAAM,CAAC,CAAC;cAAA;cAAA,IAChB,KAAK;gBAAA,OAAE,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY;cAAA;cAC7C,KAAK,EAAE,KAAK;cACZ,QAAQ,EAAE,QAAQ;cAClB,KAAK,EAAE,KAAK;cACZ,GAAG,EAAG,GAAG,IAAK;gBACZ,SAAS,GAAG,GAAG;gBACf,SAAS,CAAC,MAAM;kBACd,IAAI,SAAS,KAAK,GAAG,EAAE,SAAS,GAAG,SAAS;gBAC9C,CAAC,CAAC;cACJ;YAAC;UAEJ,sBAGF,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,IAAI;YAAA;YAAA;cAAA,uBACb,YAAG,MAAM,cAAO,WACpB,KAAK,CAAC,IAAI;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAQ3B;AAQA,OAAO,MAAM,QAAQ,GAAG,YAAiC;AACzD,QAAQ,CAAC,IAAI,GAAG,YAAY;AAC5B,QAAQ,CAAC,OAAO,GAAG,eAAe;AAClC,QAAQ,CAAC,IAAI,GAAG,YAAY;AAE5B,eAAe,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n splitProps,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Tooltip, type TooltipPlacement, useLabelTooltip } from \"../feedback/Tooltip\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { KeyedFor } from \"../internal/keyed-for\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant, iconTitle } from \"./Button\";\nimport { focusMenuRow, focusRowSegment } from \"./menu-rows\";\nimport { MenuSearch, type MenuSearchApi } from \"./menu-search\";\nimport { openMenuSheet, prefersMenuSheet } from \"./menu-sheet\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\nconst closeOnSelectOf = (item: DropdownAction) => (\"closeOnSelect\" in item ? item.closeOnSelect : undefined);\nconst hrefOf = (item: DropdownAction) => (\"href\" in item ? item.href : undefined);\nconst externalOf = (item: DropdownAction) => (\"external\" in item ? item.external : undefined);\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n/** Where a menu opened without its trigger appears: an element, or any box such as a point inside one. */\nexport type DropdownAnchor = { getBoundingClientRect(): Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\"> };\n/** Where focus returns as a menu opened by `openAt` closes, read at that moment when it is a function. */\nexport type DropdownReturnFocus = HTMLElement | (() => HTMLElement | undefined);\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n /**\n * Accessible name when it must say more than the visible label, such as the current value and what the next\n * activation does. It must contain the visible label.\n */\n ariaLabel?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n /** `danger` for destructive entries; `accent` for the entry most people want, such as creating a blank item. */\n variant?: \"danger\" | \"accent\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n /**\n * Set `false` for an action that changes a value in place, such as cycling a setting: the menu stays open and\n * the focus stays on the row. Defaults to `true`.\n */\n closeOnSelect?: boolean;\n /**\n * In a phone sheet, run while the tap still counts as the person's gesture, before the sheet closes, as browsers\n * require for clipboard writes. Other actions run after the sheet has left the history. Such an action must\n * not navigate or open a dialog.\n */\n immediate?: boolean;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n /** Runs on a plain click instead of following the link; modified clicks, middle-click, and the link's menu keep it. */\n action?: () => void;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** A second, smaller action at the end of a row, such as \"Only\" beside a checkbox; it keeps the menu open. */\nexport type DropdownSecondaryAction = {\n label: string;\n /** Accessible name when the visible label alone does not say what it acts on, such as \"Only Team Logistik\". */\n ariaLabel?: string;\n action: () => void;\n};\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n href?: string;\n closeOnSelect?: boolean;\n color?: string;\n /**\n * A second action at the end of the row. It shows while the row is hovered or focused, always on a touch screen,\n * and keeps its place when hidden, so the row never changes width. Right and Left move between the two.\n */\n secondary?: DropdownSecondaryAction;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n /**\n * `row` sets a few short radio choices, such as a sort direction, side by side as one segmented row. Give it a\n * `sectionLabel`: the label names the choice above the row and for screen readers.\n */\n layout?: \"row\";\n /** A quiet action at the end of the section label, such as \"All\"; it needs a `sectionLabel` and keeps the menu open. */\n labelAction?: DropdownSecondaryAction;\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\n/** A search field above the entries, for a menu long enough that finding an entry takes reading. */\nexport type DropdownSearch = {\n /** Names the field and is its placeholder unless `placeholder` is set, such as \"Find template\". */\n label: string;\n placeholder?: string;\n /**\n * The entries for a query that is not blank. Defaults to the actions and choices whose label or description contains\n * the query, kept in their sections.\n */\n filter?: (query: string) => readonly DropdownItem[];\n /** What a screen reader hears after the query changes; defaults to the number of matching entries. */\n status?: (query: string, matches: number) => string;\n};\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n /** The `Dropdown.Trigger`; leave it out for a menu opened through `attach` or `openAt`. */\n children?: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /**\n * Exact menu width as a CSS length. Without it the menu sizes to its longest\n * entry: at least `12rem` (`18rem` for touch), at most the viewport width\n * less `1rem` per side, where longer entries wrap.\n */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n /**\n * `sheet` opens the same items as a bottom sheet on phones (below 48rem) instead of a menu beside the trigger.\n * Defaults to `menu`. A controlled menu (`open`) always stays a menu.\n */\n phone?: \"menu\" | \"sheet\";\n /** Content above the phone sheet's menu. `close` dismisses it with normal history and focus restoration. */\n sheetTop?: (close: () => void) => JSX.Element;\n /**\n * Renders the entries only once the menu first opens, for a menu repeated on every row of a long list: the page\n * then carries each row's trigger, not each row's entries. Fixed for the menu's lifetime.\n */\n lazy?: boolean;\n /**\n * Receives `open`, which shows the menu without its trigger beside `anchor`, as for a context menu, a key or a\n * grip. Focus returns to `returnFocus` when the menu or sheet closes; pass a function when an entry can move the\n * place focus belongs to. Phones get the sheet as from the trigger.\n */\n openAt?: (open: (anchor: DropdownAnchor, returnFocus?: DropdownReturnFocus) => void) => void;\n /** Receives `close`, which closes the menu or sheet and returns focus. */\n closeWith?: (close: () => void) => void;\n /**\n * Puts a search field above the entries. Focus starts in the field; Up and Down move through the matching entries,\n * Enter chooses one, and the first stays marked while the query changes.\n */\n search?: DropdownSearch;\n /**\n * Adopts an element rendered elsewhere as the trigger, such as a server-rendered link: a plain click, Enter, Space,\n * Up, or Down opens the menu, while a modified or middle click keeps the link. The element gets `aria-expanded` and\n * `aria-controls`; render `aria-haspopup` with it, so the server HTML already says it opens a menu. Read once on mount.\n */\n attach?: () => HTMLElement | null | undefined;\n /** `tile` sets every entry's icon on a quiet square, for menus whose icons tell entries apart, such as templates. */\n icons?: \"plain\" | \"tile\";\n /** One quiet sentence below the entries that explains them all, such as what choosing one keeps; it describes the menu. */\n note?: string;\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n closeOnSelect?: boolean;\n ariaLabel?: string;\n icon?: string;\n image?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\" | \"accent\";\n href?: string;\n external?: boolean;\n /** Runs when the item is chosen. With `href`, a plain click runs it instead of following the link. */\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n /** `option` inside a searchable menu's list box, whose field keeps the focus. */\n role: \"menuitem\" | \"option\";\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n popup: () => \"dialog\" | \"menu\";\n registerTrigger: (element: HTMLElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n \"[role='option']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu).filter((item) => !item.classList.contains(\"k2b-dropdown__secondary\"));\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\">,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: {\n description?: string;\n icon?: string;\n image?: string;\n trailing?: JSX.Element;\n children: JSX.Element;\n}): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const role = () => menu?.role ?? \"menuitem\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role={role()}\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n data-accent={props.variant === \"accent\" ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n // Read before closing: a searchable menu clears its query as it closes, and the row then shows another entry.\n const select = props.onSelect;\n if (props.closeOnSelect !== false) menu?.close();\n select?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role={role()}\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n data-accent={props.variant === \"accent\" ? \"true\" : undefined}\n onClick={(event) => {\n // With `onSelect`, a plain click runs it in place of the link; a modified click keeps its browser meaning.\n const select = props.onSelect;\n if (select && !(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n event.preventDefault();\n menu?.close();\n select();\n return;\n }\n menu?.close(false);\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n // A searchable menu's field keeps the focus, so a second button in a row could not be reached; it is left out.\n return (\n <Show when={menu?.role !== \"option\" && props.secondary} fallback={<DropdownChoiceRow {...props} />}>\n {(secondary) => (\n <div class=\"k2b-dropdown__pair\">\n <DropdownChoiceRow {...props} />\n <DropdownSecondaryButton {...secondary()} class=\"k2b-dropdown__secondary\" />\n </div>\n )}\n </Show>\n );\n}\n\nfunction DropdownSecondaryButton(props: DropdownSecondaryAction & { class: string }): JSX.Element {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n class={props.class}\n aria-label={props.ariaLabel}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.action();\n }}\n >\n {props.label}\n </button>\n );\n}\n\nfunction DropdownChoiceRow(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n let element: HTMLElement | undefined;\n return (\n <Dynamic\n ref={(node: HTMLAnchorElement | HTMLButtonElement) => {\n element = node;\n }}\n component={!props.disabled && props.href ? \"a\" : \"button\"}\n href={!props.disabled ? props.href : undefined}\n type={!props.disabled && props.href ? undefined : \"button\"}\n role={menu?.role === \"option\" ? \"option\" : props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-label={props.ariaLabel}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event: MouseEvent) => {\n if (props.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n menu?.close(false);\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const action = props.action;\n if (props.closeOnSelect !== false) menu?.close();\n action();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n // A link answers only Enter; as a menu choice it also answers Space, like the button form.\n if (event.key !== \" \" || props.disabled || !props.href) return;\n event.preventDefault();\n element?.click();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n {/* Always present for radios, so selecting the widest entry cannot widen a content-sized menu. */}\n <Show when={props.choice === \"radio\"}>\n <i class=\"ti ti-check k2b-dropdown__check\" data-hidden={checked() ? undefined : \"true\"} aria-hidden=\"true\" />\n </Show>\n </Dynamic>\n );\n}\n\nexport function DropdownItems(props: {\n items: readonly DropdownItem[];\n close: (restoreFocus?: boolean) => void;\n role?: \"menuitem\" | \"option\";\n}): JSX.Element {\n const messages = useUiMessages();\n // Rows read their current item: a host that rebuilds equal items while the menu is open keeps each row element (#2140).\n const renderItem = (item: () => DropdownAction | DropdownChoice): JSX.Element => {\n const initial = untrack(item);\n if (\"choice\" in initial) return <DropdownChoiceItem {...mergeProps(() => item() as DropdownChoice)} />;\n const action = () => item() as DropdownAction;\n return (\n <DropdownItem\n ariaLabel={action().ariaLabel}\n closeOnSelect={closeOnSelectOf(action())}\n icon={action().icon}\n image={action().image}\n description={action().description}\n trailing={action().trailing}\n variant={action().variant}\n disabled={action().disabled}\n class={action().class}\n href={hrefOf(action())}\n external={externalOf(action())}\n onSelect={selectAction(action())}\n >\n {action().label}\n </DropdownItem>\n );\n };\n\n return (\n <MenuContext.Provider value={{ close: props.close, role: props.role ?? \"menuitem\" }}>\n <KeyedFor each={props.items} by={(item) => (\"items\" in item ? `section:${item.sectionLabel ?? \"\"}` : `item:${item.label}`)}>\n {(current, index) => {\n const item = current();\n return (\n <Show when={\"items\" in item} fallback={renderItem(current as () => DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n // A row of choices is no set of actions: without a label it stays unnamed rather than misnamed.\n aria-label={\n (current() as DropdownSection).sectionLabel ??\n ((current() as DropdownSection).layout === \"row\" ? undefined : messages().actions)\n }\n >\n <Show when={(current() as DropdownSection).sectionLabel}>\n {(label) => (\n <Show\n when={props.role !== \"option\" && (current() as DropdownSection).labelAction}\n fallback={<div class=\"k2b-dropdown__label\">{label()}</div>}\n >\n {(action) => (\n <div class=\"k2b-dropdown__label k2b-dropdown__label--action\">\n <span>{label()}</span>\n <DropdownSecondaryButton {...action()} class=\"k2b-dropdown__label-action\" />\n </div>\n )}\n </Show>\n )}\n </Show>\n <Show\n when={(current() as DropdownSection).layout === \"row\"}\n fallback={\n <KeyedFor each={(current() as DropdownSection).items} by={(row) => row.label}>\n {renderItem}\n </KeyedFor>\n }\n >\n <div class=\"k2b-dropdown__row\">\n <KeyedFor each={(current() as DropdownSection).items} by={(row) => row.label}>\n {renderItem}\n </KeyedFor>\n </div>\n </Show>\n </div>\n </Show>\n );\n }}\n </KeyedFor>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"title\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n // An icon-only trigger shows its label as a hint, like IconButton.\n const tooltip = useLabelTooltip(\n () => local.tooltip,\n () => (local.iconOnly ? (local.title ?? local.label) : undefined),\n );\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup={context.popup()}\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n title={iconTitle(local.title, tooltip())}\n tooltip={tooltip()}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup={context.popup()}\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n title={iconTitle(local.title, tooltip())}\n >\n {local.children}\n </button>\n <Show when={tooltip() !== false && tooltip() !== undefined}>\n <Tooltip\n content={tooltip() as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n /** The open phone sheet's cancel switch: it closes when the menu goes or is disabled, as the popover does. */\n let sheet: AbortController | undefined;\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n const [entriesShown, setEntriesShown] = createSignal(!props.lazy);\n let triggerRef: HTMLElement | undefined;\n const [query, setQuery] = createSignal(\"\");\n let searchApi: MenuSearchApi | undefined;\n /** Set while the menu is open from `openAt`: it appears beside `anchor`, and focus returns to `origin`. */\n let anchor: DropdownAnchor | undefined;\n let origin: DropdownReturnFocus | undefined;\n const originElement = () => (typeof origin === \"function\" ? origin() : origin);\n let menuRef: HTMLDivElement | undefined;\n /**\n * Whether the popover shows, as `open` and the toggle events left it. A menu closed before its opening toggle event\n * arrives gets one event from \"closed\" to \"closed\"; this still reports that close to the owner.\n */\n let shown = false;\n let triggerRing = true;\n let mounted = false;\n /** Where a key on the trigger asked the focus to go; a controlled menu opens later, in its owner's update. */\n let keyFocus: \"first\" | \"last\" | false = false;\n let viewportListenersAttached = false;\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n const at = anchor ?? triggerRef;\n if (!at || !menuRef) return;\n const rect = dropdownPosition(at.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n // A content-sized menu changes size when its items change while it is open.\n if (menuRef && typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(reposition);\n resizeObserver.observe(menuRef);\n }\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n resizeObserver?.disconnect();\n };\n const close = (restoreFocus = true) => {\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(originElement() ?? triggerRef, triggerRing);\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n setQuery(\"\");\n // Like `open`, expose the closed state now: the toggle event can arrive after the next key press, and a trigger\n // that still reads as open would ignore Enter (Escape, then Enter at once, must reopen).\n setInternalOpen(false);\n detachViewportListeners();\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n triggerRing = ringOnReturn(originElement() ?? triggerRef);\n // A lazy menu's entries exist before it shows, so it places and focuses them as any other.\n setEntriesShown(true);\n menuRef.showPopover();\n shown = true;\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (!focus) return;\n if (searchApi) searchApi.focus(focus);\n else focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next && props.phone === \"sheet\" && prefersMenuSheet()) {\n if (sheet) return;\n const current = new AbortController();\n sheet = current;\n // A sheet opened without its trigger returns focus to its own target, which an entry may have moved,\n // rather than to whatever had focus as it opened.\n const anchored = origin !== undefined;\n const ring = anchored && ringOnReturn(originElement());\n if (anchored && document.activeElement instanceof HTMLElement) document.activeElement.blur();\n // The sheet is this menu's open state: the trigger reports it and the owner hears both ends.\n setInternalOpen(true);\n props.onOpenChange?.(true);\n void openMenuSheet({\n Items: DropdownItems,\n items: props.items,\n label: props.label ?? messages().dropdownMenu,\n locale: locale(),\n top: props.sheetTop,\n search: props.search,\n icons: props.icons,\n note: props.note,\n signal: current.signal,\n }).finally(() => {\n sheet = undefined;\n // An entry that moved focus elsewhere, such as into a field, keeps it.\n const target = anchored ? originElement() : undefined;\n const focused = document.activeElement;\n if (target?.isConnected && (!focused || focused === document.body)) returnFocus(target, ring);\n setInternalOpen(false);\n props.onOpenChange?.(false);\n props.onClose?.();\n });\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n // A searchable menu's field keeps the focus and moves the marked entry itself.\n if (!props.search && (focusMenuRow(items, event.key) || focusRowSegment(items, event.key))) {\n event.preventDefault();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n returnFocus(originElement() ?? triggerRef, triggerRing);\n requestOpen(false);\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const triggerKey = (event: KeyboardEvent) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n // Ctrl+Enter and the like keep their browser meaning on an adopted link, such as opening it in a new tab.\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n if (searchApi) searchApi.focus(event.key === \"ArrowUp\" ? \"last\" : \"first\");\n else focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n anchor = origin = undefined;\n keyFocus = event.key === \"ArrowUp\" ? \"last\" : \"first\";\n requestOpen(true, keyFocus);\n keyFocus = false;\n };\n const toggle = () => {\n if (!isOpen()) anchor = origin = undefined;\n requestOpen(!isOpen());\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle,\n popup: () => (props.search ? \"dialog\" : \"menu\"),\n triggerKeyDown: (event) => triggerKey(event),\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(keyFocus);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (!props.disabled) return;\n sheet?.abort();\n if (mounted) close(false);\n });\n props.openAt?.((at, focus) => {\n if (isOpen()) return;\n anchor = at;\n origin = focus;\n requestOpen(true);\n });\n props.closeWith?.(() => {\n sheet?.abort();\n if (isOpen()) close();\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n const adopted = props.attach?.();\n if (!adopted) return;\n triggerRef = adopted;\n adopted.setAttribute(\"aria-controls\", menuId);\n const onClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n event.stopPropagation();\n toggle();\n };\n adopted.addEventListener(\"click\", onClick);\n adopted.addEventListener(\"keydown\", triggerKey);\n createEffect(() => adopted.setAttribute(\"aria-expanded\", String(isOpen())));\n onCleanup(() => {\n adopted.removeEventListener(\"click\", onClick);\n adopted.removeEventListener(\"keydown\", triggerKey);\n });\n });\n onCleanup(() => sheet?.abort());\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the role is menu, or dialog with search; both take a name. */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: a menu or dialog popup owns its keys. */}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role={props.search ? \"dialog\" : \"menu\"}\n aria-label={props.label ?? messages().dropdownMenu}\n aria-describedby={props.note ? `${menuId}-note` : undefined}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-width={props.width ? \"fixed\" : undefined}\n data-variant={props.variant ?? \"default\"}\n data-icons={props.icons === \"tile\" ? \"tile\" : undefined}\n data-search={props.search ? \"\" : undefined}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = shown || (event as ToggleEvent).oldState === \"open\";\n shown = nextOpen;\n setInternalOpen(nextOpen);\n if (nextOpen) setEntriesShown(true);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n // A light dismiss hides the menu with focus inside it; an opener without a trigger takes it back.\n const focused = document.activeElement;\n const target = wasOpen && !nextOpen ? originElement() : undefined;\n if (target?.isConnected && (!focused || focused === document.body || menuRef?.contains(focused)))\n returnFocus(target, triggerRing);\n if (wasOpen && !nextOpen) setQuery(\"\");\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <Show when={entriesShown()}>\n <Show when={props.search} fallback={<DropdownItems items={props.items} close={close} />}>\n {(search) => (\n <MenuSearch\n Items={DropdownItems}\n items={props.items}\n search={search()}\n label={props.label ?? messages().dropdownMenu}\n query={query}\n setQuery={setQuery}\n close={close}\n api={(api) => {\n searchApi = api;\n onCleanup(() => {\n if (searchApi === api) searchApi = undefined;\n });\n }}\n />\n )}\n </Show>\n {/* Hidden from the menu's children, which are entries only; the menu reads it as its description. */}\n <Show when={props.note}>\n <p id={`${menuId}-note`} class=\"k2b-dropdown__note\" aria-hidden=\"true\">\n {props.note}\n </p>\n </Show>\n </Show>\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":"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","ignoreList":[]}
@@ -239,7 +239,7 @@ export function FilterToggle(props) {
239
239
  return _$memo(() => props.href !== undefined)() && !props.disabled;
240
240
  },
241
241
  get fallback() {
242
- return _$ssr(_tmpl$0, _$ssrAttribute("class", _$escape(className(), true), false) + _$ssrAttribute("data-active", props.active ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-pressed", _$escape(props.active, true), false) + _$ssrAttribute("title", _$escape(props.title, true), false), _$ssrAttribute("disabled", props.disabled, true), _$escape(content()));
242
+ return _$ssr(_tmpl$0, _$ssrAttribute("class", _$escape(className(), true), false) + _$ssrAttribute("data-active", props.active ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-pressed", _$escape(props.active, true), false) + _$ssrAttribute("aria-haspopup", props.opensDialog ? "dialog" : _$escape(undefined, true), false) + _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("title", _$escape(props.title, true), false), _$ssrAttribute("disabled", props.disabled, true), _$escape(content()));
243
243
  },
244
244
  get children() {
245
245
  return _$ssr(_tmpl$9, _$ssrAttribute("class", _$escape(className(), true), false) + _$ssrAttribute("href", _$escape(props.href, true), false) + _$ssrAttribute("data-active", props.active ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-current", props.active ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("title", _$escape(props.title, true), false), _$escape(content()));
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/FilterChip.tsx"],"sourcesContent":["import { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ButtonVariant } from \"./Button\";\nimport Dropdown, { type DropdownItem } from \"./Dropdown\";\nimport { useFilterMessages } from \"./filter-messages\";\n\nexport type FilterChipOption = {\n value: string;\n label: string;\n icon?: string;\n color?: string;\n /** Quiet trailing information about the option, such as a short note or a loading or warning icon with its own label. */\n trailing?: JSX.Element;\n};\n\nexport type FilterChipSection = {\n label?: string;\n options: readonly FilterChipOption[];\n multiple?: boolean;\n /**\n * `row` sets a few short single-select options side by side as one segmented row under its `label`. Selecting the\n * chosen option again keeps it; give the row a value in `defaultValue` so Reset keeps a choice too.\n */\n layout?: \"row\";\n /** A labelled `multiple` section offers \"All\" or, once all its options are chosen, \"None\" beside its label. */\n toggleAll?: boolean;\n};\n\nexport type FilterChipProps = {\n label: string;\n icon: string;\n options: readonly FilterChipSection[];\n value: readonly string[];\n onValueChange: (value: string[]) => void;\n isActive?: boolean;\n position?: \"bottom-left\" | \"bottom-right\";\n defaultValue?: readonly string[];\n iconOnly?: boolean;\n /** Use a standard button appearance instead of the default filter field. */\n variant?: ButtonVariant;\n /**\n * An active chip names its first value instead of a count: \"Tags: Customer\", \"Tags: Customer +2\". Use it for the\n * chips of `AppWorkspace.Head`; pass only the filter's name as `label`. The chip then grows with its value.\n */\n showValue?: boolean;\n /**\n * Each option of a `multiple` section offers \"Only\" at the end of its row: it chooses that option alone among the\n * `multiple` sections and keeps the choices of single-select sections.\n */\n only?: boolean;\n /** The trigger shows the colors of the first four chosen options before its label, as a quiet hint of what is in view. */\n swatches?: boolean;\n disabled?: boolean;\n class?: string;\n};\n\n/** Section-aware controlled filter with immediate single- and multi-select commits. */\nexport function FilterChip(props: FilterChipProps): JSX.Element {\n const messages = useUiMessages();\n const filterMessages = useFilterMessages();\n const selectedValues = createMemo(() => new Set(props.value));\n const selectedOptions = createMemo(() =>\n props.options.flatMap((section) => section.options).filter((option) => selectedValues().has(option.value)),\n );\n const defaultValues = createMemo(() => new Set(props.defaultValue ?? []));\n const sectionByValue = createMemo(() => {\n const sections = new Map<string, FilterChipSection>();\n for (const section of props.options) {\n for (const option of section.options) sections.set(option.value, section);\n }\n return sections;\n });\n const hasDefault = () => (props.defaultValue?.length ?? 0) > 0;\n const selected = (value: string) => selectedValues().has(value);\n const active = () => props.isActive ?? props.value.length > 0;\n const namedValue = () => (props.showValue && !props.iconOnly && active() ? selectedOptions()[0] : undefined);\n const triggerLabel = () => {\n const first = namedValue();\n if (!first) return props.label;\n return `${props.label}: ${first.label}${props.value.length > 1 ? ` +${props.value.length - 1}` : \"\"}`;\n };\n const atDefault = () => {\n if (!props.defaultValue) return false;\n const current = props.value;\n return current.length === props.defaultValue.length && current.every((value) => defaultValues().has(value));\n };\n const emit = (value: string[]) => props.onValueChange(value);\n const toggle = (value: string) => {\n const section = sectionByValue().get(value);\n if (!section) return;\n const current = props.value;\n if (section.multiple) {\n emit(selected(value) ? current.filter((entry) => entry !== value) : [...current, value]);\n return;\n }\n // A segmented row always keeps one choice, like a SegmentedControl.\n if (section.layout === \"row\" && selected(value)) return;\n const sectionValues = new Set(section.options.map((option) => option.value));\n const otherValues = current.filter((entry) => !sectionValues.has(entry));\n emit(selected(value) ? otherValues : [...otherValues, value]);\n };\n const reset = () => emit(props.defaultValue ? [...props.defaultValue] : []);\n const showReset = () => (hasDefault() && !atDefault()) || (!hasDefault() && props.value.length > 0);\n const swatches = createMemo(() =>\n props.swatches && !props.iconOnly\n ? selectedOptions()\n .flatMap((option) => (option.color ? [option.color] : []))\n .slice(0, 4)\n : [],\n );\n const onlyValue = (value: string) => {\n const kept = props.value.filter((entry) => !sectionByValue().get(entry)?.multiple);\n emit([...kept, value]);\n };\n const toggleSection = (section: FilterChipSection) => {\n const values = section.options.map((option) => option.value);\n const all = values.every((value) => selected(value));\n const others = props.value.filter((entry) => !values.includes(entry));\n emit(all ? others : [...others, ...values]);\n };\n const optionItems = createMemo<DropdownItem[]>(() => {\n const result: DropdownItem[] = [];\n for (const section of props.options) {\n const items = section.options.map((option) => ({\n action: () => toggle(option.value),\n checked: () => props.value.includes(option.value),\n choice: section.multiple ? (\"checkbox\" as const) : (\"radio\" as const),\n class: \"k2b-filter-chip__option\",\n closeOnSelect: false,\n color: option.color,\n icon: !section.multiple ? option.icon : undefined,\n label: option.label,\n trailing: option.trailing,\n secondary:\n props.only && section.multiple\n ? {\n label: filterMessages().only,\n ariaLabel: filterMessages().onlyOption({ label: option.label }),\n action: () => onlyValue(option.value),\n }\n : undefined,\n }));\n // Read when the row renders, so a change of the choice updates the label without rebuilding the rows.\n const all = () => section.options.every((option) => selected(option.value));\n const sectionLabel = section.label;\n const labelAction =\n section.toggleAll && section.multiple && sectionLabel && section.options.length > 0\n ? {\n get label() {\n return all() ? filterMessages().none : filterMessages().all;\n },\n get ariaLabel() {\n return (all() ? filterMessages().noneOf : filterMessages().allOf)({ label: sectionLabel });\n },\n action: () => toggleSection(section),\n }\n : undefined;\n if (section.label || section.layout) result.push({ sectionLabel: section.label, layout: section.layout, labelAction, items });\n else result.push(...items);\n }\n return result;\n });\n const items = createMemo<DropdownItem[]>(() => {\n if (!showReset()) return optionItems();\n return [\n ...optionItems(),\n {\n sectionLabel: filterMessages().filterActions,\n items: [\n {\n action: reset,\n icon: hasDefault() ? \"ti ti-refresh\" : \"ti ti-x\",\n label: hasDefault() ? messages().reset : messages().clear,\n variant: \"danger\",\n },\n ],\n },\n ];\n });\n\n return (\n <Dropdown.Root\n disabled={props.disabled}\n items={items()}\n position={props.position ?? \"bottom-left\"}\n menuClass=\"k2b-filter-chip__menu\"\n label={props.label}\n >\n <Dropdown.Trigger\n appearance={props.variant ? \"button\" : \"plain\"}\n variant={props.variant}\n iconOnly={props.iconOnly}\n class={props.variant ? props.class : `k2b-filter-chip ${props.class ?? \"\"}`}\n data-state={active() ? \"active\" : \"idle\"}\n data-active={active() ? \"true\" : undefined}\n data-icon-only={props.iconOnly ? \"true\" : undefined}\n label={triggerLabel()}\n >\n <Show when={swatches().length > 0} fallback={<i class={props.icon} aria-hidden=\"true\" />}>\n <span class=\"k2b-filter-chip__swatches\" aria-hidden=\"true\">\n <For each={swatches()}>{(color) => <span class=\"k2b-filter-chip__dot\" style={{ \"--k2b-filter-color\": color }} />}</For>\n </span>\n </Show>\n <Show when={!props.iconOnly}>\n <span class=\"k2b-filter-chip__label\">\n {props.label}\n <Show when={namedValue()} fallback={<Show when={!hasDefault() && props.value.length > 0}>{` (${props.value.length})`}</Show>}>\n {(first) => (\n <span class=\"k2b-filter-chip__value\">\n :{\" \"}\n <Show when={first().color}>\n {(color) => <span class=\"k2b-filter-chip__dot\" style={{ \"--k2b-filter-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n {first().label}\n <Show when={props.value.length > 1}>{` +${props.value.length - 1}`}</Show>\n </span>\n )}\n </Show>\n </span>\n <i class=\"ti ti-chevron-down k2b-filter-chip__chevron\" aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n\nexport default FilterChip;\n\nexport type FilterToggleProps = {\n label: JSX.Element;\n icon: string;\n /** Whether the filter is on. An active toggle carries the same tint as an active `FilterChip`. */\n active: boolean;\n /** Link to the URL with the filter switched. The link keeps working without JavaScript. */\n href?: string;\n onClick?: (event: MouseEvent) => void;\n title?: string;\n disabled?: boolean;\n class?: string;\n};\n\n/**\n * One on/off filter in the chip look: a link marked `aria-current=\"true\"` while active, or a button with\n * `aria-pressed`. Selection changes only colour and background, so neighbouring chips never move.\n */\nexport function FilterToggle(props: FilterToggleProps): JSX.Element {\n const content = () => (\n <>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-filter-chip__label\">{props.label}</span>\n </>\n );\n const className = () => `k2b-filter-chip ${props.class ?? \"\"}`;\n return (\n <Show\n when={props.href !== undefined && !props.disabled}\n fallback={\n <button\n type=\"button\"\n class={className()}\n data-active={props.active ? \"true\" : undefined}\n aria-pressed={props.active}\n title={props.title}\n disabled={props.disabled}\n onClick={(event) => props.onClick?.(event)}\n >\n {content()}\n </button>\n }\n >\n <a\n class={className()}\n href={props.href}\n data-active={props.active ? \"true\" : undefined}\n aria-current={props.active ? \"true\" : undefined}\n title={props.title}\n onClick={(event) => props.onClick?.(event)}\n >\n {content()}\n </a>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/FilterChip.tsx"],"sourcesContent":["import { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ButtonVariant } from \"./Button\";\nimport Dropdown, { type DropdownItem } from \"./Dropdown\";\nimport { useFilterMessages } from \"./filter-messages\";\n\nexport type FilterChipOption = {\n value: string;\n label: string;\n icon?: string;\n color?: string;\n /** Quiet trailing information about the option, such as a short note or a loading or warning icon with its own label. */\n trailing?: JSX.Element;\n};\n\nexport type FilterChipSection = {\n label?: string;\n options: readonly FilterChipOption[];\n multiple?: boolean;\n /**\n * `row` sets a few short single-select options side by side as one segmented row under its `label`. Selecting the\n * chosen option again keeps it; give the row a value in `defaultValue` so Reset keeps a choice too.\n */\n layout?: \"row\";\n /** A labelled `multiple` section offers \"All\" or, once all its options are chosen, \"None\" beside its label. */\n toggleAll?: boolean;\n};\n\nexport type FilterChipProps = {\n label: string;\n icon: string;\n options: readonly FilterChipSection[];\n value: readonly string[];\n onValueChange: (value: string[]) => void;\n isActive?: boolean;\n position?: \"bottom-left\" | \"bottom-right\";\n defaultValue?: readonly string[];\n iconOnly?: boolean;\n /** Use a standard button appearance instead of the default filter field. */\n variant?: ButtonVariant;\n /**\n * An active chip names its first value instead of a count: \"Tags: Customer\", \"Tags: Customer +2\". Use it for the\n * chips of `AppWorkspace.Head`; pass only the filter's name as `label`. The chip then grows with its value.\n */\n showValue?: boolean;\n /**\n * Each option of a `multiple` section offers \"Only\" at the end of its row: it chooses that option alone among the\n * `multiple` sections and keeps the choices of single-select sections.\n */\n only?: boolean;\n /** The trigger shows the colors of the first four chosen options before its label, as a quiet hint of what is in view. */\n swatches?: boolean;\n disabled?: boolean;\n class?: string;\n};\n\n/** Section-aware controlled filter with immediate single- and multi-select commits. */\nexport function FilterChip(props: FilterChipProps): JSX.Element {\n const messages = useUiMessages();\n const filterMessages = useFilterMessages();\n const selectedValues = createMemo(() => new Set(props.value));\n const selectedOptions = createMemo(() =>\n props.options.flatMap((section) => section.options).filter((option) => selectedValues().has(option.value)),\n );\n const defaultValues = createMemo(() => new Set(props.defaultValue ?? []));\n const sectionByValue = createMemo(() => {\n const sections = new Map<string, FilterChipSection>();\n for (const section of props.options) {\n for (const option of section.options) sections.set(option.value, section);\n }\n return sections;\n });\n const hasDefault = () => (props.defaultValue?.length ?? 0) > 0;\n const selected = (value: string) => selectedValues().has(value);\n const active = () => props.isActive ?? props.value.length > 0;\n const namedValue = () => (props.showValue && !props.iconOnly && active() ? selectedOptions()[0] : undefined);\n const triggerLabel = () => {\n const first = namedValue();\n if (!first) return props.label;\n return `${props.label}: ${first.label}${props.value.length > 1 ? ` +${props.value.length - 1}` : \"\"}`;\n };\n const atDefault = () => {\n if (!props.defaultValue) return false;\n const current = props.value;\n return current.length === props.defaultValue.length && current.every((value) => defaultValues().has(value));\n };\n const emit = (value: string[]) => props.onValueChange(value);\n const toggle = (value: string) => {\n const section = sectionByValue().get(value);\n if (!section) return;\n const current = props.value;\n if (section.multiple) {\n emit(selected(value) ? current.filter((entry) => entry !== value) : [...current, value]);\n return;\n }\n // A segmented row always keeps one choice, like a SegmentedControl.\n if (section.layout === \"row\" && selected(value)) return;\n const sectionValues = new Set(section.options.map((option) => option.value));\n const otherValues = current.filter((entry) => !sectionValues.has(entry));\n emit(selected(value) ? otherValues : [...otherValues, value]);\n };\n const reset = () => emit(props.defaultValue ? [...props.defaultValue] : []);\n const showReset = () => (hasDefault() && !atDefault()) || (!hasDefault() && props.value.length > 0);\n const swatches = createMemo(() =>\n props.swatches && !props.iconOnly\n ? selectedOptions()\n .flatMap((option) => (option.color ? [option.color] : []))\n .slice(0, 4)\n : [],\n );\n const onlyValue = (value: string) => {\n const kept = props.value.filter((entry) => !sectionByValue().get(entry)?.multiple);\n emit([...kept, value]);\n };\n const toggleSection = (section: FilterChipSection) => {\n const values = section.options.map((option) => option.value);\n const all = values.every((value) => selected(value));\n const others = props.value.filter((entry) => !values.includes(entry));\n emit(all ? others : [...others, ...values]);\n };\n const optionItems = createMemo<DropdownItem[]>(() => {\n const result: DropdownItem[] = [];\n for (const section of props.options) {\n const items = section.options.map((option) => ({\n action: () => toggle(option.value),\n checked: () => props.value.includes(option.value),\n choice: section.multiple ? (\"checkbox\" as const) : (\"radio\" as const),\n class: \"k2b-filter-chip__option\",\n closeOnSelect: false,\n color: option.color,\n icon: !section.multiple ? option.icon : undefined,\n label: option.label,\n trailing: option.trailing,\n secondary:\n props.only && section.multiple\n ? {\n label: filterMessages().only,\n ariaLabel: filterMessages().onlyOption({ label: option.label }),\n action: () => onlyValue(option.value),\n }\n : undefined,\n }));\n // Read when the row renders, so a change of the choice updates the label without rebuilding the rows.\n const all = () => section.options.every((option) => selected(option.value));\n const sectionLabel = section.label;\n const labelAction =\n section.toggleAll && section.multiple && sectionLabel && section.options.length > 0\n ? {\n get label() {\n return all() ? filterMessages().none : filterMessages().all;\n },\n get ariaLabel() {\n return (all() ? filterMessages().noneOf : filterMessages().allOf)({ label: sectionLabel });\n },\n action: () => toggleSection(section),\n }\n : undefined;\n if (section.label || section.layout) result.push({ sectionLabel: section.label, layout: section.layout, labelAction, items });\n else result.push(...items);\n }\n return result;\n });\n const items = createMemo<DropdownItem[]>(() => {\n if (!showReset()) return optionItems();\n return [\n ...optionItems(),\n {\n sectionLabel: filterMessages().filterActions,\n items: [\n {\n action: reset,\n icon: hasDefault() ? \"ti ti-refresh\" : \"ti ti-x\",\n label: hasDefault() ? messages().reset : messages().clear,\n variant: \"danger\",\n },\n ],\n },\n ];\n });\n\n return (\n <Dropdown.Root\n disabled={props.disabled}\n items={items()}\n position={props.position ?? \"bottom-left\"}\n menuClass=\"k2b-filter-chip__menu\"\n label={props.label}\n >\n <Dropdown.Trigger\n appearance={props.variant ? \"button\" : \"plain\"}\n variant={props.variant}\n iconOnly={props.iconOnly}\n class={props.variant ? props.class : `k2b-filter-chip ${props.class ?? \"\"}`}\n data-state={active() ? \"active\" : \"idle\"}\n data-active={active() ? \"true\" : undefined}\n data-icon-only={props.iconOnly ? \"true\" : undefined}\n label={triggerLabel()}\n >\n <Show when={swatches().length > 0} fallback={<i class={props.icon} aria-hidden=\"true\" />}>\n <span class=\"k2b-filter-chip__swatches\" aria-hidden=\"true\">\n <For each={swatches()}>{(color) => <span class=\"k2b-filter-chip__dot\" style={{ \"--k2b-filter-color\": color }} />}</For>\n </span>\n </Show>\n <Show when={!props.iconOnly}>\n <span class=\"k2b-filter-chip__label\">\n {props.label}\n <Show when={namedValue()} fallback={<Show when={!hasDefault() && props.value.length > 0}>{` (${props.value.length})`}</Show>}>\n {(first) => (\n <span class=\"k2b-filter-chip__value\">\n :{\" \"}\n <Show when={first().color}>\n {(color) => <span class=\"k2b-filter-chip__dot\" style={{ \"--k2b-filter-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n {first().label}\n <Show when={props.value.length > 1}>{` +${props.value.length - 1}`}</Show>\n </span>\n )}\n </Show>\n </span>\n <i class=\"ti ti-chevron-down k2b-filter-chip__chevron\" aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n\nexport default FilterChip;\n\nexport type FilterToggleProps = {\n label: JSX.Element;\n icon: string;\n /** Whether the filter is on. An active toggle carries the same tint as an active `FilterChip`. */\n active: boolean;\n /** Link to the URL with the filter switched. The link keeps working without JavaScript. */\n href?: string;\n onClick?: (event: MouseEvent) => void;\n /** The button opens a dialog with more filters, such as a filter builder; it stays pressed while they apply. */\n opensDialog?: boolean;\n /** The button is loading what it opens; it stays enabled so it keeps focus for the dialog to return it. */\n busy?: boolean;\n title?: string;\n disabled?: boolean;\n class?: string;\n};\n\n/**\n * One on/off filter in the chip look: a link marked `aria-current=\"true\"` while active, or a button with\n * `aria-pressed`. Selection changes only colour and background, so neighbouring chips never move.\n */\nexport function FilterToggle(props: FilterToggleProps): JSX.Element {\n const content = () => (\n <>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-filter-chip__label\">{props.label}</span>\n </>\n );\n const className = () => `k2b-filter-chip ${props.class ?? \"\"}`;\n return (\n <Show\n when={props.href !== undefined && !props.disabled}\n fallback={\n <button\n type=\"button\"\n class={className()}\n data-active={props.active ? \"true\" : undefined}\n aria-pressed={props.active}\n aria-haspopup={props.opensDialog ? \"dialog\" : undefined}\n aria-busy={props.busy ? \"true\" : undefined}\n title={props.title}\n disabled={props.disabled}\n onClick={(event) => props.onClick?.(event)}\n >\n {content()}\n </button>\n }\n >\n <a\n class={className()}\n href={props.href}\n data-active={props.active ? \"true\" : undefined}\n aria-current={props.active ? \"true\" : undefined}\n title={props.title}\n onClick={(event) => props.onClick?.(event)}\n >\n {content()}\n </a>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,7 @@ var _tmpl$ = ["<div class=\"k2b-tabs__trailing\">", "</div>"],
11
11
  import { children, createEffect, createMemo, createUniqueId, Show } from "solid-js";
12
12
  import { resolveMaybeAccessor } from "../inputs/field-contract";
13
13
  import { KeyedFor } from "../internal/keyed-for";
14
+ import { revealInScroller } from "../internal/reveal-in-scroller";
14
15
  const tabName = label => typeof label === "string" ? label : undefined;
15
16
  import { useUiMessages } from "../intl/messages";
16
17
  import { createScrollFade } from "../layout/scroll-fade";
@@ -72,10 +73,8 @@ function TabsRoot(props) {
72
73
  const removed = closing !== undefined && !items().some(item => item.value === closing);
73
74
  if (removed) closing = undefined;
74
75
  queueMicrotask(() => {
75
- buttons[index]?.scrollIntoView?.({
76
- block: "nearest",
77
- inline: "nearest"
78
- });
76
+ // Only the list moves: `scrollIntoView` would also scroll every ancestor, so a page would open scrolled down.
77
+ revealInScroller(list, buttons[index]);
79
78
  if (removed) {
80
79
  const target = items().length ? buttons[index] : root?.querySelector(".k2b-tabs__trailing button");
81
80
  target?.focus();
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/Tabs.tsx"],"sourcesContent":["import { children, createEffect, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { KeyedFor } from \"../internal/keyed-for\";\n\nconst tabName = (label: JSX.Element) => (typeof label === \"string\" ? label : undefined);\n\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\n\nexport type TabOption<T extends string = string> = {\n value: T;\n label: JSX.Element;\n icon?: string;\n disabled?: boolean;\n panel?: JSX.Element;\n onClose?: () => void;\n closeLabel?: string;\n};\n\nexport type TabsItemProps<T extends string = string> = Omit<TabOption<T>, \"panel\"> & {\n children?: JSX.Element;\n};\n\ntype TabsItemSlot<T extends string = string> = {\n readonly kind: typeof TABS_ITEM;\n readonly props: TabsItemProps<T>;\n};\n\nexport type TabsProps<T extends string = string> = {\n value: MaybeAccessor<T>;\n onValueChange: (value: T) => void;\n ariaLabel: string;\n orientation?: \"horizontal\" | \"vertical\";\n class?: string;\n variant?: \"line\" | \"pill\";\n trailing?: JSX.Element;\n /** Data-driven alternative to colocated `Tabs.Item` children. */\n options?: readonly TabOption<T>[];\n children?: JSX.Element;\n};\n\ntype TabsComponent = (<T extends string = string>(props: TabsProps<T>) => JSX.Element) & {\n Item: <T extends string = string>(props: TabsItemProps<T>) => JSX.Element;\n};\n\nconst TABS_ITEM = Symbol(\"Tabs.Item\");\n\nconst isTabsItem = <T extends string>(value: unknown): value is TabsItemSlot<T> =>\n !!value && typeof value === \"object\" && \"kind\" in value && value.kind === TABS_ITEM;\n\nconst collectTabsItems = <T extends string>(value: unknown): TabsItemSlot<T>[] => {\n if (Array.isArray(value)) return value.flatMap(collectTabsItems<T>);\n return isTabsItem<T>(value) ? [value] : [];\n};\n\nfunction TabsItem<T extends string = string>(props: TabsItemProps<T>): JSX.Element {\n return { kind: TABS_ITEM, props } satisfies TabsItemSlot<T> as unknown as JSX.Element;\n}\n\n/** Controlled, keyboard-accessible tabs with compositional or data-driven items. */\nfunction TabsRoot<T extends string = string>(props: TabsProps<T>): JSX.Element {\n const messages = useUiMessages();\n let root: HTMLDivElement | undefined;\n let list: HTMLDivElement | undefined;\n createScrollFade(\n () => list,\n () => props.orientation !== \"vertical\",\n );\n const instanceId = `k2b-tabs-${createUniqueId()}`;\n const resolvedChildren = children(() => props.children);\n const trailing = children(() => props.trailing);\n const items = createMemo<readonly TabOption<T>[]>(() => {\n if (props.options) return props.options;\n return collectTabsItems<T>(resolvedChildren.toArray()).map((item) => ({\n value: item.props.value,\n label: item.props.label,\n icon: item.props.icon,\n disabled: item.props.disabled,\n panel: item.props.children,\n onClose: item.props.onClose,\n closeLabel: item.props.closeLabel,\n }));\n });\n const buttons: HTMLButtonElement[] = [];\n let closing: T | undefined;\n const requestClose = (option: TabOption<T>) => {\n closing = option.value;\n option.onClose?.();\n };\n const current = () => resolveMaybeAccessor(props.value);\n const active = createMemo(() => items().find((option) => option.value === current()));\n const activeIndex = createMemo(() =>\n Math.max(\n 0,\n items().findIndex((option) => option.value === current()),\n ),\n );\n const enabled = () =>\n items()\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.disabled);\n const tabStopIndex = createMemo(() => {\n const selected = items().findIndex((option) => option.value === current() && !option.disabled);\n return selected >= 0 ? selected : (enabled()[0]?.index ?? -1);\n });\n createEffect(() => {\n const index = activeIndex();\n const removed = closing !== undefined && !items().some((item) => item.value === closing);\n if (removed) closing = undefined;\n queueMicrotask(() => {\n buttons[index]?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n if (removed) {\n const target = items().length ? buttons[index] : root?.querySelector<HTMLElement>(\".k2b-tabs__trailing button\");\n target?.focus();\n }\n });\n });\n const select = (index: number) => {\n const option = items()[index];\n if (!option || option.disabled) return;\n props.onValueChange(option.value);\n queueMicrotask(() => buttons[index]?.focus());\n };\n const move = (index: number, delta: 1 | -1) => {\n const available = enabled();\n if (available.length === 0) return;\n const currentIndex = available.findIndex((item) => item.index === index);\n const next = available[(currentIndex + delta + available.length) % available.length] ?? available[0];\n if (next) select(next.index);\n };\n\n return (\n <div\n ref={root}\n class={`k2b-tabs ${props.class ?? \"\"}`}\n data-orientation={props.orientation ?? \"horizontal\"}\n data-variant={props.variant ?? \"line\"}\n >\n <div class=\"k2b-tabs__bar\">\n <div\n ref={list}\n data-scroll-fade-mode={props.orientation !== \"vertical\" ? \"both\" : undefined}\n data-scroll-fade-axis=\"horizontal\"\n class=\"k2b-tabs__list\"\n role=\"tablist\"\n aria-label={props.ariaLabel}\n aria-orientation={props.orientation ?? \"horizontal\"}\n >\n {/* Keyed by value: tab objects are rebuilt whenever a tab's props change, and a tab replaced between press and\n release would swallow the click (#2140). */}\n <KeyedFor each={items()} by={(option) => option.value}>\n {(option, index) => {\n const id = () => `${instanceId}-tab-${index()}`;\n const panelId = () => `${instanceId}-panel-${index()}`;\n return (\n <div class=\"k2b-tabs__item\" role=\"presentation\">\n <button\n ref={(element) => {\n buttons[index()] = element;\n }}\n id={id()}\n type=\"button\"\n role=\"tab\"\n aria-selected={current() === option().value}\n aria-controls={option().panel !== undefined ? panelId() : undefined}\n tabIndex={tabStopIndex() === index() ? 0 : -1}\n disabled={option().disabled}\n onClick={() => props.onValueChange(option().value)}\n onKeyDown={(event) => {\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && option().onClose) {\n event.preventDefault();\n requestClose(option());\n return;\n }\n const previous = props.orientation === \"vertical\" ? \"ArrowUp\" : \"ArrowLeft\";\n const next = props.orientation === \"vertical\" ? \"ArrowDown\" : \"ArrowRight\";\n if (event.key === previous || event.key === next) {\n event.preventDefault();\n move(index(), event.key === next ? 1 : -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const available = enabled();\n const target = event.key === \"End\" ? available.at(-1) : available[0];\n if (target) select(target.index);\n }\n }}\n >\n <Show when={option().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <span class={props.variant === \"pill\" ? \"k2b-truncate-fade\" : undefined}>{option().label}</span>\n </button>\n <Show when={option().onClose}>\n <button\n type=\"button\"\n class=\"k2b-tabs__close\"\n aria-label={option().closeLabel ?? messages().closeNamed({ name: tabName(option().label) ?? props.ariaLabel })}\n disabled={option().disabled}\n onClick={() => requestClose(option())}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n );\n }}\n </KeyedFor>\n </div>\n <Show when={trailing()}>\n <div class=\"k2b-tabs__trailing\">{trailing()}</div>\n </Show>\n </div>\n <Show when={active()?.panel !== undefined}>\n <div\n id={`${instanceId}-panel-${activeIndex()}`}\n class=\"k2b-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${instanceId}-tab-${activeIndex()}`}\n tabIndex={0}\n >\n {active()?.panel}\n </div>\n </Show>\n </div>\n );\n}\n\nexport const Tabs = TabsRoot as TabsComponent;\nTabs.Item = TabsItem;\n\nexport default Tabs;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/Tabs.tsx"],"sourcesContent":["import { children, createEffect, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { KeyedFor } from \"../internal/keyed-for\";\nimport { revealInScroller } from \"../internal/reveal-in-scroller\";\n\nconst tabName = (label: JSX.Element) => (typeof label === \"string\" ? label : undefined);\n\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\n\nexport type TabOption<T extends string = string> = {\n value: T;\n label: JSX.Element;\n icon?: string;\n disabled?: boolean;\n panel?: JSX.Element;\n onClose?: () => void;\n closeLabel?: string;\n};\n\nexport type TabsItemProps<T extends string = string> = Omit<TabOption<T>, \"panel\"> & {\n children?: JSX.Element;\n};\n\ntype TabsItemSlot<T extends string = string> = {\n readonly kind: typeof TABS_ITEM;\n readonly props: TabsItemProps<T>;\n};\n\nexport type TabsProps<T extends string = string> = {\n value: MaybeAccessor<T>;\n onValueChange: (value: T) => void;\n ariaLabel: string;\n orientation?: \"horizontal\" | \"vertical\";\n class?: string;\n variant?: \"line\" | \"pill\";\n trailing?: JSX.Element;\n /** Data-driven alternative to colocated `Tabs.Item` children. */\n options?: readonly TabOption<T>[];\n children?: JSX.Element;\n};\n\ntype TabsComponent = (<T extends string = string>(props: TabsProps<T>) => JSX.Element) & {\n Item: <T extends string = string>(props: TabsItemProps<T>) => JSX.Element;\n};\n\nconst TABS_ITEM = Symbol(\"Tabs.Item\");\n\nconst isTabsItem = <T extends string>(value: unknown): value is TabsItemSlot<T> =>\n !!value && typeof value === \"object\" && \"kind\" in value && value.kind === TABS_ITEM;\n\nconst collectTabsItems = <T extends string>(value: unknown): TabsItemSlot<T>[] => {\n if (Array.isArray(value)) return value.flatMap(collectTabsItems<T>);\n return isTabsItem<T>(value) ? [value] : [];\n};\n\nfunction TabsItem<T extends string = string>(props: TabsItemProps<T>): JSX.Element {\n return { kind: TABS_ITEM, props } satisfies TabsItemSlot<T> as unknown as JSX.Element;\n}\n\n/** Controlled, keyboard-accessible tabs with compositional or data-driven items. */\nfunction TabsRoot<T extends string = string>(props: TabsProps<T>): JSX.Element {\n const messages = useUiMessages();\n let root: HTMLDivElement | undefined;\n let list: HTMLDivElement | undefined;\n createScrollFade(\n () => list,\n () => props.orientation !== \"vertical\",\n );\n const instanceId = `k2b-tabs-${createUniqueId()}`;\n const resolvedChildren = children(() => props.children);\n const trailing = children(() => props.trailing);\n const items = createMemo<readonly TabOption<T>[]>(() => {\n if (props.options) return props.options;\n return collectTabsItems<T>(resolvedChildren.toArray()).map((item) => ({\n value: item.props.value,\n label: item.props.label,\n icon: item.props.icon,\n disabled: item.props.disabled,\n panel: item.props.children,\n onClose: item.props.onClose,\n closeLabel: item.props.closeLabel,\n }));\n });\n const buttons: HTMLButtonElement[] = [];\n let closing: T | undefined;\n const requestClose = (option: TabOption<T>) => {\n closing = option.value;\n option.onClose?.();\n };\n const current = () => resolveMaybeAccessor(props.value);\n const active = createMemo(() => items().find((option) => option.value === current()));\n const activeIndex = createMemo(() =>\n Math.max(\n 0,\n items().findIndex((option) => option.value === current()),\n ),\n );\n const enabled = () =>\n items()\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.disabled);\n const tabStopIndex = createMemo(() => {\n const selected = items().findIndex((option) => option.value === current() && !option.disabled);\n return selected >= 0 ? selected : (enabled()[0]?.index ?? -1);\n });\n createEffect(() => {\n const index = activeIndex();\n const removed = closing !== undefined && !items().some((item) => item.value === closing);\n if (removed) closing = undefined;\n queueMicrotask(() => {\n // Only the list moves: `scrollIntoView` would also scroll every ancestor, so a page would open scrolled down.\n revealInScroller(list, buttons[index]);\n if (removed) {\n const target = items().length ? buttons[index] : root?.querySelector<HTMLElement>(\".k2b-tabs__trailing button\");\n target?.focus();\n }\n });\n });\n const select = (index: number) => {\n const option = items()[index];\n if (!option || option.disabled) return;\n props.onValueChange(option.value);\n queueMicrotask(() => buttons[index]?.focus());\n };\n const move = (index: number, delta: 1 | -1) => {\n const available = enabled();\n if (available.length === 0) return;\n const currentIndex = available.findIndex((item) => item.index === index);\n const next = available[(currentIndex + delta + available.length) % available.length] ?? available[0];\n if (next) select(next.index);\n };\n\n return (\n <div\n ref={root}\n class={`k2b-tabs ${props.class ?? \"\"}`}\n data-orientation={props.orientation ?? \"horizontal\"}\n data-variant={props.variant ?? \"line\"}\n >\n <div class=\"k2b-tabs__bar\">\n <div\n ref={list}\n data-scroll-fade-mode={props.orientation !== \"vertical\" ? \"both\" : undefined}\n data-scroll-fade-axis=\"horizontal\"\n class=\"k2b-tabs__list\"\n role=\"tablist\"\n aria-label={props.ariaLabel}\n aria-orientation={props.orientation ?? \"horizontal\"}\n >\n {/* Keyed by value: tab objects are rebuilt whenever a tab's props change, and a tab replaced between press and\n release would swallow the click (#2140). */}\n <KeyedFor each={items()} by={(option) => option.value}>\n {(option, index) => {\n const id = () => `${instanceId}-tab-${index()}`;\n const panelId = () => `${instanceId}-panel-${index()}`;\n return (\n <div class=\"k2b-tabs__item\" role=\"presentation\">\n <button\n ref={(element) => {\n buttons[index()] = element;\n }}\n id={id()}\n type=\"button\"\n role=\"tab\"\n aria-selected={current() === option().value}\n aria-controls={option().panel !== undefined ? panelId() : undefined}\n tabIndex={tabStopIndex() === index() ? 0 : -1}\n disabled={option().disabled}\n onClick={() => props.onValueChange(option().value)}\n onKeyDown={(event) => {\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && option().onClose) {\n event.preventDefault();\n requestClose(option());\n return;\n }\n const previous = props.orientation === \"vertical\" ? \"ArrowUp\" : \"ArrowLeft\";\n const next = props.orientation === \"vertical\" ? \"ArrowDown\" : \"ArrowRight\";\n if (event.key === previous || event.key === next) {\n event.preventDefault();\n move(index(), event.key === next ? 1 : -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const available = enabled();\n const target = event.key === \"End\" ? available.at(-1) : available[0];\n if (target) select(target.index);\n }\n }}\n >\n <Show when={option().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <span class={props.variant === \"pill\" ? \"k2b-truncate-fade\" : undefined}>{option().label}</span>\n </button>\n <Show when={option().onClose}>\n <button\n type=\"button\"\n class=\"k2b-tabs__close\"\n aria-label={option().closeLabel ?? messages().closeNamed({ name: tabName(option().label) ?? props.ariaLabel })}\n disabled={option().disabled}\n onClick={() => requestClose(option())}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n );\n }}\n </KeyedFor>\n </div>\n <Show when={trailing()}>\n <div class=\"k2b-tabs__trailing\">{trailing()}</div>\n </Show>\n </div>\n <Show when={active()?.panel !== undefined}>\n <div\n id={`${instanceId}-panel-${activeIndex()}`}\n class=\"k2b-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${instanceId}-tab-${activeIndex()}`}\n tabIndex={0}\n >\n {active()?.panel}\n </div>\n </Show>\n </div>\n );\n}\n\nexport const Tabs = TabsRoot as TabsComponent;\nTabs.Item = TabsItem;\n\nexport default Tabs;\n"],"mappings":"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","ignoreList":[]}