@digdir/designsystemet-react 1.0.8 → 1.1.1

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 (220) hide show
  1. package/dist/cjs/components/Combobox/Combobox.js +1 -1
  2. package/dist/cjs/components/Combobox/ComboboxIdContext.js +1 -1
  3. package/dist/cjs/components/Field/Field.js +4 -2
  4. package/dist/cjs/components/Suggestion/Suggestion.js +73 -42
  5. package/dist/cjs/components/Suggestion/SuggestionChips.js +15 -0
  6. package/dist/cjs/components/Suggestion/SuggestionClear.js +2 -30
  7. package/dist/cjs/components/Suggestion/SuggestionEmpty.js +4 -4
  8. package/dist/cjs/components/Suggestion/SuggestionInput.js +12 -23
  9. package/dist/cjs/components/Suggestion/SuggestionList.js +4 -8
  10. package/dist/cjs/components/Suggestion/SuggestionOption.js +0 -1
  11. package/dist/cjs/components/Suggestion/index.js +4 -0
  12. package/dist/cjs/components/Tabs/TabsTab.js +2 -1
  13. package/dist/cjs/components/Tooltip/Tooltip.js +33 -1
  14. package/dist/cjs/index.js +144 -156
  15. package/dist/cjs/utilities/omit/omit.js +1 -1
  16. package/dist/esm/components/Combobox/Combobox.js +1 -1
  17. package/dist/esm/components/Combobox/ComboboxIdContext.js +1 -1
  18. package/dist/esm/components/Field/Field.js +4 -2
  19. package/dist/esm/components/Suggestion/Suggestion.js +74 -43
  20. package/dist/esm/components/Suggestion/SuggestionChips.js +13 -0
  21. package/dist/esm/components/Suggestion/SuggestionClear.js +4 -31
  22. package/dist/esm/components/Suggestion/SuggestionEmpty.js +5 -5
  23. package/dist/esm/components/Suggestion/SuggestionInput.js +13 -24
  24. package/dist/esm/components/Suggestion/SuggestionList.js +4 -8
  25. package/dist/esm/components/Suggestion/SuggestionOption.js +0 -1
  26. package/dist/esm/components/Suggestion/index.js +4 -1
  27. package/dist/esm/components/Tabs/TabsTab.js +2 -1
  28. package/dist/esm/components/Tooltip/Tooltip.js +33 -1
  29. package/dist/esm/index.js +67 -73
  30. package/dist/esm/utilities/omit/omit.js +1 -1
  31. package/dist/react-types.d.ts +1 -0
  32. package/dist/types/components/Alert/index.d.ts +1 -1
  33. package/dist/types/components/Alert/index.d.ts.map +1 -1
  34. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  35. package/dist/types/components/Avatar/index.d.ts +1 -1
  36. package/dist/types/components/Avatar/index.d.ts.map +1 -1
  37. package/dist/types/components/Badge/Badge.d.ts.map +1 -1
  38. package/dist/types/components/Badge/BadgePosition.d.ts.map +1 -1
  39. package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  40. package/dist/types/components/Breadcrumbs/BreadcrumbsItem.d.ts.map +1 -1
  41. package/dist/types/components/Breadcrumbs/BreadcrumbsLink.d.ts.map +1 -1
  42. package/dist/types/components/Breadcrumbs/BreadcrumbsList.d.ts.map +1 -1
  43. package/dist/types/components/Breadcrumbs/index.d.ts +1 -1
  44. package/dist/types/components/Button/Button.d.ts.map +1 -1
  45. package/dist/types/components/Button/index.d.ts +1 -1
  46. package/dist/types/components/Button/index.d.ts.map +1 -1
  47. package/dist/types/components/Checkbox/index.d.ts +1 -1
  48. package/dist/types/components/Checkbox/index.d.ts.map +1 -1
  49. package/dist/types/components/Chip/Chips.d.ts.map +1 -1
  50. package/dist/types/components/Combobox/Combobox.d.ts +1 -1
  51. package/dist/types/components/Combobox/Combobox.d.ts.map +1 -1
  52. package/dist/types/components/Combobox/ComboboxContext.d.ts +1 -1
  53. package/dist/types/components/Combobox/ComboboxContext.d.ts.map +1 -1
  54. package/dist/types/components/Combobox/ComboboxIdContext.d.ts +1 -1
  55. package/dist/types/components/Combobox/ComboboxIdContext.d.ts.map +1 -1
  56. package/dist/types/components/Combobox/Custom.d.ts.map +1 -1
  57. package/dist/types/components/Combobox/Empty.d.ts.map +1 -1
  58. package/dist/types/components/Combobox/Option/Description.d.ts.map +1 -1
  59. package/dist/types/components/Combobox/Option/Option.d.ts.map +1 -1
  60. package/dist/types/components/Combobox/Option/useComboboxOption.d.ts.map +1 -1
  61. package/dist/types/components/Combobox/index.d.ts +1 -1
  62. package/dist/types/components/Combobox/index.d.ts.map +1 -1
  63. package/dist/types/components/Combobox/internal/ComboboxClearButton.d.ts.map +1 -1
  64. package/dist/types/components/Combobox/useCombobox.d.ts.map +1 -1
  65. package/dist/types/components/Combobox/useComboboxKeyboard.d.ts.map +1 -1
  66. package/dist/types/components/Combobox/useFloatingCombobox.d.ts +1 -1
  67. package/dist/types/components/Combobox/useFloatingCombobox.d.ts.map +1 -1
  68. package/dist/types/components/Combobox/useFormField/useFormField.d.ts.map +1 -1
  69. package/dist/types/components/Combobox/utilities.d.ts.map +1 -1
  70. package/dist/types/components/Details/index.d.ts +1 -1
  71. package/dist/types/components/Details/index.d.ts.map +1 -1
  72. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/types/components/Dialog/DialogTrigger.d.ts.map +1 -1
  74. package/dist/types/components/Dialog/DialogTriggerContext.d.ts.map +1 -1
  75. package/dist/types/components/Dialog/index.d.ts +2 -2
  76. package/dist/types/components/Dialog/index.d.ts.map +1 -1
  77. package/dist/types/components/Divider/index.d.ts +1 -1
  78. package/dist/types/components/Divider/index.d.ts.map +1 -1
  79. package/dist/types/components/Dropdown/Dropdown.d.ts.map +1 -1
  80. package/dist/types/components/Dropdown/DropdownItem.d.ts.map +1 -1
  81. package/dist/types/components/Dropdown/DropdownList.d.ts.map +1 -1
  82. package/dist/types/components/Dropdown/index.d.ts +4 -4
  83. package/dist/types/components/Dropdown/index.d.ts.map +1 -1
  84. package/dist/types/components/ErrorSummary/ErrorSummary.d.ts.map +1 -1
  85. package/dist/types/components/ErrorSummary/index.d.ts +2 -2
  86. package/dist/types/components/ErrorSummary/index.d.ts.map +1 -1
  87. package/dist/types/components/Field/Field.d.ts +10 -0
  88. package/dist/types/components/Field/Field.d.ts.map +1 -1
  89. package/dist/types/components/Field/index.d.ts +3 -2
  90. package/dist/types/components/Field/index.d.ts.map +1 -1
  91. package/dist/types/components/Fieldset/FieldsetLegend.d.ts.map +1 -1
  92. package/dist/types/components/Fieldset/index.d.ts +2 -2
  93. package/dist/types/components/Fieldset/index.d.ts.map +1 -1
  94. package/dist/types/components/Heading/index.d.ts +1 -1
  95. package/dist/types/components/Heading/index.d.ts.map +1 -1
  96. package/dist/types/components/Input/index.d.ts +1 -1
  97. package/dist/types/components/Input/index.d.ts.map +1 -1
  98. package/dist/types/components/Label/index.d.ts +1 -1
  99. package/dist/types/components/Label/index.d.ts.map +1 -1
  100. package/dist/types/components/Link/index.d.ts +1 -1
  101. package/dist/types/components/Link/index.d.ts.map +1 -1
  102. package/dist/types/components/List/ListItem.d.ts.map +1 -1
  103. package/dist/types/components/List/Lists.d.ts.map +1 -1
  104. package/dist/types/components/List/index.d.ts +1 -1
  105. package/dist/types/components/List/index.d.ts.map +1 -1
  106. package/dist/types/components/Pagination/Pagination.d.ts.map +1 -1
  107. package/dist/types/components/Pagination/PaginationItem.d.ts.map +1 -1
  108. package/dist/types/components/Pagination/PaginationList.d.ts.map +1 -1
  109. package/dist/types/components/Pagination/index.d.ts +1 -1
  110. package/dist/types/components/Paragraph/index.d.ts +1 -1
  111. package/dist/types/components/Paragraph/index.d.ts.map +1 -1
  112. package/dist/types/components/Popover/Popover.d.ts +1 -1
  113. package/dist/types/components/Popover/Popover.d.ts.map +1 -1
  114. package/dist/types/components/Popover/PopoverTrigger.d.ts.map +1 -1
  115. package/dist/types/components/Popover/PopoverTriggerContext.d.ts.map +1 -1
  116. package/dist/types/components/Popover/index.d.ts +2 -2
  117. package/dist/types/components/Popover/index.d.ts.map +1 -1
  118. package/dist/types/components/Radio/index.d.ts +1 -1
  119. package/dist/types/components/Radio/index.d.ts.map +1 -1
  120. package/dist/types/components/Search/SearchButton.d.ts.map +1 -1
  121. package/dist/types/components/Select/Select.d.ts.map +1 -1
  122. package/dist/types/components/Select/SelectOptgroup.d.ts.map +1 -1
  123. package/dist/types/components/Select/SelectOption.d.ts.map +1 -1
  124. package/dist/types/components/Select/index.d.ts +1 -1
  125. package/dist/types/components/Select/index.d.ts.map +1 -1
  126. package/dist/types/components/Skeleton/Skeleton.d.ts.map +1 -1
  127. package/dist/types/components/SkipLink/SkipLink.d.ts.map +1 -1
  128. package/dist/types/components/SkipLink/index.d.ts +1 -1
  129. package/dist/types/components/SkipLink/index.d.ts.map +1 -1
  130. package/dist/types/components/Spinner/index.d.ts +1 -1
  131. package/dist/types/components/Spinner/index.d.ts.map +1 -1
  132. package/dist/types/components/Suggestion/Suggestion.d.ts +100 -74
  133. package/dist/types/components/Suggestion/Suggestion.d.ts.map +1 -1
  134. package/dist/types/components/Suggestion/SuggestionChips.d.ts +19 -0
  135. package/dist/types/components/Suggestion/SuggestionChips.d.ts.map +1 -0
  136. package/dist/types/components/Suggestion/SuggestionClear.d.ts +1 -8
  137. package/dist/types/components/Suggestion/SuggestionClear.d.ts.map +1 -1
  138. package/dist/types/components/Suggestion/SuggestionEmpty.d.ts +1 -1
  139. package/dist/types/components/Suggestion/SuggestionEmpty.d.ts.map +1 -1
  140. package/dist/types/components/Suggestion/SuggestionInput.d.ts +1 -1
  141. package/dist/types/components/Suggestion/SuggestionInput.d.ts.map +1 -1
  142. package/dist/types/components/Suggestion/SuggestionList.d.ts +5 -5
  143. package/dist/types/components/Suggestion/SuggestionList.d.ts.map +1 -1
  144. package/dist/types/components/Suggestion/SuggestionOption.d.ts +0 -1
  145. package/dist/types/components/Suggestion/SuggestionOption.d.ts.map +1 -1
  146. package/dist/types/components/Suggestion/index.d.ts +23 -8
  147. package/dist/types/components/Suggestion/index.d.ts.map +1 -1
  148. package/dist/types/components/Switch/index.d.ts +1 -1
  149. package/dist/types/components/Switch/index.d.ts.map +1 -1
  150. package/dist/types/components/Table/Table.d.ts.map +1 -1
  151. package/dist/types/components/Table/TableBody.d.ts.map +1 -1
  152. package/dist/types/components/Table/TableCell.d.ts.map +1 -1
  153. package/dist/types/components/Table/TableFoot.d.ts.map +1 -1
  154. package/dist/types/components/Table/TableHead.d.ts.map +1 -1
  155. package/dist/types/components/Table/TableHeaderCell.d.ts.map +1 -1
  156. package/dist/types/components/Table/TableRow.d.ts.map +1 -1
  157. package/dist/types/components/Table/index.d.ts +6 -6
  158. package/dist/types/components/Table/index.d.ts.map +1 -1
  159. package/dist/types/components/Tabs/TabsTab.d.ts.map +1 -1
  160. package/dist/types/components/Tabs/index.d.ts +1 -1
  161. package/dist/types/components/Tabs/index.d.ts.map +1 -1
  162. package/dist/types/components/Tag/index.d.ts +1 -1
  163. package/dist/types/components/Tag/index.d.ts.map +1 -1
  164. package/dist/types/components/Textarea/index.d.ts +1 -1
  165. package/dist/types/components/Textarea/index.d.ts.map +1 -1
  166. package/dist/types/components/Textfield/Textfield.d.ts.map +1 -1
  167. package/dist/types/components/Textfield/index.d.ts +1 -1
  168. package/dist/types/components/Textfield/index.d.ts.map +1 -1
  169. package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -1
  170. package/dist/types/components/ValidationMessage/index.d.ts +1 -1
  171. package/dist/types/components/ValidationMessage/index.d.ts.map +1 -1
  172. package/dist/types/components/index.d.ts +29 -30
  173. package/dist/types/components/index.d.ts.map +1 -1
  174. package/dist/types/index.d.ts +1 -1
  175. package/dist/types/index.d.ts.map +1 -1
  176. package/dist/types/utilities/RovingFocus/RovingFocusItem.d.ts.map +1 -1
  177. package/dist/types/utilities/RovingFocus/RovingFocusRoot.d.ts.map +1 -1
  178. package/dist/types/utilities/RovingFocus/index.d.ts +1 -1
  179. package/dist/types/utilities/RovingFocus/index.d.ts.map +1 -1
  180. package/dist/types/utilities/hooks/index.d.ts +5 -5
  181. package/dist/types/utilities/hooks/index.d.ts.map +1 -1
  182. package/dist/types/utilities/hooks/useCheckboxGroup/useCheckboxGroup.d.ts.map +1 -1
  183. package/dist/types/utilities/hooks/useMergeRefs/useMergeRefs.d.ts.map +1 -1
  184. package/dist/types/utilities/hooks/usePagination/usePagination.d.ts.map +1 -1
  185. package/dist/types/utilities/hooks/useRadioGroup/useRadioGroup.d.ts.map +1 -1
  186. package/dist/types/utilities/index.d.ts +2 -2
  187. package/dist/types/utilities/index.d.ts.map +1 -1
  188. package/package.json +16 -18
  189. package/dist/cjs/components/MultiSuggestion/MultiSuggestion.js +0 -160
  190. package/dist/cjs/components/MultiSuggestion/MultiSuggestionChips.js +0 -20
  191. package/dist/cjs/components/MultiSuggestion/MultiSuggestionClear.js +0 -52
  192. package/dist/cjs/components/MultiSuggestion/MultiSuggestionEmpty.js +0 -23
  193. package/dist/cjs/components/MultiSuggestion/MultiSuggestionInput.js +0 -37
  194. package/dist/cjs/components/MultiSuggestion/MultiSuggestionList.js +0 -30
  195. package/dist/cjs/components/MultiSuggestion/MultiSuggestionOption.js +0 -12
  196. package/dist/cjs/components/MultiSuggestion/index.js +0 -34
  197. package/dist/esm/components/MultiSuggestion/MultiSuggestion.js +0 -157
  198. package/dist/esm/components/MultiSuggestion/MultiSuggestionChips.js +0 -18
  199. package/dist/esm/components/MultiSuggestion/MultiSuggestionClear.js +0 -49
  200. package/dist/esm/components/MultiSuggestion/MultiSuggestionEmpty.js +0 -21
  201. package/dist/esm/components/MultiSuggestion/MultiSuggestionInput.js +0 -35
  202. package/dist/esm/components/MultiSuggestion/MultiSuggestionList.js +0 -28
  203. package/dist/esm/components/MultiSuggestion/MultiSuggestionOption.js +0 -10
  204. package/dist/esm/components/MultiSuggestion/index.js +0 -26
  205. package/dist/types/components/MultiSuggestion/MultiSuggestion.d.ts +0 -131
  206. package/dist/types/components/MultiSuggestion/MultiSuggestion.d.ts.map +0 -1
  207. package/dist/types/components/MultiSuggestion/MultiSuggestionChips.d.ts +0 -20
  208. package/dist/types/components/MultiSuggestion/MultiSuggestionChips.d.ts.map +0 -1
  209. package/dist/types/components/MultiSuggestion/MultiSuggestionClear.d.ts +0 -35
  210. package/dist/types/components/MultiSuggestion/MultiSuggestionClear.d.ts.map +0 -1
  211. package/dist/types/components/MultiSuggestion/MultiSuggestionEmpty.d.ts +0 -15
  212. package/dist/types/components/MultiSuggestion/MultiSuggestionEmpty.d.ts.map +0 -1
  213. package/dist/types/components/MultiSuggestion/MultiSuggestionInput.d.ts +0 -21
  214. package/dist/types/components/MultiSuggestion/MultiSuggestionInput.d.ts.map +0 -1
  215. package/dist/types/components/MultiSuggestion/MultiSuggestionList.d.ts +0 -40
  216. package/dist/types/components/MultiSuggestion/MultiSuggestionList.d.ts.map +0 -1
  217. package/dist/types/components/MultiSuggestion/MultiSuggestionOption.d.ts +0 -6
  218. package/dist/types/components/MultiSuggestion/MultiSuggestionOption.d.ts.map +0 -1
  219. package/dist/types/components/MultiSuggestion/index.d.ts +0 -50
  220. package/dist/types/components/MultiSuggestion/index.d.ts.map +0 -1
@@ -6,7 +6,6 @@ var react$1 = require('@floating-ui/react');
6
6
  var reactVirtual = require('@tanstack/react-virtual');
7
7
  var cl = require('clsx/lite');
8
8
  var react = require('react');
9
- var useFormField = require('./useFormField/useFormField.js');
10
9
  var ComboboxContext = require('./ComboboxContext.js');
11
10
  var ComboboxIdContext = require('./ComboboxIdContext.js');
12
11
  var Custom = require('./Custom.js');
@@ -17,6 +16,7 @@ var ComboboxNative = require('./internal/ComboboxNative.js');
17
16
  var useCombobox = require('./useCombobox.js');
18
17
  var useComboboxKeyboard = require('./useComboboxKeyboard.js');
19
18
  var useFloatingCombobox = require('./useFloatingCombobox.js');
19
+ var useFormField = require('./useFormField/useFormField.js');
20
20
  var utilities = require('./utilities.js');
21
21
  var useDebounceCallback = require('../../utilities/hooks/useDebounceCallback/useDebounceCallback.js');
22
22
  var Spinner = require('../Spinner/Spinner.js');
@@ -21,7 +21,7 @@ const ComboboxIdReducer = (state, action) => {
21
21
  const ComboboxIdDispatch = react.createContext(() => {
22
22
  throw new Error('ComboboxIdDispatch must be used within a provider');
23
23
  });
24
- const ComboboxIdProvider = ({ children, }) => {
24
+ const ComboboxIdProvider = ({ children }) => {
25
25
  const [state, dispatch] = react.useReducer(ComboboxIdReducer, {
26
26
  activeIndex: 0,
27
27
  });
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
+ var reactSlot = require('@radix-ui/react-slot');
5
6
  var cl = require('clsx/lite');
6
7
  var react = require('react');
7
8
  var fieldObserver = require('./fieldObserver.js');
@@ -18,11 +19,12 @@ var useMergeRefs = require('../../utilities/hooks/useMergeRefs/useMergeRefs.js')
18
19
  * <ValidationMessage>Feilmelding</ValidationMessage>
19
20
  * </Field>
20
21
  */
21
- const Field = react.forwardRef(function Field({ className, position, ...rest }, ref) {
22
+ const Field = react.forwardRef(function Field({ className, position, asChild, ...rest }, ref) {
23
+ const Component = asChild ? reactSlot.Slot : 'div';
22
24
  const fieldRef = react.useRef(null);
23
25
  const mergedRefs = useMergeRefs.useMergeRefs([fieldRef, ref]);
24
26
  react.useEffect(() => fieldObserver.fieldObserver(fieldRef.current), []);
25
- return (jsxRuntime.jsx("div", { className: cl('ds-field', className), "data-position": position, ref: mergedRefs, ...rest }));
27
+ return (jsxRuntime.jsx(Component, { className: cl('ds-field', className), "data-position": position, ref: mergedRefs, ...rest }));
26
28
  });
27
29
 
28
30
  exports.Field = Field;
@@ -2,52 +2,83 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
- var reactSlot = require('@radix-ui/react-slot');
6
- var uDatalist = require('@u-elements/u-datalist');
7
- var cl = require('clsx/lite');
8
5
  var react = require('react');
6
+ require('@u-elements/u-combobox');
7
+ var cl = require('clsx/lite');
8
+ var useMergeRefs = require('../../utilities/hooks/useMergeRefs/useMergeRefs.js');
9
9
 
10
- const SuggestionContext = react.createContext({});
11
- /**
12
- * A component that provides a suggestion list for an input field.
13
- *
14
- * @example
15
- * <Suggestion>
16
- * <Suggestion.Input />
17
- * <Suggestion.Clear />
18
- * <Suggestion.List>
19
- * <Suggestion.Empty>Tomt</Suggestion.Empty>
20
- * <Suggestion.Option value='Option 1'>Option 1</Suggestion.Option>
21
- * <Suggestion.Option value='Option 2'>Option 2</Suggestion.Option>
22
- * </Suggestion.List>
23
- * </Suggestion>
24
- */
25
- const Suggestion = react.forwardRef(function Suggestion({ className, filter = true, asChild, ...rest }, ref) {
26
- const Component = asChild ? reactSlot.Slot : 'div';
27
- const [listId, setListId] = react.useState(react.useId());
28
- const inputRef = react.useRef(null);
29
- const handleFilter = react.useCallback((input) => {
30
- const list = input?.list;
31
- // Let <datalist> handle filtering if filter is true
32
- if (filter === true || !list)
33
- return;
34
- // Handle custom filter
35
- if (filter !== false) {
36
- let index = 0;
37
- for (const option of list.getElementsByTagName('u-option')) {
38
- if (!option.hasAttribute('data-empty'))
39
- option.disabled = !filter({
40
- index: index++, // Increment index for each <option>
41
- input,
42
- optionElement: option,
43
- text: option.text,
44
- value: uDatalist.getDatalistValue(option),
45
- });
10
+ const SuggestionContext = react.createContext({
11
+ handleFilter: () => undefined,
12
+ });
13
+ const text = (el) => el.textContent?.trim() || '';
14
+ const sanitizeItems = (values = []) => typeof values === 'string'
15
+ ? [{ label: values, value: values }]
16
+ : values.map((value) => typeof value === 'string'
17
+ ? { label: value, value }
18
+ : {
19
+ label: value.label || value.value || '',
20
+ value: value.value || '',
21
+ });
22
+ const nextItems = (data, prev, multiple) => {
23
+ const item = { label: text(data), value: data.value };
24
+ if (!multiple)
25
+ return data.isConnected ? [] : [item];
26
+ return data.isConnected
27
+ ? sanitizeItems(prev).filter(({ value }) => value !== item.value)
28
+ : [...sanitizeItems(prev), item];
29
+ };
30
+ const defaultFilter = ({ label, input }) => label.toLowerCase().includes(input.value.trim().toLowerCase());
31
+ const Suggestion = react.forwardRef(function Suggestion({ children, className, creatable = false, defaultValue, filter = true, multiple = false, name, onValueChange, value, ...rest }, ref) {
32
+ const uComboboxRef = react.useRef(null);
33
+ const isContolled = value !== undefined;
34
+ const mergedRefs = useMergeRefs.useMergeRefs([ref, uComboboxRef]);
35
+ const [isEmpty, setIsEmpty] = react.useState(false);
36
+ const [selectedItems, setSelectedItems] = react.useState(sanitizeItems(defaultValue || value));
37
+ // Update if controlled values
38
+ const prevControlled = react.useRef(value);
39
+ if (value !== prevControlled.current) {
40
+ prevControlled.current = value;
41
+ setSelectedItems(sanitizeItems(prevControlled.current));
42
+ }
43
+ /**
44
+ * Listerners and handling of adding/removing
45
+ */
46
+ react.useEffect(() => {
47
+ const combobox = uComboboxRef.current;
48
+ const beforeChange = (event) => {
49
+ event.preventDefault();
50
+ const multiple = combobox?.multiple;
51
+ const data = event.detail;
52
+ if (isContolled)
53
+ onValueChange?.(nextItems(data, prevControlled.current, multiple));
54
+ else
55
+ setSelectedItems((prevItems) => nextItems(data, prevItems, multiple));
56
+ };
57
+ combobox?.addEventListener('beforechange', beforeChange);
58
+ return () => combobox?.removeEventListener('beforechange', beforeChange);
59
+ }, [isContolled, setSelectedItems]);
60
+ const handleFilter = react.useCallback(() => {
61
+ const { control: input, options = [] } = uComboboxRef?.current || {};
62
+ const filterFn = filter === true ? defaultFilter : filter;
63
+ let disabled = 0;
64
+ let index = 0;
65
+ for (const option of options)
66
+ if (!option.hasAttribute('data-empty')) {
67
+ if (filterFn && input)
68
+ option.disabled =
69
+ !filterFn({
70
+ index,
71
+ input,
72
+ label: option.label,
73
+ optionElement: option,
74
+ text: option.text,
75
+ value: option.value,
76
+ }) && Boolean(++disabled);
77
+ index++; // Increment index for each <option>
46
78
  }
47
- }
48
- uDatalist.syncDatalistState(input); // Sync the datalist state if filter is custom or false
79
+ setIsEmpty(index === disabled);
49
80
  }, [filter]);
50
- return (jsxRuntime.jsx(SuggestionContext.Provider, { value: { inputRef, listId, setListId, handleFilter }, children: jsxRuntime.jsx(Component, { className: cl('ds-suggestion', className), ref: ref, ...rest }) }));
81
+ return (jsxRuntime.jsx(SuggestionContext.Provider, { value: { isEmpty, selectedItems, handleFilter }, children: jsxRuntime.jsxs("u-combobox", { "data-multiple": multiple || undefined, "data-creatable": creatable || undefined, class: cl('ds-suggestion', className), ref: mergedRefs, ...rest, children: [children, !!name && jsxRuntime.jsx("select", { name: name, multiple: true, hidden: true })] }) }));
51
82
  });
52
83
 
53
84
  exports.Suggestion = Suggestion;
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var react = require('react');
6
+ var index = require('../Chip/index.js');
7
+ var Suggestion = require('./Suggestion.js');
8
+
9
+ const SuggestionChips = ({ render = ({ label }) => label, }) => {
10
+ const { selectedItems = [] } = react.useContext(Suggestion.SuggestionContext);
11
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: selectedItems.map((item) => (jsxRuntime.jsx(index.Chip.Removable, { value: item.value, asChild: true, children: jsxRuntime.jsx("data", { children: render(item) }) }, item.value))) }));
12
+ };
13
+ SuggestionChips.displayName = 'SuggestionChips';
14
+
15
+ exports.SuggestionChips = SuggestionChips;
@@ -3,11 +3,10 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- var Suggestion = require('./Suggestion.js');
7
6
  var Button = require('../Button/Button.js');
8
7
 
9
8
  /**
10
- * Component that provides a clear button for the suggestion input.
9
+ * Component that provides a clear button for the Suggestion input.
11
10
  *
12
11
  * Place as a descendant of `Suggestion`
13
12
  *
@@ -19,34 +18,7 @@ var Button = require('../Button/Button.js');
19
18
  * </Suggestion>
20
19
  */
21
20
  const SuggestionClear = react.forwardRef(function SuggestionClear({ 'aria-label': label = 'Tøm', onClick, ...rest }, ref) {
22
- const { inputRef } = react.useContext(Suggestion.SuggestionContext); //, handleValueChange
23
- const handleClear = (event) => {
24
- if (!inputRef?.current)
25
- throw new Error('Input is missing');
26
- /* narrow type to make TS happy */
27
- if (!(inputRef?.current instanceof HTMLInputElement))
28
- throw new Error('Input is not an input element');
29
- event.preventDefault();
30
- setReactInputValue(inputRef.current, '');
31
- inputRef.current.focus();
32
- onClick?.(event);
33
- };
34
- return (jsxRuntime.jsx(Button.Button, { ref: ref, variant: 'tertiary', type: 'reset', "aria-label": label, onClick: handleClear, icon: true, ...rest }));
21
+ return (jsxRuntime.jsx(Button.Button, { "aria-label": label, asChild: true, icon: true, hidden: true, ref: ref, variant: 'tertiary', ...rest, children: jsxRuntime.jsx("del", {}) }));
35
22
  });
36
- // Copied from https://github.com/facebook/react/issues/11488#issuecomment-1300987446
37
- const setReactInputValue = (input, value) => {
38
- const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;
39
- if (nativeInputValueSetter) {
40
- nativeInputValueSetter.call(input, value);
41
- }
42
- else {
43
- throw new Error('Unable to find the native input value setter');
44
- }
45
- const inputEvent = new Event('input', { bubbles: true });
46
- const changeEvent = new Event('change', { bubbles: true });
47
- input.dispatchEvent(inputEvent);
48
- input.dispatchEvent(changeEvent);
49
- };
50
23
 
51
24
  exports.SuggestionClear = SuggestionClear;
52
- exports.setReactInputValue = setReactInputValue;
@@ -3,9 +3,10 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
+ var Suggestion = require('./Suggestion.js');
6
7
 
7
8
  /**
8
- * Component that provides an empty suggestion list.
9
+ * Component that provides an empty Suggestion list.
9
10
  *
10
11
  * Place as a descendant of `Suggestion.List`
11
12
  *
@@ -15,9 +16,8 @@ var react = require('react');
15
16
  * </Suggestion.List>
16
17
  */
17
18
  const SuggestionEmpty = react.forwardRef(function SuggestionEmpty(rest, ref) {
18
- return (
19
- // biome-ignore lint/a11y/noInteractiveElementToNoninteractiveRole: Empty option shoult not be interactive
20
- jsxRuntime.jsx("u-option", { "data-empty": true, role: 'none', ref: ref, ...rest }));
19
+ const { isEmpty } = react.useContext(Suggestion.SuggestionContext);
20
+ return isEmpty ? jsxRuntime.jsx("u-option", { "data-empty": true, value: '', ref: ref, ...rest }) : null;
21
21
  });
22
22
 
23
23
  exports.SuggestionEmpty = SuggestionEmpty;
@@ -2,14 +2,12 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
- var uDatalist = require('@u-elements/u-datalist');
6
5
  var react = require('react');
7
6
  var Suggestion = require('./Suggestion.js');
8
- var useMergeRefs = require('../../utilities/hooks/useMergeRefs/useMergeRefs.js');
9
7
  var Input = require('../Input/Input.js');
10
8
 
11
9
  /**
12
- * Component that provides an input field for the suggestion list.
10
+ * Component that provides an input field for the Suggestion list.
13
11
  *
14
12
  * Place as a descendant of `Suggestion`
15
13
  *
@@ -19,27 +17,18 @@ var Input = require('../Input/Input.js');
19
17
  * <Suggestion.List />
20
18
  * </Suggestion>
21
19
  */
22
- const SuggestionInput = react.forwardRef(function SuggestionList({ value, onInput, ...rest }, ref) {
23
- const { listId, inputRef, handleFilter } = react.useContext(Suggestion.SuggestionContext);
24
- const mergedRefs = useMergeRefs.useMergeRefs([inputRef, ref]);
25
- const updateSelected = react.useCallback(() => {
26
- const { list, value } = inputRef?.current || {};
27
- for (const option of list?.options || []) {
28
- option.selected = uDatalist.getDatalistValue(option) === value;
29
- }
30
- }, []);
31
- // Update also if controlled value
32
- react.useEffect(() => {
33
- updateSelected();
34
- handleFilter?.(inputRef?.current);
35
- }, [value]);
36
- return (jsxRuntime.jsx(Input.Input, { ref: mergedRefs, list: listId, value: value, onInput: (event) => {
20
+ const SuggestionInput = react.forwardRef(function SuggestionList({ value, onInput, onChange, ...rest }, ref) {
21
+ const { handleFilter } = react.useContext(Suggestion.SuggestionContext);
22
+ react.useEffect(handleFilter, [value]); // Filter if controlled value
23
+ if (onChange)
24
+ console.warn('SuggestionInput: Avoid using onChange, as Suggestion controls the Input. Use onValueChange on Suggest instead, or onInput if fetching API results');
25
+ if (value)
26
+ console.warn('SuggestionInput: Avoid using value, as Suggestion controls the Input. Use value on Suggest instead.');
27
+ return (jsxRuntime.jsx(Input.Input, { placeholder: '' // We need an empty placeholder for the clear button to be able to show/hide
28
+ , ref: ref, onInput: (event) => {
37
29
  onInput?.(event); // Should run first
38
- updateSelected();
39
- if (!uDatalist.isDatalistClick(event.nativeEvent))
40
- handleFilter?.(inputRef?.current);
41
- }, placeholder: '' // We need an empty placeholder for the clear button to be able to show/hide
42
- , ...rest }));
30
+ handleFilter?.(); // Filter if uncontrolled value
31
+ }, ...rest }));
43
32
  });
44
33
 
45
34
  exports.SuggestionInput = SuggestionInput;
@@ -7,7 +7,7 @@ require('@u-elements/u-datalist');
7
7
  var Suggestion = require('./Suggestion.js');
8
8
 
9
9
  /**
10
- * Component that provides a suggestion list.
10
+ * Component that provides a Suggestion list.
11
11
  *
12
12
  * Place as a descendant of `Suggestion`
13
13
  *
@@ -18,13 +18,9 @@ var Suggestion = require('./Suggestion.js');
18
18
  * </Suggestion>
19
19
  */
20
20
  const SuggestionList = react.forwardRef(function SuggestionList({ singular = '%d forslag', plural = '%d forslag', className, id, ...rest }, ref) {
21
- const { inputRef, listId, setListId, handleFilter } = react.useContext(Suggestion.SuggestionContext);
22
- react.useEffect(() => handleFilter?.(inputRef?.current)); // Must run on every render
23
- react.useEffect(() => {
24
- if (id && listId !== id)
25
- setListId?.(id);
26
- }, [listId, id, setListId]);
27
- return (jsxRuntime.jsx("u-datalist", { "data-sr-singular": singular, "data-sr-plural": plural, class: className, id: listId, ref: ref, ...rest }));
21
+ const { handleFilter } = react.useContext(Suggestion.SuggestionContext);
22
+ react.useEffect(handleFilter); // Must run on every render
23
+ return (jsxRuntime.jsx("u-datalist", { "data-nofilter": true, "data-sr-singular": singular, "data-sr-plural": plural, class: className, ref: ref, ...rest }));
28
24
  });
29
25
 
30
26
  exports.SuggestionList = SuggestionList;
@@ -3,7 +3,6 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- require('@u-elements/u-datalist');
7
6
 
8
7
  const SuggestionOption = react.forwardRef(function SuggestionOption({ className, ...rest }, ref) {
9
8
  return (jsxRuntime.jsx("u-option", { class: className, ref: ref, ...rest }));
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var Suggestion = require('./Suggestion.js');
5
+ var SuggestionChips = require('./SuggestionChips.js');
5
6
  var SuggestionClear = require('./SuggestionClear.js');
6
7
  var SuggestionEmpty = require('./SuggestionEmpty.js');
7
8
  var SuggestionInput = require('./SuggestionInput.js');
@@ -23,6 +24,7 @@ var SuggestionOption = require('./SuggestionOption.js');
23
24
  * </Suggestion>
24
25
  */
25
26
  const EXPERIMENTAL_Suggestion = Object.assign(Suggestion.Suggestion, {
27
+ Chips: SuggestionChips.SuggestionChips,
26
28
  List: SuggestionList.SuggestionList,
27
29
  Input: SuggestionInput.SuggestionInput,
28
30
  Empty: SuggestionEmpty.SuggestionEmpty,
@@ -30,12 +32,14 @@ const EXPERIMENTAL_Suggestion = Object.assign(Suggestion.Suggestion, {
30
32
  Clear: SuggestionClear.SuggestionClear,
31
33
  });
32
34
  EXPERIMENTAL_Suggestion.displayName = 'EXPERIMENTAL_Suggestion';
35
+ EXPERIMENTAL_Suggestion.Chips.displayName = 'EXPERIMENTAL_Suggestion.Chips';
33
36
  EXPERIMENTAL_Suggestion.List.displayName = 'EXPERIMENTAL_Suggestion.List';
34
37
  EXPERIMENTAL_Suggestion.Input.displayName = 'EXPERIMENTAL_Suggestion.Input';
35
38
  EXPERIMENTAL_Suggestion.Empty.displayName = 'EXPERIMENTAL_Suggestion.Empty';
36
39
  EXPERIMENTAL_Suggestion.Option.displayName = 'EXPERIMENTAL_Suggestion.Option';
37
40
  EXPERIMENTAL_Suggestion.Clear.displayName = 'EXPERIMENTAL_Suggestion.Clear';
38
41
 
42
+ exports.EXPERIMENTAL_SuggestionChips = SuggestionChips.SuggestionChips;
39
43
  exports.EXPERIMENTAL_SuggestionClear = SuggestionClear.SuggestionClear;
40
44
  exports.EXPERIMENTAL_SuggestionEmpty = SuggestionEmpty.SuggestionEmpty;
41
45
  exports.EXPERIMENTAL_SuggestionInput = SuggestionInput.SuggestionInput;
@@ -14,7 +14,8 @@ var Tabs = require('./Tabs.js');
14
14
  */
15
15
  const TabsTab = react.forwardRef(function TabsTab({ value, id, ...rest }, ref) {
16
16
  const tabs = react.useContext(Tabs.Context);
17
- const buttonId = id ?? `tab-${react.useId()}`;
17
+ const generatedId = react.useId();
18
+ const buttonId = id ?? `tab-${generatedId}`;
18
19
  return (jsxRuntime.jsx(RovingFocusItem.RovingFocusItem, { value: value, ...rest, asChild: true, children: jsxRuntime.jsx("button", { ...rest, "aria-selected": tabs.value === value, id: buttonId, onClick: () => tabs.onChange?.(value), ref: ref, role: 'tab', type: 'button' }) }));
19
20
  });
20
21
 
@@ -57,6 +57,7 @@ const Tooltip = react.forwardRef(function Tooltip({ id, children, content, place
57
57
  : []),
58
58
  dom.shift(),
59
59
  arrowPseudoElement,
60
+ safeAreaElement,
60
61
  ],
61
62
  }).then(({ x, y }) => {
62
63
  tooltip.style.translate = `${x}px ${y}px`;
@@ -89,7 +90,7 @@ const Tooltip = react.forwardRef(function Tooltip({ id, children, content, place
89
90
  ? 'popoverTargetAction'
90
91
  : 'popovertargetaction']: 'show',
91
92
  };
92
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ChildContainer, { ref: triggerRef, ...popoverProps, onMouseEnter: setOpen, onMouseLeave: setClose, onFocus: setOpen, onBlur: setClose, children: children }), jsxRuntime.jsx("span", { ref: mergedRefs, role: 'tooltip', className: cl('ds-tooltip', className), id: id ?? randomTooltipId, popover: 'manual', ...rest, children: content })] }));
93
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ChildContainer, { ref: triggerRef, ...popoverProps, onMouseEnter: setOpen, onMouseLeave: setClose, onFocus: setOpen, onBlur: setClose, children: children }), jsxRuntime.jsx("span", { onMouseEnter: setOpen, onMouseLeave: setClose, ref: mergedRefs, role: 'tooltip', className: cl('ds-tooltip', className), id: id ?? randomTooltipId, popover: 'manual', ...rest, children: content })] }));
93
94
  });
94
95
  const arrowPseudoElement = {
95
96
  name: 'ArrowPseudoElement',
@@ -116,5 +117,36 @@ const arrowPseudoElement = {
116
117
  return data;
117
118
  },
118
119
  };
120
+ const safeAreaElement = {
121
+ name: 'SafeAreaElement',
122
+ fn(data) {
123
+ const { elements, placement } = data;
124
+ let width = '100%';
125
+ let height = 'var(--dsc-tooltip-arrow-size)';
126
+ let translate = '0px';
127
+ switch (placement) {
128
+ case 'top':
129
+ translate = `-50% 0%`;
130
+ break;
131
+ case 'right':
132
+ height = '100%';
133
+ width = 'var(--dsc-tooltip-arrow-size)';
134
+ translate = '-100% -50%';
135
+ break;
136
+ case 'bottom':
137
+ translate = '-50% -100%';
138
+ break;
139
+ case 'left':
140
+ height = '100%';
141
+ width = 'var(--dsc-tooltip-arrow-size)';
142
+ translate = '0 -50%';
143
+ break;
144
+ }
145
+ elements.floating.style.setProperty('--_dsc-tooltip-safearea-height', height);
146
+ elements.floating.style.setProperty('--_dsc-tooltip-safearea-width', width);
147
+ elements.floating.style.setProperty('--_dsc-tooltip-safearea-translate', translate);
148
+ return data;
149
+ },
150
+ };
119
151
 
120
152
  exports.Tooltip = Tooltip;