@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.
- package/css/salt-lab.css +378 -413
- package/dist-cjs/combo-box-next/ComboBoxNext.js +303 -166
- package/dist-cjs/combo-box-next/ComboBoxNext.js.map +1 -1
- package/dist-cjs/combo-box-next/useComboBoxNext.js +55 -0
- package/dist-cjs/combo-box-next/useComboBoxNext.js.map +1 -0
- package/dist-cjs/dropdown/DropdownBase.js +1 -1
- package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
- package/dist-cjs/dropdown-next/DropdownNext.css.js +1 -1
- package/dist-cjs/dropdown-next/DropdownNext.js +333 -169
- package/dist-cjs/dropdown-next/DropdownNext.js.map +1 -1
- package/dist-cjs/editable-label/EditableLabel.js +1 -1
- package/dist-cjs/editable-label/EditableLabel.js.map +1 -1
- package/dist-cjs/index.js +8 -10
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/layer-layout/LayerLayout.js +0 -1
- package/dist-cjs/layer-layout/LayerLayout.js.map +1 -1
- package/dist-cjs/list-control/ListControlContext.js +36 -0
- package/dist-cjs/list-control/ListControlContext.js.map +1 -0
- package/dist-cjs/list-control/ListControlState.js +193 -0
- package/dist-cjs/list-control/ListControlState.js.map +1 -0
- package/dist-cjs/navigation-item/ConditionalWrapper.js +2 -4
- package/dist-cjs/navigation-item/ConditionalWrapper.js.map +1 -1
- package/dist-cjs/navigation-item/ExpansionIcon.js +2 -4
- package/dist-cjs/navigation-item/ExpansionIcon.js.map +1 -1
- package/dist-cjs/navigation-item/NavigationItem.css.js +1 -1
- package/dist-cjs/navigation-item/NavigationItem.js +4 -7
- package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
- package/dist-cjs/option/Option.css.js +6 -0
- package/dist-cjs/option/Option.css.js.map +1 -0
- package/dist-cjs/option/Option.js +113 -0
- package/dist-cjs/option/Option.js.map +1 -0
- package/dist-cjs/option/OptionGroup.css.js +6 -0
- package/dist-cjs/option/OptionGroup.css.js.map +1 -0
- package/dist-cjs/option/OptionGroup.js +44 -0
- package/dist-cjs/option/OptionGroup.js.map +1 -0
- package/dist-cjs/option/OptionList.css.js +6 -0
- package/dist-cjs/option/OptionList.css.js.map +1 -0
- package/dist-cjs/option/OptionList.js +40 -0
- package/dist-cjs/option/OptionList.js.map +1 -0
- package/dist-cjs/scrim/Scrim.css.js +1 -1
- package/dist-cjs/scrim/Scrim.js +10 -140
- package/dist-cjs/scrim/Scrim.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/InputPill.js +13 -9
- package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js +6 -0
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js.map +1 -0
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.js +244 -0
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -0
- package/dist-cjs/tokenized-input-next/internal/InputPill.css.js +6 -0
- package/dist-cjs/tokenized-input-next/internal/InputPill.css.js.map +1 -0
- package/dist-cjs/tokenized-input-next/internal/InputPill.js +83 -0
- package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -0
- package/dist-cjs/tokenized-input-next/internal/calcFirstHiddenIndex.js +22 -0
- package/dist-cjs/tokenized-input-next/internal/calcFirstHiddenIndex.js.map +1 -0
- package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js +37 -0
- package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -0
- package/dist-cjs/tokenized-input-next/internal/useWidth.js +48 -0
- package/dist-cjs/tokenized-input-next/internal/useWidth.js.map +1 -0
- package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js +479 -0
- package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -0
- package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js +1 -1
- package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-cjs/tree/Tree.js +1 -2
- package/dist-cjs/tree/Tree.js.map +1 -1
- package/dist-es/combo-box-next/ComboBoxNext.js +306 -169
- package/dist-es/combo-box-next/ComboBoxNext.js.map +1 -1
- package/dist-es/combo-box-next/useComboBoxNext.js +51 -0
- package/dist-es/combo-box-next/useComboBoxNext.js.map +1 -0
- package/dist-es/dropdown/DropdownBase.js +1 -1
- package/dist-es/dropdown/DropdownBase.js.map +1 -1
- package/dist-es/dropdown-next/DropdownNext.css.js +1 -1
- package/dist-es/dropdown-next/DropdownNext.js +332 -168
- package/dist-es/dropdown-next/DropdownNext.js.map +1 -1
- package/dist-es/editable-label/EditableLabel.js +1 -1
- package/dist-es/editable-label/EditableLabel.js.map +1 -1
- package/dist-es/index.js +4 -5
- package/dist-es/index.js.map +1 -1
- package/dist-es/layer-layout/LayerLayout.js +0 -1
- package/dist-es/layer-layout/LayerLayout.js.map +1 -1
- package/dist-es/list-control/ListControlContext.js +31 -0
- package/dist-es/list-control/ListControlContext.js.map +1 -0
- package/dist-es/list-control/ListControlState.js +189 -0
- package/dist-es/list-control/ListControlState.js.map +1 -0
- package/dist-es/navigation-item/ConditionalWrapper.js +2 -4
- package/dist-es/navigation-item/ConditionalWrapper.js.map +1 -1
- package/dist-es/navigation-item/ExpansionIcon.js +2 -4
- package/dist-es/navigation-item/ExpansionIcon.js.map +1 -1
- package/dist-es/navigation-item/NavigationItem.css.js +1 -1
- package/dist-es/navigation-item/NavigationItem.js +4 -7
- package/dist-es/navigation-item/NavigationItem.js.map +1 -1
- package/dist-es/option/Option.css.js +4 -0
- package/dist-es/option/Option.css.js.map +1 -0
- package/dist-es/option/Option.js +109 -0
- package/dist-es/option/Option.js.map +1 -0
- package/dist-es/option/OptionGroup.css.js +4 -0
- package/dist-es/option/OptionGroup.css.js.map +1 -0
- package/dist-es/option/OptionGroup.js +40 -0
- package/dist-es/option/OptionGroup.js.map +1 -0
- package/dist-es/option/OptionList.css.js +4 -0
- package/dist-es/option/OptionList.css.js.map +1 -0
- package/dist-es/option/OptionList.js +36 -0
- package/dist-es/option/OptionList.js.map +1 -0
- package/dist-es/scrim/Scrim.css.js +1 -1
- package/dist-es/scrim/Scrim.js +12 -138
- package/dist-es/scrim/Scrim.js.map +1 -1
- package/dist-es/tokenized-input/internal/InputPill.js +15 -11
- package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
- package/dist-es/tokenized-input-next/TokenizedInputNext.css.js +4 -0
- package/dist-es/tokenized-input-next/TokenizedInputNext.css.js.map +1 -0
- package/dist-es/tokenized-input-next/TokenizedInputNext.js +240 -0
- package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -0
- package/dist-es/tokenized-input-next/internal/InputPill.css.js +4 -0
- package/dist-es/tokenized-input-next/internal/InputPill.css.js.map +1 -0
- package/dist-es/tokenized-input-next/internal/InputPill.js +79 -0
- package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -0
- package/dist-es/tokenized-input-next/internal/calcFirstHiddenIndex.js +18 -0
- package/dist-es/tokenized-input-next/internal/calcFirstHiddenIndex.js.map +1 -0
- package/dist-es/tokenized-input-next/internal/useResizeObserver.js +33 -0
- package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -0
- package/dist-es/tokenized-input-next/internal/useWidth.js +42 -0
- package/dist-es/tokenized-input-next/internal/useWidth.js.map +1 -0
- package/dist-es/tokenized-input-next/useTokenizedInputNext.js +471 -0
- package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -0
- package/dist-es/toolbar/overflow-panel/OverflowPanel.js +1 -1
- package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-es/tree/Tree.js +1 -2
- package/dist-es/tree/Tree.js.map +1 -1
- package/dist-types/combo-box-next/ComboBoxNext.d.ts +7 -80
- package/dist-types/combo-box-next/useComboBoxNext.d.ts +31 -0
- package/dist-types/dropdown-next/DropdownNext.d.ts +25 -27
- package/dist-types/index.d.ts +2 -2
- package/dist-types/list-control/ListControlContext.d.ts +20 -0
- package/dist-types/list-control/ListControlState.d.ts +68 -0
- package/dist-types/navigation-item/ConditionalWrapper.d.ts +1 -1
- package/dist-types/navigation-item/ExpansionIcon.d.ts +1 -1
- package/dist-types/option/Option.d.ts +20 -0
- package/dist-types/option/OptionGroup.d.ts +12 -0
- package/dist-types/option/OptionList.d.ts +5 -0
- package/dist-types/option/index.d.ts +2 -0
- package/dist-types/scrim/Scrim.d.ts +6 -61
- package/dist-types/scrim/index.d.ts +0 -1
- package/dist-types/tokenized-input/internal/InputPill.d.ts +7 -5
- package/dist-types/tokenized-input-next/TokenizedInputNext.d.ts +51 -0
- package/dist-types/tokenized-input-next/index.d.ts +2 -0
- package/dist-types/tokenized-input-next/internal/InputPill.d.ts +29 -0
- package/dist-types/tokenized-input-next/internal/calcFirstHiddenIndex.d.ts +4 -0
- package/dist-types/tokenized-input-next/internal/useResizeObserver.d.ts +6 -0
- package/dist-types/tokenized-input-next/internal/useWidth.d.ts +7 -0
- package/dist-types/tokenized-input-next/useTokenizedInputNext.d.ts +47 -0
- package/package.json +2 -2
- package/dist-cjs/combo-box-next/ComboBoxNext.css.js +0 -6
- package/dist-cjs/combo-box-next/ComboBoxNext.css.js.map +0 -1
- package/dist-cjs/combo-box-next/useComboBox.js +0 -147
- package/dist-cjs/combo-box-next/useComboBox.js.map +0 -1
- package/dist-cjs/combo-box-next/useComboboxPortal.js +0 -75
- package/dist-cjs/combo-box-next/useComboboxPortal.js.map +0 -1
- package/dist-cjs/combo-box-next/utils.js +0 -36
- package/dist-cjs/combo-box-next/utils.js.map +0 -1
- package/dist-cjs/dropdown-next/useDropdownNext.js +0 -188
- package/dist-cjs/dropdown-next/useDropdownNext.js.map +0 -1
- package/dist-cjs/focus-manager/FocusManager.js +0 -158
- package/dist-cjs/focus-manager/FocusManager.js.map +0 -1
- package/dist-cjs/focus-manager/internal/findAllTabbableElements.js +0 -45
- package/dist-cjs/focus-manager/internal/findAllTabbableElements.js.map +0 -1
- package/dist-cjs/focus-manager/internal/useReturnFocus.js +0 -59
- package/dist-cjs/focus-manager/internal/useReturnFocus.js.map +0 -1
- package/dist-cjs/pill/ClosablePill.js +0 -61
- package/dist-cjs/pill/ClosablePill.js.map +0 -1
- package/dist-cjs/pill/Pill.css.js +0 -6
- package/dist-cjs/pill/Pill.css.js.map +0 -1
- package/dist-cjs/pill/Pill.js +0 -49
- package/dist-cjs/pill/Pill.js.map +0 -1
- package/dist-cjs/pill/PillBase.js +0 -133
- package/dist-cjs/pill/PillBase.js.map +0 -1
- package/dist-cjs/pill/SelectablePill.js +0 -55
- package/dist-cjs/pill/SelectablePill.js.map +0 -1
- package/dist-cjs/pill/constants.js +0 -8
- package/dist-cjs/pill/constants.js.map +0 -1
- package/dist-cjs/pill/internal/DeleteButton.js +0 -37
- package/dist-cjs/pill/internal/DeleteButton.js.map +0 -1
- package/dist-cjs/pill/internal/DivButton.js +0 -68
- package/dist-cjs/pill/internal/DivButton.js.map +0 -1
- package/dist-cjs/pill/internal/PillCheckbox.css.js +0 -6
- package/dist-cjs/pill/internal/PillCheckbox.css.js.map +0 -1
- package/dist-cjs/pill/internal/PillCheckbox.js +0 -27
- package/dist-cjs/pill/internal/PillCheckbox.js.map +0 -1
- package/dist-cjs/pill-next/PillNext.css.js +0 -6
- package/dist-cjs/pill-next/PillNext.css.js.map +0 -1
- package/dist-cjs/pill-next/PillNext.js +0 -60
- package/dist-cjs/pill-next/PillNext.js.map +0 -1
- package/dist-cjs/scrim/ScrimContext.js +0 -13
- package/dist-cjs/scrim/ScrimContext.js.map +0 -1
- package/dist-cjs/scrim/internal/PreventFocus.js +0 -39
- package/dist-cjs/scrim/internal/PreventFocus.js.map +0 -1
- package/dist-es/combo-box-next/ComboBoxNext.css.js +0 -4
- package/dist-es/combo-box-next/ComboBoxNext.css.js.map +0 -1
- package/dist-es/combo-box-next/useComboBox.js +0 -143
- package/dist-es/combo-box-next/useComboBox.js.map +0 -1
- package/dist-es/combo-box-next/useComboboxPortal.js +0 -71
- package/dist-es/combo-box-next/useComboboxPortal.js.map +0 -1
- package/dist-es/combo-box-next/utils.js +0 -31
- package/dist-es/combo-box-next/utils.js.map +0 -1
- package/dist-es/dropdown-next/useDropdownNext.js +0 -184
- package/dist-es/dropdown-next/useDropdownNext.js.map +0 -1
- package/dist-es/focus-manager/FocusManager.js +0 -154
- package/dist-es/focus-manager/FocusManager.js.map +0 -1
- package/dist-es/focus-manager/internal/findAllTabbableElements.js +0 -41
- package/dist-es/focus-manager/internal/findAllTabbableElements.js.map +0 -1
- package/dist-es/focus-manager/internal/useReturnFocus.js +0 -55
- package/dist-es/focus-manager/internal/useReturnFocus.js.map +0 -1
- package/dist-es/pill/ClosablePill.js +0 -57
- package/dist-es/pill/ClosablePill.js.map +0 -1
- package/dist-es/pill/Pill.css.js +0 -4
- package/dist-es/pill/Pill.css.js.map +0 -1
- package/dist-es/pill/Pill.js +0 -45
- package/dist-es/pill/Pill.js.map +0 -1
- package/dist-es/pill/PillBase.js +0 -129
- package/dist-es/pill/PillBase.js.map +0 -1
- package/dist-es/pill/SelectablePill.js +0 -51
- package/dist-es/pill/SelectablePill.js.map +0 -1
- package/dist-es/pill/constants.js +0 -4
- package/dist-es/pill/constants.js.map +0 -1
- package/dist-es/pill/internal/DeleteButton.js +0 -33
- package/dist-es/pill/internal/DeleteButton.js.map +0 -1
- package/dist-es/pill/internal/DivButton.js +0 -64
- package/dist-es/pill/internal/DivButton.js.map +0 -1
- package/dist-es/pill/internal/PillCheckbox.css.js +0 -4
- package/dist-es/pill/internal/PillCheckbox.css.js.map +0 -1
- package/dist-es/pill/internal/PillCheckbox.js +0 -23
- package/dist-es/pill/internal/PillCheckbox.js.map +0 -1
- package/dist-es/pill-next/PillNext.css.js +0 -4
- package/dist-es/pill-next/PillNext.css.js.map +0 -1
- package/dist-es/pill-next/PillNext.js +0 -52
- package/dist-es/pill-next/PillNext.js.map +0 -1
- package/dist-es/scrim/ScrimContext.js +0 -9
- package/dist-es/scrim/ScrimContext.js.map +0 -1
- package/dist-es/scrim/internal/PreventFocus.js +0 -35
- package/dist-es/scrim/internal/PreventFocus.js.map +0 -1
- package/dist-types/combo-box-next/useComboBox.d.ts +0 -44
- package/dist-types/combo-box-next/useComboboxPortal.d.ts +0 -22
- package/dist-types/combo-box-next/utils.d.ts +0 -7
- package/dist-types/dropdown-next/useDropdownNext.d.ts +0 -50
- package/dist-types/pill/ClosablePill.d.ts +0 -8
- package/dist-types/pill/Pill.d.ts +0 -15
- package/dist-types/pill/PillBase.d.ts +0 -52
- package/dist-types/pill/SelectablePill.d.ts +0 -17
- package/dist-types/pill/constants.d.ts +0 -1
- package/dist-types/pill/index.d.ts +0 -3
- package/dist-types/pill/internal/DeleteButton.d.ts +0 -8
- package/dist-types/pill/internal/DivButton.d.ts +0 -12
- package/dist-types/pill/internal/PillCheckbox.d.ts +0 -3
- package/dist-types/pill-next/PillNext.d.ts +0 -4
- package/dist-types/pill-next/index.d.ts +0 -1
- package/dist-types/scrim/ScrimContext.d.ts +0 -1
package/dist-es/tree/Tree.js.map
CHANGED
|
@@ -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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
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
|
-
*
|
|
6
|
+
* The options to display in the combo box.
|
|
8
7
|
*/
|
|
9
|
-
|
|
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
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
export interface DropdownNextProps extends Omit<ComponentPropsWithoutRef<"button">, "
|
|
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
|
-
*
|
|
10
|
+
* If `true`, the dropdown will be read-only.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
readOnly?: boolean;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* The options to display in the dropdown.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
children?: ReactNode;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* The marker to use in an empty read only dropdown.
|
|
19
|
+
* Use `''` to disable this feature. Defaults to '—'.
|
|
19
20
|
*/
|
|
20
|
-
|
|
21
|
+
emptyReadOnlyMarker?: string;
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
+
* If `true`, the dropdown will be multiselect.
|
|
23
24
|
*/
|
|
24
|
-
|
|
25
|
+
multiselect?: boolean;
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* The text shown when the dropdown has no value.
|
|
27
28
|
*/
|
|
28
|
-
|
|
29
|
+
placeholder?: string;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* If `true`, the dropdown will be required.
|
|
31
32
|
*/
|
|
32
|
-
|
|
33
|
+
required?: boolean;
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
+
* Start adornment component
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
-
open?: boolean;
|
|
37
|
+
startAdornment?: ReactNode;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
39
|
+
* Styling variant. Defaults to "primary".
|
|
40
40
|
*/
|
|
41
|
-
|
|
42
|
-
value: string;
|
|
43
|
-
}) => void;
|
|
41
|
+
variant?: "primary" | "secondary";
|
|
44
42
|
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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>>;
|
package/dist-types/index.d.ts
CHANGED
|
@@ -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,
|
|
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>>;
|
|
@@ -1,68 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export interface ScrimProps extends HTMLAttributes<HTMLDivElement> {
|
|
1
|
+
import { ComponentPropsWithoutRef } from "react";
|
|
2
|
+
export interface ScrimProps extends ComponentPropsWithoutRef<"div"> {
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
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
|
-
|
|
7
|
+
fixed?: boolean;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
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,16 +1,18 @@
|
|
|
1
1
|
import { MutableRefObject } from "react";
|
|
2
|
-
import { PillProps } from "
|
|
3
|
-
export declare type InputPillProps =
|
|
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,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>;
|