@salt-ds/core 1.68.0 → 1.70.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 (207) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/css/salt-core.css +336 -38
  3. package/dist-cjs/avatar/Avatar.css.js +1 -1
  4. package/dist-cjs/avatar/Avatar.js +7 -4
  5. package/dist-cjs/avatar/Avatar.js.map +1 -1
  6. package/dist-cjs/breadcrumbs/Breadcrumb.css.js +6 -0
  7. package/dist-cjs/breadcrumbs/Breadcrumb.css.js.map +1 -0
  8. package/dist-cjs/breadcrumbs/Breadcrumb.js +104 -0
  9. package/dist-cjs/breadcrumbs/Breadcrumb.js.map +1 -0
  10. package/dist-cjs/breadcrumbs/BreadcrumbLabel.js +25 -0
  11. package/dist-cjs/breadcrumbs/BreadcrumbLabel.js.map +1 -0
  12. package/dist-cjs/breadcrumbs/BreadcrumbTrigger.js +52 -0
  13. package/dist-cjs/breadcrumbs/BreadcrumbTrigger.js.map +1 -0
  14. package/dist-cjs/breadcrumbs/Breadcrumbs.css.js +6 -0
  15. package/dist-cjs/breadcrumbs/Breadcrumbs.css.js.map +1 -0
  16. package/dist-cjs/breadcrumbs/Breadcrumbs.js +151 -0
  17. package/dist-cjs/breadcrumbs/Breadcrumbs.js.map +1 -0
  18. package/dist-cjs/breadcrumbs/internal/BreadcrumbContext.js +12 -0
  19. package/dist-cjs/breadcrumbs/internal/BreadcrumbContext.js.map +1 -0
  20. package/dist-cjs/breadcrumbs/internal/BreadcrumbOverflowDisclosure.js +243 -0
  21. package/dist-cjs/breadcrumbs/internal/BreadcrumbOverflowDisclosure.js.map +1 -0
  22. package/dist-cjs/breadcrumbs/internal/breadcrumbItems.js +21 -0
  23. package/dist-cjs/breadcrumbs/internal/breadcrumbItems.js.map +1 -0
  24. package/dist-cjs/card/Card.css.js +1 -1
  25. package/dist-cjs/card/Card.js +4 -1
  26. package/dist-cjs/card/Card.js.map +1 -1
  27. package/dist-cjs/card/CardContent.css.js +6 -0
  28. package/dist-cjs/card/CardContent.css.js.map +1 -0
  29. package/dist-cjs/card/CardContent.js +30 -0
  30. package/dist-cjs/card/CardContent.js.map +1 -0
  31. package/dist-cjs/card/CardFooter.css.js +6 -0
  32. package/dist-cjs/card/CardFooter.css.js.map +1 -0
  33. package/dist-cjs/card/CardFooter.js +30 -0
  34. package/dist-cjs/card/CardFooter.js.map +1 -0
  35. package/dist-cjs/card/CardHeader.css.js +6 -0
  36. package/dist-cjs/card/CardHeader.css.js.map +1 -0
  37. package/dist-cjs/card/CardHeader.js +30 -0
  38. package/dist-cjs/card/CardHeader.js.map +1 -0
  39. package/dist-cjs/card/hasCardSection.js +16 -0
  40. package/dist-cjs/card/hasCardSection.js.map +1 -0
  41. package/dist-cjs/file-drop-zone/FileDropZone.css.js +1 -1
  42. package/dist-cjs/index.js +14 -0
  43. package/dist-cjs/index.js.map +1 -1
  44. package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
  45. package/dist-cjs/interactable-card/InteractableCard.js +4 -1
  46. package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
  47. package/dist-cjs/kbd/Kbd.css.js +1 -1
  48. package/dist-cjs/link/Link.js +6 -8
  49. package/dist-cjs/link/Link.js.map +1 -1
  50. package/dist-cjs/link/LinkAction.js +14 -2
  51. package/dist-cjs/link/LinkAction.js.map +1 -1
  52. package/dist-cjs/link-card/LinkCard.css.js +1 -1
  53. package/dist-cjs/link-card/LinkCard.js +4 -1
  54. package/dist-cjs/link-card/LinkCard.js.map +1 -1
  55. package/dist-cjs/list-box/ListBox.css.js +1 -1
  56. package/dist-cjs/list-box/ListBox.js +1 -1
  57. package/dist-cjs/list-box/ListBox.js.map +1 -1
  58. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +1 -1
  59. package/dist-cjs/overlay/Overlay.js +46 -29
  60. package/dist-cjs/overlay/Overlay.js.map +1 -1
  61. package/dist-cjs/overlay/OverlayContext.js +1 -0
  62. package/dist-cjs/overlay/OverlayContext.js.map +1 -1
  63. package/dist-cjs/overlay/OverlayPanel.css.js +1 -1
  64. package/dist-cjs/overlay/OverlayPanel.js +4 -2
  65. package/dist-cjs/overlay/OverlayPanel.js.map +1 -1
  66. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +2 -1
  67. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  68. package/dist-cjs/side-panel/SidePanel.css.js +1 -1
  69. package/dist-cjs/slider/internal/SliderTooltip.css.js +1 -1
  70. package/dist-cjs/slider/internal/SliderTooltip.js +1 -1
  71. package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -1
  72. package/dist-cjs/toast/Toast.css.js +1 -1
  73. package/dist-cjs/toggle-button-group/ToggleButtonGroup.css.js +1 -1
  74. package/dist-cjs/toggletip/ToggletipPanel.css.js +1 -1
  75. package/dist-cjs/toolbar/Toolbar.css.js +1 -1
  76. package/dist-cjs/tooltip/Tooltip.css.js +1 -1
  77. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js +3 -3
  78. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -1
  79. package/dist-cjs/viewport/ViewportProvider.js.map +1 -1
  80. package/dist-es/avatar/Avatar.css.js +1 -1
  81. package/dist-es/avatar/Avatar.js +7 -4
  82. package/dist-es/avatar/Avatar.js.map +1 -1
  83. package/dist-es/breadcrumbs/Breadcrumb.css.js +4 -0
  84. package/dist-es/breadcrumbs/Breadcrumb.css.js.map +1 -0
  85. package/dist-es/breadcrumbs/Breadcrumb.js +102 -0
  86. package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -0
  87. package/dist-es/breadcrumbs/BreadcrumbLabel.js +23 -0
  88. package/dist-es/breadcrumbs/BreadcrumbLabel.js.map +1 -0
  89. package/dist-es/breadcrumbs/BreadcrumbTrigger.js +50 -0
  90. package/dist-es/breadcrumbs/BreadcrumbTrigger.js.map +1 -0
  91. package/dist-es/breadcrumbs/Breadcrumbs.css.js +4 -0
  92. package/dist-es/breadcrumbs/Breadcrumbs.css.js.map +1 -0
  93. package/dist-es/breadcrumbs/Breadcrumbs.js +149 -0
  94. package/dist-es/breadcrumbs/Breadcrumbs.js.map +1 -0
  95. package/dist-es/breadcrumbs/internal/BreadcrumbContext.js +9 -0
  96. package/dist-es/breadcrumbs/internal/BreadcrumbContext.js.map +1 -0
  97. package/dist-es/breadcrumbs/internal/BreadcrumbOverflowDisclosure.js +241 -0
  98. package/dist-es/breadcrumbs/internal/BreadcrumbOverflowDisclosure.js.map +1 -0
  99. package/dist-es/breadcrumbs/internal/breadcrumbItems.js +19 -0
  100. package/dist-es/breadcrumbs/internal/breadcrumbItems.js.map +1 -0
  101. package/dist-es/card/Card.css.js +1 -1
  102. package/dist-es/card/Card.js +4 -1
  103. package/dist-es/card/Card.js.map +1 -1
  104. package/dist-es/card/CardContent.css.js +4 -0
  105. package/dist-es/card/CardContent.css.js.map +1 -0
  106. package/dist-es/card/CardContent.js +28 -0
  107. package/dist-es/card/CardContent.js.map +1 -0
  108. package/dist-es/card/CardFooter.css.js +4 -0
  109. package/dist-es/card/CardFooter.css.js.map +1 -0
  110. package/dist-es/card/CardFooter.js +28 -0
  111. package/dist-es/card/CardFooter.js.map +1 -0
  112. package/dist-es/card/CardHeader.css.js +4 -0
  113. package/dist-es/card/CardHeader.css.js.map +1 -0
  114. package/dist-es/card/CardHeader.js +28 -0
  115. package/dist-es/card/CardHeader.js.map +1 -0
  116. package/dist-es/card/hasCardSection.js +14 -0
  117. package/dist-es/card/hasCardSection.js.map +1 -0
  118. package/dist-es/file-drop-zone/FileDropZone.css.js +1 -1
  119. package/dist-es/index.js +7 -0
  120. package/dist-es/index.js.map +1 -1
  121. package/dist-es/interactable-card/InteractableCard.css.js +1 -1
  122. package/dist-es/interactable-card/InteractableCard.js +4 -1
  123. package/dist-es/interactable-card/InteractableCard.js.map +1 -1
  124. package/dist-es/kbd/Kbd.css.js +1 -1
  125. package/dist-es/link/Link.js +7 -9
  126. package/dist-es/link/Link.js.map +1 -1
  127. package/dist-es/link/LinkAction.js +15 -3
  128. package/dist-es/link/LinkAction.js.map +1 -1
  129. package/dist-es/link-card/LinkCard.css.js +1 -1
  130. package/dist-es/link-card/LinkCard.js +4 -1
  131. package/dist-es/link-card/LinkCard.js.map +1 -1
  132. package/dist-es/list-box/ListBox.css.js +1 -1
  133. package/dist-es/list-box/ListBox.js +1 -1
  134. package/dist-es/list-box/ListBox.js.map +1 -1
  135. package/dist-es/mega-menu/MegaMenuPanel.css.js +1 -1
  136. package/dist-es/overlay/Overlay.js +46 -29
  137. package/dist-es/overlay/Overlay.js.map +1 -1
  138. package/dist-es/overlay/OverlayContext.js +1 -0
  139. package/dist-es/overlay/OverlayContext.js.map +1 -1
  140. package/dist-es/overlay/OverlayPanel.css.js +1 -1
  141. package/dist-es/overlay/OverlayPanel.js +4 -2
  142. package/dist-es/overlay/OverlayPanel.js.map +1 -1
  143. package/dist-es/semantic-icon-provider/SemanticIconProvider.js +3 -2
  144. package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  145. package/dist-es/side-panel/SidePanel.css.js +1 -1
  146. package/dist-es/slider/internal/SliderTooltip.css.js +1 -1
  147. package/dist-es/slider/internal/SliderTooltip.js +1 -1
  148. package/dist-es/slider/internal/SliderTooltip.js.map +1 -1
  149. package/dist-es/toast/Toast.css.js +1 -1
  150. package/dist-es/toggle-button-group/ToggleButtonGroup.css.js +1 -1
  151. package/dist-es/toggletip/ToggletipPanel.css.js +1 -1
  152. package/dist-es/toolbar/Toolbar.css.js +1 -1
  153. package/dist-es/tooltip/Tooltip.css.js +1 -1
  154. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js +3 -3
  155. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -1
  156. package/dist-es/viewport/ViewportProvider.js.map +1 -1
  157. package/dist-types/avatar/Avatar.d.ts +11 -1
  158. package/dist-types/breadcrumbs/Breadcrumb.d.ts +23 -0
  159. package/dist-types/breadcrumbs/BreadcrumbLabel.d.ts +4 -0
  160. package/dist-types/breadcrumbs/BreadcrumbTrigger.d.ts +8 -0
  161. package/dist-types/breadcrumbs/Breadcrumbs.d.ts +32 -0
  162. package/dist-types/breadcrumbs/index.d.ts +4 -0
  163. package/dist-types/breadcrumbs/internal/BreadcrumbContext.d.ts +14 -0
  164. package/dist-types/breadcrumbs/internal/BreadcrumbOverflowDisclosure.d.ts +9 -0
  165. package/dist-types/breadcrumbs/internal/breadcrumbItems.d.ts +9 -0
  166. package/dist-types/breakpoints/BreakpointProvider.d.ts +1 -1
  167. package/dist-types/card/CardContent.d.ts +4 -0
  168. package/dist-types/card/CardFooter.d.ts +4 -0
  169. package/dist-types/card/CardHeader.d.ts +4 -0
  170. package/dist-types/card/hasCardSection.d.ts +2 -0
  171. package/dist-types/card/index.d.ts +3 -0
  172. package/dist-types/dialog/Dialog.d.ts +1 -1
  173. package/dist-types/form-field/FormFieldHelperText.d.ts +1 -1
  174. package/dist-types/form-field/FormFieldLabel.d.ts +1 -1
  175. package/dist-types/index.d.ts +1 -0
  176. package/dist-types/link/LinkAction.d.ts +2 -1
  177. package/dist-types/mega-menu/MegaMenu.d.ts +1 -1
  178. package/dist-types/menu/Menu.d.ts +1 -1
  179. package/dist-types/menu/MenuBase.d.ts +1 -1
  180. package/dist-types/navigation-item/ExpansionIcon.d.ts +1 -1
  181. package/dist-types/overlay/Overlay.d.ts +14 -3
  182. package/dist-types/overlay/OverlayContext.d.ts +1 -0
  183. package/dist-types/pagination/PageRanges.d.ts +1 -1
  184. package/dist-types/radio-button/RadioButtonIcon.d.ts +1 -1
  185. package/dist-types/salt-provider/SaltProvider.d.ts +2 -2
  186. package/dist-types/salt-provider/ThemeApplicator.d.ts +1 -1
  187. package/dist-types/semantic-icon-provider/SemanticIconProvider.d.ts +2 -1
  188. package/dist-types/side-panel/SidePanelProvider.d.ts +1 -1
  189. package/dist-types/slider/internal/SliderThumb.d.ts +1 -1
  190. package/dist-types/slider/internal/SliderTooltip.d.ts +1 -1
  191. package/dist-types/spinner/svgSpinners/SpinnerSVG.d.ts +1 -1
  192. package/dist-types/stepper/internal/StepConnector.d.ts +1 -1
  193. package/dist-types/stepper/internal/StepExpandTrigger.d.ts +1 -1
  194. package/dist-types/stepper/internal/StepIcon.d.ts +1 -1
  195. package/dist-types/stepper/internal/StepScreenReaderOnly.d.ts +1 -1
  196. package/dist-types/stepper/internal/StepText.d.ts +1 -1
  197. package/dist-types/stepper/internal/StepperProvider.d.ts +1 -1
  198. package/dist-types/tabs/internal/overflow/TabSlot.d.ts +1 -1
  199. package/dist-types/toggletip/Toggletip.d.ts +1 -1
  200. package/dist-types/toolbar/ToolbarOverflow.d.ts +4 -4
  201. package/dist-types/toolbar/ToolbarOverflowFloatingBoundary.d.ts +2 -2
  202. package/dist-types/tooltip/TooltipBase.d.ts +1 -1
  203. package/dist-types/utils/useFloatingUI/useFloatingUI.d.ts +2 -2
  204. package/dist-types/vertical-navigation/SubMenuContext.d.ts +1 -1
  205. package/dist-types/vertical-navigation/VerticalNavigationItemExpansionIcon.d.ts +1 -1
  206. package/dist-types/viewport/ViewportProvider.d.ts +2 -2
  207. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,149 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef, isValidElement } from 'react';
6
+ import { useIcon } from '../semantic-icon-provider/SemanticIconProvider.js';
7
+ import { makePrefixer } from '../utils/makePrefixer.js';
8
+ import '../utils/useFloatingUI/useFloatingUI.js';
9
+ import '../utils/useId.js';
10
+ import '../salt-provider/SaltProvider.js';
11
+ import '../viewport/ViewportProvider.js';
12
+ import { Breadcrumb } from './Breadcrumb.js';
13
+ import css_248z from './Breadcrumbs.css.js';
14
+ import { BreadcrumbContext } from './internal/BreadcrumbContext.js';
15
+ import { BreadcrumbOverflowDisclosure } from './internal/BreadcrumbOverflowDisclosure.js';
16
+ import { flattenBreadcrumbItems } from './internal/breadcrumbItems.js';
17
+
18
+ const withBaseName = makePrefixer("saltBreadcrumbs");
19
+ const withItemBaseName = makePrefixer("saltBreadcrumb");
20
+ function isBreadcrumbElement(child) {
21
+ return isValidElement(child) && child.type === Breadcrumb;
22
+ }
23
+ function getCurrentIndex(items) {
24
+ const explicitCurrentIndex = items.findIndex(({ props }) => props.current);
25
+ return explicitCurrentIndex === -1 ? Math.max(items.length - 1, 0) : explicitCurrentIndex;
26
+ }
27
+ function getCollapseRange({
28
+ currentIndex,
29
+ items,
30
+ itemsAfterCollapse,
31
+ itemsBeforeCollapse
32
+ }) {
33
+ const itemCount = items.length;
34
+ const effectiveItemsAfterCollapse = Math.max(
35
+ itemsAfterCollapse,
36
+ itemCount - currentIndex
37
+ );
38
+ if (itemsBeforeCollapse + effectiveItemsAfterCollapse >= itemCount) {
39
+ return void 0;
40
+ }
41
+ const hiddenStart = itemsBeforeCollapse;
42
+ const hiddenEnd = itemCount - effectiveItemsAfterCollapse;
43
+ const hiddenItems = items.slice(hiddenStart, hiddenEnd);
44
+ return {
45
+ hiddenItems,
46
+ visibleAfter: items.slice(hiddenEnd),
47
+ visibleBefore: items.slice(0, hiddenStart)
48
+ };
49
+ }
50
+ function renderSeparator(SeparatorIcon) {
51
+ return /* @__PURE__ */ jsx(SeparatorIcon, { "aria-hidden": true, className: withItemBaseName("separator") });
52
+ }
53
+ const Breadcrumbs = forwardRef(
54
+ function Breadcrumbs2(props, ref) {
55
+ const {
56
+ children,
57
+ className,
58
+ itemsAfterCollapse = 1,
59
+ itemsBeforeCollapse = 1,
60
+ maxItems,
61
+ render,
62
+ wrap = false,
63
+ ...rest
64
+ } = props;
65
+ const targetWindow = useWindow();
66
+ const { LevelSeparatorIcon } = useIcon();
67
+ useComponentCssInjection({
68
+ testId: "salt-breadcrumbs",
69
+ css: css_248z,
70
+ window: targetWindow
71
+ });
72
+ const items = flattenBreadcrumbItems(children).filter(isBreadcrumbElement).map((element, index) => ({
73
+ element,
74
+ index,
75
+ key: element.key ?? index,
76
+ props: element.props
77
+ }));
78
+ const currentIndex = getCurrentIndex(items);
79
+ const shouldCollapse = !wrap && maxItems !== void 0 && items.length > maxItems;
80
+ const collapseRange = shouldCollapse ? getCollapseRange({
81
+ currentIndex,
82
+ items,
83
+ itemsAfterCollapse,
84
+ itemsBeforeCollapse
85
+ }) : void 0;
86
+ const renderParts = collapseRange ? [
87
+ ...collapseRange.visibleBefore.map(
88
+ (item) => ({ item, type: "breadcrumb" })
89
+ ),
90
+ {
91
+ hiddenItems: collapseRange.hiddenItems,
92
+ type: "collapse"
93
+ },
94
+ ...collapseRange.visibleAfter.map(
95
+ (item) => ({ item, type: "breadcrumb" })
96
+ )
97
+ ] : items.map((item) => ({ item, type: "breadcrumb" }));
98
+ return /* @__PURE__ */ jsx("nav", { ref, className: clsx(withBaseName(), className), ...rest, children: /* @__PURE__ */ jsx(
99
+ "ol",
100
+ {
101
+ className: clsx(withBaseName("ol"), {
102
+ [withBaseName("ol-wrap")]: wrap
103
+ }),
104
+ children: renderParts.map((part, index) => {
105
+ const showSeparator = index < renderParts.length - 1;
106
+ if (part.type === "collapse") {
107
+ return /* @__PURE__ */ jsxs(
108
+ "li",
109
+ {
110
+ className: clsx(
111
+ withItemBaseName(),
112
+ withBaseName("collapseItem")
113
+ ),
114
+ children: [
115
+ /* @__PURE__ */ jsx(
116
+ BreadcrumbOverflowDisclosure,
117
+ {
118
+ currentIndex,
119
+ items: part.hiddenItems,
120
+ render
121
+ }
122
+ ),
123
+ showSeparator ? renderSeparator(LevelSeparatorIcon) : null
124
+ ]
125
+ },
126
+ "breadcrumbs-collapse"
127
+ );
128
+ }
129
+ return /* @__PURE__ */ jsx(
130
+ BreadcrumbContext.Provider,
131
+ {
132
+ value: {
133
+ current: part.item.index === currentIndex,
134
+ placement: "trail",
135
+ render,
136
+ showSeparator
137
+ },
138
+ children: part.item.element
139
+ },
140
+ part.item.key
141
+ );
142
+ })
143
+ }
144
+ ) });
145
+ }
146
+ );
147
+
148
+ export { Breadcrumbs };
149
+ //# sourceMappingURL=Breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.js","sources":["../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ElementType,\n forwardRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer, type RenderPropsType } from \"../utils\";\nimport { Breadcrumb, type BreadcrumbProps } from \"./Breadcrumb\";\nimport breadcrumbsCss from \"./Breadcrumbs.css\";\nimport { BreadcrumbContext } from \"./internal/BreadcrumbContext\";\nimport { BreadcrumbOverflowDisclosure } from \"./internal/BreadcrumbOverflowDisclosure\";\nimport {\n flattenBreadcrumbItems,\n type NormalizedBreadcrumb,\n} from \"./internal/breadcrumbItems\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbs\");\nconst withItemBaseName = makePrefixer(\"saltBreadcrumb\");\n\ninterface CollapseRange {\n hiddenItems: NormalizedBreadcrumb[];\n visibleAfter: NormalizedBreadcrumb[];\n visibleBefore: NormalizedBreadcrumb[];\n}\n\ntype RenderPart =\n | {\n item: NormalizedBreadcrumb;\n type: \"breadcrumb\";\n }\n | {\n hiddenItems: NormalizedBreadcrumb[];\n type: \"collapse\";\n };\n\nexport interface BreadcrumbsProps\n extends Omit<ComponentPropsWithoutRef<\"nav\">, \"children\"> {\n /**\n * Breadcrumb items.\n */\n children?: ReactNode;\n /**\n * The number of items to keep after the collapse point.\n * Defaults to 1.\n */\n itemsAfterCollapse?: number;\n /**\n * The number of items to keep before the collapse point.\n * Defaults to 1.\n */\n itemsBeforeCollapse?: number;\n /**\n * The maximum number of breadcrumbs to render before collapsing.\n */\n maxItems?: number;\n /**\n * Render prop to enable customization of the underlying link elements.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * If `true`, breadcrumbs can wrap onto multiple lines.\n * Defaults to `false`.\n */\n wrap?: boolean;\n}\n\nfunction isBreadcrumbElement(\n child: ReactNode,\n): child is ReactElement<BreadcrumbProps> {\n return isValidElement<BreadcrumbProps>(child) && child.type === Breadcrumb;\n}\n\nfunction getCurrentIndex(items: NormalizedBreadcrumb[]) {\n const explicitCurrentIndex = items.findIndex(({ props }) => props.current);\n\n return explicitCurrentIndex === -1\n ? Math.max(items.length - 1, 0)\n : explicitCurrentIndex;\n}\n\nfunction getCollapseRange({\n currentIndex,\n items,\n itemsAfterCollapse,\n itemsBeforeCollapse,\n}: {\n currentIndex: number;\n items: NormalizedBreadcrumb[];\n itemsAfterCollapse: number;\n itemsBeforeCollapse: number;\n}): CollapseRange | undefined {\n const itemCount = items.length;\n const effectiveItemsAfterCollapse = Math.max(\n itemsAfterCollapse,\n itemCount - currentIndex,\n );\n\n if (itemsBeforeCollapse + effectiveItemsAfterCollapse >= itemCount) {\n return undefined;\n }\n\n const hiddenStart = itemsBeforeCollapse;\n const hiddenEnd = itemCount - effectiveItemsAfterCollapse;\n const hiddenItems = items.slice(hiddenStart, hiddenEnd);\n\n return {\n hiddenItems,\n visibleAfter: items.slice(hiddenEnd),\n visibleBefore: items.slice(0, hiddenStart),\n };\n}\n\nfunction renderSeparator(SeparatorIcon: ElementType) {\n return (\n <SeparatorIcon aria-hidden className={withItemBaseName(\"separator\")} />\n );\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(\n function Breadcrumbs(props, ref) {\n const {\n children,\n className,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems,\n render,\n wrap = false,\n ...rest\n } = props;\n const targetWindow = useWindow();\n const { LevelSeparatorIcon } = useIcon();\n\n useComponentCssInjection({\n testId: \"salt-breadcrumbs\",\n css: breadcrumbsCss,\n window: targetWindow,\n });\n\n const items = flattenBreadcrumbItems(children)\n .filter(isBreadcrumbElement)\n .map((element, index) => ({\n element,\n index,\n key: element.key ?? index,\n props: element.props,\n }));\n\n const currentIndex = getCurrentIndex(items);\n const shouldCollapse =\n !wrap && maxItems !== undefined && items.length > maxItems;\n\n const collapseRange = shouldCollapse\n ? getCollapseRange({\n currentIndex,\n items,\n itemsAfterCollapse,\n itemsBeforeCollapse,\n })\n : undefined;\n\n const renderParts: RenderPart[] = collapseRange\n ? [\n ...collapseRange.visibleBefore.map(\n (item): RenderPart => ({ item, type: \"breadcrumb\" }),\n ),\n {\n hiddenItems: collapseRange.hiddenItems,\n type: \"collapse\",\n },\n ...collapseRange.visibleAfter.map(\n (item): RenderPart => ({ item, type: \"breadcrumb\" }),\n ),\n ]\n : items.map((item): RenderPart => ({ item, type: \"breadcrumb\" }));\n\n return (\n <nav ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n <ol\n className={clsx(withBaseName(\"ol\"), {\n [withBaseName(\"ol-wrap\")]: wrap,\n })}\n >\n {renderParts.map((part, index) => {\n const showSeparator = index < renderParts.length - 1;\n\n if (part.type === \"collapse\") {\n return (\n <li\n className={clsx(\n withItemBaseName(),\n withBaseName(\"collapseItem\"),\n )}\n key=\"breadcrumbs-collapse\"\n >\n <BreadcrumbOverflowDisclosure\n currentIndex={currentIndex}\n items={part.hiddenItems}\n render={render}\n />\n {showSeparator ? renderSeparator(LevelSeparatorIcon) : null}\n </li>\n );\n }\n\n return (\n <BreadcrumbContext.Provider\n key={part.item.key}\n value={{\n current: part.item.index === currentIndex,\n placement: \"trail\",\n render,\n showSeparator,\n }}\n >\n {part.item.element}\n </BreadcrumbContext.Provider>\n );\n })}\n </ol>\n </nav>\n );\n },\n);\n"],"names":["Breadcrumbs","breadcrumbsCss"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const BreadcrumbContext = createContext(void 0);
4
+ function useBreadcrumbContext() {
5
+ return useContext(BreadcrumbContext);
6
+ }
7
+
8
+ export { BreadcrumbContext, useBreadcrumbContext };
9
+ //# sourceMappingURL=BreadcrumbContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbContext.js","sources":["../src/breadcrumbs/internal/BreadcrumbContext.ts"],"sourcesContent":["import { createContext, type Ref, useContext } from \"react\";\nimport type { RenderPropsType } from \"../../utils\";\n\nexport type BreadcrumbPlacement = \"disclosure\" | \"trail\";\n\nexport interface BreadcrumbContextValue {\n current: boolean;\n href?: string;\n onNavigate?: () => void;\n placement: BreadcrumbPlacement;\n render?: RenderPropsType[\"render\"];\n showSeparator: boolean;\n triggerRef?: Ref<HTMLAnchorElement>;\n}\n\nexport const BreadcrumbContext = createContext<\n BreadcrumbContextValue | undefined\n>(undefined);\n\nexport function useBreadcrumbContext() {\n return useContext(BreadcrumbContext);\n}\n"],"names":[],"mappings":";;AAeO,MAAM,iBAAA,GAAoB,cAE/B,MAAS;AAEJ,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC;;;;"}
@@ -0,0 +1,241 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { offset, size, flip, shift, useInteractions, useClick, useDismiss } from '@floating-ui/react';
3
+ import { OverflowMenuIcon } from '@salt-ds/icons';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { useState, useRef, useCallback } from 'react';
6
+ import { Button } from '../../button/Button.js';
7
+ import { makePrefixer } from '../../utils/makePrefixer.js';
8
+ import 'clsx';
9
+ import { useFloatingComponent, useFloatingUI } from '../../utils/useFloatingUI/useFloatingUI.js';
10
+ import { useForkRef } from '../../utils/useForkRef.js';
11
+ import { useId } from '../../utils/useId.js';
12
+ import '../../salt-provider/SaltProvider.js';
13
+ import '../../viewport/ViewportProvider.js';
14
+ import { BreadcrumbContext } from './BreadcrumbContext.js';
15
+
16
+ const withBaseName = makePrefixer("saltBreadcrumbs");
17
+ function BreadcrumbOverflowDisclosure({
18
+ currentIndex,
19
+ items,
20
+ render
21
+ }) {
22
+ var _a, _b;
23
+ const [open, setOpen] = useState(false);
24
+ const targetWindow = useWindow();
25
+ const itemElements = useRef(/* @__PURE__ */ new Map());
26
+ const triggerRef = useRef(null);
27
+ const disclosureId = useId();
28
+ const { Component: FloatingComponent } = useFloatingComponent();
29
+ const focusTrigger = useCallback(() => {
30
+ targetWindow == null ? void 0 : targetWindow.requestAnimationFrame(() => {
31
+ var _a2;
32
+ (_a2 = triggerRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
33
+ });
34
+ }, [targetWindow]);
35
+ const getFocusableItems = useCallback(
36
+ () => items.map((_, index) => itemElements.current.get(index)).filter((item) => item !== void 0),
37
+ [items]
38
+ );
39
+ const focusItem = useCallback(
40
+ (position) => {
41
+ const focusableItems = getFocusableItems();
42
+ const item = position === "first" ? focusableItems[0] : focusableItems[focusableItems.length - 1];
43
+ item == null ? void 0 : item.focus({ preventScroll: true });
44
+ return item !== void 0;
45
+ },
46
+ [getFocusableItems]
47
+ );
48
+ const focusItemByOffset = useCallback(
49
+ (offset2) => {
50
+ var _a2;
51
+ const focusableItems = getFocusableItems();
52
+ const activeIndex = focusableItems.indexOf(
53
+ targetWindow == null ? void 0 : targetWindow.document.activeElement
54
+ );
55
+ if (activeIndex === -1) {
56
+ return focusItem(offset2 > 0 ? "first" : "last");
57
+ }
58
+ const nextIndex = Math.min(
59
+ Math.max(activeIndex + offset2, 0),
60
+ focusableItems.length - 1
61
+ );
62
+ (_a2 = focusableItems[nextIndex]) == null ? void 0 : _a2.focus({ preventScroll: true });
63
+ return focusableItems[nextIndex] !== void 0;
64
+ },
65
+ [focusItem, getFocusableItems, targetWindow]
66
+ );
67
+ const { context, elements, refs, strategy, x, y } = useFloatingUI({
68
+ open,
69
+ onOpenChange(nextOpen, _event, reason) {
70
+ setOpen(nextOpen);
71
+ if (!nextOpen && reason === "escape-key") {
72
+ focusTrigger();
73
+ }
74
+ },
75
+ placement: "bottom-start",
76
+ middleware: [
77
+ offset(1),
78
+ size({
79
+ apply({ availableHeight, elements: elements2 }) {
80
+ Object.assign(elements2.floating.style, {
81
+ maxHeight: `${availableHeight}px`
82
+ });
83
+ }
84
+ }),
85
+ flip(),
86
+ shift({
87
+ padding: 8
88
+ })
89
+ ]
90
+ });
91
+ const { getFloatingProps, getReferenceProps } = useInteractions([
92
+ useClick(context),
93
+ useDismiss(context)
94
+ ]);
95
+ const handleTriggerRef = useForkRef(
96
+ triggerRef,
97
+ refs.setReference
98
+ );
99
+ const handleTriggerKeyDown = (event) => {
100
+ if (open && (event.key === "ArrowDown" || event.key === "ArrowRight")) {
101
+ event.preventDefault();
102
+ focusItem("first");
103
+ return;
104
+ }
105
+ if (open && (event.key === "ArrowUp" || event.key === "ArrowLeft")) {
106
+ event.preventDefault();
107
+ focusItem("last");
108
+ return;
109
+ }
110
+ if (event.key === "Tab" && open && !event.shiftKey) {
111
+ if (focusItem("first")) {
112
+ event.preventDefault();
113
+ }
114
+ return;
115
+ }
116
+ };
117
+ const handleTriggerBlur = (event) => {
118
+ var _a2;
119
+ const nextFocusedElement = event.relatedTarget;
120
+ if (nextFocusedElement && ((_a2 = elements.floating) == null ? void 0 : _a2.contains(nextFocusedElement))) {
121
+ return;
122
+ }
123
+ setOpen(false);
124
+ };
125
+ const handleDisclosureKeyDown = (event) => {
126
+ if (event.key === "Tab") {
127
+ const focusableItems = getFocusableItems();
128
+ const activeIndex = focusableItems.indexOf(
129
+ targetWindow == null ? void 0 : targetWindow.document.activeElement
130
+ );
131
+ const shouldReturnToTrigger = event.shiftKey ? activeIndex === 0 : activeIndex === focusableItems.length - 1;
132
+ if (shouldReturnToTrigger) {
133
+ event.preventDefault();
134
+ setOpen(false);
135
+ focusTrigger();
136
+ }
137
+ return;
138
+ }
139
+ if (event.key === "ArrowDown" || event.key === "ArrowRight") {
140
+ event.preventDefault();
141
+ focusItemByOffset(1);
142
+ return;
143
+ }
144
+ if (event.key === "ArrowUp" || event.key === "ArrowLeft") {
145
+ event.preventDefault();
146
+ focusItemByOffset(-1);
147
+ return;
148
+ }
149
+ if (event.key === "Home") {
150
+ event.preventDefault();
151
+ focusItem("first");
152
+ return;
153
+ }
154
+ if (event.key === "End") {
155
+ event.preventDefault();
156
+ focusItem("last");
157
+ }
158
+ };
159
+ const handleDisclosureBlur = (event) => {
160
+ var _a2;
161
+ const nextFocusedElement = event.relatedTarget;
162
+ if (nextFocusedElement && (event.currentTarget.contains(nextFocusedElement) || ((_a2 = triggerRef.current) == null ? void 0 : _a2.contains(nextFocusedElement)))) {
163
+ return;
164
+ }
165
+ setOpen(false);
166
+ };
167
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
168
+ /* @__PURE__ */ jsx(
169
+ Button,
170
+ {
171
+ "aria-controls": disclosureId,
172
+ "aria-expanded": open,
173
+ "aria-label": "Additional breadcrumbs",
174
+ appearance: "transparent",
175
+ className: withBaseName("collapseButton"),
176
+ ref: handleTriggerRef,
177
+ ...getReferenceProps({
178
+ onBlur: handleTriggerBlur,
179
+ onKeyDown: handleTriggerKeyDown
180
+ }),
181
+ children: /* @__PURE__ */ jsx(OverflowMenuIcon, { "aria-hidden": true })
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsx(
185
+ FloatingComponent,
186
+ {
187
+ className: withBaseName("disclosure"),
188
+ focusManagerProps: context ? {
189
+ closeOnFocusOut: true,
190
+ context,
191
+ initialFocus: -1,
192
+ modal: false,
193
+ returnFocus: false
194
+ } : void 0,
195
+ height: (_a = elements.floating) == null ? void 0 : _a.offsetHeight,
196
+ left: x ?? 0,
197
+ open,
198
+ position: strategy,
199
+ ref: refs.setFloating,
200
+ top: y ?? 0,
201
+ width: (_b = elements.floating) == null ? void 0 : _b.offsetWidth,
202
+ ...getFloatingProps({
203
+ id: disclosureId,
204
+ onBlur: handleDisclosureBlur,
205
+ onKeyDown: handleDisclosureKeyDown
206
+ }),
207
+ children: /* @__PURE__ */ jsx(
208
+ "ol",
209
+ {
210
+ "aria-label": "Hidden breadcrumb levels",
211
+ className: withBaseName("disclosureList"),
212
+ children: items.map((item, index) => /* @__PURE__ */ jsx(
213
+ BreadcrumbContext.Provider,
214
+ {
215
+ value: {
216
+ current: item.index === currentIndex,
217
+ onNavigate: () => setOpen(false),
218
+ placement: "disclosure",
219
+ render,
220
+ showSeparator: false,
221
+ triggerRef: (element) => {
222
+ if ((element == null ? void 0 : element.tagName) === "A" && element.hasAttribute("href")) {
223
+ itemElements.current.set(index, element);
224
+ } else {
225
+ itemElements.current.delete(index);
226
+ }
227
+ }
228
+ },
229
+ children: item.element
230
+ },
231
+ item.key
232
+ ))
233
+ }
234
+ )
235
+ }
236
+ )
237
+ ] });
238
+ }
239
+
240
+ export { BreadcrumbOverflowDisclosure };
241
+ //# sourceMappingURL=BreadcrumbOverflowDisclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbOverflowDisclosure.js","sources":["../src/breadcrumbs/internal/BreadcrumbOverflowDisclosure.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { OverflowMenuIcon } from \"@salt-ds/icons\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n type FocusEvent,\n type KeyboardEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { Button } from \"../../button\";\nimport {\n makePrefixer,\n type RenderPropsType,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n} from \"../../utils\";\nimport { BreadcrumbContext } from \"./BreadcrumbContext\";\nimport type { NormalizedBreadcrumb } from \"./breadcrumbItems\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbs\");\n\ninterface BreadcrumbOverflowDisclosureProps {\n currentIndex: number;\n items: NormalizedBreadcrumb[];\n render?: RenderPropsType[\"render\"];\n}\n\nexport function BreadcrumbOverflowDisclosure({\n currentIndex,\n items,\n render,\n}: BreadcrumbOverflowDisclosureProps) {\n const [open, setOpen] = useState(false);\n const targetWindow = useWindow();\n const itemElements = useRef(new Map<number, HTMLAnchorElement>());\n const triggerRef = useRef<HTMLButtonElement>(null);\n const disclosureId = useId();\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const focusTrigger = useCallback(() => {\n targetWindow?.requestAnimationFrame(() => {\n triggerRef.current?.focus({ preventScroll: true });\n });\n }, [targetWindow]);\n\n const getFocusableItems = useCallback(\n () =>\n items\n .map((_, index) => itemElements.current.get(index))\n .filter((item): item is HTMLAnchorElement => item !== undefined),\n [items],\n );\n\n const focusItem = useCallback(\n (position: \"first\" | \"last\") => {\n const focusableItems = getFocusableItems();\n const item =\n position === \"first\"\n ? focusableItems[0]\n : focusableItems[focusableItems.length - 1];\n\n item?.focus({ preventScroll: true });\n return item !== undefined;\n },\n [getFocusableItems],\n );\n\n const focusItemByOffset = useCallback(\n (offset: number) => {\n const focusableItems = getFocusableItems();\n const activeIndex = focusableItems.indexOf(\n targetWindow?.document.activeElement as HTMLAnchorElement,\n );\n\n if (activeIndex === -1) {\n return focusItem(offset > 0 ? \"first\" : \"last\");\n }\n\n const nextIndex = Math.min(\n Math.max(activeIndex + offset, 0),\n focusableItems.length - 1,\n );\n\n focusableItems[nextIndex]?.focus({ preventScroll: true });\n return focusableItems[nextIndex] !== undefined;\n },\n [focusItem, getFocusableItems, targetWindow],\n );\n\n const { context, elements, refs, strategy, x, y } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _event, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen && reason === \"escape-key\") {\n focusTrigger();\n }\n },\n placement: \"bottom-start\",\n middleware: [\n offset(1),\n size({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context),\n ]);\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (open && (event.key === \"ArrowDown\" || event.key === \"ArrowRight\")) {\n event.preventDefault();\n focusItem(\"first\");\n return;\n }\n\n if (open && (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\")) {\n event.preventDefault();\n focusItem(\"last\");\n return;\n }\n\n if (event.key === \"Tab\" && open && !event.shiftKey) {\n if (focusItem(\"first\")) {\n event.preventDefault();\n }\n return;\n }\n };\n\n const handleTriggerBlur = (event: FocusEvent<HTMLButtonElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n\n if (nextFocusedElement && elements.floating?.contains(nextFocusedElement)) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleDisclosureKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Tab\") {\n const focusableItems = getFocusableItems();\n const activeIndex = focusableItems.indexOf(\n targetWindow?.document.activeElement as HTMLAnchorElement,\n );\n const shouldReturnToTrigger = event.shiftKey\n ? activeIndex === 0\n : activeIndex === focusableItems.length - 1;\n\n if (shouldReturnToTrigger) {\n event.preventDefault();\n setOpen(false);\n focusTrigger();\n }\n\n return;\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n focusItemByOffset(1);\n return;\n }\n\n if (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusItemByOffset(-1);\n return;\n }\n\n if (event.key === \"Home\") {\n event.preventDefault();\n focusItem(\"first\");\n return;\n }\n\n if (event.key === \"End\") {\n event.preventDefault();\n focusItem(\"last\");\n }\n };\n\n const handleDisclosureBlur = (event: FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n\n if (\n nextFocusedElement &&\n (event.currentTarget.contains(nextFocusedElement) ||\n triggerRef.current?.contains(nextFocusedElement))\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n return (\n <>\n <Button\n aria-controls={disclosureId}\n aria-expanded={open}\n aria-label=\"Additional breadcrumbs\"\n appearance=\"transparent\"\n className={withBaseName(\"collapseButton\")}\n ref={handleTriggerRef}\n {...getReferenceProps({\n onBlur: handleTriggerBlur,\n onKeyDown: handleTriggerKeyDown,\n })}\n >\n <OverflowMenuIcon aria-hidden />\n </Button>\n <FloatingComponent\n className={withBaseName(\"disclosure\")}\n focusManagerProps={\n context\n ? {\n closeOnFocusOut: true,\n context,\n initialFocus: -1,\n modal: false,\n returnFocus: false,\n }\n : undefined\n }\n height={elements.floating?.offsetHeight}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={refs.setFloating}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n {...getFloatingProps({\n id: disclosureId,\n onBlur: handleDisclosureBlur,\n onKeyDown: handleDisclosureKeyDown,\n })}\n >\n <ol\n aria-label=\"Hidden breadcrumb levels\"\n className={withBaseName(\"disclosureList\")}\n >\n {items.map((item, index) => (\n <BreadcrumbContext.Provider\n key={item.key}\n value={{\n current: item.index === currentIndex,\n onNavigate: () => setOpen(false),\n placement: \"disclosure\",\n render,\n showSeparator: false,\n triggerRef: (element) => {\n // Placeholder anchors (no href) are not focusable, so only\n // navigable items take part in disclosure focus movement.\n if (\n element?.tagName === \"A\" &&\n element.hasAttribute(\"href\")\n ) {\n itemElements.current.set(index, element);\n } else {\n itemElements.current.delete(index);\n }\n },\n }}\n >\n {item.element}\n </BreadcrumbContext.Provider>\n ))}\n </ol>\n </FloatingComponent>\n </>\n );\n}\n"],"names":["_a","offset","elements"],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,YAAA,GAAe,aAAa,iBAAiB,CAAA;AAQ5C,SAAS,4BAAA,CAA6B;AAAA,EAC3C,YAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAsC;AA1CtC,EAAA,IAAA,EAAA,EAAA,EAAA;AA2CE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,MAAM,YAAA,GAAe,MAAA,iBAAO,IAAI,GAAA,EAAgC,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,OAA0B,IAAI,CAAA;AACjD,EAAA,MAAM,eAAe,KAAA,EAAM;AAC3B,EAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAkB,GAAI,oBAAA,EAAqB;AAE9D,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,sBAAsB,MAAM;AAnD9C,MAAA,IAAAA,GAAAA;AAoDM,MAAA,CAAAA,GAAAA,GAAA,WAAW,OAAA,KAAX,IAAA,GAAA,MAAA,GAAAA,IAAoB,KAAA,CAAM,EAAE,eAAe,IAAA,EAAK,CAAA;AAAA,IAClD,CAAA,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,MACE,KAAA,CACG,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAC,CAAA,CACjD,MAAA,CAAO,CAAC,IAAA,KAAoC,SAAS,MAAS,CAAA;AAAA,IACnE,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,QAAA,KAA+B;AAC9B,MAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,MAAA,MAAM,IAAA,GACJ,aAAa,OAAA,GACT,cAAA,CAAe,CAAC,CAAA,GAChB,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AAE9C,MAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAK,CAAA;AAClC,MAAA,OAAO,IAAA,KAAS,MAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAACC,OAAAA,KAAmB;AA/ExB,MAAA,IAAAD,GAAAA;AAgFM,MAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,MAAA,MAAM,cAAc,cAAA,CAAe,OAAA;AAAA,QACjC,6CAAc,QAAA,CAAS;AAAA,OACzB;AAEA,MAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,QAAA,OAAO,SAAA,CAAUC,OAAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAM,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,QACrB,IAAA,CAAK,GAAA,CAAI,WAAA,GAAcA,OAAAA,EAAQ,CAAC,CAAA;AAAA,QAChC,eAAe,MAAA,GAAS;AAAA,OAC1B;AAEA,MAAA,CAAAD,GAAAA,GAAA,eAAe,SAAS,CAAA,KAAxB,gBAAAA,GAAAA,CAA2B,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAK,CAAA;AACvD,MAAA,OAAO,cAAA,CAAe,SAAS,CAAA,KAAM,MAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,iBAAA,EAAmB,YAAY;AAAA,GAC7C;AAEA,EAAA,MAAM,EAAE,SAAS,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA,EAAG,CAAA,KAAM,aAAA,CAAc;AAAA,IAChE,IAAA;AAAA,IACA,YAAA,CAAa,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ;AACrC,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,MAAA,IAAI,CAAC,QAAA,IAAY,MAAA,KAAW,YAAA,EAAc;AACxC,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,cAAA;AAAA,IACX,UAAA,EAAY;AAAA,MACV,OAAO,CAAC,CAAA;AAAA,MACR,IAAA,CAAK;AAAA,QACH,KAAA,CAAM,EAAE,eAAA,EAAiB,QAAA,EAAAE,WAAS,EAAG;AACnC,UAAA,MAAA,CAAO,MAAA,CAAOA,SAAAA,CAAS,QAAA,CAAS,KAAA,EAAO;AAAA,YACrC,SAAA,EAAW,GAAG,eAAe,CAAA,EAAA;AAAA,WAC9B,CAAA;AAAA,QACH;AAAA,OACD,CAAA;AAAA,MACD,IAAA,EAAK;AAAA,MACL,KAAA,CAAM;AAAA,QACJ,OAAA,EAAS;AAAA,OACV;AAAA;AACH,GACD,CAAA;AAED,EAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,eAAA,CAAgB;AAAA,IAC9D,SAAS,OAAO,CAAA;AAAA,IAChB,WAAW,OAAO;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,gBAAA,GAAmB,UAAA;AAAA,IACvB,UAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAA4C;AACxE,IAAA,IAAI,SAAS,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,QAAQ,YAAA,CAAA,EAAe;AACrE,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,KAAA,CAAM,GAAA,KAAQ,SAAA,IAAa,KAAA,CAAM,QAAQ,WAAA,CAAA,EAAc;AAClE,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,GAAA,KAAQ,KAAA,IAAS,IAAA,IAAQ,CAAC,MAAM,QAAA,EAAU;AAClD,MAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,QAAA,KAAA,CAAM,cAAA,EAAe;AAAA,MACvB;AACA,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAyC;AA5JtE,IAAA,IAAAF,GAAAA;AA6JI,IAAA,MAAM,qBAAqB,KAAA,CAAM,aAAA;AAEjC,IAAA,IAAI,wBAAsBA,GAAAA,GAAA,QAAA,CAAS,aAAT,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAmB,SAAS,kBAAA,CAAA,CAAA,EAAqB;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAAyC;AACxE,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,MAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,MAAA,MAAM,cAAc,cAAA,CAAe,OAAA;AAAA,QACjC,6CAAc,QAAA,CAAS;AAAA,OACzB;AACA,MAAA,MAAM,wBAAwB,KAAA,CAAM,QAAA,GAChC,gBAAgB,CAAA,GAChB,WAAA,KAAgB,eAAe,MAAA,GAAS,CAAA;AAE5C,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,YAAA,EAAa;AAAA,MACf;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,QAAQ,YAAA,EAAc;AAC3D,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,SAAA,IAAa,KAAA,CAAM,QAAQ,WAAA,EAAa;AACxD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACxB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,MAAM,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAsC;AAjNtE,IAAA,IAAAA,GAAAA;AAkNI,IAAA,MAAM,qBAAqB,KAAA,CAAM,aAAA;AAEjC,IAAA,IACE,kBAAA,KACC,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,kBAAkB,CAAA,KAAA,CAC9CA,GAAAA,GAAA,UAAA,CAAW,OAAA,KAAX,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAoB,QAAA,CAAS,kBAAA,CAAA,CAAA,CAAA,EAC/B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAe,YAAA;AAAA,QACf,eAAA,EAAe,IAAA;AAAA,QACf,YAAA,EAAW,wBAAA;AAAA,QACX,UAAA,EAAW,aAAA;AAAA,QACX,SAAA,EAAW,aAAa,gBAAgB,CAAA;AAAA,QACxC,GAAA,EAAK,gBAAA;AAAA,QACJ,GAAG,iBAAA,CAAkB;AAAA,UACpB,MAAA,EAAQ,iBAAA;AAAA,UACR,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,QAED,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,aAAA,EAAW,IAAA,EAAC;AAAA;AAAA,KAChC;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,aAAa,YAAY,CAAA;AAAA,QACpC,mBACE,OAAA,GACI;AAAA,UACE,eAAA,EAAiB,IAAA;AAAA,UACjB,OAAA;AAAA,UACA,YAAA,EAAc,EAAA;AAAA,UACd,KAAA,EAAO,KAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf,GACA,MAAA;AAAA,QAEN,MAAA,EAAA,CAAQ,EAAA,GAAA,QAAA,CAAS,QAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,YAAA;AAAA,QAC3B,MAAM,CAAA,IAAK,CAAA;AAAA,QACX,IAAA;AAAA,QACA,QAAA,EAAU,QAAA;AAAA,QACV,KAAK,IAAA,CAAK,WAAA;AAAA,QACV,KAAK,CAAA,IAAK,CAAA;AAAA,QACV,KAAA,EAAA,CAAO,EAAA,GAAA,QAAA,CAAS,QAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,WAAA;AAAA,QACzB,GAAG,gBAAA,CAAiB;AAAA,UACnB,EAAA,EAAI,YAAA;AAAA,UACJ,MAAA,EAAQ,oBAAA;AAAA,UACR,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,QAED,QAAA,kBAAA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,0BAAA;AAAA,YACX,SAAA,EAAW,aAAa,gBAAgB,CAAA;AAAA,YAEvC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChB,GAAA;AAAA,cAAC,iBAAA,CAAkB,QAAA;AAAA,cAAlB;AAAA,gBAEC,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,KAAK,KAAA,KAAU,YAAA;AAAA,kBACxB,UAAA,EAAY,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,kBAC/B,SAAA,EAAW,YAAA;AAAA,kBACX,MAAA;AAAA,kBACA,aAAA,EAAe,KAAA;AAAA,kBACf,UAAA,EAAY,CAAC,OAAA,KAAY;AAGvB,oBAAA,IAAA,CACE,mCAAS,OAAA,MAAY,GAAA,IACrB,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,EAC3B;AACA,sBAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,oBACzC,CAAA,MAAO;AACL,sBAAA,YAAA,CAAa,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,oBACnC;AAAA,kBACF;AAAA,iBACF;AAAA,gBAEC,QAAA,EAAA,IAAA,CAAK;AAAA,eAAA;AAAA,cArBD,IAAA,CAAK;AAAA,aAuBb;AAAA;AAAA;AACH;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,19 @@
1
+ import { Children, isValidElement, Fragment } from 'react';
2
+
3
+ function isFragmentElement(child) {
4
+ return isValidElement(child) && child.type === Fragment;
5
+ }
6
+ function flattenBreadcrumbItems(children) {
7
+ const flattenedChildren = [];
8
+ Children.forEach(children, (child) => {
9
+ if (isFragmentElement(child)) {
10
+ flattenedChildren.push(...flattenBreadcrumbItems(child.props.children));
11
+ } else if (child !== null && child !== void 0 && typeof child !== "boolean") {
12
+ flattenedChildren.push(child);
13
+ }
14
+ });
15
+ return flattenedChildren;
16
+ }
17
+
18
+ export { flattenBreadcrumbItems };
19
+ //# sourceMappingURL=breadcrumbItems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbItems.js","sources":["../src/breadcrumbs/internal/breadcrumbItems.ts"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type Key,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { BreadcrumbProps } from \"../Breadcrumb\";\n\nexport interface NormalizedBreadcrumb {\n element: ReactElement<BreadcrumbProps>;\n index: number;\n key: Key;\n props: BreadcrumbProps;\n}\n\nfunction isFragmentElement(\n child: ReactNode,\n): child is ReactElement<{ children?: ReactNode }> {\n return (\n isValidElement<{ children?: ReactNode }>(child) && child.type === Fragment\n );\n}\n\nexport function flattenBreadcrumbItems(children: ReactNode): ReactNode[] {\n const flattenedChildren: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n flattenedChildren.push(...flattenBreadcrumbItems(child.props.children));\n } else if (\n child !== null &&\n child !== undefined &&\n typeof child !== \"boolean\"\n ) {\n flattenedChildren.push(child);\n }\n });\n\n return flattenedChildren;\n}\n"],"names":[],"mappings":";;AAiBA,SAAS,kBACP,KAAA,EACiD;AACjD,EAAA,OACE,cAAA,CAAyC,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,KAAS,QAAA;AAEtE;AAEO,SAAS,uBAAuB,QAAA,EAAkC;AACvE,EAAA,MAAM,oBAAiC,EAAC;AAExC,EAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AACpC,IAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,MAAA,iBAAA,CAAkB,KAAK,GAAG,sBAAA,CAAuB,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IACxE,WACE,KAAA,KAAU,IAAA,IACV,UAAU,MAAA,IACV,OAAO,UAAU,SAAA,EACjB;AACA,MAAA,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,iBAAA;AACT;;;;"}
@@ -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-fixed-100));\n border-style: var(--salt-borderStyle-solid);\n padding: var(--saltCard-padding, var(--salt-spacing-200));\n position: relative;\n box-shadow: var(--salt-overlayable-shadow);\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 overflow: hidden;\n --card-accent-color: var(--salt-sentiment-accent-background);\n}\n\n.saltCard-primary {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n border-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}\n\n.saltCard-tertiary {\n background: var(--saltCard-background, var(--salt-container-tertiary-background));\n border-color: var(--salt-container-tertiary-borderColor);\n}\n\n.saltCard-ghost {\n background: var(--saltCard-background, var(--salt-container-ghost-background));\n border-color: var(--salt-container-ghost-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-fixed-100));\n bottom: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"left\"` */\n.saltCard-accentLeft::after {\n left: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\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-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"right\"` */\n.saltCard-accentRight::after {\n right: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\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-cursor-hover));\n border-color: var(--salt-actionable-accented-borderColor-hover);\n position: relative;\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 border-color: var(--salt-actionable-accented-borderColor-hover);\n }\n}\n\n/* **Deprecated:** Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n border-color: var(--salt-actionable-accented-borderColor-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-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";
1
+ var css_248z = "/* Styles applied to the root element */\n.saltCard {\n border-width: var(--saltCard-borderWidth, var(--salt-size-fixed-100));\n border-style: var(--salt-borderStyle-solid);\n padding: var(--saltCard-padding, var(--card-padding));\n position: relative;\n box-shadow: var(--salt-overlayable-shadow);\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 overflow: hidden;\n --card-accent-color: var(--salt-sentiment-accent-background);\n --card-padding: var(--salt-spacing-200);\n}\n\n.saltCard.saltCard-sectioned {\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n@supports selector(:has(*)) {\n .saltCard:has(> .saltCardHeader, > .saltCardContent, > .saltCardFooter) {\n padding: 0;\n display: flex;\n flex-direction: column;\n }\n}\n\n.saltCard-primary {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n.saltCard-secondary {\n background: var(--saltCard-background, var(--salt-container-secondary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n.saltCard-tertiary {\n background: var(--saltCard-background, var(--salt-container-tertiary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n.saltCard-ghost {\n background: var(--saltCard-background, var(--salt-container-ghost-background));\n border-color: var(--salt-container-ghost-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-fixed-100));\n bottom: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"left\"` */\n.saltCard-accentLeft::after {\n left: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\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-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"right\"` */\n.saltCard-accentRight::after {\n right: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\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-cursor-hover));\n border-color: var(--salt-actionable-accented-borderColor-hover);\n position: relative;\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 border-color: var(--salt-actionable-accented-borderColor-hover);\n }\n}\n\n/* **Deprecated:** Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n border-color: var(--salt-actionable-accented-borderColor-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-bold-borderColor-disabled);\n color: var(--saltCard-color-disabled, var(--salt-content-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-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";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=Card.css.js.map
@@ -10,6 +10,7 @@ import '../utils/useId.js';
10
10
  import '../salt-provider/SaltProvider.js';
11
11
  import '../viewport/ViewportProvider.js';
12
12
  import css_248z from './Card.css.js';
13
+ import { hasCardSection } from './hasCardSection.js';
13
14
 
14
15
  const withBaseName = makePrefixer("saltCard");
15
16
  const Card = forwardRef(
@@ -30,6 +31,7 @@ const Card = forwardRef(
30
31
  css: css_248z,
31
32
  window: targetWindow
32
33
  });
34
+ const sectioned = hasCardSection(children);
33
35
  return /* @__PURE__ */ jsx(
34
36
  "div",
35
37
  {
@@ -42,7 +44,8 @@ const Card = forwardRef(
42
44
  [withBaseName("hoverable")]: hoverable,
43
45
  /* **Deprecated:** InteractableCard should be used instead for these features */
44
46
  [withBaseName("disabled")]: disabled,
45
- [withBaseName("interactable")]: interactable
47
+ [withBaseName("interactable")]: interactable,
48
+ [withBaseName("sectioned")]: sectioned
46
49
  },
47
50
  className
48
51
  ),
@@ -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\" | \"tertiary\" | \"ghost\";\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;AA6BrC,MAAM,IAAA,GAAO,UAAA;AAAA,EAClB,SAASA,KAAAA,CAAK,KAAA,EAAO,GAAA,EAAK;AACxB,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,WAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAAS,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,SAAA;AAAA;AAAA,YAE7B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG;AAAA,WAClC;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;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\";\nimport { hasCardSection } from \"./hasCardSection\";\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\" | \"ghost\";\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 const sectioned = hasCardSection(children);\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 [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["Card","cardCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA;AA6BrC,MAAM,IAAA,GAAO,UAAA;AAAA,EAClB,SAASA,KAAAA,CAAK,KAAA,EAAO,GAAA,EAAK;AACxB,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,WAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAAS,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,SAAA;AAAA;AAAA,YAE7B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG,YAAA;AAAA,YAChC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltCardContent {\n padding: var(--saltCardContent-padding, var(--salt-spacing-200));\n box-sizing: border-box;\n}\n\n.saltCard-sectioned > .saltCardHeader + .saltCardContent,\n.saltCard-sectioned > .saltCardContent + .saltCardContent,\n.saltLinkCard-sectioned > .saltCardHeader + .saltCardContent,\n.saltLinkCard-sectioned > .saltCardContent + .saltCardContent,\n.saltInteractableCard-sectioned > .saltCardHeader + .saltCardContent,\n.saltInteractableCard-sectioned > .saltCardContent + .saltCardContent {\n padding-top: 0;\n}\n\n.saltCard-sectioned > .saltCardContent,\n.saltLinkCard-sectioned > .saltCardContent,\n.saltInteractableCard-sectioned > .saltCardContent {\n flex: 1 1 auto;\n}\n\n@supports selector(:has(*)) {\n .saltCard > .saltCardHeader + .saltCardContent,\n .saltCard > .saltCardContent + .saltCardContent,\n .saltLinkCard > .saltCardHeader + .saltCardContent,\n .saltLinkCard > .saltCardContent + .saltCardContent,\n .saltInteractableCard > .saltCardHeader + .saltCardContent,\n .saltInteractableCard > .saltCardContent + .saltCardContent {\n padding-top: 0;\n }\n\n .saltCard > .saltCardContent,\n .saltLinkCard > .saltCardContent,\n .saltInteractableCard > .saltCardContent {\n flex: 1 1 auto;\n }\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=CardContent.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardContent.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,28 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef } from 'react';
6
+ import { makePrefixer } from '../utils/makePrefixer.js';
7
+ import '../utils/useFloatingUI/useFloatingUI.js';
8
+ import '../utils/useId.js';
9
+ import '../salt-provider/SaltProvider.js';
10
+ import '../viewport/ViewportProvider.js';
11
+ import css_248z from './CardContent.css.js';
12
+
13
+ const withBaseName = makePrefixer("saltCardContent");
14
+ const CardContent = forwardRef(
15
+ function CardContent2(props, ref) {
16
+ const { className, ...rest } = props;
17
+ const targetWindow = useWindow();
18
+ useComponentCssInjection({
19
+ testId: "salt-card-content",
20
+ css: css_248z,
21
+ window: targetWindow
22
+ });
23
+ return /* @__PURE__ */ jsx("div", { ref, className: clsx(withBaseName(), className), ...rest });
24
+ }
25
+ );
26
+
27
+ export { CardContent };
28
+ //# sourceMappingURL=CardContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardContent.js","sources":["../src/card/CardContent.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport cardContentCss from \"./CardContent.css\";\n\nexport interface CardContentProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nconst withBaseName = makePrefixer(\"saltCardContent\");\n\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps>(\n function CardContent(props, ref) {\n const { className, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-card-content\",\n css: cardContentCss,\n window: targetWindow,\n });\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest} />\n );\n },\n);\n"],"names":["CardContent","cardContentCss"],"mappings":";;;;;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,iBAAiB,CAAA;AAE5C,MAAM,WAAA,GAAc,UAAA;AAAA,EACzB,SAASA,YAAAA,CAAY,KAAA,EAAO,GAAA,EAAK;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,KAAA;AAE/B,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,mBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,IAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAAM,CAAA;AAAA,EAEzE;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltCardFooter {\n padding: var(--saltCardFooter-padding, var(--salt-spacing-200));\n display: flex;\n align-items: center;\n gap: var(--salt-spacing-100);\n box-sizing: border-box;\n}\n\n.saltCard-sectioned > .saltCardHeader + .saltCardFooter,\n.saltCard-sectioned > .saltCardContent + .saltCardFooter,\n.saltLinkCard-sectioned > .saltCardHeader + .saltCardFooter,\n.saltLinkCard-sectioned > .saltCardContent + .saltCardFooter,\n.saltInteractableCard-sectioned > .saltCardHeader + .saltCardFooter,\n.saltInteractableCard-sectioned > .saltCardContent + .saltCardFooter {\n padding-top: 0;\n}\n\n.saltCard-sectioned > .saltCardFooter,\n.saltLinkCard-sectioned > .saltCardFooter,\n.saltInteractableCard-sectioned > .saltCardFooter {\n flex-shrink: 0;\n margin-top: auto;\n}\n\n@supports selector(:has(*)) {\n .saltCard > .saltCardHeader + .saltCardFooter,\n .saltCard > .saltCardContent + .saltCardFooter,\n .saltLinkCard > .saltCardHeader + .saltCardFooter,\n .saltLinkCard > .saltCardContent + .saltCardFooter,\n .saltInteractableCard > .saltCardHeader + .saltCardFooter,\n .saltInteractableCard > .saltCardContent + .saltCardFooter {\n padding-top: 0;\n }\n\n .saltCard > .saltCardFooter,\n .saltLinkCard > .saltCardFooter,\n .saltInteractableCard > .saltCardFooter {\n flex-shrink: 0;\n margin-top: auto;\n }\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=CardFooter.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardFooter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}