@hjmds/react 1.12.1 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions.d.ts +4 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +4 -1
- package/dist/actions.js.map +1 -1
- package/dist/activity-heatmap.d.ts +4 -1
- package/dist/activity-heatmap.d.ts.map +1 -1
- package/dist/activity-heatmap.js +1 -1
- package/dist/activity-heatmap.js.map +1 -1
- package/dist/advanced-display.d.ts +31 -3
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +26 -27
- package/dist/advanced-display.js.map +1 -1
- package/dist/advanced-forms.d.ts +27 -2
- package/dist/advanced-forms.d.ts.map +1 -1
- package/dist/advanced-forms.js +11 -7
- package/dist/advanced-forms.js.map +1 -1
- package/dist/affix.d.ts +4 -1
- package/dist/affix.d.ts.map +1 -1
- package/dist/affix.js +2 -2
- package/dist/affix.js.map +1 -1
- package/dist/agreement.d.ts +3 -0
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +14 -3
- package/dist/agreement.js.map +1 -1
- package/dist/anchor.d.ts +5 -0
- package/dist/anchor.d.ts.map +1 -1
- package/dist/anchor.js +2 -2
- package/dist/anchor.js.map +1 -1
- package/dist/asset.d.ts +8 -1
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +4 -4
- package/dist/asset.js.map +1 -1
- package/dist/auth-screen.d.ts +5 -0
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +2 -1
- package/dist/auth-screen.js.map +1 -1
- package/dist/bottom-cta.d.ts +5 -0
- package/dist/bottom-cta.d.ts.map +1 -1
- package/dist/bottom-cta.js +2 -2
- package/dist/bottom-cta.js.map +1 -1
- package/dist/bottom-info.d.ts +5 -0
- package/dist/bottom-info.d.ts.map +1 -1
- package/dist/bottom-info.js +2 -2
- package/dist/bottom-info.js.map +1 -1
- package/dist/bottom-navigation.d.ts +3 -0
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +2 -1
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/breadcrumb.d.ts +3 -0
- package/dist/breadcrumb.d.ts.map +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/breadcrumb.js.map +1 -1
- package/dist/calendar.d.ts +4 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +2 -2
- package/dist/calendar.js.map +1 -1
- package/dist/carousel-motion.d.ts +3 -0
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +1 -1
- package/dist/carousel-motion.js.map +1 -1
- package/dist/carousel.d.ts +3 -0
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +2 -2
- package/dist/carousel.js.map +1 -1
- package/dist/celebration.d.ts.map +1 -1
- package/dist/celebration.js.map +1 -1
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +6 -2
- package/dist/clipboard.js.map +1 -1
- package/dist/code-block.d.ts +4 -1
- package/dist/code-block.d.ts.map +1 -1
- package/dist/code-block.js +1 -1
- package/dist/code-block.js.map +1 -1
- package/dist/collapsible.d.ts +3 -0
- package/dist/collapsible.d.ts.map +1 -1
- package/dist/collapsible.js +2 -2
- package/dist/collapsible.js.map +1 -1
- package/dist/color-picker.d.ts +4 -1
- package/dist/color-picker.d.ts.map +1 -1
- package/dist/color-picker.js +2 -2
- package/dist/color-picker.js.map +1 -1
- package/dist/command-palette.d.ts +6 -0
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +49 -15
- package/dist/command-palette.js.map +1 -1
- package/dist/composition-style.d.ts +14 -1
- package/dist/composition-style.d.ts.map +1 -1
- package/dist/composition-style.js.map +1 -1
- package/dist/content-transition.d.ts +6 -2
- package/dist/content-transition.d.ts.map +1 -1
- package/dist/content-transition.js +4 -4
- package/dist/content-transition.js.map +1 -1
- package/dist/context-menu.d.ts +4 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +2 -2
- package/dist/context-menu.js.map +1 -1
- package/dist/data-table.d.ts +3 -0
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +31 -11
- package/dist/data-table.js.map +1 -1
- package/dist/date-picker.d.ts +4 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +2 -2
- package/dist/date-picker.js.map +1 -1
- package/dist/date-range.d.ts +4 -1
- package/dist/date-range.d.ts.map +1 -1
- package/dist/date-range.js +2 -2
- package/dist/date-range.js.map +1 -1
- package/dist/display.d.ts +4 -0
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js.map +1 -1
- package/dist/duration-field.d.ts +4 -2
- package/dist/duration-field.d.ts.map +1 -1
- package/dist/duration-field.js +2 -2
- package/dist/duration-field.js.map +1 -1
- package/dist/effect-surface.d.ts +4 -2
- package/dist/effect-surface.d.ts.map +1 -1
- package/dist/effect-surface.js +2 -2
- package/dist/effect-surface.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts +24 -13
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +17 -15
- package/dist/feedback.js.map +1 -1
- package/dist/file-picker.d.ts +5 -0
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +2 -2
- package/dist/file-picker.js.map +1 -1
- package/dist/floating-action-button.d.ts.map +1 -1
- package/dist/floating-action-button.js.map +1 -1
- package/dist/folder-preview.d.ts +4 -1
- package/dist/folder-preview.d.ts.map +1 -1
- package/dist/folder-preview.js +2 -2
- package/dist/folder-preview.js.map +1 -1
- package/dist/forms.d.ts +35 -3
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +55 -36
- package/dist/forms.js.map +1 -1
- package/dist/gravity-letters.d.ts +4 -2
- package/dist/gravity-letters.d.ts.map +1 -1
- package/dist/gravity-letters.js +2 -2
- package/dist/gravity-letters.js.map +1 -1
- package/dist/grid-reveal.d.ts +4 -2
- package/dist/grid-reveal.d.ts.map +1 -1
- package/dist/grid-reveal.js +2 -2
- package/dist/grid-reveal.js.map +1 -1
- package/dist/heading.d.ts +5 -0
- package/dist/heading.d.ts.map +1 -1
- package/dist/heading.js +8 -1
- package/dist/heading.js.map +1 -1
- package/dist/inline-confirm.d.ts +3 -0
- package/dist/inline-confirm.d.ts.map +1 -1
- package/dist/inline-confirm.js +3 -3
- package/dist/inline-confirm.js.map +1 -1
- package/dist/internal/message-reactions.d.ts +16 -0
- package/dist/internal/message-reactions.d.ts.map +1 -0
- package/dist/internal/message-reactions.js +42 -0
- package/dist/internal/message-reactions.js.map +1 -0
- package/dist/internal/spinner.d.ts +18 -0
- package/dist/internal/spinner.d.ts.map +1 -0
- package/dist/internal/spinner.js +10 -0
- package/dist/internal/spinner.js.map +1 -0
- package/dist/layout.d.ts +12 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +6 -6
- package/dist/layout.js.map +1 -1
- package/dist/masonry.d.ts +4 -1
- package/dist/masonry.d.ts.map +1 -1
- package/dist/masonry.js +5 -3
- package/dist/masonry.js.map +1 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +12 -3
- package/dist/mentions.js.map +1 -1
- package/dist/menu-morph.d.ts +8 -1
- package/dist/menu-morph.d.ts.map +1 -1
- package/dist/menu-morph.js +3 -3
- package/dist/menu-morph.js.map +1 -1
- package/dist/menubar.d.ts +4 -1
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +4 -3
- package/dist/menubar.js.map +1 -1
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js +4 -1
- package/dist/modal.js.map +1 -1
- package/dist/navigation-bar.d.ts +4 -1
- package/dist/navigation-bar.d.ts.map +1 -1
- package/dist/navigation-bar.js +2 -2
- package/dist/navigation-bar.js.map +1 -1
- package/dist/navigation.d.ts +5 -0
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +6 -6
- package/dist/navigation.js.map +1 -1
- package/dist/notification-bell.d.ts +4 -1
- package/dist/notification-bell.d.ts.map +1 -1
- package/dist/notification-bell.js +5 -3
- package/dist/notification-bell.js.map +1 -1
- package/dist/number-field.d.ts +11 -0
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +8 -3
- package/dist/number-field.js.map +1 -1
- package/dist/overlay-stack.d.ts.map +1 -1
- package/dist/overlay-stack.js.map +1 -1
- package/dist/overlays.d.ts +5 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +35 -11
- package/dist/overlays.js.map +1 -1
- package/dist/pagination.d.ts +5 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +2 -2
- package/dist/pagination.js.map +1 -1
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +5 -4
- package/dist/popover.js.map +1 -1
- package/dist/portal.d.ts.map +1 -1
- package/dist/portal.js +2 -1
- package/dist/portal.js.map +1 -1
- package/dist/provider-button.d.ts +5 -0
- package/dist/provider-button.d.ts.map +1 -1
- package/dist/provider-button.js +2 -2
- package/dist/provider-button.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js.map +1 -1
- package/dist/qr-code.d.ts +4 -1
- package/dist/qr-code.d.ts.map +1 -1
- package/dist/qr-code.js +2 -2
- package/dist/qr-code.js.map +1 -1
- package/dist/reaction-picker.d.ts +6 -2
- package/dist/reaction-picker.d.ts.map +1 -1
- package/dist/reaction-picker.js +20 -4
- package/dist/reaction-picker.js.map +1 -1
- package/dist/saved-items.d.ts +33 -0
- package/dist/saved-items.d.ts.map +1 -0
- package/dist/saved-items.js +19 -0
- package/dist/saved-items.js.map +1 -0
- package/dist/screen-flows.d.ts +326 -0
- package/dist/screen-flows.d.ts.map +1 -0
- package/dist/screen-flows.js +222 -0
- package/dist/screen-flows.js.map +1 -0
- package/dist/screens.d.ts +120 -0
- package/dist/screens.d.ts.map +1 -0
- package/dist/screens.js +66 -0
- package/dist/screens.js.map +1 -0
- package/dist/select.d.ts +6 -0
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +13 -3
- package/dist/select.js.map +1 -1
- package/dist/selection.d.ts +28 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +12 -12
- package/dist/selection.js.map +1 -1
- package/dist/side-panel.d.ts.map +1 -1
- package/dist/side-panel.js.map +1 -1
- package/dist/sidebar.d.ts +3 -0
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +2 -2
- package/dist/sidebar.js.map +1 -1
- package/dist/skip-nav.d.ts.map +1 -1
- package/dist/skip-nav.js.map +1 -1
- package/dist/slider.d.ts +5 -0
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +2 -1
- package/dist/slider.js.map +1 -1
- package/dist/sortable.d.ts +3 -0
- package/dist/sortable.d.ts.map +1 -1
- package/dist/sortable.js +1 -1
- package/dist/sortable.js.map +1 -1
- package/dist/splitter.d.ts +5 -0
- package/dist/splitter.d.ts.map +1 -1
- package/dist/splitter.js +28 -3
- package/dist/splitter.js.map +1 -1
- package/dist/step-player.d.ts +4 -1
- package/dist/step-player.d.ts.map +1 -1
- package/dist/step-player.js +2 -2
- package/dist/step-player.js.map +1 -1
- package/dist/steps.d.ts +5 -0
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +2 -2
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +256 -70
- package/dist/styles.layered.css +256 -70
- package/dist/supplemental-display.d.ts +4 -0
- package/dist/supplemental-display.d.ts.map +1 -1
- package/dist/supplemental-display.js +7 -4
- package/dist/supplemental-display.js.map +1 -1
- package/dist/supplemental-navigation.d.ts +5 -0
- package/dist/supplemental-navigation.d.ts.map +1 -1
- package/dist/supplemental-navigation.js +2 -2
- package/dist/supplemental-navigation.js.map +1 -1
- package/dist/swipe-actions.d.ts +4 -1
- package/dist/swipe-actions.d.ts.map +1 -1
- package/dist/swipe-actions.js +2 -2
- package/dist/swipe-actions.js.map +1 -1
- package/dist/tags-input.d.ts +5 -0
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +2 -2
- package/dist/tags-input.js.map +1 -1
- package/dist/task-list.d.ts +4 -1
- package/dist/task-list.d.ts.map +1 -1
- package/dist/task-list.js +3 -3
- package/dist/task-list.js.map +1 -1
- package/dist/text-formats.d.ts +5 -0
- package/dist/text-formats.d.ts.map +1 -1
- package/dist/text-formats.js +2 -1
- package/dist/text-formats.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +22 -2
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts +4 -1
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +2 -2
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +10 -4
- package/dist/toast.js.map +1 -1
- package/dist/toggle-group.d.ts +3 -0
- package/dist/toggle-group.d.ts.map +1 -1
- package/dist/toggle-group.js +2 -1
- package/dist/toggle-group.js.map +1 -1
- package/dist/top-bar.d.ts +5 -0
- package/dist/top-bar.d.ts.map +1 -1
- package/dist/top-bar.js +2 -2
- package/dist/top-bar.js.map +1 -1
- package/dist/top.d.ts +5 -0
- package/dist/top.d.ts.map +1 -1
- package/dist/top.js +2 -2
- package/dist/top.js.map +1 -1
- package/dist/tour.d.ts.map +1 -1
- package/dist/tour.js +3 -2
- package/dist/tour.js.map +1 -1
- package/dist/transfer-list.d.ts +3 -0
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +2 -2
- package/dist/transfer-list.js.map +1 -1
- package/dist/tree.d.ts +3 -0
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +17 -5
- package/dist/tree.js.map +1 -1
- package/dist/upload-item.d.ts +5 -0
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +2 -2
- package/dist/upload-item.js.map +1 -1
- package/dist/virtual-list.d.ts +4 -1
- package/dist/virtual-list.d.ts.map +1 -1
- package/dist/virtual-list.js +2 -2
- package/dist/virtual-list.js.map +1 -1
- package/dist/voice-note.d.ts +4 -1
- package/dist/voice-note.d.ts.map +1 -1
- package/dist/voice-note.js +2 -2
- package/dist/voice-note.js.map +1 -1
- package/dist/watermark.d.ts +4 -1
- package/dist/watermark.d.ts.map +1 -1
- package/dist/watermark.js +2 -2
- package/dist/watermark.js.map +1 -1
- package/package.json +18 -3
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\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}>;\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}>;\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\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 host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\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 ...(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 <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-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 </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":["import {\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}>;\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}>;\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 host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\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 ...(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 <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-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 </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"]}
|
package/dist/qr-code.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
import { type QRErrorCorrection } from "@hjmds/design-contracts/components/qr-code";
|
|
3
|
+
import type { HjmCompositionStyleProp } from "./composition-style.js";
|
|
3
4
|
export type QRCodeProps = {
|
|
4
5
|
value: string;
|
|
5
6
|
label: string;
|
|
6
7
|
size?: number;
|
|
7
8
|
level?: QRErrorCorrection;
|
|
8
9
|
fallback: ReactNode;
|
|
10
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
11
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
9
12
|
};
|
|
10
|
-
export declare function QRCode({ value, label, size, level, fallback }: QRCodeProps): import("react").JSX.Element;
|
|
13
|
+
export declare function QRCode({ value, label, size, level, fallback, layoutStyle }: QRCodeProps): import("react").JSX.Element;
|
|
11
14
|
//# sourceMappingURL=qr-code.d.ts.map
|
package/dist/qr-code.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../src/qr-code.tsx"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC1H,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../src/qr-code.tsx"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC1H,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAC;IACtH,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAC1C,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAU,EAAE,KAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,+BASnG"}
|
package/dist/qr-code.js
CHANGED
|
@@ -2,13 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import qrcode from "qrcode-generator";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { createQRMatrix, qrPath, qrCodeRecipe } from "@hjmds/design-contracts/components/qr-code";
|
|
5
|
-
export function QRCode({ value, label, size = 192, level = "M", fallback }) {
|
|
5
|
+
export function QRCode({ value, label, size = 192, level = "M", fallback, layoutStyle }) {
|
|
6
6
|
const matrix = useMemo(() => createQRMatrix(value, qrcode, level), [value, level]);
|
|
7
7
|
const modules = matrix.count + matrix.quietZone * 2;
|
|
8
8
|
if (!label.trim() || fallback == null || fallback === false || !Number.isFinite(size) || size < modules * qrCodeRecipe.minModuleSize)
|
|
9
9
|
throw new TypeError("QRCode needs an accessible label, alternative action and at least two pixels per module");
|
|
10
10
|
// Integer-sized modules plus a four-module white quiet zone preserve scan geometry in both themes.
|
|
11
11
|
const actualSize = Math.floor(size / modules) * modules;
|
|
12
|
-
return _jsxs("div", { "data-hjm-qr-code": true, children: [_jsxs("svg", { role: "img", "aria-label": label, width: actualSize, height: actualSize, viewBox: `0 0 ${modules} ${modules}`, shapeRendering: "crispEdges", children: [_jsx("rect", { width: modules, height: modules, fill: qrCodeRecipe.background }), _jsx("path", { d: qrPath(matrix), fill: qrCodeRecipe.foreground })] }), fallback] });
|
|
12
|
+
return _jsxs("div", { "data-hjm-qr-code": true, style: layoutStyle, children: [_jsxs("svg", { role: "img", "aria-label": label, width: actualSize, height: actualSize, viewBox: `0 0 ${modules} ${modules}`, shapeRendering: "crispEdges", children: [_jsx("rect", { width: modules, height: modules, fill: qrCodeRecipe.background }), _jsx("path", { d: qrPath(matrix), fill: qrCodeRecipe.foreground })] }), fallback] });
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=qr-code.js.map
|
package/dist/qr-code.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-code.js","sourceRoot":"","sources":["../src/qr-code.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAA0B,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"qr-code.js","sourceRoot":"","sources":["../src/qr-code.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAA0B,MAAM,4CAA4C,CAAC;AAK1H,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAe;IAClG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,OAAO,GAAG,YAAY,CAAC,aAAa;QAAE,MAAM,IAAI,SAAS,CAAC,yFAAyF,CAAC,CAAC;IACrP,mGAAmG;IACnG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;IACxD,OAAO,yCAAsB,KAAK,EAAE,WAAW,aAAE,eAAK,IAAI,EAAC,KAAK,gBAAa,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,OAAO,IAAI,OAAO,EAAE,EAAE,cAAc,EAAC,YAAY,aAC1L,eAAM,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,GAAI,EAAA,eAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,GAAI,IAC9H,EAAC,QAAQ,IAAO,CAAC;AACzB,CAAC","sourcesContent":["import qrcode from \"qrcode-generator\";\nimport { useMemo, type ReactNode } from \"react\";\nimport { createQRMatrix, qrPath, qrCodeRecipe, type QRErrorCorrection } from \"@hjmds/design-contracts/components/qr-code\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type QRCodeProps = { value: string; label: string; size?: number; level?: QRErrorCorrection; fallback: ReactNode;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp };\nexport function QRCode({ value, label, size = 192, level = \"M\", fallback, layoutStyle }: QRCodeProps) {\n const matrix = useMemo(() => createQRMatrix(value, qrcode, level), [value, level]);\n const modules = matrix.count + matrix.quietZone * 2;\n if (!label.trim() || fallback == null || fallback === false || !Number.isFinite(size) || size < modules * qrCodeRecipe.minModuleSize) throw new TypeError(\"QRCode needs an accessible label, alternative action and at least two pixels per module\");\n // Integer-sized modules plus a four-module white quiet zone preserve scan geometry in both themes.\n const actualSize = Math.floor(size / modules) * modules;\n return <div data-hjm-qr-code style={layoutStyle}><svg role=\"img\" aria-label={label} width={actualSize} height={actualSize} viewBox={`0 0 ${modules} ${modules}`} shapeRendering=\"crispEdges\">\n <rect width={modules} height={modules} fill={qrCodeRecipe.background} /><path d={qrPath(matrix)} fill={qrCodeRecipe.foreground} />\n </svg>{fallback}</div>;\n}\n"]}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { type ReactionOption } from "@hjmds/design-contracts/reactions";
|
|
1
|
+
import { type ReactionMoreOptions, type ReactionOption } from "@hjmds/design-contracts/reactions";
|
|
2
|
+
import type { HjmCompositionStyleProp } from "./composition-style.js";
|
|
2
3
|
export type ReactionPickerProps = Readonly<{
|
|
3
4
|
label: string;
|
|
4
5
|
options: readonly ReactionOption[];
|
|
5
6
|
value: string | null;
|
|
6
7
|
onValueChange: (value: string | null) => void;
|
|
7
8
|
disabled?: boolean;
|
|
9
|
+
layout?: "wrap" | "strip";
|
|
10
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
11
|
+
more?: ReactionMoreOptions;
|
|
8
12
|
}>;
|
|
9
13
|
/** Controlled single reaction; counts and persistence belong to the product. */
|
|
10
|
-
export declare function ReactionPicker({ label, options, value, onValueChange, disabled }: ReactionPickerProps): import("react").JSX.Element;
|
|
14
|
+
export declare function ReactionPicker({ label, options, value, onValueChange, disabled, layout, more, layoutStyle }: ReactionPickerProps): import("react").JSX.Element;
|
|
11
15
|
//# sourceMappingURL=reaction-picker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reaction-picker.d.ts","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reaction-picker.d.ts","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":"AACA,OAAO,EAA2D,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAE3J,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IAAC,IAAI,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACzR,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAgB,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,mBAAmB,+BAkBjJ"}
|
package/dist/reaction-picker.js
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useLayoutEffect, useRef, useState } from "react";
|
|
3
|
+
import { nextReaction, validateReactions, resolveReactionOptions } from "@hjmds/design-contracts/reactions";
|
|
3
4
|
import { Button } from "./actions.js";
|
|
4
5
|
/** Controlled single reaction; counts and persistence belong to the product. */
|
|
5
|
-
export function ReactionPicker({ label, options, value, onValueChange, disabled = false }) {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export function ReactionPicker({ label, options, value, onValueChange, disabled = false, layout = "wrap", more, layoutStyle }) {
|
|
7
|
+
const [expanded, setExpanded] = useState(false);
|
|
8
|
+
const root = useRef(null);
|
|
9
|
+
const toggle = useRef(null);
|
|
10
|
+
const refocus = useRef(false);
|
|
11
|
+
const all = resolveReactionOptions(options, more);
|
|
12
|
+
validateReactions(all, value);
|
|
13
|
+
const showingAll = expanded && !!more;
|
|
14
|
+
const visible = showingAll ? all : options;
|
|
15
|
+
const choose = (id) => { if (!disabled) {
|
|
16
|
+
refocus.current = !!root.current?.contains(document.activeElement);
|
|
17
|
+
onValueChange(nextReaction(all, value, id));
|
|
18
|
+
setExpanded(false);
|
|
19
|
+
} };
|
|
20
|
+
// A catalog-only button unmounts on collapse: refocus the toggle, not <body>. Inert hosts restore their own trigger.
|
|
21
|
+
useLayoutEffect(() => { const node = root.current; if (refocus.current && !showingAll && node && !node.closest("[inert]") && !node.contains(document.activeElement))
|
|
22
|
+
toggle.current?.focus(); refocus.current = false; });
|
|
23
|
+
return _jsxs("div", { ref: root, role: "group", "aria-label": label, className: "hjm-reaction-picker", "data-layout": layout, "data-expanded": showingAll || undefined, style: layoutStyle, children: [_jsx("div", { className: "hjm-reaction-picker__options", children: visible.map(option => _jsx(Button, { tone: "ghost", shape: "pill", selected: value === option.id, disabled: disabled || option.disabled, "aria-label": option.label, onClick: () => choose(option.id), children: _jsxs("span", { "aria-hidden": "true", className: "hjm-reaction-picker__glyph", children: [option.emoji, option.count === undefined ? null : ` ${option.count}`] }) }, option.id)) }), _jsx("div", { children: more ? _jsx(Button, { ref: toggle, tone: "ghost", shape: "pill", "aria-label": more.label, "aria-expanded": showingAll, disabled: disabled, onClick: () => setExpanded(current => !current), children: _jsx("span", { "aria-hidden": "true", className: "hjm-reaction-picker__glyph", children: showingAll ? "−" : "+" }) }) : null })] });
|
|
8
24
|
}
|
|
9
25
|
//# sourceMappingURL=reaction-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reaction-picker.js","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"reaction-picker.js","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useLayoutEffect, useRef, useState } from \"react\";\nimport { nextReaction, validateReactions, resolveReactionOptions, type ReactionMoreOptions, type ReactionOption } from \"@hjmds/design-contracts/reactions\";\nimport { Button } from \"./actions.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type ReactionPickerProps = Readonly<{ label: string; options: readonly ReactionOption[]; value: string | null; onValueChange: (value: string | null) => void; disabled?: boolean; layout?: \"wrap\" | \"strip\"; layoutStyle?: HjmCompositionStyleProp; more?: ReactionMoreOptions }>;\n/** Controlled single reaction; counts and persistence belong to the product. */\nexport function ReactionPicker({ label, options, value, onValueChange, disabled = false, layout = \"wrap\", more, layoutStyle }: ReactionPickerProps) {\n const [expanded, setExpanded] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const toggle = useRef<HTMLButtonElement>(null);\n const refocus = useRef(false);\n const all = resolveReactionOptions(options, more);\n validateReactions(all, value);\n const showingAll = expanded && !!more;\n const visible = showingAll ? all : options;\n const choose = (id: string) => { if (!disabled) { refocus.current = !!root.current?.contains(document.activeElement); onValueChange(nextReaction(all, value, id)); setExpanded(false); } };\n // A catalog-only button unmounts on collapse: refocus the toggle, not <body>. Inert hosts restore their own trigger.\n useLayoutEffect(() => { const node = root.current; if (refocus.current && !showingAll && node && !node.closest(\"[inert]\") && !node.contains(document.activeElement)) toggle.current?.focus(); refocus.current = false; });\n return <div ref={root} role=\"group\" aria-label={label} className=\"hjm-reaction-picker\" data-layout={layout} data-expanded={showingAll || undefined} style={layoutStyle}>\n <div className=\"hjm-reaction-picker__options\">\n {visible.map(option => <Button key={option.id} tone=\"ghost\" shape=\"pill\" selected={value === option.id} disabled={disabled || option.disabled} aria-label={option.label} onClick={() => choose(option.id)}><span aria-hidden=\"true\" className=\"hjm-reaction-picker__glyph\">{option.emoji}{option.count === undefined ? null : ` ${option.count}`}</span></Button>)}\n </div>\n <div>{more ? <Button ref={toggle} tone=\"ghost\" shape=\"pill\" aria-label={more.label} aria-expanded={showingAll} disabled={disabled} onClick={() => setExpanded(current => !current)}><span aria-hidden=\"true\" className=\"hjm-reaction-picker__glyph\">{showingAll ? \"−\" : \"+\"}</span></Button> : null}</div>\n </div>;\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type ListDetailScreenProps } from "./screen-flows.js";
|
|
3
|
+
import { type SavedItem, type SavedCollection, type SavedItemsLabels } from "@hjmds/design-contracts/screen-patterns";
|
|
4
|
+
export type { SavedItem, SavedCollection, SavedItemsLabels } from "@hjmds/design-contracts/screen-patterns";
|
|
5
|
+
export type SavedItemsScreenProps<T extends SavedItem> = Omit<ListDetailScreenProps, "list" | "detail" | "back" | "refresh" | "loadMore"> & {
|
|
6
|
+
items: readonly T[];
|
|
7
|
+
collections: readonly SavedCollection[];
|
|
8
|
+
/** Omitted shows collections; null selects all saved items. */
|
|
9
|
+
collectionId?: string | null;
|
|
10
|
+
selectedItemId?: string | null;
|
|
11
|
+
labels: SavedItemsLabels;
|
|
12
|
+
onOpenCollection(id: string | null): void;
|
|
13
|
+
onOpenItem(id: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* One level up, from either the item detail or a collection grid. The shell does not know the
|
|
16
|
+
* host's history, so the host pops a single level: clear `selectedItemId` when an item is open,
|
|
17
|
+
* otherwise clear `collectionId` (back to the collection home).
|
|
18
|
+
*/
|
|
19
|
+
onBack(): void;
|
|
20
|
+
onCreateCollection(): void;
|
|
21
|
+
renderThumbnail(item: T): ReactNode;
|
|
22
|
+
renderDetail(item: T): ReactNode;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Collection membership and persistence belong to the app; the shell preserves the grid on detail visits.
|
|
26
|
+
*
|
|
27
|
+
* Header slots per level: on the collection home the shell owns `actions` (the create-collection
|
|
28
|
+
* button) and the product's `leading`; inside a collection it owns `leading` (back) and keeps the
|
|
29
|
+
* product's `actions`. A product `actions` passed for the home is therefore not rendered there —
|
|
30
|
+
* Native ships the same rule, so changing it is a cross-platform API decision, not a Web fix.
|
|
31
|
+
*/
|
|
32
|
+
export declare function SavedItemsScreen<T extends SavedItem>({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, renderThumbnail, renderDetail, ...screen }: SavedItemsScreenProps<T>): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=saved-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-items.d.ts","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIjF,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACzI,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC5G,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IAC1I,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;IACxC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,MAAM,IAAI,IAAI,CAAC;IACf,kBAAkB,IAAI,IAAI,CAAC;IAC3B,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,EAAC,KAAK,EAAC,WAAW,EAAC,YAAY,EAAC,cAAc,EAAC,MAAM,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,kBAAkB,EAAC,eAAe,EAAC,YAAY,EAAC,GAAG,MAAM,EAAC,EAAC,qBAAqB,CAAC,CAAC,CAAC,+BAgBjO"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { ListDetailScreen } from "./screen-flows.js";
|
|
3
|
+
import { Stack, Text, Grid } from "./layout.js";
|
|
4
|
+
import { Button } from "./actions.js";
|
|
5
|
+
import { resolveSavedItems } from "@hjmds/design-contracts/screen-patterns";
|
|
6
|
+
/**
|
|
7
|
+
* Collection membership and persistence belong to the app; the shell preserves the grid on detail visits.
|
|
8
|
+
*
|
|
9
|
+
* Header slots per level: on the collection home the shell owns `actions` (the create-collection
|
|
10
|
+
* button) and the product's `leading`; inside a collection it owns `leading` (back) and keeps the
|
|
11
|
+
* product's `actions`. A product `actions` passed for the home is therefore not rendered there —
|
|
12
|
+
* Native ships the same rule, so changing it is a cross-platform API decision, not a Web fix.
|
|
13
|
+
*/
|
|
14
|
+
export function SavedItemsScreen({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, renderThumbnail, renderDetail, ...screen }) {
|
|
15
|
+
const { home, collection, visible, selected } = resolveSavedItems(items, collections, collectionId, selectedItemId);
|
|
16
|
+
const groups = [{ id: null, title: labels.allItems, itemIds: items.map(item => item.id) }, ...collections];
|
|
17
|
+
return _jsx(ListDetailScreen, { ...screen, title: home ? screen.title : collection?.title ?? labels.allItems, leading: home ? screen.leading : _jsx(Button, { tone: "ghost", onClick: onBack, children: labels.back }), actions: home ? _jsx(Button, { tone: "ghost", onClick: onCreateCollection, children: labels.createCollection }) : screen.actions, back: { label: labels.back, onAction: onBack }, ...(selected ? { detail: { title: selected.title, content: renderDetail(selected) } } : {}), list: _jsx(Stack, { gap: "md", children: home ? _jsxs(_Fragment, { children: [_jsx(Text, { variant: "caption", tone: "muted", children: labels.privateNotice }), _jsx(Grid, { columns: { compact: 2 }, gap: { compact: "md" }, minColumnWidth: { compact: 80 }, children: groups.map(group => _jsxs("button", { type: "button", className: "hjm-saved-collection", onClick: () => onOpenCollection(group.id), "aria-label": group.title, children: [_jsx("span", { className: "hjm-saved-collection__cover", "aria-hidden": "true", children: Array.from({ length: 4 }, (_, index) => { const item = items.filter(item => group.itemIds.includes(item.id))[index]; return _jsx("span", { children: item ? renderThumbnail(item) : null }, index); }) }), _jsx(Text, { emphasis: "strong", children: group.title })] }, group.id === null ? "all" : `collection:${group.id}`)) })] }) : visible.length ? _jsx(Grid, { columns: { compact: 3 }, gap: { compact: "xxs" }, minColumnWidth: { compact: 44 }, children: visible.map(item => _jsx("button", { type: "button", className: "hjm-saved-post", "aria-label": item.title, onClick: () => onOpenItem(item.id), children: renderThumbnail(item) }, item.id)) }) : _jsx(Text, { role: "status", children: labels.empty }) }) });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=saved-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-items.js","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAA8B,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAA+D,MAAM,yCAAyC,CAAC;AAsBzI;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAsB,EAAC,KAAK,EAAC,WAAW,EAAC,YAAY,EAAC,cAAc,EAAC,MAAM,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,kBAAkB,EAAC,eAAe,EAAC,YAAY,EAAC,GAAG,MAAM,EAA0B;IAChO,MAAM,EAAC,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,QAAQ,EAAC,GAAC,iBAAiB,CAAC,KAAK,EAAC,WAAW,EAAC,YAAY,EAAC,cAAc,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,CAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,EAAE,CAAC,EAAC,EAAC,GAAG,WAAW,CAAC,CAAC;IAC/F,OAAO,KAAC,gBAAgB,OAAK,MAAM,EAAE,KAAK,EAAE,IAAI,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAA,CAAC,CAAA,UAAU,EAAE,KAAK,IAAE,MAAM,CAAC,QAAQ,EAC9F,OAAO,EAAE,IAAI,CAAA,CAAC,CAAA,MAAM,CAAC,OAAO,CAAA,CAAC,CAAA,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,MAAM,YAAG,MAAM,CAAC,IAAI,GAAU,EACzF,OAAO,EAAE,IAAI,CAAA,CAAC,CAAA,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,kBAAkB,YAAG,MAAM,CAAC,gBAAgB,GAAU,CAAA,CAAC,CAAA,MAAM,CAAC,OAAO,EACjH,IAAI,EAAE,EAAC,KAAK,EAAC,MAAM,CAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,KACrC,CAAC,QAAQ,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,EAAC,KAAK,EAAC,QAAQ,CAAC,KAAK,EAAC,OAAO,EAAC,YAAY,CAAC,QAAQ,CAAC,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAChF,IAAI,EAAE,KAAC,KAAK,IAAC,GAAG,EAAC,IAAI,YAClB,IAAI,CAAA,CAAC,CAAA,8BAAE,KAAC,IAAI,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,YAAE,MAAM,CAAC,aAAa,GAAQ,EAAA,KAAC,IAAI,IAAC,OAAO,EAAE,EAAC,OAAO,EAAC,CAAC,EAAC,EAAE,GAAG,EAAE,EAAC,OAAO,EAAC,IAAI,EAAC,EAAE,cAAc,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,YACpJ,MAAM,CAAC,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,kBAA6D,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,GAAE,EAAE,CAAA,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAc,KAAK,CAAC,KAAK,aAC7L,eAAM,SAAS,EAAC,6BAA6B,iBAAa,MAAM,YAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,EAAE,GAAC,MAAM,IAAI,GAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAA,EAAE,CAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA,OAAO,yBAAmB,IAAI,CAAA,CAAC,CAAA,eAAe,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,IAAI,IAAvC,KAAK,CAA0C,CAAA,CAAA,CAAC,CAAC,GAAQ,EACrP,KAAC,IAAI,IAAC,QAAQ,EAAC,QAAQ,YAAE,KAAK,CAAC,KAAK,GAAQ,KAFd,KAAK,CAAC,EAAE,KAAG,IAAI,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,cAAc,KAAK,CAAC,EAAE,EAAE,CAGrE,CAAC,GACL,IAAG,CAAA,CAAC,CAAA,OAAO,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,OAAO,EAAE,EAAC,OAAO,EAAC,CAAC,EAAC,EAAE,GAAG,EAAE,EAAC,OAAO,EAAC,KAAK,EAAC,EAAE,cAAc,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,YAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,iBAAsB,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,gBAAgB,gBAAa,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAG,eAAe,CAAC,IAAI,CAAC,IAAlI,IAAI,CAAC,EAAE,CAAqI,CAAC,GAAQ,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,YAAE,MAAM,CAAC,KAAK,GAAQ,GACnU,GAAG,CAAA;AACf,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport { ListDetailScreen, type ListDetailScreenProps } from \"./screen-flows.js\";\nimport { Stack, Text, Grid } from \"./layout.js\";\nimport { Button } from \"./actions.js\";\n\nimport { resolveSavedItems, type SavedItem, type SavedCollection, type SavedItemsLabels } from \"@hjmds/design-contracts/screen-patterns\";\nexport type { SavedItem, SavedCollection, SavedItemsLabels } from \"@hjmds/design-contracts/screen-patterns\";\nexport type SavedItemsScreenProps<T extends SavedItem> = Omit<ListDetailScreenProps, \"list\" | \"detail\" | \"back\" | \"refresh\" | \"loadMore\"> & {\n items: readonly T[];\n collections: readonly SavedCollection[];\n /** Omitted shows collections; null selects all saved items. */\n collectionId?: string | null;\n selectedItemId?: string | null;\n labels: SavedItemsLabels;\n onOpenCollection(id: string | null): void;\n onOpenItem(id: string): void;\n /**\n * One level up, from either the item detail or a collection grid. The shell does not know the\n * host's history, so the host pops a single level: clear `selectedItemId` when an item is open,\n * otherwise clear `collectionId` (back to the collection home).\n */\n onBack(): void;\n onCreateCollection(): void;\n renderThumbnail(item: T): ReactNode;\n renderDetail(item: T): ReactNode;\n};\n\n/**\n * Collection membership and persistence belong to the app; the shell preserves the grid on detail visits.\n *\n * Header slots per level: on the collection home the shell owns `actions` (the create-collection\n * button) and the product's `leading`; inside a collection it owns `leading` (back) and keeps the\n * product's `actions`. A product `actions` passed for the home is therefore not rendered there —\n * Native ships the same rule, so changing it is a cross-platform API decision, not a Web fix.\n */\nexport function SavedItemsScreen<T extends SavedItem>({items,collections,collectionId,selectedItemId,labels,onOpenCollection,onOpenItem,onBack,onCreateCollection,renderThumbnail,renderDetail,...screen}:SavedItemsScreenProps<T>) {\n const {home,collection,visible,selected}=resolveSavedItems(items,collections,collectionId,selectedItemId);\n const groups=[{id:null,title:labels.allItems,itemIds:items.map(item=>item.id)},...collections];\n return <ListDetailScreen {...screen} title={home?screen.title:collection?.title??labels.allItems}\n leading={home?screen.leading:<Button tone=\"ghost\" onClick={onBack}>{labels.back}</Button>}\n actions={home?<Button tone=\"ghost\" onClick={onCreateCollection}>{labels.createCollection}</Button>:screen.actions}\n back={{label:labels.back,onAction:onBack}}\n {...(selected?{detail:{title:selected.title,content:renderDetail(selected)}}:{})}\n list={<Stack gap=\"md\">\n {home?<><Text variant=\"caption\" tone=\"muted\">{labels.privateNotice}</Text><Grid columns={{compact:2}} gap={{compact:\"md\"}} minColumnWidth={{compact:80}}>\n {groups.map(group=><button key={group.id===null?\"all\":`collection:${group.id}`} type=\"button\" className=\"hjm-saved-collection\" onClick={()=>onOpenCollection(group.id)} aria-label={group.title}>\n <span className=\"hjm-saved-collection__cover\" aria-hidden=\"true\">{Array.from({length:4},(_,index)=>{const item=items.filter(item=>group.itemIds.includes(item.id))[index];return <span key={index}>{item?renderThumbnail(item):null}</span>})}</span>\n <Text emphasis=\"strong\">{group.title}</Text>\n </button>)}\n </Grid></>:visible.length?<Grid columns={{compact:3}} gap={{compact:\"xxs\"}} minColumnWidth={{compact:44}}>{visible.map(item=><button key={item.id} type=\"button\" className=\"hjm-saved-post\" aria-label={item.title} onClick={()=>onOpenItem(item.id)}>{renderThumbnail(item)}</button>)}</Grid>:<Text role=\"status\">{labels.empty}</Text>}\n </Stack>}/>\n}\n"]}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type ScreenLayoutProps } from "./screens.js";
|
|
3
|
+
import { type SheetProps } from "./overlays.js";
|
|
4
|
+
import { type UploadItemDescriptor, type UploadItemLabels } from "@hjmds/design-contracts/components/upload-item";
|
|
5
|
+
import { type AlertDialogRequest } from "@hjmds/design-contracts/components/alert-dialog";
|
|
6
|
+
import { type PermissionScreenStatus, type PhotoSource, type PhotoSourceLabels } from "@hjmds/design-contracts/screen-patterns";
|
|
7
|
+
import { type ContainerGutter } from "@hjmds/design-contracts/components/container";
|
|
8
|
+
/** Copy, pending state and mutations are controlled by the consuming product. */
|
|
9
|
+
export type ScreenFlowAction = Readonly<{
|
|
10
|
+
label: string;
|
|
11
|
+
onAction(): void;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
pending?: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
type Base = Omit<ScreenLayoutProps, "children" | "footer">;
|
|
16
|
+
export type ListDetailScreenProps = Base & {
|
|
17
|
+
list: ReactNode;
|
|
18
|
+
detail?: {
|
|
19
|
+
title: string;
|
|
20
|
+
content: ReactNode;
|
|
21
|
+
};
|
|
22
|
+
back: ScreenFlowAction;
|
|
23
|
+
refresh?: ScreenFlowAction;
|
|
24
|
+
loadMore?: ScreenFlowAction;
|
|
25
|
+
};
|
|
26
|
+
/** Keep the list mounted so input and scroll survive a detail visit. Routers may instead restore host scroll state. */
|
|
27
|
+
export declare function ListDetailScreen({ list, detail, back, refresh, loadMore, layoutStyle, ...screen }: ListDetailScreenProps): import("react").JSX.Element;
|
|
28
|
+
export type EditorScreenProps = Base & {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
submitPlacement?: "header" | "footer";
|
|
31
|
+
dirty: boolean;
|
|
32
|
+
submit: ScreenFlowAction;
|
|
33
|
+
cancel: ScreenFlowAction;
|
|
34
|
+
discard: Omit<Extract<AlertDialogRequest, {
|
|
35
|
+
mode: "confirm";
|
|
36
|
+
}>, "onConfirm" | "fallbackErrorMessage"> & {
|
|
37
|
+
fallbackErrorMessage: string;
|
|
38
|
+
};
|
|
39
|
+
draftStatus?: ReactNode;
|
|
40
|
+
};
|
|
41
|
+
export declare function EditorScreen({ children, dirty, submitPlacement, submit, cancel, discard, draftStatus, ...screen }: EditorScreenProps): import("react").JSX.Element;
|
|
42
|
+
export type ProfileScreenProps = Base & {
|
|
43
|
+
summary: ReactNode;
|
|
44
|
+
edit: ScreenFlowAction;
|
|
45
|
+
children?: ReactNode;
|
|
46
|
+
accountActions?: ReactNode;
|
|
47
|
+
};
|
|
48
|
+
export declare function ProfileScreen({ summary, edit, children, accountActions, ...screen }: ProfileScreenProps): import("react").JSX.Element;
|
|
49
|
+
export type ModerationScreenProps = Base & {
|
|
50
|
+
reasonPicker?: ReactNode;
|
|
51
|
+
reasons: readonly {
|
|
52
|
+
value: string;
|
|
53
|
+
label: string;
|
|
54
|
+
}[];
|
|
55
|
+
reason: string | null;
|
|
56
|
+
onReasonChange(value: string): void;
|
|
57
|
+
reasonLabel: string;
|
|
58
|
+
children?: ReactNode;
|
|
59
|
+
submit: ScreenFlowAction;
|
|
60
|
+
block?: {
|
|
61
|
+
action: ScreenFlowAction;
|
|
62
|
+
confirmation: Extract<AlertDialogRequest, {
|
|
63
|
+
mode: "confirm";
|
|
64
|
+
}>;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export declare function ModerationScreen({ reasonPicker, reasons, reason, onReasonChange, reasonLabel, children, submit, block, ...screen }: ModerationScreenProps): import("react").JSX.Element;
|
|
68
|
+
/** Source choice only: permission, capture, decoding and draft persistence belong to the host. */
|
|
69
|
+
export type PhotoSourceSheetProps = Readonly<{
|
|
70
|
+
open: boolean;
|
|
71
|
+
onOpenChange(open: boolean): void;
|
|
72
|
+
onSelect(source: PhotoSource): void;
|
|
73
|
+
labels: PhotoSourceLabels;
|
|
74
|
+
disabled?: boolean;
|
|
75
|
+
cameraAvailable?: boolean;
|
|
76
|
+
}>;
|
|
77
|
+
export declare function PhotoSourceSheet({ open, onOpenChange, onSelect, labels, disabled, cameraAvailable }: PhotoSourceSheetProps): import("react").JSX.Element;
|
|
78
|
+
export type MediaSelectionItem = {
|
|
79
|
+
descriptor: UploadItemDescriptor;
|
|
80
|
+
preview?: ReactNode;
|
|
81
|
+
};
|
|
82
|
+
export type MediaSelectionScreenProps = Base & {
|
|
83
|
+
library?: ReactNode;
|
|
84
|
+
selectionSummary?: ReactNode;
|
|
85
|
+
items: readonly MediaSelectionItem[];
|
|
86
|
+
add: ScreenFlowAction;
|
|
87
|
+
done: ScreenFlowAction;
|
|
88
|
+
labels: UploadItemLabels;
|
|
89
|
+
actionLabels: {
|
|
90
|
+
remove: string;
|
|
91
|
+
moveUp: string;
|
|
92
|
+
moveDown: string;
|
|
93
|
+
};
|
|
94
|
+
removeLabel(item: MediaSelectionItem): string;
|
|
95
|
+
moveUpLabel(item: MediaSelectionItem): string;
|
|
96
|
+
moveDownLabel(item: MediaSelectionItem): string;
|
|
97
|
+
onRemove(id: string): void;
|
|
98
|
+
onMove(id: string, direction: -1 | 1): void;
|
|
99
|
+
onRetry(id: string): void;
|
|
100
|
+
onCancel(id: string): void;
|
|
101
|
+
};
|
|
102
|
+
/** A photo is the primary content; upload status stays below it instead of replacing the thumbnail. */
|
|
103
|
+
export declare function MediaSelectionScreen({ library, selectionSummary, items, add, done, labels, actionLabels, removeLabel, moveUpLabel, moveDownLabel, onRemove, onMove, onRetry, onCancel, ...screen }: MediaSelectionScreenProps): import("react").JSX.Element;
|
|
104
|
+
/** Recent searches before typing. Rows commit; the trailing button removes one. */
|
|
105
|
+
export type SearchRecentQueries = Readonly<{
|
|
106
|
+
items: readonly string[];
|
|
107
|
+
title: string;
|
|
108
|
+
clearAllLabel: string;
|
|
109
|
+
onClearAll(): void;
|
|
110
|
+
removeLabel(query: string): string;
|
|
111
|
+
onRemove(query: string): void;
|
|
112
|
+
/** Decorative leading glyph (for example a history icon). */
|
|
113
|
+
icon?: ReactNode;
|
|
114
|
+
/** Glyph inside the remove button; defaults to "×". */
|
|
115
|
+
removeIcon?: ReactNode;
|
|
116
|
+
/** Rows shown; default `searchScreenRecipe.recentVisible` (5). */
|
|
117
|
+
maxVisible?: number;
|
|
118
|
+
}>;
|
|
119
|
+
/** Product-chosen queries shown before typing and after a query-caused zero result. */
|
|
120
|
+
export type SearchSuggestedQueries = Readonly<{
|
|
121
|
+
title: string;
|
|
122
|
+
items: readonly string[];
|
|
123
|
+
}>;
|
|
124
|
+
/** A typed-ahead completion. `match` bolds the matched range (weight, not color, so it survives dark mode). */
|
|
125
|
+
export type SearchSuggestion = Readonly<{
|
|
126
|
+
query: string;
|
|
127
|
+
match?: Readonly<{
|
|
128
|
+
start: number;
|
|
129
|
+
end: number;
|
|
130
|
+
}>;
|
|
131
|
+
}>;
|
|
132
|
+
export type SearchSuggestions = Readonly<{
|
|
133
|
+
items: readonly SearchSuggestion[];
|
|
134
|
+
/** First row that commits the typed text as is, e.g. "Search ‘q’". */
|
|
135
|
+
commitLabel(query: string): string;
|
|
136
|
+
/** Polite announcement of the suggestion count. */
|
|
137
|
+
countLabel(count: number): string;
|
|
138
|
+
icon?: ReactNode;
|
|
139
|
+
/** Rows shown under the commit row; default `searchScreenRecipe.suggestionVisible` (6). */
|
|
140
|
+
maxVisible?: number;
|
|
141
|
+
}>;
|
|
142
|
+
export type SearchSortOption = Readonly<{
|
|
143
|
+
id: string;
|
|
144
|
+
label: string;
|
|
145
|
+
}>;
|
|
146
|
+
export type SearchSort = Readonly<{
|
|
147
|
+
/** Accessible name of the sort menu. */
|
|
148
|
+
label: string;
|
|
149
|
+
/** Visible trigger text, usually the current option ("Sort: Newest"). */
|
|
150
|
+
triggerLabel: string;
|
|
151
|
+
value: string;
|
|
152
|
+
options: readonly SearchSortOption[];
|
|
153
|
+
onChange(id: string): void;
|
|
154
|
+
/** Trailing glyph of the trigger (for example a chevron). */
|
|
155
|
+
icon?: ReactNode;
|
|
156
|
+
}>;
|
|
157
|
+
export type SearchResultSummary = Readonly<{
|
|
158
|
+
/** Result total for the committed query; `null` while it loads (skeleton rows replace `children`). */
|
|
159
|
+
count: number | null;
|
|
160
|
+
countLabel(count: number): string;
|
|
161
|
+
/** Announced while loading. */
|
|
162
|
+
loadingLabel: string;
|
|
163
|
+
sort?: SearchSort;
|
|
164
|
+
/** Above the count, e.g. a retained-results error Notice with retry. */
|
|
165
|
+
notice?: ReactNode;
|
|
166
|
+
/** Zero-result copy. Filters as the cause add "clear all"; the query as the cause adds suggested queries. */
|
|
167
|
+
empty?: Readonly<{
|
|
168
|
+
title: string;
|
|
169
|
+
description?: string;
|
|
170
|
+
}>;
|
|
171
|
+
}>;
|
|
172
|
+
export type SearchAppliedFilter = Readonly<{
|
|
173
|
+
key: string;
|
|
174
|
+
label: string;
|
|
175
|
+
}>;
|
|
176
|
+
export type SearchAppliedFilters = Readonly<{
|
|
177
|
+
items: readonly SearchAppliedFilter[];
|
|
178
|
+
removeLabel(label: string): string;
|
|
179
|
+
onRemove(key: string): void;
|
|
180
|
+
clearAllLabel: string;
|
|
181
|
+
onClearAll(): void;
|
|
182
|
+
removeIcon?: ReactNode;
|
|
183
|
+
}>;
|
|
184
|
+
export type SearchFilterSheetLabels = Readonly<{
|
|
185
|
+
close: string;
|
|
186
|
+
reset: string;
|
|
187
|
+
/** Primary action text for a live draft count, e.g. "Show 12 results"; `null` while counting. */
|
|
188
|
+
apply(count: number | null): string;
|
|
189
|
+
}>;
|
|
190
|
+
/**
|
|
191
|
+
* Draft/applied filter sheet. HJM copies `value` into a draft when the sheet opens, discards the draft
|
|
192
|
+
* on any dismissal, and calls `onApply(draft)` only from the primary action.
|
|
193
|
+
*/
|
|
194
|
+
export type SearchFilterSheet<F> = Readonly<{
|
|
195
|
+
open: boolean;
|
|
196
|
+
onOpenChange(open: boolean): void;
|
|
197
|
+
/** Sheet title; products that open one section from a facet chip pass that section's name. */
|
|
198
|
+
title: string;
|
|
199
|
+
/** Applied filters. */
|
|
200
|
+
value: F;
|
|
201
|
+
onApply(next: F): void;
|
|
202
|
+
/** Live count for a draft. Return `null` while an async count is pending; `0` disables apply. */
|
|
203
|
+
count(draft: F): number | null;
|
|
204
|
+
/** Draft after "reset" (the open section, or everything). */
|
|
205
|
+
reset(draft: F): F;
|
|
206
|
+
/** Disables "reset" when the draft already equals its reset value. */
|
|
207
|
+
isDefault(draft: F): boolean;
|
|
208
|
+
renderContent(draft: F, setDraft: (next: F) => void): ReactNode;
|
|
209
|
+
labels: SearchFilterSheetLabels;
|
|
210
|
+
/** Default `large`; section sheets usually pass `auto`. */
|
|
211
|
+
size?: SheetProps["size"];
|
|
212
|
+
/** First item of the filter rail that opens the sheet, named with the applied count. */
|
|
213
|
+
trigger?: Readonly<{
|
|
214
|
+
label(appliedCount: number): string;
|
|
215
|
+
accessibilityLabel(appliedCount: number): string;
|
|
216
|
+
icon?: ReactNode;
|
|
217
|
+
}>;
|
|
218
|
+
}>;
|
|
219
|
+
type SearchInputSlot = {
|
|
220
|
+
queryField: ReactNode;
|
|
221
|
+
queryClearLabel?: string;
|
|
222
|
+
} | {
|
|
223
|
+
queryField?: never;
|
|
224
|
+
queryClearLabel: string;
|
|
225
|
+
};
|
|
226
|
+
/** `committedQuery` turns on two-step search; every commit (Enter, suggestion, recent, suggested query) then goes through `onSubmit`. */
|
|
227
|
+
/** One name for the default field's progress on both platforms (Web SearchField `loading`, Native `busy`+`busyLabel`). */
|
|
228
|
+
type SearchProgressSlot = {
|
|
229
|
+
searching?: never;
|
|
230
|
+
searchingLabel?: never;
|
|
231
|
+
} | {
|
|
232
|
+
searching: boolean;
|
|
233
|
+
searchingLabel: string;
|
|
234
|
+
};
|
|
235
|
+
type SearchCommitSlot = {
|
|
236
|
+
committedQuery?: never;
|
|
237
|
+
onSubmit?: (query: string) => void;
|
|
238
|
+
} | {
|
|
239
|
+
committedQuery: string;
|
|
240
|
+
onSubmit: (query: string) => void;
|
|
241
|
+
};
|
|
242
|
+
export type SearchScreenProps<F = unknown> = Base & SearchInputSlot & SearchCommitSlot & SearchProgressSlot & {
|
|
243
|
+
query: string;
|
|
244
|
+
queryLabel: string;
|
|
245
|
+
onQueryChange(value: string): void;
|
|
246
|
+
onSearch(query: string, context: {
|
|
247
|
+
signal: AbortSignal;
|
|
248
|
+
}): void;
|
|
249
|
+
debounceMs?: number;
|
|
250
|
+
filters?: ReactNode;
|
|
251
|
+
recentSearches?: ReactNode;
|
|
252
|
+
children: ReactNode;
|
|
253
|
+
/** `scroll` keeps `filters` on one horizontally scrolling line that bleeds to the screen edges. */
|
|
254
|
+
filtersOverflow?: "wrap" | "scroll";
|
|
255
|
+
/** Gutter the host (Container `gutter`, Sheet = `regular`) already applies around this screen; the scroll rail bleeds over it too. */
|
|
256
|
+
hostGutter?: ContainerGutter;
|
|
257
|
+
/** `hidden` drops the visible label (the field keeps `queryLabel` as its accessible name and placeholder). */
|
|
258
|
+
queryLabelVisibility?: "visible" | "hidden";
|
|
259
|
+
recentQueries?: SearchRecentQueries;
|
|
260
|
+
suggestedQueries?: SearchSuggestedQueries;
|
|
261
|
+
suggestions?: SearchSuggestions;
|
|
262
|
+
resultSummary?: SearchResultSummary;
|
|
263
|
+
appliedFilters?: SearchAppliedFilters;
|
|
264
|
+
filterSheet?: SearchFilterSheet<F>;
|
|
265
|
+
};
|
|
266
|
+
/** Abort is supplied to the host request; the host must ignore aborted responses before committing results. */
|
|
267
|
+
export declare function SearchScreen<F = unknown>({ query, queryLabel, queryField, queryClearLabel, onQueryChange, onSearch, debounceMs, filters, recentSearches, children, onSubmit, committedQuery, filtersOverflow, hostGutter, queryLabelVisibility, searching, searchingLabel, recentQueries, suggestedQueries, suggestions, resultSummary, appliedFilters, filterSheet, ...screen }: SearchScreenProps<F>): import("react").JSX.Element;
|
|
268
|
+
export type PermissionScreenProps = Base & {
|
|
269
|
+
status: PermissionScreenStatus;
|
|
270
|
+
illustration?: ReactNode;
|
|
271
|
+
explanation: ReactNode;
|
|
272
|
+
request: ScreenFlowAction;
|
|
273
|
+
settings: ScreenFlowAction;
|
|
274
|
+
continueAction: ScreenFlowAction;
|
|
275
|
+
skip?: ScreenFlowAction;
|
|
276
|
+
};
|
|
277
|
+
export declare function PermissionScreen({ status, illustration, explanation, request, settings, continueAction, skip, ...screen }: PermissionScreenProps): import("react").JSX.Element;
|
|
278
|
+
export type OnboardingStep = {
|
|
279
|
+
id: string;
|
|
280
|
+
title: string;
|
|
281
|
+
description: string;
|
|
282
|
+
content: ReactNode;
|
|
283
|
+
};
|
|
284
|
+
export type OnboardingScreenProps = {
|
|
285
|
+
steps: readonly OnboardingStep[];
|
|
286
|
+
index: number;
|
|
287
|
+
onIndexChange(index: number): void;
|
|
288
|
+
nextLabel: string;
|
|
289
|
+
backLabel: string;
|
|
290
|
+
complete: ScreenFlowAction;
|
|
291
|
+
skip?: ScreenFlowAction;
|
|
292
|
+
progressLabel(index: number, total: number): string;
|
|
293
|
+
layoutStyle?: ScreenLayoutProps["layoutStyle"];
|
|
294
|
+
};
|
|
295
|
+
export declare function OnboardingScreen({ steps, index, onIndexChange, nextLabel, backLabel, complete, skip, progressLabel, layoutStyle }: OnboardingScreenProps): import("react").JSX.Element;
|
|
296
|
+
export type CommentThreadItem = Readonly<{
|
|
297
|
+
id: string;
|
|
298
|
+
parentId: string | null;
|
|
299
|
+
author: string;
|
|
300
|
+
body: ReactNode;
|
|
301
|
+
bodyText?: string;
|
|
302
|
+
timeLabel: string;
|
|
303
|
+
likeCountLabel: string;
|
|
304
|
+
avatar?: ReactNode;
|
|
305
|
+
likeIcon: ReactNode;
|
|
306
|
+
likeLabel: string;
|
|
307
|
+
likeAction?: ReactNode;
|
|
308
|
+
actions?: ReactNode;
|
|
309
|
+
canReply?: boolean;
|
|
310
|
+
replyDisabled?: boolean;
|
|
311
|
+
}>;
|
|
312
|
+
export type CommentThreadScreenProps = Base & {
|
|
313
|
+
items: readonly CommentThreadItem[];
|
|
314
|
+
expandedIds: readonly string[];
|
|
315
|
+
onExpandedChange(id: string): void;
|
|
316
|
+
onLike(id: string): void;
|
|
317
|
+
onReply(id: string): void;
|
|
318
|
+
replyLabel: string;
|
|
319
|
+
repliesLabel(count: number, expanded: boolean): string;
|
|
320
|
+
composer?: ReactNode;
|
|
321
|
+
threadFooter?: ReactNode;
|
|
322
|
+
};
|
|
323
|
+
/** Controlled thread: server ordering, permission checks and receipt-based draft clearing belong to the product. */
|
|
324
|
+
export declare function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLike, onReply, replyLabel, repliesLabel, composer, threadFooter, ...screen }: CommentThreadScreenProps): import("react").JSX.Element;
|
|
325
|
+
export {};
|
|
326
|
+
//# sourceMappingURL=screen-flows.d.ts.map
|