@salt-ds/core 1.32.0 → 1.34.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 (184) hide show
  1. package/css/salt-core.css +30 -26
  2. package/dist-cjs/accordion/Accordion.js +6 -1
  3. package/dist-cjs/accordion/Accordion.js.map +1 -1
  4. package/dist-cjs/accordion/AccordionContext.js +6 -3
  5. package/dist-cjs/accordion/AccordionContext.js.map +1 -1
  6. package/dist-cjs/accordion/AccordionHeader.js +20 -4
  7. package/dist-cjs/accordion/AccordionHeader.js.map +1 -1
  8. package/dist-cjs/accordion/AccordionPanel.css.js +1 -1
  9. package/dist-cjs/accordion/AccordionPanel.js +10 -4
  10. package/dist-cjs/accordion/AccordionPanel.js.map +1 -1
  11. package/dist-cjs/aria-announcer/useAriaAnnouncer.js +2 -2
  12. package/dist-cjs/avatar/useAvatarImage.js +2 -2
  13. package/dist-cjs/breakpoints/BreakpointProvider.js +1 -1
  14. package/dist-cjs/card/Card.css.js +1 -1
  15. package/dist-cjs/card/Card.js.map +1 -1
  16. package/dist-cjs/checkbox/internal/CheckboxGroupContext.js +2 -2
  17. package/dist-cjs/combo-box/ComboBox.js +5 -3
  18. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  19. package/dist-cjs/combo-box/useComboBox.js +2 -2
  20. package/dist-cjs/dialog/Dialog.js +3 -1
  21. package/dist-cjs/dialog/Dialog.js.map +1 -1
  22. package/dist-cjs/dialog/DialogContent.js.map +1 -1
  23. package/dist-cjs/dropdown/Dropdown.js +1 -0
  24. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  25. package/dist-cjs/file-drop-zone/FileDropZoneTrigger.js +1 -1
  26. package/dist-cjs/form-field/FormField.css.js +1 -1
  27. package/dist-cjs/form-field/FormField.js.map +1 -1
  28. package/dist-cjs/form-field/FormFieldHelperText.js +1 -1
  29. package/dist-cjs/form-field/FormFieldHelperText.js.map +1 -1
  30. package/dist-cjs/form-field-context/FormFieldContext.js +2 -2
  31. package/dist-cjs/index.js +2 -0
  32. package/dist-cjs/index.js.map +1 -1
  33. package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
  34. package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
  35. package/dist-cjs/interactable-card/InteractableCardGroupContext.js +2 -2
  36. package/dist-cjs/link-card/LinkCard.css.js +1 -1
  37. package/dist-cjs/link-card/LinkCard.js.map +1 -1
  38. package/dist-cjs/list-box/ListBox.css.js +1 -1
  39. package/dist-cjs/list-control/ListControlContext.js +2 -2
  40. package/dist-cjs/list-control/ListControlState.js +7 -12
  41. package/dist-cjs/list-control/ListControlState.js.map +1 -1
  42. package/dist-cjs/menu/MenuBase.js +4 -2
  43. package/dist-cjs/menu/MenuBase.js.map +1 -1
  44. package/dist-cjs/menu/MenuContext.js +2 -2
  45. package/dist-cjs/menu/MenuPanel.css.js +1 -1
  46. package/dist-cjs/menu/MenuPanelContext.js +2 -2
  47. package/dist-cjs/menu/MenuTrigger.js +1 -1
  48. package/dist-cjs/menu/MenuTriggerContext.js +2 -2
  49. package/dist-cjs/navigation-item/ExpansionIcon.js +3 -3
  50. package/dist-cjs/navigation-item/ExpansionIcon.js.map +1 -1
  51. package/dist-cjs/navigation-item/NavigationItem.js +16 -9
  52. package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
  53. package/dist-cjs/navigation-item/NavigationItemAction.js +117 -0
  54. package/dist-cjs/navigation-item/NavigationItemAction.js.map +1 -0
  55. package/dist-cjs/option/Option.css.js +1 -1
  56. package/dist-cjs/option/OptionList.css.js +1 -1
  57. package/dist-cjs/overlay/Overlay.js +1 -1
  58. package/dist-cjs/overlay/OverlayContext.js +2 -2
  59. package/dist-cjs/overlay/OverlayContext.js.map +1 -1
  60. package/dist-cjs/overlay/OverlayTrigger.js +1 -1
  61. package/dist-cjs/pagination/PageButton.css.js +1 -1
  62. package/dist-cjs/pagination/PageRanges.js +1 -1
  63. package/dist-cjs/panel/Panel.css.js +1 -1
  64. package/dist-cjs/panel/Panel.js.map +1 -1
  65. package/dist-cjs/parent-child-layout/useIsViewportLargerThanBreakpoint.js +2 -2
  66. package/dist-cjs/pill-input/useTruncatePills.js +2 -1
  67. package/dist-cjs/pill-input/useTruncatePills.js.map +1 -1
  68. package/dist-cjs/radio-button/RadioButtonIcon.js +0 -1
  69. package/dist-cjs/radio-button/RadioButtonIcon.js.map +1 -1
  70. package/dist-cjs/radio-button/internal/RadioGroupContext.js +2 -2
  71. package/dist-cjs/salt-provider/SaltProvider.js +2 -6
  72. package/dist-cjs/salt-provider/SaltProvider.js.map +1 -1
  73. package/dist-cjs/spinner/svgSpinners/SpinnerSVG.js +1 -1
  74. package/dist-cjs/tag/Tag.js +1 -1
  75. package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js +2 -2
  76. package/dist-cjs/tooltip/Tooltip.js +1 -1
  77. package/dist-cjs/tooltip/TooltipBase.js +1 -1
  78. package/dist-cjs/tooltip/useAriaAnnounce.js +1 -1
  79. package/dist-cjs/tooltip/useTooltip.js +2 -2
  80. package/dist-cjs/utils/renderProps.js +32 -0
  81. package/dist-cjs/utils/renderProps.js.map +1 -0
  82. package/dist-cjs/utils/useValueEffect.js +1 -1
  83. package/dist-cjs/viewport/ViewportProvider.js +1 -1
  84. package/dist-es/accordion/Accordion.js +7 -2
  85. package/dist-es/accordion/Accordion.js.map +1 -1
  86. package/dist-es/accordion/AccordionContext.js +6 -3
  87. package/dist-es/accordion/AccordionContext.js.map +1 -1
  88. package/dist-es/accordion/AccordionHeader.js +20 -4
  89. package/dist-es/accordion/AccordionHeader.js.map +1 -1
  90. package/dist-es/accordion/AccordionPanel.css.js +1 -1
  91. package/dist-es/accordion/AccordionPanel.js +10 -4
  92. package/dist-es/accordion/AccordionPanel.js.map +1 -1
  93. package/dist-es/aria-announcer/useAriaAnnouncer.js +2 -2
  94. package/dist-es/avatar/useAvatarImage.js +2 -2
  95. package/dist-es/breakpoints/BreakpointProvider.js +1 -1
  96. package/dist-es/card/Card.css.js +1 -1
  97. package/dist-es/card/Card.js.map +1 -1
  98. package/dist-es/checkbox/internal/CheckboxGroupContext.js +2 -2
  99. package/dist-es/combo-box/ComboBox.js +6 -4
  100. package/dist-es/combo-box/ComboBox.js.map +1 -1
  101. package/dist-es/combo-box/useComboBox.js +2 -2
  102. package/dist-es/dialog/Dialog.js +3 -1
  103. package/dist-es/dialog/Dialog.js.map +1 -1
  104. package/dist-es/dialog/DialogContent.js.map +1 -1
  105. package/dist-es/dropdown/Dropdown.js +2 -1
  106. package/dist-es/dropdown/Dropdown.js.map +1 -1
  107. package/dist-es/file-drop-zone/FileDropZoneTrigger.js +1 -1
  108. package/dist-es/form-field/FormField.css.js +1 -1
  109. package/dist-es/form-field/FormField.js.map +1 -1
  110. package/dist-es/form-field/FormFieldHelperText.js +1 -1
  111. package/dist-es/form-field/FormFieldHelperText.js.map +1 -1
  112. package/dist-es/form-field-context/FormFieldContext.js +2 -2
  113. package/dist-es/index.js +1 -0
  114. package/dist-es/index.js.map +1 -1
  115. package/dist-es/interactable-card/InteractableCard.css.js +1 -1
  116. package/dist-es/interactable-card/InteractableCard.js.map +1 -1
  117. package/dist-es/interactable-card/InteractableCardGroupContext.js +2 -2
  118. package/dist-es/link-card/LinkCard.css.js +1 -1
  119. package/dist-es/link-card/LinkCard.js.map +1 -1
  120. package/dist-es/list-box/ListBox.css.js +1 -1
  121. package/dist-es/list-control/ListControlContext.js +2 -2
  122. package/dist-es/list-control/ListControlState.js +7 -12
  123. package/dist-es/list-control/ListControlState.js.map +1 -1
  124. package/dist-es/menu/MenuBase.js +4 -2
  125. package/dist-es/menu/MenuBase.js.map +1 -1
  126. package/dist-es/menu/MenuContext.js +2 -2
  127. package/dist-es/menu/MenuPanel.css.js +1 -1
  128. package/dist-es/menu/MenuPanelContext.js +2 -2
  129. package/dist-es/menu/MenuTrigger.js +1 -1
  130. package/dist-es/menu/MenuTriggerContext.js +2 -2
  131. package/dist-es/navigation-item/ExpansionIcon.js +3 -3
  132. package/dist-es/navigation-item/ExpansionIcon.js.map +1 -1
  133. package/dist-es/navigation-item/NavigationItem.js +16 -9
  134. package/dist-es/navigation-item/NavigationItem.js.map +1 -1
  135. package/dist-es/navigation-item/NavigationItemAction.js +113 -0
  136. package/dist-es/navigation-item/NavigationItemAction.js.map +1 -0
  137. package/dist-es/option/Option.css.js +1 -1
  138. package/dist-es/option/OptionList.css.js +1 -1
  139. package/dist-es/overlay/Overlay.js +1 -1
  140. package/dist-es/overlay/OverlayContext.js +2 -2
  141. package/dist-es/overlay/OverlayContext.js.map +1 -1
  142. package/dist-es/overlay/OverlayTrigger.js +1 -1
  143. package/dist-es/pagination/PageButton.css.js +1 -1
  144. package/dist-es/pagination/PageRanges.js +1 -1
  145. package/dist-es/panel/Panel.css.js +1 -1
  146. package/dist-es/panel/Panel.js.map +1 -1
  147. package/dist-es/parent-child-layout/useIsViewportLargerThanBreakpoint.js +2 -2
  148. package/dist-es/pill-input/useTruncatePills.js +2 -1
  149. package/dist-es/pill-input/useTruncatePills.js.map +1 -1
  150. package/dist-es/radio-button/RadioButtonIcon.js +0 -1
  151. package/dist-es/radio-button/RadioButtonIcon.js.map +1 -1
  152. package/dist-es/radio-button/internal/RadioGroupContext.js +2 -2
  153. package/dist-es/salt-provider/SaltProvider.js +3 -3
  154. package/dist-es/salt-provider/SaltProvider.js.map +1 -1
  155. package/dist-es/spinner/svgSpinners/SpinnerSVG.js +1 -1
  156. package/dist-es/tag/Tag.js +1 -1
  157. package/dist-es/toggle-button-group/ToggleButtonGroupContext.js +2 -2
  158. package/dist-es/tooltip/Tooltip.js +1 -1
  159. package/dist-es/tooltip/TooltipBase.js +1 -1
  160. package/dist-es/tooltip/useAriaAnnounce.js +1 -1
  161. package/dist-es/tooltip/useTooltip.js +2 -2
  162. package/dist-es/utils/renderProps.js +28 -0
  163. package/dist-es/utils/renderProps.js.map +1 -0
  164. package/dist-es/utils/useValueEffect.js +1 -1
  165. package/dist-es/viewport/ViewportProvider.js +1 -1
  166. package/dist-types/accordion/AccordionContext.d.ts +4 -1
  167. package/dist-types/card/Card.d.ts +1 -1
  168. package/dist-types/form-field/FormField.d.ts +5 -3
  169. package/dist-types/interactable-card/InteractableCard.d.ts +1 -1
  170. package/dist-types/link-card/LinkCard.d.ts +1 -1
  171. package/dist-types/navigation-item/ExpansionIcon.d.ts +12 -2
  172. package/dist-types/navigation-item/NavigationItem.d.ts +5 -0
  173. package/dist-types/navigation-item/NavigationItemAction.d.ts +5 -0
  174. package/dist-types/overlay/OverlayContext.d.ts +3 -2
  175. package/dist-types/panel/Panel.d.ts +1 -1
  176. package/dist-types/salt-provider/SaltProvider.d.ts +25 -5
  177. package/dist-types/utils/index.d.ts +1 -0
  178. package/dist-types/utils/renderProps.d.ts +5 -0
  179. package/package.json +1 -1
  180. package/dist-cjs/navigation-item/ConditionalWrapper.js +0 -36
  181. package/dist-cjs/navigation-item/ConditionalWrapper.js.map +0 -1
  182. package/dist-es/navigation-item/ConditionalWrapper.js +0 -32
  183. package/dist-es/navigation-item/ConditionalWrapper.js.map +0 -1
  184. package/dist-types/navigation-item/ConditionalWrapper.d.ts +0 -8
@@ -6,12 +6,12 @@ var React = require('react');
6
6
  require('../aria-announcer/AriaAnnouncerContext.js');
7
7
  require('react/jsx-runtime');
8
8
  var useAriaAnnouncer = require('../aria-announcer/useAriaAnnouncer.js');
9
+ require('clsx');
9
10
  require('../utils/useFloatingUI/useFloatingUI.js');
10
11
  require('../utils/useId.js');
11
12
  var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
12
13
  require('../salt-provider/SaltProvider.js');
13
14
  require('../viewport/ViewportProvider.js');
14
- require('clsx');
15
15
  require('../accordion/AccordionGroup.js');
16
16
  require('../accordion/AccordionPanel.js');
17
17
  require('../accordion/Accordion.js');
@@ -4,18 +4,18 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var react = require('@floating-ui/react');
6
6
  var React = require('react');
7
+ require('react/jsx-runtime');
8
+ require('clsx');
7
9
  var useControlled = require('../utils/useControlled.js');
8
10
  var useFloatingUI = require('../utils/useFloatingUI/useFloatingUI.js');
9
11
  require('../utils/useId.js');
10
12
  require('../salt-provider/SaltProvider.js');
11
13
  require('../viewport/ViewportProvider.js');
12
- require('clsx');
13
14
  require('../accordion/AccordionGroup.js');
14
15
  require('../accordion/AccordionPanel.js');
15
16
  require('../accordion/Accordion.js');
16
17
  require('../accordion/AccordionHeader.js');
17
18
  require('../aria-announcer/AriaAnnouncerContext.js');
18
- require('react/jsx-runtime');
19
19
  require('../avatar/Avatar.js');
20
20
  require('../badge/Badge.js');
21
21
  require('../banner/Banner.js');
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
7
+ var mergeProps = require('./mergeProps.js');
8
+
9
+ function renderProps(Type, props) {
10
+ const { render, ...rest } = props;
11
+ if (React.isValidElement(render)) {
12
+ const renderProps2 = render.props;
13
+ return React.cloneElement(render, mergeProps.mergeProps(rest, renderProps2));
14
+ }
15
+ const restProps = rest;
16
+ if (typeof render === "function") {
17
+ const renderedElement = render(restProps);
18
+ if (React.isValidElement(renderedElement)) {
19
+ return renderedElement;
20
+ }
21
+ throw new Error("Render function did not return a valid React element");
22
+ }
23
+ if (Type) {
24
+ return /* @__PURE__ */ jsxRuntime.jsx(Type, {
25
+ ...restProps
26
+ });
27
+ }
28
+ throw new Error("Type or render should be provided");
29
+ }
30
+
31
+ exports.renderProps = renderProps;
32
+ //# sourceMappingURL=renderProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderProps.js","sources":["../src/utils/renderProps.tsx"],"sourcesContent":["import {\n type ComponentProps,\n type ElementType,\n type ReactElement,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport { mergeProps } from \"./mergeProps\";\n\nexport interface RenderPropsType {\n render?: ReactElement | ((props: any) => ReactElement);\n}\n\nexport function renderProps<Type extends ElementType>(\n Type: Type | null,\n props: RenderPropsType & ComponentProps<Type>,\n): ReactElement {\n const { render, ...rest } = props;\n // Case 1: If render is a valid React element, clone it with merged props\n if (isValidElement(render)) {\n const renderProps = render.props as ComponentProps<Type>;\n return cloneElement(render, mergeProps(rest, renderProps));\n }\n\n const restProps = rest as ComponentProps<Type>;\n\n // Case 2: If render is a function, call it with the rest of the props\n if (typeof render === \"function\") {\n const renderedElement = render(restProps);\n if (isValidElement(renderedElement)) {\n return renderedElement;\n }\n throw new Error(\"Render function did not return a valid React element\");\n }\n\n if (Type) {\n // Case 3: If render is not provided, render the Type component with the rest of the props\n return <Type {...restProps} />;\n }\n\n throw new Error(\"Type or render should be provided\");\n}\n"],"names":["isValidElement","renderProps","cloneElement","mergeProps","jsx"],"mappings":";;;;;;;;AAagB,SAAA,WAAA,CACd,MACA,KACc,EAAA;AACd,EAAM,MAAA,EAAE,MAAW,EAAA,GAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAE5B,EAAI,IAAAA,oBAAA,CAAe,MAAM,CAAG,EAAA;AAC1B,IAAA,MAAMC,eAAc,MAAO,CAAA,KAAA,CAAA;AAC3B,IAAA,OAAOC,kBAAa,CAAA,MAAA,EAAQC,qBAAW,CAAA,IAAA,EAAMF,YAAW,CAAC,CAAA,CAAA;AAAA,GAC3D;AAEA,EAAA,MAAM,SAAY,GAAA,IAAA,CAAA;AAGlB,EAAI,IAAA,OAAO,WAAW,UAAY,EAAA;AAChC,IAAM,MAAA,eAAA,GAAkB,OAAO,SAAS,CAAA,CAAA;AACxC,IAAI,IAAAD,oBAAA,CAAe,eAAe,CAAG,EAAA;AACnC,MAAO,OAAA,eAAA,CAAA;AAAA,KACT;AACA,IAAM,MAAA,IAAI,MAAM,sDAAsD,CAAA,CAAA;AAAA,GACxE;AAEA,EAAA,IAAI,IAAM,EAAA;AAER,IAAA,uBAAQI,cAAA,CAAA,IAAA,EAAA;AAAA,MAAM,GAAG,SAAA;AAAA,KAAW,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA,CAAA;AACrD;;;;"}
@@ -9,12 +9,12 @@ require('../accordion/Accordion.js');
9
9
  require('../accordion/AccordionHeader.js');
10
10
  require('../aria-announcer/AriaAnnouncerContext.js');
11
11
  require('react/jsx-runtime');
12
+ require('clsx');
12
13
  require('./useFloatingUI/useFloatingUI.js');
13
14
  require('./useId.js');
14
15
  var useIsomorphicLayoutEffect = require('./useIsomorphicLayoutEffect.js');
15
16
  require('../salt-provider/SaltProvider.js');
16
17
  require('../viewport/ViewportProvider.js');
17
- require('clsx');
18
18
  var useEventCallback = require('./useEventCallback.js');
19
19
  require('../avatar/Avatar.js');
20
20
  require('../badge/Badge.js');
@@ -4,11 +4,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var React = require('react');
7
+ require('clsx');
7
8
  require('../utils/useFloatingUI/useFloatingUI.js');
8
9
  require('../utils/useId.js');
9
10
  var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
10
11
  require('../salt-provider/SaltProvider.js');
11
- require('clsx');
12
12
  require('../accordion/AccordionGroup.js');
13
13
  require('../accordion/AccordionPanel.js');
14
14
  require('../accordion/Accordion.js');
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { useComponentCssInjection } from '@salt-ds/styles';
3
3
  import { useWindow } from '@salt-ds/window';
4
4
  import { clsx } from 'clsx';
5
- import { forwardRef } from 'react';
5
+ import { forwardRef, useState } from 'react';
6
6
  import { makePrefixer } from '../utils/makePrefixer.js';
7
7
  import { useControlled } from '../utils/useControlled.js';
8
8
  import '../utils/useFloatingUI/useFloatingUI.js';
@@ -123,6 +123,8 @@ const Accordion = forwardRef(
123
123
  ...rest
124
124
  } = props;
125
125
  const id = useId(idProp);
126
+ const [headerId, setHeaderId] = useState(`${id}-header`);
127
+ const [panelId, setPanelId] = useState(`${id}-panel`);
126
128
  const targetWindow = useWindow();
127
129
  useComponentCssInjection({
128
130
  testId: "salt-accordion",
@@ -146,7 +148,10 @@ const Accordion = forwardRef(
146
148
  expanded,
147
149
  indicatorSide,
148
150
  disabled: Boolean(disabled),
149
- id: id != null ? id : "",
151
+ headerId,
152
+ setHeaderId,
153
+ panelId,
154
+ setPanelId,
150
155
  status
151
156
  },
152
157
  children: /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.js","sources":["../src/accordion/Accordion.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type SyntheticEvent,\n forwardRef,\n} from \"react\";\nimport { makePrefixer, useControlled, useId } from \"../utils\";\nimport accordionCss from \"./Accordion.css\";\nimport { AccordionContext } from \"./AccordionContext\";\nexport interface AccordionProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onToggle\"> {\n /**\n * AccordionGroup value.\n */\n value: string;\n /**\n * Whether the accordion is expanded.\n */\n expanded?: boolean;\n /**\n * Whether the accordion is expanded by default.\n */\n defaultExpanded?: boolean;\n /**\n * Side to align the Accordion's indicator. Defaults to `left`.\n */\n indicatorSide?: \"left\" | \"right\";\n /**\n * Callback fired when the accordion is toggled.\n */\n onToggle?: (event: SyntheticEvent<HTMLButtonElement>) => void;\n /**\n * Whether the accordion is disabled.\n */\n disabled?: boolean;\n /**\n * The status of the accordion.\n */\n status?: \"error\" | \"warning\" | \"success\";\n}\n\nconst withBaseName = makePrefixer(\"saltAccordion\");\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(props, ref) {\n const {\n className,\n defaultExpanded,\n expanded: expandedProp,\n disabled,\n indicatorSide = \"left\",\n id: idProp,\n onToggle,\n status,\n value,\n ...rest\n } = props;\n\n const id = useId(idProp);\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion\",\n css: accordionCss,\n window: targetWindow,\n });\n\n const [expanded, setExpanded] = useControlled({\n controlled: expandedProp,\n default: Boolean(defaultExpanded),\n name: \"Accordion\",\n state: \"expanded\",\n });\n\n const toggle = (event: SyntheticEvent<HTMLButtonElement>) => {\n setExpanded((prev) => !prev);\n onToggle?.(event);\n };\n\n return (\n <AccordionContext.Provider\n value={{\n value,\n toggle,\n expanded,\n indicatorSide,\n disabled: Boolean(disabled),\n id: id ?? \"\",\n status,\n }}\n >\n <div\n ref={ref}\n className={clsx(\n withBaseName(),\n { [withBaseName(status ?? \"\")]: status },\n className,\n )}\n {...rest}\n />\n </AccordionContext.Provider>\n );\n },\n);\n"],"names":["Accordion","accordionCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,YAAA,GAAe,aAAa,eAAe,CAAA,CAAA;AAE1C,MAAM,SAAY,GAAA,UAAA;AAAA,EACvB,SAASA,UAAU,CAAA,KAAA,EAAO,GAAK,EAAA;AAC7B,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,QAAA;AAAA,MACA,aAAgB,GAAA,MAAA;AAAA,MAChB,EAAI,EAAA,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACG,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAM,MAAA,EAAA,GAAK,MAAM,MAAM,CAAA,CAAA;AACvB,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,aAAc,CAAA;AAAA,MAC5C,UAAY,EAAA,YAAA;AAAA,MACZ,OAAA,EAAS,QAAQ,eAAe,CAAA;AAAA,MAChC,IAAM,EAAA,WAAA;AAAA,MACN,KAAO,EAAA,UAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,CAAC,KAA6C,KAAA;AAC3D,MAAY,WAAA,CAAA,CAAC,IAAS,KAAA,CAAC,IAAI,CAAA,CAAA;AAC3B,MAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACb,CAAA;AAEA,IACE,uBAAA,GAAA,CAAC,iBAAiB,QAAjB,EAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,QACA,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,QAC1B,IAAI,EAAM,IAAA,IAAA,GAAA,EAAA,GAAA,EAAA;AAAA,QACV,MAAA;AAAA,OACF;AAAA,MAEA,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,EAAE,CAAC,YAAA,CAAa,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAE,IAAI,MAAO,EAAA;AAAA,UACvC,SAAA;AAAA,SACF;AAAA,QACC,GAAG,IAAA;AAAA,OACN,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"Accordion.js","sources":["../src/accordion/Accordion.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type SyntheticEvent,\n forwardRef,\n useState,\n} from \"react\";\nimport { makePrefixer, useControlled, useId } from \"../utils\";\nimport accordionCss from \"./Accordion.css\";\nimport { AccordionContext } from \"./AccordionContext\";\nexport interface AccordionProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onToggle\"> {\n /**\n * AccordionGroup value.\n */\n value: string;\n /**\n * Whether the accordion is expanded.\n */\n expanded?: boolean;\n /**\n * Whether the accordion is expanded by default.\n */\n defaultExpanded?: boolean;\n /**\n * Side to align the Accordion's indicator. Defaults to `left`.\n */\n indicatorSide?: \"left\" | \"right\";\n /**\n * Callback fired when the accordion is toggled.\n */\n onToggle?: (event: SyntheticEvent<HTMLButtonElement>) => void;\n /**\n * Whether the accordion is disabled.\n */\n disabled?: boolean;\n /**\n * The status of the accordion.\n */\n status?: \"error\" | \"warning\" | \"success\";\n}\n\nconst withBaseName = makePrefixer(\"saltAccordion\");\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(props, ref) {\n const {\n className,\n defaultExpanded,\n expanded: expandedProp,\n disabled,\n indicatorSide = \"left\",\n id: idProp,\n onToggle,\n status,\n value,\n ...rest\n } = props;\n\n const id = useId(idProp);\n const [headerId, setHeaderId] = useState(`${id}-header`);\n const [panelId, setPanelId] = useState(`${id}-panel`);\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion\",\n css: accordionCss,\n window: targetWindow,\n });\n\n const [expanded, setExpanded] = useControlled({\n controlled: expandedProp,\n default: Boolean(defaultExpanded),\n name: \"Accordion\",\n state: \"expanded\",\n });\n\n const toggle = (event: SyntheticEvent<HTMLButtonElement>) => {\n setExpanded((prev) => !prev);\n onToggle?.(event);\n };\n\n return (\n <AccordionContext.Provider\n value={{\n value,\n toggle,\n expanded,\n indicatorSide,\n disabled: Boolean(disabled),\n headerId,\n setHeaderId,\n panelId,\n setPanelId,\n status,\n }}\n >\n <div\n ref={ref}\n className={clsx(\n withBaseName(),\n { [withBaseName(status ?? \"\")]: status },\n className,\n )}\n {...rest}\n />\n </AccordionContext.Provider>\n );\n },\n);\n"],"names":["Accordion","accordionCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,YAAA,GAAe,aAAa,eAAe,CAAA,CAAA;AAE1C,MAAM,SAAY,GAAA,UAAA;AAAA,EACvB,SAASA,UAAU,CAAA,KAAA,EAAO,GAAK,EAAA;AAC7B,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,QAAA;AAAA,MACA,aAAgB,GAAA,MAAA;AAAA,MAChB,EAAI,EAAA,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACG,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAM,MAAA,EAAA,GAAK,MAAM,MAAM,CAAA,CAAA;AACvB,IAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAS,GAAG,EAAW,CAAA,OAAA,CAAA,CAAA,CAAA;AACvD,IAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAS,GAAG,EAAU,CAAA,MAAA,CAAA,CAAA,CAAA;AAEpD,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,aAAc,CAAA;AAAA,MAC5C,UAAY,EAAA,YAAA;AAAA,MACZ,OAAA,EAAS,QAAQ,eAAe,CAAA;AAAA,MAChC,IAAM,EAAA,WAAA;AAAA,MACN,KAAO,EAAA,UAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,CAAC,KAA6C,KAAA;AAC3D,MAAY,WAAA,CAAA,CAAC,IAAS,KAAA,CAAC,IAAI,CAAA,CAAA;AAC3B,MAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACb,CAAA;AAEA,IACE,uBAAA,GAAA,CAAC,iBAAiB,QAAjB,EAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,QACA,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,QAC1B,QAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,OACF;AAAA,MAEA,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,EAAE,CAAC,YAAA,CAAa,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAE,IAAI,MAAO,EAAA;AAAA,UACvC,SAAA;AAAA,SACF;AAAA,QACC,GAAG,IAAA;AAAA,OACN,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,16 +1,16 @@
1
1
  import { useContext } from 'react';
2
2
  import { createContext } from '../utils/createContext.js';
3
+ import 'react/jsx-runtime';
4
+ import 'clsx';
3
5
  import '../utils/useFloatingUI/useFloatingUI.js';
4
6
  import '../utils/useId.js';
5
7
  import '../salt-provider/SaltProvider.js';
6
8
  import '../viewport/ViewportProvider.js';
7
- import 'clsx';
8
9
  import './AccordionGroup.js';
9
10
  import './AccordionPanel.js';
10
11
  import './Accordion.js';
11
12
  import './AccordionHeader.js';
12
13
  import '../aria-announcer/AriaAnnouncerContext.js';
13
- import 'react/jsx-runtime';
14
14
  import '../avatar/Avatar.js';
15
15
  import '../badge/Badge.js';
16
16
  import '../banner/Banner.js';
@@ -113,7 +113,10 @@ const AccordionContext = createContext(
113
113
  toggle: () => void 0,
114
114
  disabled: false,
115
115
  indicatorSide: "left",
116
- id: ""
116
+ headerId: "",
117
+ setHeaderId: () => void 0,
118
+ panelId: "",
119
+ setPanelId: () => void 0
117
120
  }
118
121
  );
119
122
  function useAccordion() {
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionContext.js","sources":["../src/accordion/AccordionContext.ts"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport { createContext } from \"../utils\";\n\nexport interface AccordionContextValue {\n value: string;\n expanded: boolean;\n toggle: (event: SyntheticEvent<HTMLButtonElement>) => void;\n disabled: boolean;\n indicatorSide: \"left\" | \"right\";\n id: string;\n status?: \"error\" | \"warning\" | \"success\";\n}\n\nexport const AccordionContext = createContext<AccordionContextValue>(\n \"AccordionContext\",\n {\n value: \"\",\n expanded: false,\n toggle: () => undefined,\n disabled: false,\n indicatorSide: \"left\",\n id: \"\",\n },\n);\n\nexport function useAccordion() {\n return useContext(AccordionContext);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,MAAM,gBAAmB,GAAA,aAAA;AAAA,EAC9B,kBAAA;AAAA,EACA;AAAA,IACE,KAAO,EAAA,EAAA;AAAA,IACP,QAAU,EAAA,KAAA;AAAA,IACV,QAAQ,MAAM,KAAA,CAAA;AAAA,IACd,QAAU,EAAA,KAAA;AAAA,IACV,aAAe,EAAA,MAAA;AAAA,IACf,EAAI,EAAA,EAAA;AAAA,GACN;AACF,EAAA;AAEO,SAAS,YAAe,GAAA;AAC7B,EAAA,OAAO,WAAW,gBAAgB,CAAA,CAAA;AACpC;;;;"}
1
+ {"version":3,"file":"AccordionContext.js","sources":["../src/accordion/AccordionContext.ts"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport { createContext } from \"../utils\";\n\nexport interface AccordionContextValue {\n value: string;\n expanded: boolean;\n toggle: (event: SyntheticEvent<HTMLButtonElement>) => void;\n disabled: boolean;\n indicatorSide: \"left\" | \"right\";\n headerId: string;\n setHeaderId: (id: string) => void;\n panelId: string;\n setPanelId: (id: string) => void;\n status?: \"error\" | \"warning\" | \"success\";\n}\n\nexport const AccordionContext = createContext<AccordionContextValue>(\n \"AccordionContext\",\n {\n value: \"\",\n expanded: false,\n toggle: () => undefined,\n disabled: false,\n indicatorSide: \"left\",\n headerId: \"\",\n setHeaderId: () => undefined,\n panelId: \"\",\n setPanelId: () => undefined,\n },\n);\n\nexport function useAccordion() {\n return useContext(AccordionContext);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBO,MAAM,gBAAmB,GAAA,aAAA;AAAA,EAC9B,kBAAA;AAAA,EACA;AAAA,IACE,KAAO,EAAA,EAAA;AAAA,IACP,QAAU,EAAA,KAAA;AAAA,IACV,QAAQ,MAAM,KAAA,CAAA;AAAA,IACd,QAAU,EAAA,KAAA;AAAA,IACV,aAAe,EAAA,MAAA;AAAA,IACf,QAAU,EAAA,EAAA;AAAA,IACV,aAAa,MAAM,KAAA,CAAA;AAAA,IACnB,OAAS,EAAA,EAAA;AAAA,IACT,YAAY,MAAM,KAAA,CAAA;AAAA,GACpB;AACF,EAAA;AAEO,SAAS,YAAe,GAAA;AAC7B,EAAA,OAAO,WAAW,gBAAgB,CAAA,CAAA;AACpC;;;;"}
@@ -8,6 +8,7 @@ import { StatusIndicator } from '../status-indicator/StatusIndicator.js';
8
8
  import { makePrefixer } from '../utils/makePrefixer.js';
9
9
  import '../utils/useFloatingUI/useFloatingUI.js';
10
10
  import '../utils/useId.js';
11
+ import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
11
12
  import '../salt-provider/SaltProvider.js';
12
13
  import '../viewport/ViewportProvider.js';
13
14
  import './AccordionGroup.js';
@@ -120,8 +121,18 @@ function ExpansionIcon({ expanded }) {
120
121
  });
121
122
  }
122
123
  const AccordionHeader = forwardRef(function AccordionHeader2(props, ref) {
123
- const { children, className, onClick, ...rest } = props;
124
- const { value, expanded, toggle, indicatorSide, disabled, id, status } = useAccordion();
124
+ const { children, className, onClick, id, ...rest } = props;
125
+ const {
126
+ value,
127
+ expanded,
128
+ toggle,
129
+ indicatorSide,
130
+ disabled,
131
+ headerId,
132
+ panelId,
133
+ setHeaderId,
134
+ status
135
+ } = useAccordion();
125
136
  const targetWindow = useWindow();
126
137
  useComponentCssInjection({
127
138
  testId: "salt-accordion-header",
@@ -132,6 +143,11 @@ const AccordionHeader = forwardRef(function AccordionHeader2(props, ref) {
132
143
  toggle(event);
133
144
  onClick == null ? void 0 : onClick(event);
134
145
  };
146
+ useIsomorphicLayoutEffect(() => {
147
+ if (id) {
148
+ setHeaderId(id);
149
+ }
150
+ }, [id]);
135
151
  return /* @__PURE__ */ jsxs("button", {
136
152
  ref,
137
153
  className: clsx(
@@ -142,8 +158,8 @@ const AccordionHeader = forwardRef(function AccordionHeader2(props, ref) {
142
158
  disabled,
143
159
  onClick: handleClick,
144
160
  "aria-expanded": expanded,
145
- id: `${id}-header`,
146
- "aria-controls": `${id}-panel`,
161
+ id: headerId,
162
+ "aria-controls": panelId,
147
163
  value,
148
164
  type: "button",
149
165
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionHeader.js","sources":["../src/accordion/AccordionHeader.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ReactNode,\n forwardRef,\n} from \"react\";\nimport { StatusIndicator } from \"../status-indicator\";\n\nimport { makePrefixer } from \"../utils\";\n\nimport { useAccordion } from \"./AccordionContext\";\nimport accordionHeaderCss from \"./AccordionHeader.css\";\n\nexport interface AccordionHeaderProps\n extends ComponentPropsWithoutRef<\"button\"> {\n /**\n * The content of the Accordion Header\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAccordionHeader\");\n\nfunction ExpansionIcon({ expanded }: { expanded: boolean }) {\n if (expanded) {\n return <ChevronUpIcon aria-hidden className={withBaseName(\"icon\")} />;\n }\n\n return <ChevronDownIcon aria-hidden className={withBaseName(\"icon\")} />;\n}\n\nexport const AccordionHeader = forwardRef<\n HTMLButtonElement,\n AccordionHeaderProps\n>(function AccordionHeader(props, ref) {\n const { children, className, onClick, ...rest } = props;\n const { value, expanded, toggle, indicatorSide, disabled, id, status } =\n useAccordion();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion-header\",\n css: accordionHeaderCss,\n window: targetWindow,\n });\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n toggle(event);\n onClick?.(event);\n };\n\n return (\n <button\n ref={ref}\n className={clsx(\n withBaseName(),\n { [withBaseName(status ?? \"\")]: status },\n className,\n )}\n disabled={disabled}\n onClick={handleClick}\n aria-expanded={expanded}\n id={`${id}-header`}\n aria-controls={`${id}-panel`}\n value={value}\n type=\"button\"\n {...rest}\n >\n {indicatorSide === \"left\" && <ExpansionIcon expanded={expanded} />}\n <span className={withBaseName(\"content\")}>{children}</span>\n {status && (\n <StatusIndicator\n className={withBaseName(\"statusIndicator\")}\n status={status}\n />\n )}\n {indicatorSide === \"right\" && <ExpansionIcon expanded={expanded} />}\n </button>\n );\n});\n"],"names":["AccordionHeader","accordionHeaderCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA,CAAA;AAEvD,SAAS,aAAA,CAAc,EAAE,QAAA,EAAmC,EAAA;AAC1D,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,uBAAQ,GAAA,CAAA,aAAA,EAAA;AAAA,MAAc,aAAW,EAAA,IAAA;AAAA,MAAC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,KAAG,CAAA,CAAA;AAAA,GACrE;AAEA,EAAA,uBAAQ,GAAA,CAAA,eAAA,EAAA;AAAA,IAAgB,aAAW,EAAA,IAAA;AAAA,IAAC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,GAAG,CAAA,CAAA;AACvE,CAAA;AAEO,MAAM,eAAkB,GAAA,UAAA,CAG7B,SAASA,gBAAAA,CAAgB,OAAO,GAAK,EAAA;AACrC,EAAA,MAAM,EAAE,QAAA,EAAU,SAAW,EAAA,OAAA,EAAA,GAAY,MAAS,GAAA,KAAA,CAAA;AAClD,EAAM,MAAA,EAAE,OAAO,QAAU,EAAA,MAAA,EAAQ,eAAe,QAAU,EAAA,EAAA,EAAI,MAAO,EAAA,GACnE,YAAa,EAAA,CAAA;AAEf,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,uBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAA,uBACG,IAAA,CAAA,QAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,EAAE,CAAC,YAAA,CAAa,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAE,IAAI,MAAO,EAAA;AAAA,MACvC,SAAA;AAAA,KACF;AAAA,IACA,QAAA;AAAA,IACA,OAAS,EAAA,WAAA;AAAA,IACT,eAAe,EAAA,QAAA;AAAA,IACf,IAAI,CAAG,EAAA,EAAA,CAAA,OAAA,CAAA;AAAA,IACP,iBAAe,CAAG,EAAA,EAAA,CAAA,MAAA,CAAA;AAAA,IAClB,KAAA;AAAA,IACA,IAAK,EAAA,QAAA;AAAA,IACJ,GAAG,IAAA;AAAA,IAEH,QAAA,EAAA;AAAA,MAAA,aAAA,KAAkB,0BAAW,GAAA,CAAA,aAAA,EAAA;AAAA,QAAc,QAAA;AAAA,OAAoB,CAAA;AAAA,sBAC/D,GAAA,CAAA,MAAA,EAAA;AAAA,QAAK,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,QAAI,QAAA;AAAA,OAAS,CAAA;AAAA,MACnD,0BACE,GAAA,CAAA,eAAA,EAAA;AAAA,QACC,SAAA,EAAW,aAAa,iBAAiB,CAAA;AAAA,QACzC,MAAA;AAAA,OACF,CAAA;AAAA,MAED,aAAA,KAAkB,2BAAY,GAAA,CAAA,aAAA,EAAA;AAAA,QAAc,QAAA;AAAA,OAAoB,CAAA;AAAA,KAAA;AAAA,GACnE,CAAA,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"AccordionHeader.js","sources":["../src/accordion/AccordionHeader.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ReactNode,\n forwardRef,\n} from \"react\";\nimport { StatusIndicator } from \"../status-indicator\";\n\nimport { makePrefixer, useIsomorphicLayoutEffect } from \"../utils\";\n\nimport { useAccordion } from \"./AccordionContext\";\nimport accordionHeaderCss from \"./AccordionHeader.css\";\n\nexport interface AccordionHeaderProps\n extends ComponentPropsWithoutRef<\"button\"> {\n /**\n * The content of the Accordion Header\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAccordionHeader\");\n\nfunction ExpansionIcon({ expanded }: { expanded: boolean }) {\n if (expanded) {\n return <ChevronUpIcon aria-hidden className={withBaseName(\"icon\")} />;\n }\n\n return <ChevronDownIcon aria-hidden className={withBaseName(\"icon\")} />;\n}\n\nexport const AccordionHeader = forwardRef<\n HTMLButtonElement,\n AccordionHeaderProps\n>(function AccordionHeader(props, ref) {\n const { children, className, onClick, id, ...rest } = props;\n const {\n value,\n expanded,\n toggle,\n indicatorSide,\n disabled,\n headerId,\n panelId,\n setHeaderId,\n status,\n } = useAccordion();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion-header\",\n css: accordionHeaderCss,\n window: targetWindow,\n });\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n toggle(event);\n onClick?.(event);\n };\n\n useIsomorphicLayoutEffect(() => {\n if (id) {\n setHeaderId(id);\n }\n }, [id]);\n\n return (\n <button\n ref={ref}\n className={clsx(\n withBaseName(),\n { [withBaseName(status ?? \"\")]: status },\n className,\n )}\n disabled={disabled}\n onClick={handleClick}\n aria-expanded={expanded}\n id={headerId}\n aria-controls={panelId}\n value={value}\n type=\"button\"\n {...rest}\n >\n {indicatorSide === \"left\" && <ExpansionIcon expanded={expanded} />}\n <span className={withBaseName(\"content\")}>{children}</span>\n {status && (\n <StatusIndicator\n className={withBaseName(\"statusIndicator\")}\n status={status}\n />\n )}\n {indicatorSide === \"right\" && <ExpansionIcon expanded={expanded} />}\n </button>\n );\n});\n"],"names":["AccordionHeader","accordionHeaderCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA,CAAA;AAEvD,SAAS,aAAA,CAAc,EAAE,QAAA,EAAmC,EAAA;AAC1D,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,uBAAQ,GAAA,CAAA,aAAA,EAAA;AAAA,MAAc,aAAW,EAAA,IAAA;AAAA,MAAC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,KAAG,CAAA,CAAA;AAAA,GACrE;AAEA,EAAA,uBAAQ,GAAA,CAAA,eAAA,EAAA;AAAA,IAAgB,aAAW,EAAA,IAAA;AAAA,IAAC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,GAAG,CAAA,CAAA;AACvE,CAAA;AAEO,MAAM,eAAkB,GAAA,UAAA,CAG7B,SAASA,gBAAAA,CAAgB,OAAO,GAAK,EAAA;AACrC,EAAA,MAAM,EAAE,QAAU,EAAA,SAAA,EAAW,OAAS,EAAA,EAAA,EAAA,GAAO,MAAS,GAAA,KAAA,CAAA;AACtD,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,MACE,YAAa,EAAA,CAAA;AAEjB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,uBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,WAAA,CAAY,EAAE,CAAA,CAAA;AAAA,KAChB;AAAA,GACF,EAAG,CAAC,EAAE,CAAC,CAAA,CAAA;AAEP,EAAA,uBACG,IAAA,CAAA,QAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,EAAE,CAAC,YAAA,CAAa,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAE,IAAI,MAAO,EAAA;AAAA,MACvC,SAAA;AAAA,KACF;AAAA,IACA,QAAA;AAAA,IACA,OAAS,EAAA,WAAA;AAAA,IACT,eAAe,EAAA,QAAA;AAAA,IACf,EAAI,EAAA,QAAA;AAAA,IACJ,eAAe,EAAA,OAAA;AAAA,IACf,KAAA;AAAA,IACA,IAAK,EAAA,QAAA;AAAA,IACJ,GAAG,IAAA;AAAA,IAEH,QAAA,EAAA;AAAA,MAAA,aAAA,KAAkB,0BAAW,GAAA,CAAA,aAAA,EAAA;AAAA,QAAc,QAAA;AAAA,OAAoB,CAAA;AAAA,sBAC/D,GAAA,CAAA,MAAA,EAAA;AAAA,QAAK,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,QAAI,QAAA;AAAA,OAAS,CAAA;AAAA,MACnD,0BACE,GAAA,CAAA,eAAA,EAAA;AAAA,QACC,SAAA,EAAW,aAAa,iBAAiB,CAAA;AAAA,QACzC,MAAA;AAAA,OACF,CAAA;AAAA,MAED,aAAA,KAAkB,2BAAY,GAAA,CAAA,aAAA,EAAA;AAAA,QAAc,QAAA;AAAA,OAAoB,CAAA;AAAA,KAAA;AAAA,GACnE,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltAccordionPanel {\n display: grid;\n transition: grid-template-rows var(--salt-duration-perceptible) ease-in-out, opacity var(--salt-duration-perceptible) ease-in-out, visibility var(--salt-duration-perceptible) ease-in-out;\n}\n\n.saltAccordionPanel[aria-hidden=\"true\"] {\n grid-template-rows: 0fr;\n opacity: 0;\n visibility: hidden;\n}\n\n.saltAccordionPanel {\n grid-template-rows: 1fr;\n opacity: 1;\n visibility: visible;\n}\n\n.saltAccordionPanel-inner {\n overflow: hidden;\n}\n\n.saltAccordionPanel-content {\n padding-left: var(--salt-spacing-100);\n padding-right: var(--salt-spacing-100);\n padding-top: var(--salt-spacing-300);\n padding-bottom: var(--salt-spacing-300);\n}\n\n.saltAccordionPanel-indentedContent {\n padding-left: calc(var(--salt-spacing-200) + var(--salt-size-icon));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .saltAccordionPanel {\n transition: none;\n }\n}\n";
1
+ var css_248z = ".saltAccordionPanel {\n display: grid;\n transition: grid-template-rows var(--salt-duration-perceptible) ease-in-out, opacity var(--salt-duration-perceptible) ease-in-out, visibility var(--salt-duration-perceptible) ease-in-out;\n}\n\n.saltAccordionPanel[aria-hidden=\"true\"] {\n grid-template-rows: 0fr;\n opacity: 0;\n visibility: hidden;\n}\n\n.saltAccordionPanel {\n grid-template-rows: 1fr;\n opacity: 1;\n visibility: visible;\n}\n\n.saltAccordionPanel-inner {\n overflow: hidden;\n}\n\n.saltAccordionPanel-content {\n padding-left: var(--salt-spacing-100);\n padding-right: var(--salt-spacing-100);\n padding-top: var(--salt-spacing-100);\n padding-bottom: var(--salt-spacing-150);\n}\n\n.saltAccordionPanel-indentedContent {\n padding-left: calc(var(--salt-spacing-200) + var(--salt-size-icon));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .saltAccordionPanel {\n transition: none;\n }\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=AccordionPanel.css.js.map
@@ -6,6 +6,7 @@ import { forwardRef } from 'react';
6
6
  import { makePrefixer } from '../utils/makePrefixer.js';
7
7
  import '../utils/useFloatingUI/useFloatingUI.js';
8
8
  import '../utils/useId.js';
9
+ import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
9
10
  import '../salt-provider/SaltProvider.js';
10
11
  import '../viewport/ViewportProvider.js';
11
12
  import './AccordionGroup.js';
@@ -109,20 +110,25 @@ import css_248z from './AccordionPanel.css.js';
109
110
  const withBaseName = makePrefixer("saltAccordionPanel");
110
111
  const AccordionPanel = forwardRef(
111
112
  function AccordionPanel2(props, ref) {
112
- const { children, className, ...rest } = props;
113
+ const { children, className, id, ...rest } = props;
113
114
  const targetWindow = useWindow();
114
115
  useComponentCssInjection({
115
116
  testId: "salt-accordion-panel",
116
117
  css: css_248z,
117
118
  window: targetWindow
118
119
  });
119
- const { id, expanded, indicatorSide } = useAccordion();
120
+ const { headerId, panelId, setPanelId, expanded, indicatorSide } = useAccordion();
121
+ useIsomorphicLayoutEffect(() => {
122
+ if (id) {
123
+ setPanelId(id);
124
+ }
125
+ }, [id]);
120
126
  return /* @__PURE__ */ jsx("div", {
121
127
  ref,
122
128
  className: clsx(withBaseName(), className),
123
129
  role: "region",
124
- id: `${id}-panel`,
125
- "aria-labelledby": `${id}-header`,
130
+ id: panelId,
131
+ "aria-labelledby": headerId,
126
132
  "aria-hidden": !expanded ? "true" : void 0,
127
133
  hidden: !expanded,
128
134
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionPanel.js","sources":["../src/accordion/AccordionPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactNode,\n forwardRef,\n} from \"react\";\n\nimport { makePrefixer } from \"../utils\";\nimport { useAccordion } from \"./AccordionContext\";\nimport accordionPanelCss from \"./AccordionPanel.css\";\n\nexport interface AccordionPanelProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The content of the Accordion Panel\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAccordionPanel\");\n\nexport const AccordionPanel = forwardRef<HTMLDivElement, AccordionPanelProps>(\n function AccordionPanel(props, ref) {\n const { children, className, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion-panel\",\n css: accordionPanelCss,\n window: targetWindow,\n });\n\n const { id, expanded, indicatorSide } = useAccordion();\n\n return (\n <div\n ref={ref}\n className={clsx(withBaseName(), className)}\n role=\"region\"\n id={`${id}-panel`}\n aria-labelledby={`${id}-header`}\n aria-hidden={!expanded ? \"true\" : undefined}\n hidden={!expanded}\n {...rest}\n >\n <div className={withBaseName(\"inner\")}>\n <div\n className={clsx(withBaseName(\"content\"), {\n [withBaseName(\"indentedContent\")]: indicatorSide === \"left\",\n })}\n >\n {children}\n </div>\n </div>\n </div>\n );\n },\n);\n"],"names":["AccordionPanel","accordionPanelCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA,CAAA;AAE/C,MAAM,cAAiB,GAAA,UAAA;AAAA,EAC5B,SAASA,eAAe,CAAA,KAAA,EAAO,GAAK,EAAA;AAClC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAc,EAAA,GAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAEzC,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,sBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,EAAE,EAAA,EAAI,QAAU,EAAA,aAAA,KAAkB,YAAa,EAAA,CAAA;AAErD,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,IAAK,EAAA,QAAA;AAAA,MACL,IAAI,CAAG,EAAA,EAAA,CAAA,MAAA,CAAA;AAAA,MACP,mBAAiB,CAAG,EAAA,EAAA,CAAA,OAAA,CAAA;AAAA,MACpB,aAAA,EAAa,CAAC,QAAA,GAAW,MAAS,GAAA,KAAA,CAAA;AAAA,MAClC,QAAQ,CAAC,QAAA;AAAA,MACR,GAAG,IAAA;AAAA,MAEJ,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,QAAI,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,QAClC,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,UACC,SAAW,EAAA,IAAA,CAAK,YAAa,CAAA,SAAS,CAAG,EAAA;AAAA,YACvC,CAAC,YAAA,CAAa,iBAAiB,CAAA,GAAI,aAAkB,KAAA,MAAA;AAAA,WACtD,CAAA;AAAA,UAEA,QAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"AccordionPanel.js","sources":["../src/accordion/AccordionPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactNode,\n forwardRef,\n} from \"react\";\n\nimport { makePrefixer, useIsomorphicLayoutEffect } from \"../utils\";\nimport { useAccordion } from \"./AccordionContext\";\nimport accordionPanelCss from \"./AccordionPanel.css\";\n\nexport interface AccordionPanelProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The content of the Accordion Panel\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAccordionPanel\");\n\nexport const AccordionPanel = forwardRef<HTMLDivElement, AccordionPanelProps>(\n function AccordionPanel(props, ref) {\n const { children, className, id, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-accordion-panel\",\n css: accordionPanelCss,\n window: targetWindow,\n });\n\n const { headerId, panelId, setPanelId, expanded, indicatorSide } =\n useAccordion();\n\n useIsomorphicLayoutEffect(() => {\n if (id) {\n setPanelId(id);\n }\n }, [id]);\n\n return (\n <div\n ref={ref}\n className={clsx(withBaseName(), className)}\n role=\"region\"\n id={panelId}\n aria-labelledby={headerId}\n aria-hidden={!expanded ? \"true\" : undefined}\n hidden={!expanded}\n {...rest}\n >\n <div className={withBaseName(\"inner\")}>\n <div\n className={clsx(withBaseName(\"content\"), {\n [withBaseName(\"indentedContent\")]: indicatorSide === \"left\",\n })}\n >\n {children}\n </div>\n </div>\n </div>\n );\n },\n);\n"],"names":["AccordionPanel","accordionPanelCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA,CAAA;AAE/C,MAAM,cAAiB,GAAA,UAAA;AAAA,EAC5B,SAASA,eAAe,CAAA,KAAA,EAAO,GAAK,EAAA;AAClC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAW,EAAA,EAAA,EAAA,GAAO,MAAS,GAAA,KAAA,CAAA;AAE7C,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,sBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,EAAE,QAAU,EAAA,OAAA,EAAS,YAAY,QAAU,EAAA,aAAA,KAC/C,YAAa,EAAA,CAAA;AAEf,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,UAAA,CAAW,EAAE,CAAA,CAAA;AAAA,OACf;AAAA,KACF,EAAG,CAAC,EAAE,CAAC,CAAA,CAAA;AAEP,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,IAAK,EAAA,QAAA;AAAA,MACL,EAAI,EAAA,OAAA;AAAA,MACJ,iBAAiB,EAAA,QAAA;AAAA,MACjB,aAAA,EAAa,CAAC,QAAA,GAAW,MAAS,GAAA,KAAA,CAAA;AAAA,MAClC,QAAQ,CAAC,QAAA;AAAA,MACR,GAAG,IAAA;AAAA,MAEJ,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,QAAI,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,QAClC,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,UACC,SAAW,EAAA,IAAA,CAAK,YAAa,CAAA,SAAS,CAAG,EAAA;AAAA,YACvC,CAAC,YAAA,CAAa,iBAAiB,CAAA,GAAI,aAAkB,KAAA,MAAA;AAAA,WACtD,CAAA;AAAA,UAEA,QAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,16 +1,16 @@
1
1
  import { useContext, useRef, useCallback, useMemo, useEffect } from 'react';
2
2
  import { debounce } from '../utils/debounce.js';
3
+ import 'react/jsx-runtime';
4
+ import 'clsx';
3
5
  import '../utils/useFloatingUI/useFloatingUI.js';
4
6
  import '../utils/useId.js';
5
7
  import '../salt-provider/SaltProvider.js';
6
8
  import '../viewport/ViewportProvider.js';
7
- import 'clsx';
8
9
  import '../accordion/AccordionGroup.js';
9
10
  import '../accordion/AccordionPanel.js';
10
11
  import '../accordion/Accordion.js';
11
12
  import '../accordion/AccordionHeader.js';
12
13
  import { AriaAnnouncerContext } from './AriaAnnouncerContext.js';
13
- import 'react/jsx-runtime';
14
14
  import '../avatar/Avatar.js';
15
15
  import '../badge/Badge.js';
16
16
  import '../banner/Banner.js';
@@ -1,16 +1,16 @@
1
1
  import { useState, useEffect } from 'react';
2
+ import 'react/jsx-runtime';
3
+ import 'clsx';
2
4
  import '../utils/useFloatingUI/useFloatingUI.js';
3
5
  import '../utils/useId.js';
4
6
  import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
5
7
  import '../salt-provider/SaltProvider.js';
6
8
  import '../viewport/ViewportProvider.js';
7
- import 'clsx';
8
9
  import '../accordion/AccordionGroup.js';
9
10
  import '../accordion/AccordionPanel.js';
10
11
  import '../accordion/Accordion.js';
11
12
  import '../accordion/AccordionHeader.js';
12
13
  import '../aria-announcer/AriaAnnouncerContext.js';
13
- import 'react/jsx-runtime';
14
14
  import './Avatar.js';
15
15
  import '../badge/Badge.js';
16
16
  import '../banner/Banner.js';
@@ -1,12 +1,12 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useContext, useState } from 'react';
3
3
  import { createContext } from '../utils/createContext.js';
4
+ import 'clsx';
4
5
  import '../utils/useFloatingUI/useFloatingUI.js';
5
6
  import '../utils/useId.js';
6
7
  import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
7
8
  import '../salt-provider/SaltProvider.js';
8
9
  import '../viewport/ViewportProvider.js';
9
- import 'clsx';
10
10
  import '../accordion/AccordionGroup.js';
11
11
  import '../accordion/AccordionPanel.js';
12
12
  import '../accordion/Accordion.js';
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Styles applied to the root element */\n.saltCard {\n border-width: var(--saltCard-borderWidth, var(--salt-size-border));\n border-style: var(--salt-container-borderStyle);\n padding: var(--saltCard-padding, var(--salt-spacing-200));\n position: relative;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n box-sizing: border-box;\n border-radius: var(--saltCard-borderRadius, var(--salt-palette-corner, 0));\n}\n\n.saltCard-primary {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n border-color: var(--salt-container-primary-borderColor);\n --card-accent-color: var(--salt-container-primary-borderColor);\n}\n\n.saltCard-secondary {\n background: var(--saltCard-background, var(--salt-container-secondary-background));\n border-color: var(--salt-container-secondary-borderColor);\n --card-accent-color: var(--salt-container-secondary-borderColor);\n}\n\n/* Styles applied to create accent */\n.saltCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltCard-accent-color, var(--card-accent-color));\n}\n\n/* Styles applied to Card if `accent=\"bottom\"` (default) */\n.saltCard-accentBottom::after {\n left: calc(-1 * var(--salt-size-border));\n bottom: calc(-1 * var(--salt-size-border));\n height: var(--salt-size-bar);\n width: calc(100% + calc(2 * var(--salt-size-border)));\n}\n\n/* Styles applied to Card if `accent=\"left\"` */\n.saltCard-accentLeft::after {\n left: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: calc(100% + calc(2 * var(--salt-size-border)));\n width: var(--salt-size-bar);\n}\n\n/* Styles applied to Card if `accent=\"top\"` */\n.saltCard-accentTop::after {\n left: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: var(--salt-size-bar);\n width: calc(100% + calc(2 * var(--salt-size-border)));\n}\n\n/* Styles applied to Card if `accent=\"right\"` */\n.saltCard-accentRight::after {\n right: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: calc(100% + calc(2 * var(--salt-size-border)));\n width: var(--salt-size-bar);\n}\n\n/*\n * **Deprecated:** The following styles are deprecated\n * Use Interactable Card component instead\n * for interactable styling\n */\n\n/* **Deprecated:** Styles applied if `interactable={true}` */\n.saltCard-interactable {\n display: block;\n transition: none;\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` */\na:focus .saltCard-interactable,\n.saltCard-interactable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n cursor: var(--saltCard-cursor-hover, var(--salt-selectable-cursor-hover));\n position: relative;\n}\n\n/* **Deprecated:** Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n box-shadow: var(--saltCard-boxShadow-active, var(--salt-overlayable-shadow-hover));\n outline: var(--salt-focused-outline);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` and `disabled={true}` */\na:focus .saltCard-interactable.saltCard-disabled,\n.saltCard-interactable.saltCard-disabled:hover,\n.saltCard-interactable.saltCard-disabled:active {\n box-shadow: var(--saltCard-boxShadow-disabled, var(--salt-overlayable-shadow));\n}\n\n/* **Deprecated:** Styles applied if `disabled={true}` */\n.saltCard-disabled,\n.saltCard-disabled.saltCard-interactable,\na:focus .saltCard-interactable.saltCard-disabled {\n border-color: var(--salt-container-primary-borderColor-disabled);\n color: var(--saltCard-color-disabled, var(--salt-content-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-selectable-cursor-disabled));\n outline: none;\n}\n\n/* **Deprecated:** Styles applied to nested divs if `disabled={true}` */\n.saltCard-disabled div {\n pointer-events: none;\n}\n\n/* Styles applied if `hoverable` is set */\n@media (hover: hover) {\n .saltCard-hoverable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n --card-accent-color: var(--salt-selectable-foreground-hover);\n }\n}\n";
1
+ var css_248z = "/* Styles applied to the root element */\n.saltCard {\n border-width: var(--saltCard-borderWidth, var(--salt-size-border));\n border-style: var(--salt-container-borderStyle);\n padding: var(--saltCard-padding, var(--salt-spacing-200));\n position: relative;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n box-sizing: border-box;\n border-radius: var(--saltCard-borderRadius, var(--salt-palette-corner, 0));\n}\n\n.saltCard-primary {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n border-color: var(--salt-container-primary-borderColor);\n --card-accent-color: var(--salt-container-primary-borderColor);\n}\n\n.saltCard-secondary {\n background: var(--saltCard-background, var(--salt-container-secondary-background));\n border-color: var(--salt-container-secondary-borderColor);\n --card-accent-color: var(--salt-container-secondary-borderColor);\n}\n\n.saltCard-tertiary {\n background: var(--saltCard-background, var(--salt-container-tertiary-background));\n border-color: var(--salt-container-tertiary-borderColor);\n --card-accent-color: var(--salt-container-tertiary-borderColor);\n}\n\n/* Styles applied to create accent */\n.saltCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltCard-accent-color, var(--card-accent-color));\n}\n\n/* Styles applied to Card if `accent=\"bottom\"` (default) */\n.saltCard-accentBottom::after {\n left: calc(-1 * var(--salt-size-border));\n bottom: calc(-1 * var(--salt-size-border));\n height: var(--salt-size-bar);\n width: calc(100% + calc(2 * var(--salt-size-border)));\n}\n\n/* Styles applied to Card if `accent=\"left\"` */\n.saltCard-accentLeft::after {\n left: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: calc(100% + calc(2 * var(--salt-size-border)));\n width: var(--salt-size-bar);\n}\n\n/* Styles applied to Card if `accent=\"top\"` */\n.saltCard-accentTop::after {\n left: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: var(--salt-size-bar);\n width: calc(100% + calc(2 * var(--salt-size-border)));\n}\n\n/* Styles applied to Card if `accent=\"right\"` */\n.saltCard-accentRight::after {\n right: calc(-1 * var(--salt-size-border));\n top: calc(-1 * var(--salt-size-border));\n height: calc(100% + calc(2 * var(--salt-size-border)));\n width: var(--salt-size-bar);\n}\n\n/*\n * **Deprecated:** The following styles are deprecated\n * Use Interactable Card component instead\n * for interactable styling\n */\n\n/* **Deprecated:** Styles applied if `interactable={true}` */\n.saltCard-interactable {\n display: block;\n transition: none;\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` */\na:focus .saltCard-interactable,\n.saltCard-interactable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n cursor: var(--saltCard-cursor-hover, var(--salt-selectable-cursor-hover));\n position: relative;\n}\n\n/* **Deprecated:** Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n box-shadow: var(--saltCard-boxShadow-active, var(--salt-overlayable-shadow-hover));\n outline: var(--salt-focused-outline);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` and `disabled={true}` */\na:focus .saltCard-interactable.saltCard-disabled,\n.saltCard-interactable.saltCard-disabled:hover,\n.saltCard-interactable.saltCard-disabled:active {\n box-shadow: var(--saltCard-boxShadow-disabled, var(--salt-overlayable-shadow));\n}\n\n/* **Deprecated:** Styles applied if `disabled={true}` */\n.saltCard-disabled,\n.saltCard-disabled.saltCard-interactable,\na:focus .saltCard-interactable.saltCard-disabled {\n border-color: var(--salt-container-primary-borderColor-disabled);\n color: var(--saltCard-color-disabled, var(--salt-content-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-selectable-cursor-disabled));\n outline: none;\n}\n\n/* **Deprecated:** Styles applied to nested divs if `disabled={true}` */\n.saltCard-disabled div {\n pointer-events: none;\n}\n\n/* Styles applied if `hoverable` is set */\n@media (hover: hover) {\n .saltCard-hoverable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n --card-accent-color: var(--salt-selectable-foreground-hover);\n }\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=Card.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport cardCss from \"./Card.css\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true` the card will have hover styling.\n */\n hoverable?: boolean;\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n function Card(props, ref) {\n const {\n accent,\n children,\n className,\n disabled,\n interactable,\n hoverable,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-card\",\n css: cardCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent || \"\")}`)]: accent,\n [withBaseName(\"hoverable\")]: hoverable,\n /* **Deprecated:** InteractableCard should be used instead for these features */\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["Card","cardCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA,CAAA;AA6BrC,MAAM,IAAO,GAAA,UAAA;AAAA,EAClB,SAASA,KAAK,CAAA,KAAA,EAAO,GAAK,EAAA;AACxB,IAAM,MAAA;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAU,GAAA,SAAA;AAAA,MACP,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,WAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb,aAAa,OAAO,CAAA;AAAA,QACpB;AAAA,UACE,CAAC,YAAa,CAAA,QAAQ,CAAI,GAAA,MAAA;AAAA,UAC1B,CAAC,YAAa,CAAA,CAAA,MAAA,EAAS,WAAW,MAAU,IAAA,EAAE,GAAG,CAAI,GAAA,MAAA;AAAA,UACrD,CAAC,YAAa,CAAA,WAAW,CAAI,GAAA,SAAA;AAAA,UAE7B,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,UAC5B,CAAC,YAAa,CAAA,cAAc,CAAI,GAAA,YAAA;AAAA,SAClC;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport cardCss from \"./Card.css\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true` the card will have hover styling.\n */\n hoverable?: boolean;\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n function Card(props, ref) {\n const {\n accent,\n children,\n className,\n disabled,\n interactable,\n hoverable,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-card\",\n css: cardCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent || \"\")}`)]: accent,\n [withBaseName(\"hoverable\")]: hoverable,\n /* **Deprecated:** InteractableCard should be used instead for these features */\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["Card","cardCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA,CAAA;AA6BrC,MAAM,IAAO,GAAA,UAAA;AAAA,EAClB,SAASA,KAAK,CAAA,KAAA,EAAO,GAAK,EAAA;AACxB,IAAM,MAAA;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAU,GAAA,SAAA;AAAA,MACP,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,WAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb,aAAa,OAAO,CAAA;AAAA,QACpB;AAAA,UACE,CAAC,YAAa,CAAA,QAAQ,CAAI,GAAA,MAAA;AAAA,UAC1B,CAAC,YAAa,CAAA,CAAA,MAAA,EAAS,WAAW,MAAU,IAAA,EAAE,GAAG,CAAI,GAAA,MAAA;AAAA,UACrD,CAAC,YAAa,CAAA,WAAW,CAAI,GAAA,SAAA;AAAA,UAE7B,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,UAC5B,CAAC,YAAa,CAAA,cAAc,CAAI,GAAA,YAAA;AAAA,SAClC;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,16 +1,16 @@
1
1
  import { createContext } from '../../utils/createContext.js';
2
+ import 'react/jsx-runtime';
2
3
  import 'react';
4
+ import 'clsx';
3
5
  import '../../utils/useFloatingUI/useFloatingUI.js';
4
6
  import '../../utils/useId.js';
5
7
  import '../../salt-provider/SaltProvider.js';
6
8
  import '../../viewport/ViewportProvider.js';
7
- import 'clsx';
8
9
  import '../../accordion/AccordionGroup.js';
9
10
  import '../../accordion/AccordionPanel.js';
10
11
  import '../../accordion/Accordion.js';
11
12
  import '../../accordion/AccordionHeader.js';
12
13
  import '../../aria-announcer/AriaAnnouncerContext.js';
13
- import 'react/jsx-runtime';
14
14
  import '../../avatar/Avatar.js';
15
15
  import '../../badge/Badge.js';
16
16
  import '../../banner/Banner.js';
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { size, flip, useInteractions, useDismiss, useFocus, useClick } from '@floating-ui/react';
2
+ import { offset, size, flip, useInteractions, useDismiss, useFocus, useClick } from '@floating-ui/react';
3
3
  import { ChevronUpIcon, ChevronDownIcon } from '@salt-ds/icons';
4
4
  import { useComponentCssInjection } from '@salt-ds/styles';
5
5
  import { useWindow } from '@salt-ds/window';
@@ -211,12 +211,14 @@ const ComboBox = forwardRef(function ComboBox2(props, ref) {
211
211
  (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
212
212
  }
213
213
  };
214
+ const hasValidChildren = Children.toArray(children).filter(Boolean).length > 0;
214
215
  const { x, y, strategy, elements, floating, reference, context } = useFloatingUI({
215
- open: openState && !readOnly && Children.count(children) > 0,
216
+ open: openState && !readOnly && hasValidChildren,
216
217
  onOpenChange: handleOpenChange,
217
218
  placement: "bottom-start",
218
219
  strategy: "fixed",
219
220
  middleware: [
221
+ offset(1),
220
222
  size({
221
223
  apply({ rects, elements: elements2, availableHeight }) {
222
224
  Object.assign(elements2.floating.style, {
@@ -397,7 +399,7 @@ const ComboBox = forwardRef(function ComboBox2(props, ref) {
397
399
  endAdornment: /* @__PURE__ */ jsxs(Fragment, {
398
400
  children: [
399
401
  endAdornment,
400
- !readOnly ? /* @__PURE__ */ jsx(Button, {
402
+ !readOnly && hasValidChildren ? /* @__PURE__ */ jsx(Button, {
401
403
  "aria-labelledby": clsx(buttonId, formFieldLabelledBy),
402
404
  "aria-label": "Show options",
403
405
  "aria-expanded": openState,
@@ -446,7 +448,7 @@ const ComboBox = forwardRef(function ComboBox2(props, ref) {
446
448
  emptyReadOnlyMarker: readOnly && selectedState.length > 0 ? "" : void 0
447
449
  }),
448
450
  /* @__PURE__ */ jsx(OptionList, {
449
- open: (openState || focusedState) && !readOnly && Children.count(children) > 0,
451
+ open: (openState || focusedState) && !readOnly && hasValidChildren,
450
452
  collapsed: !openState,
451
453
  ref: handleListRef,
452
454
  id: listId,