@digdir/designsystemet-react 1.11.1 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -7,6 +7,7 @@ var reactVirtual = require('@tanstack/react-virtual');
7
7
  var cl = require('clsx/lite');
8
8
  var react = require('react');
9
9
  var useDebounceCallback = require('../../utilities/hooks/deprecated/use-debounce-callback/use-debounce-callback.js');
10
+ require('@digdir/designsystemet-web');
10
11
  require('../../utilities/roving-focus/roving-focus-item.js');
11
12
  require('../../utilities/roving-focus/roving-focus-root.js');
12
13
  var spinner = require('../spinner/spinner.js');
@@ -4,6 +4,7 @@
4
4
  var react$1 = require('@floating-ui/react');
5
5
  var react = require('react');
6
6
  var useDebounceCallback = require('../../../utilities/hooks/deprecated/use-debounce-callback/use-debounce-callback.js');
7
+ require('@digdir/designsystemet-web');
7
8
  require('../../../utilities/roving-focus/roving-focus-item.js');
8
9
  require('../../../utilities/roving-focus/roving-focus-root.js');
9
10
  var ComboboxContext = require('../ComboboxContext.js');
@@ -3,6 +3,7 @@
3
3
 
4
4
  var useDebounceCallback = require('../../utilities/hooks/deprecated/use-debounce-callback/use-debounce-callback.js');
5
5
  require('react');
6
+ require('@digdir/designsystemet-web');
6
7
  require('../../utilities/roving-focus/roving-focus-item.js');
7
8
  require('../../utilities/roving-focus/roving-focus-root.js');
8
9
  var ComboboxIdContext = require('./ComboboxIdContext.js');
@@ -22,12 +22,12 @@ var react = require('react');
22
22
  * <Icon />
23
23
  * </Avatar>
24
24
  */
25
- const Avatar = react.forwardRef(function Avatar({ 'aria-label': ariaLabel, variant = 'circle', className, children, initials, asChild, ...rest }, ref) {
25
+ const Avatar = react.forwardRef(function Avatar({ 'aria-label': ariaLabel, 'data-tooltip': dataTooltip, variant = 'circle', className, children, initials, asChild, ...rest }, ref) {
26
26
  const OuterComponent = asChild ? reactSlot.Slot : 'span';
27
27
  const useSlot = children && typeof children !== 'string';
28
28
  const textChild = children && typeof children === 'string';
29
29
  const Component = useSlot ? reactSlot.Slot : react.Fragment;
30
- return (jsxRuntime.jsx(OuterComponent, { ref: ref, className: cl('ds-avatar', className), "data-variant": variant, "data-initials": initials, role: asChild ? undefined : 'img', "aria-label": ariaLabel, ...rest, children: jsxRuntime.jsx(Component, { ...(useSlot && !asChild ? { 'aria-hidden': true } : {}), children: textChild ? jsxRuntime.jsx("span", { children: children }) : children }) }));
30
+ return (jsxRuntime.jsx(OuterComponent, { ref: ref, className: cl('ds-avatar', className), "data-variant": variant, "data-initials": initials, role: asChild ? undefined : 'img', "aria-label": ariaLabel || dataTooltip, "data-tooltip": dataTooltip, tabIndex: dataTooltip ? 0 : undefined, ...rest, children: jsxRuntime.jsx(Component, { ...(useSlot && !asChild ? { 'aria-hidden': true } : {}), children: textChild ? jsxRuntime.jsx("span", { children: children }) : children }) }));
31
31
  });
32
32
 
33
33
  exports.Avatar = Avatar;
@@ -6,7 +6,8 @@ var react = require('react');
6
6
  var link = require('../link/link.js');
7
7
 
8
8
  const BreadcrumbsLink = react.forwardRef(function BreadcrumbsLink(rest, ref) {
9
- return jsxRuntime.jsx(link.Link, { ref: ref, ...rest });
9
+ return (jsxRuntime.jsx(link.Link, { suppressHydrationWarning // Since <ds-breadcrumbs> adds aria-current="page"
10
+ : true, ref: ref, ...rest }));
10
11
  });
11
12
 
12
13
  exports.BreadcrumbsLink = BreadcrumbsLink;
@@ -3,19 +3,9 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
7
6
 
8
7
  const BreadcrumbsList = react.forwardRef(function BreadcrumbsList(rest, ref) {
9
- const innerRef = react.useRef(null);
10
- const mergedRefs = useMergeRefs.useMergeRefs([innerRef, ref]);
11
- // Set aria-current on last link
12
- react.useEffect(() => {
13
- const links = innerRef.current?.querySelectorAll(':scope > * > *') || [];
14
- const lastLink = links[links?.length - 1];
15
- lastLink?.setAttribute('aria-current', 'page');
16
- return () => lastLink?.removeAttribute('aria-current'); // Remove on re-render as React can re-use DOM elements
17
- });
18
- return jsxRuntime.jsx("ol", { ref: mergedRefs, ...rest });
8
+ return jsxRuntime.jsx("ol", { ref: ref, ...rest });
19
9
  });
20
10
 
21
11
  exports.BreadcrumbsList = BreadcrumbsList;
@@ -2,6 +2,7 @@
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');
7
8
 
@@ -23,6 +24,6 @@ var react = require('react');
23
24
  * </Breadcrumbs.List>
24
25
  * </Breadcrumbs>
25
26
  */
26
- const Breadcrumbs = react.forwardRef(({ 'aria-label': ariaLabel = 'Du er her:', className, ...rest }, ref) => (jsxRuntime.jsx("nav", { "aria-label": ariaLabel, className: cl('ds-breadcrumbs', className), ref: ref, ...rest })));
27
+ const Breadcrumbs = react.forwardRef(({ className, ...rest }, ref) => (jsxRuntime.jsx("ds-breadcrumbs", { suppressHydrationWarning: true, class: cl('ds-breadcrumbs', className), ref: ref, ...rest })));
27
28
 
28
29
  exports.Breadcrumbs = Breadcrumbs;
@@ -13,12 +13,17 @@ var spinner = require('../spinner/spinner.js');
13
13
  * @example
14
14
  * <Button>Click me</Button>
15
15
  */
16
- const Button = react.forwardRef(function Button({ asChild, className, children, icon = false, loading = false, variant = 'primary', ...rest }, ref) {
16
+ const Button = react.forwardRef(function Button({ asChild, className, children, icon = false, loading = false, variant = 'primary', popoverTarget, popovertarget, ...rest }, ref) {
17
17
  const Component = asChild ? reactSlot.Slot : 'button';
18
+ const popoverVal = popoverTarget ?? popovertarget;
19
+ const popoverKey = react.version.startsWith('19')
20
+ ? 'popoverTarget'
21
+ : 'popovertarget';
18
22
  // Fallbacks to undefined to prevent rendering attribute="false"
19
- return (jsxRuntime.jsxs(Component, { "aria-busy": Boolean(loading) || undefined, "aria-disabled": Boolean(loading) || undefined, className: cl('ds-button', className), "data-icon": icon || undefined, "data-variant": variant, ref: ref,
23
+ return (jsxRuntime.jsxs(Component, { suppressHydrationWarning // Might get augmented through designsystemet-web with aria-haspopup etc.
24
+ : true, "aria-busy": Boolean(loading) || undefined, "aria-disabled": Boolean(loading) || undefined, className: cl('ds-button', className), "data-icon": icon || undefined, "data-variant": variant, ref: ref,
20
25
  /* don't set type when we use `asChild` */
21
- type: asChild ? undefined : 'button', ...rest, children: [loading === true ? (jsxRuntime.jsx(spinner.Spinner, { "aria-hidden": 'true' })) : (loading // Allow custom loading spinner
26
+ type: asChild ? undefined : 'button', [popoverKey]: popoverVal, ...rest, children: [loading === true ? (jsxRuntime.jsx(spinner.Spinner, { "aria-hidden": 'true' })) : (loading // Allow custom loading spinner
22
27
  ), jsxRuntime.jsx(reactSlot.Slottable, { children: icon && loading ? null : children })] }));
23
28
  });
24
29
 
@@ -6,7 +6,11 @@ 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
 
11
+ const ATTR_CLICKDELEGATE = 'data-clickdelegatefor';
12
+ const SELECTOR_LINK = `:is(h1,h2,h3,h4,h5,h6) a`;
13
+ const SELECTOR_SKIP = 'a,button,label,details,dialog,[role="button"],[popover],[contenteditable]';
10
14
  /**
11
15
  * Card component to present content in a structured way.
12
16
  *
@@ -20,22 +24,26 @@ var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.
20
24
  const Card = react.forwardRef(function Card({ asChild = false, variant = 'default', className, ...rest }, ref) {
21
25
  const Component = asChild ? reactSlot.Slot : 'div';
22
26
  const cardRef = react.useRef(null);
27
+ const linkGeneratedId = react.useId();
23
28
  const mergedRefs = useMergeRefs.useMergeRefs([cardRef, ref]);
24
29
  // Forward click on card to heading links for better accessibility
25
30
  // https://adrianroselli.com/2020/02/block-links-cards-clickable-regions-etc.html
26
31
  react.useEffect(() => {
27
32
  const card = cardRef.current;
28
- const handleClick = ({ ctrlKey, metaKey, target }) => {
29
- const link = card?.querySelector(':is(h1,h2,h3,h4,h5,h6) a');
30
- if (!link || link?.contains(target))
31
- return; // Let links handle their own clicks
32
- if (ctrlKey || metaKey)
33
- window.open(link.href, '', 'noreferrer');
33
+ const link = card?.querySelector(SELECTOR_LINK);
34
+ const skip = !link || link.parentElement?.closest(SELECTOR_SKIP); // Using parentElement as link variable will always match a selector
35
+ const id = link?.id;
36
+ if (card?.hasAttribute(ATTR_CLICKDELEGATE) || skip)
37
+ return; // Already delegated or skipped
38
+ link.id = id || linkGeneratedId;
39
+ card?.setAttribute(ATTR_CLICKDELEGATE, link.id);
40
+ return () => {
41
+ if (id && link)
42
+ link.id = id;
34
43
  else
35
- link.click(); // Using link.click instead of window.location.href as this will trigger the browser's handling of rel=, target=, etc.
44
+ link?.removeAttribute('id');
45
+ card?.removeAttribute(ATTR_CLICKDELEGATE);
36
46
  };
37
- card?.addEventListener('click', handleClick);
38
- return () => card?.removeEventListener('click', handleClick);
39
47
  }, []);
40
48
  return (jsxRuntime.jsx(Component, { className: cl(`ds-card`, className), "data-variant": variant, ref: mergedRefs, ...rest }));
41
49
  });
@@ -10,9 +10,9 @@ var react = require('react');
10
10
  * @example
11
11
  * <Details.Summary>Heading</Details.Summary>
12
12
  */
13
- const DetailsSummary = react.forwardRef(function DetailsSummary({ className, ...rest }, ref) {
14
- /* Set `className` as `class` so react is happy */
15
- return jsxRuntime.jsx("u-summary", { ref: ref, class: className, ...rest });
13
+ const DetailsSummary = react.forwardRef(function DetailsSummary(rest, ref) {
14
+ return (jsxRuntime.jsx("summary", { suppressHydrationWarning // Since <details> polyfill adds attributes
15
+ : true, ref: ref, ...rest }));
16
16
  });
17
17
 
18
18
  exports.DetailsSummary = DetailsSummary;
@@ -5,7 +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('@u-elements/u-details');
8
+ require('@digdir/designsystemet-web');
9
9
 
10
10
  /**
11
11
  * Details component, contains `Details.Summary` and `Details.Content` components.
@@ -37,7 +37,7 @@ const Details = react.forwardRef(function Details({ className, open, defaultOpen
37
37
  details?.addEventListener('toggle', handleToggle, true);
38
38
  return () => details?.removeEventListener('toggle', handleToggle, true);
39
39
  }, []);
40
- return (jsxRuntime.jsx("u-details", { class: cl('ds-details', className), open: (open ?? initialOpen.current) || undefined, "data-variant": variant, ref: mergedRefs, ...rest }));
40
+ return (jsxRuntime.jsx("details", { className: cl('ds-details', className), open: (open ?? initialOpen.current) || undefined, "data-variant": variant, ref: mergedRefs, ...rest }));
41
41
  });
42
42
 
43
43
  exports.Details = Details;
@@ -4,9 +4,7 @@
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
6
 
7
- const Context = react.createContext({
8
- current: null,
9
- });
7
+ const Context = react.createContext({});
10
8
  /**
11
9
  * DialogTriggerContext component, used to provide a context for a dialog trigger.
12
10
  *
@@ -18,9 +16,10 @@ const Context = react.createContext({
18
16
  * </Dialog>
19
17
  * </Dialog.TriggerContext>
20
18
  */
21
- const DialogTriggerContext = ({ children, }) => {
22
- const contextRef = react.useRef(null);
23
- return jsxRuntime.jsx(Context.Provider, { value: contextRef, children: children });
19
+ const DialogTriggerContext = (rest) => {
20
+ const [state, setState] = react.useState({});
21
+ const setContext = (next) => setState({ ...state, ...next });
22
+ return jsxRuntime.jsx(Context.Provider, { value: { ...state, setContext }, ...rest });
24
23
  };
25
24
  DialogTriggerContext.displayName = 'DialogTriggerContext';
26
25
 
@@ -19,15 +19,10 @@ var dialogTriggerContext = require('./dialog-trigger-context.js');
19
19
  * </Dialog.TriggerContext>
20
20
  */
21
21
  const DialogTrigger = react.forwardRef(function DialogTrigger({ asChild, ...rest }, ref) {
22
- const contextRef = react.useContext(dialogTriggerContext.Context);
22
+ const { id, modal } = react.useContext(dialogTriggerContext.Context);
23
23
  const Component = asChild ? reactSlot.Slot : button.Button;
24
- const openDialog = () => {
25
- /* check if element has `data-modal`, it it has, use `showModal` */
26
- contextRef.current?.getAttribute('data-modal') === 'true'
27
- ? contextRef.current?.showModal()
28
- : contextRef.current?.show();
29
- };
30
- return (jsxRuntime.jsx(Component, { "aria-haspopup": 'dialog', onClick: openDialog, ref: ref, ...rest }));
24
+ return (jsxRuntime.jsx(Component, { suppressHydrationWarning // Might get augmented through designsystemet-web with aria-haspopup
25
+ : true, command: modal ? 'show-modal' : 'show', commandfor: id, ref: ref, ...rest }));
31
26
  });
32
27
 
33
28
  exports.DialogTrigger = DialogTrigger;
@@ -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 button = require('../button/button.js');
10
11
  var dialogTriggerContext = require('./dialog-trigger-context.js');
11
12
 
@@ -27,69 +28,38 @@ var dialogTriggerContext = require('./dialog-trigger-context.js');
27
28
  *
28
29
  * ...
29
30
  *
30
- * <Button onClick={() => dialogRef.current?.showModal()}>Open Dialog</Button>
31
- * <Dialog ref={dialogRef}>
31
+ * <Button command="show-modal" commandfor="my-dialog">Open Dialog</Button>
32
+ * <Dialog id="my-dialog">
32
33
  * Content
33
34
  * </Dialog>
34
35
  */
35
- const Dialog = react.forwardRef(function Dialog({ asChild, children, className, placement = 'center', closeButton = 'Lukk dialogvindu', closedby = 'closerequest', modal = true, onClose, open, ...rest }, ref) {
36
- const contextRef = react.useContext(dialogTriggerContext.Context);
36
+ const Dialog = react.forwardRef(function Dialog({ asChild, children, className, closeButton = 'Lukk dialogvindu', id, modal = true, onAnimationEnd, onClick, onClose, open, placement = 'center', ...rest }, ref) {
37
+ const { setContext } = react.useContext(dialogTriggerContext.Context);
37
38
  const dialogRef = react.useRef(null); // This local ref is used to make sure the dialog works without a DialogTriggerContext
38
39
  const Component = asChild ? reactSlot.Slot : 'dialog';
39
- const mergedRefs = useMergeRefs.useMergeRefs([contextRef, ref, dialogRef]);
40
+ const mergedRefs = useMergeRefs.useMergeRefs([ref, dialogRef]);
40
41
  const showProp = modal ? 'showModal' : 'show';
41
- react.useEffect(() => dialogRef.current?.[open ? showProp : 'close'](), [open]); // Toggle open based on prop
42
- react.useEffect(() => {
43
- const dialog = dialogRef.current;
44
- const handleClosedby = (event) => {
45
- if (event.defaultPrevented)
46
- return; // Skip if default action is prevented
47
- const { clientY: y, clientX: x, target } = event;
48
- /* Check if clicked element or its closest parent has data-command='close' */
49
- if (target instanceof Element && event.type === 'click') {
50
- const closeElement = target.closest('[data-command="close"]');
51
- if (closeElement)
52
- return dialog?.close();
42
+ const autoId = react.useId();
43
+ const usedId = id ?? autoId;
44
+ // Toggle open based on prop
45
+ react.useEffect(() => dialogRef.current?.[open ? showProp : 'close'](), [open]);
46
+ // Store context for DialogTrigger to consume, so it can open the dialog when the trigger is clicked
47
+ react.useEffect(() => setContext?.({ id: usedId, modal }), [usedId, modal]);
48
+ return (jsxRuntime.jsxs(Component, { className: cl('ds-dialog', className), "data-placement": placement, id: usedId, onClose: (event) => onClose?.(event.nativeEvent), onClick: (event) => {
49
+ onClick?.(event);
50
+ const { currentTarget: dialog, target: el, defaultPrevented } = event;
51
+ const isClose = el?.closest?.('[data-command="close"]');
52
+ if (!defaultPrevented && isClose) {
53
+ dialog.close();
54
+ console.warn('Designsystemet: data-command="close" is deprecated. Use command="close" and commandfor="DIALOG-ID" instead.');
53
55
  }
54
- // if the browser supports closedBy, we let the browser handle it
55
- // see https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy
56
- if (dialog && 'closedBy' in dialog)
57
- return;
58
- if (event instanceof KeyboardEvent)
59
- return (closedby === 'none' &&
60
- event.key === 'Escape' &&
61
- event.preventDefault()); // Skip ESC-key if closedby="none"
62
- if (window.getSelection()?.toString())
63
- return; // Fix bug where if you select text spanning two divs it thinks you clicked outside
64
- if (dialog && target === dialog && closedby === 'any') {
65
- const { top, left, right, bottom } = dialog.getBoundingClientRect();
66
- const isInDialog = top <= y && y <= bottom && left <= x && x <= right;
67
- if (!isInDialog)
68
- dialog?.close(); // Both <dialog> and ::backdrop is considered same event.target
69
- }
70
- };
71
- const handleAutoFocus = () => {
72
- const autofocus = dialog?.querySelector('[autofocus]');
56
+ }, onAnimationEnd: (event) => {
57
+ const { currentTarget: dialog } = event;
58
+ const autofocus = dialog.querySelector('[autofocus]');
73
59
  if (document.activeElement !== autofocus)
74
- autofocus?.focus();
75
- };
76
- dialog?.addEventListener('animationend', handleAutoFocus);
77
- dialog?.addEventListener('click', handleClosedby);
78
- dialog?.addEventListener('keydown', handleClosedby);
79
- return () => {
80
- dialog?.removeEventListener('animationend', handleAutoFocus);
81
- dialog?.removeEventListener('click', handleClosedby);
82
- dialog?.removeEventListener('keydown', handleClosedby);
83
- };
84
- }, [closedby]);
85
- /* handle closing */
86
- react.useEffect(() => {
87
- const handleClose = (event) => onClose?.(event);
88
- const currentRef = dialogRef.current;
89
- currentRef?.addEventListener('close', handleClose);
90
- return () => currentRef?.removeEventListener('close', handleClose);
91
- }, [onClose]);
92
- return (jsxRuntime.jsxs(Component, { className: cl('ds-dialog', className), ref: mergedRefs, "data-placement": placement, "data-modal": modal, closedby: closedby, ...rest, children: [closeButton !== false && (jsxRuntime.jsx(button.Button, { "aria-label": closeButton, "data-color": 'neutral', icon: true, variant: 'tertiary', "data-command": 'close' })), children] }));
60
+ autofocus?.focus(); // Handle autofocus on open
61
+ onAnimationEnd?.(event);
62
+ }, ref: mergedRefs, ...rest, children: [closeButton !== false && (jsxRuntime.jsx(button.Button, { "aria-label": closeButton, "data-color": 'neutral', icon: true, variant: 'tertiary', command: 'close', commandfor: id ?? autoId })), children] }));
93
63
  });
94
64
 
95
65
  exports.Dialog = Dialog;
@@ -4,7 +4,6 @@
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
6
  var heading = require('../heading/heading.js');
7
- var errorSummary = require('./error-summary.js');
8
7
 
9
8
  /**
10
9
  * ErrorSummary heading component, used to display a heading for the error summary.
@@ -14,13 +13,8 @@ var errorSummary = require('./error-summary.js');
14
13
  * <ErrorSummaryHeading>Heading</ErrorSummaryHeading>
15
14
  * </ErrorSummary>
16
15
  */
17
- const ErrorSummaryHeading = react.forwardRef(function ErrorSummaryHeading({ className, id, ...rest }, ref) {
18
- const { headingId, setHeadingId } = react.useContext(errorSummary.ErrorSummaryContext);
19
- react.useEffect(() => {
20
- if (id && headingId !== id)
21
- setHeadingId(id);
22
- }, [headingId, id, setHeadingId]);
23
- return jsxRuntime.jsx(heading.Heading, { id: headingId, ref: ref, ...rest });
16
+ const ErrorSummaryHeading = react.forwardRef(function ErrorSummaryHeading(rest, ref) {
17
+ return jsxRuntime.jsx(heading.Heading, { ref: ref, suppressHydrationWarning: true, ...rest }); // Suppress hydration warning since we will get an ID from <ds-error-summary>
24
18
  });
25
19
 
26
20
  exports.ErrorSummaryHeading = ErrorSummaryHeading;
@@ -6,10 +6,6 @@ var reactSlot = require('@radix-ui/react-slot');
6
6
  var cl = require('clsx/lite');
7
7
  var react = require('react');
8
8
 
9
- const ErrorSummaryContext = react.createContext({
10
- headingId: 'heading',
11
- setHeadingId: () => { },
12
- });
13
9
  /**
14
10
  * ErrorSummary component, used to display a list of errors.
15
11
  *
@@ -27,11 +23,10 @@ const ErrorSummaryContext = react.createContext({
27
23
  * </ErrorSummary>
28
24
  */
29
25
  const ErrorSummary = react.forwardRef(function ErrorSummary({ asChild, className, ...rest }, ref) {
30
- const randomId = react.useId();
31
- const [headingId, setHeadingId] = react.useState(randomId);
32
- const Component = asChild ? reactSlot.Slot : 'div';
33
- return (jsxRuntime.jsx(ErrorSummaryContext.Provider, { value: { headingId, setHeadingId }, children: jsxRuntime.jsx(Component, { tabIndex: -1, "aria-labelledby": headingId, className: cl('ds-error-summary', className), ref: ref, ...rest }) }));
26
+ const Component = asChild ? reactSlot.Slot : 'ds-error-summary';
27
+ return (jsxRuntime.jsx(Component, { ...(asChild
28
+ ? { className: cl('ds-error-summary', className) }
29
+ : { class: cl('ds-error-summary', className) }), ref: ref, suppressHydrationWarning: true, ...rest }));
34
30
  });
35
31
 
36
32
  exports.ErrorSummary = ErrorSummary;
37
- exports.ErrorSummaryContext = ErrorSummaryContext;
@@ -3,14 +3,9 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- var useDebounceCallback = require('../../utilities/hooks/deprecated/use-debounce-callback/use-debounce-callback.js');
7
- require('../../utilities/roving-focus/roving-focus-item.js');
8
- require('../../utilities/roving-focus/roving-focus-root.js');
9
- var paragraph = require('../paragraph/paragraph.js');
6
+ var index = require('../../utilities/index.js');
10
7
  var validationMessage = require('../validation-message/validation-message.js');
11
- var fieldObserver = require('./field-observer.js');
12
8
 
13
- const label = (text, count) => text.replace('%d', Math.abs(count).toString());
14
9
  /**
15
10
  * FieldCounter component, used to display a counter for a form field.
16
11
  *
@@ -20,41 +15,11 @@ const label = (text, count) => text.replace('%d', Math.abs(count).toString());
20
15
  * <Field.Counter limit={100} under='%d tegn igjen' over='%d tegn for mye' />
21
16
  * </Field>
22
17
  */
23
- const FieldCounter = react.forwardRef(function FieldCounter({ limit, under = '%d tegn igjen', over = '%d tegn for mye', hint = 'Maks %d tegn tillatt.', ...rest }, ref) {
24
- const [count, setCount] = react.useState(0);
25
- const [liveRegionText, setLiveRegionText] = react.useState('');
26
- const fieldInputRef = react.useRef(null);
27
- const counterRef = react.useRef(null);
28
- const hasExceededLimit = count > limit;
29
- const remainder = limit - count;
30
- const debouncedSetLiveRegionText = useDebounceCallback.useDebounceCallback((text) => setLiveRegionText(text), 1200);
31
- // Listen to native input events (user typing) to update the counter in real time
32
- react.useEffect(() => {
33
- const field = counterRef.current?.closest('.ds-field');
34
- const input = Array.from(field?.getElementsByTagName('*') || []).find(fieldObserver.isInputLike);
35
- const onInput = ({ target }) => {
36
- if (fieldObserver.isInputLike(target))
37
- setCount(target.value.length);
38
- };
39
- if (input)
40
- onInput({ target: input }); // Initial setup
41
- fieldInputRef.current = input;
42
- field?.addEventListener('input', onInput);
43
- return () => field?.removeEventListener('input', onInput);
44
- }, []);
45
- /* React does not dispatch a native input event when the value prop changes externally.
46
- Since the parent re-renders this component when value changes, we can sync on render. */
47
- react.useEffect(() => {
48
- if (fieldInputRef.current) {
49
- const valueLength = fieldInputRef.current.value.length;
50
- setCount((prev) => (prev === valueLength ? prev : valueLength));
51
- }
52
- });
53
- // Update live region text when count or limit changes
54
- react.useEffect(() => {
55
- debouncedSetLiveRegionText(label(hasExceededLimit ? over : under, remainder));
56
- }, [count, limit, over, under, hasExceededLimit, remainder]);
57
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: 'ds-sr-only', "aria-live": 'polite', ref: counterRef, children: liveRegionText }), hasExceededLimit ? (jsxRuntime.jsx(validationMessage.ValidationMessage, { ref: ref, ...rest, "aria-hidden": 'true', "data-field": null, children: label(over, remainder) })) : (jsxRuntime.jsx(paragraph.Paragraph, { ref: ref, ...rest, "aria-hidden": 'true', children: label(under, remainder) })), jsxRuntime.jsx("div", { className: 'ds-sr-only', "aria-hidden": 'true', "data-field": 'description', children: label(hint, limit) })] }));
18
+ const FieldCounter = react.forwardRef(function FieldCounter({ limit, under, over, hint, ...rest }, _ref) {
19
+ if (hint)
20
+ index.warn('hint attribute is deprecated on Field.Counter');
21
+ return (jsxRuntime.jsx(validationMessage.ValidationMessage, { suppressHydrationWarning // Since <ds-field> adds attributes
22
+ : true, "data-field": 'counter', "data-limit": limit, "data-under": under, "data-over": over, ...rest }));
58
23
  });
59
24
 
60
25
  exports.FieldCounter = FieldCounter;
@@ -11,7 +11,8 @@ var react = require('react');
11
11
  * <FieldDescription>Additional information</FieldDescription>
12
12
  */
13
13
  const FieldDescription = react.forwardRef(function FieldDescription(rest, ref) {
14
- return jsxRuntime.jsx("div", { "data-field": 'description', ref: ref, ...rest });
14
+ return (jsxRuntime.jsx("div", { suppressHydrationWarning // Since <ds-field> adds attributes
15
+ : true, "data-field": 'description', ref: ref, ...rest }));
15
16
  });
16
17
 
17
18
  exports.FieldDescription = FieldDescription;
@@ -2,11 +2,11 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
+ require('@digdir/designsystemet-web');
5
6
  var reactSlot = require('@radix-ui/react-slot');
6
7
  var cl = require('clsx/lite');
7
8
  var react = require('react');
8
9
  var useMergeRefs = require('../../utilities/hooks/use-merge-refs/use-merge-refs.js');
9
- var fieldObserver = require('./field-observer.js');
10
10
 
11
11
  /**
12
12
  * Field component, used to wrap a form field.
@@ -20,11 +20,13 @@ var fieldObserver = require('./field-observer.js');
20
20
  * </Field>
21
21
  */
22
22
  const Field = react.forwardRef(function Field({ className, position, asChild, ...rest }, ref) {
23
- const Component = asChild ? reactSlot.Slot : 'div';
23
+ const Component = asChild ? reactSlot.Slot : 'ds-field';
24
24
  const fieldRef = react.useRef(null);
25
25
  const mergedRefs = useMergeRefs.useMergeRefs([fieldRef, ref]);
26
- react.useEffect(() => fieldObserver.fieldObserver(fieldRef.current), []);
27
- return (jsxRuntime.jsx(Component, { className: cl('ds-field', className), "data-position": position, ref: mergedRefs, ...rest }));
26
+ return (jsxRuntime.jsx(Component, { ...(asChild
27
+ ? { className: cl('ds-field', className) }
28
+ : { class: cl('ds-field', className) }), suppressHydrationWarning // Since <ds-field> adds attributes
29
+ : true, "data-position": position, ref: mergedRefs, ...rest }));
28
30
  });
29
31
 
30
32
  exports.Field = Field;
@@ -14,7 +14,8 @@ var react = require('react');
14
14
  */
15
15
  const Label = react.forwardRef(function Label({ className, weight = 'medium', asChild, ...rest }, ref) {
16
16
  const Component = asChild ? reactSlot.Slot : 'label';
17
- return (jsxRuntime.jsx(Component, { ref: ref, className: cl('ds-label', className), "data-weight": weight, ...rest }));
17
+ return (jsxRuntime.jsx(Component, { ref: ref, className: cl('ds-label', className), suppressHydrationWarning // Since <ds-field> will add for attribute dynamically
18
+ : true, "data-weight": weight, ...rest }));
18
19
  });
19
20
 
20
21
  exports.Label = Label;
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
+ var reactSlot = require('@radix-ui/react-slot');
5
6
  var react = require('react');
6
- var button = require('../button/button.js');
7
7
 
8
8
  /**
9
9
  * PaginationButton component, use within a Pagination.Item.
@@ -13,8 +13,10 @@ var button = require('../button/button.js');
13
13
  * <PaginationButton aria-label='Forrige side'>Forrige</PaginationButton>
14
14
  * </PaginationItem>
15
15
  */
16
- const PaginationButton = react.forwardRef(function PaginationButton(rest, ref) {
17
- return jsxRuntime.jsx(button.Button, { ref: ref, ...rest });
16
+ const PaginationButton = react.forwardRef(function PaginationButton({ asChild, ...rest }, ref) {
17
+ const Component = asChild ? reactSlot.Slot : 'button';
18
+ return (jsxRuntime.jsx(Component, { className: 'ds-button', "data-variant": 'tertiary', suppressHydrationWarning // Since <ds-pagination> adds attributes
19
+ : true, ref: ref, ...rest }));
18
20
  });
19
21
 
20
22
  exports.PaginationButton = PaginationButton;
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
+ require('@digdir/designsystemet-web');
5
6
  var reactSlot = require('@radix-ui/react-slot');
6
7
  var cl = require('clsx/lite');
7
8
  var react = require('react');
@@ -24,9 +25,12 @@ var react = require('react');
24
25
  * </Pagination.List>
25
26
  * </Pagination>
26
27
  */
27
- const Pagination = react.forwardRef(function Pagination({ 'aria-label': ariaLabel = 'Sidenavigering', asChild, className, ...rest }, ref) {
28
- const Component = asChild ? reactSlot.Slot : 'nav';
29
- return (jsxRuntime.jsx(Component, { "aria-label": ariaLabel, className: cl('ds-pagination', className), ref: ref, ...rest }));
28
+ const Pagination = react.forwardRef(function Pagination({ asChild, className, ...rest }, ref) {
29
+ const Component = asChild ? reactSlot.Slot : 'ds-pagination';
30
+ return (jsxRuntime.jsx(Component, { ...(asChild
31
+ ? { className: cl('ds-pagination', className) }
32
+ : { class: cl('ds-pagination', className) }), suppressHydrationWarning // Since ds-pagination will change aria-label and role after hydration
33
+ : true, ref: ref, ...rest }));
30
34
  });
31
35
 
32
36
  exports.Pagination = Pagination;
@@ -28,18 +28,14 @@ var popoverTriggerContext = require('./popover-trigger-context.js');
28
28
  * </Popover>
29
29
  * </PopoverTriggerContext>
30
30
  */
31
- const PopoverTrigger = react.forwardRef(function PopoverTrigger({ id, inline, asChild, ...rest }, ref) {
31
+ const PopoverTrigger = react.forwardRef(function PopoverTrigger({ id, inline, asChild, popovertarget, popoverTarget, ...rest }, ref) {
32
32
  const { popoverId } = react.useContext(popoverTriggerContext.Context);
33
33
  const Component = asChild ? reactSlot.Slot : inline ? 'button' : button.Button;
34
- const popoverProps = Object.assign({
35
- [react.version.startsWith('19') ? 'popoverTarget' : 'popovertarget']: popoverId,
36
- ...(inline
37
- ? {
38
- 'data-popover': 'inline',
39
- }
40
- : {}),
41
- }, rest);
42
- return jsxRuntime.jsx(Component, { ref: ref, ...popoverProps });
34
+ const popoverVal = popoverTarget ?? popovertarget ?? popoverId;
35
+ const popoverKey = react.version.startsWith('19')
36
+ ? 'popoverTarget'
37
+ : 'popovertarget';
38
+ return (jsxRuntime.jsx(Component, { ref: ref, "data-popover": inline ? 'inline' : undefined, [popoverKey]: popoverVal, ...rest }));
43
39
  });
44
40
 
45
41
  exports.PopoverTrigger = PopoverTrigger;