@salt-ds/lab 1.0.0-alpha.35 → 1.0.0-alpha.37

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 (85) hide show
  1. package/css/salt-lab.css +27 -159
  2. package/dist-cjs/calendar/internal/CalendarNavigation.js +4 -8
  3. package/dist-cjs/calendar/internal/CalendarNavigation.js.map +1 -1
  4. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  5. package/dist-cjs/index.js +2 -8
  6. package/dist-cjs/index.js.map +1 -1
  7. package/dist-cjs/segmented-button-group/SegmentedButtonGroup.css.js +6 -0
  8. package/dist-cjs/segmented-button-group/SegmentedButtonGroup.css.js.map +1 -0
  9. package/dist-cjs/segmented-button-group/SegmentedButtonGroup.js +30 -0
  10. package/dist-cjs/segmented-button-group/SegmentedButtonGroup.js.map +1 -0
  11. package/dist-cjs/tabs-next/TabstripNext.css.js +1 -1
  12. package/dist-es/calendar/internal/CalendarNavigation.js +3 -7
  13. package/dist-es/calendar/internal/CalendarNavigation.js.map +1 -1
  14. package/dist-es/combo-box/useCombobox.js.map +1 -1
  15. package/dist-es/index.js +1 -4
  16. package/dist-es/index.js.map +1 -1
  17. package/dist-es/segmented-button-group/SegmentedButtonGroup.css.js +4 -0
  18. package/dist-es/segmented-button-group/SegmentedButtonGroup.css.js.map +1 -0
  19. package/dist-es/segmented-button-group/SegmentedButtonGroup.js +26 -0
  20. package/dist-es/segmented-button-group/SegmentedButtonGroup.js.map +1 -0
  21. package/dist-es/tabs-next/TabstripNext.css.js +1 -1
  22. package/dist-types/calendar/internal/CalendarNavigation.d.ts +2 -3
  23. package/dist-types/index.d.ts +1 -3
  24. package/dist-types/segmented-button-group/SegmentedButtonGroup.d.ts +4 -0
  25. package/dist-types/segmented-button-group/index.d.ts +1 -0
  26. package/package.json +2 -2
  27. package/dist-cjs/combo-box-next/ComboBoxNext.js +0 -338
  28. package/dist-cjs/combo-box-next/ComboBoxNext.js.map +0 -1
  29. package/dist-cjs/combo-box-next/useComboBoxNext.js +0 -68
  30. package/dist-cjs/combo-box-next/useComboBoxNext.js.map +0 -1
  31. package/dist-cjs/dropdown-next/DropdownNext.css.js +0 -6
  32. package/dist-cjs/dropdown-next/DropdownNext.css.js.map +0 -1
  33. package/dist-cjs/dropdown-next/DropdownNext.js +0 -335
  34. package/dist-cjs/dropdown-next/DropdownNext.js.map +0 -1
  35. package/dist-cjs/list-control/ListControlContext.js +0 -38
  36. package/dist-cjs/list-control/ListControlContext.js.map +0 -1
  37. package/dist-cjs/list-control/ListControlState.js +0 -192
  38. package/dist-cjs/list-control/ListControlState.js.map +0 -1
  39. package/dist-cjs/option/Option.css.js +0 -6
  40. package/dist-cjs/option/Option.css.js.map +0 -1
  41. package/dist-cjs/option/Option.js +0 -99
  42. package/dist-cjs/option/Option.js.map +0 -1
  43. package/dist-cjs/option/OptionGroup.css.js +0 -6
  44. package/dist-cjs/option/OptionGroup.css.js.map +0 -1
  45. package/dist-cjs/option/OptionGroup.js +0 -44
  46. package/dist-cjs/option/OptionGroup.js.map +0 -1
  47. package/dist-cjs/option/OptionList.css.js +0 -6
  48. package/dist-cjs/option/OptionList.css.js.map +0 -1
  49. package/dist-cjs/option/OptionList.js +0 -40
  50. package/dist-cjs/option/OptionList.js.map +0 -1
  51. package/dist-es/combo-box-next/ComboBoxNext.js +0 -334
  52. package/dist-es/combo-box-next/ComboBoxNext.js.map +0 -1
  53. package/dist-es/combo-box-next/useComboBoxNext.js +0 -64
  54. package/dist-es/combo-box-next/useComboBoxNext.js.map +0 -1
  55. package/dist-es/dropdown-next/DropdownNext.css.js +0 -4
  56. package/dist-es/dropdown-next/DropdownNext.css.js.map +0 -1
  57. package/dist-es/dropdown-next/DropdownNext.js +0 -331
  58. package/dist-es/dropdown-next/DropdownNext.js.map +0 -1
  59. package/dist-es/list-control/ListControlContext.js +0 -33
  60. package/dist-es/list-control/ListControlContext.js.map +0 -1
  61. package/dist-es/list-control/ListControlState.js +0 -187
  62. package/dist-es/list-control/ListControlState.js.map +0 -1
  63. package/dist-es/option/Option.css.js +0 -4
  64. package/dist-es/option/Option.css.js.map +0 -1
  65. package/dist-es/option/Option.js +0 -95
  66. package/dist-es/option/Option.js.map +0 -1
  67. package/dist-es/option/OptionGroup.css.js +0 -4
  68. package/dist-es/option/OptionGroup.css.js.map +0 -1
  69. package/dist-es/option/OptionGroup.js +0 -40
  70. package/dist-es/option/OptionGroup.js.map +0 -1
  71. package/dist-es/option/OptionList.css.js +0 -4
  72. package/dist-es/option/OptionList.css.js.map +0 -1
  73. package/dist-es/option/OptionList.js +0 -36
  74. package/dist-es/option/OptionList.js.map +0 -1
  75. package/dist-types/combo-box-next/ComboBoxNext.d.ts +0 -17
  76. package/dist-types/combo-box-next/index.d.ts +0 -1
  77. package/dist-types/combo-box-next/useComboBoxNext.d.ts +0 -30
  78. package/dist-types/dropdown-next/DropdownNext.d.ts +0 -99
  79. package/dist-types/dropdown-next/index.d.ts +0 -1
  80. package/dist-types/list-control/ListControlContext.d.ts +0 -21
  81. package/dist-types/list-control/ListControlState.d.ts +0 -70
  82. package/dist-types/option/Option.d.ts +0 -16
  83. package/dist-types/option/OptionGroup.d.ts +0 -12
  84. package/dist-types/option/OptionList.d.ts +0 -5
  85. package/dist-types/option/index.d.ts +0 -2
@@ -1,187 +0,0 @@
1
- import { useState, useRef, useCallback, useEffect } from 'react';
2
- import { useControlled } from '@salt-ds/core';
3
-
4
- function defaultValueToString(item) {
5
- return typeof item === "string" ? item : "";
6
- }
7
- function useListControl(props) {
8
- const {
9
- open: openProp,
10
- defaultOpen,
11
- onOpenChange,
12
- multiselect,
13
- defaultSelected,
14
- selected: selectedProp,
15
- onSelectionChange,
16
- disabled,
17
- readOnly,
18
- valueToString = defaultValueToString
19
- } = props;
20
- const [focusedState, setFocusedState] = useState(false);
21
- const [focusVisibleState, setFocusVisibleState] = useState(false);
22
- const [activeState, setActiveState] = useState(
23
- void 0
24
- );
25
- const setActive = (option) => {
26
- if (option) {
27
- setActiveState(option);
28
- } else {
29
- setActiveState(void 0);
30
- }
31
- };
32
- const [openState, setOpenState] = useControlled({
33
- controlled: openProp,
34
- default: Boolean(defaultOpen),
35
- name: "ListControl",
36
- state: "open"
37
- });
38
- const openKey = useRef(void 0);
39
- const setOpen = (newOpen, reason, key) => {
40
- if (disabled || readOnly) {
41
- return;
42
- }
43
- setOpenState(newOpen);
44
- openKey.current = key;
45
- if (newOpen !== openState) {
46
- onOpenChange == null ? void 0 : onOpenChange(newOpen, reason);
47
- }
48
- };
49
- const [selectedState, setSelectedState] = useControlled({
50
- controlled: selectedProp,
51
- default: defaultSelected != null ? defaultSelected : [],
52
- name: "ListControl",
53
- state: "selected"
54
- });
55
- const select = (event, option) => {
56
- if (option.disabled || readOnly || disabled) {
57
- return;
58
- }
59
- let newSelected = [option.value];
60
- if (multiselect) {
61
- if (selectedState.includes(option.value)) {
62
- newSelected = selectedState.filter((item) => item !== option.value);
63
- } else {
64
- newSelected = selectedState.concat([option.value]);
65
- }
66
- }
67
- setSelectedState(newSelected);
68
- onSelectionChange == null ? void 0 : onSelectionChange(event, newSelected);
69
- if (!multiselect) {
70
- setOpen(false);
71
- }
72
- };
73
- const clear = (event) => {
74
- setSelectedState([]);
75
- if (selectedState.length !== 0) {
76
- onSelectionChange == null ? void 0 : onSelectionChange(event, []);
77
- }
78
- };
79
- const optionsRef = useRef([]);
80
- const register = useCallback(
81
- (optionValue, element) => {
82
- const { id } = optionValue;
83
- const option = optionsRef.current.find((item) => item.value.id === id);
84
- const index = optionsRef.current.findIndex((option2) => {
85
- return option2.element.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING;
86
- });
87
- if (!option) {
88
- if (index === -1) {
89
- optionsRef.current.push({ value: optionValue, element });
90
- } else {
91
- optionsRef.current.splice(index, 0, { value: optionValue, element });
92
- }
93
- }
94
- return () => {
95
- optionsRef.current = optionsRef.current.filter(
96
- (item) => item.value.id !== id
97
- );
98
- };
99
- },
100
- []
101
- );
102
- const getOptionAtIndex = (index) => {
103
- var _a;
104
- return (_a = optionsRef.current[index]) == null ? void 0 : _a.value;
105
- };
106
- const getIndexOfOption = (option) => {
107
- return optionsRef.current.findIndex((item) => item.value.id === option.id);
108
- };
109
- const getOptionsMatching = (predicate) => {
110
- return optionsRef.current.filter((item) => predicate(item.value)).map((item) => item.value);
111
- };
112
- const getOptionFromSearch = (search, startFrom) => {
113
- const collator = new Intl.Collator("en", {
114
- usage: "search",
115
- sensitivity: "base"
116
- });
117
- const startIndex = startFrom ? getIndexOfOption(startFrom) + 1 : 0;
118
- const searchList = optionsRef.current.map((item) => item.value);
119
- let matches = searchList.filter(
120
- (option) => collator.compare(
121
- valueToString(option.value).substring(0, search.length),
122
- search
123
- ) === 0
124
- );
125
- if (matches.length === 0) {
126
- const letters = search.split("");
127
- const allSameLetter = letters.length > 0 && letters.every((letter) => collator.compare(letter, letters[0]) === 0);
128
- if (allSameLetter) {
129
- matches = searchList.filter(
130
- (option) => collator.compare(
131
- valueToString(option.value)[0].toLowerCase(),
132
- letters[0]
133
- ) === 0
134
- );
135
- }
136
- }
137
- return matches.find((option) => getIndexOfOption(option) >= startIndex);
138
- };
139
- const listRef = useRef(null);
140
- useEffect(() => {
141
- var _a;
142
- if (listRef.current) {
143
- const activeElement = (_a = optionsRef.current.find(
144
- (option) => option.value === activeState
145
- )) == null ? void 0 : _a.element;
146
- if (!activeElement) {
147
- return;
148
- }
149
- const { scrollTop } = listRef.current;
150
- const { offsetTop, offsetHeight } = activeElement;
151
- const isVisible = offsetTop >= scrollTop && offsetTop + offsetHeight <= scrollTop + listRef.current.offsetHeight;
152
- if (!isVisible) {
153
- activeElement.scrollIntoView({
154
- block: "end",
155
- inline: "nearest"
156
- });
157
- }
158
- }
159
- }, [activeState]);
160
- return {
161
- multiselect: Boolean(multiselect),
162
- openState,
163
- setOpen,
164
- openKey,
165
- activeState,
166
- setActive,
167
- selectedState,
168
- setSelectedState,
169
- select,
170
- clear,
171
- focusVisibleState,
172
- setFocusVisibleState,
173
- focusedState,
174
- setFocusedState,
175
- listRef,
176
- options: optionsRef.current.map((option) => option.element),
177
- register,
178
- getOptionAtIndex,
179
- getIndexOfOption,
180
- getOptionsMatching,
181
- getOptionFromSearch,
182
- valueToString
183
- };
184
- }
185
-
186
- export { defaultValueToString, useListControl };
187
- //# sourceMappingURL=ListControlState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ListControlState.js","sources":["../src/list-control/ListControlState.ts"],"sourcesContent":["import {\n SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { OptionValue } from \"./ListControlContext\";\n\nexport type OpenChangeReason = \"input\" | \"manual\";\n\nexport type ListControlProps<Item> = {\n /**\n * If true, the control will be disabled.\n */\n disabled?: boolean;\n /**\n * If true, the control will be read-only.\n */\n readOnly?: boolean;\n /**\n * If true, the list will be open by default.\n */\n defaultOpen?: boolean;\n /**\n * If true, the list will be open. Useful for controlling the component.\n */\n open?: boolean;\n /**\n * Callback fired when the open state changes.\n */\n onOpenChange?: (newOpen: boolean, reason?: OpenChangeReason) => void;\n /**\n * The default selected options. If this is provided `defaultValue` should be provided as well.\n */\n defaultSelected?: Item[];\n /**\n * The selected options. The component will be controlled if this prop is provided.\n */\n selected?: Item[];\n /**\n * Callback fired when the selected options change.\n */\n onSelectionChange?: (event: SyntheticEvent, newSelected: Item[]) => void;\n /**\n * If true, multiple options can be selected.\n */\n multiselect?: boolean;\n /**\n * Callback used to convert an option's `value` to a string. This is needed when the value is different to the display value or the value is not a string.\n */\n valueToString?: (item: Item) => string;\n};\n\nexport function defaultValueToString<Item>(item: Item): string {\n return typeof item === \"string\" ? item : \"\";\n}\n\nexport function useListControl<Item>(props: ListControlProps<Item>) {\n const {\n open: openProp,\n defaultOpen,\n onOpenChange,\n multiselect,\n defaultSelected,\n selected: selectedProp,\n onSelectionChange,\n disabled,\n readOnly,\n valueToString = defaultValueToString,\n } = props;\n\n const [focusedState, setFocusedState] = useState(false);\n const [focusVisibleState, setFocusVisibleState] = useState(false);\n\n const [activeState, setActiveState] = useState<OptionValue<Item> | undefined>(\n undefined\n );\n\n const setActive = (option?: OptionValue<Item>) => {\n if (option) {\n setActiveState(option);\n } else {\n setActiveState(undefined);\n }\n };\n\n const [openState, setOpenState] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"ListControl\",\n state: \"open\",\n });\n\n const openKey = useRef<string | undefined>(undefined);\n\n const setOpen = (\n newOpen: boolean,\n reason?: OpenChangeReason,\n key?: string\n ) => {\n if (disabled || readOnly) {\n return;\n }\n\n setOpenState(newOpen);\n openKey.current = key;\n\n if (newOpen !== openState) {\n onOpenChange?.(newOpen, reason);\n }\n };\n\n const [selectedState, setSelectedState] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"ListControl\",\n state: \"selected\",\n });\n\n const select = (event: SyntheticEvent, option: OptionValue<Item>) => {\n if (option.disabled || readOnly || disabled) {\n return;\n }\n\n let newSelected = [option.value];\n\n if (multiselect) {\n if (selectedState.includes(option.value)) {\n newSelected = selectedState.filter((item) => item !== option.value);\n } else {\n newSelected = selectedState.concat([option.value]);\n }\n }\n\n setSelectedState(newSelected);\n onSelectionChange?.(event, newSelected);\n\n if (!multiselect) {\n setOpen(false);\n }\n };\n\n const clear = (event: SyntheticEvent) => {\n setSelectedState([]);\n if (selectedState.length !== 0) {\n onSelectionChange?.(event, []);\n }\n };\n\n const optionsRef = useRef<\n { value: OptionValue<Item>; element: HTMLElement }[]\n >([]);\n\n const register = useCallback(\n (optionValue: OptionValue<Item>, element: HTMLElement) => {\n const { id } = optionValue;\n const option = optionsRef.current.find((item) => item.value.id === id);\n const index = optionsRef.current.findIndex((option) => {\n return (\n option.element.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_PRECEDING\n );\n });\n\n if (!option) {\n if (index === -1) {\n optionsRef.current.push({ value: optionValue, element });\n } else {\n optionsRef.current.splice(index, 0, { value: optionValue, element });\n }\n }\n\n return () => {\n optionsRef.current = optionsRef.current.filter(\n (item) => item.value.id !== id\n );\n };\n },\n []\n );\n\n const getOptionAtIndex = (index: number) => {\n return optionsRef.current[index]?.value;\n };\n\n const getIndexOfOption = (option: OptionValue<Item>) => {\n return optionsRef.current.findIndex((item) => item.value.id === option.id);\n };\n\n const getOptionsMatching = (\n predicate: (option: OptionValue<Item>) => boolean\n ) => {\n return optionsRef.current\n .filter((item) => predicate(item.value))\n .map((item) => item.value);\n };\n\n const getOptionFromSearch = (\n search: string,\n startFrom?: OptionValue<Item>\n ) => {\n const collator = new Intl.Collator(\"en\", {\n usage: \"search\",\n sensitivity: \"base\",\n });\n\n const startIndex = startFrom ? getIndexOfOption(startFrom) + 1 : 0;\n const searchList = optionsRef.current.map((item) => item.value);\n\n let matches = searchList.filter(\n (option) =>\n collator.compare(\n valueToString(option.value).substring(0, search.length),\n search\n ) === 0\n );\n\n if (matches.length === 0) {\n const letters = search.split(\"\");\n const allSameLetter =\n letters.length > 0 &&\n letters.every((letter) => collator.compare(letter, letters[0]) === 0);\n if (allSameLetter) {\n matches = searchList.filter(\n (option) =>\n collator.compare(\n valueToString(option.value)[0].toLowerCase(),\n letters[0]\n ) === 0\n );\n }\n }\n\n return matches.find((option) => getIndexOfOption(option) >= startIndex);\n };\n\n const listRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (listRef.current) {\n const activeElement = optionsRef.current.find(\n (option) => option.value === activeState\n )?.element;\n\n if (!activeElement) {\n return;\n }\n\n const { scrollTop } = listRef.current;\n const { offsetTop, offsetHeight } = activeElement;\n\n const isVisible =\n offsetTop >= scrollTop &&\n offsetTop + offsetHeight <= scrollTop + listRef.current.offsetHeight;\n\n if (!isVisible) {\n activeElement.scrollIntoView({\n block: \"end\",\n inline: \"nearest\",\n });\n }\n }\n }, [activeState]);\n\n return {\n multiselect: Boolean(multiselect),\n openState,\n setOpen,\n openKey,\n activeState,\n setActive,\n selectedState,\n setSelectedState,\n select,\n clear,\n focusVisibleState,\n setFocusVisibleState,\n focusedState,\n setFocusedState,\n listRef,\n options: optionsRef.current.map((option) => option.element),\n register,\n getOptionAtIndex,\n getIndexOfOption,\n getOptionsMatching,\n getOptionFromSearch,\n valueToString,\n };\n}\n"],"names":["option"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- var css_248z = ".saltOption {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-left: var(--salt-spacing-100);\n padding-right: var(--salt-spacing-100);\n display: flex;\n gap: var(--salt-spacing-100);\n position: relative;\n align-items: center;\n margin-top: var(--salt-size-border);\n margin-bottom: var(--salt-size-border);\n border-top: var(--salt-size-border) var(--salt-container-borderStyle) transparent;\n border-bottom: var(--salt-size-border) var(--salt-container-borderStyle) transparent;\n cursor: var(--salt-selectable-cursor-hover);\n box-sizing: border-box;\n}\n\n.saltOption-active {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltOption-focusVisible {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-border) * -2);\n}\n\n.saltOption:hover {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltOption[aria-selected=\"true\"] {\n background: var(--salt-selectable-background-selected);\n border-color: var(--salt-selectable-borderColor-selected);\n}\n\n.saltOption[aria-disabled=\"true\"] {\n color: var(--salt-content-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n";
2
-
3
- export { css_248z as default };
4
- //# sourceMappingURL=Option.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Option.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,95 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef, useRef, useMemo, useEffect } from 'react';
3
- import { makePrefixer, useId, useForkRef, Checkbox } from '@salt-ds/core';
4
- import { clsx } from 'clsx';
5
- import { useListControlContext } from '../list-control/ListControlContext.js';
6
- import { useWindow } from '@salt-ds/window';
7
- import { useComponentCssInjection } from '@salt-ds/styles';
8
- import css_248z from './Option.css.js';
9
-
10
- const withBaseName = makePrefixer("saltOption");
11
- const Option = forwardRef(function Option2(props, ref) {
12
- const {
13
- className,
14
- children,
15
- disabled,
16
- onClick,
17
- id: idProp,
18
- value,
19
- ...rest
20
- } = props;
21
- const targetWindow = useWindow();
22
- useComponentCssInjection({
23
- testId: "salt-option",
24
- css: css_248z,
25
- window: targetWindow
26
- });
27
- const optionRef = useRef(null);
28
- const id = useId(idProp);
29
- const {
30
- setActive,
31
- activeState,
32
- multiselect,
33
- select,
34
- register,
35
- selectedState,
36
- focusVisibleState,
37
- valueToString
38
- } = useListControlContext();
39
- const selected = selectedState.includes(value);
40
- const active = (activeState == null ? void 0 : activeState.id) === id;
41
- const optionValue = useMemo(
42
- () => ({
43
- id: String(id),
44
- disabled: Boolean(disabled),
45
- value
46
- }),
47
- [id, disabled, value]
48
- );
49
- const handleClick = (event) => {
50
- if (disabled || id == void 0) {
51
- return;
52
- }
53
- setActive(optionValue);
54
- select(event, optionValue);
55
- onClick == null ? void 0 : onClick(event);
56
- };
57
- const handleMouseOver = () => {
58
- setActive(optionValue);
59
- };
60
- useEffect(() => {
61
- if (id && optionRef.current) {
62
- return register(optionValue, optionRef.current);
63
- }
64
- }, [optionValue, id, register]);
65
- const handleRef = useForkRef(optionRef, ref);
66
- return /* @__PURE__ */ jsxs("div", {
67
- "aria-disabled": disabled ? "true" : void 0,
68
- "aria-selected": selected,
69
- className: clsx(
70
- withBaseName(),
71
- {
72
- [withBaseName("active")]: active,
73
- [withBaseName("focusVisible")]: focusVisibleState && active
74
- },
75
- className
76
- ),
77
- ref: handleRef,
78
- role: "option",
79
- id,
80
- onClick: handleClick,
81
- onMouseOver: handleMouseOver,
82
- ...rest,
83
- children: [
84
- multiselect && /* @__PURE__ */ jsx(Checkbox, {
85
- checked: selected,
86
- "aria-hidden": "true",
87
- inputProps: { tabIndex: -1 }
88
- }),
89
- children != null ? children : valueToString(value)
90
- ]
91
- });
92
- });
93
-
94
- export { Option };
95
- //# sourceMappingURL=Option.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Option.js","sources":["../src/option/Option.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef,\n forwardRef,\n MouseEvent,\n ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Checkbox, makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n OptionValue,\n useListControlContext,\n} from \"../list-control/ListControlContext\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport optionCss from \"./Option.css\";\n\nexport interface OptionProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If `true`, the option will be disabled.\n */\n disabled?: boolean;\n /**\n * The value of the option.\n */\n value: unknown;\n /**\n * The content of the option.\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltOption\");\n\nexport const Option = forwardRef<HTMLDivElement, OptionProps>(function Option(\n props,\n ref\n) {\n const {\n className,\n children,\n disabled,\n onClick,\n id: idProp,\n value,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-option\",\n css: optionCss,\n window: targetWindow,\n });\n\n const optionRef = useRef(null);\n const id = useId(idProp);\n\n const {\n setActive,\n activeState,\n multiselect,\n select,\n register,\n selectedState,\n focusVisibleState,\n valueToString,\n } = useListControlContext();\n\n const selected = selectedState.includes(value);\n const active = activeState?.id === id;\n\n const optionValue: OptionValue<unknown> = useMemo(\n () => ({\n id: String(id),\n disabled: Boolean(disabled),\n value,\n }),\n [id, disabled, value]\n );\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (disabled || id == undefined) {\n return;\n }\n\n // set active descendent\n setActive(optionValue);\n\n // handle selection\n select(event, optionValue);\n\n onClick?.(event);\n };\n\n const handleMouseOver = () => {\n setActive(optionValue);\n };\n\n useEffect(() => {\n if (id && optionRef.current) {\n return register(optionValue, optionRef.current);\n }\n }, [optionValue, id, register]);\n\n const handleRef = useForkRef(optionRef, ref);\n\n return (\n <div\n aria-disabled={disabled ? \"true\" : undefined}\n aria-selected={selected}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"active\")]: active,\n [withBaseName(\"focusVisible\")]: focusVisibleState && active,\n },\n className\n )}\n ref={handleRef}\n role=\"option\"\n id={id}\n onClick={handleClick}\n onMouseOver={handleMouseOver}\n {...rest}\n >\n {multiselect && (\n <Checkbox\n checked={selected}\n aria-hidden=\"true\"\n inputProps={{ tabIndex: -1 }}\n />\n )}\n {children ?? valueToString(value)}\n </div>\n );\n});\n"],"names":["Option","optionCss"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- var css_248z = ".saltOptionGroup-label {\n background: var(--salt-container-primary-background);\n color: var(--salt-text-secondary-foreground);\n font-size: var(--salt-text-label-fontSize);\n font-weight: var(--salt-text-label-fontWeight-strong);\n height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-left: var(--salt-spacing-100);\n padding-right: var(--salt-spacing-100);\n display: flex;\n align-items: center;\n position: sticky;\n top: 0;\n z-index: 2;\n}\n";
2
-
3
- export { css_248z as default };
4
- //# sourceMappingURL=OptionGroup.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionGroup.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,40 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { makePrefixer, useId } from '@salt-ds/core';
4
- import { clsx } from 'clsx';
5
- import { useWindow } from '@salt-ds/window';
6
- import { useComponentCssInjection } from '@salt-ds/styles';
7
- import css_248z from './OptionGroup.css.js';
8
-
9
- const withBaseName = makePrefixer("saltOptionGroup");
10
- const OptionGroup = forwardRef(
11
- function OptionGroup2(props, ref) {
12
- const { className, children, label, ...rest } = props;
13
- const targetWindow = useWindow();
14
- useComponentCssInjection({
15
- testId: "salt-option-group",
16
- css: css_248z,
17
- window: targetWindow
18
- });
19
- const labelId = useId();
20
- return /* @__PURE__ */ jsxs("div", {
21
- "aria-labelledby": labelId,
22
- className: clsx(withBaseName(), className),
23
- role: "group",
24
- ref,
25
- ...rest,
26
- children: [
27
- /* @__PURE__ */ jsx("div", {
28
- "aria-hidden": true,
29
- className: withBaseName("label"),
30
- id: labelId,
31
- children: label
32
- }),
33
- children
34
- ]
35
- });
36
- }
37
- );
38
-
39
- export { OptionGroup };
40
- //# sourceMappingURL=OptionGroup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionGroup.js","sources":["../src/option/OptionGroup.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef, ReactNode } from \"react\";\nimport { makePrefixer, useId } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport optionGroupCss from \"./OptionGroup.css\";\n\nexport interface OptionGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The label of the option group.\n */\n label?: string;\n /**\n * Options to be rendered inside the option group.\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltOptionGroup\");\nexport const OptionGroup = forwardRef<HTMLDivElement, OptionGroupProps>(\n function OptionGroup(props, ref) {\n const { className, children, label, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-option-group\",\n css: optionGroupCss,\n window: targetWindow,\n });\n\n const labelId = useId();\n\n return (\n <div\n aria-labelledby={labelId}\n className={clsx(withBaseName(), className)}\n role=\"group\"\n ref={ref}\n {...rest}\n >\n <div aria-hidden className={withBaseName(\"label\")} id={labelId}>\n {label}\n </div>\n {children}\n </div>\n );\n }\n);\n"],"names":["OptionGroup","optionGroupCss"],"mappings":";;;;;;;;AAkBA,MAAM,YAAA,GAAe,aAAa,iBAAiB,CAAA,CAAA;AAC5C,MAAM,WAAc,GAAA,UAAA;AAAA,EACzB,SAASA,YAAY,CAAA,KAAA,EAAO,GAAK,EAAA;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,QAAU,EAAA,KAAA,EAAA,GAAU,MAAS,GAAA,KAAA,CAAA;AAEhD,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,mBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,UAAU,KAAM,EAAA,CAAA;AAEtB,IAAA,uBACG,IAAA,CAAA,KAAA,EAAA;AAAA,MACC,iBAAiB,EAAA,OAAA;AAAA,MACjB,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,IAAK,EAAA,OAAA;AAAA,MACL,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,aAAW,EAAA,IAAA;AAAA,UAAC,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,UAAG,EAAI,EAAA,OAAA;AAAA,UACpD,QAAA,EAAA,KAAA;AAAA,SACH,CAAA;AAAA,QACC,QAAA;AAAA,OAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,4 +0,0 @@
1
- var css_248z = ".saltOptionList {\n background: var(--salt-container-primary-background);\n border: var(--salt-size-border) var(--salt-selectable-borderStyle-selected) var(--salt-selectable-borderColor-selected);\n overflow: hidden;\n overflow-y: auto;\n position: relative;\n z-index: var(--salt-zIndex-flyover);\n box-shadow: var(--salt-overlayable-shadow-popout);\n max-height: inherit;\n min-height: inherit;\n box-sizing: border-box;\n}\n\n.saltOptionList-collapsed {\n display: none;\n}\n";
2
-
3
- export { css_248z as default };
4
- //# sourceMappingURL=OptionList.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionList.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,36 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { clsx } from 'clsx';
4
- import { makePrefixer } from '@salt-ds/core';
5
- import { useWindow } from '@salt-ds/window';
6
- import { useComponentCssInjection } from '@salt-ds/styles';
7
- import css_248z from './OptionList.css.js';
8
-
9
- const withBaseName = makePrefixer("saltOptionList");
10
- const OptionList = forwardRef(
11
- function OptionList2(props, ref) {
12
- const { children, className, collapsed, ...rest } = props;
13
- const targetWindow = useWindow();
14
- useComponentCssInjection({
15
- testId: "salt-option-list",
16
- css: css_248z,
17
- window: targetWindow
18
- });
19
- return /* @__PURE__ */ jsx("div", {
20
- role: "listbox",
21
- className: clsx(
22
- withBaseName(),
23
- {
24
- [withBaseName("collapsed")]: collapsed
25
- },
26
- className
27
- ),
28
- ref,
29
- ...rest,
30
- children
31
- });
32
- }
33
- );
34
-
35
- export { OptionList };
36
- //# sourceMappingURL=OptionList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionList.js","sources":["../src/option/OptionList.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { clsx } from \"clsx\";\nimport { makePrefixer } from \"@salt-ds/core\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport optionListCss from \"./OptionList.css\";\n\nexport interface OptionListProps extends ComponentPropsWithoutRef<\"div\"> {\n collapsed?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltOptionList\");\n\nexport const OptionList = forwardRef<HTMLDivElement, OptionListProps>(\n function OptionList(props, ref) {\n const { children, className, collapsed, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-option-list\",\n css: optionListCss,\n window: targetWindow,\n });\n\n return (\n <div\n role=\"listbox\"\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"collapsed\")]: collapsed,\n },\n className\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n"],"names":["OptionList","optionListCss"],"mappings":";;;;;;;;AAWA,MAAM,YAAA,GAAe,aAAa,gBAAgB,CAAA,CAAA;AAE3C,MAAM,UAAa,GAAA,UAAA;AAAA,EACxB,SAASA,WAAW,CAAA,KAAA,EAAO,GAAK,EAAA;AAC9B,IAAA,MAAM,EAAE,QAAA,EAAU,SAAW,EAAA,SAAA,EAAA,GAAc,MAAS,GAAA,KAAA,CAAA;AAEpD,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,kBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MACC,IAAK,EAAA,SAAA;AAAA,MACL,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb;AAAA,UACE,CAAC,YAAa,CAAA,WAAW,CAAI,GAAA,SAAA;AAAA,SAC/B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,17 +0,0 @@
1
- import { ReactNode, Ref } from "react";
2
- import { InputProps } from "@salt-ds/core";
3
- import { UseComboBoxNextProps } from "./useComboBoxNext";
4
- export declare type ComboBoxNextProps<Item = string> = {
5
- /**
6
- * The options to display in the combo box.
7
- */
8
- children?: ReactNode;
9
- } & UseComboBoxNextProps<Item> & InputProps;
10
- export declare const ComboBoxNext: <Item = string>(props: {
11
- /**
12
- * The options to display in the combo box.
13
- */
14
- children?: ReactNode;
15
- } & import("../list-control/ListControlState").ListControlProps<Item> & Pick<Omit<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "defaultValue" | "value"> & InputProps & {
16
- ref?: Ref<HTMLDivElement> | undefined;
17
- }) => JSX.Element;
@@ -1 +0,0 @@
1
- export * from "./ComboBoxNext";
@@ -1,30 +0,0 @@
1
- import { ListControlProps } from "../list-control/ListControlState";
2
- import { ComponentPropsWithoutRef, SyntheticEvent } from "react";
3
- import { OptionValue } from "../list-control/ListControlContext";
4
- export declare type UseComboBoxNextProps<Item> = ListControlProps<Item> & Pick<ComponentPropsWithoutRef<"input">, "value" | "defaultValue">;
5
- export declare function useComboBoxNext<Item>(props: UseComboBoxNextProps<Item>): {
6
- select: (event: SyntheticEvent, option: OptionValue<Item>) => void;
7
- valueState: string | number | readonly string[] | undefined;
8
- setValueState: import("react").Dispatch<import("react").SetStateAction<string | number | readonly string[] | undefined>>;
9
- multiselect: boolean;
10
- openState: boolean;
11
- setOpen: (newOpen: boolean, reason?: import("../list-control/ListControlState").OpenChangeReason | undefined, key?: string | undefined) => void;
12
- openKey: import("react").MutableRefObject<string | undefined>;
13
- activeState: OptionValue<Item> | undefined;
14
- setActive: (option?: OptionValue<Item> | undefined) => void;
15
- selectedState: Item[];
16
- setSelectedState: import("react").Dispatch<import("react").SetStateAction<Item[]>>;
17
- clear: (event: SyntheticEvent<Element, Event>) => void;
18
- focusVisibleState: boolean;
19
- setFocusVisibleState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
20
- focusedState: boolean;
21
- setFocusedState: import("react").Dispatch<import("react").SetStateAction<boolean>>;
22
- listRef: import("react").RefObject<HTMLDivElement>;
23
- options: HTMLElement[];
24
- register: (optionValue: OptionValue<Item>, element: HTMLElement) => () => void;
25
- getOptionAtIndex: (index: number) => OptionValue<Item>;
26
- getIndexOfOption: (option: OptionValue<Item>) => number;
27
- getOptionsMatching: (predicate: (option: OptionValue<Item>) => boolean) => OptionValue<Item>[];
28
- getOptionFromSearch: (search: string, startFrom?: OptionValue<Item> | undefined) => OptionValue<Item> | undefined;
29
- valueToString: (item: Item) => string;
30
- };
@@ -1,99 +0,0 @@
1
- import { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
2
- import { ListControlProps } from "../list-control/ListControlState";
3
- import { ValidationStatus } from "@salt-ds/core";
4
- export declare type DropdownNextProps<Item = string> = {
5
- /**
6
- * If `true`, the dropdown will be disabled.
7
- */
8
- disabled?: boolean;
9
- /**
10
- * If `true`, the dropdown will be read-only.
11
- */
12
- readOnly?: boolean;
13
- /**
14
- * The options to display in the dropdown.
15
- */
16
- children?: ReactNode;
17
- /**
18
- * The marker to use in an empty read only dropdown.
19
- * Use `''` to disable this feature. Defaults to '—'.
20
- */
21
- emptyReadOnlyMarker?: string;
22
- /**
23
- * If `true`, the dropdown will be multiselect.
24
- */
25
- multiselect?: boolean;
26
- /**
27
- * The text shown when the dropdown has no value.
28
- */
29
- placeholder?: string;
30
- /**
31
- * If `true`, the dropdown will be required.
32
- */
33
- required?: boolean;
34
- /**
35
- * Start adornment component
36
- */
37
- startAdornment?: ReactNode;
38
- /**
39
- * Styling variant. Defaults to "primary".
40
- */
41
- variant?: "primary" | "secondary";
42
- /**
43
- * The content of the dropdown shown in the button. The component will be controlled if this prop is provided.
44
- */
45
- value?: string;
46
- /**
47
- * Validation status, one of "error" | "warning" | "success".
48
- */
49
- validationStatus?: Exclude<ValidationStatus, "info">;
50
- } & Omit<ComponentPropsWithoutRef<"button">, "value" | "defaultValue"> & ListControlProps<Item>;
51
- export declare const DropdownNext: <Item = string>(props: {
52
- /**
53
- * If `true`, the dropdown will be disabled.
54
- */
55
- disabled?: boolean | undefined;
56
- /**
57
- * If `true`, the dropdown will be read-only.
58
- */
59
- readOnly?: boolean | undefined;
60
- /**
61
- * The options to display in the dropdown.
62
- */
63
- children?: ReactNode;
64
- /**
65
- * The marker to use in an empty read only dropdown.
66
- * Use `''` to disable this feature. Defaults to '—'.
67
- */
68
- emptyReadOnlyMarker?: string | undefined;
69
- /**
70
- * If `true`, the dropdown will be multiselect.
71
- */
72
- multiselect?: boolean | undefined;
73
- /**
74
- * The text shown when the dropdown has no value.
75
- */
76
- placeholder?: string | undefined;
77
- /**
78
- * If `true`, the dropdown will be required.
79
- */
80
- required?: boolean | undefined;
81
- /**
82
- * Start adornment component
83
- */
84
- startAdornment?: ReactNode;
85
- /**
86
- * Styling variant. Defaults to "primary".
87
- */
88
- variant?: "primary" | "secondary" | undefined;
89
- /**
90
- * The content of the dropdown shown in the button. The component will be controlled if this prop is provided.
91
- */
92
- value?: string | undefined;
93
- /**
94
- * Validation status, one of "error" | "warning" | "success".
95
- */
96
- validationStatus?: "error" | "warning" | "success" | undefined;
97
- } & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "defaultValue" | "value"> & ListControlProps<Item> & {
98
- ref?: Ref<HTMLButtonElement> | undefined;
99
- }) => JSX.Element;
@@ -1 +0,0 @@
1
- export * from "./DropdownNext";
@@ -1,21 +0,0 @@
1
- import { SyntheticEvent } from "react";
2
- export interface OptionValue<Item> {
3
- id: string;
4
- disabled: boolean;
5
- value: Item;
6
- }
7
- export declare type OpenChangeReason = "input" | "manual";
8
- export interface ListControlContextValue<Item> {
9
- openState: boolean;
10
- setOpen: (newOpen: boolean, openChangeReason?: OpenChangeReason) => void;
11
- register: (optionValue: OptionValue<Item>, element: HTMLElement) => () => void;
12
- selectedState: unknown[];
13
- select: (event: SyntheticEvent, option: OptionValue<Item>) => void;
14
- activeState?: OptionValue<Item>;
15
- setActive: (option: OptionValue<Item>) => void;
16
- multiselect: boolean;
17
- focusVisibleState: boolean;
18
- valueToString: (item: Item) => string;
19
- }
20
- export declare const ListControlContext: import("react").Context<ListControlContextValue<any>>;
21
- export declare function useListControlContext<Item>(): ListControlContextValue<Item>;