@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.
- package/dist/cjs/components/Combobox/Combobox.js +1 -1
- package/dist/cjs/components/Combobox/ComboboxIdContext.js +1 -1
- package/dist/cjs/components/Field/Field.js +4 -2
- package/dist/cjs/components/Suggestion/Suggestion.js +73 -42
- package/dist/cjs/components/Suggestion/SuggestionChips.js +15 -0
- package/dist/cjs/components/Suggestion/SuggestionClear.js +2 -30
- package/dist/cjs/components/Suggestion/SuggestionEmpty.js +4 -4
- package/dist/cjs/components/Suggestion/SuggestionInput.js +12 -23
- package/dist/cjs/components/Suggestion/SuggestionList.js +4 -8
- package/dist/cjs/components/Suggestion/SuggestionOption.js +0 -1
- package/dist/cjs/components/Suggestion/index.js +4 -0
- package/dist/cjs/components/Tabs/TabsTab.js +2 -1
- package/dist/cjs/components/Tooltip/Tooltip.js +33 -1
- package/dist/cjs/index.js +144 -156
- package/dist/cjs/utilities/omit/omit.js +1 -1
- package/dist/esm/components/Combobox/Combobox.js +1 -1
- package/dist/esm/components/Combobox/ComboboxIdContext.js +1 -1
- package/dist/esm/components/Field/Field.js +4 -2
- package/dist/esm/components/Suggestion/Suggestion.js +74 -43
- package/dist/esm/components/Suggestion/SuggestionChips.js +13 -0
- package/dist/esm/components/Suggestion/SuggestionClear.js +4 -31
- package/dist/esm/components/Suggestion/SuggestionEmpty.js +5 -5
- package/dist/esm/components/Suggestion/SuggestionInput.js +13 -24
- package/dist/esm/components/Suggestion/SuggestionList.js +4 -8
- package/dist/esm/components/Suggestion/SuggestionOption.js +0 -1
- package/dist/esm/components/Suggestion/index.js +4 -1
- package/dist/esm/components/Tabs/TabsTab.js +2 -1
- package/dist/esm/components/Tooltip/Tooltip.js +33 -1
- package/dist/esm/index.js +67 -73
- package/dist/esm/utilities/omit/omit.js +1 -1
- package/dist/react-types.d.ts +1 -0
- package/dist/types/components/Alert/index.d.ts +1 -1
- package/dist/types/components/Alert/index.d.ts.map +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/Avatar/index.d.ts +1 -1
- package/dist/types/components/Avatar/index.d.ts.map +1 -1
- package/dist/types/components/Badge/Badge.d.ts.map +1 -1
- package/dist/types/components/Badge/BadgePosition.d.ts.map +1 -1
- package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/types/components/Breadcrumbs/BreadcrumbsItem.d.ts.map +1 -1
- package/dist/types/components/Breadcrumbs/BreadcrumbsLink.d.ts.map +1 -1
- package/dist/types/components/Breadcrumbs/BreadcrumbsList.d.ts.map +1 -1
- package/dist/types/components/Breadcrumbs/index.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts.map +1 -1
- package/dist/types/components/Button/index.d.ts +1 -1
- package/dist/types/components/Button/index.d.ts.map +1 -1
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/Checkbox/index.d.ts.map +1 -1
- package/dist/types/components/Chip/Chips.d.ts.map +1 -1
- package/dist/types/components/Combobox/Combobox.d.ts +1 -1
- package/dist/types/components/Combobox/Combobox.d.ts.map +1 -1
- package/dist/types/components/Combobox/ComboboxContext.d.ts +1 -1
- package/dist/types/components/Combobox/ComboboxContext.d.ts.map +1 -1
- package/dist/types/components/Combobox/ComboboxIdContext.d.ts +1 -1
- package/dist/types/components/Combobox/ComboboxIdContext.d.ts.map +1 -1
- package/dist/types/components/Combobox/Custom.d.ts.map +1 -1
- package/dist/types/components/Combobox/Empty.d.ts.map +1 -1
- package/dist/types/components/Combobox/Option/Description.d.ts.map +1 -1
- package/dist/types/components/Combobox/Option/Option.d.ts.map +1 -1
- package/dist/types/components/Combobox/Option/useComboboxOption.d.ts.map +1 -1
- package/dist/types/components/Combobox/index.d.ts +1 -1
- package/dist/types/components/Combobox/index.d.ts.map +1 -1
- package/dist/types/components/Combobox/internal/ComboboxClearButton.d.ts.map +1 -1
- package/dist/types/components/Combobox/useCombobox.d.ts.map +1 -1
- package/dist/types/components/Combobox/useComboboxKeyboard.d.ts.map +1 -1
- package/dist/types/components/Combobox/useFloatingCombobox.d.ts +1 -1
- package/dist/types/components/Combobox/useFloatingCombobox.d.ts.map +1 -1
- package/dist/types/components/Combobox/useFormField/useFormField.d.ts.map +1 -1
- package/dist/types/components/Combobox/utilities.d.ts.map +1 -1
- package/dist/types/components/Details/index.d.ts +1 -1
- package/dist/types/components/Details/index.d.ts.map +1 -1
- package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/components/Dialog/DialogTrigger.d.ts.map +1 -1
- package/dist/types/components/Dialog/DialogTriggerContext.d.ts.map +1 -1
- package/dist/types/components/Dialog/index.d.ts +2 -2
- package/dist/types/components/Dialog/index.d.ts.map +1 -1
- package/dist/types/components/Divider/index.d.ts +1 -1
- package/dist/types/components/Divider/index.d.ts.map +1 -1
- package/dist/types/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/types/components/Dropdown/DropdownItem.d.ts.map +1 -1
- package/dist/types/components/Dropdown/DropdownList.d.ts.map +1 -1
- package/dist/types/components/Dropdown/index.d.ts +4 -4
- package/dist/types/components/Dropdown/index.d.ts.map +1 -1
- package/dist/types/components/ErrorSummary/ErrorSummary.d.ts.map +1 -1
- package/dist/types/components/ErrorSummary/index.d.ts +2 -2
- package/dist/types/components/ErrorSummary/index.d.ts.map +1 -1
- package/dist/types/components/Field/Field.d.ts +10 -0
- package/dist/types/components/Field/Field.d.ts.map +1 -1
- package/dist/types/components/Field/index.d.ts +3 -2
- package/dist/types/components/Field/index.d.ts.map +1 -1
- package/dist/types/components/Fieldset/FieldsetLegend.d.ts.map +1 -1
- package/dist/types/components/Fieldset/index.d.ts +2 -2
- package/dist/types/components/Fieldset/index.d.ts.map +1 -1
- package/dist/types/components/Heading/index.d.ts +1 -1
- package/dist/types/components/Heading/index.d.ts.map +1 -1
- package/dist/types/components/Input/index.d.ts +1 -1
- package/dist/types/components/Input/index.d.ts.map +1 -1
- package/dist/types/components/Label/index.d.ts +1 -1
- package/dist/types/components/Label/index.d.ts.map +1 -1
- package/dist/types/components/Link/index.d.ts +1 -1
- package/dist/types/components/Link/index.d.ts.map +1 -1
- package/dist/types/components/List/ListItem.d.ts.map +1 -1
- package/dist/types/components/List/Lists.d.ts.map +1 -1
- package/dist/types/components/List/index.d.ts +1 -1
- package/dist/types/components/List/index.d.ts.map +1 -1
- package/dist/types/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/Pagination/PaginationItem.d.ts.map +1 -1
- package/dist/types/components/Pagination/PaginationList.d.ts.map +1 -1
- package/dist/types/components/Pagination/index.d.ts +1 -1
- package/dist/types/components/Paragraph/index.d.ts +1 -1
- package/dist/types/components/Paragraph/index.d.ts.map +1 -1
- package/dist/types/components/Popover/Popover.d.ts +1 -1
- package/dist/types/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/components/Popover/PopoverTrigger.d.ts.map +1 -1
- package/dist/types/components/Popover/PopoverTriggerContext.d.ts.map +1 -1
- package/dist/types/components/Popover/index.d.ts +2 -2
- package/dist/types/components/Popover/index.d.ts.map +1 -1
- package/dist/types/components/Radio/index.d.ts +1 -1
- package/dist/types/components/Radio/index.d.ts.map +1 -1
- package/dist/types/components/Search/SearchButton.d.ts.map +1 -1
- package/dist/types/components/Select/Select.d.ts.map +1 -1
- package/dist/types/components/Select/SelectOptgroup.d.ts.map +1 -1
- package/dist/types/components/Select/SelectOption.d.ts.map +1 -1
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/Select/index.d.ts.map +1 -1
- package/dist/types/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/types/components/SkipLink/SkipLink.d.ts.map +1 -1
- package/dist/types/components/SkipLink/index.d.ts +1 -1
- package/dist/types/components/SkipLink/index.d.ts.map +1 -1
- package/dist/types/components/Spinner/index.d.ts +1 -1
- package/dist/types/components/Spinner/index.d.ts.map +1 -1
- package/dist/types/components/Suggestion/Suggestion.d.ts +100 -74
- package/dist/types/components/Suggestion/Suggestion.d.ts.map +1 -1
- package/dist/types/components/Suggestion/SuggestionChips.d.ts +19 -0
- package/dist/types/components/Suggestion/SuggestionChips.d.ts.map +1 -0
- package/dist/types/components/Suggestion/SuggestionClear.d.ts +1 -8
- package/dist/types/components/Suggestion/SuggestionClear.d.ts.map +1 -1
- package/dist/types/components/Suggestion/SuggestionEmpty.d.ts +1 -1
- package/dist/types/components/Suggestion/SuggestionEmpty.d.ts.map +1 -1
- package/dist/types/components/Suggestion/SuggestionInput.d.ts +1 -1
- package/dist/types/components/Suggestion/SuggestionInput.d.ts.map +1 -1
- package/dist/types/components/Suggestion/SuggestionList.d.ts +5 -5
- package/dist/types/components/Suggestion/SuggestionList.d.ts.map +1 -1
- package/dist/types/components/Suggestion/SuggestionOption.d.ts +0 -1
- package/dist/types/components/Suggestion/SuggestionOption.d.ts.map +1 -1
- package/dist/types/components/Suggestion/index.d.ts +23 -8
- package/dist/types/components/Suggestion/index.d.ts.map +1 -1
- package/dist/types/components/Switch/index.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts.map +1 -1
- package/dist/types/components/Table/Table.d.ts.map +1 -1
- package/dist/types/components/Table/TableBody.d.ts.map +1 -1
- package/dist/types/components/Table/TableCell.d.ts.map +1 -1
- package/dist/types/components/Table/TableFoot.d.ts.map +1 -1
- package/dist/types/components/Table/TableHead.d.ts.map +1 -1
- package/dist/types/components/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/types/components/Table/TableRow.d.ts.map +1 -1
- package/dist/types/components/Table/index.d.ts +6 -6
- package/dist/types/components/Table/index.d.ts.map +1 -1
- package/dist/types/components/Tabs/TabsTab.d.ts.map +1 -1
- package/dist/types/components/Tabs/index.d.ts +1 -1
- package/dist/types/components/Tabs/index.d.ts.map +1 -1
- package/dist/types/components/Tag/index.d.ts +1 -1
- package/dist/types/components/Tag/index.d.ts.map +1 -1
- package/dist/types/components/Textarea/index.d.ts +1 -1
- package/dist/types/components/Textarea/index.d.ts.map +1 -1
- package/dist/types/components/Textfield/Textfield.d.ts.map +1 -1
- package/dist/types/components/Textfield/index.d.ts +1 -1
- package/dist/types/components/Textfield/index.d.ts.map +1 -1
- package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/components/ValidationMessage/index.d.ts +1 -1
- package/dist/types/components/ValidationMessage/index.d.ts.map +1 -1
- package/dist/types/components/index.d.ts +29 -30
- package/dist/types/components/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utilities/RovingFocus/RovingFocusItem.d.ts.map +1 -1
- package/dist/types/utilities/RovingFocus/RovingFocusRoot.d.ts.map +1 -1
- package/dist/types/utilities/RovingFocus/index.d.ts +1 -1
- package/dist/types/utilities/RovingFocus/index.d.ts.map +1 -1
- package/dist/types/utilities/hooks/index.d.ts +5 -5
- package/dist/types/utilities/hooks/index.d.ts.map +1 -1
- package/dist/types/utilities/hooks/useCheckboxGroup/useCheckboxGroup.d.ts.map +1 -1
- package/dist/types/utilities/hooks/useMergeRefs/useMergeRefs.d.ts.map +1 -1
- package/dist/types/utilities/hooks/usePagination/usePagination.d.ts.map +1 -1
- package/dist/types/utilities/hooks/useRadioGroup/useRadioGroup.d.ts.map +1 -1
- package/dist/types/utilities/index.d.ts +2 -2
- package/dist/types/utilities/index.d.ts.map +1 -1
- package/package.json +16 -18
- package/dist/cjs/components/MultiSuggestion/MultiSuggestion.js +0 -160
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionChips.js +0 -20
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionClear.js +0 -52
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionEmpty.js +0 -23
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionInput.js +0 -37
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionList.js +0 -30
- package/dist/cjs/components/MultiSuggestion/MultiSuggestionOption.js +0 -12
- package/dist/cjs/components/MultiSuggestion/index.js +0 -34
- package/dist/esm/components/MultiSuggestion/MultiSuggestion.js +0 -157
- package/dist/esm/components/MultiSuggestion/MultiSuggestionChips.js +0 -18
- package/dist/esm/components/MultiSuggestion/MultiSuggestionClear.js +0 -49
- package/dist/esm/components/MultiSuggestion/MultiSuggestionEmpty.js +0 -21
- package/dist/esm/components/MultiSuggestion/MultiSuggestionInput.js +0 -35
- package/dist/esm/components/MultiSuggestion/MultiSuggestionList.js +0 -28
- package/dist/esm/components/MultiSuggestion/MultiSuggestionOption.js +0 -10
- package/dist/esm/components/MultiSuggestion/index.js +0 -26
- package/dist/types/components/MultiSuggestion/MultiSuggestion.d.ts +0 -131
- package/dist/types/components/MultiSuggestion/MultiSuggestion.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionChips.d.ts +0 -20
- package/dist/types/components/MultiSuggestion/MultiSuggestionChips.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionClear.d.ts +0 -35
- package/dist/types/components/MultiSuggestion/MultiSuggestionClear.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionEmpty.d.ts +0 -15
- package/dist/types/components/MultiSuggestion/MultiSuggestionEmpty.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionInput.d.ts +0 -21
- package/dist/types/components/MultiSuggestion/MultiSuggestionInput.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionList.d.ts +0 -40
- package/dist/types/components/MultiSuggestion/MultiSuggestionList.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/MultiSuggestionOption.d.ts +0 -6
- package/dist/types/components/MultiSuggestion/MultiSuggestionOption.d.ts.map +0 -1
- package/dist/types/components/MultiSuggestion/index.d.ts +0 -50
- 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(
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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: {
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
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
|
|
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 {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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
|
|
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 {
|
|
22
|
-
react.useEffect(
|
|
23
|
-
|
|
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
|
|
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;
|