@salt-ds/lab 1.0.0-alpha.26 → 1.0.0-alpha.27

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 (254) hide show
  1. package/css/salt-lab.css +378 -413
  2. package/dist-cjs/combo-box-next/ComboBoxNext.js +303 -166
  3. package/dist-cjs/combo-box-next/ComboBoxNext.js.map +1 -1
  4. package/dist-cjs/combo-box-next/useComboBoxNext.js +55 -0
  5. package/dist-cjs/combo-box-next/useComboBoxNext.js.map +1 -0
  6. package/dist-cjs/dropdown/DropdownBase.js +1 -1
  7. package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
  8. package/dist-cjs/dropdown-next/DropdownNext.css.js +1 -1
  9. package/dist-cjs/dropdown-next/DropdownNext.js +333 -169
  10. package/dist-cjs/dropdown-next/DropdownNext.js.map +1 -1
  11. package/dist-cjs/editable-label/EditableLabel.js +1 -1
  12. package/dist-cjs/editable-label/EditableLabel.js.map +1 -1
  13. package/dist-cjs/index.js +8 -10
  14. package/dist-cjs/index.js.map +1 -1
  15. package/dist-cjs/layer-layout/LayerLayout.js +0 -1
  16. package/dist-cjs/layer-layout/LayerLayout.js.map +1 -1
  17. package/dist-cjs/list-control/ListControlContext.js +36 -0
  18. package/dist-cjs/list-control/ListControlContext.js.map +1 -0
  19. package/dist-cjs/list-control/ListControlState.js +193 -0
  20. package/dist-cjs/list-control/ListControlState.js.map +1 -0
  21. package/dist-cjs/navigation-item/ConditionalWrapper.js +2 -4
  22. package/dist-cjs/navigation-item/ConditionalWrapper.js.map +1 -1
  23. package/dist-cjs/navigation-item/ExpansionIcon.js +2 -4
  24. package/dist-cjs/navigation-item/ExpansionIcon.js.map +1 -1
  25. package/dist-cjs/navigation-item/NavigationItem.css.js +1 -1
  26. package/dist-cjs/navigation-item/NavigationItem.js +4 -7
  27. package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
  28. package/dist-cjs/option/Option.css.js +6 -0
  29. package/dist-cjs/option/Option.css.js.map +1 -0
  30. package/dist-cjs/option/Option.js +113 -0
  31. package/dist-cjs/option/Option.js.map +1 -0
  32. package/dist-cjs/option/OptionGroup.css.js +6 -0
  33. package/dist-cjs/option/OptionGroup.css.js.map +1 -0
  34. package/dist-cjs/option/OptionGroup.js +44 -0
  35. package/dist-cjs/option/OptionGroup.js.map +1 -0
  36. package/dist-cjs/option/OptionList.css.js +6 -0
  37. package/dist-cjs/option/OptionList.css.js.map +1 -0
  38. package/dist-cjs/option/OptionList.js +40 -0
  39. package/dist-cjs/option/OptionList.js.map +1 -0
  40. package/dist-cjs/scrim/Scrim.css.js +1 -1
  41. package/dist-cjs/scrim/Scrim.js +10 -140
  42. package/dist-cjs/scrim/Scrim.js.map +1 -1
  43. package/dist-cjs/tokenized-input/internal/InputPill.js +13 -9
  44. package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
  45. package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js +6 -0
  46. package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js.map +1 -0
  47. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js +244 -0
  48. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -0
  49. package/dist-cjs/tokenized-input-next/internal/InputPill.css.js +6 -0
  50. package/dist-cjs/tokenized-input-next/internal/InputPill.css.js.map +1 -0
  51. package/dist-cjs/tokenized-input-next/internal/InputPill.js +83 -0
  52. package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -0
  53. package/dist-cjs/tokenized-input-next/internal/calcFirstHiddenIndex.js +22 -0
  54. package/dist-cjs/tokenized-input-next/internal/calcFirstHiddenIndex.js.map +1 -0
  55. package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js +37 -0
  56. package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -0
  57. package/dist-cjs/tokenized-input-next/internal/useWidth.js +48 -0
  58. package/dist-cjs/tokenized-input-next/internal/useWidth.js.map +1 -0
  59. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js +479 -0
  60. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -0
  61. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js +1 -1
  62. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  63. package/dist-cjs/tree/Tree.js +1 -2
  64. package/dist-cjs/tree/Tree.js.map +1 -1
  65. package/dist-es/combo-box-next/ComboBoxNext.js +306 -169
  66. package/dist-es/combo-box-next/ComboBoxNext.js.map +1 -1
  67. package/dist-es/combo-box-next/useComboBoxNext.js +51 -0
  68. package/dist-es/combo-box-next/useComboBoxNext.js.map +1 -0
  69. package/dist-es/dropdown/DropdownBase.js +1 -1
  70. package/dist-es/dropdown/DropdownBase.js.map +1 -1
  71. package/dist-es/dropdown-next/DropdownNext.css.js +1 -1
  72. package/dist-es/dropdown-next/DropdownNext.js +332 -168
  73. package/dist-es/dropdown-next/DropdownNext.js.map +1 -1
  74. package/dist-es/editable-label/EditableLabel.js +1 -1
  75. package/dist-es/editable-label/EditableLabel.js.map +1 -1
  76. package/dist-es/index.js +4 -5
  77. package/dist-es/index.js.map +1 -1
  78. package/dist-es/layer-layout/LayerLayout.js +0 -1
  79. package/dist-es/layer-layout/LayerLayout.js.map +1 -1
  80. package/dist-es/list-control/ListControlContext.js +31 -0
  81. package/dist-es/list-control/ListControlContext.js.map +1 -0
  82. package/dist-es/list-control/ListControlState.js +189 -0
  83. package/dist-es/list-control/ListControlState.js.map +1 -0
  84. package/dist-es/navigation-item/ConditionalWrapper.js +2 -4
  85. package/dist-es/navigation-item/ConditionalWrapper.js.map +1 -1
  86. package/dist-es/navigation-item/ExpansionIcon.js +2 -4
  87. package/dist-es/navigation-item/ExpansionIcon.js.map +1 -1
  88. package/dist-es/navigation-item/NavigationItem.css.js +1 -1
  89. package/dist-es/navigation-item/NavigationItem.js +4 -7
  90. package/dist-es/navigation-item/NavigationItem.js.map +1 -1
  91. package/dist-es/option/Option.css.js +4 -0
  92. package/dist-es/option/Option.css.js.map +1 -0
  93. package/dist-es/option/Option.js +109 -0
  94. package/dist-es/option/Option.js.map +1 -0
  95. package/dist-es/option/OptionGroup.css.js +4 -0
  96. package/dist-es/option/OptionGroup.css.js.map +1 -0
  97. package/dist-es/option/OptionGroup.js +40 -0
  98. package/dist-es/option/OptionGroup.js.map +1 -0
  99. package/dist-es/option/OptionList.css.js +4 -0
  100. package/dist-es/option/OptionList.css.js.map +1 -0
  101. package/dist-es/option/OptionList.js +36 -0
  102. package/dist-es/option/OptionList.js.map +1 -0
  103. package/dist-es/scrim/Scrim.css.js +1 -1
  104. package/dist-es/scrim/Scrim.js +12 -138
  105. package/dist-es/scrim/Scrim.js.map +1 -1
  106. package/dist-es/tokenized-input/internal/InputPill.js +15 -11
  107. package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
  108. package/dist-es/tokenized-input-next/TokenizedInputNext.css.js +4 -0
  109. package/dist-es/tokenized-input-next/TokenizedInputNext.css.js.map +1 -0
  110. package/dist-es/tokenized-input-next/TokenizedInputNext.js +240 -0
  111. package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -0
  112. package/dist-es/tokenized-input-next/internal/InputPill.css.js +4 -0
  113. package/dist-es/tokenized-input-next/internal/InputPill.css.js.map +1 -0
  114. package/dist-es/tokenized-input-next/internal/InputPill.js +79 -0
  115. package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -0
  116. package/dist-es/tokenized-input-next/internal/calcFirstHiddenIndex.js +18 -0
  117. package/dist-es/tokenized-input-next/internal/calcFirstHiddenIndex.js.map +1 -0
  118. package/dist-es/tokenized-input-next/internal/useResizeObserver.js +33 -0
  119. package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -0
  120. package/dist-es/tokenized-input-next/internal/useWidth.js +42 -0
  121. package/dist-es/tokenized-input-next/internal/useWidth.js.map +1 -0
  122. package/dist-es/tokenized-input-next/useTokenizedInputNext.js +471 -0
  123. package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -0
  124. package/dist-es/toolbar/overflow-panel/OverflowPanel.js +1 -1
  125. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  126. package/dist-es/tree/Tree.js +1 -2
  127. package/dist-es/tree/Tree.js.map +1 -1
  128. package/dist-types/combo-box-next/ComboBoxNext.d.ts +7 -80
  129. package/dist-types/combo-box-next/useComboBoxNext.d.ts +31 -0
  130. package/dist-types/dropdown-next/DropdownNext.d.ts +25 -27
  131. package/dist-types/index.d.ts +2 -2
  132. package/dist-types/list-control/ListControlContext.d.ts +20 -0
  133. package/dist-types/list-control/ListControlState.d.ts +68 -0
  134. package/dist-types/navigation-item/ConditionalWrapper.d.ts +1 -1
  135. package/dist-types/navigation-item/ExpansionIcon.d.ts +1 -1
  136. package/dist-types/option/Option.d.ts +20 -0
  137. package/dist-types/option/OptionGroup.d.ts +12 -0
  138. package/dist-types/option/OptionList.d.ts +5 -0
  139. package/dist-types/option/index.d.ts +2 -0
  140. package/dist-types/scrim/Scrim.d.ts +6 -61
  141. package/dist-types/scrim/index.d.ts +0 -1
  142. package/dist-types/tokenized-input/internal/InputPill.d.ts +7 -5
  143. package/dist-types/tokenized-input-next/TokenizedInputNext.d.ts +51 -0
  144. package/dist-types/tokenized-input-next/index.d.ts +2 -0
  145. package/dist-types/tokenized-input-next/internal/InputPill.d.ts +29 -0
  146. package/dist-types/tokenized-input-next/internal/calcFirstHiddenIndex.d.ts +4 -0
  147. package/dist-types/tokenized-input-next/internal/useResizeObserver.d.ts +6 -0
  148. package/dist-types/tokenized-input-next/internal/useWidth.d.ts +7 -0
  149. package/dist-types/tokenized-input-next/useTokenizedInputNext.d.ts +47 -0
  150. package/package.json +2 -2
  151. package/dist-cjs/combo-box-next/ComboBoxNext.css.js +0 -6
  152. package/dist-cjs/combo-box-next/ComboBoxNext.css.js.map +0 -1
  153. package/dist-cjs/combo-box-next/useComboBox.js +0 -147
  154. package/dist-cjs/combo-box-next/useComboBox.js.map +0 -1
  155. package/dist-cjs/combo-box-next/useComboboxPortal.js +0 -75
  156. package/dist-cjs/combo-box-next/useComboboxPortal.js.map +0 -1
  157. package/dist-cjs/combo-box-next/utils.js +0 -36
  158. package/dist-cjs/combo-box-next/utils.js.map +0 -1
  159. package/dist-cjs/dropdown-next/useDropdownNext.js +0 -188
  160. package/dist-cjs/dropdown-next/useDropdownNext.js.map +0 -1
  161. package/dist-cjs/focus-manager/FocusManager.js +0 -158
  162. package/dist-cjs/focus-manager/FocusManager.js.map +0 -1
  163. package/dist-cjs/focus-manager/internal/findAllTabbableElements.js +0 -45
  164. package/dist-cjs/focus-manager/internal/findAllTabbableElements.js.map +0 -1
  165. package/dist-cjs/focus-manager/internal/useReturnFocus.js +0 -59
  166. package/dist-cjs/focus-manager/internal/useReturnFocus.js.map +0 -1
  167. package/dist-cjs/pill/ClosablePill.js +0 -61
  168. package/dist-cjs/pill/ClosablePill.js.map +0 -1
  169. package/dist-cjs/pill/Pill.css.js +0 -6
  170. package/dist-cjs/pill/Pill.css.js.map +0 -1
  171. package/dist-cjs/pill/Pill.js +0 -49
  172. package/dist-cjs/pill/Pill.js.map +0 -1
  173. package/dist-cjs/pill/PillBase.js +0 -133
  174. package/dist-cjs/pill/PillBase.js.map +0 -1
  175. package/dist-cjs/pill/SelectablePill.js +0 -55
  176. package/dist-cjs/pill/SelectablePill.js.map +0 -1
  177. package/dist-cjs/pill/constants.js +0 -8
  178. package/dist-cjs/pill/constants.js.map +0 -1
  179. package/dist-cjs/pill/internal/DeleteButton.js +0 -37
  180. package/dist-cjs/pill/internal/DeleteButton.js.map +0 -1
  181. package/dist-cjs/pill/internal/DivButton.js +0 -68
  182. package/dist-cjs/pill/internal/DivButton.js.map +0 -1
  183. package/dist-cjs/pill/internal/PillCheckbox.css.js +0 -6
  184. package/dist-cjs/pill/internal/PillCheckbox.css.js.map +0 -1
  185. package/dist-cjs/pill/internal/PillCheckbox.js +0 -27
  186. package/dist-cjs/pill/internal/PillCheckbox.js.map +0 -1
  187. package/dist-cjs/pill-next/PillNext.css.js +0 -6
  188. package/dist-cjs/pill-next/PillNext.css.js.map +0 -1
  189. package/dist-cjs/pill-next/PillNext.js +0 -60
  190. package/dist-cjs/pill-next/PillNext.js.map +0 -1
  191. package/dist-cjs/scrim/ScrimContext.js +0 -13
  192. package/dist-cjs/scrim/ScrimContext.js.map +0 -1
  193. package/dist-cjs/scrim/internal/PreventFocus.js +0 -39
  194. package/dist-cjs/scrim/internal/PreventFocus.js.map +0 -1
  195. package/dist-es/combo-box-next/ComboBoxNext.css.js +0 -4
  196. package/dist-es/combo-box-next/ComboBoxNext.css.js.map +0 -1
  197. package/dist-es/combo-box-next/useComboBox.js +0 -143
  198. package/dist-es/combo-box-next/useComboBox.js.map +0 -1
  199. package/dist-es/combo-box-next/useComboboxPortal.js +0 -71
  200. package/dist-es/combo-box-next/useComboboxPortal.js.map +0 -1
  201. package/dist-es/combo-box-next/utils.js +0 -31
  202. package/dist-es/combo-box-next/utils.js.map +0 -1
  203. package/dist-es/dropdown-next/useDropdownNext.js +0 -184
  204. package/dist-es/dropdown-next/useDropdownNext.js.map +0 -1
  205. package/dist-es/focus-manager/FocusManager.js +0 -154
  206. package/dist-es/focus-manager/FocusManager.js.map +0 -1
  207. package/dist-es/focus-manager/internal/findAllTabbableElements.js +0 -41
  208. package/dist-es/focus-manager/internal/findAllTabbableElements.js.map +0 -1
  209. package/dist-es/focus-manager/internal/useReturnFocus.js +0 -55
  210. package/dist-es/focus-manager/internal/useReturnFocus.js.map +0 -1
  211. package/dist-es/pill/ClosablePill.js +0 -57
  212. package/dist-es/pill/ClosablePill.js.map +0 -1
  213. package/dist-es/pill/Pill.css.js +0 -4
  214. package/dist-es/pill/Pill.css.js.map +0 -1
  215. package/dist-es/pill/Pill.js +0 -45
  216. package/dist-es/pill/Pill.js.map +0 -1
  217. package/dist-es/pill/PillBase.js +0 -129
  218. package/dist-es/pill/PillBase.js.map +0 -1
  219. package/dist-es/pill/SelectablePill.js +0 -51
  220. package/dist-es/pill/SelectablePill.js.map +0 -1
  221. package/dist-es/pill/constants.js +0 -4
  222. package/dist-es/pill/constants.js.map +0 -1
  223. package/dist-es/pill/internal/DeleteButton.js +0 -33
  224. package/dist-es/pill/internal/DeleteButton.js.map +0 -1
  225. package/dist-es/pill/internal/DivButton.js +0 -64
  226. package/dist-es/pill/internal/DivButton.js.map +0 -1
  227. package/dist-es/pill/internal/PillCheckbox.css.js +0 -4
  228. package/dist-es/pill/internal/PillCheckbox.css.js.map +0 -1
  229. package/dist-es/pill/internal/PillCheckbox.js +0 -23
  230. package/dist-es/pill/internal/PillCheckbox.js.map +0 -1
  231. package/dist-es/pill-next/PillNext.css.js +0 -4
  232. package/dist-es/pill-next/PillNext.css.js.map +0 -1
  233. package/dist-es/pill-next/PillNext.js +0 -52
  234. package/dist-es/pill-next/PillNext.js.map +0 -1
  235. package/dist-es/scrim/ScrimContext.js +0 -9
  236. package/dist-es/scrim/ScrimContext.js.map +0 -1
  237. package/dist-es/scrim/internal/PreventFocus.js +0 -35
  238. package/dist-es/scrim/internal/PreventFocus.js.map +0 -1
  239. package/dist-types/combo-box-next/useComboBox.d.ts +0 -44
  240. package/dist-types/combo-box-next/useComboboxPortal.d.ts +0 -22
  241. package/dist-types/combo-box-next/utils.d.ts +0 -7
  242. package/dist-types/dropdown-next/useDropdownNext.d.ts +0 -50
  243. package/dist-types/pill/ClosablePill.d.ts +0 -8
  244. package/dist-types/pill/Pill.d.ts +0 -15
  245. package/dist-types/pill/PillBase.d.ts +0 -52
  246. package/dist-types/pill/SelectablePill.d.ts +0 -17
  247. package/dist-types/pill/constants.d.ts +0 -1
  248. package/dist-types/pill/index.d.ts +0 -3
  249. package/dist-types/pill/internal/DeleteButton.d.ts +0 -8
  250. package/dist-types/pill/internal/DivButton.d.ts +0 -12
  251. package/dist-types/pill/internal/PillCheckbox.d.ts +0 -3
  252. package/dist-types/pill-next/PillNext.d.ts +0 -4
  253. package/dist-types/pill-next/index.d.ts +0 -1
  254. package/dist-types/scrim/ScrimContext.d.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.js","sources":["../src/tree/Tree.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n ForwardedRef,\n forwardRef,\n isValidElement,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\n\nimport {\n calcPreferredHeight,\n closestListItemIndex,\n CollectionIndexer,\n CollectionItem,\n GROUP_SELECTION_NONE,\n isSelected,\n SelectHandler,\n SelectionChangeHandler,\n SelectionStrategy,\n SingleSelectionStrategy,\n useAutoSizer,\n useCollectionItems,\n} from \"../common-hooks\";\nimport { TreeProps } from \"./treeTypes\";\n\nimport { useTree } from \"./useTree\";\nimport { TreeNode } from \"./TreeNode\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\nimport treeCss from \"./Tree.css\";\n\nconst withBaseName = makePrefixer(\"saltTree\");\n\nconst getSelectedItemsFromSource = (\n source: any[],\n selectionStrategy: SelectionStrategy,\n result: any[] = []\n) => {\n const isSingleSelection =\n selectionStrategy === \"default\" || selectionStrategy === \"deselectable\";\n for (let item of source) {\n if (item.selected === true) {\n result.push(item);\n if (isSingleSelection) {\n break;\n }\n }\n if (item.childNodes) {\n getSelectedItemsFromSource(item.childNodes, selectionStrategy, result);\n if (isSingleSelection && result.length === 1) {\n break;\n }\n }\n }\n\n return isSingleSelection ? result[0] : result.length > 0 ? result : undefined;\n};\n\nexport const Tree = forwardRef(function Tree<\n Item,\n Selection extends SelectionStrategy = \"deselectable\"\n>(\n {\n className,\n defaultSelected,\n disabled,\n groupSelection = GROUP_SELECTION_NONE,\n height,\n id: idProp,\n onHighlight,\n onToggle,\n onSelect,\n onSelectionChange,\n revealSelected,\n selected: selectedProp,\n selectionStrategy,\n source,\n style: styleProp,\n width,\n ...htmlAttributes\n }: TreeProps<Item, Selection>,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree\",\n css: treeCss,\n window: targetWindow,\n });\n\n const id = useIdMemo(idProp);\n const rootRef = useRef(null);\n const contentRef = useRef(null);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n source,\n options: {\n noChildrenLabel: \"No children available\",\n revealSelected: revealSelected\n ? selectedProp ?? defaultSelected ?? false\n : undefined,\n },\n });\n\n //------------- from original List\n const preferredHeight =\n height ??\n calcPreferredHeight({\n displayedItemCount: 10,\n itemCount: collectionHook.data.length,\n itemHeight: 36,\n // getItemHeight,\n // itemGapSize,\n });\n\n const autoSize = useAutoSizer<HTMLDivElement>({\n containerRef: rootRef,\n responsive: width === undefined || height === undefined,\n height: preferredHeight,\n width,\n });\n //---------------\n\n const handleSelect = useCallback<SelectHandler<CollectionItem<Item>>>(\n (evt, selectedItem) => {\n if (onSelect) {\n if (isValidElement(selectedItem.value)) {\n onSelect(evt, selectedItem.label as any);\n } else if (selectedItem.value !== null) {\n onSelect(evt, selectedItem.value);\n }\n }\n },\n [onSelect]\n );\n\n const handleSelectionChange = useCallback<\n SelectionChangeHandler<CollectionItem<Item>, Selection>\n >(\n (evt, selected) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n if (onSelectionChange) {\n onSelectionChange(\n evt,\n Array.isArray(selected)\n ? (selected.map((s) => s.value) as returnType)\n : selected && (selected.value as returnType)\n );\n }\n },\n [onSelectionChange]\n );\n\n // const getSelected = (\n // sel: Item | null | Item[]\n // ):\n // | undefined\n // | (Selection extends SingleSelectionStrategy\n // ? CollectionItem<Item> | null\n // : CollectionItem<Item>[]) => {\n // if (sel !== undefined) {\n // return collectionHook.itemToCollectionItem<Selection, typeof sel>(sel);\n // } else if (Array.isArray(source)) {\n // const selected = getSelectedItemsFromSource(\n // source,\n // selectionStrategy ?? \"default\"\n // );\n // return Array.isArray(selected)\n // ? collectionHook.itemToCollectionItem(selected)\n // : selected\n // ? collectionHook.toCollectionItem(selected)\n // : undefined;\n // }\n // };\n\n const {\n focusVisible,\n highlightedIdx,\n highlightItemAtIndex,\n listHandlers,\n listProps,\n listItemHandlers,\n selected,\n } = useTree<Item, Selection>({\n collectionHook,\n containerRef: rootRef,\n contentRef,\n // Note this isn't enough for a Tree, because of nested structure\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n disabled,\n groupSelection,\n onHighlight,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n onToggle,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof selectedProp\n >(selectedProp),\n selectionStrategy,\n });\n\n // TODO move into useTree (see useList)\n const defaultItemHandlers = {\n onMouseEnter: (evt: MouseEvent) => {\n // if (!isScrolling.current) {\n const idx = closestListItemIndex(evt.target as HTMLElement);\n highlightItemAtIndex(idx!);\n // onMouseEnterListItem && onMouseEnterListItem(evt, idx);\n // }\n },\n };\n\n const propsCommonToAllListItems = {\n ...defaultItemHandlers,\n ...listItemHandlers,\n isLeaf: true,\n role: \"treeitem\",\n };\n // const allowGroupSelect = groupSelectionEnabled(groupSelection);\n const allowGroupSelect = false;\n\n /**\n * Add a ListItem from source item\n */\n function addLeafNode(\n list: ReactElement[],\n item: CollectionItem<Item>,\n idx: CollectionIndexer\n ) {\n const itemProps = {\n \"aria-disabled\": disabled || item.disabled,\n \"aria-level\": item.level,\n \"data-idx\": idx.value,\n description: item.description,\n id: item.id,\n key: item.id,\n highlighted: idx.value === highlightedIdx || undefined,\n selected: isSelected<Item>(selected, item),\n className: clsx({\n focusVisible: focusVisible === idx.value,\n }),\n };\n\n list.push(\n <TreeNode\n {...propsCommonToAllListItems}\n {...itemProps}\n label={item.label}\n >\n {/* {item.icon ? <span className={`${classBase}Node-icon`} /> : null} */}\n </TreeNode>\n );\n idx.value += 1;\n }\n\n function addGroupNode(\n list: ReactElement[],\n items: CollectionItem<Item>[],\n idx: CollectionIndexer,\n id: string,\n title: string\n ) {\n const { value: i } = idx;\n const item = items[i];\n idx.value += 1;\n list.push(\n <TreeNode\n {...defaultItemHandlers}\n {...listItemHandlers}\n aria-disabled={disabled || item.disabled}\n aria-expanded={item.expanded}\n aria-level={item.level}\n className={clsx({\n focusVisible: focusVisible === i,\n [withBaseName(\"toggle\")]: !allowGroupSelect,\n })}\n // data-icon={child.icon}\n data-idx={i}\n data-selectable\n description={item.description}\n highlighted={i === highlightedIdx}\n id={id}\n key={`header-${i}`}\n label={title}\n selected={isSelected<Item>(selected, item)}\n >\n {item.expanded ? (\n <ul className={withBaseName(\"child-nodes\")} role=\"group\">\n {renderItems(items, idx, item.level! + 1)}\n </ul>\n ) : null}\n </TreeNode>\n );\n }\n\n const renderItems = (\n items: CollectionItem<Item>[],\n idx: CollectionIndexer = { value: 0 },\n level = 1\n ): ReactElement[] => {\n const listItems: ReactElement[] = [];\n while (idx.value < items.length) {\n const item = items[idx.value];\n if (item.level! < level) {\n break;\n }\n if (item.childNodes) {\n addGroupNode(listItems, items, idx, item.id!, item.label!);\n } else {\n addLeafNode(listItems, item, idx);\n }\n }\n\n return listItems;\n };\n\n function renderEmpty() {\n // if (emptyMessage || showEmptyMessage) {\n // return (\n // <span className={withBaseName(\"empty-message\")}>\n // {emptyMessage ?? defaultEmptyMessage}\n // </span>\n // );\n // } else {\n return null;\n // }\n }\n\n const renderContent = () => {\n if (collectionHook.data.length) {\n return renderItems(collectionHook.data);\n } else {\n renderEmpty();\n }\n };\n\n return (\n <div\n {...htmlAttributes}\n {...listHandlers}\n {...listProps}\n className={clsx(withBaseName(), className)}\n id={`Tree-${id}`}\n ref={useForkRef(rootRef, forwardedRef)}\n style={{ ...styleProp, ...autoSize }}\n tabIndex={0}\n >\n <ul\n className={withBaseName(\"scrollingContentContainer\")}\n ref={contentRef}\n role=\"tree\"\n // style={{ height: contentHeight }}\n >\n {renderContent()}\n </ul>\n </div>\n );\n});\n"],"names":["Tree","treeCss","selected","id"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.js","sources":["../src/tree/Tree.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n ForwardedRef,\n forwardRef,\n isValidElement,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\n\nimport {\n calcPreferredHeight,\n closestListItemIndex,\n CollectionIndexer,\n CollectionItem,\n GROUP_SELECTION_NONE,\n isSelected,\n SelectHandler,\n SelectionChangeHandler,\n SelectionStrategy,\n SingleSelectionStrategy,\n useAutoSizer,\n useCollectionItems,\n} from \"../common-hooks\";\nimport { TreeProps } from \"./treeTypes\";\n\nimport { useTree } from \"./useTree\";\nimport { TreeNode } from \"./TreeNode\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\nimport treeCss from \"./Tree.css\";\n\nconst withBaseName = makePrefixer(\"saltTree\");\n\nconst getSelectedItemsFromSource = (\n source: any[],\n selectionStrategy: SelectionStrategy,\n result: any[] = []\n) => {\n const isSingleSelection =\n selectionStrategy === \"default\" || selectionStrategy === \"deselectable\";\n for (let item of source) {\n if (item.selected === true) {\n result.push(item);\n if (isSingleSelection) {\n break;\n }\n }\n if (item.childNodes) {\n getSelectedItemsFromSource(item.childNodes, selectionStrategy, result);\n if (isSingleSelection && result.length === 1) {\n break;\n }\n }\n }\n\n return isSingleSelection ? result[0] : result.length > 0 ? result : undefined;\n};\n\nexport const Tree = forwardRef(function Tree<\n Item,\n Selection extends SelectionStrategy = \"deselectable\"\n>(\n {\n className,\n defaultSelected,\n disabled,\n groupSelection = GROUP_SELECTION_NONE,\n height,\n id: idProp,\n onHighlight,\n onToggle,\n onSelect,\n onSelectionChange,\n revealSelected,\n selected: selectedProp,\n selectionStrategy,\n source,\n style: styleProp,\n width,\n ...htmlAttributes\n }: TreeProps<Item, Selection>,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree\",\n css: treeCss,\n window: targetWindow,\n });\n\n const id = useIdMemo(idProp);\n const rootRef = useRef(null);\n const contentRef = useRef(null);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n source,\n options: {\n noChildrenLabel: \"No children available\",\n revealSelected: revealSelected\n ? Boolean(selectedProp) || Boolean(defaultSelected) || false\n : undefined,\n },\n });\n\n //------------- from original List\n const preferredHeight =\n height ??\n calcPreferredHeight({\n displayedItemCount: 10,\n itemCount: collectionHook.data.length,\n itemHeight: 36,\n // getItemHeight,\n // itemGapSize,\n });\n\n const autoSize = useAutoSizer<HTMLDivElement>({\n containerRef: rootRef,\n responsive: width === undefined || height === undefined,\n height: preferredHeight,\n width,\n });\n //---------------\n\n const handleSelect = useCallback<SelectHandler<CollectionItem<Item>>>(\n (evt, selectedItem) => {\n if (onSelect) {\n if (isValidElement(selectedItem.value)) {\n onSelect(evt, selectedItem.label as any);\n } else if (selectedItem.value !== null) {\n onSelect(evt, selectedItem.value);\n }\n }\n },\n [onSelect]\n );\n\n const handleSelectionChange = useCallback<\n SelectionChangeHandler<CollectionItem<Item>, Selection>\n >(\n (evt, selected) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n if (onSelectionChange) {\n onSelectionChange(\n evt,\n Array.isArray(selected)\n ? (selected.map((s) => s.value) as returnType)\n : selected && (selected.value as returnType)\n );\n }\n },\n [onSelectionChange]\n );\n\n // const getSelected = (\n // sel: Item | null | Item[]\n // ):\n // | undefined\n // | (Selection extends SingleSelectionStrategy\n // ? CollectionItem<Item> | null\n // : CollectionItem<Item>[]) => {\n // if (sel !== undefined) {\n // return collectionHook.itemToCollectionItem<Selection, typeof sel>(sel);\n // } else if (Array.isArray(source)) {\n // const selected = getSelectedItemsFromSource(\n // source,\n // selectionStrategy ?? \"default\"\n // );\n // return Array.isArray(selected)\n // ? collectionHook.itemToCollectionItem(selected)\n // : selected\n // ? collectionHook.toCollectionItem(selected)\n // : undefined;\n // }\n // };\n\n const {\n focusVisible,\n highlightedIdx,\n highlightItemAtIndex,\n listHandlers,\n listProps,\n listItemHandlers,\n selected,\n } = useTree<Item, Selection>({\n collectionHook,\n containerRef: rootRef,\n contentRef,\n // Note this isn't enough for a Tree, because of nested structure\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n disabled,\n groupSelection,\n onHighlight,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n onToggle,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof selectedProp\n >(selectedProp),\n selectionStrategy,\n });\n\n // TODO move into useTree (see useList)\n const defaultItemHandlers = {\n onMouseEnter: (evt: MouseEvent) => {\n // if (!isScrolling.current) {\n const idx = closestListItemIndex(evt.target as HTMLElement);\n highlightItemAtIndex(idx!);\n // onMouseEnterListItem && onMouseEnterListItem(evt, idx);\n // }\n },\n };\n\n const propsCommonToAllListItems = {\n ...defaultItemHandlers,\n ...listItemHandlers,\n isLeaf: true,\n role: \"treeitem\",\n };\n // const allowGroupSelect = groupSelectionEnabled(groupSelection);\n const allowGroupSelect = false;\n\n /**\n * Add a ListItem from source item\n */\n function addLeafNode(\n list: ReactElement[],\n item: CollectionItem<Item>,\n idx: CollectionIndexer\n ) {\n const itemProps = {\n \"aria-disabled\": disabled || item.disabled,\n \"aria-level\": item.level,\n \"data-idx\": idx.value,\n description: item.description,\n id: item.id,\n key: item.id,\n highlighted: idx.value === highlightedIdx || undefined,\n selected: isSelected<Item>(selected, item),\n className: clsx({\n focusVisible: focusVisible === idx.value,\n }),\n };\n\n list.push(\n <TreeNode\n {...propsCommonToAllListItems}\n {...itemProps}\n label={item.label}\n >\n {/* {item.icon ? <span className={`${classBase}Node-icon`} /> : null} */}\n </TreeNode>\n );\n idx.value += 1;\n }\n\n function addGroupNode(\n list: ReactElement[],\n items: CollectionItem<Item>[],\n idx: CollectionIndexer,\n id: string,\n title: string\n ) {\n const { value: i } = idx;\n const item = items[i];\n idx.value += 1;\n list.push(\n <TreeNode\n {...defaultItemHandlers}\n {...listItemHandlers}\n aria-disabled={disabled || item.disabled}\n aria-expanded={item.expanded}\n aria-level={item.level}\n className={clsx({\n focusVisible: focusVisible === i,\n [withBaseName(\"toggle\")]: !allowGroupSelect,\n })}\n // data-icon={child.icon}\n data-idx={i}\n data-selectable\n description={item.description}\n highlighted={i === highlightedIdx}\n id={id}\n key={`header-${i}`}\n label={title}\n selected={isSelected<Item>(selected, item)}\n >\n {item.expanded ? (\n <ul className={withBaseName(\"child-nodes\")} role=\"group\">\n {renderItems(items, idx, item.level! + 1)}\n </ul>\n ) : null}\n </TreeNode>\n );\n }\n\n const renderItems = (\n items: CollectionItem<Item>[],\n idx: CollectionIndexer = { value: 0 },\n level = 1\n ): ReactElement[] => {\n const listItems: ReactElement[] = [];\n while (idx.value < items.length) {\n const item = items[idx.value];\n if (item.level! < level) {\n break;\n }\n if (item.childNodes) {\n addGroupNode(listItems, items, idx, item.id!, item.label!);\n } else {\n addLeafNode(listItems, item, idx);\n }\n }\n\n return listItems;\n };\n\n function renderEmpty() {\n // if (emptyMessage || showEmptyMessage) {\n // return (\n // <span className={withBaseName(\"empty-message\")}>\n // {emptyMessage ?? defaultEmptyMessage}\n // </span>\n // );\n // } else {\n return null;\n // }\n }\n\n const renderContent = () => {\n if (collectionHook.data.length) {\n return renderItems(collectionHook.data);\n } else {\n renderEmpty();\n }\n };\n\n return (\n <div\n {...htmlAttributes}\n {...listHandlers}\n {...listProps}\n className={clsx(withBaseName(), className)}\n id={`Tree-${id}`}\n ref={useForkRef(rootRef, forwardedRef)}\n style={{ ...styleProp, ...autoSize }}\n tabIndex={0}\n >\n <ul\n className={withBaseName(\"scrollingContentContainer\")}\n ref={contentRef}\n role=\"tree\"\n // style={{ height: contentHeight }}\n >\n {renderContent()}\n </ul>\n </div>\n );\n});\n"],"names":["Tree","treeCss","selected","id"],"mappings":"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"}
@@ -1,83 +1,10 @@
1
- import { ComponentPropsWithoutRef, ReactElement, Ref, SyntheticEvent } from "react";
2
- import { ListNextProps } from "../list-next";
3
- import { ComboBoxItemProps } from "./utils";
4
- import { UseComboBoxPortalProps } from "./useComboboxPortal";
5
- export interface ComboBoxNextProps<T> extends Omit<ComponentPropsWithoutRef<"input">, "onChange" | "onSelect"> {
1
+ import { ReactNode } from "react";
2
+ import { InputProps } from "@salt-ds/core";
3
+ import { ListControlProps } from "../list-control/ListControlState";
4
+ export interface ComboBoxNextProps extends InputProps, Omit<ListControlProps, "value" | "defaultValue"> {
6
5
  /**
7
- * Additional props for the list component.
6
+ * The options to display in the combo box.
8
7
  */
9
- ListProps?: ListNextProps;
10
- /**
11
- * Additional props for the portal.
12
- */
13
- PortalProps?: UseComboBoxPortalProps;
14
- /**
15
- * Controlled prop. Controls the Input value in the Combo Box Input.
16
- */
17
- inputValue?: string;
18
- /**
19
- * Controlled prop. Controls the Highlighted item in the Combo Box list.
20
- */
21
- highlightedItem?: string;
22
- /**
23
- * Controlled prop. Controls the Selected value in the Combo Box list.
24
- */
25
- selected?: string;
26
- /**
27
- * Initial input value for when the list is uncontrolled.
28
- */
29
- defaultInputValue?: string;
30
- /**
31
- * Initial selected value for when the list is uncontrolled.
32
- */
33
- defaultSelected?: string;
34
- /**
35
- * If `true`, the component will be disabled.
36
- */
37
- disabled?: boolean;
38
- /**
39
- * Styling variant. Defaults to "primary".
40
- */
41
- variant?: "primary" | "secondary";
42
- /**
43
- /**
44
- * The source of combobox items.
45
- */
46
- source: T[];
47
- /**
48
- * Optional ref for the list component
49
- */
50
- listRef?: Ref<HTMLUListElement>;
51
- /**
52
- * The component used for item instead of the default.
53
- */
54
- ListItem?: (props: ComboBoxItemProps<T>) => ReactElement<ComboBoxItemProps<T>>;
55
- /**
56
- * Function to be used as filter.
57
- */
58
- itemFilter?: (source: T[], filterValue?: string) => T[];
59
- /**
60
- * Callback for mouse over event
61
- */
62
- onMouseOver?: (event: SyntheticEvent) => void;
63
- /**
64
- * Callback for list selection event
65
- */
66
- onSelect?: (event: SyntheticEvent, data: {
67
- value: string;
68
- }) => void;
69
- /**
70
- /**
71
- * Callback for list change event
72
- */
73
- onListChange?: (event: SyntheticEvent, data: {
74
- value: string | undefined;
75
- }) => void;
76
- /**
77
- * Callback for input change event
78
- */
79
- onChange?: (event: SyntheticEvent, data: {
80
- value: string;
81
- }) => void;
8
+ children?: ReactNode;
82
9
  }
83
- export declare const ComboBoxNext: import("react").ForwardRefExoticComponent<ComboBoxNextProps<unknown> & import("react").RefAttributes<HTMLInputElement>>;
10
+ export declare const ComboBoxNext: import("react").ForwardRefExoticComponent<ComboBoxNextProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,31 @@
1
+ import { ListControlProps } from "../list-control/ListControlState";
2
+ import { SyntheticEvent } from "react";
3
+ import { OptionValue } from "../list-control/ListControlContext";
4
+ export declare function useComboBoxNext(props: ListControlProps): {
5
+ select: (event: SyntheticEvent, option: OptionValue) => void;
6
+ multiselect: boolean;
7
+ openState: boolean;
8
+ setOpen: (event: SyntheticEvent<Element, Event>, newOpen: boolean) => void;
9
+ openKey: import("react").MutableRefObject<{
10
+ key: string;
11
+ altKey: boolean;
12
+ }>;
13
+ activeState: OptionValue | undefined;
14
+ setActive: (option?: OptionValue | undefined) => void;
15
+ selectedState: string[];
16
+ setSelectedState: import("react").Dispatch<import("react").SetStateAction<string[]>>;
17
+ clear: (event: SyntheticEvent<Element, Event>) => void;
18
+ valueState: string | number | readonly string[] | undefined;
19
+ setValueState: import("react").Dispatch<import("react").SetStateAction<string | number | readonly string[] | undefined>>;
20
+ focusVisibleState: boolean;
21
+ setFocusVisibleState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
22
+ focusedState: boolean;
23
+ setFocusedState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
24
+ listRef: import("react").RefObject<HTMLDivElement>;
25
+ options: HTMLElement[];
26
+ register: (optionValue: OptionValue, element: HTMLElement) => () => void;
27
+ getOptionAtIndex: (index: number) => OptionValue;
28
+ getIndexOfOption: (option: OptionValue) => number;
29
+ getOptionsMatching: (predicate: (option: OptionValue) => boolean) => OptionValue[];
30
+ getOptionFromSearch: (search: string, startFrom?: OptionValue | undefined) => OptionValue | undefined;
31
+ };
@@ -1,49 +1,47 @@
1
- import { ListNextProps } from "../list-next";
2
- import { Ref, SyntheticEvent, ComponentPropsWithoutRef } from "react";
3
- import { Placement } from "@floating-ui/react";
4
- export interface DropdownNextProps extends Omit<ComponentPropsWithoutRef<"button">, "onSelect"> {
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { ListControlProps } from "../list-control/ListControlState";
3
+ import { ValidationStatus } from "@salt-ds/core";
4
+ export interface DropdownNextProps extends Omit<ComponentPropsWithoutRef<"button">, "value" | "defaultValue">, ListControlProps {
5
5
  /**
6
- * If `true`, dropdown will be disabled.
6
+ * If `true`, the dropdown will be disabled.
7
7
  */
8
8
  disabled?: boolean;
9
9
  /**
10
- * Initially selected value for the dropdown, for use only in uncontrolled component.
10
+ * If `true`, the dropdown will be read-only.
11
11
  */
12
- defaultSelected?: string;
12
+ readOnly?: boolean;
13
13
  /**
14
- * List of options when using a dropdown.
14
+ * The options to display in the dropdown.
15
15
  */
16
- source: string[];
16
+ children?: ReactNode;
17
17
  /**
18
- * If `true`, dropdown is read only.
18
+ * The marker to use in an empty read only dropdown.
19
+ * Use `''` to disable this feature. Defaults to '—'.
19
20
  */
20
- readOnly?: boolean;
21
+ emptyReadOnlyMarker?: string;
21
22
  /**
22
- * Background styling variant. Defaults to `primary` .
23
+ * If `true`, the dropdown will be multiselect.
23
24
  */
24
- variant?: "primary" | "secondary";
25
+ multiselect?: boolean;
25
26
  /**
26
- * Placement of dropdown list. Defaults to `bottom` .
27
+ * The text shown when the dropdown has no value.
27
28
  */
28
- placement?: Placement;
29
+ placeholder?: string;
29
30
  /**
30
- * Optional ref for the list component.
31
+ * If `true`, the dropdown will be required.
31
32
  */
32
- listRef?: Ref<HTMLUListElement>;
33
+ required?: boolean;
33
34
  /**
34
- * Additional props for dropdown list.
35
+ * Start adornment component
35
36
  */
36
- ListProps?: ListNextProps;
37
- open?: boolean;
37
+ startAdornment?: ReactNode;
38
38
  /**
39
- * Callback for list selection event
39
+ * Styling variant. Defaults to "primary".
40
40
  */
41
- onSelect?: (event: SyntheticEvent, data: {
42
- value: string;
43
- }) => void;
41
+ variant?: "primary" | "secondary";
44
42
  /**
45
- /* Selected prop for use in controlled component. */
46
- selected?: string;
47
- highlightedItem?: string;
43
+ * Validation status, one of "error" | "warning" | "success".
44
+ */
45
+ validationStatus?: Exclude<ValidationStatus, "info">;
48
46
  }
49
47
  export declare const DropdownNext: import("react").ForwardRefExoticComponent<DropdownNextProps & import("react").RefAttributes<HTMLButtonElement>>;
@@ -33,12 +33,11 @@ export * from "./logo";
33
33
  export * from "./menu-button";
34
34
  export * from "./metric";
35
35
  export * from "./navigation-item";
36
+ export * from "./option";
36
37
  export * from "./overlay";
37
38
  export * from "./pagination";
38
39
  export * from "./parent-child-item";
39
40
  export * from "./parent-child-layout";
40
- export * from "./pill";
41
- export * from "./pill-next";
42
41
  export * from "./portal";
43
42
  export * from "./progress";
44
43
  export * from "./query-input";
@@ -53,6 +52,7 @@ export * from "./tabs";
53
52
  export * from "./tabs-next";
54
53
  export * from "./toast-group";
55
54
  export * from "./tokenized-input";
55
+ export * from "./tokenized-input-next";
56
56
  export * from "./toolbar";
57
57
  export * from "./tree";
58
58
  export * from "./utils";
@@ -0,0 +1,20 @@
1
+ import { SyntheticEvent } from "react";
2
+ export interface OptionValue {
3
+ id: string;
4
+ disabled: boolean;
5
+ value: string;
6
+ text: string;
7
+ }
8
+ export interface ListControlContextValue {
9
+ openState: boolean;
10
+ setOpen: (event: SyntheticEvent, newOpen: boolean) => void;
11
+ register: (optionValue: OptionValue, element: HTMLElement) => () => void;
12
+ selectedState: string[];
13
+ select: (event: SyntheticEvent, option: OptionValue) => void;
14
+ activeState?: OptionValue;
15
+ setActive: (option: OptionValue) => void;
16
+ multiselect: boolean;
17
+ focusVisibleState: boolean;
18
+ }
19
+ export declare const ListControlContext: import("react").Context<ListControlContextValue>;
20
+ export declare function useListControlContext(): ListControlContextValue;
@@ -0,0 +1,68 @@
1
+ import { SyntheticEvent } from "react";
2
+ import { OptionValue } from "./ListControlContext";
3
+ export interface ListControlProps {
4
+ /**
5
+ * If true, the list will be open by default.
6
+ */
7
+ defaultOpen?: boolean;
8
+ /**
9
+ * If true, the list will be open. Useful for controlling the component.
10
+ */
11
+ open?: boolean;
12
+ /**
13
+ * Callback fired when the open state changes.
14
+ */
15
+ onOpenChange?: (event: SyntheticEvent, newOpen: boolean) => void;
16
+ /**
17
+ * The default selected options. If this is provided `defaultValue` should be provided as well.
18
+ */
19
+ defaultSelected?: string[];
20
+ /**
21
+ * The selected options. The component will be controlled if this prop is provided.
22
+ */
23
+ selected?: string[];
24
+ /**
25
+ * Callback fired when the selected options change.
26
+ */
27
+ onSelectionChange?: (event: SyntheticEvent, newSelected: string[]) => void;
28
+ /**
29
+ * The default value.
30
+ */
31
+ defaultValue?: string | readonly string[] | number | undefined;
32
+ /**
33
+ * The value. The component will be controlled if this prop is provided.
34
+ */
35
+ value?: string | readonly string[] | number | undefined;
36
+ /**
37
+ * If true, multiple options can be selected.
38
+ */
39
+ multiselect?: boolean;
40
+ }
41
+ export declare function useListControl(props: ListControlProps): {
42
+ multiselect: boolean;
43
+ openState: boolean;
44
+ setOpen: (event: SyntheticEvent, newOpen: boolean) => void;
45
+ openKey: import("react").MutableRefObject<{
46
+ key: string;
47
+ altKey: boolean;
48
+ }>;
49
+ activeState: OptionValue | undefined;
50
+ setActive: (option?: OptionValue | undefined) => void;
51
+ selectedState: string[];
52
+ setSelectedState: import("react").Dispatch<import("react").SetStateAction<string[]>>;
53
+ select: (event: SyntheticEvent, option: OptionValue) => void;
54
+ clear: (event: SyntheticEvent) => void;
55
+ valueState: string | number | readonly string[] | undefined;
56
+ setValueState: import("react").Dispatch<import("react").SetStateAction<string | number | readonly string[] | undefined>>;
57
+ focusVisibleState: boolean;
58
+ setFocusVisibleState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
59
+ focusedState: boolean;
60
+ setFocusedState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
61
+ listRef: import("react").RefObject<HTMLDivElement>;
62
+ options: HTMLElement[];
63
+ register: (optionValue: OptionValue, element: HTMLElement) => () => void;
64
+ getOptionAtIndex: (index: number) => OptionValue;
65
+ getIndexOfOption: (option: OptionValue) => number;
66
+ getOptionsMatching: (predicate: (option: OptionValue) => boolean) => OptionValue[];
67
+ getOptionFromSearch: (search: string, startFrom?: OptionValue | undefined) => OptionValue | undefined;
68
+ };
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from "react";
2
2
  import { NavigationItemProps } from "./NavigationItem";
3
- interface ConditionalWrapperProps extends Pick<NavigationItemProps, "parent" | "expanded" | "onExpand" | "active" | "href"> {
3
+ interface ConditionalWrapperProps extends Pick<NavigationItemProps, "parent" | "expanded" | "onExpand" | "active" | "href" | "onClick"> {
4
4
  children: ReactNode;
5
5
  className: string;
6
6
  }
@@ -1,2 +1,2 @@
1
1
  import { NavigationItemProps } from "./NavigationItem";
2
- export declare function ExpansionIcon({ expanded, orientation, className, }: Pick<NavigationItemProps, "expanded" | "orientation" | "className">): JSX.Element;
2
+ export declare function ExpansionIcon({ expanded, orientation, }: Pick<NavigationItemProps, "expanded" | "orientation" | "className">): JSX.Element;
@@ -0,0 +1,20 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ export interface OptionProps extends ComponentPropsWithoutRef<"div"> {
3
+ /**
4
+ * If `true`, the option will be disabled.
5
+ */
6
+ disabled?: boolean;
7
+ /**
8
+ * The value of the option.
9
+ */
10
+ value: string;
11
+ /**
12
+ * The text value of the option. If not provided, the text value will be inferred from the children.
13
+ */
14
+ textValue?: string;
15
+ /**
16
+ * The content of the option.
17
+ */
18
+ children?: ReactNode;
19
+ }
20
+ export declare const Option: import("react").ForwardRefExoticComponent<OptionProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,12 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ export interface OptionGroupProps extends ComponentPropsWithoutRef<"div"> {
3
+ /**
4
+ * The label of the option group.
5
+ */
6
+ label?: string;
7
+ /**
8
+ * Options to be rendered inside the option group.
9
+ */
10
+ children?: ReactNode;
11
+ }
12
+ export declare const OptionGroup: import("react").ForwardRefExoticComponent<OptionGroupProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,5 @@
1
+ import { ComponentPropsWithoutRef } from "react";
2
+ export interface OptionListProps extends ComponentPropsWithoutRef<"div"> {
3
+ collapsed?: boolean;
4
+ }
5
+ export declare const OptionList: import("react").ForwardRefExoticComponent<OptionListProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,2 @@
1
+ export * from "./Option";
2
+ export * from "./OptionGroup";
@@ -1,68 +1,13 @@
1
- import { HTMLAttributes, RefObject, SyntheticEvent } from "react";
2
- import { FocusManagerProps } from "../focus-manager";
3
- export interface ScrimProps extends HTMLAttributes<HTMLDivElement> {
1
+ import { ComponentPropsWithoutRef } from "react";
2
+ export interface ScrimProps extends ComponentPropsWithoutRef<"div"> {
4
3
  /**
5
- * Ref of the element that automatically receives focus when the Scrim is opened.
4
+ * If `true` the scrim is bound to the document viewport.
5
+ * The default value of this prop is false, and the default behavior is for Scrim to be bound to its parent container (nearest positioned ancestor).
6
6
  */
7
- autoFocusRef?: FocusManagerProps["autoFocusRef"];
7
+ fixed?: boolean;
8
8
  /**
9
- * Prop to enable escape key to close scrim.
10
- * The default value of this props is false
11
- */
12
- closeWithEscape?: boolean;
13
- /**
14
- * If `true`, the trap focus will not automatically shift focus to itself when it opens, and
15
- * replace it to the last focused element when it closes.
16
- */
17
- disableAutoFocus?: boolean;
18
- /**
19
- * If `true`, the trap focus will not prevent focus from leaving the trap focus while open.
20
- */
21
- disableFocusTrap?: boolean;
22
- /**
23
- * If `true`, the trap focus will not restore focus to previously focused element once
24
- * trap focus is hidden.
25
- */
26
- disableReturnFocus?: boolean;
27
- /**
28
- * By default, an error will be thrown if the focus trap contains no elements in its tab order.
29
- * With this option you can specify a fallback element to programmatically receive focus if no other tabbable elements are found.
30
- * For example, you may want a popover's `<div>` to receive focus if the popover's content includes no tabbable elements.
31
- */
32
- fallbackFocusRef?: FocusManagerProps["fallbackFocusRef"];
33
- /**
34
- * The handler for backdrop click on Scrim.
35
- */
36
- onBackDropClick?: (e: SyntheticEvent) => void;
37
- /**
38
- * The handler for onClose of Scrim.
39
- */
40
- onClose?: () => void;
41
- /**
42
- * To maintain open and close of the scrim.
9
+ * If `true` the scrim is shown.
43
10
  */
44
11
  open?: boolean;
45
- /**
46
- * Set to true to enable the container use case. If true the Scrim will be bound to a container ref you pass via the `parentRef` prop.
47
- * Default value is false, and the default behavior is for Scrim to be bound to the document viewport.
48
- */
49
- enableContainerMode?: boolean;
50
- /**
51
- * Prop necessary to enable container use case. Pass the parent element ref that you want Scrim to be bound to.
52
- * Default value is undefined, and the default behavior is for Scrim to be bound to the document viewport.
53
- */
54
- containerRef?: RefObject<HTMLElement>;
55
- /**
56
- * Options object to pass to the `focus()` method that is called on the previously focused element when Scrim is closed.
57
- */
58
- returnFocusOptions?: FocusManagerProps["returnFocusOptions"];
59
- /**
60
- * comma separated string of query selectors which may need to be overridden for edge cases.
61
- */
62
- tabEnabledSelectors?: string;
63
- /**
64
- * Prop to pass z-index for Scrim.
65
- */
66
- zIndex?: number;
67
12
  }
68
13
  export declare const Scrim: import("react").ForwardRefExoticComponent<ScrimProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,2 +1 @@
1
1
  export * from "./Scrim";
2
- export * from "./ScrimContext";
@@ -1,16 +1,18 @@
1
1
  import { MutableRefObject } from "react";
2
- import { PillProps } from "../../pill";
3
- export declare type InputPillProps = Omit<PillProps<"basic" | "closable">, "variant" | "onDelete" | "clickable"> & {
2
+ import { PillProps } from "@salt-ds/core";
3
+ export declare type InputPillProps = PillProps & {
4
4
  /**
5
5
  * An ref object holds pills index map to width.
6
6
  */
7
- pillsRef: MutableRefObject<{
8
- [index: number]: number | undefined;
9
- }>;
7
+ pillsRef: MutableRefObject<Record<number, number | undefined>>;
10
8
  /**
11
9
  * Index of the pill within Input.
12
10
  */
13
11
  index: number;
12
+ /**
13
+ * Pill label.
14
+ */
15
+ label?: string;
14
16
  /**
15
17
  * Whether the pill is the last visible one within Input.
16
18
  */
@@ -0,0 +1,51 @@
1
+ import { ButtonProps, NecessityType, ValidationStatus } from "@salt-ds/core";
2
+ import { ChangeEventHandler, FocusEventHandler, HTMLAttributes, KeyboardEventHandler, ReactEventHandler, Ref, SyntheticEvent, TextareaHTMLAttributes } from "react";
3
+ import { TokenizedInputNextState } from "./useTokenizedInputNext";
4
+ declare type ChangeHandler<Item> = (event: SyntheticEvent, selectedItems: Item[] | undefined) => void;
5
+ declare type ExpandButtonProps = Pick<ButtonProps, "role" | "aria-roledescription" | "aria-describedby"> & {
6
+ "aria-label"?: string;
7
+ };
8
+ export interface TokenizedInputNextProps<Item> extends Partial<TokenizedInputNextState<Item>>, Omit<HTMLAttributes<HTMLDivElement>, "onFocus" | "onBlur" | "onChange" | "onKeyUp" | "onKeyDown"> {
9
+ ExpandButtonProps?: ExpandButtonProps;
10
+ disabled?: boolean;
11
+ focused?: boolean;
12
+ expandButtonRef?: Ref<HTMLButtonElement>;
13
+ onBlur?: FocusEventHandler<HTMLTextAreaElement | HTMLButtonElement>;
14
+ onKeyUp?: KeyboardEventHandler<HTMLTextAreaElement | HTMLButtonElement>;
15
+ onKeyDown?: KeyboardEventHandler<HTMLTextAreaElement | HTMLButtonElement>;
16
+ onRemoveItem?: (event: SyntheticEvent, index: number) => void;
17
+ onInputBlur?: FocusEventHandler<HTMLTextAreaElement>;
18
+ onInputFocus?: FocusEventHandler<HTMLTextAreaElement>;
19
+ onInputChange?: ChangeEventHandler<HTMLTextAreaElement>;
20
+ onClick?: ReactEventHandler;
21
+ onClear?: ReactEventHandler;
22
+ delimiters?: string[];
23
+ disableAddOnBlur?: boolean;
24
+ defaultSelected?: Item[];
25
+ onChange?: ChangeHandler<Item>;
26
+ onCollapse?: ReactEventHandler;
27
+ onExpand?: ReactEventHandler;
28
+ /**
29
+ * Validation status.
30
+ */
31
+ validationStatus?: Omit<ValidationStatus, "info">;
32
+ /**
33
+ * If `true`, the component is read only.
34
+ */
35
+ readOnly?: boolean;
36
+ /**
37
+ * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#Attributes) applied to the `textarea` element.
38
+ */
39
+ textAreaProps?: TextareaHTMLAttributes<HTMLTextAreaElement>;
40
+ /**
41
+ * Optional ref for the textarea component
42
+ */
43
+ textAreaRef?: Ref<HTMLTextAreaElement>;
44
+ necessity?: NecessityType;
45
+ /**
46
+ * Styling variant. Defaults to "primary".
47
+ */
48
+ variant?: "primary" | "secondary";
49
+ }
50
+ export declare const TokenizedInputNext: import("react").ForwardRefExoticComponent<TokenizedInputNextProps<unknown> & import("react").RefAttributes<HTMLDivElement>>;
51
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from "./TokenizedInputNext";
2
+ export * from "./useTokenizedInputNext";
@@ -0,0 +1,29 @@
1
+ import { MutableRefObject, SyntheticEvent } from "react";
2
+ import { PillProps } from "@salt-ds/core";
3
+ export declare type InputPillProps = PillProps & {
4
+ /**
5
+ * A ref object holds pills index map to width.
6
+ */
7
+ pillsRef: MutableRefObject<Record<number, number | undefined>>;
8
+ /**
9
+ * Index of the pill within Input.
10
+ */
11
+ index: number;
12
+ /**
13
+ * Whether the pill is the last visible one within Input.
14
+ */
15
+ lastVisible?: boolean;
16
+ /**
17
+ * Pill label.
18
+ */
19
+ label?: string;
20
+ /**
21
+ * Whether the pill is highlighted.
22
+ */
23
+ highlighted?: boolean;
24
+ /**
25
+ * Callback when pill is deleted.
26
+ */
27
+ onClose?: (event: SyntheticEvent, index: number) => void;
28
+ };
29
+ export declare const InputPill: import("react").NamedExoticComponent<InputPillProps>;