@digdir/designsystemet-react 1.11.0 → 1.12.0
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 -0
- package/dist/cjs/components/Combobox/Option/useComboboxOption.js +1 -0
- package/dist/cjs/components/Combobox/useComboboxKeyboard.js +1 -0
- package/dist/cjs/components/avatar/avatar.js +2 -2
- package/dist/cjs/components/breadcrumbs/breadcrumbs-link.js +2 -1
- package/dist/cjs/components/breadcrumbs/breadcrumbs-list.js +1 -11
- package/dist/cjs/components/breadcrumbs/breadcrumbs.js +2 -1
- package/dist/cjs/components/button/button.js +8 -3
- package/dist/cjs/components/card/card.js +17 -9
- package/dist/cjs/components/details/details-summary.js +3 -3
- package/dist/cjs/components/details/details.js +2 -2
- package/dist/cjs/components/dialog/dialog-trigger-context.js +5 -6
- package/dist/cjs/components/dialog/dialog-trigger.js +3 -8
- package/dist/cjs/components/dialog/dialog.js +25 -55
- package/dist/cjs/components/error-summary/error-summary-heading.js +2 -8
- package/dist/cjs/components/error-summary/error-summary.js +4 -9
- package/dist/cjs/components/field/field-counter.js +6 -41
- package/dist/cjs/components/field/field-description.js +2 -1
- package/dist/cjs/components/field/field.js +6 -4
- package/dist/cjs/components/label/label.js +2 -1
- package/dist/cjs/components/pagination/pagination-button.js +5 -3
- package/dist/cjs/components/pagination/pagination.js +7 -3
- package/dist/cjs/components/popover/popover-trigger.js +6 -10
- package/dist/cjs/components/popover/popover.js +15 -62
- package/dist/cjs/components/select/select.js +2 -12
- package/dist/cjs/components/skeleton/skeleton.js +1 -0
- package/dist/cjs/components/spinner/spinner.js +1 -0
- package/dist/cjs/components/suggestion/suggestion-clear.js +4 -2
- package/dist/cjs/components/suggestion/suggestion-empty.js +3 -1
- package/dist/cjs/components/suggestion/suggestion-input.js +4 -3
- package/dist/cjs/components/suggestion/suggestion-list.js +5 -41
- package/dist/cjs/components/suggestion/suggestion-option.js +3 -1
- package/dist/cjs/components/suggestion/suggestion.js +9 -9
- package/dist/cjs/components/tabs/tabs-list.js +4 -7
- package/dist/cjs/components/tabs/tabs-panel.js +5 -28
- package/dist/cjs/components/tabs/tabs-tab.js +11 -9
- package/dist/cjs/components/tabs/tabs.js +16 -6
- package/dist/cjs/components/toggle-group/index.js +1 -1
- package/dist/cjs/components/toggle-group/toggle-group-item.js +8 -6
- package/dist/cjs/components/toggle-group/toggle-group.js +6 -6
- package/dist/cjs/components/tooltip/tooltip.js +6 -147
- package/dist/cjs/components/validation-message/validation-message.js +2 -1
- package/dist/cjs/index.js +39 -38
- package/dist/cjs/utilities/hooks/use-pagination/use-pagination.js +13 -25
- package/dist/cjs/utilities/index.js +17 -0
- package/dist/cjs/utilities/roving-focus/roving-focus-item.js +2 -0
- package/dist/cjs/utilities/roving-focus/roving-focus-root.js +4 -0
- package/dist/cjs/utilities/roving-focus/use-roving-focus.js +3 -1
- package/dist/esm/components/Combobox/Combobox.js +1 -0
- package/dist/esm/components/Combobox/Option/useComboboxOption.js +1 -0
- package/dist/esm/components/Combobox/useComboboxKeyboard.js +1 -0
- package/dist/esm/components/avatar/avatar.js +2 -2
- package/dist/esm/components/breadcrumbs/breadcrumbs-link.js +2 -1
- package/dist/esm/components/breadcrumbs/breadcrumbs-list.js +2 -12
- package/dist/esm/components/breadcrumbs/breadcrumbs.js +2 -1
- package/dist/esm/components/button/button.js +9 -4
- package/dist/esm/components/card/card.js +18 -10
- package/dist/esm/components/details/details-summary.js +3 -3
- package/dist/esm/components/details/details.js +2 -2
- package/dist/esm/components/dialog/dialog-trigger-context.js +6 -7
- package/dist/esm/components/dialog/dialog-trigger.js +3 -8
- package/dist/esm/components/dialog/dialog.js +26 -56
- package/dist/esm/components/error-summary/error-summary-heading.js +3 -9
- package/dist/esm/components/error-summary/error-summary.js +6 -10
- package/dist/esm/components/field/field-counter.js +8 -43
- package/dist/esm/components/field/field-description.js +2 -1
- package/dist/esm/components/field/field.js +7 -5
- package/dist/esm/components/label/label.js +2 -1
- package/dist/esm/components/pagination/pagination-button.js +5 -3
- package/dist/esm/components/pagination/pagination.js +7 -3
- package/dist/esm/components/popover/popover-trigger.js +6 -10
- package/dist/esm/components/popover/popover.js +15 -62
- package/dist/esm/components/select/select.js +2 -12
- package/dist/esm/components/skeleton/skeleton.js +1 -0
- package/dist/esm/components/spinner/spinner.js +1 -0
- package/dist/esm/components/suggestion/suggestion-clear.js +4 -2
- package/dist/esm/components/suggestion/suggestion-empty.js +3 -1
- package/dist/esm/components/suggestion/suggestion-input.js +4 -3
- package/dist/esm/components/suggestion/suggestion-list.js +5 -41
- package/dist/esm/components/suggestion/suggestion-option.js +3 -1
- package/dist/esm/components/suggestion/suggestion.js +9 -9
- package/dist/esm/components/tabs/tabs-list.js +5 -8
- package/dist/esm/components/tabs/tabs-panel.js +6 -29
- package/dist/esm/components/tabs/tabs-tab.js +12 -10
- package/dist/esm/components/tabs/tabs.js +17 -7
- package/dist/esm/components/toggle-group/index.js +1 -1
- package/dist/esm/components/toggle-group/toggle-group-item.js +10 -8
- package/dist/esm/components/toggle-group/toggle-group.js +7 -7
- package/dist/esm/components/tooltip/tooltip.js +8 -149
- package/dist/esm/components/validation-message/validation-message.js +2 -1
- package/dist/esm/index.js +8 -7
- package/dist/esm/utilities/hooks/use-pagination/use-pagination.js +13 -25
- package/dist/esm/utilities/index.js +11 -0
- package/dist/esm/utilities/roving-focus/roving-focus-item.js +2 -0
- package/dist/esm/utilities/roving-focus/roving-focus-root.js +4 -0
- package/dist/esm/utilities/roving-focus/use-roving-focus.js +3 -1
- package/dist/react-types.d.ts +8 -0
- package/dist/types/components/avatar/avatar.d.ts +12 -7
- package/dist/types/components/avatar/avatar.d.ts.map +1 -1
- package/dist/types/components/breadcrumbs/breadcrumbs-link.d.ts.map +1 -1
- package/dist/types/components/breadcrumbs/breadcrumbs-list.d.ts.map +1 -1
- package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +5 -3
- package/dist/types/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/types/components/button/button.d.ts +1 -1
- package/dist/types/components/button/button.d.ts.map +1 -1
- package/dist/types/components/card/card.d.ts.map +1 -1
- package/dist/types/components/details/details-summary.d.ts.map +1 -1
- package/dist/types/components/details/details.d.ts +1 -1
- package/dist/types/components/details/details.d.ts.map +1 -1
- package/dist/types/components/dialog/dialog-trigger-context.d.ts +10 -3
- package/dist/types/components/dialog/dialog-trigger-context.d.ts.map +1 -1
- package/dist/types/components/dialog/dialog-trigger.d.ts +1 -1
- package/dist/types/components/dialog/dialog-trigger.d.ts.map +1 -1
- package/dist/types/components/dialog/dialog.d.ts +3 -3
- package/dist/types/components/dialog/dialog.d.ts.map +1 -1
- package/dist/types/components/dropdown/dropdown.d.ts +1 -2
- package/dist/types/components/dropdown/dropdown.d.ts.map +1 -1
- package/dist/types/components/error-summary/error-summary-heading.d.ts.map +1 -1
- package/dist/types/components/error-summary/error-summary.d.ts +6 -6
- package/dist/types/components/error-summary/error-summary.d.ts.map +1 -1
- package/dist/types/components/field/field-counter.d.ts +2 -8
- package/dist/types/components/field/field-counter.d.ts.map +1 -1
- package/dist/types/components/field/field-description.d.ts.map +1 -1
- package/dist/types/components/field/field.d.ts +6 -2
- package/dist/types/components/field/field.d.ts.map +1 -1
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/components/index.d.ts.map +1 -1
- package/dist/types/components/input/input.d.ts +13 -1
- package/dist/types/components/input/input.d.ts.map +1 -1
- package/dist/types/components/label/label.d.ts.map +1 -1
- package/dist/types/components/pagination/pagination-button.d.ts +13 -4
- package/dist/types/components/pagination/pagination-button.d.ts.map +1 -1
- package/dist/types/components/pagination/pagination.d.ts +27 -5
- package/dist/types/components/pagination/pagination.d.ts.map +1 -1
- package/dist/types/components/popover/popover-trigger.d.ts.map +1 -1
- package/dist/types/components/popover/popover.d.ts +2 -14
- package/dist/types/components/popover/popover.d.ts.map +1 -1
- package/dist/types/components/search/search-button.d.ts +1 -1
- package/dist/types/components/select/select.d.ts +2 -0
- package/dist/types/components/select/select.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion-clear.d.ts +7 -5
- package/dist/types/components/suggestion/suggestion-clear.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion-empty.d.ts +1 -0
- package/dist/types/components/suggestion/suggestion-empty.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion-input.d.ts +2 -1
- package/dist/types/components/suggestion/suggestion-input.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion-list.d.ts +1 -1
- package/dist/types/components/suggestion/suggestion-list.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion-option.d.ts +1 -0
- package/dist/types/components/suggestion/suggestion-option.d.ts.map +1 -1
- package/dist/types/components/suggestion/suggestion.d.ts +5 -6
- package/dist/types/components/suggestion/suggestion.d.ts.map +1 -1
- package/dist/types/components/tabs/tabs-list.d.ts +4 -2
- package/dist/types/components/tabs/tabs-list.d.ts.map +1 -1
- package/dist/types/components/tabs/tabs-panel.d.ts +4 -2
- package/dist/types/components/tabs/tabs-panel.d.ts.map +1 -1
- package/dist/types/components/tabs/tabs-tab.d.ts +4 -2
- package/dist/types/components/tabs/tabs-tab.d.ts.map +1 -1
- package/dist/types/components/tabs/tabs.d.ts +6 -6
- package/dist/types/components/tabs/tabs.d.ts.map +1 -1
- package/dist/types/components/textfield/textfield.d.ts.map +1 -1
- package/dist/types/components/toggle-group/index.d.ts +1 -1
- package/dist/types/components/toggle-group/toggle-group-item.d.ts +12 -3
- package/dist/types/components/toggle-group/toggle-group-item.d.ts.map +1 -1
- package/dist/types/components/toggle-group/toggle-group.d.ts +12 -4
- package/dist/types/components/toggle-group/toggle-group.d.ts.map +1 -1
- package/dist/types/components/tooltip/tooltip.d.ts +10 -3
- package/dist/types/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/types/components/validation-message/validation-message.d.ts.map +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utilities/hooks/use-pagination/use-pagination.d.ts +1 -1
- package/dist/types/utilities/hooks/use-pagination/use-pagination.d.ts.map +1 -1
- package/dist/types/utilities/index.d.ts +6 -0
- package/dist/types/utilities/index.d.ts.map +1 -1
- package/dist/types/utilities/roving-focus/roving-focus-item.d.ts +1 -0
- package/dist/types/utilities/roving-focus/roving-focus-item.d.ts.map +1 -1
- package/dist/types/utilities/roving-focus/roving-focus-root.d.ts +1 -0
- package/dist/types/utilities/roving-focus/roving-focus-root.d.ts.map +1 -1
- package/dist/types/utilities/roving-focus/use-roving-focus.d.ts +14 -12
- package/dist/types/utilities/roving-focus/use-roving-focus.d.ts.map +1 -1
- package/package.json +16 -19
- package/dist/cjs/components/field/field-observer.js +0 -112
- package/dist/cjs/components/toggle-group/use-toggle-groupitem.js +0 -34
- package/dist/esm/components/field/field-observer.js +0 -107
- package/dist/esm/components/toggle-group/use-toggle-groupitem.js +0 -32
- package/dist/types/components/field/field-observer.d.ts +0 -5
- package/dist/types/components/field/field-observer.d.ts.map +0 -1
- package/dist/types/components/toggle-group/use-toggle-groupitem.d.ts +0 -12
- package/dist/types/components/toggle-group/use-toggle-groupitem.d.ts.map +0 -1
|
@@ -4,6 +4,7 @@ import { Slot } from '@radix-ui/react-slot';
|
|
|
4
4
|
import cl from 'clsx/lite';
|
|
5
5
|
import { forwardRef } from 'react';
|
|
6
6
|
import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-refs.js';
|
|
7
|
+
import '@digdir/designsystemet-web';
|
|
7
8
|
import { useSynchronizedAnimation } from '../../utilities/hooks/use-synchronized-animation/use-synchronized-animation.js';
|
|
8
9
|
import '../../utilities/roving-focus/roving-focus-item.js';
|
|
9
10
|
import '../../utilities/roving-focus/roving-focus-root.js';
|
|
@@ -3,6 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import cl from 'clsx/lite';
|
|
4
4
|
import { forwardRef } from 'react';
|
|
5
5
|
import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-refs.js';
|
|
6
|
+
import '@digdir/designsystemet-web';
|
|
6
7
|
import { useSynchronizedAnimation } from '../../utilities/hooks/use-synchronized-animation/use-synchronized-animation.js';
|
|
7
8
|
import '../../utilities/roving-focus/roving-focus-item.js';
|
|
8
9
|
import '../../utilities/roving-focus/roving-focus-root.js';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
|
-
import { Button } from '../button/button.js';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Component that provides a clear button for the Suggestion input.
|
|
@@ -16,7 +15,10 @@ import { Button } from '../button/button.js';
|
|
|
16
15
|
* </Suggestion>
|
|
17
16
|
*/
|
|
18
17
|
const SuggestionClear = forwardRef(function SuggestionClear({ 'aria-label': label = 'Tøm', ...rest }, ref) {
|
|
19
|
-
return (
|
|
18
|
+
return (
|
|
19
|
+
//biome-ignore lint/a11y/useAriaPropsSupportedByRole: <del> needs aria-label when u-combobox makes it the clear button
|
|
20
|
+
jsx("del", { "aria-label": label, hidden: true, ref: ref, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
21
|
+
: true, ...rest }));
|
|
20
22
|
});
|
|
21
23
|
|
|
22
24
|
export { SuggestionClear };
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef, useContext } from 'react';
|
|
4
4
|
import { SuggestionContext } from './suggestion.js';
|
|
5
|
+
import '@digdir/designsystemet-web';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Component that provides an empty Suggestion list.
|
|
@@ -15,7 +16,8 @@ import { SuggestionContext } from './suggestion.js';
|
|
|
15
16
|
*/
|
|
16
17
|
const SuggestionEmpty = forwardRef(function SuggestionEmpty(rest, ref) {
|
|
17
18
|
const { isEmpty } = useContext(SuggestionContext);
|
|
18
|
-
return isEmpty ? jsx("u-option", { "data-empty": true,
|
|
19
|
+
return isEmpty ? (jsx("u-option", { "data-empty": true, ref: ref, suppressHydrationWarning // Since <u-option> adds attributes
|
|
20
|
+
: true, value: '', ...rest })) : null;
|
|
19
21
|
});
|
|
20
22
|
|
|
21
23
|
export { SuggestionEmpty };
|
|
@@ -19,14 +19,15 @@ const SuggestionInput = forwardRef(function SuggestionList({ value, onInput, onC
|
|
|
19
19
|
const { handleFilter } = useContext(SuggestionContext);
|
|
20
20
|
useEffect(handleFilter, [value]); // Filter if controlled value
|
|
21
21
|
if (onChange)
|
|
22
|
-
console.warn('SuggestionInput: Avoid using onChange, as Suggestion controls the Input. Use
|
|
22
|
+
console.warn('SuggestionInput: Avoid using onChange, as Suggestion controls the Input. Use onSelectedChange on Suggestion instead, or onInput if fetching API results');
|
|
23
23
|
if (value)
|
|
24
|
-
console.warn('SuggestionInput: Avoid using value, as Suggestion controls the Input. Use
|
|
24
|
+
console.warn('SuggestionInput: Avoid using value, as Suggestion controls the Input. Use selected on Suggestion instead.');
|
|
25
25
|
return (jsx(Input, { placeholder: '' // We need an empty placeholder for the clear button to be able to show/hide
|
|
26
26
|
, ref: ref, onInput: (event) => {
|
|
27
27
|
onInput?.(event); // Should run first
|
|
28
28
|
handleFilter?.(); // Filter if uncontrolled value
|
|
29
|
-
},
|
|
29
|
+
}, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
30
|
+
: true, ...rest }));
|
|
30
31
|
});
|
|
31
32
|
|
|
32
33
|
export { SuggestionInput };
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef, useContext, useEffect } from 'react';
|
|
4
|
-
import '@
|
|
5
|
-
import { autoUpdate, computePosition, flip, shift } from '@floating-ui/dom';
|
|
4
|
+
import '@digdir/designsystemet-web';
|
|
6
5
|
import { SuggestionContext } from './suggestion.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -17,46 +16,11 @@ import { SuggestionContext } from './suggestion.js';
|
|
|
17
16
|
* </Suggestion>
|
|
18
17
|
*/
|
|
19
18
|
const SuggestionList = forwardRef(function SuggestionList({ singular = '%d forslag', plural = '%d forslag', className, id, autoPlacement = true, ...rest }, ref) {
|
|
20
|
-
const { handleFilter
|
|
19
|
+
const { handleFilter } = useContext(SuggestionContext);
|
|
21
20
|
useEffect(handleFilter); // Must run on every render
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const list = uComboboxRef?.current?.list;
|
|
26
|
-
if (list && trigger) {
|
|
27
|
-
return autoUpdate(trigger, list, () => {
|
|
28
|
-
computePosition(trigger, list, {
|
|
29
|
-
placement: 'bottom',
|
|
30
|
-
strategy: 'fixed',
|
|
31
|
-
middleware: [
|
|
32
|
-
...(autoPlacement
|
|
33
|
-
? [
|
|
34
|
-
flip({
|
|
35
|
-
fallbackAxisSideDirection: 'start',
|
|
36
|
-
fallbackPlacements: ['top'],
|
|
37
|
-
}),
|
|
38
|
-
shift(),
|
|
39
|
-
]
|
|
40
|
-
: []),
|
|
41
|
-
undefined,
|
|
42
|
-
triggerWidth,
|
|
43
|
-
],
|
|
44
|
-
}).then(({ x, y, placement }) => {
|
|
45
|
-
const varOperator = placement.startsWith('top') ? '-' : '+';
|
|
46
|
-
list.style.translate = `${Math.round(x)}px calc(${Math.round(y)}px ${varOperator} var(--dsc-suggestion-list-gap))`;
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}, []);
|
|
51
|
-
return (jsx("u-datalist", { "data-nofilter": true, "data-sr-singular": singular, "data-sr-plural": plural, class: className, ref: ref, popover: 'manual', ...rest }));
|
|
21
|
+
return (jsx("u-datalist", { class: className, popover: 'manual' // Is also set by field.ts, but is nice to have in case focus runs before toggle event
|
|
22
|
+
, "data-nofilter": true, "data-sr-plural": plural, "data-sr-singular": singular, ref: ref, suppressHydrationWarning // Since <u-datalist> adds attributes
|
|
23
|
+
: true, ...rest }));
|
|
52
24
|
});
|
|
53
|
-
const triggerWidth = {
|
|
54
|
-
name: 'TriggerWidth',
|
|
55
|
-
fn(data) {
|
|
56
|
-
const { elements, rects } = data;
|
|
57
|
-
elements.floating.style.width = `${rects.reference.width}px`;
|
|
58
|
-
return data;
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
25
|
|
|
62
26
|
export { SuggestionList };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
|
+
import '@digdir/designsystemet-web';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* A component for rendering individual options in the Suggestion list.
|
|
@@ -15,7 +16,8 @@ import { forwardRef } from 'react';
|
|
|
15
16
|
* </Suggestion>
|
|
16
17
|
*/
|
|
17
18
|
const SuggestionOption = forwardRef(function SuggestionOption({ className, ...rest }, ref) {
|
|
18
|
-
return (jsx("u-option", { class: className, ref: ref,
|
|
19
|
+
return (jsx("u-option", { class: className, ref: ref, suppressHydrationWarning // Since <u-option> adds attributes
|
|
20
|
+
: true, ...rest }));
|
|
19
21
|
});
|
|
20
22
|
|
|
21
23
|
export { SuggestionOption };
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import { forwardRef, useRef, useId, useState, useEffect, useCallback, createContext } from 'react';
|
|
4
|
-
import '@u-elements/u-combobox';
|
|
5
3
|
import cl from 'clsx/lite';
|
|
4
|
+
import { forwardRef, useRef, useId, useState, useEffect, useCallback, createContext } from 'react';
|
|
6
5
|
import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-refs.js';
|
|
7
|
-
import
|
|
6
|
+
import '@digdir/designsystemet-web';
|
|
8
7
|
|
|
9
8
|
const text = (el) => el.textContent?.trim() || '';
|
|
10
9
|
const sanitizeItems = (values = []) => typeof values === 'string'
|
|
@@ -22,11 +21,11 @@ const nextItems = (data, prev, multiple) => {
|
|
|
22
21
|
};
|
|
23
22
|
const defaultFilter = ({ label, input }) => label.toLowerCase().includes(input.value.trim().toLowerCase());
|
|
24
23
|
const Suggestion = forwardRef(function Suggestion({ children, className, creatable = false, defaultSelected, filter = true, multiple = false, name, onBeforeMatch, onSelectedChange, renderSelected = ({ label }) => label, selected, ...rest }, ref) {
|
|
25
|
-
const
|
|
24
|
+
const dsSuggestionRef = useRef(null);
|
|
26
25
|
const genId = useId();
|
|
27
26
|
const selectId = rest.id ? `${rest.id}-select` : genId;
|
|
28
27
|
const isControlled = selected !== undefined;
|
|
29
|
-
const mergedRefs = useMergeRefs([ref,
|
|
28
|
+
const mergedRefs = useMergeRefs([ref, dsSuggestionRef]);
|
|
30
29
|
const [isEmpty, setIsEmpty] = useState(false);
|
|
31
30
|
const [defaultItems, setDefaultItems] = useState(sanitizeItems(defaultSelected));
|
|
32
31
|
const selectedItems = selected ? sanitizeItems(selected) : defaultItems;
|
|
@@ -43,7 +42,7 @@ const Suggestion = forwardRef(function Suggestion({ children, className, creatab
|
|
|
43
42
|
* Listerners and handling of adding/removing
|
|
44
43
|
*/
|
|
45
44
|
useEffect(() => {
|
|
46
|
-
const combobox =
|
|
45
|
+
const combobox = dsSuggestionRef.current;
|
|
47
46
|
const beforeChange = (event) => {
|
|
48
47
|
event.preventDefault();
|
|
49
48
|
const multiple = combobox?.multiple;
|
|
@@ -58,13 +57,13 @@ const Suggestion = forwardRef(function Suggestion({ children, className, creatab
|
|
|
58
57
|
}, [isControlled]);
|
|
59
58
|
// Before match event listener
|
|
60
59
|
useEffect(() => {
|
|
61
|
-
const combobox =
|
|
60
|
+
const combobox = dsSuggestionRef.current;
|
|
62
61
|
const beforeMatch = (e) => onBeforeMatch?.(e);
|
|
63
62
|
combobox?.addEventListener('comboboxbeforematch', beforeMatch);
|
|
64
63
|
return () => combobox?.removeEventListener('comboboxbeforematch', beforeMatch);
|
|
65
64
|
}, [onBeforeMatch]);
|
|
66
65
|
const handleFilter = useCallback(() => {
|
|
67
|
-
const { control: input, options = [] } =
|
|
66
|
+
const { control: input, options = [] } = dsSuggestionRef?.current || {};
|
|
68
67
|
const filterFn = filter === true ? defaultFilter : filter;
|
|
69
68
|
let disabled = 0;
|
|
70
69
|
let index = 0;
|
|
@@ -84,7 +83,8 @@ const Suggestion = forwardRef(function Suggestion({ children, className, creatab
|
|
|
84
83
|
}
|
|
85
84
|
setIsEmpty(index === disabled);
|
|
86
85
|
}, [filter]);
|
|
87
|
-
return (jsx(SuggestionContext.Provider, { value: { isEmpty, handleFilter,
|
|
86
|
+
return (jsx(SuggestionContext.Provider, { value: { isEmpty, handleFilter, dsSuggestionRef }, children: jsxs("ds-suggestion", { "data-multiple": multiple || undefined, "data-creatable": creatable || undefined, class: cl('ds-suggestion', className), ref: mergedRefs, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
87
|
+
: true, ...rest, children: [selectedItems.map((item) => (jsx("data", { value: item.value, children: renderSelected(item) }, item.value))), children, !!name && (jsx("select", { name: name, multiple: true, hidden: true, id: selectId }))] }) }));
|
|
88
88
|
});
|
|
89
89
|
const SuggestionContext = createContext({
|
|
90
90
|
handleFilter: () => undefined,
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { RovingFocusRoot } from '../../utilities/roving-focus/roving-focus-root.js';
|
|
6
|
-
import { Context } from './tabs.js';
|
|
3
|
+
import '@digdir/designsystemet-web';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
7
5
|
|
|
8
6
|
/**
|
|
9
7
|
* The container for all `Tab` components.
|
|
@@ -14,10 +12,9 @@ import { Context } from './tabs.js';
|
|
|
14
12
|
* <TabsTab value='2'>Tab 2</TabsTab>
|
|
15
13
|
* </TabsList>
|
|
16
14
|
*/
|
|
17
|
-
const TabsList = forwardRef(function TabsList({ children, ...rest }, ref) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return (jsx(RovingFocusRoot, { role: 'tablist', activeValue: value, orientation: 'ambiguous', ref: mergedRefs, ...rest, children: children }));
|
|
15
|
+
const TabsList = forwardRef(function TabsList({ className, children, ...rest }, ref) {
|
|
16
|
+
return (jsx("ds-tablist", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
17
|
+
: true, ref: ref, class: className, ...rest, children: children }));
|
|
21
18
|
});
|
|
22
19
|
|
|
23
20
|
export { TabsList };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import '@digdir/designsystemet-web';
|
|
4
|
+
import { forwardRef, useContext } from 'react';
|
|
5
5
|
import { Context } from './tabs.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -10,33 +10,10 @@ import { Context } from './tabs.js';
|
|
|
10
10
|
* @example
|
|
11
11
|
* <TabsPanel value='1'>content 1</TabsPanel>
|
|
12
12
|
*/
|
|
13
|
-
const TabsPanel = forwardRef(function TabsPanel({ children, value, id, ...rest }, ref) {
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const panelId = id ?? `tabpanel-${generatedId}`;
|
|
18
|
-
const [hasTabbableElement, setHasTabbableElement] = useState(false);
|
|
19
|
-
const [labelledBy, setLabelledBy] = useState(undefined);
|
|
20
|
-
const internalRef = useRef(null);
|
|
21
|
-
const mergedRef = useMergeRefs([ref, internalRef]);
|
|
22
|
-
/* Check if the panel has any tabbable elements */
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!internalRef.current)
|
|
25
|
-
return;
|
|
26
|
-
const tabbableElements = internalRef.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
|
27
|
-
setHasTabbableElement(tabbableElements.length > 0);
|
|
28
|
-
}, [children]);
|
|
29
|
-
/* get associated button */
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (!tablistRef)
|
|
32
|
-
return;
|
|
33
|
-
const button = tablistRef.current?.querySelector(`[role="tab"][data-value="${value}"]`);
|
|
34
|
-
setLabelledBy(button ? button.id : undefined);
|
|
35
|
-
if (button) {
|
|
36
|
-
setPanelButtonMap?.((prev) => new Map(prev).set(button.id, panelId));
|
|
37
|
-
}
|
|
38
|
-
}, [tablistRef]);
|
|
39
|
-
return (jsx("div", { ref: mergedRef, id: panelId, role: 'tabpanel', tabIndex: hasTabbableElement ? undefined : 0, "aria-labelledby": labelledBy, hidden: !active, ...rest, children: children }));
|
|
13
|
+
const TabsPanel = forwardRef(function TabsPanel({ children, value, id, className, ...rest }, ref) {
|
|
14
|
+
const { getPrefixedValue } = useContext(Context);
|
|
15
|
+
return (jsx("ds-tabpanel", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
16
|
+
: true, ref: ref, id: id ?? getPrefixedValue?.(value), class: className, ...rest, children: children }));
|
|
40
17
|
});
|
|
41
18
|
|
|
42
19
|
export { TabsPanel };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import '@digdir/designsystemet-web';
|
|
4
|
+
import { forwardRef, useContext } from 'react';
|
|
5
5
|
import { Context } from './tabs.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -10,14 +10,16 @@ import { Context } from './tabs.js';
|
|
|
10
10
|
* @example
|
|
11
11
|
* <TabsTab value='1'>Tab 1</TabsTab>
|
|
12
12
|
*/
|
|
13
|
-
const TabsTab = forwardRef(function TabsTab({ value,
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
const TabsTab = forwardRef(function TabsTab({ value, className, onClick, ...rest }, ref) {
|
|
14
|
+
const { onChange, getPrefixedValue } = useContext(Context);
|
|
15
|
+
return (
|
|
16
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: ds-tabs IS interactive
|
|
17
|
+
jsx("ds-tab", { "aria-controls": rest['aria-controls'] ?? getPrefixedValue?.(value), "data-value": value, ref: ref, suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
18
|
+
: true, onClick: (e) => {
|
|
19
|
+
if (e.isTrusted)
|
|
20
|
+
onChange?.(value); // Only call onChange is user actually clicked, not when programmatically clicked/controlled
|
|
21
|
+
onClick?.(e);
|
|
22
|
+
}, class: className, ...rest, children: rest.children }));
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
export { TabsTab };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import '@digdir/designsystemet-web';
|
|
3
4
|
import cl from 'clsx/lite';
|
|
4
|
-
import { createContext, forwardRef, useRef,
|
|
5
|
+
import { createContext, forwardRef, useState, useRef, useId, useEffect } from 'react';
|
|
6
|
+
import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-refs.js';
|
|
5
7
|
|
|
6
8
|
const Context = createContext({});
|
|
7
9
|
/**
|
|
@@ -20,10 +22,11 @@ const Context = createContext({});
|
|
|
20
22
|
* </Tabs>
|
|
21
23
|
*/
|
|
22
24
|
const Tabs = forwardRef(function Tabs({ value, defaultValue, className, onChange, ...rest }, ref) {
|
|
23
|
-
const tablistRef = useRef(null);
|
|
24
25
|
const isControlled = value !== undefined;
|
|
25
26
|
const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
|
|
26
|
-
const
|
|
27
|
+
const tabsRef = useRef(null);
|
|
28
|
+
const valuePrefix = useId(); // Used to generate unique value-based ids for tabs and panels
|
|
29
|
+
const mergedRefs = useMergeRefs([ref, tabsRef]);
|
|
27
30
|
let onValueChange = onChange;
|
|
28
31
|
if (!isControlled) {
|
|
29
32
|
onValueChange = (newValue) => {
|
|
@@ -32,14 +35,21 @@ const Tabs = forwardRef(function Tabs({ value, defaultValue, className, onChange
|
|
|
32
35
|
};
|
|
33
36
|
value = uncontrolledValue;
|
|
34
37
|
}
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!isControlled || !tabsRef.current || value === undefined)
|
|
40
|
+
return;
|
|
41
|
+
tabsRef.current?.tabList?.tabs?.forEach((tab) => {
|
|
42
|
+
if (tab.getAttribute('data-value') === value)
|
|
43
|
+
tab.click();
|
|
44
|
+
});
|
|
45
|
+
}, [value, isControlled]);
|
|
35
46
|
return (jsx(Context.Provider, { value: {
|
|
36
47
|
value,
|
|
37
48
|
defaultValue,
|
|
38
49
|
onChange: onValueChange,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}, children: jsx("div", { className: cl('ds-tabs', className), ref: ref, ...rest }) }));
|
|
50
|
+
getPrefixedValue: (value) => value && `${valuePrefix}-${value}`,
|
|
51
|
+
}, children: jsx("ds-tabs", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
52
|
+
: true, ref: mergedRefs, class: cl('ds-tabs', className), ...rest }) }));
|
|
43
53
|
});
|
|
44
54
|
|
|
45
55
|
export { Context, Tabs };
|
|
@@ -6,7 +6,7 @@ import { ToggleGroupItem } from './toggle-group-item.js';
|
|
|
6
6
|
* Display a group of buttons that can be toggled between.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
|
-
* <ToggleGroup onChange={(value) => console.log(value)}>
|
|
9
|
+
* <ToggleGroup data-toggle-group="Label" onChange={(value) => console.log(value)}>
|
|
10
10
|
* <ToggleGroup.Item value='1'>Toggle 1</ToggleGroup.Item>
|
|
11
11
|
* <ToggleGroup.Item value='2'>Toggle 2</ToggleGroup.Item>
|
|
12
12
|
* <ToggleGroup.Item value='3'>Toggle 3</ToggleGroup.Item>
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { useToggleGroupItem } from './use-toggle-groupitem.js';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import cl from 'clsx/lite';
|
|
4
|
+
import { forwardRef, useId, useContext } from 'react';
|
|
5
|
+
import { ToggleGroupContext } from './toggle-group.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* A single item in a ToggleGroup.
|
|
10
9
|
* @example
|
|
11
10
|
* <ToggleGroupItem value='1'>Toggle 1</ToggleGroupItem>
|
|
12
11
|
*/
|
|
13
|
-
const ToggleGroupItem = forwardRef(function ToggleGroupItem(rest, ref) {
|
|
14
|
-
const
|
|
15
|
-
|
|
12
|
+
const ToggleGroupItem = forwardRef(function ToggleGroupItem({ className, children, icon, value: rawValue, ...rest }, ref) {
|
|
13
|
+
const genValue = useId();
|
|
14
|
+
const toggleGroup = useContext(ToggleGroupContext);
|
|
15
|
+
const value = rawValue ?? genValue;
|
|
16
|
+
const active = toggleGroup.value === value;
|
|
17
|
+
return (jsxs("label", { ref: ref, ...rest, className: cl('ds-button', className), "data-variant": 'tertiary', children: [jsx("input", { checked: active, name: toggleGroup.name, onChange: () => toggleGroup.onChange?.(value), type: 'radio', value: value }), children] }));
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
export { ToggleGroupItem };
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import cl from 'clsx/lite';
|
|
4
4
|
import { createContext, forwardRef, useId, useState } from 'react';
|
|
5
|
-
import { RovingFocusRoot } from '../../utilities/roving-focus/roving-focus-root.js';
|
|
6
5
|
|
|
7
6
|
const ToggleGroupContext = createContext({});
|
|
8
7
|
/**
|
|
9
8
|
* Display a group of buttons that can be toggled between.
|
|
10
9
|
*
|
|
11
10
|
* @example
|
|
12
|
-
* <ToggleGroup onChange={(value) => console.log(value)}>
|
|
11
|
+
* <ToggleGroup data-toggle-group="Label" onChange={(value) => console.log(value)}>
|
|
13
12
|
* <ToggleGroup.Item value='1'>Toggle 1</ToggleGroup.Item>
|
|
14
13
|
* <ToggleGroup.Item value='2'>Toggle 2</ToggleGroup.Item>
|
|
15
14
|
* <ToggleGroup.Item value='3'>Toggle 3</ToggleGroup.Item>
|
|
16
15
|
* </ToggleGroup>
|
|
17
16
|
*/
|
|
18
|
-
const ToggleGroup = forwardRef(function ToggleGroup({ children,
|
|
17
|
+
const ToggleGroup = forwardRef(function ToggleGroup({ children, className, defaultValue, name, onChange, value, variant = 'primary', ...rest }, ref) {
|
|
19
18
|
const nameId = useId();
|
|
20
19
|
const isControlled = value !== undefined;
|
|
21
20
|
const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
|
|
@@ -28,12 +27,13 @@ const ToggleGroup = forwardRef(function ToggleGroup({ children, variant = 'prima
|
|
|
28
27
|
value = uncontrolledValue;
|
|
29
28
|
}
|
|
30
29
|
return (jsx(ToggleGroupContext.Provider, { value: {
|
|
31
|
-
variant,
|
|
32
|
-
value,
|
|
33
30
|
defaultValue,
|
|
34
31
|
name: name ?? `togglegroup-name-${nameId}`,
|
|
35
32
|
onChange: onValueChange,
|
|
36
|
-
|
|
33
|
+
value,
|
|
34
|
+
variant,
|
|
35
|
+
}, children: jsx("fieldset", { className: cl('ds-toggle-group', className), "data-toggle-group": '' // Default to empty string to ensure attribute is present
|
|
36
|
+
, "data-variant": variant, ref: ref, ...rest, children: children }) }));
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
export { ToggleGroup, ToggleGroupContext };
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
3
|
-
import { autoUpdate, computePosition, offset, flip, shift } from '@floating-ui/dom';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
3
|
import { Slot } from '@radix-ui/react-slot';
|
|
5
|
-
import
|
|
6
|
-
import { forwardRef
|
|
7
|
-
import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-refs.js';
|
|
4
|
+
import '@digdir/designsystemet-web';
|
|
5
|
+
import { forwardRef } from 'react';
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* Tooltip component that displays a small piece of information when hovering or focusing on an element.
|
|
@@ -19,150 +17,11 @@ import { useMergeRefs } from '../../utilities/hooks/use-merge-refs/use-merge-ref
|
|
|
19
17
|
* Hover me
|
|
20
18
|
* </Tooltip>
|
|
21
19
|
*/
|
|
22
|
-
const Tooltip = forwardRef(function Tooltip({
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const mergedRefs = useMergeRefs([tooltipRef, ref]);
|
|
28
|
-
const controlledOpen = open ?? internalOpen;
|
|
29
|
-
const tooltipId = id ?? randomTooltipId;
|
|
30
|
-
const setOpen = () => {
|
|
31
|
-
setInternalOpen(true);
|
|
32
|
-
};
|
|
33
|
-
const setClose = () => {
|
|
34
|
-
setInternalOpen(false);
|
|
35
|
-
};
|
|
36
|
-
// Position with floating-ui
|
|
37
|
-
useEffect(() => {
|
|
38
|
-
const tooltip = tooltipRef.current;
|
|
39
|
-
const trigger = triggerRef.current;
|
|
40
|
-
tooltip?.togglePopover?.(controlledOpen);
|
|
41
|
-
if (tooltip)
|
|
42
|
-
tooltip.style.opacity = controlledOpen ? '1' : '0';
|
|
43
|
-
if (tooltip && trigger && controlledOpen) {
|
|
44
|
-
return autoUpdate(trigger, tooltip, () => {
|
|
45
|
-
computePosition(trigger, tooltip, {
|
|
46
|
-
placement,
|
|
47
|
-
strategy: 'fixed',
|
|
48
|
-
middleware: [
|
|
49
|
-
offset((data) => {
|
|
50
|
-
// get pseudo element arrow size
|
|
51
|
-
const styles = getComputedStyle(data.elements.floating, '::before');
|
|
52
|
-
return parseFloat(styles.height);
|
|
53
|
-
}),
|
|
54
|
-
...(autoPlacement
|
|
55
|
-
? [flip({ fallbackAxisSideDirection: 'start' }), shift()]
|
|
56
|
-
: []),
|
|
57
|
-
shift(),
|
|
58
|
-
arrowPseudoElement,
|
|
59
|
-
safeAreaElement,
|
|
60
|
-
],
|
|
61
|
-
}).then(({ x, y }) => {
|
|
62
|
-
tooltip.style.translate = `${Math.round(x)}px ${Math.round(y)}px`;
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}, [controlledOpen, placement]);
|
|
67
|
-
/* Add listeners for ESC to dismiss and click outside on mobile */
|
|
68
|
-
useEffect(() => {
|
|
69
|
-
const tooltip = tooltipRef.current;
|
|
70
|
-
const trigger = triggerRef.current;
|
|
71
|
-
const handleKeyDown = (event) => {
|
|
72
|
-
if (event.key === 'Escape') {
|
|
73
|
-
setInternalOpen(false);
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
const handleClick = (event) => {
|
|
77
|
-
const el = event.target;
|
|
78
|
-
const isTooltip = tooltip?.contains(el);
|
|
79
|
-
const isTrigger = trigger?.contains(el);
|
|
80
|
-
const isOutside = !isTrigger && !isTooltip;
|
|
81
|
-
if (isOutside && controlledOpen) {
|
|
82
|
-
setInternalOpen(false);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
if (controlledOpen) {
|
|
86
|
-
window.addEventListener('keydown', handleKeyDown);
|
|
87
|
-
/* Add click listener to handle mobile tap-to-close */
|
|
88
|
-
document.addEventListener('click', handleClick);
|
|
89
|
-
}
|
|
90
|
-
return () => {
|
|
91
|
-
window.removeEventListener('keydown', handleKeyDown);
|
|
92
|
-
document.removeEventListener('click', handleClick);
|
|
93
|
-
};
|
|
94
|
-
}, [controlledOpen]);
|
|
95
|
-
/* If children is only a string, make a span */
|
|
96
|
-
const ChildContainer = typeof children === 'string' ? 'span' : Slot;
|
|
97
|
-
/* Make sure it is valid */
|
|
98
|
-
if (typeof children !== 'string' && children.type === Fragment) {
|
|
99
|
-
console.error('<Tooltip> children needs to be a single ReactElement that can receive a ref and not: <Fragment/> | <></>');
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
const popoverProps = {
|
|
103
|
-
[version.startsWith('19') ? 'popoverTarget' : 'popovertarget']: tooltipId,
|
|
104
|
-
[version.startsWith('19')
|
|
105
|
-
? 'popoverTargetAction'
|
|
106
|
-
: 'popovertargetaction']: 'show',
|
|
107
|
-
};
|
|
108
|
-
const autoType = `aria-${triggerRef.current?.innerText?.trim() ? 'describedby' : 'labelledby'}`;
|
|
109
|
-
return (jsxs(Fragment$1, { children: [jsx(ChildContainer, { ref: triggerRef, ...popoverProps, onMouseEnter: setOpen, onMouseLeave: setClose, onFocus: setOpen, onBlur: setClose, [type ? 'aria-' + type : autoType]: tooltipId, children: children }), jsx("span", { onMouseEnter: setOpen, onMouseLeave: setClose, ref: mergedRefs, role: 'tooltip', className: cl('ds-tooltip', className), id: tooltipId, popover: 'manual', ...rest, children: content })] }));
|
|
20
|
+
const Tooltip = forwardRef(function Tooltip({ content, placement = 'top', autoPlacement = true, ...rest }, _ref) {
|
|
21
|
+
/* check if children is a string */
|
|
22
|
+
const isString = typeof rest.children === 'string';
|
|
23
|
+
return (jsx(Slot, { "aria-label": content, "data-tooltip": content, "data-placement": placement, "data-autoplacement": autoPlacement, suppressHydrationWarning // Since data-tooltip adds aria-label/aria-description
|
|
24
|
+
: true, ...rest, children: isString ? jsx("span", { tabIndex: 0, children: rest.children }) : rest.children }));
|
|
110
25
|
});
|
|
111
|
-
const arrowPseudoElement = {
|
|
112
|
-
name: 'ArrowPseudoElement',
|
|
113
|
-
fn(data) {
|
|
114
|
-
const { elements, rects, placement } = data;
|
|
115
|
-
let arrowX = `${Math.round(rects.reference.width / 2 + rects.reference.x - data.x)}px`;
|
|
116
|
-
let arrowY = `${Math.round(rects.reference.height / 2 + rects.reference.y - data.y)}px`;
|
|
117
|
-
switch (placement) {
|
|
118
|
-
case 'top':
|
|
119
|
-
arrowY = '100%';
|
|
120
|
-
break;
|
|
121
|
-
case 'right':
|
|
122
|
-
arrowX = '0';
|
|
123
|
-
break;
|
|
124
|
-
case 'bottom':
|
|
125
|
-
arrowY = '0';
|
|
126
|
-
break;
|
|
127
|
-
case 'left':
|
|
128
|
-
arrowX = '100%';
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
elements.floating.style.setProperty('--dsc-tooltip-arrow-x', arrowX);
|
|
132
|
-
elements.floating.style.setProperty('--dsc-tooltip-arrow-y', arrowY);
|
|
133
|
-
return data;
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
const safeAreaElement = {
|
|
137
|
-
name: 'SafeAreaElement',
|
|
138
|
-
fn(data) {
|
|
139
|
-
const { elements, placement } = data;
|
|
140
|
-
let width = '100%';
|
|
141
|
-
let height = 'var(--dsc-tooltip-arrow-size)';
|
|
142
|
-
let translate = '0px';
|
|
143
|
-
switch (placement) {
|
|
144
|
-
case 'top':
|
|
145
|
-
translate = `-50% 0%`;
|
|
146
|
-
break;
|
|
147
|
-
case 'right':
|
|
148
|
-
height = '100%';
|
|
149
|
-
width = 'var(--dsc-tooltip-arrow-size)';
|
|
150
|
-
translate = '-100% -50%';
|
|
151
|
-
break;
|
|
152
|
-
case 'bottom':
|
|
153
|
-
translate = '-50% -100%';
|
|
154
|
-
break;
|
|
155
|
-
case 'left':
|
|
156
|
-
height = '100%';
|
|
157
|
-
width = 'var(--dsc-tooltip-arrow-size)';
|
|
158
|
-
translate = '0 -50%';
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
elements.floating.style.setProperty('--_dsc-tooltip-safearea-height', height);
|
|
162
|
-
elements.floating.style.setProperty('--_dsc-tooltip-safearea-width', width);
|
|
163
|
-
elements.floating.style.setProperty('--_dsc-tooltip-safearea-translate', translate);
|
|
164
|
-
return data;
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
26
|
|
|
168
27
|
export { Tooltip };
|