@digdir/designsystemet-react 1.11.1 → 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.
Files changed (190) hide show
  1. package/dist/cjs/components/Combobox/Combobox.js +1 -0
  2. package/dist/cjs/components/Combobox/Option/useComboboxOption.js +1 -0
  3. package/dist/cjs/components/Combobox/useComboboxKeyboard.js +1 -0
  4. package/dist/cjs/components/avatar/avatar.js +2 -2
  5. package/dist/cjs/components/breadcrumbs/breadcrumbs-link.js +2 -1
  6. package/dist/cjs/components/breadcrumbs/breadcrumbs-list.js +1 -11
  7. package/dist/cjs/components/breadcrumbs/breadcrumbs.js +2 -1
  8. package/dist/cjs/components/button/button.js +8 -3
  9. package/dist/cjs/components/card/card.js +17 -9
  10. package/dist/cjs/components/details/details-summary.js +3 -3
  11. package/dist/cjs/components/details/details.js +2 -2
  12. package/dist/cjs/components/dialog/dialog-trigger-context.js +5 -6
  13. package/dist/cjs/components/dialog/dialog-trigger.js +3 -8
  14. package/dist/cjs/components/dialog/dialog.js +25 -55
  15. package/dist/cjs/components/error-summary/error-summary-heading.js +2 -8
  16. package/dist/cjs/components/error-summary/error-summary.js +4 -9
  17. package/dist/cjs/components/field/field-counter.js +6 -41
  18. package/dist/cjs/components/field/field-description.js +2 -1
  19. package/dist/cjs/components/field/field.js +6 -4
  20. package/dist/cjs/components/label/label.js +2 -1
  21. package/dist/cjs/components/pagination/pagination-button.js +5 -3
  22. package/dist/cjs/components/pagination/pagination.js +7 -3
  23. package/dist/cjs/components/popover/popover-trigger.js +6 -10
  24. package/dist/cjs/components/popover/popover.js +15 -62
  25. package/dist/cjs/components/select/select.js +2 -12
  26. package/dist/cjs/components/skeleton/skeleton.js +1 -0
  27. package/dist/cjs/components/spinner/spinner.js +1 -0
  28. package/dist/cjs/components/suggestion/suggestion-clear.js +4 -2
  29. package/dist/cjs/components/suggestion/suggestion-empty.js +3 -1
  30. package/dist/cjs/components/suggestion/suggestion-input.js +4 -3
  31. package/dist/cjs/components/suggestion/suggestion-list.js +5 -41
  32. package/dist/cjs/components/suggestion/suggestion-option.js +3 -1
  33. package/dist/cjs/components/suggestion/suggestion.js +9 -9
  34. package/dist/cjs/components/tabs/tabs-list.js +4 -7
  35. package/dist/cjs/components/tabs/tabs-panel.js +5 -28
  36. package/dist/cjs/components/tabs/tabs-tab.js +11 -9
  37. package/dist/cjs/components/tabs/tabs.js +16 -6
  38. package/dist/cjs/components/toggle-group/index.js +1 -1
  39. package/dist/cjs/components/toggle-group/toggle-group-item.js +8 -6
  40. package/dist/cjs/components/toggle-group/toggle-group.js +6 -6
  41. package/dist/cjs/components/tooltip/tooltip.js +6 -147
  42. package/dist/cjs/components/validation-message/validation-message.js +2 -1
  43. package/dist/cjs/index.js +1 -0
  44. package/dist/cjs/utilities/hooks/use-pagination/use-pagination.js +13 -25
  45. package/dist/cjs/utilities/index.js +17 -0
  46. package/dist/cjs/utilities/roving-focus/roving-focus-item.js +2 -0
  47. package/dist/cjs/utilities/roving-focus/roving-focus-root.js +4 -0
  48. package/dist/cjs/utilities/roving-focus/use-roving-focus.js +3 -1
  49. package/dist/esm/components/Combobox/Combobox.js +1 -0
  50. package/dist/esm/components/Combobox/Option/useComboboxOption.js +1 -0
  51. package/dist/esm/components/Combobox/useComboboxKeyboard.js +1 -0
  52. package/dist/esm/components/avatar/avatar.js +2 -2
  53. package/dist/esm/components/breadcrumbs/breadcrumbs-link.js +2 -1
  54. package/dist/esm/components/breadcrumbs/breadcrumbs-list.js +2 -12
  55. package/dist/esm/components/breadcrumbs/breadcrumbs.js +2 -1
  56. package/dist/esm/components/button/button.js +9 -4
  57. package/dist/esm/components/card/card.js +18 -10
  58. package/dist/esm/components/details/details-summary.js +3 -3
  59. package/dist/esm/components/details/details.js +2 -2
  60. package/dist/esm/components/dialog/dialog-trigger-context.js +6 -7
  61. package/dist/esm/components/dialog/dialog-trigger.js +3 -8
  62. package/dist/esm/components/dialog/dialog.js +26 -56
  63. package/dist/esm/components/error-summary/error-summary-heading.js +3 -9
  64. package/dist/esm/components/error-summary/error-summary.js +6 -10
  65. package/dist/esm/components/field/field-counter.js +8 -43
  66. package/dist/esm/components/field/field-description.js +2 -1
  67. package/dist/esm/components/field/field.js +7 -5
  68. package/dist/esm/components/label/label.js +2 -1
  69. package/dist/esm/components/pagination/pagination-button.js +5 -3
  70. package/dist/esm/components/pagination/pagination.js +7 -3
  71. package/dist/esm/components/popover/popover-trigger.js +6 -10
  72. package/dist/esm/components/popover/popover.js +15 -62
  73. package/dist/esm/components/select/select.js +2 -12
  74. package/dist/esm/components/skeleton/skeleton.js +1 -0
  75. package/dist/esm/components/spinner/spinner.js +1 -0
  76. package/dist/esm/components/suggestion/suggestion-clear.js +4 -2
  77. package/dist/esm/components/suggestion/suggestion-empty.js +3 -1
  78. package/dist/esm/components/suggestion/suggestion-input.js +4 -3
  79. package/dist/esm/components/suggestion/suggestion-list.js +5 -41
  80. package/dist/esm/components/suggestion/suggestion-option.js +3 -1
  81. package/dist/esm/components/suggestion/suggestion.js +9 -9
  82. package/dist/esm/components/tabs/tabs-list.js +5 -8
  83. package/dist/esm/components/tabs/tabs-panel.js +6 -29
  84. package/dist/esm/components/tabs/tabs-tab.js +12 -10
  85. package/dist/esm/components/tabs/tabs.js +17 -7
  86. package/dist/esm/components/toggle-group/index.js +1 -1
  87. package/dist/esm/components/toggle-group/toggle-group-item.js +10 -8
  88. package/dist/esm/components/toggle-group/toggle-group.js +7 -7
  89. package/dist/esm/components/tooltip/tooltip.js +8 -149
  90. package/dist/esm/components/validation-message/validation-message.js +2 -1
  91. package/dist/esm/index.js +1 -0
  92. package/dist/esm/utilities/hooks/use-pagination/use-pagination.js +13 -25
  93. package/dist/esm/utilities/index.js +11 -0
  94. package/dist/esm/utilities/roving-focus/roving-focus-item.js +2 -0
  95. package/dist/esm/utilities/roving-focus/roving-focus-root.js +4 -0
  96. package/dist/esm/utilities/roving-focus/use-roving-focus.js +3 -1
  97. package/dist/react-types.d.ts +8 -0
  98. package/dist/types/components/avatar/avatar.d.ts +12 -7
  99. package/dist/types/components/avatar/avatar.d.ts.map +1 -1
  100. package/dist/types/components/breadcrumbs/breadcrumbs-link.d.ts.map +1 -1
  101. package/dist/types/components/breadcrumbs/breadcrumbs-list.d.ts.map +1 -1
  102. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +5 -3
  103. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  104. package/dist/types/components/button/button.d.ts +1 -1
  105. package/dist/types/components/button/button.d.ts.map +1 -1
  106. package/dist/types/components/card/card.d.ts.map +1 -1
  107. package/dist/types/components/details/details-summary.d.ts.map +1 -1
  108. package/dist/types/components/details/details.d.ts +1 -1
  109. package/dist/types/components/details/details.d.ts.map +1 -1
  110. package/dist/types/components/dialog/dialog-trigger-context.d.ts +10 -3
  111. package/dist/types/components/dialog/dialog-trigger-context.d.ts.map +1 -1
  112. package/dist/types/components/dialog/dialog-trigger.d.ts +1 -1
  113. package/dist/types/components/dialog/dialog-trigger.d.ts.map +1 -1
  114. package/dist/types/components/dialog/dialog.d.ts +3 -3
  115. package/dist/types/components/dialog/dialog.d.ts.map +1 -1
  116. package/dist/types/components/dropdown/dropdown.d.ts +1 -2
  117. package/dist/types/components/dropdown/dropdown.d.ts.map +1 -1
  118. package/dist/types/components/error-summary/error-summary-heading.d.ts.map +1 -1
  119. package/dist/types/components/error-summary/error-summary.d.ts +6 -6
  120. package/dist/types/components/error-summary/error-summary.d.ts.map +1 -1
  121. package/dist/types/components/field/field-counter.d.ts +2 -8
  122. package/dist/types/components/field/field-counter.d.ts.map +1 -1
  123. package/dist/types/components/field/field-description.d.ts.map +1 -1
  124. package/dist/types/components/field/field.d.ts +6 -2
  125. package/dist/types/components/field/field.d.ts.map +1 -1
  126. package/dist/types/components/index.d.ts +1 -0
  127. package/dist/types/components/index.d.ts.map +1 -1
  128. package/dist/types/components/input/input.d.ts +13 -1
  129. package/dist/types/components/input/input.d.ts.map +1 -1
  130. package/dist/types/components/label/label.d.ts.map +1 -1
  131. package/dist/types/components/pagination/pagination-button.d.ts +13 -4
  132. package/dist/types/components/pagination/pagination-button.d.ts.map +1 -1
  133. package/dist/types/components/pagination/pagination.d.ts +27 -5
  134. package/dist/types/components/pagination/pagination.d.ts.map +1 -1
  135. package/dist/types/components/popover/popover-trigger.d.ts.map +1 -1
  136. package/dist/types/components/popover/popover.d.ts +2 -14
  137. package/dist/types/components/popover/popover.d.ts.map +1 -1
  138. package/dist/types/components/search/search-button.d.ts +1 -1
  139. package/dist/types/components/select/select.d.ts +2 -0
  140. package/dist/types/components/select/select.d.ts.map +1 -1
  141. package/dist/types/components/suggestion/suggestion-clear.d.ts +7 -5
  142. package/dist/types/components/suggestion/suggestion-clear.d.ts.map +1 -1
  143. package/dist/types/components/suggestion/suggestion-empty.d.ts +1 -0
  144. package/dist/types/components/suggestion/suggestion-empty.d.ts.map +1 -1
  145. package/dist/types/components/suggestion/suggestion-input.d.ts +2 -1
  146. package/dist/types/components/suggestion/suggestion-input.d.ts.map +1 -1
  147. package/dist/types/components/suggestion/suggestion-list.d.ts +1 -1
  148. package/dist/types/components/suggestion/suggestion-list.d.ts.map +1 -1
  149. package/dist/types/components/suggestion/suggestion-option.d.ts +1 -0
  150. package/dist/types/components/suggestion/suggestion-option.d.ts.map +1 -1
  151. package/dist/types/components/suggestion/suggestion.d.ts +5 -6
  152. package/dist/types/components/suggestion/suggestion.d.ts.map +1 -1
  153. package/dist/types/components/tabs/tabs-list.d.ts +4 -2
  154. package/dist/types/components/tabs/tabs-list.d.ts.map +1 -1
  155. package/dist/types/components/tabs/tabs-panel.d.ts +4 -2
  156. package/dist/types/components/tabs/tabs-panel.d.ts.map +1 -1
  157. package/dist/types/components/tabs/tabs-tab.d.ts +4 -2
  158. package/dist/types/components/tabs/tabs-tab.d.ts.map +1 -1
  159. package/dist/types/components/tabs/tabs.d.ts +6 -6
  160. package/dist/types/components/tabs/tabs.d.ts.map +1 -1
  161. package/dist/types/components/textfield/textfield.d.ts.map +1 -1
  162. package/dist/types/components/toggle-group/index.d.ts +1 -1
  163. package/dist/types/components/toggle-group/toggle-group-item.d.ts +12 -3
  164. package/dist/types/components/toggle-group/toggle-group-item.d.ts.map +1 -1
  165. package/dist/types/components/toggle-group/toggle-group.d.ts +12 -4
  166. package/dist/types/components/toggle-group/toggle-group.d.ts.map +1 -1
  167. package/dist/types/components/tooltip/tooltip.d.ts +10 -3
  168. package/dist/types/components/tooltip/tooltip.d.ts.map +1 -1
  169. package/dist/types/components/validation-message/validation-message.d.ts.map +1 -1
  170. package/dist/types/types.d.ts +2 -0
  171. package/dist/types/types.d.ts.map +1 -1
  172. package/dist/types/utilities/hooks/use-pagination/use-pagination.d.ts +1 -1
  173. package/dist/types/utilities/hooks/use-pagination/use-pagination.d.ts.map +1 -1
  174. package/dist/types/utilities/index.d.ts +6 -0
  175. package/dist/types/utilities/index.d.ts.map +1 -1
  176. package/dist/types/utilities/roving-focus/roving-focus-item.d.ts +1 -0
  177. package/dist/types/utilities/roving-focus/roving-focus-item.d.ts.map +1 -1
  178. package/dist/types/utilities/roving-focus/roving-focus-root.d.ts +1 -0
  179. package/dist/types/utilities/roving-focus/roving-focus-root.d.ts.map +1 -1
  180. package/dist/types/utilities/roving-focus/use-roving-focus.d.ts +3 -1
  181. package/dist/types/utilities/roving-focus/use-roving-focus.d.ts.map +1 -1
  182. package/package.json +11 -14
  183. package/dist/cjs/components/field/field-observer.js +0 -112
  184. package/dist/cjs/components/toggle-group/use-toggle-groupitem.js +0 -34
  185. package/dist/esm/components/field/field-observer.js +0 -107
  186. package/dist/esm/components/toggle-group/use-toggle-groupitem.js +0 -32
  187. package/dist/types/components/field/field-observer.d.ts +0 -5
  188. package/dist/types/components/field/field-observer.d.ts.map +0 -1
  189. package/dist/types/components/toggle-group/use-toggle-groupitem.d.ts +0 -12
  190. 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?.(`[popovertarget="${popover?.id}"]`);
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, ...rest }));
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, onKeyDown: (event) => {
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 (jsxRuntime.jsx(button.Button, { "aria-label": label, asChild: true, icon: true, hidden: true, ref: ref, variant: 'tertiary', ...rest, children: jsxRuntime.jsx("del", {}) }));
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, value: '', ref: ref, ...rest }) : null;
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 onValueChange on Suggest instead, or onInput if fetching API results');
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 value on Suggest instead.');
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
- }, ...rest }));
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('@u-elements/u-datalist');
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, uComboboxRef } = react.useContext(suggestion.SuggestionContext);
21
+ const { handleFilter } = react.useContext(suggestion.SuggestionContext);
23
22
  react.useEffect(handleFilter); // Must run on every render
24
- // Position with floating-ui
25
- react.useEffect(() => {
26
- const trigger = uComboboxRef?.current?.control;
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, ...rest }));
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
- var index = require('../chip/index.js');
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 uComboboxRef = react.useRef(null);
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, uComboboxRef]);
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 = uComboboxRef.current;
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 = uComboboxRef.current;
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 = [] } = uComboboxRef?.current || {};
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, uComboboxRef }, children: jsxRuntime.jsxs("u-combobox", { "data-multiple": multiple || undefined, "data-creatable": creatable || undefined, class: cl('ds-suggestion', className), ref: mergedRefs, ...rest, children: [selectedItems.map((item) => (jsxRuntime.jsx(index.Chip.Removable, { value: item.value, asChild: true, children: jsxRuntime.jsx("data", { children: renderSelected(item) }) }, item.value))), children, !!name && (jsxRuntime.jsx("select", { name: name, multiple: true, hidden: true, id: selectId }))] }) }));
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
- const { value, tablistRef } = react.useContext(tabs.Context);
21
- const mergedRefs = useMergeRefs.useMergeRefs([ref, tablistRef]);
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 { value: tabsValue, tablistRef, setPanelButtonMap, } = react.useContext(tabs.Context);
17
- const active = value === tabsValue;
18
- const generatedId = react.useId();
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, id, onClick, ...rest }, ref) {
16
- const tabs$1 = react.useContext(tabs.Context);
17
- const generatedId = react.useId();
18
- const buttonId = id ?? `tab-${generatedId}`;
19
- return (jsxRuntime.jsx(rovingFocusItem.RovingFocusItem, { value: value, ...rest, asChild: true, children: jsxRuntime.jsx("button", { ref: ref, id: buttonId, "aria-selected": tabs$1.value === value, "data-value": value, role: 'tab', type: 'button', onClick: (e) => {
20
- tabs$1.onChange?.(value);
21
- onClick?.(e);
22
- }, "aria-controls": tabs$1.panelButtonMap?.get(buttonId), ...rest }) }));
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 [panelButtonMap, setPanelButtonMap] = react.useState(new Map());
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
- tablistRef,
42
- panelButtonMap,
43
- setPanelButtonMap,
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 rovingFocusItem = require('../../utilities/roving-focus/roving-focus-item.js');
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 { active, buttonProps, value, variant } = useToggleGroupitem.useToggleGroupItem(rest);
17
- return (jsxRuntime.jsx(rovingFocusItem.RovingFocusItem, { asChild: true, value: value, children: jsxRuntime.jsx(button.Button, { variant: active ? variant : 'tertiary', ref: ref, ...rest, ...buttonProps }) }));
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, variant = 'primary', value, defaultValue, onChange, name, className, ...rest }, ref) {
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
- }, children: jsxRuntime.jsx(rovingFocusRoot.RovingFocusRoot, { asChild: true, activeValue: value, orientation: 'ambiguous', children: jsxRuntime.jsxs("div", { className: cl('ds-toggle-group', className), role: 'radiogroup', "data-variant": variant, ref: ref, ...rest, children: [name && jsxRuntime.jsx("input", { type: 'hidden', name: name, value: value }), children] }) }) }));
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;