@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
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
-
var dom = require('@floating-ui/dom');
|
|
6
5
|
var reactSlot = require('@radix-ui/react-slot');
|
|
7
6
|
var cl = require('clsx/lite');
|
|
8
7
|
var react = require('react');
|
|
8
|
+
require('@digdir/designsystemet-web');
|
|
9
9
|
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
10
10
|
var popoverTriggerContext = require('./popover-trigger-context.js');
|
|
11
11
|
|
|
@@ -36,13 +36,13 @@ const Popover = react.forwardRef(function Popover({ id, className, onClose, onOp
|
|
|
36
36
|
// NOTE: This code is purely to add React controlled component ability to Popover API
|
|
37
37
|
react.useEffect(() => {
|
|
38
38
|
const popover = popoverRef.current;
|
|
39
|
+
const trigger = `[popovertarget="${popover?.id}"],[commandfor="${popover?.id}"]`;
|
|
39
40
|
const handleClick = (event) => {
|
|
40
41
|
const el = event.target;
|
|
41
|
-
const isTrigger = el?.closest?.(
|
|
42
|
+
const isTrigger = el?.closest?.(trigger);
|
|
42
43
|
const isOutside = !isTrigger && !popover?.contains(el);
|
|
43
|
-
if (isTrigger)
|
|
44
|
+
if (isTrigger)
|
|
44
45
|
event.preventDefault(); // Prevent native Popover API
|
|
45
|
-
}
|
|
46
46
|
if (controlledOpen && (isTrigger || isOutside)) {
|
|
47
47
|
setInternalOpen(false);
|
|
48
48
|
onClose?.();
|
|
@@ -55,11 +55,20 @@ const Popover = react.forwardRef(function Popover({ id, className, onClose, onOp
|
|
|
55
55
|
const handleKeydown = (event) => {
|
|
56
56
|
if (event.key !== 'Escape' || !controlledOpen)
|
|
57
57
|
return;
|
|
58
|
+
const isOpen = popoverRef.current?.matches(':popover-open') ||
|
|
59
|
+
popoverRef.current?.classList.contains(':popover-open'); // Polyfill support
|
|
60
|
+
if (!isOpen)
|
|
61
|
+
return;
|
|
58
62
|
event.preventDefault(); // Prevent closing fullscreen in Safari
|
|
63
|
+
document.querySelector(trigger)?.focus?.(); // Move focus back to trigger since `popoover="manual"` doesn't do this
|
|
59
64
|
setInternalOpen(false);
|
|
60
65
|
onClose?.();
|
|
61
66
|
};
|
|
62
67
|
popover?.togglePopover?.(controlledOpen);
|
|
68
|
+
if (controlledOpen) {
|
|
69
|
+
const options = { detail: document.querySelector(trigger) };
|
|
70
|
+
popover?.dispatchEvent(new CustomEvent('ds-toggle-source', options)); // Since togglePopover({ source }) is not supported in all browsers yet
|
|
71
|
+
}
|
|
63
72
|
document.addEventListener('click', handleClick, true); // Use capture to execute before React event API
|
|
64
73
|
document.addEventListener('keydown', handleKeydown);
|
|
65
74
|
return () => {
|
|
@@ -67,69 +76,13 @@ const Popover = react.forwardRef(function Popover({ id, className, onClose, onOp
|
|
|
67
76
|
document.removeEventListener('keydown', handleKeydown);
|
|
68
77
|
};
|
|
69
78
|
}, [controlledOpen]);
|
|
70
|
-
// Position with floating-ui
|
|
71
|
-
react.useEffect(() => {
|
|
72
|
-
const popover = popoverRef.current;
|
|
73
|
-
const trigger = document.querySelector(`[popovertarget="${popover?.id}"]`);
|
|
74
|
-
if (popover && trigger && controlledOpen)
|
|
75
|
-
return dom.autoUpdate(trigger, popover, () => {
|
|
76
|
-
dom.computePosition(trigger, popover, {
|
|
77
|
-
placement,
|
|
78
|
-
strategy: 'fixed',
|
|
79
|
-
middleware: [
|
|
80
|
-
dom.offset((data) => {
|
|
81
|
-
// get pseudo element arrow size
|
|
82
|
-
const styles = getComputedStyle(data.elements.floating, '::before');
|
|
83
|
-
return parseFloat(styles.height);
|
|
84
|
-
}),
|
|
85
|
-
...(autoPlacement
|
|
86
|
-
? [dom.flip({ fallbackAxisSideDirection: 'start' }), dom.shift()]
|
|
87
|
-
: []),
|
|
88
|
-
arrowPseudoElement,
|
|
89
|
-
],
|
|
90
|
-
}).then(({ x, y }) => {
|
|
91
|
-
popover.style.translate = `${Math.round(x)}px ${Math.round(y)}px`;
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}, [controlledOpen, placement, id, autoPlacement]);
|
|
95
79
|
// Update context with id
|
|
96
80
|
react.useEffect(() => {
|
|
97
81
|
if (id)
|
|
98
82
|
setPopoverId?.(id);
|
|
99
83
|
}, [id]);
|
|
100
|
-
return (jsxRuntime.jsx(Component, { className: cl('ds-popover', className), id: id || popoverId, popover: 'manual', "data-variant": variant, ref: mergedRefs,
|
|
84
|
+
return (jsxRuntime.jsx(Component, { className: cl('ds-popover', className), id: id || popoverId, popover: 'manual', "data-placement": placement, "data-variant": variant, ref: mergedRefs, suppressHydrationWarning // Since _ds-floating adds attributes
|
|
85
|
+
: true, ...rest }));
|
|
101
86
|
});
|
|
102
|
-
const arrowPseudoElement = {
|
|
103
|
-
name: 'ArrowPseudoElement',
|
|
104
|
-
fn(data) {
|
|
105
|
-
const { elements, rects, placement } = data;
|
|
106
|
-
let arrowX = `${Math.round(rects.reference.width / 2 + rects.reference.x - data.x)}px`;
|
|
107
|
-
let arrowY = `${Math.round(rects.reference.height / 2 + rects.reference.y - data.y)}px`;
|
|
108
|
-
if (rects.reference.width > rects.floating.width) {
|
|
109
|
-
arrowX = `${Math.round(rects.floating.width / 2)}px`;
|
|
110
|
-
}
|
|
111
|
-
if (rects.reference.height > rects.floating.height) {
|
|
112
|
-
arrowY = `${Math.round(rects.floating.height / 2)}px`;
|
|
113
|
-
}
|
|
114
|
-
switch (placement.split('-')[0]) {
|
|
115
|
-
case 'top':
|
|
116
|
-
arrowY = '100%';
|
|
117
|
-
break;
|
|
118
|
-
case 'right':
|
|
119
|
-
arrowX = '0';
|
|
120
|
-
break;
|
|
121
|
-
case 'bottom':
|
|
122
|
-
arrowY = '0';
|
|
123
|
-
break;
|
|
124
|
-
case 'left':
|
|
125
|
-
arrowX = '100%';
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
elements.floating.setAttribute('data-placement', placement.split('-')[0]); // We only need top/left/right/bottom
|
|
129
|
-
elements.floating.style.setProperty('--ds-popover-arrow-x', arrowX);
|
|
130
|
-
elements.floating.style.setProperty('--ds-popover-arrow-y', arrowY);
|
|
131
|
-
return data;
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
87
|
|
|
135
88
|
exports.Popover = Popover;
|
|
@@ -14,18 +14,8 @@ var react = require('react');
|
|
|
14
14
|
* <Select.Option value='2'>Option 2</Select.Option>
|
|
15
15
|
* </Select>
|
|
16
16
|
*/
|
|
17
|
-
const Select = react.forwardRef(function Select({ className, onKeyDown, onMouseDown, width, ...rest }, ref) {
|
|
18
|
-
return (jsxRuntime.jsx("select", { className: cl('ds-input', className), "data-width": width, ref: ref,
|
|
19
|
-
if (event.key === 'Tab')
|
|
20
|
-
return;
|
|
21
|
-
if (rest.readOnly)
|
|
22
|
-
event.preventDefault(); // Make readonly work for select
|
|
23
|
-
onKeyDown?.(event);
|
|
24
|
-
}, onMouseDown: (event) => {
|
|
25
|
-
if (rest.readOnly)
|
|
26
|
-
event.preventDefault(); // Make readonly work for select
|
|
27
|
-
onMouseDown?.(event);
|
|
28
|
-
}, ...rest }));
|
|
17
|
+
const Select = react.forwardRef(function Select({ className, onKeyDown, onMouseDown, width, readOnly, ...rest }, ref) {
|
|
18
|
+
return (jsxRuntime.jsx("select", { className: cl('ds-input', className), "aria-readonly": rest['aria-readonly'] ?? readOnly, "data-width": width, ref: ref, ...rest }));
|
|
29
19
|
});
|
|
30
20
|
|
|
31
21
|
exports.Select = Select;
|
|
@@ -6,6 +6,7 @@ var reactSlot = require('@radix-ui/react-slot');
|
|
|
6
6
|
var cl = require('clsx/lite');
|
|
7
7
|
var react = require('react');
|
|
8
8
|
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
9
|
+
require('@digdir/designsystemet-web');
|
|
9
10
|
var useSynchronizedAnimation = require('../../utilities/hooks/use-synchronized-animation/use-synchronized-animation.js');
|
|
10
11
|
require('../../utilities/roving-focus/roving-focus-item.js');
|
|
11
12
|
require('../../utilities/roving-focus/roving-focus-root.js');
|
|
@@ -5,6 +5,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
5
5
|
var cl = require('clsx/lite');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
8
|
+
require('@digdir/designsystemet-web');
|
|
8
9
|
var useSynchronizedAnimation = require('../../utilities/hooks/use-synchronized-animation/use-synchronized-animation.js');
|
|
9
10
|
require('../../utilities/roving-focus/roving-focus-item.js');
|
|
10
11
|
require('../../utilities/roving-focus/roving-focus-root.js');
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
|
-
var button = require('../button/button.js');
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Component that provides a clear button for the Suggestion input.
|
|
@@ -18,7 +17,10 @@ var button = require('../button/button.js');
|
|
|
18
17
|
* </Suggestion>
|
|
19
18
|
*/
|
|
20
19
|
const SuggestionClear = react.forwardRef(function SuggestionClear({ 'aria-label': label = 'Tøm', ...rest }, ref) {
|
|
21
|
-
return (
|
|
20
|
+
return (
|
|
21
|
+
//biome-ignore lint/a11y/useAriaPropsSupportedByRole: <del> needs aria-label when u-combobox makes it the clear button
|
|
22
|
+
jsxRuntime.jsx("del", { "aria-label": label, hidden: true, ref: ref, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
23
|
+
: true, ...rest }));
|
|
22
24
|
});
|
|
23
25
|
|
|
24
26
|
exports.SuggestionClear = SuggestionClear;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var suggestion = require('./suggestion.js');
|
|
7
|
+
require('@digdir/designsystemet-web');
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Component that provides an empty Suggestion list.
|
|
@@ -17,7 +18,8 @@ var suggestion = require('./suggestion.js');
|
|
|
17
18
|
*/
|
|
18
19
|
const SuggestionEmpty = react.forwardRef(function SuggestionEmpty(rest, ref) {
|
|
19
20
|
const { isEmpty } = react.useContext(suggestion.SuggestionContext);
|
|
20
|
-
return isEmpty ? jsxRuntime.jsx("u-option", { "data-empty": true,
|
|
21
|
+
return isEmpty ? (jsxRuntime.jsx("u-option", { "data-empty": true, ref: ref, suppressHydrationWarning // Since <u-option> adds attributes
|
|
22
|
+
: true, value: '', ...rest })) : null;
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
exports.SuggestionEmpty = SuggestionEmpty;
|
|
@@ -21,14 +21,15 @@ const SuggestionInput = react.forwardRef(function SuggestionList({ value, onInpu
|
|
|
21
21
|
const { handleFilter } = react.useContext(suggestion.SuggestionContext);
|
|
22
22
|
react.useEffect(handleFilter, [value]); // Filter if controlled value
|
|
23
23
|
if (onChange)
|
|
24
|
-
console.warn('SuggestionInput: Avoid using onChange, as Suggestion controls the Input. Use
|
|
24
|
+
console.warn('SuggestionInput: Avoid using onChange, as Suggestion controls the Input. Use onSelectedChange on Suggestion instead, or onInput if fetching API results');
|
|
25
25
|
if (value)
|
|
26
|
-
console.warn('SuggestionInput: Avoid using value, as Suggestion controls the Input. Use
|
|
26
|
+
console.warn('SuggestionInput: Avoid using value, as Suggestion controls the Input. Use selected on Suggestion instead.');
|
|
27
27
|
return (jsxRuntime.jsx(input.Input, { placeholder: '' // We need an empty placeholder for the clear button to be able to show/hide
|
|
28
28
|
, ref: ref, onInput: (event) => {
|
|
29
29
|
onInput?.(event); // Should run first
|
|
30
30
|
handleFilter?.(); // Filter if uncontrolled value
|
|
31
|
-
},
|
|
31
|
+
}, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
32
|
+
: true, ...rest }));
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
exports.SuggestionInput = SuggestionInput;
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
|
-
require('@
|
|
7
|
-
var dom = require('@floating-ui/dom');
|
|
6
|
+
require('@digdir/designsystemet-web');
|
|
8
7
|
var suggestion = require('./suggestion.js');
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -19,46 +18,11 @@ var suggestion = require('./suggestion.js');
|
|
|
19
18
|
* </Suggestion>
|
|
20
19
|
*/
|
|
21
20
|
const SuggestionList = react.forwardRef(function SuggestionList({ singular = '%d forslag', plural = '%d forslag', className, id, autoPlacement = true, ...rest }, ref) {
|
|
22
|
-
const { handleFilter
|
|
21
|
+
const { handleFilter } = react.useContext(suggestion.SuggestionContext);
|
|
23
22
|
react.useEffect(handleFilter); // Must run on every render
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const list = uComboboxRef?.current?.list;
|
|
28
|
-
if (list && trigger) {
|
|
29
|
-
return dom.autoUpdate(trigger, list, () => {
|
|
30
|
-
dom.computePosition(trigger, list, {
|
|
31
|
-
placement: 'bottom',
|
|
32
|
-
strategy: 'fixed',
|
|
33
|
-
middleware: [
|
|
34
|
-
...(autoPlacement
|
|
35
|
-
? [
|
|
36
|
-
dom.flip({
|
|
37
|
-
fallbackAxisSideDirection: 'start',
|
|
38
|
-
fallbackPlacements: ['top'],
|
|
39
|
-
}),
|
|
40
|
-
dom.shift(),
|
|
41
|
-
]
|
|
42
|
-
: []),
|
|
43
|
-
undefined,
|
|
44
|
-
triggerWidth,
|
|
45
|
-
],
|
|
46
|
-
}).then(({ x, y, placement }) => {
|
|
47
|
-
const varOperator = placement.startsWith('top') ? '-' : '+';
|
|
48
|
-
list.style.translate = `${Math.round(x)}px calc(${Math.round(y)}px ${varOperator} var(--dsc-suggestion-list-gap))`;
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}, []);
|
|
53
|
-
return (jsxRuntime.jsx("u-datalist", { "data-nofilter": true, "data-sr-singular": singular, "data-sr-plural": plural, class: className, ref: ref, popover: 'manual', ...rest }));
|
|
23
|
+
return (jsxRuntime.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
|
|
24
|
+
, "data-nofilter": true, "data-sr-plural": plural, "data-sr-singular": singular, ref: ref, suppressHydrationWarning // Since <u-datalist> adds attributes
|
|
25
|
+
: true, ...rest }));
|
|
54
26
|
});
|
|
55
|
-
const triggerWidth = {
|
|
56
|
-
name: 'TriggerWidth',
|
|
57
|
-
fn(data) {
|
|
58
|
-
const { elements, rects } = data;
|
|
59
|
-
elements.floating.style.width = `${rects.reference.width}px`;
|
|
60
|
-
return data;
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
27
|
|
|
64
28
|
exports.SuggestionList = SuggestionList;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
|
+
require('@digdir/designsystemet-web');
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* A component for rendering individual options in the Suggestion list.
|
|
@@ -17,7 +18,8 @@ var react = require('react');
|
|
|
17
18
|
* </Suggestion>
|
|
18
19
|
*/
|
|
19
20
|
const SuggestionOption = react.forwardRef(function SuggestionOption({ className, ...rest }, ref) {
|
|
20
|
-
return (jsxRuntime.jsx("u-option", { class: className, ref: ref,
|
|
21
|
+
return (jsxRuntime.jsx("u-option", { class: className, ref: ref, suppressHydrationWarning // Since <u-option> adds attributes
|
|
22
|
+
: true, ...rest }));
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
exports.SuggestionOption = SuggestionOption;
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
-
var react = require('react');
|
|
6
|
-
require('@u-elements/u-combobox');
|
|
7
5
|
var cl = require('clsx/lite');
|
|
6
|
+
var react = require('react');
|
|
8
7
|
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
9
|
-
|
|
8
|
+
require('@digdir/designsystemet-web');
|
|
10
9
|
|
|
11
10
|
const text = (el) => el.textContent?.trim() || '';
|
|
12
11
|
const sanitizeItems = (values = []) => typeof values === 'string'
|
|
@@ -24,11 +23,11 @@ const nextItems = (data, prev, multiple) => {
|
|
|
24
23
|
};
|
|
25
24
|
const defaultFilter = ({ label, input }) => label.toLowerCase().includes(input.value.trim().toLowerCase());
|
|
26
25
|
const Suggestion = react.forwardRef(function Suggestion({ children, className, creatable = false, defaultSelected, filter = true, multiple = false, name, onBeforeMatch, onSelectedChange, renderSelected = ({ label }) => label, selected, ...rest }, ref) {
|
|
27
|
-
const
|
|
26
|
+
const dsSuggestionRef = react.useRef(null);
|
|
28
27
|
const genId = react.useId();
|
|
29
28
|
const selectId = rest.id ? `${rest.id}-select` : genId;
|
|
30
29
|
const isControlled = selected !== undefined;
|
|
31
|
-
const mergedRefs = useMergeRefs.useMergeRefs([ref,
|
|
30
|
+
const mergedRefs = useMergeRefs.useMergeRefs([ref, dsSuggestionRef]);
|
|
32
31
|
const [isEmpty, setIsEmpty] = react.useState(false);
|
|
33
32
|
const [defaultItems, setDefaultItems] = react.useState(sanitizeItems(defaultSelected));
|
|
34
33
|
const selectedItems = selected ? sanitizeItems(selected) : defaultItems;
|
|
@@ -45,7 +44,7 @@ const Suggestion = react.forwardRef(function Suggestion({ children, className, c
|
|
|
45
44
|
* Listerners and handling of adding/removing
|
|
46
45
|
*/
|
|
47
46
|
react.useEffect(() => {
|
|
48
|
-
const combobox =
|
|
47
|
+
const combobox = dsSuggestionRef.current;
|
|
49
48
|
const beforeChange = (event) => {
|
|
50
49
|
event.preventDefault();
|
|
51
50
|
const multiple = combobox?.multiple;
|
|
@@ -60,13 +59,13 @@ const Suggestion = react.forwardRef(function Suggestion({ children, className, c
|
|
|
60
59
|
}, [isControlled]);
|
|
61
60
|
// Before match event listener
|
|
62
61
|
react.useEffect(() => {
|
|
63
|
-
const combobox =
|
|
62
|
+
const combobox = dsSuggestionRef.current;
|
|
64
63
|
const beforeMatch = (e) => onBeforeMatch?.(e);
|
|
65
64
|
combobox?.addEventListener('comboboxbeforematch', beforeMatch);
|
|
66
65
|
return () => combobox?.removeEventListener('comboboxbeforematch', beforeMatch);
|
|
67
66
|
}, [onBeforeMatch]);
|
|
68
67
|
const handleFilter = react.useCallback(() => {
|
|
69
|
-
const { control: input, options = [] } =
|
|
68
|
+
const { control: input, options = [] } = dsSuggestionRef?.current || {};
|
|
70
69
|
const filterFn = filter === true ? defaultFilter : filter;
|
|
71
70
|
let disabled = 0;
|
|
72
71
|
let index = 0;
|
|
@@ -86,7 +85,8 @@ const Suggestion = react.forwardRef(function Suggestion({ children, className, c
|
|
|
86
85
|
}
|
|
87
86
|
setIsEmpty(index === disabled);
|
|
88
87
|
}, [filter]);
|
|
89
|
-
return (jsxRuntime.jsx(SuggestionContext.Provider, { value: { isEmpty, handleFilter,
|
|
88
|
+
return (jsxRuntime.jsx(SuggestionContext.Provider, { value: { isEmpty, handleFilter, dsSuggestionRef }, children: jsxRuntime.jsxs("ds-suggestion", { "data-multiple": multiple || undefined, "data-creatable": creatable || undefined, class: cl('ds-suggestion', className), ref: mergedRefs, suppressHydrationWarning // Since <ds-suggestion> adds attributes
|
|
89
|
+
: true, ...rest, children: [selectedItems.map((item) => (jsxRuntime.jsx("data", { value: item.value, children: renderSelected(item) }, item.value))), children, !!name && (jsxRuntime.jsx("select", { name: name, multiple: true, hidden: true, id: selectId }))] }) }));
|
|
90
90
|
});
|
|
91
91
|
const SuggestionContext = react.createContext({
|
|
92
92
|
handleFilter: () => undefined,
|
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
require('@digdir/designsystemet-web');
|
|
5
6
|
var react = require('react');
|
|
6
|
-
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
7
|
-
var rovingFocusRoot = require('../../utilities/roving-focus/roving-focus-root.js');
|
|
8
|
-
var tabs = require('./tabs.js');
|
|
9
7
|
|
|
10
8
|
/**
|
|
11
9
|
* The container for all `Tab` components.
|
|
@@ -16,10 +14,9 @@ var tabs = require('./tabs.js');
|
|
|
16
14
|
* <TabsTab value='2'>Tab 2</TabsTab>
|
|
17
15
|
* </TabsList>
|
|
18
16
|
*/
|
|
19
|
-
const TabsList = react.forwardRef(function TabsList({ children, ...rest }, ref) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return (jsxRuntime.jsx(rovingFocusRoot.RovingFocusRoot, { role: 'tablist', activeValue: value, orientation: 'ambiguous', ref: mergedRefs, ...rest, children: children }));
|
|
17
|
+
const TabsList = react.forwardRef(function TabsList({ className, children, ...rest }, ref) {
|
|
18
|
+
return (jsxRuntime.jsx("ds-tablist", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
19
|
+
: true, ref: ref, class: className, ...rest, children: children }));
|
|
23
20
|
});
|
|
24
21
|
|
|
25
22
|
exports.TabsList = TabsList;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
require('@digdir/designsystemet-web');
|
|
5
6
|
var react = require('react');
|
|
6
|
-
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
7
7
|
var tabs = require('./tabs.js');
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -12,33 +12,10 @@ var tabs = require('./tabs.js');
|
|
|
12
12
|
* @example
|
|
13
13
|
* <TabsPanel value='1'>content 1</TabsPanel>
|
|
14
14
|
*/
|
|
15
|
-
const TabsPanel = react.forwardRef(function TabsPanel({ children, value, id, ...rest }, ref) {
|
|
16
|
-
const {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const panelId = id ?? `tabpanel-${generatedId}`;
|
|
20
|
-
const [hasTabbableElement, setHasTabbableElement] = react.useState(false);
|
|
21
|
-
const [labelledBy, setLabelledBy] = react.useState(undefined);
|
|
22
|
-
const internalRef = react.useRef(null);
|
|
23
|
-
const mergedRef = useMergeRefs.useMergeRefs([ref, internalRef]);
|
|
24
|
-
/* Check if the panel has any tabbable elements */
|
|
25
|
-
react.useEffect(() => {
|
|
26
|
-
if (!internalRef.current)
|
|
27
|
-
return;
|
|
28
|
-
const tabbableElements = internalRef.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
|
29
|
-
setHasTabbableElement(tabbableElements.length > 0);
|
|
30
|
-
}, [children]);
|
|
31
|
-
/* get associated button */
|
|
32
|
-
react.useEffect(() => {
|
|
33
|
-
if (!tablistRef)
|
|
34
|
-
return;
|
|
35
|
-
const button = tablistRef.current?.querySelector(`[role="tab"][data-value="${value}"]`);
|
|
36
|
-
setLabelledBy(button ? button.id : undefined);
|
|
37
|
-
if (button) {
|
|
38
|
-
setPanelButtonMap?.((prev) => new Map(prev).set(button.id, panelId));
|
|
39
|
-
}
|
|
40
|
-
}, [tablistRef]);
|
|
41
|
-
return (jsxRuntime.jsx("div", { ref: mergedRef, id: panelId, role: 'tabpanel', tabIndex: hasTabbableElement ? undefined : 0, "aria-labelledby": labelledBy, hidden: !active, ...rest, children: children }));
|
|
15
|
+
const TabsPanel = react.forwardRef(function TabsPanel({ children, value, id, className, ...rest }, ref) {
|
|
16
|
+
const { getPrefixedValue } = react.useContext(tabs.Context);
|
|
17
|
+
return (jsxRuntime.jsx("ds-tabpanel", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
18
|
+
: true, ref: ref, id: id ?? getPrefixedValue?.(value), class: className, ...rest, children: children }));
|
|
42
19
|
});
|
|
43
20
|
|
|
44
21
|
exports.TabsPanel = TabsPanel;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
require('@digdir/designsystemet-web');
|
|
5
6
|
var react = require('react');
|
|
6
|
-
var rovingFocusItem = require('../../utilities/roving-focus/roving-focus-item.js');
|
|
7
7
|
var tabs = require('./tabs.js');
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -12,14 +12,16 @@ var tabs = require('./tabs.js');
|
|
|
12
12
|
* @example
|
|
13
13
|
* <TabsTab value='1'>Tab 1</TabsTab>
|
|
14
14
|
*/
|
|
15
|
-
const TabsTab = react.forwardRef(function TabsTab({ value,
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
const TabsTab = react.forwardRef(function TabsTab({ value, className, onClick, ...rest }, ref) {
|
|
16
|
+
const { onChange, getPrefixedValue } = react.useContext(tabs.Context);
|
|
17
|
+
return (
|
|
18
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: ds-tabs IS interactive
|
|
19
|
+
jsxRuntime.jsx("ds-tab", { "aria-controls": rest['aria-controls'] ?? getPrefixedValue?.(value), "data-value": value, ref: ref, suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
20
|
+
: true, onClick: (e) => {
|
|
21
|
+
if (e.isTrusted)
|
|
22
|
+
onChange?.(value); // Only call onChange is user actually clicked, not when programmatically clicked/controlled
|
|
23
|
+
onClick?.(e);
|
|
24
|
+
}, class: className, ...rest, children: rest.children }));
|
|
23
25
|
});
|
|
24
26
|
|
|
25
27
|
exports.TabsTab = TabsTab;
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
require('@digdir/designsystemet-web');
|
|
5
6
|
var cl = require('clsx/lite');
|
|
6
7
|
var react = require('react');
|
|
8
|
+
var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
|
|
7
9
|
|
|
8
10
|
const Context = react.createContext({});
|
|
9
11
|
/**
|
|
@@ -22,10 +24,11 @@ const Context = react.createContext({});
|
|
|
22
24
|
* </Tabs>
|
|
23
25
|
*/
|
|
24
26
|
const Tabs = react.forwardRef(function Tabs({ value, defaultValue, className, onChange, ...rest }, ref) {
|
|
25
|
-
const tablistRef = react.useRef(null);
|
|
26
27
|
const isControlled = value !== undefined;
|
|
27
28
|
const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue);
|
|
28
|
-
const
|
|
29
|
+
const tabsRef = react.useRef(null);
|
|
30
|
+
const valuePrefix = react.useId(); // Used to generate unique value-based ids for tabs and panels
|
|
31
|
+
const mergedRefs = useMergeRefs.useMergeRefs([ref, tabsRef]);
|
|
29
32
|
let onValueChange = onChange;
|
|
30
33
|
if (!isControlled) {
|
|
31
34
|
onValueChange = (newValue) => {
|
|
@@ -34,14 +37,21 @@ const Tabs = react.forwardRef(function Tabs({ value, defaultValue, className, on
|
|
|
34
37
|
};
|
|
35
38
|
value = uncontrolledValue;
|
|
36
39
|
}
|
|
40
|
+
react.useEffect(() => {
|
|
41
|
+
if (!isControlled || !tabsRef.current || value === undefined)
|
|
42
|
+
return;
|
|
43
|
+
tabsRef.current?.tabList?.tabs?.forEach((tab) => {
|
|
44
|
+
if (tab.getAttribute('data-value') === value)
|
|
45
|
+
tab.click();
|
|
46
|
+
});
|
|
47
|
+
}, [value, isControlled]);
|
|
37
48
|
return (jsxRuntime.jsx(Context.Provider, { value: {
|
|
38
49
|
value,
|
|
39
50
|
defaultValue,
|
|
40
51
|
onChange: onValueChange,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}, children: jsxRuntime.jsx("div", { className: cl('ds-tabs', className), ref: ref, ...rest }) }));
|
|
52
|
+
getPrefixedValue: (value) => value && `${valuePrefix}-${value}`,
|
|
53
|
+
}, children: jsxRuntime.jsx("ds-tabs", { suppressHydrationWarning // Since <ds-tablist> adds attributes
|
|
54
|
+
: true, ref: mergedRefs, class: cl('ds-tabs', className), ...rest }) }));
|
|
45
55
|
});
|
|
46
56
|
|
|
47
57
|
exports.Context = Context;
|
|
@@ -8,7 +8,7 @@ var toggleGroupItem = require('./toggle-group-item.js');
|
|
|
8
8
|
* Display a group of buttons that can be toggled between.
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
|
-
* <ToggleGroup onChange={(value) => console.log(value)}>
|
|
11
|
+
* <ToggleGroup data-toggle-group="Label" onChange={(value) => console.log(value)}>
|
|
12
12
|
* <ToggleGroup.Item value='1'>Toggle 1</ToggleGroup.Item>
|
|
13
13
|
* <ToggleGroup.Item value='2'>Toggle 2</ToggleGroup.Item>
|
|
14
14
|
* <ToggleGroup.Item value='3'>Toggle 3</ToggleGroup.Item>
|
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var cl = require('clsx/lite');
|
|
5
6
|
var react = require('react');
|
|
6
|
-
var
|
|
7
|
-
var button = require('../button/button.js');
|
|
8
|
-
var useToggleGroupitem = require('./use-toggle-groupitem.js');
|
|
7
|
+
var toggleGroup = require('./toggle-group.js');
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* A single item in a ToggleGroup.
|
|
12
11
|
* @example
|
|
13
12
|
* <ToggleGroupItem value='1'>Toggle 1</ToggleGroupItem>
|
|
14
13
|
*/
|
|
15
|
-
const ToggleGroupItem = react.forwardRef(function ToggleGroupItem(rest, ref) {
|
|
16
|
-
const
|
|
17
|
-
|
|
14
|
+
const ToggleGroupItem = react.forwardRef(function ToggleGroupItem({ className, children, icon, value: rawValue, ...rest }, ref) {
|
|
15
|
+
const genValue = react.useId();
|
|
16
|
+
const toggleGroup$1 = react.useContext(toggleGroup.ToggleGroupContext);
|
|
17
|
+
const value = rawValue ?? genValue;
|
|
18
|
+
const active = toggleGroup$1.value === value;
|
|
19
|
+
return (jsxRuntime.jsxs("label", { ref: ref, ...rest, className: cl('ds-button', className), "data-variant": 'tertiary', children: [jsxRuntime.jsx("input", { checked: active, name: toggleGroup$1.name, onChange: () => toggleGroup$1.onChange?.(value), type: 'radio', value: value }), children] }));
|
|
18
20
|
});
|
|
19
21
|
|
|
20
22
|
exports.ToggleGroupItem = ToggleGroupItem;
|
|
@@ -4,20 +4,19 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var cl = require('clsx/lite');
|
|
6
6
|
var react = require('react');
|
|
7
|
-
var rovingFocusRoot = require('../../utilities/roving-focus/roving-focus-root.js');
|
|
8
7
|
|
|
9
8
|
const ToggleGroupContext = react.createContext({});
|
|
10
9
|
/**
|
|
11
10
|
* Display a group of buttons that can be toggled between.
|
|
12
11
|
*
|
|
13
12
|
* @example
|
|
14
|
-
* <ToggleGroup onChange={(value) => console.log(value)}>
|
|
13
|
+
* <ToggleGroup data-toggle-group="Label" onChange={(value) => console.log(value)}>
|
|
15
14
|
* <ToggleGroup.Item value='1'>Toggle 1</ToggleGroup.Item>
|
|
16
15
|
* <ToggleGroup.Item value='2'>Toggle 2</ToggleGroup.Item>
|
|
17
16
|
* <ToggleGroup.Item value='3'>Toggle 3</ToggleGroup.Item>
|
|
18
17
|
* </ToggleGroup>
|
|
19
18
|
*/
|
|
20
|
-
const ToggleGroup = react.forwardRef(function ToggleGroup({ children,
|
|
19
|
+
const ToggleGroup = react.forwardRef(function ToggleGroup({ children, className, defaultValue, name, onChange, value, variant = 'primary', ...rest }, ref) {
|
|
21
20
|
const nameId = react.useId();
|
|
22
21
|
const isControlled = value !== undefined;
|
|
23
22
|
const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue);
|
|
@@ -30,12 +29,13 @@ const ToggleGroup = react.forwardRef(function ToggleGroup({ children, variant =
|
|
|
30
29
|
value = uncontrolledValue;
|
|
31
30
|
}
|
|
32
31
|
return (jsxRuntime.jsx(ToggleGroupContext.Provider, { value: {
|
|
33
|
-
variant,
|
|
34
|
-
value,
|
|
35
32
|
defaultValue,
|
|
36
33
|
name: name ?? `togglegroup-name-${nameId}`,
|
|
37
34
|
onChange: onValueChange,
|
|
38
|
-
|
|
35
|
+
value,
|
|
36
|
+
variant,
|
|
37
|
+
}, children: jsxRuntime.jsx("fieldset", { className: cl('ds-toggle-group', className), "data-toggle-group": '' // Default to empty string to ensure attribute is present
|
|
38
|
+
, "data-variant": variant, ref: ref, ...rest, children: children }) }));
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
exports.ToggleGroup = ToggleGroup;
|