@hjmds/react 1.15.0 → 1.16.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 (44) hide show
  1. package/README.md +5 -0
  2. package/dist/collection-rail.d.ts +24 -0
  3. package/dist/collection-rail.d.ts.map +1 -0
  4. package/dist/collection-rail.js +109 -0
  5. package/dist/collection-rail.js.map +1 -0
  6. package/dist/effect-surface.d.ts.map +1 -1
  7. package/dist/effect-surface.js +4 -3
  8. package/dist/effect-surface.js.map +1 -1
  9. package/dist/evidence.d.ts +1 -1
  10. package/dist/evidence.js +1 -1
  11. package/dist/evidence.js.map +1 -1
  12. package/dist/floating-action-button.d.ts.map +1 -1
  13. package/dist/floating-action-button.js +4 -1
  14. package/dist/floating-action-button.js.map +1 -1
  15. package/dist/internal.d.ts +1 -4
  16. package/dist/internal.d.ts.map +1 -1
  17. package/dist/layout.d.ts +5 -1
  18. package/dist/layout.d.ts.map +1 -1
  19. package/dist/layout.js +6 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/menubar.d.ts.map +1 -1
  22. package/dist/menubar.js +2 -1
  23. package/dist/menubar.js.map +1 -1
  24. package/dist/provider.d.ts.map +1 -1
  25. package/dist/provider.js +3 -0
  26. package/dist/provider.js.map +1 -1
  27. package/dist/sidebar.d.ts.map +1 -1
  28. package/dist/sidebar.js +2 -1
  29. package/dist/sidebar.js.map +1 -1
  30. package/dist/skip-nav.d.ts.map +1 -1
  31. package/dist/skip-nav.js +2 -1
  32. package/dist/skip-nav.js.map +1 -1
  33. package/dist/styles.css +14 -3
  34. package/dist/styles.layered.css +14 -3
  35. package/dist/theme.d.ts.map +1 -1
  36. package/dist/theme.js +9 -1
  37. package/dist/theme.js.map +1 -1
  38. package/dist/toggle-group.d.ts.map +1 -1
  39. package/dist/toggle-group.js +3 -1
  40. package/dist/toggle-group.js.map +1 -1
  41. package/dist/top.d.ts.map +1 -1
  42. package/dist/top.js +9 -4
  43. package/dist/top.js.map +1 -1
  44. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.tsx"],"names":[],"mappings":"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"}
package/dist/layout.js CHANGED
@@ -1,4 +1,7 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // Layout renderers read profile context; declaring this granular entry keeps server-owned guide text outside the client graph.
4
+ // Root-barrel marking would also move unrelated exports; see docs/qa/2026-10-07-rsc-profile-boundary.md.
2
5
  import { useDesignProfileDefaults } from "./internal.js";
3
6
  import { resolveGridLayout, } from "@hjmds/design-contracts/grid";
4
7
  import { resolveAspectRatioDescriptor, } from "@hjmds/design-contracts/components/aspect-ratio";
@@ -6,6 +9,7 @@ import { resolveContainerDescriptor, } from "@hjmds/design-contracts/components/
6
9
  import { layoutRecipe, validateLayoutWebDescriptor, } from "@hjmds/design-contracts/components/layout";
7
10
  import { surfaceDefaults, surfaceGeometry, surfaceRecipe, } from "@hjmds/design-contracts/recipes/base";
8
11
  import { stackRecipe, textRecipe, } from "@hjmds/design-contracts/recipes";
12
+ import { resolveTextFontRole } from "@hjmds/design-contracts/foundations";
9
13
  import { createElement, forwardRef, useId, useRef, } from "react";
10
14
  import { classNames, composeRefs, useElementWidth, useWindowWidth, } from "./internal.js";
11
15
  function hasRegionContent(content) {
@@ -90,7 +94,7 @@ export const Layout = forwardRef(function Layout({ children, header, footer, sid
90
94
  ...mainStyle,
91
95
  }, children: children }), hasFooter ? (_jsx("footer", { ...restFooterProps, className: classNames("hjm-layout__footer", footerClassName), children: footer })) : null] }));
92
96
  });
93
- export const Text = forwardRef(function Text({ as = "span", variant = textRecipe.defaults.variant, tone = textRecipe.defaults.tone, emphasis: suppliedEmphasis, className, layoutStyle, style, ...props }, ref) {
97
+ export const Text = forwardRef(function Text({ as = "span", variant = textRecipe.defaults.variant, fontRole, tone = textRecipe.defaults.tone, emphasis: suppliedEmphasis, className, layoutStyle, style, ...props }, ref) {
94
98
  const profile = useDesignProfileDefaults();
95
99
  const emphasis = suppliedEmphasis ?? textRecipe.defaults.emphasis;
96
100
  return createElement(as, {
@@ -98,6 +102,7 @@ export const Text = forwardRef(function Text({ as = "span", variant = textRecipe
98
102
  ref,
99
103
  className: classNames("hjm-text", className),
100
104
  "data-variant": variant,
105
+ "data-font-role": resolveTextFontRole(variant, fontRole ?? (props.role === "heading" ? "display" : undefined)),
101
106
  "data-tone": tone,
102
107
  "data-emphasis": emphasis,
103
108
  // Placement wins over the legacy `style`, matching Surface's ordering.
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useDesignProfileDefaults } from \"./internal.js\";\nimport {\n resolveGridLayout,\n type GridDescriptor,\n type GridGap,\n} from \"@hjmds/design-contracts/grid\";\nimport {\n resolveAspectRatioDescriptor,\n type AspectRatioValue,\n} from \"@hjmds/design-contracts/components/aspect-ratio\";\nimport {\n resolveContainerDescriptor,\n type ContainerGutter,\n type ContainerSize,\n} from \"@hjmds/design-contracts/components/container\";\nimport {\n layoutRecipe,\n validateLayoutWebDescriptor,\n type LayoutSidebarDescriptor,\n type LayoutSidebarRole,\n} from \"@hjmds/design-contracts/components/layout\";\nimport {\n surfaceDefaults,\n surfaceGeometry,\n surfaceRecipe,\n type SurfacePadding,\n type SurfaceRadius,\n type SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n stackRecipe,\n textRecipe,\n type StackAlign,\n type StackAxis,\n type StackGap,\n type StackJustify,\n type TextEmphasis,\n type TextTone,\n} from \"@hjmds/design-contracts/recipes\";\nimport type { TextVariant } from \"@hjmds/design-contracts/foundations\";\nimport {\n createElement,\n forwardRef,\n useId,\n useRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport {\n classNames,\n composeRefs,\n useElementWidth,\n useWindowWidth,\n} from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type {\n SurfacePadding,\n SurfaceRadius,\n SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nexport type {\n StackAlign,\n StackAxis,\n StackGap,\n StackJustify,\n TextEmphasis,\n TextTone,\n} from \"@hjmds/design-contracts/recipes\";\n\ntype LayoutRegionProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"role\"\n>;\n\ntype LayoutSidebarBase = Readonly<{\n children: ReactNode;\n role: LayoutSidebarRole;\n label: string;\n landmarkProps?: Omit<LayoutRegionProps, \"aria-label\">;\n landmarkRef?: Ref<HTMLElement>;\n}>;\n\n/**\n * A persistent sidebar is rendered in the shell grid. An overlay sidebar is\n * deliberately handed to the product's SidePanel (or equivalent) through\n * `renderOverlay`; Layout never owns a second open/dismiss lifecycle.\n */\nexport type LayoutSidebar =\n | (LayoutSidebarBase &\n Readonly<{\n mode: \"persistent\";\n renderOverlay?: never;\n }>)\n | (LayoutSidebarBase &\n Readonly<{\n mode: \"overlay\";\n renderOverlay(sidebarLandmark: ReactElement): ReactNode;\n }>);\n\nexport type LayoutProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children: ReactNode;\n header?: ReactNode;\n footer?: ReactNode;\n sidebar?: LayoutSidebar;\n skipLinkLabel?: string;\n /** Stable product id for deep links; a hydration-safe id is generated when omitted. */\n mainId?: string;\n mainRef?: Ref<HTMLElement>;\n headerProps?: LayoutRegionProps;\n mainProps?: Omit<LayoutRegionProps, \"id\" | \"tabIndex\">;\n footerProps?: LayoutRegionProps;\n skipLinkProps?: Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"children\" | \"href\"\n >;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction hasRegionContent(content: ReactNode | undefined): boolean {\n return content !== undefined && content !== null && content !== false;\n}\n\nfunction assertMainId(id: string): void {\n if (id.trim().length === 0) {\n throw new TypeError(\"Layout mainId must not be empty\");\n }\n if (/\\s/u.test(id)) {\n throw new TypeError(\"Layout mainId must not contain whitespace\");\n }\n}\n\n/** Accessible Web app shell with real landmarks and bypass navigation. */\nexport const Layout = forwardRef<HTMLDivElement, LayoutProps>(function Layout(\n {\n children,\n header,\n footer,\n sidebar,\n skipLinkLabel,\n mainId: mainIdProp,\n mainRef: forwardedMainRef,\n headerProps,\n mainProps,\n footerProps,\n skipLinkProps,\n className,\n layoutStyle,\n ...props\n },\n ref,\n) {\n const generatedId = `hjm-main-${useId().replaceAll(\":\", \"\")}`;\n const internalMainRef = useRef<HTMLElement>(null);\n const mainId = mainIdProp ?? generatedId;\n assertMainId(mainId);\n\n const hasHeader = hasRegionContent(header);\n const hasFooter = hasRegionContent(footer);\n const descriptor = {\n ...(hasHeader ? { hasHeader: true } : {}),\n ...(hasFooter ? { hasFooter: true } : {}),\n ...(sidebar === undefined\n ? {}\n : {\n sidebar: {\n role: sidebar.role,\n mode: sidebar.mode,\n label: sidebar.label,\n } satisfies LayoutSidebarDescriptor,\n }),\n ...(skipLinkLabel === undefined ? {} : { skipLinkLabel }),\n };\n validateLayoutWebDescriptor(descriptor);\n\n if (\n sidebar?.mode === \"overlay\" &&\n typeof sidebar.renderOverlay !== \"function\"\n ) {\n throw new TypeError(\n \"Layout overlay sidebar requires renderOverlay so SidePanel owns its lifecycle\",\n );\n }\n\n const {\n className: headerClassName,\n ...restHeaderProps\n } = headerProps ?? {};\n const {\n className: mainClassName,\n style: mainStyle,\n ...restMainProps\n } = mainProps ?? {};\n const {\n className: footerClassName,\n ...restFooterProps\n } = footerProps ?? {};\n const {\n className: skipLinkClassName,\n onClick: onSkipLinkClick,\n ...restSkipLinkProps\n } = skipLinkProps ?? {};\n\n let sidebarNode: ReactNode;\n if (sidebar !== undefined) {\n const {\n className: sidebarClassName,\n style: sidebarStyle,\n ...restSidebarProps\n } = sidebar.landmarkProps ?? {};\n const sidebarLandmark = createElement(\n sidebar.role === \"navigation\" ? \"nav\" : \"aside\",\n {\n ...restSidebarProps,\n ref: sidebar.landmarkRef,\n className: classNames(\"hjm-layout__sidebar\", sidebarClassName),\n \"aria-label\": sidebar.label,\n \"data-mode\": sidebar.mode,\n style: {\n ...(sidebar.mode === \"persistent\"\n ? { inlineSize: layoutRecipe.sidebar.width }\n : {}),\n ...sidebarStyle,\n },\n },\n sidebar.children,\n );\n sidebarNode = sidebar.mode === \"overlay\"\n ? sidebar.renderOverlay(sidebarLandmark)\n : sidebarLandmark;\n }\n\n const moveFocusToMain = (event: MouseEvent<HTMLAnchorElement>) => {\n onSkipLinkClick?.(event);\n if (event.defaultPrevented) return;\n const main = internalMainRef.current;\n if (main === null) return;\n event.preventDefault();\n const url = new URL(window.location.href);\n url.hash = mainId;\n window.history.replaceState(window.history.state, \"\", url);\n main.focus({ preventScroll: true });\n main.scrollIntoView?.({ block: \"start\" });\n };\n\n return (\n <div\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-layout\", className)}\n data-hjm-component=\"Layout\"\n data-sidebar-mode={sidebar?.mode ?? \"none\"}\n >\n {skipLinkLabel === undefined ? null : (\n <a\n {...restSkipLinkProps}\n href={`#${mainId}`}\n className={classNames(\n \"hjm-layout__skip-link\",\n skipLinkClassName,\n )}\n onClick={moveFocusToMain}\n >\n {skipLinkLabel}\n </a>\n )}\n {hasHeader ? (\n <header\n {...restHeaderProps}\n className={classNames(\"hjm-layout__header\", headerClassName)}\n >\n {header}\n </header>\n ) : null}\n {sidebarNode}\n <main\n {...restMainProps}\n ref={composeRefs(internalMainRef, forwardedMainRef)}\n id={mainId}\n className={classNames(\"hjm-layout__main\", mainClassName)}\n tabIndex={-1}\n style={{\n maxInlineSize: layoutRecipe.main.maxWidth,\n paddingInline: layoutRecipe.main.paddingHorizontal,\n ...mainStyle,\n }}\n >\n {children}\n </main>\n {hasFooter ? (\n <footer\n {...restFooterProps}\n className={classNames(\"hjm-layout__footer\", footerClassName)}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n );\n});\n\nexport type TextProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> &\n Readonly<{\n children: ReactNode;\n as?: \"span\" | \"p\" | \"div\" | \"strong\" | \"small\";\n variant?: TextVariant;\n tone?: TextTone;\n emphasis?: TextEmphasis;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Text = forwardRef<HTMLElement, TextProps>(function Text(\n {\n as = \"span\",\n variant = textRecipe.defaults.variant,\n tone = textRecipe.defaults.tone,\n emphasis: suppliedEmphasis,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const profile = useDesignProfileDefaults();\n const emphasis = suppliedEmphasis ?? textRecipe.defaults.emphasis;\n return createElement(as, {\n ...props,\n ref,\n className: classNames(\"hjm-text\", className),\n \"data-variant\": variant,\n \"data-tone\": tone,\n \"data-emphasis\": emphasis,\n // Placement wins over the legacy `style`, matching Surface's ordering.\n style: { ...style, ...layoutStyle, ...(profile && suppliedEmphasis === undefined ? { fontWeight: profile.tokens.typography[variant].fontWeight } : {}) },\n });\n});\n\nexport type SurfaceProps = HTMLAttributes<HTMLElement> &\n Readonly<{\n as?: \"div\" | \"section\" | \"article\";\n tone?: SurfaceTone;\n bordered?: boolean;\n padding?: SurfacePadding;\n radius?: SurfaceRadius;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Surface = forwardRef<HTMLElement, SurfaceProps>(function Surface(\n {\n as = \"div\",\n tone = surfaceDefaults.tone,\n bordered,\n padding = surfaceDefaults.padding,\n radius = surfaceDefaults.radius,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const contract = surfaceRecipe[tone];\n return createElement(as, {\n ...props,\n ref,\n className: classNames(\"hjm-surface\", className),\n \"data-tone\": tone,\n // Canvas framing is the default; preserve the caller's explicit border opt-out.\n \"data-bordered\": bordered ?? (surfaceDefaults.bordered || contract.borderAlways),\n \"data-elevated\": contract.elevated,\n \"data-clips\": contract.clipsContent,\n \"data-padding\": padding,\n \"data-radius\": radius,\n style: {\n padding: surfaceGeometry.paddings[padding],\n borderRadius: `var(--hjm-radius-${radius})`,\n ...style,\n ...layoutStyle,\n },\n });\n});\n\nexport type StackProps = HTMLAttributes<HTMLDivElement> &\n Readonly<{\n axis?: StackAxis;\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nconst justifyValues = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n} as const;\n\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(function Stack(\n {\n axis = stackRecipe.defaults.axis,\n gap = stackRecipe.defaults.gap,\n align = stackRecipe.defaults.align,\n justify = stackRecipe.defaults.justify,\n wrap = stackRecipe.defaults.wrap,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-stack\", className)}\n data-axis={axis}\n data-gap={gap}\n style={{\n display: \"flex\",\n flexDirection: stackRecipe.axes[axis],\n gap: stackRecipe.gaps[gap],\n alignItems: align === \"start\" || align === \"end\" ? `flex-${align}` : align,\n justifyContent: justifyValues[justify],\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type ContainerProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children?: ReactNode;\n size?: ContainerSize;\n gutter?: ContainerGutter;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** A centered, token-guttered content boundary shared with Native large screens. */\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(function Container(\n { size, gutter, className, layoutStyle, style, ...props },\n ref,\n) {\n const resolved = resolveContainerDescriptor({\n ...(size === undefined ? {} : { size }),\n ...(gutter === undefined ? {} : { gutter }),\n });\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-container\", className)}\n data-size={resolved.size}\n data-gutter={resolved.gutter}\n style={{\n maxInlineSize: resolved.maxWidth ?? undefined,\n paddingInline: resolved.paddingInline,\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type AspectRatioProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children?: ReactNode;\n ratio?: AspectRatioValue;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** Responsive media frame. Products retain object-fit, crop, and content semantics. */\nexport const AspectRatio = forwardRef<HTMLDivElement, AspectRatioProps>(function AspectRatio(\n { ratio, className, layoutStyle, style, ...props },\n ref,\n) {\n const resolved = resolveAspectRatioDescriptor(\n ratio === undefined ? {} : { ratio },\n );\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-aspect-ratio\", className)}\n data-ratio={resolved.source}\n style={{ ...layoutStyle, aspectRatio: resolved.ratio, ...style }}\n />\n );\n});\n\n// No `layoutStyle`: the element is clipped to 1px by design, so placement has no visible effect.\nexport type VisuallyHiddenProps = HTMLAttributes<HTMLSpanElement> &\n Readonly<{ children: ReactNode }>;\n\n/** Keeps meaningful copy available to assistive technology without visible layout. */\nexport const VisuallyHidden = forwardRef<HTMLSpanElement, VisuallyHiddenProps>(\n function VisuallyHidden({ className, ...props }, ref) {\n return (\n <span\n {...props}\n ref={ref}\n className={classNames(\"hjm-visually-hidden\", className)}\n />\n );\n },\n);\n\nexport type GridProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Pick<GridDescriptor, \"columns\" | \"gap\" | \"minColumnWidth\"> &\n Readonly<{\n children?: ReactNode;\n /** Test/SSR override. Browser renderers otherwise observe window.innerWidth. */\n windowWidth?: number;\n /** Container measurement override; ResizeObserver is used when omitted. */\n availableWidth?: number;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Grid = forwardRef<HTMLDivElement, GridProps>(function Grid(\n {\n columns,\n gap,\n minColumnWidth,\n windowWidth,\n availableWidth,\n className,\n layoutStyle,\n style,\n ...props\n },\n forwardedRef,\n) {\n const browserWindowWidth = useWindowWidth();\n const [measuredWidth, gridRef] = useElementWidth(forwardedRef);\n const compactSsrWidth = 320;\n const effectiveWindowWidth =\n windowWidth ??\n (browserWindowWidth > 0 ? browserWindowWidth : compactSsrWidth);\n const effectiveAvailableWidth =\n availableWidth ??\n (measuredWidth !== undefined && measuredWidth > 0\n ? measuredWidth\n : effectiveWindowWidth);\n const descriptor: GridDescriptor = {\n columns,\n ...(gap === undefined ? {} : { gap }),\n ...(minColumnWidth === undefined ? {} : { minColumnWidth }),\n };\n const layout = resolveGridLayout(descriptor, {\n windowWidth: effectiveWindowWidth,\n availableWidth: effectiveAvailableWidth,\n });\n\n return (\n <div\n {...props}\n ref={gridRef}\n className={classNames(\"hjm-grid\", className)}\n data-window-class={layout.windowClass}\n data-columns={layout.columns}\n data-requested-columns={layout.requestedColumns}\n data-state={layout.columns < layout.requestedColumns ? \"collapsed\" : \"resolved\"}\n style={{\n display: \"grid\",\n gridTemplateColumns: `repeat(${layout.columns}, minmax(0, 1fr))`,\n rowGap: layout.rowGap,\n columnGap: layout.columnGap,\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type SectionProps = Omit<HTMLAttributes<HTMLElement>, \"children\" | \"title\"> &\n Readonly<{\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** Large-text-safe semantic content section with an optional header action. */\nexport const Section = forwardRef<HTMLElement, SectionProps>(function Section(\n {\n title,\n description,\n action,\n children,\n headingLevel = 2,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const hasHeader = title !== undefined || description !== undefined || action !== undefined;\n return (\n <section {...props} style={{ ...style, ...layoutStyle }} ref={ref} className={classNames(\"hjm-section\", className)}>\n {hasHeader ? (\n <header className=\"hjm-section__header\">\n <div className=\"hjm-section__copy\">\n {title === undefined ? null : createElement(\n `h${headingLevel}`,\n { className: \"hjm-section__title\" },\n title,\n )}\n {description === undefined ? null : (\n <div className=\"hjm-section__description\">{description}</div>\n )}\n </div>\n {action === undefined ? null : <div className=\"hjm-section__action\">{action}</div>}\n </header>\n ) : null}\n <div className=\"hjm-section__content\">{children}</div>\n </section>\n );\n});\n\nexport type { GridGap };\nexport type { AspectRatioValue, ContainerGutter, ContainerSize };\n"]}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n// Layout renderers read profile context; declaring this granular entry keeps server-owned guide text outside the client graph.\n// Root-barrel marking would also move unrelated exports; see docs/qa/2026-10-07-rsc-profile-boundary.md.\nimport { useDesignProfileDefaults } from \"./internal.js\";\nimport {\n resolveGridLayout,\n type GridDescriptor,\n type GridGap,\n} from \"@hjmds/design-contracts/grid\";\nimport {\n resolveAspectRatioDescriptor,\n type AspectRatioValue,\n} from \"@hjmds/design-contracts/components/aspect-ratio\";\nimport {\n resolveContainerDescriptor,\n type ContainerGutter,\n type ContainerSize,\n} from \"@hjmds/design-contracts/components/container\";\nimport {\n layoutRecipe,\n validateLayoutWebDescriptor,\n type LayoutSidebarDescriptor,\n type LayoutSidebarRole,\n} from \"@hjmds/design-contracts/components/layout\";\nimport {\n surfaceDefaults,\n surfaceGeometry,\n surfaceRecipe,\n type SurfacePadding,\n type SurfaceRadius,\n type SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n stackRecipe,\n textRecipe,\n type StackAlign,\n type StackAxis,\n type StackGap,\n type StackJustify,\n type TextEmphasis,\n type TextTone,\n} from \"@hjmds/design-contracts/recipes\";\nimport { resolveTextFontRole, type FontRole, type TextVariant } from \"@hjmds/design-contracts/foundations\";\nimport {\n createElement,\n forwardRef,\n useId,\n useRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport {\n classNames,\n composeRefs,\n useElementWidth,\n useWindowWidth,\n} from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type {\n SurfacePadding,\n SurfaceRadius,\n SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nexport type {\n StackAlign,\n StackAxis,\n StackGap,\n StackJustify,\n TextEmphasis,\n TextTone,\n} from \"@hjmds/design-contracts/recipes\";\n\ntype LayoutRegionProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"role\"\n>;\n\ntype LayoutSidebarBase = Readonly<{\n children: ReactNode;\n role: LayoutSidebarRole;\n label: string;\n landmarkProps?: Omit<LayoutRegionProps, \"aria-label\">;\n landmarkRef?: Ref<HTMLElement>;\n}>;\n\n/**\n * A persistent sidebar is rendered in the shell grid. An overlay sidebar is\n * deliberately handed to the product's SidePanel (or equivalent) through\n * `renderOverlay`; Layout never owns a second open/dismiss lifecycle.\n */\nexport type LayoutSidebar =\n | (LayoutSidebarBase &\n Readonly<{\n mode: \"persistent\";\n renderOverlay?: never;\n }>)\n | (LayoutSidebarBase &\n Readonly<{\n mode: \"overlay\";\n renderOverlay(sidebarLandmark: ReactElement): ReactNode;\n }>);\n\nexport type LayoutProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children: ReactNode;\n header?: ReactNode;\n footer?: ReactNode;\n sidebar?: LayoutSidebar;\n skipLinkLabel?: string;\n /** Stable product id for deep links; a hydration-safe id is generated when omitted. */\n mainId?: string;\n mainRef?: Ref<HTMLElement>;\n headerProps?: LayoutRegionProps;\n mainProps?: Omit<LayoutRegionProps, \"id\" | \"tabIndex\">;\n footerProps?: LayoutRegionProps;\n skipLinkProps?: Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"children\" | \"href\"\n >;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction hasRegionContent(content: ReactNode | undefined): boolean {\n return content !== undefined && content !== null && content !== false;\n}\n\nfunction assertMainId(id: string): void {\n if (id.trim().length === 0) {\n throw new TypeError(\"Layout mainId must not be empty\");\n }\n if (/\\s/u.test(id)) {\n throw new TypeError(\"Layout mainId must not contain whitespace\");\n }\n}\n\n/** Accessible Web app shell with real landmarks and bypass navigation. */\nexport const Layout = forwardRef<HTMLDivElement, LayoutProps>(function Layout(\n {\n children,\n header,\n footer,\n sidebar,\n skipLinkLabel,\n mainId: mainIdProp,\n mainRef: forwardedMainRef,\n headerProps,\n mainProps,\n footerProps,\n skipLinkProps,\n className,\n layoutStyle,\n ...props\n },\n ref,\n) {\n const generatedId = `hjm-main-${useId().replaceAll(\":\", \"\")}`;\n const internalMainRef = useRef<HTMLElement>(null);\n const mainId = mainIdProp ?? generatedId;\n assertMainId(mainId);\n\n const hasHeader = hasRegionContent(header);\n const hasFooter = hasRegionContent(footer);\n const descriptor = {\n ...(hasHeader ? { hasHeader: true } : {}),\n ...(hasFooter ? { hasFooter: true } : {}),\n ...(sidebar === undefined\n ? {}\n : {\n sidebar: {\n role: sidebar.role,\n mode: sidebar.mode,\n label: sidebar.label,\n } satisfies LayoutSidebarDescriptor,\n }),\n ...(skipLinkLabel === undefined ? {} : { skipLinkLabel }),\n };\n validateLayoutWebDescriptor(descriptor);\n\n if (\n sidebar?.mode === \"overlay\" &&\n typeof sidebar.renderOverlay !== \"function\"\n ) {\n throw new TypeError(\n \"Layout overlay sidebar requires renderOverlay so SidePanel owns its lifecycle\",\n );\n }\n\n const {\n className: headerClassName,\n ...restHeaderProps\n } = headerProps ?? {};\n const {\n className: mainClassName,\n style: mainStyle,\n ...restMainProps\n } = mainProps ?? {};\n const {\n className: footerClassName,\n ...restFooterProps\n } = footerProps ?? {};\n const {\n className: skipLinkClassName,\n onClick: onSkipLinkClick,\n ...restSkipLinkProps\n } = skipLinkProps ?? {};\n\n let sidebarNode: ReactNode;\n if (sidebar !== undefined) {\n const {\n className: sidebarClassName,\n style: sidebarStyle,\n ...restSidebarProps\n } = sidebar.landmarkProps ?? {};\n const sidebarLandmark = createElement(\n sidebar.role === \"navigation\" ? \"nav\" : \"aside\",\n {\n ...restSidebarProps,\n ref: sidebar.landmarkRef,\n className: classNames(\"hjm-layout__sidebar\", sidebarClassName),\n \"aria-label\": sidebar.label,\n \"data-mode\": sidebar.mode,\n style: {\n ...(sidebar.mode === \"persistent\"\n ? { inlineSize: layoutRecipe.sidebar.width }\n : {}),\n ...sidebarStyle,\n },\n },\n sidebar.children,\n );\n sidebarNode = sidebar.mode === \"overlay\"\n ? sidebar.renderOverlay(sidebarLandmark)\n : sidebarLandmark;\n }\n\n const moveFocusToMain = (event: MouseEvent<HTMLAnchorElement>) => {\n onSkipLinkClick?.(event);\n if (event.defaultPrevented) return;\n const main = internalMainRef.current;\n if (main === null) return;\n event.preventDefault();\n const url = new URL(window.location.href);\n url.hash = mainId;\n window.history.replaceState(window.history.state, \"\", url);\n main.focus({ preventScroll: true });\n main.scrollIntoView?.({ block: \"start\" });\n };\n\n return (\n <div\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-layout\", className)}\n data-hjm-component=\"Layout\"\n data-sidebar-mode={sidebar?.mode ?? \"none\"}\n >\n {skipLinkLabel === undefined ? null : (\n <a\n {...restSkipLinkProps}\n href={`#${mainId}`}\n className={classNames(\n \"hjm-layout__skip-link\",\n skipLinkClassName,\n )}\n onClick={moveFocusToMain}\n >\n {skipLinkLabel}\n </a>\n )}\n {hasHeader ? (\n <header\n {...restHeaderProps}\n className={classNames(\"hjm-layout__header\", headerClassName)}\n >\n {header}\n </header>\n ) : null}\n {sidebarNode}\n <main\n {...restMainProps}\n ref={composeRefs(internalMainRef, forwardedMainRef)}\n id={mainId}\n className={classNames(\"hjm-layout__main\", mainClassName)}\n tabIndex={-1}\n style={{\n maxInlineSize: layoutRecipe.main.maxWidth,\n paddingInline: layoutRecipe.main.paddingHorizontal,\n ...mainStyle,\n }}\n >\n {children}\n </main>\n {hasFooter ? (\n <footer\n {...restFooterProps}\n className={classNames(\"hjm-layout__footer\", footerClassName)}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n );\n});\n\nexport type TextProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> &\n Readonly<{\n children: ReactNode;\n as?: \"span\" | \"p\" | \"div\" | \"strong\" | \"small\";\n variant?: TextVariant;\n /** Overrides the variant family role; never changes its semantic element or metrics. */\n fontRole?: FontRole;\n tone?: TextTone;\n emphasis?: TextEmphasis;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Text = forwardRef<HTMLElement, TextProps>(function Text(\n {\n as = \"span\",\n variant = textRecipe.defaults.variant,\n fontRole,\n tone = textRecipe.defaults.tone,\n emphasis: suppliedEmphasis,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const profile = useDesignProfileDefaults();\n const emphasis = suppliedEmphasis ?? textRecipe.defaults.emphasis;\n return createElement(as, {\n ...props,\n ref,\n className: classNames(\"hjm-text\", className),\n \"data-variant\": variant,\n \"data-font-role\": resolveTextFontRole(variant, fontRole ?? (props.role === \"heading\" ? \"display\" : undefined)),\n \"data-tone\": tone,\n \"data-emphasis\": emphasis,\n // Placement wins over the legacy `style`, matching Surface's ordering.\n style: { ...style, ...layoutStyle, ...(profile && suppliedEmphasis === undefined ? { fontWeight: profile.tokens.typography[variant].fontWeight } : {}) },\n });\n});\n\nexport type SurfaceProps = HTMLAttributes<HTMLElement> &\n Readonly<{\n as?: \"div\" | \"section\" | \"article\";\n tone?: SurfaceTone;\n bordered?: boolean;\n padding?: SurfacePadding;\n radius?: SurfaceRadius;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Surface = forwardRef<HTMLElement, SurfaceProps>(function Surface(\n {\n as = \"div\",\n tone = surfaceDefaults.tone,\n bordered,\n padding = surfaceDefaults.padding,\n radius = surfaceDefaults.radius,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const contract = surfaceRecipe[tone];\n return createElement(as, {\n ...props,\n ref,\n className: classNames(\"hjm-surface\", className),\n \"data-tone\": tone,\n // Canvas framing is the default; preserve the caller's explicit border opt-out.\n \"data-bordered\": bordered ?? (surfaceDefaults.bordered || contract.borderAlways),\n \"data-elevated\": contract.elevated,\n \"data-clips\": contract.clipsContent,\n \"data-padding\": padding,\n \"data-radius\": radius,\n style: {\n padding: surfaceGeometry.paddings[padding],\n borderRadius: `var(--hjm-radius-${radius})`,\n ...style,\n ...layoutStyle,\n },\n });\n});\n\nexport type StackProps = HTMLAttributes<HTMLDivElement> &\n Readonly<{\n axis?: StackAxis;\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nconst justifyValues = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n} as const;\n\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(function Stack(\n {\n axis = stackRecipe.defaults.axis,\n gap = stackRecipe.defaults.gap,\n align = stackRecipe.defaults.align,\n justify = stackRecipe.defaults.justify,\n wrap = stackRecipe.defaults.wrap,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-stack\", className)}\n data-axis={axis}\n data-gap={gap}\n style={{\n display: \"flex\",\n flexDirection: stackRecipe.axes[axis],\n gap: stackRecipe.gaps[gap],\n alignItems: align === \"start\" || align === \"end\" ? `flex-${align}` : align,\n justifyContent: justifyValues[justify],\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type ContainerProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children?: ReactNode;\n size?: ContainerSize;\n gutter?: ContainerGutter;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** A centered, token-guttered content boundary shared with Native large screens. */\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(function Container(\n { size, gutter, className, layoutStyle, style, ...props },\n ref,\n) {\n const resolved = resolveContainerDescriptor({\n ...(size === undefined ? {} : { size }),\n ...(gutter === undefined ? {} : { gutter }),\n });\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-container\", className)}\n data-size={resolved.size}\n data-gutter={resolved.gutter}\n style={{\n maxInlineSize: resolved.maxWidth ?? undefined,\n paddingInline: resolved.paddingInline,\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type AspectRatioProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n children?: ReactNode;\n ratio?: AspectRatioValue;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** Responsive media frame. Products retain object-fit, crop, and content semantics. */\nexport const AspectRatio = forwardRef<HTMLDivElement, AspectRatioProps>(function AspectRatio(\n { ratio, className, layoutStyle, style, ...props },\n ref,\n) {\n const resolved = resolveAspectRatioDescriptor(\n ratio === undefined ? {} : { ratio },\n );\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-aspect-ratio\", className)}\n data-ratio={resolved.source}\n style={{ ...layoutStyle, aspectRatio: resolved.ratio, ...style }}\n />\n );\n});\n\n// No `layoutStyle`: the element is clipped to 1px by design, so placement has no visible effect.\nexport type VisuallyHiddenProps = HTMLAttributes<HTMLSpanElement> &\n Readonly<{ children: ReactNode }>;\n\n/** Keeps meaningful copy available to assistive technology without visible layout. */\nexport const VisuallyHidden = forwardRef<HTMLSpanElement, VisuallyHiddenProps>(\n function VisuallyHidden({ className, ...props }, ref) {\n return (\n <span\n {...props}\n ref={ref}\n className={classNames(\"hjm-visually-hidden\", className)}\n />\n );\n },\n);\n\nexport type GridProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Pick<GridDescriptor, \"columns\" | \"gap\" | \"minColumnWidth\"> &\n Readonly<{\n children?: ReactNode;\n /** Test/SSR override. Browser renderers otherwise observe window.innerWidth. */\n windowWidth?: number;\n /** Container measurement override; ResizeObserver is used when omitted. */\n availableWidth?: number;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Grid = forwardRef<HTMLDivElement, GridProps>(function Grid(\n {\n columns,\n gap,\n minColumnWidth,\n windowWidth,\n availableWidth,\n className,\n layoutStyle,\n style,\n ...props\n },\n forwardedRef,\n) {\n const browserWindowWidth = useWindowWidth();\n const [measuredWidth, gridRef] = useElementWidth(forwardedRef);\n const compactSsrWidth = 320;\n const effectiveWindowWidth =\n windowWidth ??\n (browserWindowWidth > 0 ? browserWindowWidth : compactSsrWidth);\n const effectiveAvailableWidth =\n availableWidth ??\n (measuredWidth !== undefined && measuredWidth > 0\n ? measuredWidth\n : effectiveWindowWidth);\n const descriptor: GridDescriptor = {\n columns,\n ...(gap === undefined ? {} : { gap }),\n ...(minColumnWidth === undefined ? {} : { minColumnWidth }),\n };\n const layout = resolveGridLayout(descriptor, {\n windowWidth: effectiveWindowWidth,\n availableWidth: effectiveAvailableWidth,\n });\n\n return (\n <div\n {...props}\n ref={gridRef}\n className={classNames(\"hjm-grid\", className)}\n data-window-class={layout.windowClass}\n data-columns={layout.columns}\n data-requested-columns={layout.requestedColumns}\n data-state={layout.columns < layout.requestedColumns ? \"collapsed\" : \"resolved\"}\n style={{\n display: \"grid\",\n gridTemplateColumns: `repeat(${layout.columns}, minmax(0, 1fr))`,\n rowGap: layout.rowGap,\n columnGap: layout.columnGap,\n ...style,\n ...layoutStyle,\n }}\n />\n );\n});\n\nexport type SectionProps = Omit<HTMLAttributes<HTMLElement>, \"children\" | \"title\"> &\n Readonly<{\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** Large-text-safe semantic content section with an optional header action. */\nexport const Section = forwardRef<HTMLElement, SectionProps>(function Section(\n {\n title,\n description,\n action,\n children,\n headingLevel = 2,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n const hasHeader = title !== undefined || description !== undefined || action !== undefined;\n return (\n <section {...props} style={{ ...style, ...layoutStyle }} ref={ref} className={classNames(\"hjm-section\", className)}>\n {hasHeader ? (\n <header className=\"hjm-section__header\">\n <div className=\"hjm-section__copy\">\n {title === undefined ? null : createElement(\n `h${headingLevel}`,\n { className: \"hjm-section__title\" },\n title,\n )}\n {description === undefined ? null : (\n <div className=\"hjm-section__description\">{description}</div>\n )}\n </div>\n {action === undefined ? null : <div className=\"hjm-section__action\">{action}</div>}\n </header>\n ) : null}\n <div className=\"hjm-section__content\">{children}</div>\n </section>\n );\n});\n\nexport type { GridGap };\nexport type { AspectRatioValue, ContainerGutter, ContainerSize };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"menubar.d.ts","sourceRoot":"","sources":["../src/menubar.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4CAA4C,CAAC;AAIpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAChG,UAAU,EAAE,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,wBAAgB,OAAO,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,EACpF,UAAU,EACV,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,EAAE,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,+BA0K5B"}
1
+ {"version":3,"file":"menubar.d.ts","sourceRoot":"","sources":["../src/menubar.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4CAA4C,CAAC;AAIpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAChG,UAAU,EAAE,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,wBAAgB,OAAO,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,EACpF,UAAU,EACV,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,EAAE,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,+BA2K5B"}
package/dist/menubar.js CHANGED
@@ -58,7 +58,8 @@ export function Menubar({ descriptor, openMenuId: controlledOpen, defaultOpenMen
58
58
  "--hjm-menubar-gap": `${menubarRecipe.gap}px`,
59
59
  "--hjm-menubar-padding": `${menubarRecipe.paddingHorizontal}px`,
60
60
  "--hjm-menubar-label-padding": `${menubarRecipe.label.paddingHorizontal}px`,
61
- "--hjm-menubar-label-radius": `${menubarRecipe.label.radius}px`,
61
+ // Consume the label sm role through CSS inheritance, retaining standalone recipe geometry.
62
+ "--hjm-menubar-label-radius": `var(--hjm-radius-sm, ${menubarRecipe.label.radius}px)`,
62
63
  }, onKeyDown: (event) => {
63
64
  if (event.key === "ArrowRight") {
64
65
  event.preventDefault();
@@ -1 +1 @@
1
- {"version":3,"file":"menubar.js","sourceRoot":"","sources":["../src/menubar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n menubarRecipe,\n resolveMenubarNavigation,\n validateMenubarDescriptor,\n type MenubarDescriptor,\n} from \"@hjmds/design-contracts/components/menubar\";\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type CSSProperties, type RefObject } from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { AnchoredPortal, useAnchoredPopup } from \"./portal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type MenubarProps<Key extends string = string, MenuKey extends string = string> = Readonly<{\n descriptor: MenubarDescriptor<Key, MenuKey>;\n openMenuId?: MenuKey | null;\n defaultOpenMenuId?: MenuKey | null;\n onOpenMenuIdChange?: (id: MenuKey | null) => void;\n onAction: (id: Key, menuId: MenuKey) => void;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function Menubar<Key extends string = string, MenuKey extends string = string>({\n descriptor,\n openMenuId: controlledOpen,\n defaultOpenMenuId,\n onOpenMenuIdChange,\n onAction,\n className,\n layoutStyle,\n}: MenubarProps<Key, MenuKey>) {\n validateMenubarDescriptor(descriptor);\n const [openId, setOpenId] = useControllableState<MenuKey | null>({\n ...(controlledOpen === undefined ? {} : { value: controlledOpen }),\n defaultValue: defaultOpenMenuId ?? null,\n ...(onOpenMenuIdChange === undefined ? {} : { onChange: onOpenMenuIdChange }),\n });\n const enabledMenus = descriptor.menus.filter((menu) => menu.disabled !== true);\n // Roving focus: the bar is one tab stop, so the bar — not each label — owns\n // which menu is reachable by Tab.\n const [focusedId, setFocusedId] = useState<MenuKey>(enabledMenus[0]?.id ?? descriptor.menus[0]!.id);\n const [activeItemIndex, setActiveItemIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const labelRefs = useRef(new Map<MenuKey, HTMLButtonElement>());\n const openMenu = descriptor.menus.find((menu) => menu.id === openId) ?? null;\n const openItems = openMenu?.items.filter((item) => item.disabled !== true) ?? [];\n // The panel was absolute inside the bar, so any overflow ancestor clipped it\n // (2026-09-30 audit WR-0930-4: at 1100px an item could not be hit). It now uses\n // the same portal + fixed positioning as Menu; focus stays on the bar label.\n const panelId = `${useId().replaceAll(\":\", \"\")}-menubar-panel`;\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const setPanelRef = useCallback((node: HTMLDivElement | null) => setPanelNode(node), []);\n const openLabelRef = useMemo<RefObject<HTMLElement | null>>(\n () => ({ get current() { return openId === null ? null : labelRefs.current.get(openId) ?? null; } }),\n [openId],\n );\n const panelPosition = useAnchoredPopup(openLabelRef, panelNode, { gap: 0, zIndex: layer.dropdown });\n\n useEffect(() => {\n if (openId === null) return;\n const onPointerDown = (event: PointerEvent) => {\n if (event.target instanceof Node && (rootRef.current?.contains(event.target) || panelNode?.contains(event.target))) return;\n setOpenId(null);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [openId, panelNode, setOpenId]);\n\n const focusLabel = (id: MenuKey) => {\n setFocusedId(id);\n labelRefs.current.get(id)?.focus();\n };\n const move = (direction: \"next\" | \"previous\") => {\n const next = resolveMenubarNavigation(descriptor, focusedId, direction);\n focusLabel(next);\n // Left/right while a menu is open moves to the neighbour already open, which\n // is the whole reason this is a bar and not three independent Menus.\n if (openId !== null) { setOpenId(next); setActiveItemIndex(0); }\n };\n\n return (\n <div\n ref={rootRef}\n role=\"menubar\"\n aria-label={descriptor.accessibilityLabel}\n className={classNames(\"hjm-menubar\", className)}\n style={{ ...layoutStyle,\n \"--hjm-menubar-min-height\": `${menubarRecipe.minHeight}px`,\n \"--hjm-menubar-gap\": `${menubarRecipe.gap}px`,\n \"--hjm-menubar-padding\": `${menubarRecipe.paddingHorizontal}px`,\n \"--hjm-menubar-label-padding\": `${menubarRecipe.label.paddingHorizontal}px`,\n \"--hjm-menubar-label-radius\": `${menubarRecipe.label.radius}px`,\n } as CSSProperties}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\") { event.preventDefault(); move(\"next\"); return; }\n if (event.key === \"ArrowLeft\") { event.preventDefault(); move(\"previous\"); return; }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const target = (event.key === \"Home\" ? enabledMenus[0] : enabledMenus.at(-1))?.id;\n if (target !== undefined) { focusLabel(target); if (openId !== null) { setOpenId(target); setActiveItemIndex(0); } }\n return;\n }\n if (event.key === \"Escape\" && openId !== null) {\n event.preventDefault();\n setOpenId(null);\n focusLabel(focusedId);\n return;\n }\n if (openId === null) {\n if (event.key === \"ArrowDown\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpenId(focusedId);\n setActiveItemIndex(0);\n }\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveItemIndex((previous) => {\n const next = event.key === \"ArrowDown\" ? previous + 1 : previous - 1;\n return (next + openItems.length) % Math.max(openItems.length, 1);\n });\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n const item = openItems[activeItemIndex];\n if (item) {\n onAction(item.id as Key, openId);\n // Activation runs an action and leaves nothing selected — unlike Tabs.\n setOpenId(null);\n focusLabel(openId);\n }\n }\n }}\n >\n {descriptor.menus.map((menu) => {\n const open = menu.id === openId;\n return (\n <div key={menu.id} className=\"hjm-menubar__menu\">\n <button\n type=\"button\"\n ref={(node) => { if (node) labelRefs.current.set(menu.id, node); else labelRefs.current.delete(menu.id); }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? panelId : undefined}\n disabled={menu.disabled}\n tabIndex={menu.id === focusedId ? 0 : -1}\n data-open={open || undefined}\n className=\"hjm-menubar__label\"\n onClick={() => {\n setFocusedId(menu.id);\n setOpenId(open ? null : menu.id);\n setActiveItemIndex(0);\n }}\n onMouseEnter={() => {\n // Once one menu is open, hovering the bar switches menus — the\n // desktop convention; with nothing open, hover opens nothing.\n if (openId !== null && menu.disabled !== true) { setOpenId(menu.id); setFocusedId(menu.id); setActiveItemIndex(0); }\n }}\n >\n {menu.label}\n </button>\n {open ? (\n <AnchoredPortal anchorRef={openLabelRef} ssrFallback=\"inline\">\n <div ref={setPanelRef} id={panelId} role=\"menu\" aria-label={menu.label} className=\"hjm-menubar__panel\" data-placement={panelPosition.placement} style={panelPosition.style}>\n {menu.items.map((item) => {\n // Popup positioning can cause mouseenter under a stationary\n // cursor. Only movement should replace a keyboard choice.\n const index = openItems.findIndex((candidate) => candidate.id === item.id);\n return (\n <div\n key={item.id}\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n data-active={index === activeItemIndex && item.disabled !== true ? \"\" : undefined}\n data-tone={item.tone}\n className=\"hjm-menubar__item\"\n onMouseMove={() => { if (index >= 0) setActiveItemIndex(index); }}\n onClick={() => {\n if (item.disabled) return;\n onAction(item.id as Key, menu.id);\n setOpenId(null);\n focusLabel(menu.id);\n }}\n >\n <span>{item.label}</span>\n {item.shortcut ? <kbd className=\"hjm-menubar__shortcut\">{item.shortcut}</kbd> : null}\n </div>\n );\n })}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"menubar.js","sourceRoot":"","sources":["../src/menubar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,yBAAyB,GAE1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAsC,MAAM,OAAO,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAc/D,MAAM,UAAU,OAAO,CAA+D,EACpF,UAAU,EACV,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,GACgB;IAC3B,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,oBAAoB,CAAiB;QAC/D,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAClE,YAAY,EAAE,iBAAiB,IAAI,IAAI;QACvC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;KAC9E,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC/E,4EAA4E;IAC5E,kCAAkC;IAClC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC;IACpG,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,EAA8B,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7E,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IACjF,6EAA6E;IAC7E,gFAAgF;IAChF,6EAA6E;IAC7E,MAAM,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC;IAC/D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAA2B,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EACpG,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC5C,IAAI,KAAK,CAAC,MAAM,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAAE,OAAO;YAC3H,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEnC,MAAM,UAAU,GAAG,CAAC,EAAW,EAAE,EAAE;QACjC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,SAA8B,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,6EAA6E;QAC7E,qEAAqE;QACrE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAClE,CAAC,CAAC;IAEF,OAAO,CACL,cACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,SAAS,gBACF,UAAU,CAAC,kBAAkB,EACzC,SAAS,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,EAC/C,KAAK,EAAE,EAAE,GAAG,WAAW;YACrB,0BAA0B,EAAE,GAAG,aAAa,CAAC,SAAS,IAAI;YAC1D,mBAAmB,EAAE,GAAG,aAAa,CAAC,GAAG,IAAI;YAC7C,uBAAuB,EAAE,GAAG,aAAa,CAAC,iBAAiB,IAAI;YAC/D,6BAA6B,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,iBAAiB,IAAI;YAC3E,2FAA2F;YAC3F,4BAA4B,EAAE,wBAAwB,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK;SACrE,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;gBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjF,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACpF,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;gBAChD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAAC,SAAS,CAAC,MAAM,CAAC,CAAC;wBAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;gBAAC,CAAC;gBACpH,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,UAAU,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;oBAC5E,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,SAAS,CAAC,SAAS,CAAC,CAAC;oBACrB,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACzD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,kBAAkB,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrE,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;gBACxC,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,IAAI,CAAC,EAAS,EAAE,MAAM,CAAC,CAAC;oBACjC,uEAAuE;oBACvE,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChB,UAAU,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC,YAEA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;YAChC,OAAO,CACL,eAAmB,SAAS,EAAC,mBAAmB,aAC9C,iBACE,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI;4BAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;4BAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAC1G,IAAI,EAAC,UAAU,mBACD,MAAM,mBACL,IAAI,mBACJ,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAC7B,IAAI,IAAI,SAAS,EAC5B,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,GAAG,EAAE;4BACZ,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BACtB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BACjC,kBAAkB,CAAC,CAAC,CAAC,CAAC;wBACxB,CAAC,EACD,YAAY,EAAE,GAAG,EAAE;4BACjB,+DAA+D;4BAC/D,8DAA8D;4BAC9D,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gCAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gCAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gCAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;4BAAC,CAAC;wBACtH,CAAC,YAEA,IAAI,CAAC,KAAK,GACJ,EACR,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,cAAc,IAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAC,QAAQ,YAC7D,cAAK,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,MAAM,gBAAa,IAAI,CAAC,KAAK,EAAE,SAAS,EAAC,oBAAoB,oBAAiB,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,YACvK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gCACvB,4DAA4D;gCAC5D,0DAA0D;gCAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;gCAC3E,OAAO,CACL,eAEE,IAAI,EAAC,UAAU,mBACA,IAAI,CAAC,QAAQ,IAAI,SAAS,iBAC5B,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,eACtE,IAAI,CAAC,IAAI,EACpB,SAAS,EAAC,mBAAmB,EAC7B,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;wCAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACjE,OAAO,EAAE,GAAG,EAAE;wCACZ,IAAI,IAAI,CAAC,QAAQ;4CAAE,OAAO;wCAC1B,QAAQ,CAAC,IAAI,CAAC,EAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;wCAClC,SAAS,CAAC,IAAI,CAAC,CAAC;wCAChB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oCACtB,CAAC,aAED,yBAAO,IAAI,CAAC,KAAK,GAAQ,EACxB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,KAf/E,IAAI,CAAC,EAAE,CAgBR,CACP,CAAC;4BACJ,CAAC,CAAC,GACE,GACW,CAClB,CAAC,CAAC,CAAC,IAAI,KAvDA,IAAI,CAAC,EAAE,CAwDX,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n menubarRecipe,\n resolveMenubarNavigation,\n validateMenubarDescriptor,\n type MenubarDescriptor,\n} from \"@hjmds/design-contracts/components/menubar\";\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type CSSProperties, type RefObject } from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { AnchoredPortal, useAnchoredPopup } from \"./portal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type MenubarProps<Key extends string = string, MenuKey extends string = string> = Readonly<{\n descriptor: MenubarDescriptor<Key, MenuKey>;\n openMenuId?: MenuKey | null;\n defaultOpenMenuId?: MenuKey | null;\n onOpenMenuIdChange?: (id: MenuKey | null) => void;\n onAction: (id: Key, menuId: MenuKey) => void;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function Menubar<Key extends string = string, MenuKey extends string = string>({\n descriptor,\n openMenuId: controlledOpen,\n defaultOpenMenuId,\n onOpenMenuIdChange,\n onAction,\n className,\n layoutStyle,\n}: MenubarProps<Key, MenuKey>) {\n validateMenubarDescriptor(descriptor);\n const [openId, setOpenId] = useControllableState<MenuKey | null>({\n ...(controlledOpen === undefined ? {} : { value: controlledOpen }),\n defaultValue: defaultOpenMenuId ?? null,\n ...(onOpenMenuIdChange === undefined ? {} : { onChange: onOpenMenuIdChange }),\n });\n const enabledMenus = descriptor.menus.filter((menu) => menu.disabled !== true);\n // Roving focus: the bar is one tab stop, so the bar — not each label — owns\n // which menu is reachable by Tab.\n const [focusedId, setFocusedId] = useState<MenuKey>(enabledMenus[0]?.id ?? descriptor.menus[0]!.id);\n const [activeItemIndex, setActiveItemIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const labelRefs = useRef(new Map<MenuKey, HTMLButtonElement>());\n const openMenu = descriptor.menus.find((menu) => menu.id === openId) ?? null;\n const openItems = openMenu?.items.filter((item) => item.disabled !== true) ?? [];\n // The panel was absolute inside the bar, so any overflow ancestor clipped it\n // (2026-09-30 audit WR-0930-4: at 1100px an item could not be hit). It now uses\n // the same portal + fixed positioning as Menu; focus stays on the bar label.\n const panelId = `${useId().replaceAll(\":\", \"\")}-menubar-panel`;\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const setPanelRef = useCallback((node: HTMLDivElement | null) => setPanelNode(node), []);\n const openLabelRef = useMemo<RefObject<HTMLElement | null>>(\n () => ({ get current() { return openId === null ? null : labelRefs.current.get(openId) ?? null; } }),\n [openId],\n );\n const panelPosition = useAnchoredPopup(openLabelRef, panelNode, { gap: 0, zIndex: layer.dropdown });\n\n useEffect(() => {\n if (openId === null) return;\n const onPointerDown = (event: PointerEvent) => {\n if (event.target instanceof Node && (rootRef.current?.contains(event.target) || panelNode?.contains(event.target))) return;\n setOpenId(null);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [openId, panelNode, setOpenId]);\n\n const focusLabel = (id: MenuKey) => {\n setFocusedId(id);\n labelRefs.current.get(id)?.focus();\n };\n const move = (direction: \"next\" | \"previous\") => {\n const next = resolveMenubarNavigation(descriptor, focusedId, direction);\n focusLabel(next);\n // Left/right while a menu is open moves to the neighbour already open, which\n // is the whole reason this is a bar and not three independent Menus.\n if (openId !== null) { setOpenId(next); setActiveItemIndex(0); }\n };\n\n return (\n <div\n ref={rootRef}\n role=\"menubar\"\n aria-label={descriptor.accessibilityLabel}\n className={classNames(\"hjm-menubar\", className)}\n style={{ ...layoutStyle,\n \"--hjm-menubar-min-height\": `${menubarRecipe.minHeight}px`,\n \"--hjm-menubar-gap\": `${menubarRecipe.gap}px`,\n \"--hjm-menubar-padding\": `${menubarRecipe.paddingHorizontal}px`,\n \"--hjm-menubar-label-padding\": `${menubarRecipe.label.paddingHorizontal}px`,\n // Consume the label sm role through CSS inheritance, retaining standalone recipe geometry.\n \"--hjm-menubar-label-radius\": `var(--hjm-radius-sm, ${menubarRecipe.label.radius}px)`,\n } as CSSProperties}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\") { event.preventDefault(); move(\"next\"); return; }\n if (event.key === \"ArrowLeft\") { event.preventDefault(); move(\"previous\"); return; }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const target = (event.key === \"Home\" ? enabledMenus[0] : enabledMenus.at(-1))?.id;\n if (target !== undefined) { focusLabel(target); if (openId !== null) { setOpenId(target); setActiveItemIndex(0); } }\n return;\n }\n if (event.key === \"Escape\" && openId !== null) {\n event.preventDefault();\n setOpenId(null);\n focusLabel(focusedId);\n return;\n }\n if (openId === null) {\n if (event.key === \"ArrowDown\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpenId(focusedId);\n setActiveItemIndex(0);\n }\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveItemIndex((previous) => {\n const next = event.key === \"ArrowDown\" ? previous + 1 : previous - 1;\n return (next + openItems.length) % Math.max(openItems.length, 1);\n });\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n const item = openItems[activeItemIndex];\n if (item) {\n onAction(item.id as Key, openId);\n // Activation runs an action and leaves nothing selected — unlike Tabs.\n setOpenId(null);\n focusLabel(openId);\n }\n }\n }}\n >\n {descriptor.menus.map((menu) => {\n const open = menu.id === openId;\n return (\n <div key={menu.id} className=\"hjm-menubar__menu\">\n <button\n type=\"button\"\n ref={(node) => { if (node) labelRefs.current.set(menu.id, node); else labelRefs.current.delete(menu.id); }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? panelId : undefined}\n disabled={menu.disabled}\n tabIndex={menu.id === focusedId ? 0 : -1}\n data-open={open || undefined}\n className=\"hjm-menubar__label\"\n onClick={() => {\n setFocusedId(menu.id);\n setOpenId(open ? null : menu.id);\n setActiveItemIndex(0);\n }}\n onMouseEnter={() => {\n // Once one menu is open, hovering the bar switches menus — the\n // desktop convention; with nothing open, hover opens nothing.\n if (openId !== null && menu.disabled !== true) { setOpenId(menu.id); setFocusedId(menu.id); setActiveItemIndex(0); }\n }}\n >\n {menu.label}\n </button>\n {open ? (\n <AnchoredPortal anchorRef={openLabelRef} ssrFallback=\"inline\">\n <div ref={setPanelRef} id={panelId} role=\"menu\" aria-label={menu.label} className=\"hjm-menubar__panel\" data-placement={panelPosition.placement} style={panelPosition.style}>\n {menu.items.map((item) => {\n // Popup positioning can cause mouseenter under a stationary\n // cursor. Only movement should replace a keyboard choice.\n const index = openItems.findIndex((candidate) => candidate.id === item.id);\n return (\n <div\n key={item.id}\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n data-active={index === activeItemIndex && item.disabled !== true ? \"\" : undefined}\n data-tone={item.tone}\n className=\"hjm-menubar__item\"\n onMouseMove={() => { if (index >= 0) setActiveItemIndex(index); }}\n onClick={() => {\n if (item.disabled) return;\n onAction(item.id as Key, menu.id);\n setOpenId(null);\n focusLabel(menu.id);\n }}\n >\n <span>{item.label}</span>\n {item.shortcut ? <kbd className=\"hjm-menubar__shortcut\">{item.shortcut}</kbd> : null}\n </div>\n );\n })}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
package/dist/provider.js CHANGED
@@ -1,4 +1,7 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
+ // The provider creates React context and observes browser preferences; server pages can pass a serializable product profile without wrapping the whole page.
4
+ // Root-barrel marking would also move unrelated exports; see docs/qa/2026-10-07-rsc-profile-boundary.md.
2
5
  import { DesignProfileContext } from "./internal.js";
3
6
  import { designSystemEnvironmentDefaults, isLargeTextScale, resolveDensityDefault, resolveDesignSystemProviderValue, validateDesignSystemProviderValue, } from "@hjmds/design-contracts/components/design-system-provider";
4
7
  import { tooltipBehaviorDefaults } from "@hjmds/design-contracts/components/tooltip";
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EACL,+BAA+B,EAC/B,gBAAgB,EAChB,qBAAqB,EACrB,gCAAgC,EAChC,iCAAiC,GAMlC,MAAM,2DAA2D,CAAC;AAEnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,oBAAoB,GAGrB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,eAAe,GAAG,aAAa,CAAmC,IAAI,CAAC,CAAC;AAK9E;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;AASrF,MAAM,yBAAyB,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAEjF,SAAS,cAAc,CAAC,KAAa,EAAE,QAAoB;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,OAAO,GAAG,IAAI;IAClD,OAAO,oBAAoB,CACzB,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,EACzE,GAAG,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,EACjD,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AA2DD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CACnC,SAAS,WAAW,CAClB,EACE,QAAQ,EACR,KAAK,EACL,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,YAAY,EAAE,oBAAoB,EAClC,aAAa,EAAE,qBAAqB,EACpC,IAAI,GAAG,SAAS,EAChB,KAAK,EAAE,aAAa,EACpB,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EACD,GAAG;IAEH,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,qBAAqB,IAAI,MAAM,EAAE,aAAa,CAAC;IACrE,MAAM,qBAAqB,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,oBAAoB,IAAI,qBAAqB,CAAC;IACnE,MAAM,cAAc,GAAG,aAAa,KAAK,SAAS,CAAC;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;IAClF,MAAM,oBAAoB,GAAG,aAAa,CACxC,kCAAkC,EAClC,cAAc,CACf,CAAC;IACF,MAAM,mBAAmB,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;QACzD,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC9C,CAAC;IACF,MAAM,KAAK,GAAG,aAAa,IAAI,gCAAgC,CAAC,KAAK,EAAE;QACrE,WAAW,EAAE,mBAAmB;QAChC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1D,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YAChD,CAAC,CAAC,EAAE,mBAAmB,EAAE,oBAAoB,EAAE;YAC/C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,iCAAiC,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5E,MAAM,kBAAkB,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACvD,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACpE,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;IAC7C,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QACjD,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAC;YACnC,IAAI,OAAO,KAAK,IAAI;gBAAE,0BAA0B,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtE,kBAAkB,CAAC,OAAO,GAAG,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QACnD,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAC;YACnC,0BAA0B,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAChD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,sBAAsB,GAAG,WAAW,CACxC,GAAG,EAAE,CACH,kBAAkB,CAAC,OAAO,KAAK,IAAI;QACnC,IAAI,CAAC,GAAG,EAAE,GAAG,0BAA0B,CAAC,OAAO;YAC7C,uBAAuB,CAAC,WAAW,EACvC,EAAE,CACH,CAAC;IACF,MAAM,kBAAkB,GAAuB;QAC7C,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,iBAAiB;QAC7B,eAAe,EAAE,sBAAsB;KACxC,CAAC;IAEF,+EAA+E;IAC/E,iFAAiF;IACjF,iFAAiF;IACjF,6EAA6E;IAC7E,iBAAiB;IACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/E,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACpC,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,CAAC,aAAa,YACvD,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,YAC5F,KAAC,yBAAyB,CAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB,YAC3D,iBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,uBAC1B,EAAE,eACT,IAAI,iBACF,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gBAC/C,WAAW,CAAC,KAAK,yBACR,KAAK,CAAC,aAAa,EAAE,EAAE,qBAC3B,WAAW,CAAC,SAAS,qBACrB,SAAS,EAC1B,GAAG,EAAE,WAAW,CAAC,SAAS,EAC1B,KAAK,EAAE,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,YAEjD,QAAQ,GACL,GAC6B,GACL,GACJ,GACP,CAC5B,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAoE;IAEpE,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1C,OAAO,qBAAqB,CAC1B,KAAK,EAAE,WAAW,CAAC,OAAO,IAAI,+BAA+B,CAAC,OAAO,EACrE,UAAU,CACX,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB;IACnC,OAAO,UAAU,CAAC,yBAAyB,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import { DesignProfileContext } from \"./internal.js\";\nimport type { HjmDesignProfile } from \"@hjmds/design-contracts/design-profile\";\nimport {\n designSystemEnvironmentDefaults,\n isLargeTextScale,\n resolveDensityDefault,\n resolveDesignSystemProviderValue,\n validateDesignSystemProviderValue,\n type DesignSystemDensity,\n type DesignSystemDirection,\n type DesignSystemProviderValue,\n type DesignSystemTextScale,\n type ResolveDesignSystemEnvironmentOptions,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport type { ResolvedTheme, ThemePreference } from \"@hjmds/design-contracts/colors\";\nimport { tooltipBehaviorDefaults } from \"@hjmds/design-contracts/components/tooltip\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useState,\n useSyncExternalStore,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\nconst HjmThemeContext = createContext<DesignSystemProviderValue | null>(null);\n\n/** Per-theme partial palette merged over the HJM defaults; see docs/brand-boundary.md. */\nexport type HjmBrandPalette = NonNullable<ResolveDesignSystemEnvironmentOptions[\"brandPalette\"]>;\n\n/**\n * The nearest ancestor's brand palette. A nested provider (for example one that\n * only changes density) keeps the product brand instead of falling back to the\n * HJM defaults, because the resolved palette alone cannot be split back into\n * defaults and overrides.\n */\nconst HjmBrandPaletteContext = createContext<HjmBrandPalette | undefined>(undefined);\n\nexport type TooltipCoordinator = Readonly<{\n activeId: string | null;\n activate(id: string): void;\n deactivate(id: string): void;\n shouldSkipDelay(): boolean;\n}>;\n\nconst TooltipCoordinatorContext = createContext<TooltipCoordinator | null>(null);\n\nfunction subscribeMedia(query: string, callback: () => void): () => void {\n const media = window.matchMedia(query);\n media.addEventListener(\"change\", callback);\n return () => media.removeEventListener(\"change\", callback);\n}\n\nfunction useMediaQuery(query: string, observe = true): boolean {\n return useSyncExternalStore(\n (callback) => observe ? subscribeMedia(query, callback) : () => undefined,\n () => observe && window.matchMedia(query).matches,\n () => false,\n );\n}\n\ntype HjmProviderEnvironmentProps = Readonly<{\n value?: never;\n theme?: ThemePreference;\n direction?: DesignSystemDirection;\n textScale?: DesignSystemTextScale;\n reducedMotion?: boolean;\n minimumVisualTarget?: boolean;\n /** Default row/menu/table density below this provider; each component's prop wins. */\n density?: DesignSystemDensity;\n /** Deterministic SSR/test override; otherwise prefers-color-scheme is observed. */\n systemTheme?: ResolvedTheme;\n /**\n * The supported brand route (docs/brand-boundary.md). Before 1.5.0 the only way\n * to brand was a hand-built `value`, which also stopped the provider from\n * following the OS theme and reduced-motion settings.\n */\n brandPalette?: HjmBrandPalette;\n /** Appearance and interaction defaults defined once by the product. Explicit props win. */\n designProfile?: HjmDesignProfile;\n}>;\n\ntype HjmProviderValueProps = Readonly<{\n /** Complete, validated environment and semantic product palette. */\n value: DesignSystemProviderValue;\n theme?: never;\n direction?: never;\n textScale?: never;\n reducedMotion?: never;\n minimumVisualTarget?: never;\n density?: never;\n systemTheme?: never;\n brandPalette?: never;\n designProfile?: never;\n}>;\n\n/**\n * How the provider's own host element participates in layout and painting.\n *\n * `surface` (default) paints the HJM background, text color and UI typography,\n * which is what a page whose root *is* the provider needs. A product whose\n * document root already paints its surface previously had to neutralise the\n * host with an inline `display: contents` style, re-entering product code into\n * the renderer boundary; `contents` is that intent as a supported axis — the\n * element still carries the CSS variables, `dir` and data attributes.\n */\nexport type HjmProviderHost = \"surface\" | \"contents\";\n\n// No `layoutStyle`: a theme/context provider, not a placed component; place its children.\nexport type HjmProviderProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"dir\"\n> &\n Readonly<{\n children: ReactNode;\n host?: HjmProviderHost;\n }> & (HjmProviderEnvironmentProps | HjmProviderValueProps);\n\nexport const HjmProvider = forwardRef<HTMLDivElement, HjmProviderProps>(\n function HjmProvider(\n {\n children,\n theme,\n direction,\n textScale,\n reducedMotion,\n minimumVisualTarget,\n density,\n systemTheme,\n brandPalette: suppliedBrandPalette,\n designProfile: suppliedDesignProfile,\n host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\n const designProfile = suppliedDesignProfile ?? parent?.designProfile;\n const inheritedBrandPalette = useContext(HjmBrandPaletteContext);\n const brandPalette = suppliedBrandPalette ?? inheritedBrandPalette;\n const observesSystem = suppliedValue === undefined;\n const prefersDark = useMediaQuery(\"(prefers-color-scheme: dark)\", observesSystem);\n const prefersReducedMotion = useMediaQuery(\n \"(prefers-reduced-motion: reduce)\",\n observesSystem,\n );\n const resolvedSystemTheme = systemTheme ?? (prefersDark ? \"dark\" : \"light\");\n const input = {\n ...(theme === undefined ? {} : { theme }),\n ...(direction === undefined ? {} : { direction }),\n ...(textScale === undefined ? {} : { textScale }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n ...(minimumVisualTarget === undefined ? {} : { minimumVisualTarget }),\n ...(density === undefined ? {} : { density }),\n };\n const value = suppliedValue ?? resolveDesignSystemProviderValue(input, {\n systemTheme: resolvedSystemTheme,\n ...(brandPalette === undefined ? {} : { brandPalette }),\n ...(designProfile === undefined ? {} : { designProfile }),\n ...(parent === null ? {} : { parent: parent.environment }),\n ...(reducedMotion === undefined && parent === null\n ? { systemReducedMotion: prefersReducedMotion }\n : {}),\n });\n validateDesignSystemProviderValue(value);\n const environment = value.environment;\n const [activeTooltipId, setActiveTooltipId] = useState<string | null>(null);\n const activeTooltipIdRef = useRef<string | null>(null);\n const lastTooltipTransitionAtRef = useRef(Number.NEGATIVE_INFINITY);\n activeTooltipIdRef.current = activeTooltipId;\n const activateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current === id) return current;\n if (current !== null) lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = id;\n return id;\n });\n }, []);\n const deactivateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current !== id) return current;\n lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = null;\n return null;\n });\n }, []);\n const shouldSkipTooltipDelay = useCallback(\n () =>\n activeTooltipIdRef.current !== null ||\n Date.now() - lastTooltipTransitionAtRef.current <\n tooltipBehaviorDefaults.skipDelayMs,\n [],\n );\n const tooltipCoordinator: TooltipCoordinator = {\n activeId: activeTooltipId,\n activate: activateTooltip,\n deactivate: deactivateTooltip,\n shouldSkipDelay: shouldSkipTooltipDelay,\n };\n\n // `data-text-scale` is a number, so a stylesheet cannot ask whether it crossed\n // `largeTextThreshold`. The provider resolves that comparison once and publishes\n // the answer; letting each renderer read the environment instead would pull this\n // module into granular entries like ./selection and blow their gzip budgets.\n // See issue #20.\n const largeText = isLargeTextScale(environment.textScale) ? \"true\" : undefined;\n\n return (\n <HjmThemeContext.Provider value={value}>\n <DesignProfileContext.Provider value={value.designProfile}>\n <HjmBrandPaletteContext.Provider value={suppliedValue === undefined ? brandPalette : undefined}>\n <TooltipCoordinatorContext.Provider value={tooltipCoordinator}>\n <div\n {...rest}\n ref={ref}\n className={classNames(\"hjm-root\", className)}\n data-hjm-provider=\"\"\n data-host={host}\n data-motion={environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={environment.theme}\n data-design-profile={value.designProfile?.id}\n data-text-scale={environment.textScale}\n data-large-text={largeText}\n dir={environment.direction}\n style={{ ...createHjmThemeStyle(value), ...style }}\n >\n {children}\n </div>\n </TooltipCoordinatorContext.Provider>\n </HjmBrandPaletteContext.Provider>\n </DesignProfileContext.Provider>\n </HjmThemeContext.Provider>\n );\n },\n);\n\nexport function useHjmTheme(): DesignSystemProviderValue {\n const value = useContext(HjmThemeContext);\n if (value === null) {\n throw new Error(\"useHjmTheme must be used inside HjmProvider\");\n }\n return value;\n}\n\n/** Renderer components use the browser default direction when no provider is present. */\nexport function useOptionalHjmTheme(): DesignSystemProviderValue | null {\n return useContext(HjmThemeContext);\n}\n\n/**\n * Resolves the provider's density onto one component's own density vocabulary.\n * Outside a provider the component's recipe default stands — a global axis must\n * not make an unwrapped renderer behave differently from a wrapped one at rest.\n */\nexport function useHjmDensityDefault<Comfortable extends string, Compact extends string>(\n vocabulary: Readonly<{ comfortable: Comfortable; compact: Compact }>,\n): Comfortable | Compact {\n const theme = useContext(HjmThemeContext);\n return resolveDensityDefault(\n theme?.environment.density ?? designSystemEnvironmentDefaults.density,\n vocabulary,\n );\n}\n\n/** Internal provider-scoped coordination used by Tooltip renderers. */\nexport function useTooltipCoordinator(): TooltipCoordinator | null {\n return useContext(TooltipCoordinatorContext);\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n// The provider creates React context and observes browser preferences; server pages can pass a serializable product profile without wrapping the whole page.\n// Root-barrel marking would also move unrelated exports; see docs/qa/2026-10-07-rsc-profile-boundary.md.\nimport { DesignProfileContext } from \"./internal.js\";\nimport type { HjmDesignProfile } from \"@hjmds/design-contracts/design-profile\";\nimport {\n designSystemEnvironmentDefaults,\n isLargeTextScale,\n resolveDensityDefault,\n resolveDesignSystemProviderValue,\n validateDesignSystemProviderValue,\n type DesignSystemDensity,\n type DesignSystemDirection,\n type DesignSystemProviderValue,\n type DesignSystemTextScale,\n type ResolveDesignSystemEnvironmentOptions,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport type { ResolvedTheme, ThemePreference } from \"@hjmds/design-contracts/colors\";\nimport { tooltipBehaviorDefaults } from \"@hjmds/design-contracts/components/tooltip\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useState,\n useSyncExternalStore,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\nconst HjmThemeContext = createContext<DesignSystemProviderValue | null>(null);\n\n/** Per-theme partial palette merged over the HJM defaults; see docs/brand-boundary.md. */\nexport type HjmBrandPalette = NonNullable<ResolveDesignSystemEnvironmentOptions[\"brandPalette\"]>;\n\n/**\n * The nearest ancestor's brand palette. A nested provider (for example one that\n * only changes density) keeps the product brand instead of falling back to the\n * HJM defaults, because the resolved palette alone cannot be split back into\n * defaults and overrides.\n */\nconst HjmBrandPaletteContext = createContext<HjmBrandPalette | undefined>(undefined);\n\nexport type TooltipCoordinator = Readonly<{\n activeId: string | null;\n activate(id: string): void;\n deactivate(id: string): void;\n shouldSkipDelay(): boolean;\n}>;\n\nconst TooltipCoordinatorContext = createContext<TooltipCoordinator | null>(null);\n\nfunction subscribeMedia(query: string, callback: () => void): () => void {\n const media = window.matchMedia(query);\n media.addEventListener(\"change\", callback);\n return () => media.removeEventListener(\"change\", callback);\n}\n\nfunction useMediaQuery(query: string, observe = true): boolean {\n return useSyncExternalStore(\n (callback) => observe ? subscribeMedia(query, callback) : () => undefined,\n () => observe && window.matchMedia(query).matches,\n () => false,\n );\n}\n\ntype HjmProviderEnvironmentProps = Readonly<{\n value?: never;\n theme?: ThemePreference;\n direction?: DesignSystemDirection;\n textScale?: DesignSystemTextScale;\n reducedMotion?: boolean;\n minimumVisualTarget?: boolean;\n /** Default row/menu/table density below this provider; each component's prop wins. */\n density?: DesignSystemDensity;\n /** Deterministic SSR/test override; otherwise prefers-color-scheme is observed. */\n systemTheme?: ResolvedTheme;\n /**\n * The supported brand route (docs/brand-boundary.md). Before 1.5.0 the only way\n * to brand was a hand-built `value`, which also stopped the provider from\n * following the OS theme and reduced-motion settings.\n */\n brandPalette?: HjmBrandPalette;\n /** Appearance and interaction defaults defined once by the product. Explicit props win. */\n designProfile?: HjmDesignProfile;\n}>;\n\ntype HjmProviderValueProps = Readonly<{\n /** Complete, validated environment and semantic product palette. */\n value: DesignSystemProviderValue;\n theme?: never;\n direction?: never;\n textScale?: never;\n reducedMotion?: never;\n minimumVisualTarget?: never;\n density?: never;\n systemTheme?: never;\n brandPalette?: never;\n designProfile?: never;\n}>;\n\n/**\n * How the provider's own host element participates in layout and painting.\n *\n * `surface` (default) paints the HJM background, text color and UI typography,\n * which is what a page whose root *is* the provider needs. A product whose\n * document root already paints its surface previously had to neutralise the\n * host with an inline `display: contents` style, re-entering product code into\n * the renderer boundary; `contents` is that intent as a supported axis — the\n * element still carries the CSS variables, `dir` and data attributes.\n */\nexport type HjmProviderHost = \"surface\" | \"contents\";\n\n// No `layoutStyle`: a theme/context provider, not a placed component; place its children.\nexport type HjmProviderProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"dir\"\n> &\n Readonly<{\n children: ReactNode;\n host?: HjmProviderHost;\n }> & (HjmProviderEnvironmentProps | HjmProviderValueProps);\n\nexport const HjmProvider = forwardRef<HTMLDivElement, HjmProviderProps>(\n function HjmProvider(\n {\n children,\n theme,\n direction,\n textScale,\n reducedMotion,\n minimumVisualTarget,\n density,\n systemTheme,\n brandPalette: suppliedBrandPalette,\n designProfile: suppliedDesignProfile,\n host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\n const designProfile = suppliedDesignProfile ?? parent?.designProfile;\n const inheritedBrandPalette = useContext(HjmBrandPaletteContext);\n const brandPalette = suppliedBrandPalette ?? inheritedBrandPalette;\n const observesSystem = suppliedValue === undefined;\n const prefersDark = useMediaQuery(\"(prefers-color-scheme: dark)\", observesSystem);\n const prefersReducedMotion = useMediaQuery(\n \"(prefers-reduced-motion: reduce)\",\n observesSystem,\n );\n const resolvedSystemTheme = systemTheme ?? (prefersDark ? \"dark\" : \"light\");\n const input = {\n ...(theme === undefined ? {} : { theme }),\n ...(direction === undefined ? {} : { direction }),\n ...(textScale === undefined ? {} : { textScale }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n ...(minimumVisualTarget === undefined ? {} : { minimumVisualTarget }),\n ...(density === undefined ? {} : { density }),\n };\n const value = suppliedValue ?? resolveDesignSystemProviderValue(input, {\n systemTheme: resolvedSystemTheme,\n ...(brandPalette === undefined ? {} : { brandPalette }),\n ...(designProfile === undefined ? {} : { designProfile }),\n ...(parent === null ? {} : { parent: parent.environment }),\n ...(reducedMotion === undefined && parent === null\n ? { systemReducedMotion: prefersReducedMotion }\n : {}),\n });\n validateDesignSystemProviderValue(value);\n const environment = value.environment;\n const [activeTooltipId, setActiveTooltipId] = useState<string | null>(null);\n const activeTooltipIdRef = useRef<string | null>(null);\n const lastTooltipTransitionAtRef = useRef(Number.NEGATIVE_INFINITY);\n activeTooltipIdRef.current = activeTooltipId;\n const activateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current === id) return current;\n if (current !== null) lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = id;\n return id;\n });\n }, []);\n const deactivateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current !== id) return current;\n lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = null;\n return null;\n });\n }, []);\n const shouldSkipTooltipDelay = useCallback(\n () =>\n activeTooltipIdRef.current !== null ||\n Date.now() - lastTooltipTransitionAtRef.current <\n tooltipBehaviorDefaults.skipDelayMs,\n [],\n );\n const tooltipCoordinator: TooltipCoordinator = {\n activeId: activeTooltipId,\n activate: activateTooltip,\n deactivate: deactivateTooltip,\n shouldSkipDelay: shouldSkipTooltipDelay,\n };\n\n // `data-text-scale` is a number, so a stylesheet cannot ask whether it crossed\n // `largeTextThreshold`. The provider resolves that comparison once and publishes\n // the answer; letting each renderer read the environment instead would pull this\n // module into granular entries like ./selection and blow their gzip budgets.\n // See issue #20.\n const largeText = isLargeTextScale(environment.textScale) ? \"true\" : undefined;\n\n return (\n <HjmThemeContext.Provider value={value}>\n <DesignProfileContext.Provider value={value.designProfile}>\n <HjmBrandPaletteContext.Provider value={suppliedValue === undefined ? brandPalette : undefined}>\n <TooltipCoordinatorContext.Provider value={tooltipCoordinator}>\n <div\n {...rest}\n ref={ref}\n className={classNames(\"hjm-root\", className)}\n data-hjm-provider=\"\"\n data-host={host}\n data-motion={environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={environment.theme}\n data-design-profile={value.designProfile?.id}\n data-text-scale={environment.textScale}\n data-large-text={largeText}\n dir={environment.direction}\n style={{ ...createHjmThemeStyle(value), ...style }}\n >\n {children}\n </div>\n </TooltipCoordinatorContext.Provider>\n </HjmBrandPaletteContext.Provider>\n </DesignProfileContext.Provider>\n </HjmThemeContext.Provider>\n );\n },\n);\n\nexport function useHjmTheme(): DesignSystemProviderValue {\n const value = useContext(HjmThemeContext);\n if (value === null) {\n throw new Error(\"useHjmTheme must be used inside HjmProvider\");\n }\n return value;\n}\n\n/** Renderer components use the browser default direction when no provider is present. */\nexport function useOptionalHjmTheme(): DesignSystemProviderValue | null {\n return useContext(HjmThemeContext);\n}\n\n/**\n * Resolves the provider's density onto one component's own density vocabulary.\n * Outside a provider the component's recipe default stands — a global axis must\n * not make an unwrapped renderer behave differently from a wrapped one at rest.\n */\nexport function useHjmDensityDefault<Comfortable extends string, Compact extends string>(\n vocabulary: Readonly<{ comfortable: Comfortable; compact: Compact }>,\n): Comfortable | Compact {\n const theme = useContext(HjmThemeContext);\n return resolveDensityDefault(\n theme?.environment.density ?? designSystemEnvironmentDefaults.density,\n vocabulary,\n );\n}\n\n/** Internal provider-scoped coordination used by Tooltip renderers. */\nexport function useTooltipCoordinator(): TooltipCoordinator | null {\n return useContext(TooltipCoordinatorContext);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../src/sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC/F,UAAU,EAAE,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,yFAAyF;IACzF,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,+DAA+D;IAC/D,cAAc,CAAC,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;IAC9B,mFAAmF;IACnF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IAC5D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,eAAO,MAAM,OAAO,EA2Gd,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAChE,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../src/sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC/F,UAAU,EAAE,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,yFAAyF;IACzF,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,+DAA+D;IAC/D,cAAc,CAAC,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;IAC9B,mFAAmF;IACnF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IAC5D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,eAAO,MAAM,OAAO,EA4Gd,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAChE,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC"}
package/dist/sidebar.js CHANGED
@@ -29,7 +29,8 @@ export const Sidebar = forwardRef(function Sidebar({ descriptor, appearance = "s
29
29
  }, style: { ...layoutStyle,
30
30
  "--hjm-sidebar-width": `${collapsed ? sidebarRecipe.widths.collapsed : sidebarRecipe.widths.expanded}px`,
31
31
  "--hjm-sidebar-item-height": `${sidebarRecipe.itemMinHeight}px`,
32
- "--hjm-sidebar-item-radius": `${sidebarRecipe.itemRadius}px`,
32
+ // CSS inheritance preserves nested profiles without adding a Provider dependency.
33
+ "--hjm-sidebar-item-radius": `var(--hjm-radius-md, ${sidebarRecipe.itemRadius}px)`,
33
34
  "--hjm-sidebar-gap": `${sidebarRecipe.gap}px`,
34
35
  "--hjm-sidebar-group-gap": `${sidebarRecipe.groupGap}px`,
35
36
  }, children: [collapseLabels ? (_jsx("button", { type: "button", className: "hjm-sidebar__toggle", "aria-expanded": !collapsed, "aria-label": collapsed ? collapseLabels.expand : collapseLabels.collapse, onClick: () => setCollapsed(!collapsed), children: _jsx("span", { "aria-hidden": "true", children: collapsed ? "»" : "«" }) })) : null, descriptor.groups.map((group) => (_jsxs("div", { className: "hjm-sidebar__group", role: "group", "aria-label": group.label, children: [group.label ? _jsx("p", { className: "hjm-sidebar__group-label", "aria-hidden": "true", children: group.label }) : null, _jsx("ul", { className: "hjm-sidebar__list", children: group.items.map((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../src/sidebar.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n sidebarDefaults,\n sidebarRecipe,\n validateSidebarDescriptor,\n type SidebarDescriptor,\n type SidebarItemDescriptor,\n} from \"@hjmds/design-contracts/components/sidebar\";\nimport {\n forwardRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type SidebarAppearance = \"standard\" | \"bounce\" | \"hook\" | \"proximity\";\n\nexport type SidebarProps<Id extends string = string, GroupId extends string = string> = Readonly<{\n descriptor: SidebarDescriptor<Id, GroupId>;\n /** Decoration only; link hit areas and document-order keyboard navigation stay fixed. */\n appearance?: SidebarAppearance;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Localized names for the collapse control in both states. */\n collapseLabels?: Readonly<{ collapse: string; expand: string }>;\n onNavigate?: (id: Id) => void;\n /** Product-owned icon per item; required for the collapsed rail to stay usable. */\n renderIcon?: (item: SidebarItemDescriptor<Id>) => ReactNode;\n renderBadge?: (count: number, item: SidebarItemDescriptor<Id>) => ReactNode;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Sidebar = forwardRef(function Sidebar<Id extends string = string, GroupId extends string = string>(\n {\n descriptor,\n appearance = \"standard\",\n collapsed: controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n collapseLabels,\n onNavigate,\n renderIcon,\n renderBadge,\n className,\n layoutStyle,\n }: SidebarProps<Id, GroupId>,\n forwardedRef: React.Ref<HTMLElement>,\n) {\n validateSidebarDescriptor(descriptor);\n const theme = useOptionalHjmTheme();\n const animate = theme !== null && !theme.environment.reducedMotion;\n const [activatedId, setActivatedId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n ...(controlledCollapsed === undefined ? {} : { value: controlledCollapsed }),\n defaultValue: defaultCollapsed ?? sidebarDefaults.collapsed,\n ...(onCollapsedChange === undefined ? {} : { onChange: onCollapsedChange }),\n });\n return (\n <nav\n ref={forwardedRef}\n aria-label={descriptor.accessibilityLabel}\n className={classNames(\"hjm-sidebar\", className)}\n data-collapsed={collapsed || undefined}\n data-appearance={appearance}\n data-animate={animate || undefined}\n onPointerMove={event => {\n if (appearance !== \"proximity\" || !animate || event.pointerType === \"touch\") return;\n // Only icon decoration responds to distance; moving links would shift click/focus targets.\n for (const item of event.currentTarget.querySelectorAll<HTMLElement>(\".hjm-sidebar__item\")) {\n const bounds = item.getBoundingClientRect();\n const distance = Math.abs(event.clientY - (bounds.top + bounds.height / 2));\n const proximity = item.getAttribute(\"aria-disabled\") === \"true\" ? 0 : Math.max(0, 1 - distance / (bounds.height * 2));\n item.style.setProperty(\"--hjm-sidebar-proximity\", String(proximity));\n }\n }}\n onPointerLeave={event => {\n for (const item of event.currentTarget.querySelectorAll<HTMLElement>(\".hjm-sidebar__item\")) item.style.removeProperty(\"--hjm-sidebar-proximity\");\n }}\n style={{ ...layoutStyle,\n \"--hjm-sidebar-width\": `${collapsed ? sidebarRecipe.widths.collapsed : sidebarRecipe.widths.expanded}px`,\n \"--hjm-sidebar-item-height\": `${sidebarRecipe.itemMinHeight}px`,\n \"--hjm-sidebar-item-radius\": `${sidebarRecipe.itemRadius}px`,\n \"--hjm-sidebar-gap\": `${sidebarRecipe.gap}px`,\n \"--hjm-sidebar-group-gap\": `${sidebarRecipe.groupGap}px`,\n } as CSSProperties}\n >\n {collapseLabels ? (\n <button\n type=\"button\"\n className=\"hjm-sidebar__toggle\"\n aria-expanded={!collapsed}\n aria-label={collapsed ? collapseLabels.expand : collapseLabels.collapse}\n onClick={() => setCollapsed(!collapsed)}\n >\n <span aria-hidden=\"true\">{collapsed ? \"»\" : \"«\"}</span>\n </button>\n ) : null}\n {descriptor.groups.map((group) => (\n <div key={group.id} className=\"hjm-sidebar__group\" role=\"group\" aria-label={group.label}>\n {/*\n Collapsing is density, not content: the group label is hidden\n visually but the group keeps its accessible name.\n */}\n {group.label ? <p className=\"hjm-sidebar__group-label\" aria-hidden=\"true\">{group.label}</p> : null}\n <ul className=\"hjm-sidebar__list\">\n {group.items.map((item) => {\n const current = descriptor.currentId === item.id;\n return (\n <li key={item.id}>\n <a\n className=\"hjm-sidebar__item\"\n href={item.destination?.kind === \"internal\" ? item.destination.href : item.destination?.href}\n aria-current={current ? \"page\" : undefined}\n data-bounce={current && activatedId === item.id || undefined}\n aria-disabled={item.disabled || undefined}\n // Collapsed labels are hidden visually, so the name comes\n // from the attribute instead of disappearing with the text.\n aria-label={collapsed ? item.label : undefined}\n tabIndex={item.disabled ? -1 : undefined}\n onClick={(event) => {\n if (item.disabled) { event.preventDefault(); return; }\n if (appearance === \"bounce\" && animate) setActivatedId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {renderIcon ? <span aria-hidden=\"true\" className=\"hjm-sidebar__icon\">{renderIcon(item)}</span> : null}\n <span className=\"hjm-sidebar__label\">{item.label}</span>\n {item.badgeCount !== undefined ? (\n <span className=\"hjm-sidebar__badge\">{renderBadge?.(item.badgeCount, item) ?? item.badgeCount}</span>\n ) : null}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n );\n}) as <Id extends string = string, GroupId extends string = string>(\n props: SidebarProps<Id, GroupId> & { ref?: React.Ref<HTMLElement> },\n) => React.ReactElement | null;\n"]}
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../src/sidebar.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n sidebarDefaults,\n sidebarRecipe,\n validateSidebarDescriptor,\n type SidebarDescriptor,\n type SidebarItemDescriptor,\n} from \"@hjmds/design-contracts/components/sidebar\";\nimport {\n forwardRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type SidebarAppearance = \"standard\" | \"bounce\" | \"hook\" | \"proximity\";\n\nexport type SidebarProps<Id extends string = string, GroupId extends string = string> = Readonly<{\n descriptor: SidebarDescriptor<Id, GroupId>;\n /** Decoration only; link hit areas and document-order keyboard navigation stay fixed. */\n appearance?: SidebarAppearance;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Localized names for the collapse control in both states. */\n collapseLabels?: Readonly<{ collapse: string; expand: string }>;\n onNavigate?: (id: Id) => void;\n /** Product-owned icon per item; required for the collapsed rail to stay usable. */\n renderIcon?: (item: SidebarItemDescriptor<Id>) => ReactNode;\n renderBadge?: (count: number, item: SidebarItemDescriptor<Id>) => ReactNode;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Sidebar = forwardRef(function Sidebar<Id extends string = string, GroupId extends string = string>(\n {\n descriptor,\n appearance = \"standard\",\n collapsed: controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n collapseLabels,\n onNavigate,\n renderIcon,\n renderBadge,\n className,\n layoutStyle,\n }: SidebarProps<Id, GroupId>,\n forwardedRef: React.Ref<HTMLElement>,\n) {\n validateSidebarDescriptor(descriptor);\n const theme = useOptionalHjmTheme();\n const animate = theme !== null && !theme.environment.reducedMotion;\n const [activatedId, setActivatedId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n ...(controlledCollapsed === undefined ? {} : { value: controlledCollapsed }),\n defaultValue: defaultCollapsed ?? sidebarDefaults.collapsed,\n ...(onCollapsedChange === undefined ? {} : { onChange: onCollapsedChange }),\n });\n return (\n <nav\n ref={forwardedRef}\n aria-label={descriptor.accessibilityLabel}\n className={classNames(\"hjm-sidebar\", className)}\n data-collapsed={collapsed || undefined}\n data-appearance={appearance}\n data-animate={animate || undefined}\n onPointerMove={event => {\n if (appearance !== \"proximity\" || !animate || event.pointerType === \"touch\") return;\n // Only icon decoration responds to distance; moving links would shift click/focus targets.\n for (const item of event.currentTarget.querySelectorAll<HTMLElement>(\".hjm-sidebar__item\")) {\n const bounds = item.getBoundingClientRect();\n const distance = Math.abs(event.clientY - (bounds.top + bounds.height / 2));\n const proximity = item.getAttribute(\"aria-disabled\") === \"true\" ? 0 : Math.max(0, 1 - distance / (bounds.height * 2));\n item.style.setProperty(\"--hjm-sidebar-proximity\", String(proximity));\n }\n }}\n onPointerLeave={event => {\n for (const item of event.currentTarget.querySelectorAll<HTMLElement>(\".hjm-sidebar__item\")) item.style.removeProperty(\"--hjm-sidebar-proximity\");\n }}\n style={{ ...layoutStyle,\n \"--hjm-sidebar-width\": `${collapsed ? sidebarRecipe.widths.collapsed : sidebarRecipe.widths.expanded}px`,\n \"--hjm-sidebar-item-height\": `${sidebarRecipe.itemMinHeight}px`,\n // CSS inheritance preserves nested profiles without adding a Provider dependency.\n \"--hjm-sidebar-item-radius\": `var(--hjm-radius-md, ${sidebarRecipe.itemRadius}px)`,\n \"--hjm-sidebar-gap\": `${sidebarRecipe.gap}px`,\n \"--hjm-sidebar-group-gap\": `${sidebarRecipe.groupGap}px`,\n } as CSSProperties}\n >\n {collapseLabels ? (\n <button\n type=\"button\"\n className=\"hjm-sidebar__toggle\"\n aria-expanded={!collapsed}\n aria-label={collapsed ? collapseLabels.expand : collapseLabels.collapse}\n onClick={() => setCollapsed(!collapsed)}\n >\n <span aria-hidden=\"true\">{collapsed ? \"»\" : \"«\"}</span>\n </button>\n ) : null}\n {descriptor.groups.map((group) => (\n <div key={group.id} className=\"hjm-sidebar__group\" role=\"group\" aria-label={group.label}>\n {/*\n Collapsing is density, not content: the group label is hidden\n visually but the group keeps its accessible name.\n */}\n {group.label ? <p className=\"hjm-sidebar__group-label\" aria-hidden=\"true\">{group.label}</p> : null}\n <ul className=\"hjm-sidebar__list\">\n {group.items.map((item) => {\n const current = descriptor.currentId === item.id;\n return (\n <li key={item.id}>\n <a\n className=\"hjm-sidebar__item\"\n href={item.destination?.kind === \"internal\" ? item.destination.href : item.destination?.href}\n aria-current={current ? \"page\" : undefined}\n data-bounce={current && activatedId === item.id || undefined}\n aria-disabled={item.disabled || undefined}\n // Collapsed labels are hidden visually, so the name comes\n // from the attribute instead of disappearing with the text.\n aria-label={collapsed ? item.label : undefined}\n tabIndex={item.disabled ? -1 : undefined}\n onClick={(event) => {\n if (item.disabled) { event.preventDefault(); return; }\n if (appearance === \"bounce\" && animate) setActivatedId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {renderIcon ? <span aria-hidden=\"true\" className=\"hjm-sidebar__icon\">{renderIcon(item)}</span> : null}\n <span className=\"hjm-sidebar__label\">{item.label}</span>\n {item.badgeCount !== undefined ? (\n <span className=\"hjm-sidebar__badge\">{renderBadge?.(item.badgeCount, item) ?? item.badgeCount}</span>\n ) : null}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n );\n}) as <Id extends string = string, GroupId extends string = string>(\n props: SidebarProps<Id, GroupId> & { ref?: React.Ref<HTMLElement> },\n) => React.ReactElement | null;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"skip-nav.d.ts","sourceRoot":"","sources":["../src/skip-nav.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAc,KAAK,oBAAoB,EAAsB,MAAM,OAAO,CAAC;AAIlF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,GAC3F,iBAAiB,GACjB,QAAQ,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO;;;;gBAFK,MAAM;sDAoC7B,CAAC"}
1
+ {"version":3,"file":"skip-nav.d.ts","sourceRoot":"","sources":["../src/skip-nav.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAc,KAAK,oBAAoB,EAAsB,MAAM,OAAO,CAAC;AAIlF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,GAC3F,iBAAiB,GACjB,QAAQ,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO;;;;gBAFK,MAAM;sDAqC7B,CAAC"}
package/dist/skip-nav.js CHANGED
@@ -7,7 +7,8 @@ export const SkipNav = forwardRef(function SkipNav({ targetId, label, className,
7
7
  return (_jsx("a", { ...props, ref: forwardedRef, href: `#${targetId}`, className: classNames("hjm-skip-nav", className), style: {
8
8
  "--hjm-skip-nav-min-height": `${skipNavRecipe.minHeight}px`,
9
9
  "--hjm-skip-nav-padding": `${skipNavRecipe.paddingHorizontal}px`,
10
- "--hjm-skip-nav-radius": `${skipNavRecipe.radius}px`,
10
+ // The corner follows the nearest profile; pinned focus placement stays recipe-owned.
11
+ "--hjm-skip-nav-radius": `var(--hjm-radius-md, ${skipNavRecipe.radius}px)`,
11
12
  "--hjm-skip-nav-offset": `${skipNavRecipe.offset}px`,
12
13
  }, onClick: (event) => {
13
14
  onClick?.(event);
@@ -1 +1 @@
1
- {"version":3,"file":"skip-nav.js","sourceRoot":"","sources":["../src/skip-nav.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,yBAAyB,GAE1B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,UAAU,EAAiD,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAkC,SAAS,OAAO,CACjF,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EACjD,YAAY;IAEZ,yBAAyB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,OAAO,CACL,eACM,KAAK,EACT,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,IAAI,QAAQ,EAAE,EACpB,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,EAChD,KAAK,EAAE;YACL,2BAA2B,EAAE,GAAG,aAAa,CAAC,SAAS,IAAI;YAC3D,wBAAwB,EAAE,GAAG,aAAa,CAAC,iBAAiB,IAAI;YAChE,uBAAuB,EAAE,GAAG,aAAa,CAAC,MAAM,IAAI;YACpD,uBAAuB,EAAE,GAAG,aAAa,CAAC,MAAM,IAAI;SACpC,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACjB,IAAI,KAAK,CAAC,gBAAgB;gBAAE,OAAO;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB;;;;cAIE;YACF,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC,YAEA,KAAK,GACJ,CACL,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import {\n skipNavRecipe,\n validateSkipNavDescriptor,\n type SkipNavDescriptor,\n} from \"@hjmds/design-contracts/components/skip-nav\";\nimport { forwardRef, type AnchorHTMLAttributes, type CSSProperties } from \"react\";\nimport { classNames } from \"./internal.js\";\n\n// No `layoutStyle`: off-screen until focused, then pinned by the recipe offset; moving it would hide the focus target.\nexport type SkipNavProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> &\n SkipNavDescriptor &\n Readonly<{ className?: string }>;\n\nexport const SkipNav = forwardRef<HTMLAnchorElement, SkipNavProps>(function SkipNav(\n { targetId, label, className, onClick, ...props },\n forwardedRef,\n) {\n validateSkipNavDescriptor({ targetId, label });\n return (\n <a\n {...props}\n ref={forwardedRef}\n href={`#${targetId}`}\n className={classNames(\"hjm-skip-nav\", className)}\n style={{\n \"--hjm-skip-nav-min-height\": `${skipNavRecipe.minHeight}px`,\n \"--hjm-skip-nav-padding\": `${skipNavRecipe.paddingHorizontal}px`,\n \"--hjm-skip-nav-radius\": `${skipNavRecipe.radius}px`,\n \"--hjm-skip-nav-offset\": `${skipNavRecipe.offset}px`,\n } as CSSProperties}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const target = document.getElementById(targetId);\n if (!target) return;\n /*\n The hash alone only scrolls; focus stays behind in the navigation, so\n the next Tab returns to the links the user just skipped. Making the\n target programmatically focusable moves the caret with the view.\n */\n if (!target.hasAttribute(\"tabindex\")) target.setAttribute(\"tabindex\", \"-1\");\n target.focus({ preventScroll: false });\n }}\n >\n {label}\n </a>\n );\n});\n"]}
1
+ {"version":3,"file":"skip-nav.js","sourceRoot":"","sources":["../src/skip-nav.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,yBAAyB,GAE1B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,UAAU,EAAiD,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAkC,SAAS,OAAO,CACjF,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EACjD,YAAY;IAEZ,yBAAyB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,OAAO,CACL,eACM,KAAK,EACT,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,IAAI,QAAQ,EAAE,EACpB,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,EAChD,KAAK,EAAE;YACL,2BAA2B,EAAE,GAAG,aAAa,CAAC,SAAS,IAAI;YAC3D,wBAAwB,EAAE,GAAG,aAAa,CAAC,iBAAiB,IAAI;YAChE,qFAAqF;YACrF,uBAAuB,EAAE,wBAAwB,aAAa,CAAC,MAAM,KAAK;YAC1E,uBAAuB,EAAE,GAAG,aAAa,CAAC,MAAM,IAAI;SACpC,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACjB,IAAI,KAAK,CAAC,gBAAgB;gBAAE,OAAO;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB;;;;cAIE;YACF,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC,YAEA,KAAK,GACJ,CACL,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import {\n skipNavRecipe,\n validateSkipNavDescriptor,\n type SkipNavDescriptor,\n} from \"@hjmds/design-contracts/components/skip-nav\";\nimport { forwardRef, type AnchorHTMLAttributes, type CSSProperties } from \"react\";\nimport { classNames } from \"./internal.js\";\n\n// No `layoutStyle`: off-screen until focused, then pinned by the recipe offset; moving it would hide the focus target.\nexport type SkipNavProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> &\n SkipNavDescriptor &\n Readonly<{ className?: string }>;\n\nexport const SkipNav = forwardRef<HTMLAnchorElement, SkipNavProps>(function SkipNav(\n { targetId, label, className, onClick, ...props },\n forwardedRef,\n) {\n validateSkipNavDescriptor({ targetId, label });\n return (\n <a\n {...props}\n ref={forwardedRef}\n href={`#${targetId}`}\n className={classNames(\"hjm-skip-nav\", className)}\n style={{\n \"--hjm-skip-nav-min-height\": `${skipNavRecipe.minHeight}px`,\n \"--hjm-skip-nav-padding\": `${skipNavRecipe.paddingHorizontal}px`,\n // The corner follows the nearest profile; pinned focus placement stays recipe-owned.\n \"--hjm-skip-nav-radius\": `var(--hjm-radius-md, ${skipNavRecipe.radius}px)`,\n \"--hjm-skip-nav-offset\": `${skipNavRecipe.offset}px`,\n } as CSSProperties}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const target = document.getElementById(targetId);\n if (!target) return;\n /*\n The hash alone only scrolls; focus stays behind in the navigation, so\n the next Tab returns to the links the user just skipped. Making the\n target programmatically focusable moves the caret with the view.\n */\n if (!target.hasAttribute(\"tabindex\")) target.setAttribute(\"tabindex\", \"-1\");\n target.focus({ preventScroll: false });\n }}\n >\n {label}\n </a>\n );\n});\n"]}