@hjmds/react 1.41.1 → 1.42.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.
- package/README.md +2 -2
- package/dist/actions.d.ts +41 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +40 -3
- package/dist/actions.js.map +1 -1
- package/dist/activity-chip.d.ts.map +1 -1
- package/dist/activity-chip.js +1 -0
- package/dist/activity-chip.js.map +1 -1
- package/dist/advanced-display.d.ts +47 -14
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +72 -17
- package/dist/advanced-display.js.map +1 -1
- package/dist/advanced-forms.d.ts.map +1 -1
- package/dist/advanced-forms.js +1 -0
- package/dist/advanced-forms.js.map +1 -1
- package/dist/affix.d.ts +6 -1
- package/dist/affix.d.ts.map +1 -1
- package/dist/affix.js +5 -3
- package/dist/affix.js.map +1 -1
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +1 -0
- package/dist/agreement.js.map +1 -1
- package/dist/alert-dialog-queue.d.ts +24 -0
- package/dist/alert-dialog-queue.d.ts.map +1 -0
- package/dist/alert-dialog-queue.js +44 -0
- package/dist/alert-dialog-queue.js.map +1 -0
- package/dist/anchor.d.ts.map +1 -1
- package/dist/anchor.js +1 -0
- package/dist/anchor.js.map +1 -1
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +1 -0
- package/dist/asset.js.map +1 -1
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +1 -0
- package/dist/auth-screen.js.map +1 -1
- package/dist/avatar-blobatar-motion.d.ts.map +1 -1
- package/dist/avatar-blobatar-motion.js +1 -0
- package/dist/avatar-blobatar-motion.js.map +1 -1
- package/dist/avatar-blobatar.d.ts.map +1 -1
- package/dist/avatar-blobatar.js +1 -0
- package/dist/avatar-blobatar.js.map +1 -1
- package/dist/bottom-cta.d.ts.map +1 -1
- package/dist/bottom-cta.js +1 -0
- package/dist/bottom-cta.js.map +1 -1
- package/dist/bottom-info.d.ts.map +1 -1
- package/dist/bottom-info.js +1 -0
- package/dist/bottom-info.js.map +1 -1
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +1 -0
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/breadcrumb.d.ts.map +1 -1
- package/dist/breadcrumb.js +1 -0
- package/dist/breadcrumb.js.map +1 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +1 -0
- package/dist/calendar.js.map +1 -1
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +1 -0
- package/dist/carousel-motion.js.map +1 -1
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +1 -0
- package/dist/carousel.js.map +1 -1
- package/dist/celebration.d.ts.map +1 -1
- package/dist/celebration.js +1 -0
- package/dist/celebration.js.map +1 -1
- package/dist/chart.d.ts +7 -2
- package/dist/chart.d.ts.map +1 -1
- package/dist/chart.js +6 -3
- package/dist/chart.js.map +1 -1
- package/dist/choice-row.d.ts +24 -7
- package/dist/choice-row.d.ts.map +1 -1
- package/dist/choice-row.js +11 -6
- package/dist/choice-row.js.map +1 -1
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +1 -0
- package/dist/clipboard.js.map +1 -1
- package/dist/collapsible.d.ts.map +1 -1
- package/dist/collapsible.js +1 -0
- package/dist/collapsible.js.map +1 -1
- package/dist/collection-rail.d.ts.map +1 -1
- package/dist/collection-rail.js +3 -1
- package/dist/collection-rail.js.map +1 -1
- package/dist/color-picker.d.ts.map +1 -1
- package/dist/color-picker.js +1 -0
- package/dist/color-picker.js.map +1 -1
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +1 -0
- package/dist/command-palette.js.map +1 -1
- package/dist/content-transition.d.ts.map +1 -1
- package/dist/content-transition.js +1 -0
- package/dist/content-transition.js.map +1 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +1 -0
- package/dist/context-menu.js.map +1 -1
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +1 -0
- package/dist/conversation-row.js.map +1 -1
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +1 -0
- package/dist/data-table.js.map +1 -1
- package/dist/date-entry.d.ts.map +1 -1
- package/dist/date-entry.js +1 -0
- package/dist/date-entry.js.map +1 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +1 -0
- package/dist/date-picker.js.map +1 -1
- package/dist/date-range.d.ts.map +1 -1
- package/dist/date-range.js +1 -0
- package/dist/date-range.js.map +1 -1
- package/dist/design-profile.d.ts.map +1 -1
- package/dist/design-profile.js +1 -0
- package/dist/design-profile.js.map +1 -1
- package/dist/display.d.ts +21 -1
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +34 -8
- package/dist/display.js.map +1 -1
- package/dist/duration-field.d.ts.map +1 -1
- package/dist/duration-field.js +1 -0
- package/dist/duration-field.js.map +1 -1
- package/dist/effect-surface.d.ts.map +1 -1
- package/dist/effect-surface.js +1 -0
- 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.map +1 -1
- package/dist/feedback.js +1 -0
- package/dist/feedback.js.map +1 -1
- package/dist/field-group.d.ts.map +1 -1
- package/dist/field-group.js +1 -0
- package/dist/field-group.js.map +1 -1
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +1 -0
- package/dist/file-picker.js.map +1 -1
- package/dist/floating-action-button.d.ts.map +1 -1
- package/dist/floating-action-button.js +1 -0
- package/dist/floating-action-button.js.map +1 -1
- package/dist/folder-preview.d.ts.map +1 -1
- package/dist/folder-preview.js +1 -0
- package/dist/folder-preview.js.map +1 -1
- package/dist/forms.d.ts +30 -6
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +56 -14
- package/dist/forms.js.map +1 -1
- package/dist/gravity-letters.d.ts.map +1 -1
- package/dist/gravity-letters.js +1 -0
- package/dist/gravity-letters.js.map +1 -1
- package/dist/grid-reveal.d.ts.map +1 -1
- package/dist/grid-reveal.js +1 -0
- package/dist/grid-reveal.js.map +1 -1
- package/dist/heading.d.ts.map +1 -1
- package/dist/heading.js +1 -0
- package/dist/heading.js.map +1 -1
- package/dist/image-choice.d.ts.map +1 -1
- package/dist/image-choice.js +1 -0
- package/dist/image-choice.js.map +1 -1
- package/dist/image-comparison.d.ts.map +1 -1
- package/dist/image-comparison.js +1 -0
- package/dist/image-comparison.js.map +1 -1
- package/dist/image-viewer.d.ts +22 -1
- package/dist/image-viewer.d.ts.map +1 -1
- package/dist/image-viewer.js +14 -1
- package/dist/image-viewer.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inline-confirm.d.ts.map +1 -1
- package/dist/inline-confirm.js +1 -0
- package/dist/inline-confirm.js.map +1 -1
- package/dist/internal/document-resource.d.ts.map +1 -1
- package/dist/internal/document-resource.js +1 -0
- package/dist/internal/document-resource.js.map +1 -1
- package/dist/internal/initial-focus.d.ts.map +1 -1
- package/dist/internal/initial-focus.js +1 -0
- package/dist/internal/initial-focus.js.map +1 -1
- package/dist/internal/media-album.d.ts.map +1 -1
- package/dist/internal/media-album.js +1 -0
- package/dist/internal/media-album.js.map +1 -1
- package/dist/internal/message-reactions.d.ts.map +1 -1
- package/dist/internal/message-reactions.js +1 -0
- package/dist/internal/message-reactions.js.map +1 -1
- package/dist/internal/overlay-origin-motion.d.ts.map +1 -1
- package/dist/internal/overlay-origin-motion.js +1 -0
- package/dist/internal/overlay-origin-motion.js.map +1 -1
- package/dist/internal/pending-content.d.ts.map +1 -1
- package/dist/internal/pending-content.js +1 -0
- package/dist/internal/pending-content.js.map +1 -1
- package/dist/internal/photo-source-icon.d.ts.map +1 -1
- package/dist/internal/photo-source-icon.js +1 -0
- package/dist/internal/photo-source-icon.js.map +1 -1
- package/dist/internal/screen-exit.d.ts.map +1 -1
- package/dist/internal/screen-exit.js +1 -0
- package/dist/internal/screen-exit.js.map +1 -1
- package/dist/internal/screen-footer.d.ts.map +1 -1
- package/dist/internal/screen-footer.js +1 -0
- package/dist/internal/screen-footer.js.map +1 -1
- package/dist/internal/spinner.d.ts.map +1 -1
- package/dist/internal/spinner.js +1 -0
- package/dist/internal/spinner.js.map +1 -1
- package/dist/internal/use-composition-action.d.ts.map +1 -1
- package/dist/internal/use-composition-action.js +1 -0
- package/dist/internal/use-composition-action.js.map +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -1
- package/dist/layout.d.ts +11 -1
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +8 -4
- package/dist/layout.js.map +1 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +1 -0
- package/dist/mentions.js.map +1 -1
- package/dist/menu-morph.d.ts.map +1 -1
- package/dist/menu-morph.js +1 -0
- package/dist/menu-morph.js.map +1 -1
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +1 -0
- package/dist/menubar.js.map +1 -1
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js +1 -0
- package/dist/modal.js.map +1 -1
- package/dist/navigation-bar.d.ts.map +1 -1
- package/dist/navigation-bar.js +1 -0
- package/dist/navigation-bar.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +1 -0
- package/dist/navigation.js.map +1 -1
- package/dist/notification-bell.d.ts +1 -1
- package/dist/notification-bell.d.ts.map +1 -1
- package/dist/notification-bell.js +5 -1
- package/dist/notification-bell.js.map +1 -1
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +1 -0
- package/dist/number-field.js.map +1 -1
- package/dist/overlay-stack.d.ts.map +1 -1
- package/dist/overlay-stack.js +1 -0
- package/dist/overlay-stack.js.map +1 -1
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +11 -2
- package/dist/overlays.js.map +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +1 -0
- package/dist/pagination.js.map +1 -1
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +1 -0
- package/dist/popover.js.map +1 -1
- package/dist/portal.d.ts.map +1 -1
- package/dist/portal.js +1 -0
- package/dist/portal.js.map +1 -1
- package/dist/progressive-blur.d.ts.map +1 -1
- package/dist/progressive-blur.js +1 -0
- package/dist/progressive-blur.js.map +1 -1
- package/dist/provider-button.d.ts.map +1 -1
- package/dist/provider-button.js +1 -0
- package/dist/provider-button.js.map +1 -1
- package/dist/provider.d.ts +9 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +2 -2
- package/dist/provider.js.map +1 -1
- package/dist/public-exports.generated.d.ts +3 -0
- package/dist/public-exports.generated.d.ts.map +1 -1
- package/dist/public-exports.generated.js +9 -0
- package/dist/public-exports.generated.js.map +1 -1
- package/dist/rating.d.ts.map +1 -1
- package/dist/rating.js +1 -0
- package/dist/rating.js.map +1 -1
- package/dist/reaction-picker.d.ts.map +1 -1
- package/dist/reaction-picker.js +1 -0
- package/dist/reaction-picker.js.map +1 -1
- package/dist/saved-items.d.ts.map +1 -1
- package/dist/saved-items.js +1 -0
- package/dist/saved-items.js.map +1 -1
- package/dist/screen-flows.d.ts +5 -1
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +13 -4
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +24 -4
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +38 -11
- package/dist/screens.js.map +1 -1
- package/dist/scroll-progress.d.ts.map +1 -1
- package/dist/scroll-progress.js +1 -0
- package/dist/scroll-progress.js.map +1 -1
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +1 -0
- package/dist/select.js.map +1 -1
- package/dist/selection.d.ts +7 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +33 -10
- package/dist/selection.js.map +1 -1
- package/dist/side-panel.d.ts.map +1 -1
- package/dist/side-panel.js +1 -0
- package/dist/side-panel.js.map +1 -1
- package/dist/sidebar.d.ts +21 -2
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +40 -20
- package/dist/sidebar.js.map +1 -1
- package/dist/skip-nav.d.ts.map +1 -1
- package/dist/skip-nav.js +1 -0
- package/dist/skip-nav.js.map +1 -1
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +1 -0
- package/dist/slider.js.map +1 -1
- package/dist/sortable.d.ts.map +1 -1
- package/dist/sortable.js +1 -0
- package/dist/sortable.js.map +1 -1
- package/dist/splitter.d.ts.map +1 -1
- package/dist/splitter.js +1 -0
- package/dist/splitter.js.map +1 -1
- package/dist/statistic-motion.d.ts.map +1 -1
- package/dist/statistic-motion.js +1 -0
- package/dist/statistic-motion.js.map +1 -1
- package/dist/status-text.d.ts.map +1 -1
- package/dist/status-text.js +1 -0
- package/dist/status-text.js.map +1 -1
- package/dist/step-player.d.ts.map +1 -1
- package/dist/step-player.js +1 -0
- package/dist/step-player.js.map +1 -1
- package/dist/steps.d.ts +16 -14
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +26 -9
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +140 -35
- package/dist/styles.layered.css +140 -35
- package/dist/supplemental-display.d.ts.map +1 -1
- package/dist/supplemental-display.js +1 -0
- package/dist/supplemental-display.js.map +1 -1
- package/dist/supplemental-navigation.d.ts.map +1 -1
- package/dist/supplemental-navigation.js +1 -0
- package/dist/supplemental-navigation.js.map +1 -1
- package/dist/swipe-actions.d.ts.map +1 -1
- package/dist/swipe-actions.js +1 -0
- package/dist/swipe-actions.js.map +1 -1
- package/dist/table-family.d.ts.map +1 -1
- package/dist/table-family.js +1 -0
- package/dist/table-family.js.map +1 -1
- package/dist/table-sort-button.d.ts.map +1 -1
- package/dist/table-sort-button.js +1 -0
- package/dist/table-sort-button.js.map +1 -1
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +1 -0
- package/dist/tags-input.js.map +1 -1
- package/dist/task-list.d.ts.map +1 -1
- package/dist/task-list.js +1 -0
- package/dist/task-list.js.map +1 -1
- package/dist/text-annotation.d.ts.map +1 -1
- package/dist/text-annotation.js +1 -0
- package/dist/text-annotation.js.map +1 -1
- package/dist/text-formats.d.ts.map +1 -1
- package/dist/text-formats.js +1 -0
- package/dist/text-formats.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +12 -1
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +1 -0
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +1 -0
- package/dist/toast.js.map +1 -1
- package/dist/toggle-group.d.ts.map +1 -1
- package/dist/toggle-group.js +1 -0
- package/dist/toggle-group.js.map +1 -1
- package/dist/top-bar.d.ts.map +1 -1
- package/dist/top-bar.js +1 -0
- package/dist/top-bar.js.map +1 -1
- package/dist/top.d.ts.map +1 -1
- package/dist/top.js +4 -3
- package/dist/top.js.map +1 -1
- package/dist/tour.d.ts.map +1 -1
- package/dist/tour.js +1 -0
- package/dist/tour.js.map +1 -1
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +1 -0
- package/dist/transfer-list.js.map +1 -1
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -0
- package/dist/tree.js.map +1 -1
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +1 -0
- package/dist/upload-item.js.map +1 -1
- package/dist/virtual-list.d.ts.map +1 -1
- package/dist/virtual-list.js +1 -0
- package/dist/virtual-list.js.map +1 -1
- package/dist/voice-note.d.ts.map +1 -1
- package/dist/voice-note.js +1 -0
- package/dist/voice-note.js.map +1 -1
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advanced-forms.js","sourceRoot":"","sources":["../src/advanced-forms.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n comboboxRecipe,\n selectRecipe,\n type SelectDensity,\n type SelectSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n formRecipe,\n type FormDensity,\n} from \"@hjmds/design-contracts/components/form\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FormEvent,\n type FormHTMLAttributes,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type SelectHTMLAttributes,\n} from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { Field } from \"./forms.js\";\nimport { classNames, composeRefs, useControllableState } from \"./internal.js\";\nimport { AnchoredPortal, useAnchoredPopup } from \"./portal.js\";\n\nfunction useControlId(id: string | undefined, prefix: string): string {\n const generated = useId().replaceAll(\":\", \"\");\n return id ?? `hjm-${prefix}-${generated}`;\n}\n\nexport type SelectOption = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n}>;\n\nfunction validateOptions(options: readonly SelectOption[], component: string): void {\n if (options.length === 0) throw new TypeError(`${component} requires at least one option`);\n const values = new Set<string>();\n for (const option of options) {\n if (option.value.trim().length === 0) {\n throw new TypeError(`${component} option value must not be empty`);\n }\n if (option.label.trim().length === 0) {\n throw new TypeError(`${component} option label must not be empty`);\n }\n if (values.has(option.value)) {\n throw new TypeError(`Duplicate ${component} option value: ${option.value}`);\n }\n values.add(option.value);\n }\n}\n\nexport type NativeSelectProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"children\" | \"defaultValue\" | \"onChange\" | \"size\" | \"value\"\n> &\n Readonly<{\n label: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n options: readonly SelectOption[];\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: SelectSize;\n density?: SelectDensity;\n fieldClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the native control, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** A native select keeps browser keyboard, form, autofill, and mobile picker behavior. */\nexport const NativeSelect = forwardRef<HTMLSelectElement, NativeSelectProps>(function NativeSelect(\n {\n id,\n label,\n description,\n error,\n options,\n placeholder,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n size = selectRecipe.defaults.size,\n density = selectRecipe.defaults.density,\n fieldClassName,\n className,\n layoutStyle,\n disabled = false,\n required = false,\n ...props\n },\n ref,\n) {\n validateOptions(options, \"Select\");\n const controlId = useControlId(id, \"select\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const initialized = useRef(false);\n const available = storedValue === \"\" || options.some(option => option.value === storedValue && !option.disabled);\n if ((!initialized.current || valueProp !== undefined) && !available) {\n throw new RangeError(`Select value must identify an enabled option: ${storedValue}`);\n }\n initialized.current = true;\n // Defaults are validated once. Later list changes must reconcile an internal\n // selection instead of crashing a form while its options are being refreshed.\n const value = valueProp === undefined && !available\n ? placeholder !== undefined ? \"\" : options.find(option => !option.disabled)?.value ?? \"\"\n : storedValue;\n useEffect(() => {\n if (valueProp === undefined && value !== storedValue) setValue(value);\n }, [storedValue, value, valueProp, setValue]);\n\n return (\n <Field\n controlId={controlId}\n label={label}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n className={classNames(\"hjm-select\", fieldClassName)}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n data-size={size}\n data-density={density}\n >\n {(controlProps) => (\n <div className=\"hjm-field__control hjm-select__control\">\n <select\n {...props}\n {...controlProps}\n ref={ref}\n value={value}\n className={classNames(\"hjm-field__input hjm-select__native\", className)}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => setValue(event.target.value)}\n >\n {placeholder !== undefined ? (\n <option value=\"\" disabled={required}>\n {placeholder}\n </option>\n ) : null}\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n </div>\n )}\n </Field>\n );\n});\n\nexport type ComboboxItem = Readonly<{\n value: string;\n label: string;\n keywords?: readonly string[];\n disabled?: boolean;\n}>;\n\nexport type ComboboxOpenChangeReason =\n | \"focus\"\n | \"input\"\n | \"keyboard\"\n | \"selection\"\n | \"escape\"\n | \"blur\";\n\nexport type ComboboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"children\" | \"defaultValue\" | \"onChange\" | \"role\" | \"size\" | \"value\"\n> &\n Readonly<{\n label: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n items: readonly ComboboxItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n inputValue?: string;\n defaultInputValue?: string;\n onInputValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, reason: ComboboxOpenChangeReason) => void;\n /** Localized content rendered when filtering returns no items. */\n emptyMessage: ReactNode;\n loading?: boolean;\n /** Localized content announced while options are loading. */\n loadingMessage: ReactNode;\n /** Localized native-validation message for an empty required selection. */\n selectionRequiredMessage: string;\n openOnFocus?: boolean;\n size?: SelectSize;\n density?: SelectDensity;\n /** Logical listbox alignment against the input; automatically mirrors in RTL. */\n align?: \"start\" | \"end\";\n fieldClassName?: string;\n portalContainer?: HTMLElement;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction nextEnabled(\n items: readonly ComboboxItem[],\n current: number,\n direction: 1 | -1,\n): number {\n if (items.length === 0) return -1;\n for (let offset = 1; offset <= items.length; offset += 1) {\n const candidate = (current + direction * offset + items.length) % items.length;\n if (!items[candidate]?.disabled) return candidate;\n }\n return -1;\n}\n\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(\n function Combobox(\n {\n id,\n name,\n label,\n description,\n error,\n items,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n inputValue: inputValueProp,\n defaultInputValue,\n onInputValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n emptyMessage,\n loading = false,\n loadingMessage,\n selectionRequiredMessage,\n openOnFocus = true,\n size = comboboxRecipe.defaults.size,\n density = comboboxRecipe.defaults.density,\n align = \"start\",\n fieldClassName,\n portalContainer,\n className,\n layoutStyle,\n disabled = false,\n readOnly = false,\n required = false,\n autoComplete = \"off\",\n onFocus,\n onBlur,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) {\n validateOptions(items, \"Combobox\");\n const controlId = useControlId(id, \"combobox\");\n const listboxId = `${controlId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const suppressFocusOpenRef = useRef(false);\n const listboxRef = useRef<HTMLDivElement>(null);\n const [listboxNode, setListboxNode] = useState<HTMLDivElement | null>(null);\n const popupPosition = useAnchoredPopup(inputRef, listboxNode, {\n align,\n // comboboxRecipe.popover (= selectRecipe.popover), same correction as Select (2026-10-06).\n gap: comboboxRecipe.popover.sideOffset,\n viewportPadding: comboboxRecipe.popover.collisionPadding,\n matchAnchorWidth: true,\n zIndex: layer.dropdown,\n });\n const setListboxRef = useCallback((node: HTMLDivElement | null) => {\n listboxRef.current = node;\n setListboxNode(node);\n }, []);\n const [selectedValue, setSelectedValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const selectedItem = items.find((item) => item.value === selectedValue);\n if (selectedValue !== \"\" && (!selectedItem || selectedItem.disabled)) {\n throw new RangeError(\n `Combobox value must identify an enabled option: ${selectedValue}`,\n );\n }\n if (required && selectionRequiredMessage.trim().length === 0) {\n throw new TypeError(\"Combobox selectionRequiredMessage must not be empty\");\n }\n const [query, setQuery] = useControllableState({\n ...(inputValueProp === undefined ? {} : { value: inputValueProp }),\n defaultValue: defaultInputValue ?? selectedItem?.label ?? \"\",\n ...(onInputValueChange === undefined ? {} : { onChange: onInputValueChange }),\n });\n const [open, setOpenState] = useControllableState({\n ...(openProp === undefined ? {} : { value: openProp }),\n defaultValue: defaultOpen,\n });\n const [activeIndex, setActiveIndex] = useState(-1);\n useEffect(() => {\n inputRef.current?.setCustomValidity(\n required && selectedValue === \"\" ? selectionRequiredMessage : \"\",\n );\n }, [required, selectedValue, selectionRequiredMessage]);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const filteredItems = useMemo(\n () =>\n items.filter((item) => {\n if (normalizedQuery.length === 0) return true;\n const searchable = [item.label, ...(item.keywords ?? [])]\n .join(\" \")\n .toLocaleLowerCase();\n return searchable.includes(normalizedQuery);\n }),\n [items, normalizedQuery],\n );\n\n const setOpen = (next: boolean, reason: ComboboxOpenChangeReason) => {\n if (next === open) return;\n setOpenState(next);\n onOpenChange?.(next, reason);\n if (!next) setActiveIndex(-1);\n };\n const firstEnabled = () => filteredItems.findIndex((item) => !item.disabled);\n const lastEnabled = () => {\n for (let index = filteredItems.length - 1; index >= 0; index -= 1) {\n if (!filteredItems[index]?.disabled) return index;\n }\n return -1;\n };\n const selectItem = (item: ComboboxItem) => {\n if (item.disabled || disabled || readOnly || loading) return;\n setSelectedValue(item.value);\n setQuery(item.label);\n setOpen(false, \"selection\");\n queueMicrotask(() => {\n const input = inputRef.current;\n if (!input || document.activeElement === input) return;\n suppressFocusOpenRef.current = true;\n input.focus();\n queueMicrotask(() => {\n suppressFocusOpenRef.current = false;\n });\n });\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || readOnly || event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (\n loading &&\n [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\", \"Enter\"].includes(event.key)\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!open) {\n setOpen(true, \"keyboard\");\n setActiveIndex(\n event.key === \"ArrowDown\" ? firstEnabled() : lastEnabled(),\n );\n return;\n }\n setActiveIndex((current) =>\n nextEnabled(filteredItems, current, event.key === \"ArrowDown\" ? 1 : -1),\n );\n } else if (open && event.key === \"Home\") {\n event.preventDefault();\n setActiveIndex(firstEnabled());\n } else if (open && event.key === \"End\") {\n event.preventDefault();\n setActiveIndex(lastEnabled());\n } else if (open && event.key === \"Enter\" && activeIndex >= 0) {\n event.preventDefault();\n const item = filteredItems[activeIndex];\n if (item) selectItem(item);\n } else if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false, \"escape\");\n } else if (open && event.key === \"Tab\") {\n setOpen(false, \"blur\");\n }\n };\n const activeItem = activeIndex >= 0 ? filteredItems[activeIndex] : undefined;\n\n return (\n <Field\n controlId={controlId}\n label={label}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n className={classNames(\"hjm-combobox\", fieldClassName)}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n data-size={size}\n data-density={density}\n data-state={disabled ? \"disabled\" : open ? \"open\" : \"closed\"}\n >\n {(controlProps) => (\n <div\n ref={rootRef}\n className=\"hjm-combobox__anchor\"\n onBlur={(event) => {\n if (\n !event.currentTarget.contains(event.relatedTarget) &&\n !listboxRef.current?.contains(event.relatedTarget)\n ) setOpen(false, \"blur\");\n }}\n >\n <div className=\"hjm-field__control hjm-combobox__control\">\n <input\n {...props}\n {...controlProps}\n ref={composeRefs(forwardedRef, inputRef)}\n className={classNames(\"hjm-field__input hjm-combobox__input\", className)}\n value={query}\n readOnly={readOnly}\n role=\"combobox\"\n autoComplete={autoComplete}\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-expanded={open}\n aria-activedescendant={\n open && activeItem ? `${controlId}-option-${activeIndex}` : undefined\n }\n onFocus={(event) => {\n onFocus?.(event);\n if (\n !event.defaultPrevented &&\n !disabled && !readOnly && openOnFocus &&\n !suppressFocusOpenRef.current\n ) setOpen(true, \"focus\");\n }}\n onBlur={onBlur}\n onChange={(event) => {\n if (disabled || readOnly) return;\n setQuery(event.target.value);\n setSelectedValue(\"\");\n setOpen(true, \"input\");\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n />\n {loading ? <span className=\"hjm-combobox__spinner\" aria-hidden=\"true\" /> : null}\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n </div>\n {name ? <input type=\"hidden\" name={name} value={selectedValue} /> : null}\n {open ? (\n <AnchoredPortal\n anchorRef={inputRef}\n ssrFallback=\"inline\"\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <div\n ref={setListboxRef}\n id={listboxId}\n role=\"listbox\"\n className=\"hjm-combobox__listbox\"\n data-density={density}\n aria-label={typeof label === \"string\" ? label : undefined}\n aria-busy={loading || undefined}\n data-placement={popupPosition.placement}\n data-align={popupPosition.align}\n style={popupPosition.style}\n >\n {loading ? (\n <div className=\"hjm-combobox__message\" role=\"status\"><span className=\"hjm-visually-hidden\">{loadingMessage}</span></div>\n ) : filteredItems.length === 0 ? (\n <div className=\"hjm-combobox__message\">{emptyMessage}</div>\n ) : (\n filteredItems.map((item, index) => (\n <div\n key={item.value}\n id={`${controlId}-option-${index}`}\n role=\"option\"\n aria-selected={item.value === selectedValue}\n aria-disabled={item.disabled || undefined}\n className=\"hjm-combobox__option\"\n data-state={\n item.disabled\n ? \"disabled\"\n : index === activeIndex\n ? \"active\"\n : item.value === selectedValue\n ? \"selected\"\n : \"idle\"\n }\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!item.disabled) setActiveIndex(index);\n }}\n onClick={() => selectItem(item)}\n >\n {item.label}\n </div>\n ))\n )}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n )}\n </Field>\n );\n },\n);\n\nexport type FormSubmitHandler = (\n event: FormEvent<HTMLFormElement>,\n) => void | Promise<void>;\n\nexport type FormProps = Omit<FormHTMLAttributes<HTMLFormElement>, \"onSubmit\"> &\n Readonly<{\n onSubmit: FormSubmitHandler;\n busy?: boolean;\n formError?: ReactNode;\n actions?: ReactNode;\n density?: FormDensity;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n {\n onSubmit,\n busy = false,\n formError,\n actions,\n density = formRecipe.defaults.density,\n className,\n children,\n layoutStyle,\n ...props\n },\n ref,\n) {\n const [submitting, setSubmitting] = useState(false);\n const submittingRef = useRef(false);\n const effectiveBusy = busy || submitting;\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (effectiveBusy || submittingRef.current) return;\n let result: void | Promise<void>;\n try {\n result = onSubmit(event);\n } catch (error) {\n throw error;\n }\n if (result && typeof result.then === \"function\") {\n submittingRef.current = true;\n setSubmitting(true);\n void Promise.resolve(result)\n .catch(() => undefined)\n .finally(() => {\n submittingRef.current = false;\n setSubmitting(false);\n });\n }\n };\n\n return (\n <form\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-form\", className)}\n data-density={density}\n data-state={effectiveBusy ? \"busy\" : formError ? \"error\" : \"idle\"}\n aria-busy={effectiveBusy || undefined}\n onSubmit={handleSubmit}\n >\n <fieldset className=\"hjm-form__fieldset\" disabled={effectiveBusy}>\n <div className=\"hjm-form__fields\">{children}</div>\n {formError ? (\n <div className=\"hjm-form__error\" role=\"alert\">{formError}</div>\n ) : null}\n {actions ? <div className=\"hjm-form__actions\">{actions}</div> : null}\n </fieldset>\n </form>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"file":"advanced-forms.js","sourceRoot":"","sources":["../src/advanced-forms.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n comboboxRecipe,\n selectRecipe,\n type SelectDensity,\n type SelectSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n formRecipe,\n type FormDensity,\n} from \"@hjmds/design-contracts/components/form\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FormEvent,\n type FormHTMLAttributes,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type SelectHTMLAttributes,\n} from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { Field } from \"./forms.js\";\nimport { classNames, composeRefs, useControllableState } from \"./internal.js\";\nimport { AnchoredPortal, useAnchoredPopup } from \"./portal.js\";\n\nfunction useControlId(id: string | undefined, prefix: string): string {\n const generated = useId().replaceAll(\":\", \"\");\n return id ?? `hjm-${prefix}-${generated}`;\n}\n\nexport type SelectOption = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n}>;\n\nfunction validateOptions(options: readonly SelectOption[], component: string): void {\n if (options.length === 0) throw new TypeError(`${component} requires at least one option`);\n const values = new Set<string>();\n for (const option of options) {\n if (option.value.trim().length === 0) {\n throw new TypeError(`${component} option value must not be empty`);\n }\n if (option.label.trim().length === 0) {\n throw new TypeError(`${component} option label must not be empty`);\n }\n if (values.has(option.value)) {\n throw new TypeError(`Duplicate ${component} option value: ${option.value}`);\n }\n values.add(option.value);\n }\n}\n\nexport type NativeSelectProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"children\" | \"defaultValue\" | \"onChange\" | \"size\" | \"value\"\n> &\n Readonly<{\n label: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n options: readonly SelectOption[];\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: SelectSize;\n density?: SelectDensity;\n fieldClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the native control, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/** A native select keeps browser keyboard, form, autofill, and mobile picker behavior. */\nexport const NativeSelect = forwardRef<HTMLSelectElement, NativeSelectProps>(function NativeSelect(\n {\n id,\n label,\n description,\n error,\n options,\n placeholder,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n size = selectRecipe.defaults.size,\n density = selectRecipe.defaults.density,\n fieldClassName,\n className,\n layoutStyle,\n disabled = false,\n required = false,\n ...props\n },\n ref,\n) {\n validateOptions(options, \"Select\");\n const controlId = useControlId(id, \"select\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const initialized = useRef(false);\n const available = storedValue === \"\" || options.some(option => option.value === storedValue && !option.disabled);\n if ((!initialized.current || valueProp !== undefined) && !available) {\n throw new RangeError(`Select value must identify an enabled option: ${storedValue}`);\n }\n initialized.current = true;\n // Defaults are validated once. Later list changes must reconcile an internal\n // selection instead of crashing a form while its options are being refreshed.\n const value = valueProp === undefined && !available\n ? placeholder !== undefined ? \"\" : options.find(option => !option.disabled)?.value ?? \"\"\n : storedValue;\n useEffect(() => {\n if (valueProp === undefined && value !== storedValue) setValue(value);\n }, [storedValue, value, valueProp, setValue]);\n\n return (\n <Field\n controlId={controlId}\n label={label}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n className={classNames(\"hjm-select\", fieldClassName)}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n data-size={size}\n data-density={density}\n >\n {(controlProps) => (\n <div className=\"hjm-field__control hjm-select__control\">\n <select\n {...props}\n {...controlProps}\n ref={ref}\n value={value}\n className={classNames(\"hjm-field__input hjm-select__native\", className)}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => setValue(event.target.value)}\n >\n {placeholder !== undefined ? (\n <option value=\"\" disabled={required}>\n {placeholder}\n </option>\n ) : null}\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n </div>\n )}\n </Field>\n );\n});\n\nexport type ComboboxItem = Readonly<{\n value: string;\n label: string;\n keywords?: readonly string[];\n disabled?: boolean;\n}>;\n\nexport type ComboboxOpenChangeReason =\n | \"focus\"\n | \"input\"\n | \"keyboard\"\n | \"selection\"\n | \"escape\"\n | \"blur\";\n\nexport type ComboboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"children\" | \"defaultValue\" | \"onChange\" | \"role\" | \"size\" | \"value\"\n> &\n Readonly<{\n label: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n items: readonly ComboboxItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n inputValue?: string;\n defaultInputValue?: string;\n onInputValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, reason: ComboboxOpenChangeReason) => void;\n /** Localized content rendered when filtering returns no items. */\n emptyMessage: ReactNode;\n loading?: boolean;\n /** Localized content announced while options are loading. */\n loadingMessage: ReactNode;\n /** Localized native-validation message for an empty required selection. */\n selectionRequiredMessage: string;\n openOnFocus?: boolean;\n size?: SelectSize;\n density?: SelectDensity;\n /** Logical listbox alignment against the input; automatically mirrors in RTL. */\n align?: \"start\" | \"end\";\n fieldClassName?: string;\n portalContainer?: HTMLElement;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction nextEnabled(\n items: readonly ComboboxItem[],\n current: number,\n direction: 1 | -1,\n): number {\n if (items.length === 0) return -1;\n for (let offset = 1; offset <= items.length; offset += 1) {\n const candidate = (current + direction * offset + items.length) % items.length;\n if (!items[candidate]?.disabled) return candidate;\n }\n return -1;\n}\n\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(\n function Combobox(\n {\n id,\n name,\n label,\n description,\n error,\n items,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n inputValue: inputValueProp,\n defaultInputValue,\n onInputValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n emptyMessage,\n loading = false,\n loadingMessage,\n selectionRequiredMessage,\n openOnFocus = true,\n size = comboboxRecipe.defaults.size,\n density = comboboxRecipe.defaults.density,\n align = \"start\",\n fieldClassName,\n portalContainer,\n className,\n layoutStyle,\n disabled = false,\n readOnly = false,\n required = false,\n autoComplete = \"off\",\n onFocus,\n onBlur,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) {\n validateOptions(items, \"Combobox\");\n const controlId = useControlId(id, \"combobox\");\n const listboxId = `${controlId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const suppressFocusOpenRef = useRef(false);\n const listboxRef = useRef<HTMLDivElement>(null);\n const [listboxNode, setListboxNode] = useState<HTMLDivElement | null>(null);\n const popupPosition = useAnchoredPopup(inputRef, listboxNode, {\n align,\n // comboboxRecipe.popover (= selectRecipe.popover), same correction as Select (2026-10-06).\n gap: comboboxRecipe.popover.sideOffset,\n viewportPadding: comboboxRecipe.popover.collisionPadding,\n matchAnchorWidth: true,\n zIndex: layer.dropdown,\n });\n const setListboxRef = useCallback((node: HTMLDivElement | null) => {\n listboxRef.current = node;\n setListboxNode(node);\n }, []);\n const [selectedValue, setSelectedValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const selectedItem = items.find((item) => item.value === selectedValue);\n if (selectedValue !== \"\" && (!selectedItem || selectedItem.disabled)) {\n throw new RangeError(\n `Combobox value must identify an enabled option: ${selectedValue}`,\n );\n }\n if (required && selectionRequiredMessage.trim().length === 0) {\n throw new TypeError(\"Combobox selectionRequiredMessage must not be empty\");\n }\n const [query, setQuery] = useControllableState({\n ...(inputValueProp === undefined ? {} : { value: inputValueProp }),\n defaultValue: defaultInputValue ?? selectedItem?.label ?? \"\",\n ...(onInputValueChange === undefined ? {} : { onChange: onInputValueChange }),\n });\n const [open, setOpenState] = useControllableState({\n ...(openProp === undefined ? {} : { value: openProp }),\n defaultValue: defaultOpen,\n });\n const [activeIndex, setActiveIndex] = useState(-1);\n useEffect(() => {\n inputRef.current?.setCustomValidity(\n required && selectedValue === \"\" ? selectionRequiredMessage : \"\",\n );\n }, [required, selectedValue, selectionRequiredMessage]);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const filteredItems = useMemo(\n () =>\n items.filter((item) => {\n if (normalizedQuery.length === 0) return true;\n const searchable = [item.label, ...(item.keywords ?? [])]\n .join(\" \")\n .toLocaleLowerCase();\n return searchable.includes(normalizedQuery);\n }),\n [items, normalizedQuery],\n );\n\n const setOpen = (next: boolean, reason: ComboboxOpenChangeReason) => {\n if (next === open) return;\n setOpenState(next);\n onOpenChange?.(next, reason);\n if (!next) setActiveIndex(-1);\n };\n const firstEnabled = () => filteredItems.findIndex((item) => !item.disabled);\n const lastEnabled = () => {\n for (let index = filteredItems.length - 1; index >= 0; index -= 1) {\n if (!filteredItems[index]?.disabled) return index;\n }\n return -1;\n };\n const selectItem = (item: ComboboxItem) => {\n if (item.disabled || disabled || readOnly || loading) return;\n setSelectedValue(item.value);\n setQuery(item.label);\n setOpen(false, \"selection\");\n queueMicrotask(() => {\n const input = inputRef.current;\n if (!input || document.activeElement === input) return;\n suppressFocusOpenRef.current = true;\n input.focus();\n queueMicrotask(() => {\n suppressFocusOpenRef.current = false;\n });\n });\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || readOnly || event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (\n loading &&\n [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\", \"Enter\"].includes(event.key)\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!open) {\n setOpen(true, \"keyboard\");\n setActiveIndex(\n event.key === \"ArrowDown\" ? firstEnabled() : lastEnabled(),\n );\n return;\n }\n setActiveIndex((current) =>\n nextEnabled(filteredItems, current, event.key === \"ArrowDown\" ? 1 : -1),\n );\n } else if (open && event.key === \"Home\") {\n event.preventDefault();\n setActiveIndex(firstEnabled());\n } else if (open && event.key === \"End\") {\n event.preventDefault();\n setActiveIndex(lastEnabled());\n } else if (open && event.key === \"Enter\" && activeIndex >= 0) {\n event.preventDefault();\n const item = filteredItems[activeIndex];\n if (item) selectItem(item);\n } else if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false, \"escape\");\n } else if (open && event.key === \"Tab\") {\n setOpen(false, \"blur\");\n }\n };\n const activeItem = activeIndex >= 0 ? filteredItems[activeIndex] : undefined;\n\n return (\n <Field\n controlId={controlId}\n label={label}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n className={classNames(\"hjm-combobox\", fieldClassName)}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n data-size={size}\n data-density={density}\n data-state={disabled ? \"disabled\" : open ? \"open\" : \"closed\"}\n >\n {(controlProps) => (\n <div\n ref={rootRef}\n className=\"hjm-combobox__anchor\"\n onBlur={(event) => {\n if (\n !event.currentTarget.contains(event.relatedTarget) &&\n !listboxRef.current?.contains(event.relatedTarget)\n ) setOpen(false, \"blur\");\n }}\n >\n <div className=\"hjm-field__control hjm-combobox__control\">\n <input\n {...props}\n {...controlProps}\n ref={composeRefs(forwardedRef, inputRef)}\n className={classNames(\"hjm-field__input hjm-combobox__input\", className)}\n value={query}\n readOnly={readOnly}\n role=\"combobox\"\n autoComplete={autoComplete}\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-expanded={open}\n aria-activedescendant={\n open && activeItem ? `${controlId}-option-${activeIndex}` : undefined\n }\n onFocus={(event) => {\n onFocus?.(event);\n if (\n !event.defaultPrevented &&\n !disabled && !readOnly && openOnFocus &&\n !suppressFocusOpenRef.current\n ) setOpen(true, \"focus\");\n }}\n onBlur={onBlur}\n onChange={(event) => {\n if (disabled || readOnly) return;\n setQuery(event.target.value);\n setSelectedValue(\"\");\n setOpen(true, \"input\");\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n />\n {loading ? <span className=\"hjm-combobox__spinner\" aria-hidden=\"true\" /> : null}\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n </div>\n {name ? <input type=\"hidden\" name={name} value={selectedValue} /> : null}\n {open ? (\n <AnchoredPortal\n anchorRef={inputRef}\n ssrFallback=\"inline\"\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <div\n ref={setListboxRef}\n id={listboxId}\n role=\"listbox\"\n className=\"hjm-combobox__listbox\"\n data-density={density}\n aria-label={typeof label === \"string\" ? label : undefined}\n aria-busy={loading || undefined}\n data-placement={popupPosition.placement}\n data-align={popupPosition.align}\n style={popupPosition.style}\n >\n {loading ? (\n <div className=\"hjm-combobox__message\" role=\"status\"><span className=\"hjm-visually-hidden\">{loadingMessage}</span></div>\n ) : filteredItems.length === 0 ? (\n <div className=\"hjm-combobox__message\">{emptyMessage}</div>\n ) : (\n filteredItems.map((item, index) => (\n <div\n key={item.value}\n id={`${controlId}-option-${index}`}\n role=\"option\"\n aria-selected={item.value === selectedValue}\n aria-disabled={item.disabled || undefined}\n className=\"hjm-combobox__option\"\n data-state={\n item.disabled\n ? \"disabled\"\n : index === activeIndex\n ? \"active\"\n : item.value === selectedValue\n ? \"selected\"\n : \"idle\"\n }\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!item.disabled) setActiveIndex(index);\n }}\n onClick={() => selectItem(item)}\n >\n {item.label}\n </div>\n ))\n )}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n )}\n </Field>\n );\n },\n);\n\nexport type FormSubmitHandler = (\n event: FormEvent<HTMLFormElement>,\n) => void | Promise<void>;\n\nexport type FormProps = Omit<FormHTMLAttributes<HTMLFormElement>, \"onSubmit\"> &\n Readonly<{\n onSubmit: FormSubmitHandler;\n busy?: boolean;\n formError?: ReactNode;\n actions?: ReactNode;\n density?: FormDensity;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n {\n onSubmit,\n busy = false,\n formError,\n actions,\n density = formRecipe.defaults.density,\n className,\n children,\n layoutStyle,\n ...props\n },\n ref,\n) {\n const [submitting, setSubmitting] = useState(false);\n const submittingRef = useRef(false);\n const effectiveBusy = busy || submitting;\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (effectiveBusy || submittingRef.current) return;\n let result: void | Promise<void>;\n try {\n result = onSubmit(event);\n } catch (error) {\n throw error;\n }\n if (result && typeof result.then === \"function\") {\n submittingRef.current = true;\n setSubmitting(true);\n void Promise.resolve(result)\n .catch(() => undefined)\n .finally(() => {\n submittingRef.current = false;\n setSubmitting(false);\n });\n }\n };\n\n return (\n <form\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-form\", className)}\n data-density={density}\n data-state={effectiveBusy ? \"busy\" : formError ? \"error\" : \"idle\"}\n aria-busy={effectiveBusy || undefined}\n onSubmit={handleSubmit}\n >\n <fieldset className=\"hjm-form__fieldset\" disabled={effectiveBusy}>\n <div className=\"hjm-form__fields\">{children}</div>\n {formError ? (\n <div className=\"hjm-form__error\" role=\"alert\">{formError}</div>\n ) : null}\n {actions ? <div className=\"hjm-form__actions\">{actions}</div> : null}\n </fieldset>\n </form>\n );\n});\n"]}
|
package/dist/affix.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
+
import { type AffixFill, type AffixLayer } from "@hjmds/design-contracts/components/affix";
|
|
2
3
|
import type { HjmCompositionStyleProp } from "./composition-style.js";
|
|
3
4
|
export type AffixProps = Readonly<{
|
|
4
5
|
children: ReactNode;
|
|
5
6
|
offset?: number;
|
|
6
7
|
disabled?: boolean;
|
|
7
8
|
onChange?: (affixed: boolean) => void;
|
|
9
|
+
/** Stacking step from the shared `layer` scale: `sticky` (default, 100) keeps the pinned box above scrolled content. */
|
|
10
|
+
layer?: AffixLayer;
|
|
11
|
+
/** `canvas` (default) paints the screen background behind the box; `none` leaves it to children with their own surface. */
|
|
12
|
+
fill?: AffixFill;
|
|
8
13
|
/** Canonical layout-only placement on the sticky box. `position`/`top` stay Affix-owned. */
|
|
9
14
|
layoutStyle?: HjmCompositionStyleProp;
|
|
10
15
|
}>;
|
|
11
16
|
/** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */
|
|
12
|
-
export declare function Affix({ children, offset, disabled, onChange, layoutStyle }: AffixProps): import("react").JSX.Element;
|
|
17
|
+
export declare function Affix({ children, offset, disabled, onChange, layer, fill, layoutStyle }: AffixProps): import("react").JSX.Element;
|
|
13
18
|
//# sourceMappingURL=affix.d.ts.map
|
package/dist/affix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affix.d.ts","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"affix.d.ts","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAA+D,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACxJ,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClI,wHAAwH;IACxH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2HAA2H;IAC3H,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAC;AAC3C,+GAA+G;AAC/G,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,MAA2B,EAAE,QAAgB,EAAE,QAAQ,EAAE,KAAkC,EAAE,IAAgC,EAAE,WAAW,EAAE,EAAE,UAAU,+BAmCzL"}
|
package/dist/affix.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import { affixRecipe, validateAffixOffset } from "@hjmds/design-contracts/components/affix";
|
|
4
|
+
import { affixRecipe, validateAffixOffset, validateAffixPresentation } from "@hjmds/design-contracts/components/affix";
|
|
4
5
|
/** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */
|
|
5
|
-
export function Affix({ children, offset = affixRecipe.offset, disabled = false, onChange, layoutStyle }) {
|
|
6
|
+
export function Affix({ children, offset = affixRecipe.offset, disabled = false, onChange, layer = affixRecipe.defaults.layer, fill = affixRecipe.defaults.fill, layoutStyle }) {
|
|
6
7
|
validateAffixOffset(offset);
|
|
8
|
+
validateAffixPresentation(layer, fill);
|
|
7
9
|
const marker = useRef(null);
|
|
8
10
|
const content = useRef(null);
|
|
9
11
|
const callback = useRef(onChange);
|
|
@@ -46,6 +48,6 @@ export function Affix({ children, offset = affixRecipe.offset, disabled = false,
|
|
|
46
48
|
window.addEventListener("resize", schedule);
|
|
47
49
|
return () => { cancelAnimationFrame(frame); resize.disconnect(); document.removeEventListener("scroll", schedule, true); window.removeEventListener("resize", schedule); };
|
|
48
50
|
}, [offset, disabled, oversize]);
|
|
49
|
-
return _jsxs(_Fragment, { children: [_jsx("span", { ref: marker, className: "hjm-affix__marker", "aria-hidden": "true" }), _jsx("div", { ref: content, "data-hjm-affix": true, "data-affixed": affixed, "data-oversize": oversize, className: "hjm-affix", style: { ...layoutStyle, position: disabled || oversize ? "relative" : affixRecipe.position, top: disabled || oversize ? undefined : offset }, children: children })] });
|
|
51
|
+
return _jsxs(_Fragment, { children: [_jsx("span", { ref: marker, className: "hjm-affix__marker", "aria-hidden": "true" }), _jsx("div", { ref: content, "data-hjm-affix": true, "data-affixed": affixed, "data-oversize": oversize, "data-layer": layer, "data-fill": fill, className: "hjm-affix", style: { ...layoutStyle, position: disabled || oversize ? "relative" : affixRecipe.position, top: disabled || oversize ? undefined : offset }, children: children })] });
|
|
50
52
|
}
|
|
51
53
|
//# sourceMappingURL=affix.js.map
|
package/dist/affix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affix.js","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"affix.js","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,yBAAyB,EAAmC,MAAM,0CAA0C,CAAC;AASxJ,+GAA+G;AAC/G,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAc;IACxL,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAsB,SAAS,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9D,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,SAAS,OAAO;YACd,KAAK,GAAG,CAAC,CAAC;YACV,IAAI,UAAU,GAAG,IAAK,CAAC,aAAa,CAAC;YACrC,OAAO,UAAU,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;gBAAE,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC;YACzI,MAAM,cAAc,GAAG,UAAU,EAAE,YAAY,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC;YACzF,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YACvG,MAAM,IAAI,GAAG,IAAK,CAAC,qBAAqB,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC;YACtD,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,qFAAqF;YACrF,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,IAAI,QAAS,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACrH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QACvF,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;YAAE,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa;YAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpG,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5G,OAAO,GAAG,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7K,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjC,OAAO,8BAAE,eAAM,GAAG,EAAE,MAAM,EAAE,SAAS,EAAC,mBAAmB,iBAAa,MAAM,GAAG,EAAA,cAAK,GAAG,EAAE,OAAO,0CAA+B,OAAO,mBAAiB,QAAQ,gBAAc,KAAK,eAAa,IAAI,EAAE,SAAS,EAAC,WAAW,EAAC,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,YAAG,QAAQ,GAAO,IAAG,CAAC;AAChY,CAAC","sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { affixRecipe, validateAffixOffset, validateAffixPresentation, type AffixFill, type AffixLayer } from \"@hjmds/design-contracts/components/affix\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type AffixProps = Readonly<{ children: ReactNode; offset?: number; disabled?: boolean; onChange?: (affixed: boolean) => void;\n /** Stacking step from the shared `layer` scale: `sticky` (default, 100) keeps the pinned box above scrolled content. */\n layer?: AffixLayer;\n /** `canvas` (default) paints the screen background behind the box; `none` leaves it to children with their own surface. */\n fill?: AffixFill;\n /** Canonical layout-only placement on the sticky box. `position`/`top` stay Affix-owned. */\n layoutStyle?: HjmCompositionStyleProp }>;\n/** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */\nexport function Affix({ children, offset = affixRecipe.offset, disabled = false, onChange, layer = affixRecipe.defaults.layer, fill = affixRecipe.defaults.fill, layoutStyle }: AffixProps) {\n validateAffixOffset(offset);\n validateAffixPresentation(layer, fill);\n const marker = useRef<HTMLSpanElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const callback = useRef(onChange); callback.current = onChange;\n const [affixed, setAffixed] = useState(false);\n const [oversize, setOversize] = useState(false);\n const reported = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const node = content.current; const sentinel = marker.current;\n if (!node || !sentinel) return;\n let frame = 0;\n function measure() {\n frame = 0;\n let scrollRoot = node!.parentElement;\n while (scrollRoot && !/(auto|scroll|hidden|overlay)/.test(getComputedStyle(scrollRoot).overflowY)) scrollRoot = scrollRoot.parentElement;\n const viewportHeight = scrollRoot?.clientHeight ?? document.documentElement.clientHeight;\n const edge = (scrollRoot ? scrollRoot.getBoundingClientRect().top + scrollRoot.clientTop : 0) + offset;\n const rect = node!.getBoundingClientRect();\n const tooTall = rect.height > viewportHeight - offset;\n setOversize(tooTall);\n // One CSS pixel tolerates subpixel scroll rounding, not a second positioning system.\n const next = !disabled && !tooTall && sentinel!.getBoundingClientRect().top < edge && Math.abs(rect.top - edge) <= 1;\n setAffixed(next);\n if (reported.current !== next) { reported.current = next; callback.current?.(next); }\n }\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n const resize = new ResizeObserver(schedule);\n resize.observe(node);\n for (let parent = node.parentElement; parent; parent = parent.parentElement) resize.observe(parent);\n measure(); document.addEventListener(\"scroll\", schedule, true); window.addEventListener(\"resize\", schedule);\n return () => { cancelAnimationFrame(frame); resize.disconnect(); document.removeEventListener(\"scroll\", schedule, true); window.removeEventListener(\"resize\", schedule); };\n }, [offset, disabled, oversize]);\n return <><span ref={marker} className=\"hjm-affix__marker\" aria-hidden=\"true\" /><div ref={content} data-hjm-affix data-affixed={affixed} data-oversize={oversize} data-layer={layer} data-fill={fill} className=\"hjm-affix\" style={{ ...layoutStyle, position: disabled || oversize ? \"relative\" : affixRecipe.position, top: disabled || oversize ? undefined : offset }}>{children}</div></>;\n}\n"]}
|
package/dist/agreement.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agreement.d.ts","sourceRoot":"","sources":["../src/agreement.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agreement.d.ts","sourceRoot":"","sources":["../src/agreement.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,8CAA8C,CAAC;AAGtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAChE,UAAU,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,iBAAiB,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IACpD,4EAA4E;IAC5E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IACpD,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;IAC5B,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAOH,eAAO,MAAM,SAAS,EAwHhB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAC/B,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,KAC5D,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC"}
|
package/dist/agreement.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { reconcileAgreementSelection, resolveAgreementState, toggleAgreementAll, toggleAgreementItem, validateAgreementDescriptor, } from "@hjmds/design-contracts/components/agreement";
|
|
3
4
|
import { forwardRef, useEffect, useId, useMemo, useRef } from "react";
|
package/dist/agreement.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agreement.js","sourceRoot":"","sources":["../src/agreement.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n reconcileAgreementSelection,\n resolveAgreementState,\n toggleAgreementAll,\n toggleAgreementItem,\n validateAgreementDescriptor,\n type AgreementDescriptor,\n type AgreementState,\n} from \"@hjmds/design-contracts/components/agreement\";\nimport { forwardRef, useEffect, useId, useMemo, useRef } from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type AgreementProps<Id extends string = string> = Readonly<{\n descriptor: AgreementDescriptor<Id>;\n checkedIds?: ReadonlySet<Id>;\n defaultCheckedIds?: ReadonlySet<Id>;\n onCheckedIdsChange?: (ids: ReadonlySet<Id>) => void;\n /** Fires the derived state on every change, for a submit button to read. */\n onStateChange?: (state: AgreementState<Id>) => void;\n /** Called when an item's full text is requested and it carries no href. */\n onDetail?: (id: Id) => void;\n /** Localized suffix marking a required row, supplied by the product. */\n requiredLabel: string;\n /** Localized suffix marking an optional row, supplied by the product. */\n optionalLabel: string;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n// Consent rows are multi-select, so they draw Checkbox's indicator; a 16px box with radius sm read as a radio dot.\nfunction Mark({ state }: { state: boolean | \"mixed\" }) {\n return <span aria-hidden=\"true\" className=\"hjm-choice__indicator\" data-kind=\"checkbox\" data-state={state === \"mixed\" ? \"mixed\" : state ? \"checked\" : \"unchecked\"} />;\n}\n\nexport const Agreement = forwardRef(function Agreement<Id extends string = string>(\n {\n descriptor,\n checkedIds: controlledChecked,\n defaultCheckedIds,\n onCheckedIdsChange,\n onStateChange,\n onDetail,\n requiredLabel,\n optionalLabel,\n className,\n layoutStyle,\n }: AgreementProps<Id>,\n forwardedRef: React.Ref<HTMLDivElement>,\n) {\n validateAgreementDescriptor(descriptor);\n const [rawChecked, setChecked] = useControllableState<ReadonlySet<Id>>({\n ...(controlledChecked === undefined ? {} : { value: controlledChecked }),\n defaultValue: defaultCheckedIds ?? new Set<Id>(),\n ...(onCheckedIdsChange === undefined ? {} : { onChange: onCheckedIdsChange }),\n });\n // An item that left the list must not keep an orphan consent behind it.\n const checked = useMemo(\n () => reconcileAgreementSelection(descriptor, rawChecked),\n [descriptor, rawChecked],\n );\n const state = resolveAgreementState(descriptor, checked);\n const id = `${useId().replaceAll(\":\", \"\")}-agreement`;\n\n // Persist removed consent IDs so reinserting a row cannot silently consent again.\n useEffect(() => {\n if (controlledChecked === undefined && checked !== rawChecked) setChecked(checked);\n }, [checked, controlledChecked, rawChecked, setChecked]);\n // Report accepted state, including external value/required-item changes. A rejected\n // controlled request must not enable the product's submit button optimistically.\n const reported = useRef<{ checked: ReadonlySet<Id>; state: AgreementState<Id> } | undefined>(undefined);\n useEffect(() => {\n const previous = reported.current;\n if (previous && previous.state.all === state.all && previous.state.satisfied === state.satisfied\n && previous.state.missingRequiredIds.length === state.missingRequiredIds.length\n && previous.state.missingRequiredIds.every((id, index) => id === state.missingRequiredIds[index])\n && previous.checked.size === checked.size && [...checked].every(id => previous.checked.has(id))) return;\n reported.current = { checked, state };\n onStateChange?.(state);\n });\n const commit = (next: ReadonlySet<Id>) => {\n if (descriptor.disabled) return;\n setChecked(next);\n };\n\n return (\n <div\n ref={forwardedRef}\n role=\"group\"\n aria-label={descriptor.accessibilityLabel}\n style={layoutStyle}\n className={classNames(\"hjm-agreement\", className)}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={state.all === \"mixed\" ? \"mixed\" : String(state.all === true) as \"true\" | \"false\"}\n // Keep an already focused consent control reachable while a request locks it.\n aria-disabled={descriptor.disabled || undefined}\n className=\"hjm-agreement__all\"\n onClick={() => commit(toggleAgreementAll(descriptor, checked))}\n >\n <Mark state={state.all} />\n <span>{descriptor.allLabel}</span>\n </button>\n <div className=\"hjm-agreement__list\">\n {descriptor.items.map((item) => {\n const itemChecked = checked.has(item.id);\n return (\n <div key={item.id} className=\"hjm-agreement__item\" data-disabled={item.disabled || undefined}>\n <button\n type=\"button\"\n role=\"checkbox\"\n id={`${id}-${item.id}`}\n aria-checked={itemChecked}\n aria-disabled={descriptor.disabled || item.disabled || undefined}\n aria-describedby={item.description ? `${id}-${item.id}-description` : undefined}\n className=\"hjm-agreement__toggle\"\n onClick={() => { if (!descriptor.disabled && !item.disabled) commit(toggleAgreementItem(descriptor, checked, item.id)); }}\n >\n <Mark state={itemChecked} />\n <span className=\"hjm-agreement__copy\">\n {/*\n Required/optional rides inside the control's own name: a\n visual-only marker would leave a screen reader unable to\n tell which rows block the submit button.\n */}\n <span>{item.label}</span>\n <span className=\"hjm-agreement__required\" data-required={item.required || undefined}>\n {item.required ? requiredLabel : optionalLabel}\n </span>\n </span>\n </button>\n {item.description ? (\n <p id={`${id}-${item.id}-description`} className=\"hjm-agreement__description\">{item.description}</p>\n ) : null}\n {/*\n A separate tab stop that never toggles consent — opening the\n text and agreeing to it are different acts.\n */}\n {item.detail ? (\n item.detail.href ? (\n <a className=\"hjm-agreement__detail\" href={item.detail.href}>{item.detail.label}</a>\n ) : (\n <button type=\"button\" className=\"hjm-agreement__detail\" onClick={() => onDetail?.(item.id)}>\n {item.detail.label}\n </button>\n )\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n}) as <Id extends string = string>(\n props: AgreementProps<Id> & { ref?: React.Ref<HTMLDivElement> },\n) => React.ReactElement | null;\n\n"]}
|
|
1
|
+
{"version":3,"file":"agreement.js","sourceRoot":"","sources":["../src/agreement.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,GAG5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAqBjE,mHAAmH;AACnH,SAAS,IAAI,CAAC,EAAE,KAAK,EAAgC;IACnD,OAAO,8BAAkB,MAAM,EAAC,SAAS,EAAC,uBAAuB,eAAW,UAAU,gBAAa,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAAI,CAAC;AACvK,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,SAAS,CACpD,EACE,UAAU,EACV,UAAU,EAAE,iBAAiB,EAC7B,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,aAAa,EACb,aAAa,EACb,SAAS,EACT,WAAW,GACQ,EACrB,YAAuC;IAEvC,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,oBAAoB,CAAkB;QACrE,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACxE,YAAY,EAAE,iBAAiB,IAAI,IAAI,GAAG,EAAM;QAChD,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;KAC9E,CAAC,CAAC;IACH,wEAAwE;IACxE,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,EACzD,CAAC,UAAU,EAAE,UAAU,CAAC,CACzB,CAAC;IACF,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC;IAEtD,kFAAkF;IAClF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,SAAS,IAAI,OAAO,KAAK,UAAU;YAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACrF,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACzD,oFAAoF;IACpF,iFAAiF;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAsE,SAAS,CAAC,CAAC;IACxG,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;QAClC,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;eAC3F,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,KAAK,KAAK,CAAC,kBAAkB,CAAC,MAAM;eAC5E,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;eAC9F,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO;QAC1G,QAAQ,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,IAAqB,EAAE,EAAE;QACvC,IAAI,UAAU,CAAC,QAAQ;YAAE,OAAO;QAChC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,CACL,eACE,GAAG,EAAE,YAAY,EACjB,IAAI,EAAC,OAAO,gBACA,UAAU,CAAC,kBAAkB,EACzC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,aAEjD,kBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,kBACD,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAqB,mBAE/E,UAAU,CAAC,QAAQ,IAAI,SAAS,EAC/C,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,aAE9D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAI,EAC1B,yBAAO,UAAU,CAAC,QAAQ,GAAQ,IAC3B,EACT,cAAK,SAAS,EAAC,qBAAqB,YACjC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACzC,OAAO,CACL,eAAmB,SAAS,EAAC,qBAAqB,mBAAgB,IAAI,CAAC,QAAQ,IAAI,SAAS,aAC1F,kBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,kBACR,WAAW,mBACV,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,sBAC9C,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,EAC/E,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;oCAAE,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAEzH,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,GAAI,EAC5B,gBAAM,SAAS,EAAC,qBAAqB,aAMnC,yBAAO,IAAI,CAAC,KAAK,GAAQ,EACzB,eAAM,SAAS,EAAC,yBAAyB,mBAAgB,IAAI,CAAC,QAAQ,IAAI,SAAS,YAChF,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,GACzC,IACF,IACA,EACR,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,YAAG,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,cAAc,EAAE,SAAS,EAAC,4BAA4B,YAAE,IAAI,CAAC,WAAW,GAAK,CACrG,CAAC,CAAC,CAAC,IAAI,EAKP,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,YAAG,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,YAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAK,CACrF,CAAC,CAAC,CAAC,CACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,uBAAuB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,YACvF,IAAI,CAAC,MAAM,CAAC,KAAK,GACX,CACV,CACF,CAAC,CAAC,CAAC,IAAI,KAvCA,IAAI,CAAC,EAAE,CAwCX,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC,CAE6B,CAAC","sourcesContent":["\"use client\";\n\nimport {\n reconcileAgreementSelection,\n resolveAgreementState,\n toggleAgreementAll,\n toggleAgreementItem,\n validateAgreementDescriptor,\n type AgreementDescriptor,\n type AgreementState,\n} from \"@hjmds/design-contracts/components/agreement\";\nimport { forwardRef, useEffect, useId, useMemo, useRef } from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type AgreementProps<Id extends string = string> = Readonly<{\n descriptor: AgreementDescriptor<Id>;\n checkedIds?: ReadonlySet<Id>;\n defaultCheckedIds?: ReadonlySet<Id>;\n onCheckedIdsChange?: (ids: ReadonlySet<Id>) => void;\n /** Fires the derived state on every change, for a submit button to read. */\n onStateChange?: (state: AgreementState<Id>) => void;\n /** Called when an item's full text is requested and it carries no href. */\n onDetail?: (id: Id) => void;\n /** Localized suffix marking a required row, supplied by the product. */\n requiredLabel: string;\n /** Localized suffix marking an optional row, supplied by the product. */\n optionalLabel: string;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n// Consent rows are multi-select, so they draw Checkbox's indicator; a 16px box with radius sm read as a radio dot.\nfunction Mark({ state }: { state: boolean | \"mixed\" }) {\n return <span aria-hidden=\"true\" className=\"hjm-choice__indicator\" data-kind=\"checkbox\" data-state={state === \"mixed\" ? \"mixed\" : state ? \"checked\" : \"unchecked\"} />;\n}\n\nexport const Agreement = forwardRef(function Agreement<Id extends string = string>(\n {\n descriptor,\n checkedIds: controlledChecked,\n defaultCheckedIds,\n onCheckedIdsChange,\n onStateChange,\n onDetail,\n requiredLabel,\n optionalLabel,\n className,\n layoutStyle,\n }: AgreementProps<Id>,\n forwardedRef: React.Ref<HTMLDivElement>,\n) {\n validateAgreementDescriptor(descriptor);\n const [rawChecked, setChecked] = useControllableState<ReadonlySet<Id>>({\n ...(controlledChecked === undefined ? {} : { value: controlledChecked }),\n defaultValue: defaultCheckedIds ?? new Set<Id>(),\n ...(onCheckedIdsChange === undefined ? {} : { onChange: onCheckedIdsChange }),\n });\n // An item that left the list must not keep an orphan consent behind it.\n const checked = useMemo(\n () => reconcileAgreementSelection(descriptor, rawChecked),\n [descriptor, rawChecked],\n );\n const state = resolveAgreementState(descriptor, checked);\n const id = `${useId().replaceAll(\":\", \"\")}-agreement`;\n\n // Persist removed consent IDs so reinserting a row cannot silently consent again.\n useEffect(() => {\n if (controlledChecked === undefined && checked !== rawChecked) setChecked(checked);\n }, [checked, controlledChecked, rawChecked, setChecked]);\n // Report accepted state, including external value/required-item changes. A rejected\n // controlled request must not enable the product's submit button optimistically.\n const reported = useRef<{ checked: ReadonlySet<Id>; state: AgreementState<Id> } | undefined>(undefined);\n useEffect(() => {\n const previous = reported.current;\n if (previous && previous.state.all === state.all && previous.state.satisfied === state.satisfied\n && previous.state.missingRequiredIds.length === state.missingRequiredIds.length\n && previous.state.missingRequiredIds.every((id, index) => id === state.missingRequiredIds[index])\n && previous.checked.size === checked.size && [...checked].every(id => previous.checked.has(id))) return;\n reported.current = { checked, state };\n onStateChange?.(state);\n });\n const commit = (next: ReadonlySet<Id>) => {\n if (descriptor.disabled) return;\n setChecked(next);\n };\n\n return (\n <div\n ref={forwardedRef}\n role=\"group\"\n aria-label={descriptor.accessibilityLabel}\n style={layoutStyle}\n className={classNames(\"hjm-agreement\", className)}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={state.all === \"mixed\" ? \"mixed\" : String(state.all === true) as \"true\" | \"false\"}\n // Keep an already focused consent control reachable while a request locks it.\n aria-disabled={descriptor.disabled || undefined}\n className=\"hjm-agreement__all\"\n onClick={() => commit(toggleAgreementAll(descriptor, checked))}\n >\n <Mark state={state.all} />\n <span>{descriptor.allLabel}</span>\n </button>\n <div className=\"hjm-agreement__list\">\n {descriptor.items.map((item) => {\n const itemChecked = checked.has(item.id);\n return (\n <div key={item.id} className=\"hjm-agreement__item\" data-disabled={item.disabled || undefined}>\n <button\n type=\"button\"\n role=\"checkbox\"\n id={`${id}-${item.id}`}\n aria-checked={itemChecked}\n aria-disabled={descriptor.disabled || item.disabled || undefined}\n aria-describedby={item.description ? `${id}-${item.id}-description` : undefined}\n className=\"hjm-agreement__toggle\"\n onClick={() => { if (!descriptor.disabled && !item.disabled) commit(toggleAgreementItem(descriptor, checked, item.id)); }}\n >\n <Mark state={itemChecked} />\n <span className=\"hjm-agreement__copy\">\n {/*\n Required/optional rides inside the control's own name: a\n visual-only marker would leave a screen reader unable to\n tell which rows block the submit button.\n */}\n <span>{item.label}</span>\n <span className=\"hjm-agreement__required\" data-required={item.required || undefined}>\n {item.required ? requiredLabel : optionalLabel}\n </span>\n </span>\n </button>\n {item.description ? (\n <p id={`${id}-${item.id}-description`} className=\"hjm-agreement__description\">{item.description}</p>\n ) : null}\n {/*\n A separate tab stop that never toggles consent — opening the\n text and agreeing to it are different acts.\n */}\n {item.detail ? (\n item.detail.href ? (\n <a className=\"hjm-agreement__detail\" href={item.detail.href}>{item.detail.label}</a>\n ) : (\n <button type=\"button\" className=\"hjm-agreement__detail\" onClick={() => onDetail?.(item.id)}>\n {item.detail.label}\n </button>\n )\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n}) as <Id extends string = string>(\n props: AgreementProps<Id> & { ref?: React.Ref<HTMLDivElement> },\n) => React.ReactElement | null;\n\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReactElement, type ReactNode } from "react";
|
|
2
|
+
import { type AlertDialogRequest, type AlertDialogResult } from "@hjmds/design-contracts/components/alert-dialog";
|
|
3
|
+
import type { DialogSize } from "@hjmds/design-contracts/recipes";
|
|
4
|
+
/** Per-request presentation; copy and actions stay in the request. */
|
|
5
|
+
export type AlertDialogQueueOptions = Readonly<{
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
size?: DialogSize;
|
|
8
|
+
}>;
|
|
9
|
+
export type AlertDialogQueueApi = Readonly<{
|
|
10
|
+
/** Shows the request after those already waiting; resolves once its dialog closed with that outcome. */
|
|
11
|
+
open(request: AlertDialogRequest, options?: AlertDialogQueueOptions): Promise<AlertDialogResult>;
|
|
12
|
+
}>;
|
|
13
|
+
/** `open` is bound to the provider scope this component rendered under; after that scope changes it settles `interrupted`. */
|
|
14
|
+
export declare function useAlertDialogQueue(): AlertDialogQueueApi;
|
|
15
|
+
export type AlertDialogQueueProviderProps = Readonly<{
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
/** The owner of queued questions, usually the route. When it changes, other scopes' requests settle `interrupted`. */
|
|
18
|
+
scope?: string;
|
|
19
|
+
/** Modal priority of the queued dialogs (default 0). A higher-priority gate stays above and interactive. */
|
|
20
|
+
modalPriority?: number;
|
|
21
|
+
portalContainer?: HTMLElement;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function AlertDialogQueueProvider({ children, scope, modalPriority, portalContainer }: AlertDialogQueueProviderProps): ReactElement;
|
|
24
|
+
//# sourceMappingURL=alert-dialog-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-dialog-queue.d.ts","sourceRoot":"","sources":["../src/alert-dialog-queue.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAWlE,sEAAsE;AACtE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAExF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,wGAAwG;IACxG,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClG,CAAC,CAAC;AASH,8HAA8H;AAC9H,wBAAgB,mBAAmB,IAAI,mBAAmB,CAKzD;AAGD,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,QAAQ,EAAE,SAAS,CAAC;IACpB,sHAAsH;IACtH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4GAA4G;IAC5G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;CAC/B,CAAC,CAAC;AAOH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,6BAA6B,GAAG,YAAY,CAuCzI"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
|
|
4
|
+
import { createAlertDialogQueue, } from "@hjmds/design-contracts/components/alert-dialog";
|
|
5
|
+
import { AlertDialog } from "./overlays.js";
|
|
6
|
+
const AlertDialogQueueContext = createContext(null);
|
|
7
|
+
/** `open` is bound to the provider scope this component rendered under; after that scope changes it settles `interrupted`. */
|
|
8
|
+
export function useAlertDialogQueue() {
|
|
9
|
+
const context = useContext(AlertDialogQueueContext);
|
|
10
|
+
if (context === null)
|
|
11
|
+
throw new Error("useAlertDialogQueue must be used inside AlertDialogQueueProvider");
|
|
12
|
+
const { open, scope } = context;
|
|
13
|
+
return useMemo(() => ({ open: (request, options = {}) => open(request, options, scope) }), [open, scope]);
|
|
14
|
+
}
|
|
15
|
+
function resultOf(reason) {
|
|
16
|
+
if (reason === "confirm")
|
|
17
|
+
return { outcome: "confirmed" };
|
|
18
|
+
return { outcome: "cancelled", reason: reason === "trigger" ? "programmatic" : reason };
|
|
19
|
+
}
|
|
20
|
+
export function AlertDialogQueueProvider({ children, scope, modalPriority, portalContainer }) {
|
|
21
|
+
const [queue] = useState(() => createAlertDialogQueue());
|
|
22
|
+
const entries = useSyncExternalStore(queue.subscribe, queue.getSnapshot, queue.getSnapshot);
|
|
23
|
+
// The element focused when a run of questions began: every dialog of the run returns there, so the second dialog
|
|
24
|
+
// does not return focus to the first one's removed button.
|
|
25
|
+
const returnFocusRef = useRef(null);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
queue.setActive(true);
|
|
28
|
+
return () => queue.setActive(false);
|
|
29
|
+
}, [queue]);
|
|
30
|
+
useEffect(() => { queue.retainScope(scope); }, [queue, scope, entries]);
|
|
31
|
+
const open = useMemo(() => (request, options, requestScope) => {
|
|
32
|
+
if (queue.getSnapshot().length === 0) {
|
|
33
|
+
returnFocusRef.current = document.activeElement instanceof HTMLElement && document.activeElement !== document.body
|
|
34
|
+
? document.activeElement : null;
|
|
35
|
+
}
|
|
36
|
+
return queue.enqueue(request, options, requestScope);
|
|
37
|
+
}, [queue]);
|
|
38
|
+
const context = useMemo(() => ({ open, scope }), [open, scope]);
|
|
39
|
+
const head = entries[0];
|
|
40
|
+
const visible = head !== undefined && head.scope === scope ? head : undefined;
|
|
41
|
+
return (_jsxs(AlertDialogQueueContext.Provider, { value: context, children: [children, visible ? (_jsx(AlertDialog, { open: true, request: visible.request, returnFocusRef: returnFocusRef, ...(visible.options.icon === undefined ? {} : { icon: visible.options.icon }), ...(visible.options.size === undefined ? {} : { size: visible.options.size }), ...(modalPriority === undefined ? {} : { modalPriority }), ...(portalContainer === undefined ? {} : { portalContainer }), onOpenChange: (next, { reason }) => { if (!next)
|
|
42
|
+
queue.settle(visible.id, resultOf(reason)); } }, visible.id)) : null] }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=alert-dialog-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-dialog-queue.js","sourceRoot":"","sources":["../src/alert-dialog-queue.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n createAlertDialogQueue,\n type AlertDialogOpenChangeReason,\n type AlertDialogRequest,\n type AlertDialogResult,\n} from \"@hjmds/design-contracts/components/alert-dialog\";\nimport type { DialogSize } from \"@hjmds/design-contracts/recipes\";\nimport { AlertDialog } from \"./overlays.js\";\n\n/*\n Imperative AlertDialog with results. BurnTok's web AppDialog (321 lines) rebuilt this around AlertDialog: a result\n Promise, FIFO order, route-scoped cancellation and focus return (2026-10-23). The AlertDialog session still owns\n confirm/busy/error (an async `request.onConfirm` keeps the dialog open and busy, and open with the error when it\n fails); the contracts queue owns order and settles each promise once. Unlike OverlayStackProvider (one Dialog or\n Sheet, a second open throws), requests here wait their turn: a confirmation asked while another is open is normal.\n*/\n\n/** Per-request presentation; copy and actions stay in the request. */\nexport type AlertDialogQueueOptions = Readonly<{ icon?: ReactNode; size?: DialogSize }>;\n\nexport type AlertDialogQueueApi = Readonly<{\n /** Shows the request after those already waiting; resolves once its dialog closed with that outcome. */\n open(request: AlertDialogRequest, options?: AlertDialogQueueOptions): Promise<AlertDialogResult>;\n}>;\n\ntype QueueContext = Readonly<{\n open(request: AlertDialogRequest, options: AlertDialogQueueOptions, scope: string | undefined): Promise<AlertDialogResult>;\n scope: string | undefined;\n}>;\n\nconst AlertDialogQueueContext = createContext<QueueContext | null>(null);\n\n/** `open` is bound to the provider scope this component rendered under; after that scope changes it settles `interrupted`. */\nexport function useAlertDialogQueue(): AlertDialogQueueApi {\n const context = useContext(AlertDialogQueueContext);\n if (context === null) throw new Error(\"useAlertDialogQueue must be used inside AlertDialogQueueProvider\");\n const { open, scope } = context;\n return useMemo(() => ({ open: (request, options = {}) => open(request, options, scope) }), [open, scope]);\n}\n\n// No `layoutStyle`: a context provider with no box of its own.\nexport type AlertDialogQueueProviderProps = Readonly<{\n children: ReactNode;\n /** The owner of queued questions, usually the route. When it changes, other scopes' requests settle `interrupted`. */\n scope?: string;\n /** Modal priority of the queued dialogs (default 0). A higher-priority gate stays above and interactive. */\n modalPriority?: number;\n portalContainer?: HTMLElement;\n}>;\n\nfunction resultOf(reason: AlertDialogOpenChangeReason): AlertDialogResult {\n if (reason === \"confirm\") return { outcome: \"confirmed\" };\n return { outcome: \"cancelled\", reason: reason === \"trigger\" ? \"programmatic\" : reason };\n}\n\nexport function AlertDialogQueueProvider({ children, scope, modalPriority, portalContainer }: AlertDialogQueueProviderProps): ReactElement {\n const [queue] = useState(() => createAlertDialogQueue<AlertDialogQueueOptions>());\n const entries = useSyncExternalStore(queue.subscribe, queue.getSnapshot, queue.getSnapshot);\n // The element focused when a run of questions began: every dialog of the run returns there, so the second dialog\n // does not return focus to the first one's removed button.\n const returnFocusRef = useRef<HTMLElement | null>(null);\n useEffect(() => {\n queue.setActive(true);\n return () => queue.setActive(false);\n }, [queue]);\n useEffect(() => { queue.retainScope(scope); }, [queue, scope, entries]);\n const open = useMemo<QueueContext[\"open\"]>(() => (request, options, requestScope) => {\n if (queue.getSnapshot().length === 0) {\n returnFocusRef.current = document.activeElement instanceof HTMLElement && document.activeElement !== document.body\n ? document.activeElement : null;\n }\n return queue.enqueue(request, options, requestScope);\n }, [queue]);\n const context = useMemo<QueueContext>(() => ({ open, scope }), [open, scope]);\n const head = entries[0];\n const visible = head !== undefined && head.scope === scope ? head : undefined;\n return (\n <AlertDialogQueueContext.Provider value={context}>\n {children}\n {visible ? (\n <AlertDialog\n key={visible.id}\n open\n request={visible.request}\n returnFocusRef={returnFocusRef}\n {...(visible.options.icon === undefined ? {} : { icon: visible.options.icon })}\n {...(visible.options.size === undefined ? {} : { size: visible.options.size })}\n {...(modalPriority === undefined ? {} : { modalPriority })}\n {...(portalContainer === undefined ? {} : { portalContainer })}\n onOpenChange={(next, { reason }) => { if (!next) queue.settle(visible.id, resultOf(reason)); }}\n />\n ) : null}\n </AlertDialogQueueContext.Provider>\n );\n}\n"]}
|
package/dist/anchor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../src/anchor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../src/anchor.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtH,OAAO,EAAwD,KAAK,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAGlI,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;IAChD,2EAA2E;IAC3E,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACxE,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,sFAAsF;AACtF,eAAO,MAAM,MAAM;WAdV,MAAM;WACN,SAAS,UAAU,EAAE;oBACZ,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;IAC/C,2EAA2E;gBAC/D,WAAW,GAAG,IAAI;aACrB,MAAM;kBACD,UAAU,GAAG,YAAY;kBACzB,MAAM,GAAG,SAAS,GAAG,MAAM;iBAC5B,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI;IACvE,gGAAgG;kBAClF,uBAAuB;gDA2ErC,CAAC"}
|
package/dist/anchor.js
CHANGED
package/dist/anchor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor.js","sourceRoot":"","sources":["../src/anchor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useEffect, useRef, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\nimport { anchorRecipe, getAnchorCurrentId, resolveAnchorItems, type AnchorItem } from \"@hjmds/design-contracts/components/anchor\";\nimport { classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type AnchorProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & Readonly<{\n label: string;\n items: readonly AnchorItem[];\n renderLeading?: (item: AnchorItem) => ReactNode;\n /** undefined observes the document; null waits for a custom scroll ref. */\n container?: HTMLElement | null;\n offset?: number;\n orientation?: \"vertical\" | \"horizontal\";\n historyMode?: \"push\" | \"replace\" | \"none\";\n onNavigate?: (id: string, event: MouseEvent<HTMLAnchorElement>) => void;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Same-document table of contents; sticky positioning belongs to its host layout. */\nexport const Anchor = forwardRef<HTMLElement, AnchorProps>(function Anchor({ label, items, container, offset = 0,\n orientation = \"vertical\", historyMode = \"push\", onNavigate, renderLeading, className, layoutStyle, ...props }, ref) {\n const resolved = resolveAnchorItems(items);\n if (!label.trim()) throw new TypeError(\"Anchor label must not be empty\");\n getAnchorCurrentId([], offset);\n const theme = useOptionalHjmTheme();\n const [current, setCurrent] = useState<string>();\n const restoredTargets = useRef(new Map<HTMLElement, () => void>());\n const idsKey = JSON.stringify(resolved.map(({ id }) => id));\n const findTarget = (id: string) => {\n const target = document.getElementById(id);\n return target && (container === undefined || container?.contains(target)) ? target : null;\n };\n function scrollToTarget(target: HTMLElement, behavior: ScrollBehavior) {\n const top = container === undefined ? window.scrollY + target.getBoundingClientRect().top - offset\n : container === null ? 0 : container.scrollTop + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop - offset;\n if (container === undefined) window.scrollTo({ top, behavior });\n else container?.scrollTo({ top, behavior });\n }\n function focusTarget(target: HTMLElement) {\n if (!target.hasAttribute(\"tabindex\")) {\n // Headings/sections are often not focusable. Restore our temporary attribute\n // on blur/unmount so navigation does not permanently change product markup.\n restoredTargets.current.get(target)?.();\n target.setAttribute(\"tabindex\", \"-1\");\n const restore = () => { if (target.getAttribute(\"tabindex\") === \"-1\") target.removeAttribute(\"tabindex\"); target.removeEventListener(\"blur\", restore); restoredTargets.current.delete(target); };\n restoredTargets.current.set(target, restore); target.addEventListener(\"blur\", restore, { once: true });\n }\n target.focus({ preventScroll: true });\n }\n useEffect(() => () => { for (const restore of [...restoredTargets.current.values()]) restore(); }, []);\n useEffect(() => {\n if (container === null) return;\n const source = container ?? window;\n const content = container ?? document.body;\n let frame = 0;\n const update = () => {\n frame = 0;\n const top = container ? container.getBoundingClientRect().top + container.clientTop : 0;\n const scroll = container ?? document.scrollingElement;\n // One CSS pixel covers scroll-height rounding without prematurely selecting a short final section.\n const atEnd = !!scroll && scroll.scrollHeight > scroll.clientHeight && scroll.scrollTop + scroll.clientHeight >= scroll.scrollHeight - 1;\n const positions = resolved.flatMap(({ id }) => { const node = findTarget(id); return node ? [{ id, top: node.getBoundingClientRect().top - top }] : []; });\n setCurrent(getAnchorCurrentId(positions, offset, atEnd));\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(update); };\n const resize = new ResizeObserver(schedule);\n const observe = () => { resize.disconnect(); resize.observe(content); for (const item of resolved) { const node = findTarget(item.id); if (node) { resize.observe(node); if (node.parentElement) resize.observe(node.parentElement); } } };\n const mutation = new MutationObserver(() => { observe(); schedule(); });\n mutation.observe(content, { childList: true, subtree: true, characterData: true });\n const restoreHash = () => {\n let id: string; try { id = decodeURIComponent(window.location.hash.slice(1)); } catch { return; }\n if (!resolved.some((item) => item.id === id)) return;\n const target = findTarget(id); if (target) scrollToTarget(target, \"instant\"); schedule();\n };\n observe(); update(); restoreHash(); source.addEventListener(\"scroll\", schedule, { passive: true });\n window.addEventListener(\"resize\", schedule); window.addEventListener(\"hashchange\", restoreHash); window.addEventListener(\"popstate\", restoreHash);\n return () => { cancelAnimationFrame(frame); resize.disconnect(); mutation.disconnect(); source.removeEventListener(\"scroll\", schedule); window.removeEventListener(\"resize\", schedule); window.removeEventListener(\"hashchange\", restoreHash); window.removeEventListener(\"popstate\", restoreHash); };\n }, [idsKey, container, offset]);\n return <nav {...props} style={{ ...props.style, ...layoutStyle }} ref={ref} aria-label={label} className={classNames(\"hjm-anchor\", className)} data-orientation={orientation}>\n <ul className=\"hjm-anchor__list\">{resolved.map((item) => <li key={item.id}><a href={item.href} className=\"hjm-anchor__link\" aria-current={current === item.id ? \"location\" : undefined}\n onClick={(event) => {\n onNavigate?.(item.id, event);\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n const target = findTarget(item.id); if (!target) return;\n event.preventDefault();\n const reduced = theme?.environment.reducedMotion ?? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n scrollToTarget(target, reduced ? \"instant\" : \"smooth\"); focusTarget(target);\n if (historyMode !== \"none\" && window.location.hash !== item.href) window.history[historyMode === \"replace\" ? \"replaceState\" : \"pushState\"](window.history.state, \"\", item.href);\n }}>{renderLeading ? <span className=\"hjm-anchor__leading\" aria-hidden=\"true\" style={{ inlineSize: anchorRecipe.link.leadingSize, blockSize: anchorRecipe.link.leadingSize }}>{renderLeading(item)}</span> : null}<span>{item.label}</span></a></li>)}</ul>\n </nav>;\n});\n"]}
|
|
1
|
+
{"version":3,"file":"anchor.js","sourceRoot":"","sources":["../src/anchor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { forwardRef, useEffect, useRef, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\nimport { anchorRecipe, getAnchorCurrentId, resolveAnchorItems, type AnchorItem } from \"@hjmds/design-contracts/components/anchor\";\nimport { classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type AnchorProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & Readonly<{\n label: string;\n items: readonly AnchorItem[];\n renderLeading?: (item: AnchorItem) => ReactNode;\n /** undefined observes the document; null waits for a custom scroll ref. */\n container?: HTMLElement | null;\n offset?: number;\n orientation?: \"vertical\" | \"horizontal\";\n historyMode?: \"push\" | \"replace\" | \"none\";\n onNavigate?: (id: string, event: MouseEvent<HTMLAnchorElement>) => void;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Same-document table of contents; sticky positioning belongs to its host layout. */\nexport const Anchor = forwardRef<HTMLElement, AnchorProps>(function Anchor({ label, items, container, offset = 0,\n orientation = \"vertical\", historyMode = \"push\", onNavigate, renderLeading, className, layoutStyle, ...props }, ref) {\n const resolved = resolveAnchorItems(items);\n if (!label.trim()) throw new TypeError(\"Anchor label must not be empty\");\n getAnchorCurrentId([], offset);\n const theme = useOptionalHjmTheme();\n const [current, setCurrent] = useState<string>();\n const restoredTargets = useRef(new Map<HTMLElement, () => void>());\n const idsKey = JSON.stringify(resolved.map(({ id }) => id));\n const findTarget = (id: string) => {\n const target = document.getElementById(id);\n return target && (container === undefined || container?.contains(target)) ? target : null;\n };\n function scrollToTarget(target: HTMLElement, behavior: ScrollBehavior) {\n const top = container === undefined ? window.scrollY + target.getBoundingClientRect().top - offset\n : container === null ? 0 : container.scrollTop + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop - offset;\n if (container === undefined) window.scrollTo({ top, behavior });\n else container?.scrollTo({ top, behavior });\n }\n function focusTarget(target: HTMLElement) {\n if (!target.hasAttribute(\"tabindex\")) {\n // Headings/sections are often not focusable. Restore our temporary attribute\n // on blur/unmount so navigation does not permanently change product markup.\n restoredTargets.current.get(target)?.();\n target.setAttribute(\"tabindex\", \"-1\");\n const restore = () => { if (target.getAttribute(\"tabindex\") === \"-1\") target.removeAttribute(\"tabindex\"); target.removeEventListener(\"blur\", restore); restoredTargets.current.delete(target); };\n restoredTargets.current.set(target, restore); target.addEventListener(\"blur\", restore, { once: true });\n }\n target.focus({ preventScroll: true });\n }\n useEffect(() => () => { for (const restore of [...restoredTargets.current.values()]) restore(); }, []);\n useEffect(() => {\n if (container === null) return;\n const source = container ?? window;\n const content = container ?? document.body;\n let frame = 0;\n const update = () => {\n frame = 0;\n const top = container ? container.getBoundingClientRect().top + container.clientTop : 0;\n const scroll = container ?? document.scrollingElement;\n // One CSS pixel covers scroll-height rounding without prematurely selecting a short final section.\n const atEnd = !!scroll && scroll.scrollHeight > scroll.clientHeight && scroll.scrollTop + scroll.clientHeight >= scroll.scrollHeight - 1;\n const positions = resolved.flatMap(({ id }) => { const node = findTarget(id); return node ? [{ id, top: node.getBoundingClientRect().top - top }] : []; });\n setCurrent(getAnchorCurrentId(positions, offset, atEnd));\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(update); };\n const resize = new ResizeObserver(schedule);\n const observe = () => { resize.disconnect(); resize.observe(content); for (const item of resolved) { const node = findTarget(item.id); if (node) { resize.observe(node); if (node.parentElement) resize.observe(node.parentElement); } } };\n const mutation = new MutationObserver(() => { observe(); schedule(); });\n mutation.observe(content, { childList: true, subtree: true, characterData: true });\n const restoreHash = () => {\n let id: string; try { id = decodeURIComponent(window.location.hash.slice(1)); } catch { return; }\n if (!resolved.some((item) => item.id === id)) return;\n const target = findTarget(id); if (target) scrollToTarget(target, \"instant\"); schedule();\n };\n observe(); update(); restoreHash(); source.addEventListener(\"scroll\", schedule, { passive: true });\n window.addEventListener(\"resize\", schedule); window.addEventListener(\"hashchange\", restoreHash); window.addEventListener(\"popstate\", restoreHash);\n return () => { cancelAnimationFrame(frame); resize.disconnect(); mutation.disconnect(); source.removeEventListener(\"scroll\", schedule); window.removeEventListener(\"resize\", schedule); window.removeEventListener(\"hashchange\", restoreHash); window.removeEventListener(\"popstate\", restoreHash); };\n }, [idsKey, container, offset]);\n return <nav {...props} style={{ ...props.style, ...layoutStyle }} ref={ref} aria-label={label} className={classNames(\"hjm-anchor\", className)} data-orientation={orientation}>\n <ul className=\"hjm-anchor__list\">{resolved.map((item) => <li key={item.id}><a href={item.href} className=\"hjm-anchor__link\" aria-current={current === item.id ? \"location\" : undefined}\n onClick={(event) => {\n onNavigate?.(item.id, event);\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n const target = findTarget(item.id); if (!target) return;\n event.preventDefault();\n const reduced = theme?.environment.reducedMotion ?? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n scrollToTarget(target, reduced ? \"instant\" : \"smooth\"); focusTarget(target);\n if (historyMode !== \"none\" && window.location.hash !== item.href) window.history[historyMode === \"replace\" ? \"replaceState\" : \"pushState\"](window.history.state, \"\", item.href);\n }}>{renderLeading ? <span className=\"hjm-anchor__leading\" aria-hidden=\"true\" style={{ inlineSize: anchorRecipe.link.leadingSize, blockSize: anchorRecipe.link.leadingSize }}>{renderLeading(item)}</span> : null}<span>{item.label}</span></a></li>)}</ul>\n </nav>;\n});\n"]}
|
package/dist/asset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../src/asset.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../src/asset.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,UAAU,EAAE,eAAe,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,KAAK,SAAS,CAAC,CAAC;IAC7E,mEAAmE;IACnE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,eAAO,MAAM,KAAK;gBAdJ,eAAe;IAC3B;;;;OAIG;cACO,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,KAAK,SAAS,CAAC;IAC5E,mEAAmE;gBACvD,SAAS;gBACT,MAAM;IAClB,gGAAgG;kBAClF,uBAAuB;mDAuCrC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAgC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,eAAe,+BAYxH"}
|
package/dist/asset.js
CHANGED
package/dist/asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport {\n assetRecipe,\n shouldAnimateAsset,\n validateAssetDescriptor,\n type AssetDescriptor,\n} from \"@hjmds/design-contracts/components/asset\";\nimport { forwardRef, type CSSProperties, type ReactNode } from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type AssetProps = Readonly<{\n descriptor: AssetDescriptor;\n /**\n * The media itself. A player is the product's dependency, never this\n * package's — the frame is all the contract owns. `animate` is the\n * already-resolved answer to \"may this move right now\".\n */\n children: ReactNode | ((state: Readonly<{ animate: boolean }>) => ReactNode);\n /** A small mark on the frame's outer corner (play, status dot). */\n accessory?: 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 Asset = forwardRef<HTMLDivElement, AssetProps>(function Asset(\n { descriptor, children, accessory, className, layoutStyle },\n forwardedRef,\n) {\n validateAssetDescriptor(descriptor);\n const theme = useOptionalHjmTheme();\n const size = assetRecipe.sizes[descriptor.size ?? assetRecipe.defaults.size];\n const shapeKey = descriptor.shape ?? assetRecipe.defaults.shape;\n // Rounded is a theme radius role; explicit square/circle are media geometry.\n // Keeping the recipe's numeric radius would bypass nested product profiles.\n const shape = shapeKey === \"rounded\" ? theme?.designProfile?.tokens.radius.md ?? assetRecipe.shapes.rounded : assetRecipe.shapes[shapeKey];\n const decorative = descriptor.decorative ?? false;\n // The frame reports whether motion is allowed so the product's player can\n // read one answer instead of re-deriving the preference per surface.\n const animate = shouldAnimateAsset(descriptor.kind, theme?.environment.reducedMotion ?? false);\n return (\n <div\n ref={forwardedRef}\n className={classNames(\"hjm-asset\", className)}\n data-kind={descriptor.kind}\n data-animate={animate || undefined}\n role={decorative ? \"presentation\" : \"img\"}\n aria-hidden={decorative || undefined}\n aria-label={decorative ? undefined : descriptor.accessibilityLabel}\n style={{ ...layoutStyle,\n \"--hjm-asset-size\": `${size}px`,\n \"--hjm-asset-radius\": `${shape}px`,\n \"--hjm-asset-accessory-offset\": `${assetRecipe.accessory.offset}px`,\n } as CSSProperties}\n >\n <div className=\"hjm-asset__frame\">\n <div className=\"hjm-asset__media\">{typeof children === \"function\" ? children({ animate }) : children}</div>\n </div>\n {accessory ? <span className=\"hjm-asset__accessory\">{accessory}</span> : null}\n </div>\n );\n});\n\nexport type AssetGroupProps = Readonly<{\n /** Accessible name for the group; the overlap alone does not say what it is. */\n label: string;\n size?: AssetDescriptor[\"size\"];\n children: ReactNode;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Overlaps assets with the same ratio Avatar uses — they share a row on purpose. */\nexport function AssetGroup({ label, size = assetRecipe.defaults.size, children, className, layoutStyle }: AssetGroupProps) {\n const pixels = assetRecipe.sizes[size];\n return (\n <div\n className={classNames(\"hjm-asset-group\", className)}\n role=\"group\"\n aria-label={label}\n style={{ ...layoutStyle, \"--hjm-asset-overlap\": `${-Math.round(pixels * assetRecipe.overlapRatio)}px` } as CSSProperties}\n >\n {children}\n </div>\n );\n}\n"]}
|