@salt-ds/lab 1.0.0-alpha.97 → 1.0.0-alpha.99

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 (169) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/css/salt-lab.css +147 -143
  3. package/dist-cjs/breadcrumbs-next/BreadcrumbNext.css.js +6 -0
  4. package/dist-cjs/breadcrumbs-next/BreadcrumbNext.css.js.map +1 -0
  5. package/dist-cjs/breadcrumbs-next/BreadcrumbNext.js +99 -0
  6. package/dist-cjs/breadcrumbs-next/BreadcrumbNext.js.map +1 -0
  7. package/dist-cjs/breadcrumbs-next/BreadcrumbNextLabel.js +21 -0
  8. package/dist-cjs/breadcrumbs-next/BreadcrumbNextLabel.js.map +1 -0
  9. package/dist-cjs/breadcrumbs-next/BreadcrumbNextTrigger.js +55 -0
  10. package/dist-cjs/breadcrumbs-next/BreadcrumbNextTrigger.js.map +1 -0
  11. package/dist-cjs/breadcrumbs-next/BreadcrumbsNext.css.js +6 -0
  12. package/dist-cjs/breadcrumbs-next/BreadcrumbsNext.css.js.map +1 -0
  13. package/dist-cjs/breadcrumbs-next/BreadcrumbsNext.js +146 -0
  14. package/dist-cjs/breadcrumbs-next/BreadcrumbsNext.js.map +1 -0
  15. package/dist-cjs/breadcrumbs-next/internal/BreadcrumbNextContext.js +12 -0
  16. package/dist-cjs/breadcrumbs-next/internal/BreadcrumbNextContext.js.map +1 -0
  17. package/dist-cjs/breadcrumbs-next/internal/BreadcrumbOverflowDisclosure.js +236 -0
  18. package/dist-cjs/breadcrumbs-next/internal/BreadcrumbOverflowDisclosure.js.map +1 -0
  19. package/dist-cjs/breadcrumbs-next/internal/breadcrumbItems.js +21 -0
  20. package/dist-cjs/breadcrumbs-next/internal/breadcrumbItems.js.map +1 -0
  21. package/dist-cjs/index.js +8 -22
  22. package/dist-cjs/index.js.map +1 -1
  23. package/dist-es/breadcrumbs-next/BreadcrumbNext.css.js +4 -0
  24. package/dist-es/breadcrumbs-next/BreadcrumbNext.css.js.map +1 -0
  25. package/dist-es/breadcrumbs-next/BreadcrumbNext.js +97 -0
  26. package/dist-es/breadcrumbs-next/BreadcrumbNext.js.map +1 -0
  27. package/dist-es/breadcrumbs-next/BreadcrumbNextLabel.js +19 -0
  28. package/dist-es/breadcrumbs-next/BreadcrumbNextLabel.js.map +1 -0
  29. package/dist-es/breadcrumbs-next/BreadcrumbNextTrigger.js +53 -0
  30. package/dist-es/breadcrumbs-next/BreadcrumbNextTrigger.js.map +1 -0
  31. package/dist-es/breadcrumbs-next/BreadcrumbsNext.css.js +4 -0
  32. package/dist-es/breadcrumbs-next/BreadcrumbsNext.css.js.map +1 -0
  33. package/dist-es/breadcrumbs-next/BreadcrumbsNext.js +144 -0
  34. package/dist-es/breadcrumbs-next/BreadcrumbsNext.js.map +1 -0
  35. package/dist-es/breadcrumbs-next/internal/BreadcrumbNextContext.js +9 -0
  36. package/dist-es/breadcrumbs-next/internal/BreadcrumbNextContext.js.map +1 -0
  37. package/dist-es/breadcrumbs-next/internal/BreadcrumbOverflowDisclosure.js +234 -0
  38. package/dist-es/breadcrumbs-next/internal/BreadcrumbOverflowDisclosure.js.map +1 -0
  39. package/dist-es/breadcrumbs-next/internal/breadcrumbItems.js +19 -0
  40. package/dist-es/breadcrumbs-next/internal/breadcrumbItems.js.map +1 -0
  41. package/dist-es/index.js +4 -11
  42. package/dist-es/index.js.map +1 -1
  43. package/dist-types/breadcrumbs-next/BreadcrumbNext.d.ts +23 -0
  44. package/dist-types/breadcrumbs-next/BreadcrumbNextLabel.d.ts +4 -0
  45. package/dist-types/breadcrumbs-next/BreadcrumbNextTrigger.d.ts +8 -0
  46. package/dist-types/breadcrumbs-next/BreadcrumbsNext.d.ts +32 -0
  47. package/dist-types/breadcrumbs-next/index.d.ts +4 -0
  48. package/dist-types/breadcrumbs-next/internal/BreadcrumbNextContext.d.ts +14 -0
  49. package/dist-types/breadcrumbs-next/internal/BreadcrumbOverflowDisclosure.d.ts +9 -0
  50. package/dist-types/breadcrumbs-next/internal/breadcrumbItems.d.ts +9 -0
  51. package/dist-types/index.d.ts +1 -1
  52. package/package.json +3 -3
  53. package/dist-cjs/mega-menu/MegaMenu.js +0 -76
  54. package/dist-cjs/mega-menu/MegaMenu.js.map +0 -1
  55. package/dist-cjs/mega-menu/MegaMenuActions.css.js +0 -6
  56. package/dist-cjs/mega-menu/MegaMenuActions.css.js.map +0 -1
  57. package/dist-cjs/mega-menu/MegaMenuActions.js +0 -33
  58. package/dist-cjs/mega-menu/MegaMenuActions.js.map +0 -1
  59. package/dist-cjs/mega-menu/MegaMenuAside.css.js +0 -6
  60. package/dist-cjs/mega-menu/MegaMenuAside.css.js.map +0 -1
  61. package/dist-cjs/mega-menu/MegaMenuAside.js +0 -33
  62. package/dist-cjs/mega-menu/MegaMenuAside.js.map +0 -1
  63. package/dist-cjs/mega-menu/MegaMenuContent.css.js +0 -6
  64. package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +0 -1
  65. package/dist-cjs/mega-menu/MegaMenuContent.js +0 -25
  66. package/dist-cjs/mega-menu/MegaMenuContent.js.map +0 -1
  67. package/dist-cjs/mega-menu/MegaMenuContext.js +0 -11
  68. package/dist-cjs/mega-menu/MegaMenuContext.js.map +0 -1
  69. package/dist-cjs/mega-menu/MegaMenuGroup.css.js +0 -6
  70. package/dist-cjs/mega-menu/MegaMenuGroup.css.js.map +0 -1
  71. package/dist-cjs/mega-menu/MegaMenuGroup.js +0 -40
  72. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +0 -1
  73. package/dist-cjs/mega-menu/MegaMenuGroupContext.js +0 -17
  74. package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +0 -1
  75. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +0 -6
  76. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +0 -1
  77. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +0 -39
  78. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +0 -1
  79. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +0 -6
  80. package/dist-cjs/mega-menu/MegaMenuGroups.css.js.map +0 -1
  81. package/dist-cjs/mega-menu/MegaMenuGroups.js +0 -25
  82. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +0 -1
  83. package/dist-cjs/mega-menu/MegaMenuList.css.js +0 -6
  84. package/dist-cjs/mega-menu/MegaMenuList.css.js.map +0 -1
  85. package/dist-cjs/mega-menu/MegaMenuList.js +0 -43
  86. package/dist-cjs/mega-menu/MegaMenuList.js.map +0 -1
  87. package/dist-cjs/mega-menu/MegaMenuListItem.css.js +0 -6
  88. package/dist-cjs/mega-menu/MegaMenuListItem.css.js.map +0 -1
  89. package/dist-cjs/mega-menu/MegaMenuListItem.js +0 -45
  90. package/dist-cjs/mega-menu/MegaMenuListItem.js.map +0 -1
  91. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +0 -6
  92. package/dist-cjs/mega-menu/MegaMenuPanel.css.js.map +0 -1
  93. package/dist-cjs/mega-menu/MegaMenuPanel.js +0 -88
  94. package/dist-cjs/mega-menu/MegaMenuPanel.js.map +0 -1
  95. package/dist-cjs/mega-menu/MegaMenuTrigger.js +0 -90
  96. package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +0 -1
  97. package/dist-cjs/mega-menu/useMegaMenu.js +0 -15
  98. package/dist-cjs/mega-menu/useMegaMenu.js.map +0 -1
  99. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +0 -282
  100. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +0 -1
  101. package/dist-cjs/mega-menu/usePageMargin.js +0 -22
  102. package/dist-cjs/mega-menu/usePageMargin.js.map +0 -1
  103. package/dist-es/mega-menu/MegaMenu.js +0 -74
  104. package/dist-es/mega-menu/MegaMenu.js.map +0 -1
  105. package/dist-es/mega-menu/MegaMenuActions.css.js +0 -4
  106. package/dist-es/mega-menu/MegaMenuActions.css.js.map +0 -1
  107. package/dist-es/mega-menu/MegaMenuActions.js +0 -31
  108. package/dist-es/mega-menu/MegaMenuActions.js.map +0 -1
  109. package/dist-es/mega-menu/MegaMenuAside.css.js +0 -4
  110. package/dist-es/mega-menu/MegaMenuAside.css.js.map +0 -1
  111. package/dist-es/mega-menu/MegaMenuAside.js +0 -31
  112. package/dist-es/mega-menu/MegaMenuAside.js.map +0 -1
  113. package/dist-es/mega-menu/MegaMenuContent.css.js +0 -4
  114. package/dist-es/mega-menu/MegaMenuContent.css.js.map +0 -1
  115. package/dist-es/mega-menu/MegaMenuContent.js +0 -23
  116. package/dist-es/mega-menu/MegaMenuContent.js.map +0 -1
  117. package/dist-es/mega-menu/MegaMenuContext.js +0 -9
  118. package/dist-es/mega-menu/MegaMenuContext.js.map +0 -1
  119. package/dist-es/mega-menu/MegaMenuGroup.css.js +0 -4
  120. package/dist-es/mega-menu/MegaMenuGroup.css.js.map +0 -1
  121. package/dist-es/mega-menu/MegaMenuGroup.js +0 -38
  122. package/dist-es/mega-menu/MegaMenuGroup.js.map +0 -1
  123. package/dist-es/mega-menu/MegaMenuGroupContext.js +0 -14
  124. package/dist-es/mega-menu/MegaMenuGroupContext.js.map +0 -1
  125. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +0 -4
  126. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +0 -1
  127. package/dist-es/mega-menu/MegaMenuGroupHeading.js +0 -37
  128. package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +0 -1
  129. package/dist-es/mega-menu/MegaMenuGroups.css.js +0 -4
  130. package/dist-es/mega-menu/MegaMenuGroups.css.js.map +0 -1
  131. package/dist-es/mega-menu/MegaMenuGroups.js +0 -23
  132. package/dist-es/mega-menu/MegaMenuGroups.js.map +0 -1
  133. package/dist-es/mega-menu/MegaMenuList.css.js +0 -4
  134. package/dist-es/mega-menu/MegaMenuList.css.js.map +0 -1
  135. package/dist-es/mega-menu/MegaMenuList.js +0 -41
  136. package/dist-es/mega-menu/MegaMenuList.js.map +0 -1
  137. package/dist-es/mega-menu/MegaMenuListItem.css.js +0 -4
  138. package/dist-es/mega-menu/MegaMenuListItem.css.js.map +0 -1
  139. package/dist-es/mega-menu/MegaMenuListItem.js +0 -43
  140. package/dist-es/mega-menu/MegaMenuListItem.js.map +0 -1
  141. package/dist-es/mega-menu/MegaMenuPanel.css.js +0 -4
  142. package/dist-es/mega-menu/MegaMenuPanel.css.js.map +0 -1
  143. package/dist-es/mega-menu/MegaMenuPanel.js +0 -86
  144. package/dist-es/mega-menu/MegaMenuPanel.js.map +0 -1
  145. package/dist-es/mega-menu/MegaMenuTrigger.js +0 -88
  146. package/dist-es/mega-menu/MegaMenuTrigger.js.map +0 -1
  147. package/dist-es/mega-menu/useMegaMenu.js +0 -13
  148. package/dist-es/mega-menu/useMegaMenu.js.map +0 -1
  149. package/dist-es/mega-menu/useMegaMenuNavigation.js +0 -278
  150. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +0 -1
  151. package/dist-es/mega-menu/usePageMargin.js +0 -20
  152. package/dist-es/mega-menu/usePageMargin.js.map +0 -1
  153. package/dist-types/mega-menu/MegaMenu.d.ts +0 -36
  154. package/dist-types/mega-menu/MegaMenuActions.d.ts +0 -10
  155. package/dist-types/mega-menu/MegaMenuAside.d.ts +0 -9
  156. package/dist-types/mega-menu/MegaMenuContent.d.ts +0 -9
  157. package/dist-types/mega-menu/MegaMenuContext.d.ts +0 -28
  158. package/dist-types/mega-menu/MegaMenuGroup.d.ts +0 -9
  159. package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +0 -12
  160. package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +0 -13
  161. package/dist-types/mega-menu/MegaMenuGroups.d.ts +0 -8
  162. package/dist-types/mega-menu/MegaMenuList.d.ts +0 -16
  163. package/dist-types/mega-menu/MegaMenuListItem.d.ts +0 -25
  164. package/dist-types/mega-menu/MegaMenuPanel.d.ts +0 -8
  165. package/dist-types/mega-menu/MegaMenuTrigger.d.ts +0 -9
  166. package/dist-types/mega-menu/index.d.ts +0 -11
  167. package/dist-types/mega-menu/useMegaMenu.d.ts +0 -6
  168. package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +0 -16
  169. package/dist-types/mega-menu/usePageMargin.d.ts +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbNext.js","sources":["../src/breadcrumbs-next/BreadcrumbNext.tsx"],"sourcesContent":["import { makePrefixer, type RenderPropsType, useIcon } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport breadcrumbNextCss from \"./BreadcrumbNext.css\";\nimport { BreadcrumbNextLabel } from \"./BreadcrumbNextLabel\";\nimport { BreadcrumbNextTrigger } from \"./BreadcrumbNextTrigger\";\nimport {\n BreadcrumbNextContext,\n useBreadcrumbNextContext,\n} from \"./internal/BreadcrumbNextContext\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbNext\");\nconst withBreadcrumbsBaseName = makePrefixer(\"saltBreadcrumbsNext\");\n\nfunction isPrimitiveBreadcrumbLabel(children: ReactNode) {\n return (\n (typeof children === \"string\" && children.trim() !== \"\") ||\n typeof children === \"number\"\n );\n}\n\nfunction isMissingBreadcrumbContent(children: ReactNode) {\n const childArray = Children.toArray(children);\n\n return (\n childArray.length === 0 ||\n childArray.every(\n (child) => typeof child === \"string\" && child.trim() === \"\",\n )\n );\n}\n\nlet missingBreadcrumbContentWarningShown = false;\n\nfunction warnIfMissingBreadcrumbContent() {\n if (\n process.env.NODE_ENV === \"production\" ||\n missingBreadcrumbContentWarningShown\n ) {\n return;\n }\n\n missingBreadcrumbContentWarningShown = true;\n console.warn(\n \"BreadcrumbNext requires children to render a named breadcrumb item. Use text children for simple items or BreadcrumbNextTrigger with BreadcrumbNextLabel for composed items.\",\n );\n}\n\nexport interface BreadcrumbNextProps\n extends Omit<ComponentPropsWithoutRef<\"li\">, \"children\"> {\n /**\n * Custom breadcrumb content. Use this for advanced composition with\n * `BreadcrumbNextTrigger` and `BreadcrumbNextLabel`.\n */\n children?: ReactNode;\n /**\n * If `true`, the breadcrumb represents the current page.\n */\n current?: boolean;\n /**\n * The URL for the breadcrumb. Provide this for the current breadcrumb so it\n * renders as a focusable link with `aria-current=\"page\"`.\n */\n href?: string;\n /**\n * Render prop to enable customization of the underlying link element.\n */\n render?: RenderPropsType[\"render\"];\n}\n\nexport const BreadcrumbNext = forwardRef<HTMLLIElement, BreadcrumbNextProps>(\n function BreadcrumbNext(props, ref) {\n const {\n children,\n className,\n current: currentProp,\n href,\n render,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-breadcrumb-next\",\n css: breadcrumbNextCss,\n window: targetWindow,\n });\n\n const parentContext = useBreadcrumbNextContext();\n const current = parentContext?.current ?? Boolean(currentProp);\n const onNavigate = parentContext?.onNavigate;\n const placement = parentContext?.placement ?? \"trail\";\n const showSeparator = parentContext?.showSeparator ?? false;\n const triggerRef = parentContext?.triggerRef;\n const resolvedRender = render ?? parentContext?.render;\n const { LevelSeparatorIcon } = useIcon();\n const missingContent = isMissingBreadcrumbContent(children);\n\n if (missingContent) {\n warnIfMissingBreadcrumbContent();\n }\n\n const primitiveChildren = isPrimitiveBreadcrumbLabel(children)\n ? children\n : undefined;\n const content = missingContent ? null : primitiveChildren !== undefined ? (\n <BreadcrumbNextTrigger>\n <BreadcrumbNextLabel>{primitiveChildren}</BreadcrumbNextLabel>\n </BreadcrumbNextTrigger>\n ) : (\n children\n );\n const context = {\n current,\n href,\n onNavigate,\n placement,\n render: resolvedRender,\n showSeparator,\n triggerRef,\n };\n\n return (\n <li\n ref={ref}\n className={clsx(\n placement === \"disclosure\"\n ? withBreadcrumbsBaseName(\"disclosureListItem\")\n : withBaseName(),\n className,\n )}\n {...rest}\n >\n <BreadcrumbNextContext.Provider value={context}>\n {content}\n {placement === \"trail\" && showSeparator ? (\n <LevelSeparatorIcon\n aria-hidden\n className={withBaseName(\"separator\")}\n />\n ) : null}\n </BreadcrumbNextContext.Provider>\n </li>\n );\n },\n);\n"],"names":["BreadcrumbNext","breadcrumbNextCss"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer } from '@salt-ds/core';
3
+ import { clsx } from 'clsx';
4
+ import { forwardRef } from 'react';
5
+
6
+ const withBaseName = makePrefixer("saltBreadcrumbNext");
7
+ const BreadcrumbNextLabel = forwardRef(function BreadcrumbNextLabel2({ className, ...rest }, ref) {
8
+ return /* @__PURE__ */ jsx(
9
+ "span",
10
+ {
11
+ ref,
12
+ className: clsx(withBaseName("label"), className),
13
+ ...rest
14
+ }
15
+ );
16
+ });
17
+
18
+ export { BreadcrumbNextLabel };
19
+ //# sourceMappingURL=BreadcrumbNextLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbNextLabel.js","sources":["../src/breadcrumbs-next/BreadcrumbNextLabel.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbNext\");\n\nexport interface BreadcrumbNextLabelProps\n extends ComponentPropsWithoutRef<\"span\"> {}\n\nexport const BreadcrumbNextLabel = forwardRef<\n HTMLSpanElement,\n BreadcrumbNextLabelProps\n>(function BreadcrumbNextLabel({ className, ...rest }, ref) {\n return (\n <span\n ref={ref}\n className={clsx(withBaseName(\"label\"), className)}\n {...rest}\n />\n );\n});\n"],"names":["BreadcrumbNextLabel"],"mappings":";;;;;AAIA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAK/C,MAAM,mBAAA,GAAsB,WAGjC,SAASA,oBAAAA,CAAoB,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AAC1D,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,SAAS,CAAA;AAAA,MAC/C,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;;;;"}
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, useForkRef, Link } from '@salt-ds/core';
3
+ import { clsx } from 'clsx';
4
+ import { forwardRef } from 'react';
5
+ import { useBreadcrumbNextContext } from './internal/BreadcrumbNextContext.js';
6
+
7
+ const withBaseName = makePrefixer("saltBreadcrumbNext");
8
+ const withBreadcrumbsBaseName = makePrefixer("saltBreadcrumbsNext");
9
+ const BreadcrumbNextTrigger = forwardRef(function BreadcrumbNextTrigger2(props, ref) {
10
+ const { children, className, onClick, ...rest } = props;
11
+ const context = useBreadcrumbNextContext();
12
+ if (!context) {
13
+ throw new Error(
14
+ "BreadcrumbNextTrigger must be rendered inside BreadcrumbNext"
15
+ );
16
+ }
17
+ const { current, href, onNavigate, placement, render, triggerRef } = context;
18
+ const handleRef = useForkRef(ref, triggerRef);
19
+ const isDisclosure = placement === "disclosure";
20
+ const triggerClassName = clsx(
21
+ isDisclosure ? withBreadcrumbsBaseName("disclosureItem") : withBaseName("trigger"),
22
+ className
23
+ );
24
+ const isNavigable = href !== void 0;
25
+ const handleClick = (event) => {
26
+ onClick == null ? void 0 : onClick(event);
27
+ if (isDisclosure || !event.defaultPrevented) {
28
+ onNavigate == null ? void 0 : onNavigate();
29
+ }
30
+ };
31
+ return /* @__PURE__ */ jsx(
32
+ Link,
33
+ {
34
+ "aria-current": current ? "page" : void 0,
35
+ className: clsx(triggerClassName, {
36
+ [withBaseName("link")]: isNavigable,
37
+ [withBaseName("current")]: current
38
+ }),
39
+ color: isDisclosure ? "inherit" : void 0,
40
+ href,
41
+ onClick: isNavigable ? handleClick : onClick,
42
+ ref: handleRef,
43
+ render: isNavigable ? render : void 0,
44
+ styleAs: "label",
45
+ underline: current || !isNavigable || isDisclosure ? "never" : void 0,
46
+ ...rest,
47
+ children
48
+ }
49
+ );
50
+ });
51
+
52
+ export { BreadcrumbNextTrigger };
53
+ //# sourceMappingURL=BreadcrumbNextTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbNextTrigger.js","sources":["../src/breadcrumbs-next/BreadcrumbNextTrigger.tsx"],"sourcesContent":["import { Link, makePrefixer, useForkRef } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEventHandler,\n type ReactNode,\n} from \"react\";\nimport { useBreadcrumbNextContext } from \"./internal/BreadcrumbNextContext\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbNext\");\nconst withBreadcrumbsBaseName = makePrefixer(\"saltBreadcrumbsNext\");\n\nexport interface BreadcrumbNextTriggerProps\n extends Omit<ComponentPropsWithoutRef<\"a\">, \"children\" | \"color\" | \"href\"> {\n /**\n * Breadcrumb trigger content.\n */\n children?: ReactNode;\n}\n\nexport const BreadcrumbNextTrigger = forwardRef<\n HTMLAnchorElement,\n BreadcrumbNextTriggerProps\n>(function BreadcrumbNextTrigger(props, ref) {\n const { children, className, onClick, ...rest } = props;\n const context = useBreadcrumbNextContext();\n\n if (!context) {\n throw new Error(\n \"BreadcrumbNextTrigger must be rendered inside BreadcrumbNext\",\n );\n }\n\n const { current, href, onNavigate, placement, render, triggerRef } = context;\n const handleRef = useForkRef(ref, triggerRef);\n const isDisclosure = placement === \"disclosure\";\n const triggerClassName = clsx(\n isDisclosure\n ? withBreadcrumbsBaseName(\"disclosureItem\")\n : withBaseName(\"trigger\"),\n className,\n );\n const isNavigable = href !== undefined;\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (event) => {\n onClick?.(event);\n\n if (isDisclosure || !event.defaultPrevented) {\n onNavigate?.();\n }\n };\n\n return (\n <Link\n aria-current={current ? \"page\" : undefined}\n className={clsx(triggerClassName, {\n [withBaseName(\"link\")]: isNavigable,\n [withBaseName(\"current\")]: current,\n })}\n color={isDisclosure ? \"inherit\" : undefined}\n href={href}\n onClick={isNavigable ? handleClick : onClick}\n ref={handleRef}\n render={isNavigable ? render : undefined}\n styleAs=\"label\"\n underline={current || !isNavigable || isDisclosure ? \"never\" : undefined}\n {...rest}\n >\n {children}\n </Link>\n );\n});\n"],"names":["BreadcrumbNextTrigger"],"mappings":";;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AACtD,MAAM,uBAAA,GAA0B,aAAa,qBAAqB,CAAA;AAU3D,MAAM,qBAAA,GAAwB,UAAA,CAGnC,SAASA,sBAAAA,CAAsB,OAAO,GAAA,EAAK;AAC3C,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AAClD,EAAA,MAAM,UAAU,wBAAA,EAAyB;AAEzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,YAAY,SAAA,EAAW,MAAA,EAAQ,YAAW,GAAI,OAAA;AACrE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,EAAK,UAAU,CAAA;AAC5C,EAAA,MAAM,eAAe,SAAA,KAAc,YAAA;AACnC,EAAA,MAAM,gBAAA,GAAmB,IAAA;AAAA,IACvB,YAAA,GACI,uBAAA,CAAwB,gBAAgB,CAAA,GACxC,aAAa,SAAS,CAAA;AAAA,IAC1B;AAAA,GACF;AACA,EAAA,MAAM,cAAc,IAAA,KAAS,MAAA;AAC7B,EAAA,MAAM,WAAA,GAAoD,CAAC,KAAA,KAAU;AACnE,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAEV,IAAA,IAAI,YAAA,IAAgB,CAAC,KAAA,CAAM,gBAAA,EAAkB;AAC3C,MAAA,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,EAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,MACjC,SAAA,EAAW,KAAK,gBAAA,EAAkB;AAAA,QAChC,CAAC,YAAA,CAAa,MAAM,CAAC,GAAG,WAAA;AAAA,QACxB,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG;AAAA,OAC5B,CAAA;AAAA,MACD,KAAA,EAAO,eAAe,SAAA,GAAY,MAAA;AAAA,MAClC,IAAA;AAAA,MACA,OAAA,EAAS,cAAc,WAAA,GAAc,OAAA;AAAA,MACrC,GAAA,EAAK,SAAA;AAAA,MACL,MAAA,EAAQ,cAAc,MAAA,GAAS,MAAA;AAAA,MAC/B,OAAA,EAAQ,OAAA;AAAA,MACR,SAAA,EAAW,OAAA,IAAW,CAAC,WAAA,IAAe,eAAe,OAAA,GAAU,MAAA;AAAA,MAC9D,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltBreadcrumbsNext {\n display: block;\n margin-block: var(--salt-spacing-25);\n}\n\n.saltBreadcrumbsNext-ol {\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--salt-spacing-100);\n justify-content: flex-start;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.saltBreadcrumbsNext-ol-wrap {\n flex-wrap: wrap;\n}\n\n.saltBreadcrumbsNext-collapseItem {\n align-items: center;\n display: inline-flex;\n flex: 0 1 auto;\n gap: var(--salt-spacing-100);\n list-style: none;\n min-width: 0;\n}\n\n.saltBreadcrumbsNext-collapseButton[aria-expanded=\"true\"] {\n background: var(--saltButton-background-active, var(--button-background-active));\n border-color: var(--saltButton-borderColor-active, var(--button-borderColor-active));\n color: var(--saltButton-text-color-active, var(--button-text-color-active));\n cursor: var(--salt-cursor-active);\n}\n\n.saltBreadcrumbsNext-disclosure {\n background: var(--salt-container-primary-background);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n overflow: hidden;\n overflow-y: auto;\n min-width: 10em;\n position: relative;\n z-index: var(--salt-zIndex-flyover);\n box-shadow: var(--salt-overlayable-shadow-popout);\n box-sizing: border-box;\n border-radius: var(--salt-palette-corner, 0);\n}\n\n.saltBreadcrumbsNext-disclosureList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.saltBreadcrumbsNext-disclosureListItem {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.saltBreadcrumbsNext-disclosureItem {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n font-family: var(--salt-text-fontFamily);\n line-height: var(--salt-text-lineHeight);\n letter-spacing: var(--salt-text-letterSpacing);\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding: calc(var(--salt-spacing-100) + var(--salt-spacing-25)) var(--salt-spacing-100);\n display: flex;\n gap: var(--salt-spacing-100);\n position: relative;\n cursor: var(--salt-cursor-hover);\n box-sizing: border-box;\n flex-shrink: 0;\n text-decoration: none;\n width: 100%;\n}\n\n.saltBreadcrumbsNext-disclosureItem.saltLink {\n --link-color: var(--salt-content-primary-foreground);\n --link-color-hover: var(--salt-content-primary-foreground);\n --link-color-active: var(--salt-content-primary-foreground);\n --link-color-focus: var(--salt-content-primary-foreground);\n --link-color-visited: var(--salt-content-primary-foreground);\n --link-textDecoration: var(--salt-typography-textDecoration-none);\n --link-textDecoration-hover: var(--salt-typography-textDecoration-none);\n --link-textDecoration-active: var(--salt-typography-textDecoration-none);\n --link-textDecoration-focus: var(--salt-typography-textDecoration-none);\n --link-textDecoration-visited: var(--salt-typography-textDecoration-none);\n}\n\n.saltBreadcrumbsNext-disclosureItem.saltLink:focus:not(:focus-visible) {\n outline: none;\n}\n\n.saltBreadcrumbsNext-disclosureItem:focus-visible,\n.saltBreadcrumbsNext-disclosureItem.saltLink:focus-visible {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-fixed-100) * -2);\n}\n\n.saltBreadcrumbsNext-disclosureItem:hover {\n outline: none;\n}\n\n.saltBreadcrumbsNext-disclosureItem:hover,\n.saltBreadcrumbsNext-disclosureItem:focus-visible {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltBreadcrumbsNext-disclosureItem:active {\n background: var(--salt-selectable-background-selected);\n box-shadow:\n 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected),\n 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);\n}\n\n.saltBreadcrumbsNext-disclosureItem[aria-disabled=\"true\"],\n.saltBreadcrumbsNext-disclosureItem[aria-disabled=\"true\"]:active {\n background: var(--salt-selectable-background-disabled);\n color: var(--salt-content-primary-foreground-disabled);\n cursor: var(--salt-cursor-disabled);\n box-shadow: none;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=BreadcrumbsNext.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsNext.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,144 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { makePrefixer, useIcon } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef, isValidElement } from 'react';
7
+ import { BreadcrumbNext } from './BreadcrumbNext.js';
8
+ import css_248z from './BreadcrumbsNext.css.js';
9
+ import { BreadcrumbNextContext } from './internal/BreadcrumbNextContext.js';
10
+ import { BreadcrumbOverflowDisclosure } from './internal/BreadcrumbOverflowDisclosure.js';
11
+ import { flattenBreadcrumbItems } from './internal/breadcrumbItems.js';
12
+
13
+ const withBaseName = makePrefixer("saltBreadcrumbsNext");
14
+ const withItemBaseName = makePrefixer("saltBreadcrumbNext");
15
+ function isBreadcrumbNextElement(child) {
16
+ return isValidElement(child) && child.type === BreadcrumbNext;
17
+ }
18
+ function getCurrentIndex(items) {
19
+ const explicitCurrentIndex = items.findIndex(({ props }) => props.current);
20
+ return explicitCurrentIndex === -1 ? Math.max(items.length - 1, 0) : explicitCurrentIndex;
21
+ }
22
+ function getCollapseRange({
23
+ currentIndex,
24
+ items,
25
+ itemsAfterCollapse,
26
+ itemsBeforeCollapse
27
+ }) {
28
+ const itemCount = items.length;
29
+ const effectiveItemsAfterCollapse = Math.max(
30
+ itemsAfterCollapse,
31
+ itemCount - currentIndex
32
+ );
33
+ if (itemsBeforeCollapse + effectiveItemsAfterCollapse >= itemCount) {
34
+ return void 0;
35
+ }
36
+ const hiddenStart = itemsBeforeCollapse;
37
+ const hiddenEnd = itemCount - effectiveItemsAfterCollapse;
38
+ const hiddenItems = items.slice(hiddenStart, hiddenEnd);
39
+ return {
40
+ hiddenItems,
41
+ visibleAfter: items.slice(hiddenEnd),
42
+ visibleBefore: items.slice(0, hiddenStart)
43
+ };
44
+ }
45
+ function renderSeparator(SeparatorIcon) {
46
+ return /* @__PURE__ */ jsx(SeparatorIcon, { "aria-hidden": true, className: withItemBaseName("separator") });
47
+ }
48
+ const BreadcrumbsNext = forwardRef(
49
+ function BreadcrumbsNext2(props, ref) {
50
+ const {
51
+ children,
52
+ className,
53
+ itemsAfterCollapse = 1,
54
+ itemsBeforeCollapse = 1,
55
+ maxItems,
56
+ render,
57
+ wrap = false,
58
+ ...rest
59
+ } = props;
60
+ const targetWindow = useWindow();
61
+ const { LevelSeparatorIcon } = useIcon();
62
+ useComponentCssInjection({
63
+ testId: "salt-breadcrumbs-next",
64
+ css: css_248z,
65
+ window: targetWindow
66
+ });
67
+ const items = flattenBreadcrumbItems(children).filter(isBreadcrumbNextElement).map((element, index) => ({
68
+ element,
69
+ index,
70
+ key: element.key ?? index,
71
+ props: element.props
72
+ }));
73
+ const currentIndex = getCurrentIndex(items);
74
+ const shouldCollapse = !wrap && maxItems !== void 0 && items.length > maxItems;
75
+ const collapseRange = shouldCollapse ? getCollapseRange({
76
+ currentIndex,
77
+ items,
78
+ itemsAfterCollapse,
79
+ itemsBeforeCollapse
80
+ }) : void 0;
81
+ const renderParts = collapseRange ? [
82
+ ...collapseRange.visibleBefore.map(
83
+ (item) => ({ item, type: "breadcrumb" })
84
+ ),
85
+ {
86
+ hiddenItems: collapseRange.hiddenItems,
87
+ type: "collapse"
88
+ },
89
+ ...collapseRange.visibleAfter.map(
90
+ (item) => ({ item, type: "breadcrumb" })
91
+ )
92
+ ] : items.map((item) => ({ item, type: "breadcrumb" }));
93
+ return /* @__PURE__ */ jsx("nav", { ref, className: clsx(withBaseName(), className), ...rest, children: /* @__PURE__ */ jsx(
94
+ "ol",
95
+ {
96
+ className: clsx(withBaseName("ol"), {
97
+ [withBaseName("ol-wrap")]: wrap
98
+ }),
99
+ children: renderParts.map((part, index) => {
100
+ const showSeparator = index < renderParts.length - 1;
101
+ if (part.type === "collapse") {
102
+ return /* @__PURE__ */ jsxs(
103
+ "li",
104
+ {
105
+ className: clsx(
106
+ withItemBaseName(),
107
+ withBaseName("collapseItem")
108
+ ),
109
+ children: [
110
+ /* @__PURE__ */ jsx(
111
+ BreadcrumbOverflowDisclosure,
112
+ {
113
+ currentIndex,
114
+ items: part.hiddenItems,
115
+ render
116
+ }
117
+ ),
118
+ showSeparator ? renderSeparator(LevelSeparatorIcon) : null
119
+ ]
120
+ },
121
+ "breadcrumbs-next-collapse"
122
+ );
123
+ }
124
+ return /* @__PURE__ */ jsx(
125
+ BreadcrumbNextContext.Provider,
126
+ {
127
+ value: {
128
+ current: part.item.index === currentIndex,
129
+ placement: "trail",
130
+ render,
131
+ showSeparator
132
+ },
133
+ children: part.item.element
134
+ },
135
+ part.item.key
136
+ );
137
+ })
138
+ }
139
+ ) });
140
+ }
141
+ );
142
+
143
+ export { BreadcrumbsNext };
144
+ //# sourceMappingURL=BreadcrumbsNext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsNext.js","sources":["../src/breadcrumbs-next/BreadcrumbsNext.tsx"],"sourcesContent":["import { makePrefixer, type RenderPropsType, useIcon } from \"@salt-ds/core\";\nimport { 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 { BreadcrumbNext, type BreadcrumbNextProps } from \"./BreadcrumbNext\";\nimport breadcrumbsNextCss from \"./BreadcrumbsNext.css\";\nimport { BreadcrumbNextContext } from \"./internal/BreadcrumbNextContext\";\nimport { BreadcrumbOverflowDisclosure } from \"./internal/BreadcrumbOverflowDisclosure\";\nimport {\n flattenBreadcrumbItems,\n type NormalizedBreadcrumb,\n} from \"./internal/breadcrumbItems\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbsNext\");\nconst withItemBaseName = makePrefixer(\"saltBreadcrumbNext\");\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 BreadcrumbsNextProps\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 isBreadcrumbNextElement(\n child: ReactNode,\n): child is ReactElement<BreadcrumbNextProps> {\n return (\n isValidElement<BreadcrumbNextProps>(child) && child.type === BreadcrumbNext\n );\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 BreadcrumbsNext = forwardRef<HTMLElement, BreadcrumbsNextProps>(\n function BreadcrumbsNext(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-next\",\n css: breadcrumbsNextCss,\n window: targetWindow,\n });\n\n const items = flattenBreadcrumbItems(children)\n .filter(isBreadcrumbNextElement)\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-next-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 <BreadcrumbNextContext.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 </BreadcrumbNextContext.Provider>\n );\n })}\n </ol>\n </nav>\n );\n },\n);\n"],"names":["BreadcrumbsNext","breadcrumbsNextCss"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const BreadcrumbNextContext = createContext(void 0);
4
+ function useBreadcrumbNextContext() {
5
+ return useContext(BreadcrumbNextContext);
6
+ }
7
+
8
+ export { BreadcrumbNextContext, useBreadcrumbNextContext };
9
+ //# sourceMappingURL=BreadcrumbNextContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbNextContext.js","sources":["../src/breadcrumbs-next/internal/BreadcrumbNextContext.ts"],"sourcesContent":["import type { RenderPropsType } from \"@salt-ds/core\";\nimport { createContext, type Ref, useContext } from \"react\";\n\nexport type BreadcrumbNextPlacement = \"disclosure\" | \"trail\";\n\nexport interface BreadcrumbNextContextValue {\n current: boolean;\n href?: string;\n onNavigate?: () => void;\n placement: BreadcrumbNextPlacement;\n render?: RenderPropsType[\"render\"];\n showSeparator: boolean;\n triggerRef?: Ref<HTMLAnchorElement>;\n}\n\nexport const BreadcrumbNextContext = createContext<\n BreadcrumbNextContextValue | undefined\n>(undefined);\n\nexport function useBreadcrumbNextContext() {\n return useContext(BreadcrumbNextContext);\n}\n"],"names":[],"mappings":";;AAeO,MAAM,qBAAA,GAAwB,cAEnC,MAAS;AAEJ,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAO,WAAW,qBAAqB,CAAA;AACzC;;;;"}
@@ -0,0 +1,234 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { offset, size, flip, shift, useInteractions, useClick, useDismiss } from '@floating-ui/react';
3
+ import { makePrefixer, useId, useFloatingComponent, useFloatingUI, useForkRef, Button } from '@salt-ds/core';
4
+ import { OverflowMenuIcon } from '@salt-ds/icons';
5
+ import { useWindow } from '@salt-ds/window';
6
+ import { useState, useRef, useCallback } from 'react';
7
+ import { BreadcrumbNextContext } from './BreadcrumbNextContext.js';
8
+
9
+ const withBaseName = makePrefixer("saltBreadcrumbsNext");
10
+ function BreadcrumbOverflowDisclosure({
11
+ currentIndex,
12
+ items,
13
+ render
14
+ }) {
15
+ var _a, _b;
16
+ const [open, setOpen] = useState(false);
17
+ const targetWindow = useWindow();
18
+ const itemElements = useRef(/* @__PURE__ */ new Map());
19
+ const triggerRef = useRef(null);
20
+ const disclosureId = useId();
21
+ const { Component: FloatingComponent } = useFloatingComponent();
22
+ const focusTrigger = useCallback(() => {
23
+ targetWindow == null ? void 0 : targetWindow.requestAnimationFrame(() => {
24
+ var _a2;
25
+ (_a2 = triggerRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
26
+ });
27
+ }, [targetWindow]);
28
+ const getFocusableItems = useCallback(
29
+ () => items.map((_, index) => itemElements.current.get(index)).filter((item) => item !== void 0),
30
+ [items]
31
+ );
32
+ const focusItem = useCallback(
33
+ (position) => {
34
+ const focusableItems = getFocusableItems();
35
+ const item = position === "first" ? focusableItems[0] : focusableItems[focusableItems.length - 1];
36
+ item == null ? void 0 : item.focus({ preventScroll: true });
37
+ return item !== void 0;
38
+ },
39
+ [getFocusableItems]
40
+ );
41
+ const focusItemByOffset = useCallback(
42
+ (offset2) => {
43
+ var _a2;
44
+ const focusableItems = getFocusableItems();
45
+ const activeIndex = focusableItems.indexOf(
46
+ targetWindow == null ? void 0 : targetWindow.document.activeElement
47
+ );
48
+ if (activeIndex === -1) {
49
+ return focusItem(offset2 > 0 ? "first" : "last");
50
+ }
51
+ const nextIndex = Math.min(
52
+ Math.max(activeIndex + offset2, 0),
53
+ focusableItems.length - 1
54
+ );
55
+ (_a2 = focusableItems[nextIndex]) == null ? void 0 : _a2.focus({ preventScroll: true });
56
+ return focusableItems[nextIndex] !== void 0;
57
+ },
58
+ [focusItem, getFocusableItems, targetWindow]
59
+ );
60
+ const { context, elements, refs, strategy, x, y } = useFloatingUI({
61
+ open,
62
+ onOpenChange(nextOpen, _event, reason) {
63
+ setOpen(nextOpen);
64
+ if (!nextOpen && reason === "escape-key") {
65
+ focusTrigger();
66
+ }
67
+ },
68
+ placement: "bottom-start",
69
+ middleware: [
70
+ offset(1),
71
+ size({
72
+ apply({ availableHeight, elements: elements2 }) {
73
+ Object.assign(elements2.floating.style, {
74
+ maxHeight: `${availableHeight}px`
75
+ });
76
+ }
77
+ }),
78
+ flip(),
79
+ shift({
80
+ padding: 8
81
+ })
82
+ ]
83
+ });
84
+ const { getFloatingProps, getReferenceProps } = useInteractions([
85
+ useClick(context),
86
+ useDismiss(context)
87
+ ]);
88
+ const handleTriggerRef = useForkRef(
89
+ triggerRef,
90
+ refs.setReference
91
+ );
92
+ const handleTriggerKeyDown = (event) => {
93
+ if (open && (event.key === "ArrowDown" || event.key === "ArrowRight")) {
94
+ event.preventDefault();
95
+ focusItem("first");
96
+ return;
97
+ }
98
+ if (open && (event.key === "ArrowUp" || event.key === "ArrowLeft")) {
99
+ event.preventDefault();
100
+ focusItem("last");
101
+ return;
102
+ }
103
+ if (event.key === "Tab" && open && !event.shiftKey) {
104
+ if (focusItem("first")) {
105
+ event.preventDefault();
106
+ }
107
+ return;
108
+ }
109
+ };
110
+ const handleTriggerBlur = (event) => {
111
+ var _a2;
112
+ const nextFocusedElement = event.relatedTarget;
113
+ if (nextFocusedElement && ((_a2 = elements.floating) == null ? void 0 : _a2.contains(nextFocusedElement))) {
114
+ return;
115
+ }
116
+ setOpen(false);
117
+ };
118
+ const handleDisclosureKeyDown = (event) => {
119
+ if (event.key === "Tab") {
120
+ const focusableItems = getFocusableItems();
121
+ const activeIndex = focusableItems.indexOf(
122
+ targetWindow == null ? void 0 : targetWindow.document.activeElement
123
+ );
124
+ const shouldReturnToTrigger = event.shiftKey ? activeIndex === 0 : activeIndex === focusableItems.length - 1;
125
+ if (shouldReturnToTrigger) {
126
+ event.preventDefault();
127
+ setOpen(false);
128
+ focusTrigger();
129
+ }
130
+ return;
131
+ }
132
+ if (event.key === "ArrowDown" || event.key === "ArrowRight") {
133
+ event.preventDefault();
134
+ focusItemByOffset(1);
135
+ return;
136
+ }
137
+ if (event.key === "ArrowUp" || event.key === "ArrowLeft") {
138
+ event.preventDefault();
139
+ focusItemByOffset(-1);
140
+ return;
141
+ }
142
+ if (event.key === "Home") {
143
+ event.preventDefault();
144
+ focusItem("first");
145
+ return;
146
+ }
147
+ if (event.key === "End") {
148
+ event.preventDefault();
149
+ focusItem("last");
150
+ }
151
+ };
152
+ const handleDisclosureBlur = (event) => {
153
+ var _a2;
154
+ const nextFocusedElement = event.relatedTarget;
155
+ if (nextFocusedElement && (event.currentTarget.contains(nextFocusedElement) || ((_a2 = triggerRef.current) == null ? void 0 : _a2.contains(nextFocusedElement)))) {
156
+ return;
157
+ }
158
+ setOpen(false);
159
+ };
160
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
161
+ /* @__PURE__ */ jsx(
162
+ Button,
163
+ {
164
+ "aria-controls": disclosureId,
165
+ "aria-expanded": open,
166
+ "aria-label": "Additional breadcrumbs",
167
+ appearance: "transparent",
168
+ className: withBaseName("collapseButton"),
169
+ ref: handleTriggerRef,
170
+ ...getReferenceProps({
171
+ onBlur: handleTriggerBlur,
172
+ onKeyDown: handleTriggerKeyDown
173
+ }),
174
+ children: /* @__PURE__ */ jsx(OverflowMenuIcon, { "aria-hidden": true })
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsx(
178
+ FloatingComponent,
179
+ {
180
+ className: withBaseName("disclosure"),
181
+ focusManagerProps: context ? {
182
+ closeOnFocusOut: true,
183
+ context,
184
+ initialFocus: -1,
185
+ modal: false,
186
+ returnFocus: false
187
+ } : void 0,
188
+ height: (_a = elements.floating) == null ? void 0 : _a.offsetHeight,
189
+ left: x ?? 0,
190
+ open,
191
+ position: strategy,
192
+ ref: refs.setFloating,
193
+ top: y ?? 0,
194
+ width: (_b = elements.floating) == null ? void 0 : _b.offsetWidth,
195
+ ...getFloatingProps({
196
+ id: disclosureId,
197
+ onBlur: handleDisclosureBlur,
198
+ onKeyDown: handleDisclosureKeyDown
199
+ }),
200
+ children: /* @__PURE__ */ jsx(
201
+ "ol",
202
+ {
203
+ "aria-label": "Hidden breadcrumb levels",
204
+ className: withBaseName("disclosureList"),
205
+ children: items.map((item, index) => /* @__PURE__ */ jsx(
206
+ BreadcrumbNextContext.Provider,
207
+ {
208
+ value: {
209
+ current: item.index === currentIndex,
210
+ onNavigate: () => setOpen(false),
211
+ placement: "disclosure",
212
+ render,
213
+ showSeparator: false,
214
+ triggerRef: (element) => {
215
+ if ((element == null ? void 0 : element.tagName) === "A" && element.hasAttribute("href")) {
216
+ itemElements.current.set(index, element);
217
+ } else {
218
+ itemElements.current.delete(index);
219
+ }
220
+ }
221
+ },
222
+ children: item.element
223
+ },
224
+ item.key
225
+ ))
226
+ }
227
+ )
228
+ }
229
+ )
230
+ ] });
231
+ }
232
+
233
+ export { BreadcrumbOverflowDisclosure };
234
+ //# sourceMappingURL=BreadcrumbOverflowDisclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbOverflowDisclosure.js","sources":["../src/breadcrumbs-next/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 {\n Button,\n makePrefixer,\n type RenderPropsType,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n} from \"@salt-ds/core\";\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 { BreadcrumbNextContext } from \"./BreadcrumbNextContext\";\nimport type { NormalizedBreadcrumb } from \"./breadcrumbItems\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbsNext\");\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 <BreadcrumbNextContext.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 </BreadcrumbNextContext.Provider>\n ))}\n </ol>\n </FloatingComponent>\n </>\n );\n}\n"],"names":["_a","offset","elements"],"mappings":"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"}
@@ -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-next/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 { BreadcrumbNextProps } from \"../BreadcrumbNext\";\n\nexport interface NormalizedBreadcrumb {\n element: ReactElement<BreadcrumbNextProps>;\n index: number;\n key: Key;\n props: BreadcrumbNextProps;\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;;;;"}
package/dist-es/index.js CHANGED
@@ -1,6 +1,10 @@
1
1
  export { AppHeader } from './app-header/AppHeader.js';
2
2
  export { Breadcrumb } from './breadcrumbs/Breadcrumb.js';
3
3
  export { Breadcrumbs } from './breadcrumbs/Breadcrumbs.js';
4
+ export { BreadcrumbNext } from './breadcrumbs-next/BreadcrumbNext.js';
5
+ export { BreadcrumbNextLabel } from './breadcrumbs-next/BreadcrumbNextLabel.js';
6
+ export { BreadcrumbNextTrigger } from './breadcrumbs-next/BreadcrumbNextTrigger.js';
7
+ export { BreadcrumbsNext } from './breadcrumbs-next/BreadcrumbsNext.js';
4
8
  export { ButtonBar, DefaultButtonsOrderByVariant } from './button-bar/ButtonBar.js';
5
9
  export { OrderedButton } from './button-bar/OrderedButton.js';
6
10
  export { CascadingMenu } from './cascading-menu/CascadingMenu.js';
@@ -76,17 +80,6 @@ export { ListNext } from './list-next/ListNext.js';
76
80
  export { Logo } from './logo/Logo.js';
77
81
  export { LogoImage } from './logo/LogoImage.js';
78
82
  export { LogoSeparator } from './logo/LogoSeparator.js';
79
- export { MegaMenu } from './mega-menu/MegaMenu.js';
80
- export { MegaMenuActions } from './mega-menu/MegaMenuActions.js';
81
- export { MegaMenuAside } from './mega-menu/MegaMenuAside.js';
82
- export { MegaMenuContent } from './mega-menu/MegaMenuContent.js';
83
- export { MegaMenuGroup } from './mega-menu/MegaMenuGroup.js';
84
- export { MegaMenuGroupHeading } from './mega-menu/MegaMenuGroupHeading.js';
85
- export { MegaMenuGroups } from './mega-menu/MegaMenuGroups.js';
86
- export { MegaMenuList } from './mega-menu/MegaMenuList.js';
87
- export { MegaMenuListItem } from './mega-menu/MegaMenuListItem.js';
88
- export { MegaMenuPanel } from './mega-menu/MegaMenuPanel.js';
89
- export { MegaMenuTrigger } from './mega-menu/MegaMenuTrigger.js';
90
83
  export { MenuButton } from './menu-button/MenuButton.js';
91
84
  export { Metric } from './metric/Metric.js';
92
85
  export { MetricContent } from './metric/MetricContent.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}