@hjmds/react 1.12.0 → 1.13.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/dist/actions.d.ts +4 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +4 -1
- package/dist/actions.js.map +1 -1
- package/dist/activity-heatmap.d.ts +4 -1
- package/dist/activity-heatmap.d.ts.map +1 -1
- package/dist/activity-heatmap.js +1 -1
- package/dist/activity-heatmap.js.map +1 -1
- package/dist/advanced-display.d.ts +31 -3
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +26 -27
- package/dist/advanced-display.js.map +1 -1
- package/dist/advanced-forms.d.ts +27 -2
- package/dist/advanced-forms.d.ts.map +1 -1
- package/dist/advanced-forms.js +11 -7
- package/dist/advanced-forms.js.map +1 -1
- package/dist/affix.d.ts +4 -1
- package/dist/affix.d.ts.map +1 -1
- package/dist/affix.js +2 -2
- package/dist/affix.js.map +1 -1
- package/dist/agreement.d.ts +3 -0
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +14 -3
- package/dist/agreement.js.map +1 -1
- package/dist/anchor.d.ts +5 -0
- package/dist/anchor.d.ts.map +1 -1
- package/dist/anchor.js +2 -2
- package/dist/anchor.js.map +1 -1
- package/dist/asset.d.ts +8 -1
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +4 -4
- package/dist/asset.js.map +1 -1
- package/dist/auth-screen.d.ts +5 -0
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +2 -1
- package/dist/auth-screen.js.map +1 -1
- package/dist/bottom-cta.d.ts +5 -0
- package/dist/bottom-cta.d.ts.map +1 -1
- package/dist/bottom-cta.js +2 -2
- package/dist/bottom-cta.js.map +1 -1
- package/dist/bottom-info.d.ts +5 -0
- package/dist/bottom-info.d.ts.map +1 -1
- package/dist/bottom-info.js +2 -2
- package/dist/bottom-info.js.map +1 -1
- package/dist/bottom-navigation.d.ts +3 -0
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +2 -1
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/breadcrumb.d.ts +3 -0
- package/dist/breadcrumb.d.ts.map +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/breadcrumb.js.map +1 -1
- package/dist/calendar.d.ts +4 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +2 -2
- package/dist/calendar.js.map +1 -1
- package/dist/carousel-motion.d.ts +3 -0
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +1 -1
- package/dist/carousel-motion.js.map +1 -1
- package/dist/carousel.d.ts +3 -0
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +2 -2
- package/dist/carousel.js.map +1 -1
- package/dist/celebration.d.ts.map +1 -1
- package/dist/celebration.js.map +1 -1
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +6 -2
- package/dist/clipboard.js.map +1 -1
- package/dist/code-block.d.ts +4 -1
- package/dist/code-block.d.ts.map +1 -1
- package/dist/code-block.js +1 -1
- package/dist/code-block.js.map +1 -1
- package/dist/collapsible.d.ts +3 -0
- package/dist/collapsible.d.ts.map +1 -1
- package/dist/collapsible.js +2 -2
- package/dist/collapsible.js.map +1 -1
- package/dist/color-picker.d.ts +4 -1
- package/dist/color-picker.d.ts.map +1 -1
- package/dist/color-picker.js +2 -2
- package/dist/color-picker.js.map +1 -1
- package/dist/command-palette.d.ts +6 -0
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +49 -15
- package/dist/command-palette.js.map +1 -1
- package/dist/composition-style.d.ts +14 -1
- package/dist/composition-style.d.ts.map +1 -1
- package/dist/composition-style.js.map +1 -1
- package/dist/content-transition.d.ts +6 -2
- package/dist/content-transition.d.ts.map +1 -1
- package/dist/content-transition.js +4 -4
- package/dist/content-transition.js.map +1 -1
- package/dist/context-menu.d.ts +4 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +2 -2
- package/dist/context-menu.js.map +1 -1
- package/dist/data-table.d.ts +3 -0
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +31 -11
- package/dist/data-table.js.map +1 -1
- package/dist/date-picker.d.ts +4 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +2 -2
- package/dist/date-picker.js.map +1 -1
- package/dist/date-range.d.ts +4 -1
- package/dist/date-range.d.ts.map +1 -1
- package/dist/date-range.js +2 -2
- package/dist/date-range.js.map +1 -1
- package/dist/display.d.ts +4 -0
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js.map +1 -1
- package/dist/duration-field.d.ts +4 -2
- package/dist/duration-field.d.ts.map +1 -1
- package/dist/duration-field.js +2 -2
- package/dist/duration-field.js.map +1 -1
- package/dist/effect-surface.d.ts +4 -2
- package/dist/effect-surface.d.ts.map +1 -1
- package/dist/effect-surface.js +2 -2
- package/dist/effect-surface.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts +24 -13
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +17 -15
- package/dist/feedback.js.map +1 -1
- package/dist/file-picker.d.ts +5 -0
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +2 -2
- package/dist/file-picker.js.map +1 -1
- package/dist/floating-action-button.d.ts.map +1 -1
- package/dist/floating-action-button.js.map +1 -1
- package/dist/folder-preview.d.ts +4 -1
- package/dist/folder-preview.d.ts.map +1 -1
- package/dist/folder-preview.js +2 -2
- package/dist/folder-preview.js.map +1 -1
- package/dist/forms.d.ts +35 -3
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +55 -36
- package/dist/forms.js.map +1 -1
- package/dist/gravity-letters.d.ts +4 -2
- package/dist/gravity-letters.d.ts.map +1 -1
- package/dist/gravity-letters.js +2 -2
- package/dist/gravity-letters.js.map +1 -1
- package/dist/grid-reveal.d.ts +4 -2
- package/dist/grid-reveal.d.ts.map +1 -1
- package/dist/grid-reveal.js +2 -2
- package/dist/grid-reveal.js.map +1 -1
- package/dist/heading.d.ts +5 -0
- package/dist/heading.d.ts.map +1 -1
- package/dist/heading.js +8 -1
- package/dist/heading.js.map +1 -1
- package/dist/inline-confirm.d.ts +3 -0
- package/dist/inline-confirm.d.ts.map +1 -1
- package/dist/inline-confirm.js +3 -3
- package/dist/inline-confirm.js.map +1 -1
- package/dist/internal/message-reactions.d.ts +16 -0
- package/dist/internal/message-reactions.d.ts.map +1 -0
- package/dist/internal/message-reactions.js +42 -0
- package/dist/internal/message-reactions.js.map +1 -0
- package/dist/internal/spinner.d.ts +18 -0
- package/dist/internal/spinner.d.ts.map +1 -0
- package/dist/internal/spinner.js +10 -0
- package/dist/internal/spinner.js.map +1 -0
- package/dist/layout.d.ts +12 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +6 -6
- package/dist/layout.js.map +1 -1
- package/dist/masonry.d.ts +4 -1
- package/dist/masonry.d.ts.map +1 -1
- package/dist/masonry.js +5 -3
- package/dist/masonry.js.map +1 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +12 -3
- package/dist/mentions.js.map +1 -1
- package/dist/menu-morph.d.ts +8 -1
- package/dist/menu-morph.d.ts.map +1 -1
- package/dist/menu-morph.js +3 -3
- package/dist/menu-morph.js.map +1 -1
- package/dist/menubar.d.ts +4 -1
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +4 -3
- package/dist/menubar.js.map +1 -1
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js +4 -1
- package/dist/modal.js.map +1 -1
- package/dist/navigation-bar.d.ts +4 -1
- package/dist/navigation-bar.d.ts.map +1 -1
- package/dist/navigation-bar.js +2 -2
- package/dist/navigation-bar.js.map +1 -1
- package/dist/navigation.d.ts +5 -0
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +6 -6
- package/dist/navigation.js.map +1 -1
- package/dist/notification-bell.d.ts +4 -1
- package/dist/notification-bell.d.ts.map +1 -1
- package/dist/notification-bell.js +5 -3
- package/dist/notification-bell.js.map +1 -1
- package/dist/number-field.d.ts +11 -0
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +8 -3
- package/dist/number-field.js.map +1 -1
- package/dist/overlay-stack.d.ts.map +1 -1
- package/dist/overlay-stack.js.map +1 -1
- package/dist/overlays.d.ts +5 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +35 -11
- package/dist/overlays.js.map +1 -1
- package/dist/pagination.d.ts +5 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +2 -2
- package/dist/pagination.js.map +1 -1
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +5 -4
- package/dist/popover.js.map +1 -1
- package/dist/portal.d.ts.map +1 -1
- package/dist/portal.js +2 -1
- package/dist/portal.js.map +1 -1
- package/dist/provider-button.d.ts +5 -0
- package/dist/provider-button.d.ts.map +1 -1
- package/dist/provider-button.js +2 -2
- package/dist/provider-button.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js.map +1 -1
- package/dist/qr-code.d.ts +4 -1
- package/dist/qr-code.d.ts.map +1 -1
- package/dist/qr-code.js +2 -2
- package/dist/qr-code.js.map +1 -1
- package/dist/reaction-picker.d.ts +6 -2
- package/dist/reaction-picker.d.ts.map +1 -1
- package/dist/reaction-picker.js +20 -4
- package/dist/reaction-picker.js.map +1 -1
- package/dist/saved-items.d.ts +33 -0
- package/dist/saved-items.d.ts.map +1 -0
- package/dist/saved-items.js +19 -0
- package/dist/saved-items.js.map +1 -0
- package/dist/screen-flows.d.ts +323 -0
- package/dist/screen-flows.d.ts.map +1 -0
- package/dist/screen-flows.js +212 -0
- package/dist/screen-flows.js.map +1 -0
- package/dist/screens.d.ts +120 -0
- package/dist/screens.d.ts.map +1 -0
- package/dist/screens.js +66 -0
- package/dist/screens.js.map +1 -0
- package/dist/select.d.ts +6 -0
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +13 -3
- package/dist/select.js.map +1 -1
- package/dist/selection.d.ts +28 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +12 -12
- package/dist/selection.js.map +1 -1
- package/dist/side-panel.d.ts.map +1 -1
- package/dist/side-panel.js.map +1 -1
- package/dist/sidebar.d.ts +3 -0
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +2 -2
- package/dist/sidebar.js.map +1 -1
- package/dist/skip-nav.d.ts.map +1 -1
- package/dist/skip-nav.js.map +1 -1
- package/dist/slider.d.ts +5 -0
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +2 -1
- package/dist/slider.js.map +1 -1
- package/dist/sortable.d.ts +3 -0
- package/dist/sortable.d.ts.map +1 -1
- package/dist/sortable.js +1 -1
- package/dist/sortable.js.map +1 -1
- package/dist/splitter.d.ts +5 -0
- package/dist/splitter.d.ts.map +1 -1
- package/dist/splitter.js +28 -3
- package/dist/splitter.js.map +1 -1
- package/dist/step-player.d.ts +4 -1
- package/dist/step-player.d.ts.map +1 -1
- package/dist/step-player.js +2 -2
- package/dist/step-player.js.map +1 -1
- package/dist/steps.d.ts +5 -0
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +2 -2
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +245 -65
- package/dist/styles.layered.css +245 -65
- package/dist/supplemental-display.d.ts +4 -0
- package/dist/supplemental-display.d.ts.map +1 -1
- package/dist/supplemental-display.js +7 -4
- package/dist/supplemental-display.js.map +1 -1
- package/dist/supplemental-navigation.d.ts +5 -0
- package/dist/supplemental-navigation.d.ts.map +1 -1
- package/dist/supplemental-navigation.js +2 -2
- package/dist/supplemental-navigation.js.map +1 -1
- package/dist/swipe-actions.d.ts +4 -1
- package/dist/swipe-actions.d.ts.map +1 -1
- package/dist/swipe-actions.js +2 -2
- package/dist/swipe-actions.js.map +1 -1
- package/dist/tags-input.d.ts +5 -0
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +2 -2
- package/dist/tags-input.js.map +1 -1
- package/dist/task-list.d.ts +4 -1
- package/dist/task-list.d.ts.map +1 -1
- package/dist/task-list.js +3 -3
- package/dist/task-list.js.map +1 -1
- package/dist/text-formats.d.ts +5 -0
- package/dist/text-formats.d.ts.map +1 -1
- package/dist/text-formats.js +2 -1
- package/dist/text-formats.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +22 -2
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts +4 -1
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +2 -2
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +10 -4
- package/dist/toast.js.map +1 -1
- package/dist/toggle-group.d.ts +3 -0
- package/dist/toggle-group.d.ts.map +1 -1
- package/dist/toggle-group.js +2 -1
- package/dist/toggle-group.js.map +1 -1
- package/dist/top-bar.d.ts +5 -0
- package/dist/top-bar.d.ts.map +1 -1
- package/dist/top-bar.js +2 -2
- package/dist/top-bar.js.map +1 -1
- package/dist/top.d.ts +5 -0
- package/dist/top.d.ts.map +1 -1
- package/dist/top.js +2 -2
- package/dist/top.js.map +1 -1
- package/dist/tour.d.ts.map +1 -1
- package/dist/tour.js +3 -2
- package/dist/tour.js.map +1 -1
- package/dist/transfer-list.d.ts +3 -0
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +2 -2
- package/dist/transfer-list.js.map +1 -1
- package/dist/tree.d.ts +3 -0
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +17 -5
- package/dist/tree.js.map +1 -1
- package/dist/upload-item.d.ts +5 -0
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +2 -2
- package/dist/upload-item.js.map +1 -1
- package/dist/virtual-list.d.ts +4 -1
- package/dist/virtual-list.d.ts.map +1 -1
- package/dist/virtual-list.js +2 -2
- package/dist/virtual-list.js.map +1 -1
- package/dist/voice-note.d.ts +4 -1
- package/dist/voice-note.d.ts.map +1 -1
- package/dist/voice-note.js +2 -2
- package/dist/voice-note.js.map +1 -1
- package/dist/watermark.d.ts +4 -1
- package/dist/watermark.d.ts.map +1 -1
- package/dist/watermark.js +2 -2
- package/dist/watermark.js.map +1 -1
- package/package.json +18 -3
package/dist/screens.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { MessageReactions } from "./internal/message-reactions.js";
|
|
3
|
+
import { Button, IconButton } from "./actions.js";
|
|
4
|
+
import { TextArea } from "./forms.js";
|
|
5
|
+
import { useId, useRef, useState } from "react";
|
|
6
|
+
import { isReplySwipe, canSubmitMessage, validateMessageAttachments, resolveScreenContentState, screenPatternRecipe } from "@hjmds/design-contracts/screen-patterns";
|
|
7
|
+
import { Heading } from "./heading.js";
|
|
8
|
+
import { Spinner } from "./internal/spinner.js";
|
|
9
|
+
import { Section, Stack, Text } from "./layout.js";
|
|
10
|
+
import { ListRow } from "./display.js";
|
|
11
|
+
import { classNames } from "./internal.js";
|
|
12
|
+
/** Shared screen shell. Routing, data, permission checks and mutation state remain product-owned. */
|
|
13
|
+
export function ScreenLayout({ title, header, contentInset = "default", description, leading, actions, notice, footer, state = { kind: "ready" }, stateAction, children, scroll = "screen", as: Element = "main", className, layoutStyle }) {
|
|
14
|
+
const id = useId();
|
|
15
|
+
const resolved = resolveScreenContentState(state);
|
|
16
|
+
// Replacement text owns scrolling even when the ready state delegates it to
|
|
17
|
+
// a virtual list. Use the rendered mode for keyboard access as well as CSS.
|
|
18
|
+
const bodyScroll = resolved.replacesContent ? "screen" : scroll;
|
|
19
|
+
const recipe = screenPatternRecipe;
|
|
20
|
+
return _jsxs(Element, { "aria-labelledby": header ? undefined : id, "aria-label": header ? title : undefined, "data-content-inset": contentInset, className: classNames("hjm-screen", className), style: { "--hjm-screen-width": `${recipe.maxWidth}px`, "--hjm-screen-padding": `${contentInset === "none" ? 0 : recipe.padding}px`, "--hjm-screen-gap": `${recipe.sectionGap}px`, "--hjm-screen-item-gap": `${recipe.itemGap}px`, "--hjm-screen-state-gap": `${recipe.stateGap}px`, "--hjm-screen-header-min": `${recipe.headerMinWidth}px`, ...layoutStyle }, children: [header ?? _jsxs("header", { className: "hjm-screen__header", children: [leading, _jsxs("div", { className: "hjm-screen__heading", children: [_jsx(Heading, { level: "level3", semanticLevel: 1, id: id, children: title }), description ? _jsx(Text, { as: "p", tone: "muted", children: description }) : null] }), actions] }), notice ? _jsx("div", { className: "hjm-screen__notice", children: notice }) : null, _jsx("div", { tabIndex: bodyScroll === "content" ? undefined : 0, className: "hjm-screen__body", "data-scroll": bodyScroll, "data-replacement": resolved.replacesContent || undefined, "aria-busy": resolved.busy || undefined, children: state.kind === "ready" ? children : _jsxs("div", { className: "hjm-screen__state", children: [resolved.busy ? _jsx(Spinner, { label: [state.title, state.description].filter(Boolean).join(". ") }) : _jsx("div", { role: state.kind === "error" ? "alert" : "status", children: _jsxs(Stack, { gap: "sm", align: "center", children: [_jsx(Text, { variant: "title", children: state.title }), state.description ? _jsx(Text, { tone: "muted", children: state.description }) : null] }) }), stateAction] }) }), footer ? _jsx("footer", { className: "hjm-screen__footer", children: footer }) : null] });
|
|
21
|
+
}
|
|
22
|
+
export function SettingsScreen({ profile, sections, ...props }) {
|
|
23
|
+
return _jsx(ScreenLayout, { ...props, children: _jsxs(Stack, { gap: "xl", children: [profile, sections.map(section => _jsx(Section, { className: "hjm-settings-section", title: section.title, description: section.description, children: section.children }, section.id))] }) });
|
|
24
|
+
}
|
|
25
|
+
export function NotificationInboxScreen({ filters, children, notice, ...props }) {
|
|
26
|
+
return _jsx(ScreenLayout, { ...props, notice: _jsxs(Stack, { gap: "sm", children: [notice, filters] }), children: children });
|
|
27
|
+
}
|
|
28
|
+
export function NotificationItem({ read, statusLabel, timestamp, description, title, className, ...props }) {
|
|
29
|
+
return _jsx(ListRow, { ...props, className: classNames("hjm-notification-item", className), "data-unread": !read || undefined, title: _jsx(Text, { emphasis: read ? "regular" : "strong", children: title }), description: _jsxs(Stack, { gap: "xxs", children: [description, _jsxs(Text, { variant: "caption", tone: "muted", children: [statusLabel, " \u00B7 ", timestamp] })] }) });
|
|
30
|
+
}
|
|
31
|
+
/** Caller supplies a virtualized timeline and keyboard-aware composer; no implicit auto-scroll or send. */
|
|
32
|
+
export function ChatScreen({ composer, scroll = "content", ...props }) {
|
|
33
|
+
return _jsx(ScreenLayout, { ...props, scroll: scroll, footer: !props.state || props.state.kind === "ready" ? composer : null });
|
|
34
|
+
}
|
|
35
|
+
export function MessageComposer({ value, label, sendLabel, disabled = false, pending = false, onValueChange, onSend, maxLength, sendDisabled = false, additionalContent = false, leadingAction, inputRef, context, replyTo, sendIcon, sendPresentation = "inline", attachmentAction, attachments = [], onRemoveAttachment, layoutStyle }) {
|
|
36
|
+
validateMessageAttachments(attachments);
|
|
37
|
+
if (attachments.length && !onRemoveAttachment)
|
|
38
|
+
throw new TypeError("Attachments require a removal callback");
|
|
39
|
+
const canSend = !sendDisabled && canSubmitMessage({ value, label, sendLabel, disabled, pending, attachmentCount: attachments.length + (additionalContent ? 1 : 0) });
|
|
40
|
+
const locked = disabled || pending;
|
|
41
|
+
// A bounded corner radius keeps multiline/large-text content inside the field instead of a tall pill.
|
|
42
|
+
const hasContent = !!value.trim() || attachments.length > 0 || additionalContent;
|
|
43
|
+
const attach = attachmentAction ? _jsx(IconButton, { label: attachmentAction.label, tone: "ghost", disabled: locked || attachmentAction.disabled, onClick: attachmentAction.onPress, children: attachmentAction.icon }) : null;
|
|
44
|
+
const send = sendIcon ? _jsx(IconButton, { label: sendLabel, size: sendPresentation === "circle" ? "small" : "medium", shape: "circle", tone: sendPresentation === "circle" ? "primary" : "ghost", disabled: !canSend, loading: pending, onClick: () => { if (canSend)
|
|
45
|
+
onSend(value); }, children: sendIcon }) : _jsx(Button, { disabled: !canSend, loading: pending, onClick: () => { if (canSend)
|
|
46
|
+
onSend(value); }, children: sendLabel });
|
|
47
|
+
// Enter stays a newline for IME; receipt-driven clearing and failed-send recovery belong to the host.
|
|
48
|
+
return _jsxs("div", { className: "hjm-message-composer", "data-send-presentation": sendPresentation, style: { "--hjm-message-composer-gap": `${screenPatternRecipe.itemGap}px`, "--hjm-attachment-size": `${screenPatternRecipe.attachmentSize}px`, "--hjm-attachment-remove-size": `${screenPatternRecipe.attachmentRemoveSize}px`, ...layoutStyle }, children: [context, replyTo ? _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", children: [_jsxs(Stack, { gap: "xxs", children: [_jsx(Text, { variant: "caption", emphasis: "strong", children: replyTo.author }), _jsx(Text, { variant: "caption", tone: "muted", children: replyTo.excerpt })] }), _jsx(IconButton, { label: replyTo.cancelLabel, tone: "ghost", disabled: locked, onClick: replyTo.onCancel, children: _jsx(Text, { children: "\u00D7" }) })] }) : null, attachments.length ? _jsxs("div", { className: "hjm-message-composer__attachments", children: [attachments.map(item => _jsxs("div", { className: "hjm-message-composer__attachment", children: [_jsx("div", { className: "hjm-message-composer__preview", children: item.preview }), _jsx("span", { className: "hjm-message-composer__remove", children: _jsx(IconButton, { label: item.removeLabel, tone: "ghost", size: "small", disabled: locked, onClick: () => onRemoveAttachment?.(item.id), children: _jsx("span", { className: "hjm-message-composer__remove-glyph", "aria-hidden": "true", children: "\u00D7" }) }) })] }, item.id)), attach] }) : null, _jsxs("div", { className: "hjm-message-composer__row", children: [_jsx(TextArea, { ref: inputRef, maxLength: maxLength, leadingAction: leadingAction, shape: "large", rows: screenPatternRecipe.composerMinLines, "aria-label": label, placeholder: label, value: value, disabled: locked, onChange: event => onValueChange(event.currentTarget.value), minVisibleLines: screenPatternRecipe.composerMinLines, maxVisibleLines: screenPatternRecipe.composerMaxLines, ...(sendIcon ? { trailing: hasContent || pending ? send : attach } : {}) }), sendIcon ? null : send] })] });
|
|
49
|
+
}
|
|
50
|
+
export function ChatMessage({ direction, author, timestamp, deliveryLabel, avatar, reply, actions, replyAction, replyLink, reactions, children, interactiveContent = false, layoutStyle }) {
|
|
51
|
+
const start = useRef(null);
|
|
52
|
+
const [offset, setOffset] = useState(0);
|
|
53
|
+
const finish = () => { start.current = null; setOffset(0); };
|
|
54
|
+
return _jsxs("article", { tabIndex: replyAction && !replyAction.disabled ? 0 : undefined, "aria-keyshortcuts": replyAction ? "Alt+ArrowLeft Alt+ArrowRight" : undefined, "aria-description": replyAction?.label, onKeyDown: event => { if (event.target === event.currentTarget && event.altKey && (event.key === "ArrowLeft" || event.key === "ArrowRight") && replyAction && !replyAction.disabled) {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
replyAction.onPress();
|
|
57
|
+
} }, onPointerDown: event => { if (!replyAction || replyAction.disabled || event.button !== 0 || event.target.closest("button,a,input,textarea"))
|
|
58
|
+
return; start.current = { x: event.clientX, y: event.clientY }; }, onPointerMove: event => { if (!start.current)
|
|
59
|
+
return; const dx = event.clientX - start.current.x, dy = event.clientY - start.current.y; if (Math.abs(dy) > 10 && Math.abs(dy) > Math.abs(dx)) {
|
|
60
|
+
finish();
|
|
61
|
+
return;
|
|
62
|
+
} if (Math.abs(dx) > Math.abs(dy) * 2)
|
|
63
|
+
setOffset(Math.max(-72, Math.min(72, dx))); }, onPointerUp: event => { if (start.current && replyAction && !replyAction.disabled && isReplySwipe(event.clientX - start.current.x, event.clientY - start.current.y))
|
|
64
|
+
replyAction.onPress(); finish(); }, onPointerCancel: finish, onPointerLeave: finish, className: "hjm-chat-message", style: { ...layoutStyle, transform: `translateX(${offset}px)`, touchAction: replyAction ? "pan-y" : undefined, "--hjm-message-max-width": screenPatternRecipe.messageMaxWidth }, "data-direction": direction, "aria-label": author, children: [avatar ? _jsx("div", { className: "hjm-chat-message__avatar", children: avatar }) : null, _jsxs("div", { className: "hjm-chat-message__content", children: [author ? _jsx(Text, { variant: "caption", tone: "muted", children: author }) : null, reply && replyLink ? _jsx(Button, { tone: "ghost", "aria-label": replyLink.label, onClick: replyLink.onPress, children: reply }) : null, reactions ? _jsxs(MessageReactions, { ...reactions, interactiveContent: interactiveContent, children: [reply && !replyLink ? _jsx("div", { className: "hjm-chat-message__reply", children: reply }) : null, children] }) : _jsxs("div", { className: "hjm-chat-message__bubble", children: [reply && !replyLink ? _jsx("div", { className: "hjm-chat-message__reply", children: reply }) : null, children] }), timestamp || deliveryLabel || actions ? _jsxs("div", { className: "hjm-chat-message__meta", children: [timestamp || deliveryLabel ? _jsxs(Text, { variant: "caption", tone: "muted", children: [timestamp, deliveryLabel ? ` · ${deliveryLabel}` : ""] }) : null, actions] }) : null] })] });
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=screens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screens.js","sourceRoot":"","sources":["../src/screens.tsx"],"names":[],"mappings":"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","sourcesContent":["import { MessageReactions } from \"./internal/message-reactions.js\";\nimport type { ReactionPickerProps } from \"./reaction-picker.js\";\nimport { Button, IconButton } from \"./actions.js\";\nimport { TextArea } from \"./forms.js\";\nimport { useId, useRef, useState, type Ref, type ReactNode } from \"react\";\nimport { isReplySwipe, canSubmitMessage, validateMessageAttachments, type MessageAttachmentDescriptor, resolveScreenContentState, screenPatternRecipe, type ChatMessageDescriptor, type MessageComposerDescriptor, type ScreenContentState } from \"@hjmds/design-contracts/screen-patterns\";\nimport { Heading } from \"./heading.js\";\nimport { Spinner } from \"./internal/spinner.js\";\nimport { Section, Stack, Text } from \"./layout.js\";\nimport { ListRow, type ListRowProps } from \"./display.js\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type ScreenLayoutProps = Readonly<{\n title: string;\n /** Preserve host navigation while the shared shell owns content and state. */\n header?: ReactNode;\n contentInset?: \"default\" | \"none\";\n description?: string;\n leading?: ReactNode;\n actions?: ReactNode;\n notice?: ReactNode;\n footer?: ReactNode;\n state?: ScreenContentState;\n stateAction?: ReactNode;\n children?: ReactNode;\n /** A virtualized list must own scrolling; never nest it inside a second scroll container. */\n scroll?: \"screen\" | \"content\";\n as?: \"main\" | \"section\";\n className?: string;\n /**\n * Canonical layout-only placement on the screen root (for example `flex` or `width` in a split\n * view), matching Native ScreenLayout. Every screen built on ScreenLayout forwards it.\n */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Shared screen shell. Routing, data, permission checks and mutation state remain product-owned. */\nexport function ScreenLayout({ title, header, contentInset = \"default\", description, leading, actions, notice, footer, state = { kind: \"ready\" }, stateAction, children, scroll = \"screen\", as: Element = \"main\", className, layoutStyle }: ScreenLayoutProps) {\n const id = useId();\n const resolved = resolveScreenContentState(state);\n // Replacement text owns scrolling even when the ready state delegates it to\n // a virtual list. Use the rendered mode for keyboard access as well as CSS.\n const bodyScroll = resolved.replacesContent ? \"screen\" : scroll;\n const recipe = screenPatternRecipe;\n return <Element aria-labelledby={header ? undefined : id} aria-label={header ? title : undefined} data-content-inset={contentInset} className={classNames(\"hjm-screen\", className)}\n style={{ \"--hjm-screen-width\": `${recipe.maxWidth}px`, \"--hjm-screen-padding\": `${contentInset === \"none\" ? 0 : recipe.padding}px`, \"--hjm-screen-gap\": `${recipe.sectionGap}px`, \"--hjm-screen-item-gap\": `${recipe.itemGap}px`, \"--hjm-screen-state-gap\": `${recipe.stateGap}px`, \"--hjm-screen-header-min\": `${recipe.headerMinWidth}px`, ...layoutStyle } as React.CSSProperties}>\n {header ?? <header className=\"hjm-screen__header\">\n {leading}<div className=\"hjm-screen__heading\"><Heading level=\"level3\" semanticLevel={1} id={id}>{title}</Heading>\n {description ? <Text as=\"p\" tone=\"muted\">{description}</Text> : null}</div>{actions}\n </header>}\n {notice ? <div className=\"hjm-screen__notice\">{notice}</div> : null}\n {/* Scrollable read-only screens still need a keyboard entry point. */}\n <div tabIndex={bodyScroll === \"content\" ? undefined : 0} className=\"hjm-screen__body\" data-scroll={bodyScroll} data-replacement={resolved.replacesContent || undefined} aria-busy={resolved.busy || undefined}>\n {state.kind === \"ready\" ? children : <div className=\"hjm-screen__state\">\n {/* Loading copy is an accessible name; visible copy beside the spinner\n contradicts the shared spinner-only loading contract. */}\n {resolved.busy ? <Spinner label={[state.title, state.description].filter(Boolean).join(\". \")} /> : <div role={state.kind === \"error\" ? \"alert\" : \"status\"}>\n <Stack gap=\"sm\" align=\"center\"><Text variant=\"title\">{state.title}</Text>\n {state.description ? <Text tone=\"muted\">{state.description}</Text> : null}</Stack>\n </div>}\n {stateAction}\n </div>}\n </div>\n {footer ? <footer className=\"hjm-screen__footer\">{footer}</footer> : null}\n </Element>;\n}\n\nexport type SettingsScreenSection = Readonly<{ id: string; title: string; description?: string; children: ReactNode }>;\nexport type SettingsScreenProps = Omit<ScreenLayoutProps, \"children\" | \"scroll\"> & Readonly<{ profile?: ReactNode; sections: readonly SettingsScreenSection[] }>;\nexport function SettingsScreen({ profile, sections, ...props }: SettingsScreenProps) {\n return <ScreenLayout {...props}><Stack gap=\"xl\">{profile}{sections.map(section =>\n <Section className=\"hjm-settings-section\" key={section.id} title={section.title} description={section.description}>{section.children}</Section>)}</Stack></ScreenLayout>;\n}\n\nexport type NotificationInboxScreenProps = Omit<ScreenLayoutProps, \"children\"> & Readonly<{\n filters?: ReactNode;\n children: ReactNode;\n}>;\nexport function NotificationInboxScreen({ filters, children, notice, ...props }: NotificationInboxScreenProps) {\n return <ScreenLayout {...props} notice={<Stack gap=\"sm\">{notice}{filters}</Stack>}>{children}</ScreenLayout>;\n}\n\n/** Read/unread is announced in localized copy as well as emphasis; rendering never marks an item read. */\nexport type NotificationItemProps = Omit<ListRowProps, \"description\" | \"selected\"> & Readonly<{\n read: boolean;\n statusLabel: string;\n timestamp: string;\n description?: ReactNode;\n}>;\nexport function NotificationItem({ read, statusLabel, timestamp, description, title, className, ...props }: NotificationItemProps) {\n return <ListRow {...props} className={classNames(\"hjm-notification-item\", className)} data-unread={!read || undefined} title={<Text emphasis={read ? \"regular\" : \"strong\"}>{title}</Text>}\n description={<Stack gap=\"xxs\">{description}<Text variant=\"caption\" tone=\"muted\">{statusLabel} · {timestamp}</Text></Stack>} />;\n}\n\nexport type ChatScreenProps = Omit<ScreenLayoutProps, \"footer\"> & Readonly<{ composer: ReactNode }>;\n/** Caller supplies a virtualized timeline and keyboard-aware composer; no implicit auto-scroll or send. */\nexport function ChatScreen({ composer, scroll = \"content\", ...props }: ChatScreenProps) {\n return <ScreenLayout {...props} scroll={scroll} footer={!props.state || props.state.kind === \"ready\" ? composer : null} />;\n}\n\nexport type MessageComposerProps = Omit<MessageComposerDescriptor, \"attachmentCount\"> & Readonly<{\n maxLength?: number;\n sendDisabled?: boolean;\n additionalContent?: boolean;\n leadingAction?: ReactNode;\n inputRef?: Ref<HTMLTextAreaElement>;\n onValueChange(value: string): void;\n onSend(value: string): void;\n context?: ReactNode;\n replyTo?: Readonly<{ author: string; excerpt: string; cancelLabel: string; onCancel(): void }>;\n /** Icon mode puts the send/attachment action inside the growing field. */\n sendIcon?: ReactNode;\n /** Reference comment layout: a filled circular send action inside the field. */\n sendPresentation?: \"inline\" | \"circle\";\n attachmentAction?: Readonly<{ label: string; icon: ReactNode; onPress(): void; disabled?: boolean }>;\n attachments?: readonly (MessageAttachmentDescriptor & Readonly<{ preview: ReactNode }>)[];\n onRemoveAttachment?: (id: string) => void;\n /** Canonical layout-only placement on the composer root. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\nexport function MessageComposer({ value, label, sendLabel, disabled = false, pending = false, onValueChange, onSend, maxLength, sendDisabled = false, additionalContent = false, leadingAction, inputRef, context, replyTo, sendIcon, sendPresentation = \"inline\", attachmentAction, attachments = [], onRemoveAttachment, layoutStyle }: MessageComposerProps) {\n validateMessageAttachments(attachments);\n if (attachments.length && !onRemoveAttachment) throw new TypeError(\"Attachments require a removal callback\");\n const canSend = !sendDisabled && canSubmitMessage({ value, label, sendLabel, disabled, pending, attachmentCount: attachments.length + (additionalContent ? 1 : 0) });\n const locked = disabled || pending;\n // A bounded corner radius keeps multiline/large-text content inside the field instead of a tall pill.\n const hasContent = !!value.trim() || attachments.length > 0 || additionalContent;\n const attach = attachmentAction ? <IconButton label={attachmentAction.label} tone=\"ghost\" disabled={locked || attachmentAction.disabled} onClick={attachmentAction.onPress}>{attachmentAction.icon}</IconButton> : null;\n const send = sendIcon ? <IconButton label={sendLabel} size={sendPresentation === \"circle\" ? \"small\" : \"medium\"} shape=\"circle\" tone={sendPresentation === \"circle\" ? \"primary\" : \"ghost\"} disabled={!canSend} loading={pending} onClick={() => { if (canSend) onSend(value); }}>{sendIcon}</IconButton> : <Button disabled={!canSend} loading={pending} onClick={() => { if (canSend) onSend(value); }}>{sendLabel}</Button>;\n // Enter stays a newline for IME; receipt-driven clearing and failed-send recovery belong to the host.\n return <div className=\"hjm-message-composer\" data-send-presentation={sendPresentation} style={{\"--hjm-message-composer-gap\": `${screenPatternRecipe.itemGap}px`, \"--hjm-attachment-size\": `${screenPatternRecipe.attachmentSize}px`, \"--hjm-attachment-remove-size\": `${screenPatternRecipe.attachmentRemoveSize}px`, ...layoutStyle} as React.CSSProperties}>{context}{replyTo ? <Stack axis=\"inline\" gap=\"sm\" align=\"center\"><Stack gap=\"xxs\"><Text variant=\"caption\" emphasis=\"strong\">{replyTo.author}</Text><Text variant=\"caption\" tone=\"muted\">{replyTo.excerpt}</Text></Stack><IconButton label={replyTo.cancelLabel} tone=\"ghost\" disabled={locked} onClick={replyTo.onCancel}><Text>×</Text></IconButton></Stack> : null}\n {attachments.length ? <div className=\"hjm-message-composer__attachments\">{attachments.map(item => <div key={item.id} className=\"hjm-message-composer__attachment\"><div className=\"hjm-message-composer__preview\">{item.preview}</div><span className=\"hjm-message-composer__remove\"><IconButton label={item.removeLabel} tone=\"ghost\" size=\"small\" disabled={locked} onClick={() => onRemoveAttachment?.(item.id)}><span className=\"hjm-message-composer__remove-glyph\" aria-hidden=\"true\">×</span></IconButton></span></div>)}{attach}</div> : null}\n <div className=\"hjm-message-composer__row\"><TextArea ref={inputRef} maxLength={maxLength} leadingAction={leadingAction} shape=\"large\" rows={screenPatternRecipe.composerMinLines} aria-label={label} placeholder={label} value={value} disabled={locked}\n onChange={event => onValueChange(event.currentTarget.value)} minVisibleLines={screenPatternRecipe.composerMinLines} maxVisibleLines={screenPatternRecipe.composerMaxLines}\n {...(sendIcon ? { trailing: hasContent || pending ? send : attach } : {})} />\n {sendIcon ? null : send}\n </div></div>;\n}\n\nexport type ChatMessageProps = ChatMessageDescriptor & Readonly<{ children: ReactNode; interactiveContent?: boolean; avatar?: ReactNode; reply?: ReactNode; actions?: ReactNode; replyAction?: Readonly<{label:string; onPress():void; disabled?:boolean}>; replyLink?: Readonly<{label:string; onPress():void}>; reactions?: ReactionPickerProps & Readonly<{ closeLabel: string; menuAction?: Readonly<{ label: string; onPress(): void; disabled?: boolean }> }>;\n /** Canonical layout-only placement on the message row. The swipe offset still owns `transform`. */\n layoutStyle?: HjmCompositionStyleProp }>;\nexport function ChatMessage({ direction, author, timestamp, deliveryLabel, avatar, reply, actions, replyAction, replyLink, reactions, children, interactiveContent=false, layoutStyle }: ChatMessageProps) {\n const start = useRef<{x:number;y:number} | null>(null);\n const [offset, setOffset] = useState(0);\n const finish = () => { start.current = null; setOffset(0); };\n return <article tabIndex={replyAction && !replyAction.disabled ? 0 : undefined}\n aria-keyshortcuts={replyAction ? \"Alt+ArrowLeft Alt+ArrowRight\" : undefined} aria-description={replyAction?.label}\n onKeyDown={event => { if (event.target === event.currentTarget && event.altKey && (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") && replyAction && !replyAction.disabled) { event.preventDefault(); replyAction.onPress(); } }}\n onPointerDown={event => { if (!replyAction || replyAction.disabled || event.button !== 0 || (event.target as HTMLElement).closest(\"button,a,input,textarea\")) return; start.current = {x:event.clientX,y:event.clientY}; }}\n onPointerMove={event => { if (!start.current) return; const dx=event.clientX-start.current.x,dy=event.clientY-start.current.y; if (Math.abs(dy)>10 && Math.abs(dy)>Math.abs(dx)) {finish();return;} if (Math.abs(dx)>Math.abs(dy)*2) setOffset(Math.max(-72,Math.min(72,dx))); }}\n onPointerUp={event => { if (start.current && replyAction && !replyAction.disabled && isReplySwipe(event.clientX-start.current.x,event.clientY-start.current.y)) replyAction.onPress(); finish(); }} onPointerCancel={finish} onPointerLeave={finish}\n className=\"hjm-chat-message\" style={{ ...layoutStyle, transform: `translateX(${offset}px)`, touchAction: replyAction ? \"pan-y\" : undefined, \"--hjm-message-max-width\": screenPatternRecipe.messageMaxWidth } as React.CSSProperties} data-direction={direction} aria-label={author}>\n {avatar ? <div className=\"hjm-chat-message__avatar\">{avatar}</div> : null}\n <div className=\"hjm-chat-message__content\">{author?<Text variant=\"caption\" tone=\"muted\">{author}</Text>:null}\n {reply && replyLink ? <Button tone=\"ghost\" aria-label={replyLink.label} onClick={replyLink.onPress}>{reply}</Button> : null}\n {reactions ? <MessageReactions {...reactions} interactiveContent={interactiveContent}>{reply && !replyLink ? <div className=\"hjm-chat-message__reply\">{reply}</div> : null}{children}</MessageReactions> : <div className=\"hjm-chat-message__bubble\">{reply && !replyLink ? <div className=\"hjm-chat-message__reply\">{reply}</div> : null}{children}</div>}\n {timestamp||deliveryLabel||actions?<div className=\"hjm-chat-message__meta\">{timestamp||deliveryLabel?<Text variant=\"caption\" tone=\"muted\">{timestamp}{deliveryLabel ? ` · ${deliveryLabel}` : \"\"}</Text>:null}{actions}</div>:null}\n </div>\n </article>;\n}\n"]}
|
package/dist/select.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type SelectCollectionSectionDescriptor, type SelectCollectionSource, ty
|
|
|
2
2
|
import { type AsyncCollectionState, type SelectItemDescriptor } from "@hjmds/design-contracts/behaviors";
|
|
3
3
|
import { type SelectDensity, type SelectSize } from "@hjmds/design-contracts/recipes";
|
|
4
4
|
import { type ButtonHTMLAttributes, type ReactElement, type ReactNode, type RefAttributes } from "react";
|
|
5
|
+
import type { HjmCompositionStyleProp } from "./composition-style.js";
|
|
5
6
|
import { type AnchoredPopupAlign } from "./portal.js";
|
|
6
7
|
export type SelectItem<Key extends string = string> = SelectItemDescriptor<Key>;
|
|
7
8
|
export type SelectSection<Key extends string = string, SectionKey extends string = string> = SelectCollectionSectionDescriptor<Key, SectionKey>;
|
|
@@ -60,6 +61,11 @@ type SelectBaseProps<Key extends string> = Omit<ButtonHTMLAttributes<HTMLButtonE
|
|
|
60
61
|
/** Logical listbox alignment against the trigger; automatically mirrors in RTL. */
|
|
61
62
|
align?: AnchoredPopupAlign;
|
|
62
63
|
fieldClassName?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Canonical layout-only placement on the field frame. `style` keeps going to
|
|
66
|
+
* the trigger button, where it always went, so existing callers do not move.
|
|
67
|
+
*/
|
|
68
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
63
69
|
portalContainer?: HTMLElement;
|
|
64
70
|
locale?: string | readonly string[];
|
|
65
71
|
renderLeading?: (item: SelectItemDescriptor<Key> | null, appearance: SelectLeadingRenderProps) => ReactNode;
|
package/dist/select.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.tsx"],"names":[],"mappings":"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"}
|
package/dist/select.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { layer } from "@hjmds/design-contracts/foundations";
|
|
2
3
|
import { getCollectionNavigationIntent, getCollectionNavigationTarget, getCollectionTypeaheadMatch, reconcileSelectSelection, resolveCollectionItem, resolveSelectSelectedItem, validateCollection, } from "@hjmds/design-contracts/components/collection";
|
|
3
4
|
import { resolveControlAccessibleName, selectBehaviorDefaults, } from "@hjmds/design-contracts/behaviors";
|
|
4
5
|
import { iconRecipe, selectRecipe, } from "@hjmds/design-contracts/recipes";
|
|
@@ -7,7 +8,7 @@ import { classNames, useControllableState } from "./internal.js";
|
|
|
7
8
|
import { AnchoredPortal, useAnchoredPopup, } from "./portal.js";
|
|
8
9
|
const emptySelectionKey = Symbol("hjm-select-empty-selection");
|
|
9
10
|
function SelectInner(props, forwardedRef) {
|
|
10
|
-
const { items, sections, label, accessibilityLabel, description, error, placeholder, emptySelectionLabel, asyncState = { status: "idle" }, selectedItem, disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection, loop = selectBehaviorDefaults.loop, busy = false, readOnly = false, size = selectRecipe.defaults.size, density = selectRecipe.defaults.density, align = "start", fieldClassName, portalContainer, locale, renderLeading, renderOptionLeading, className, id: idProp, name, disabled = false, required = false, selectedKey: selectedKeyProp, defaultSelectedKey, onSelectionChange, open: openProp, defaultOpen = false, onOpenChange, onClick, onFocus, onBlur, onKeyDown, ...buttonProps } = props;
|
|
11
|
+
const { items, sections, label, accessibilityLabel, description, error, placeholder, emptySelectionLabel, asyncState = { status: "idle" }, selectedItem, disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection, loop = selectBehaviorDefaults.loop, busy = false, readOnly = false, size = selectRecipe.defaults.size, density = selectRecipe.defaults.density, align = "start", fieldClassName, layoutStyle, portalContainer, locale, renderLeading, renderOptionLeading, className, id: idProp, name, disabled = false, required = false, selectedKey: selectedKeyProp, defaultSelectedKey, onSelectionChange, open: openProp, defaultOpen = false, onOpenChange, onClick, onFocus, onBlur, onKeyDown, ...buttonProps } = props;
|
|
11
12
|
const source = sections === undefined
|
|
12
13
|
? { items: items ?? [] }
|
|
13
14
|
: { sections };
|
|
@@ -120,8 +121,12 @@ function SelectInner(props, forwardedRef) {
|
|
|
120
121
|
: optionId(activeKey);
|
|
121
122
|
const popupPosition = useAnchoredPopup(triggerRef, listboxNode, {
|
|
122
123
|
align,
|
|
124
|
+
// Offset and edge padding come from selectRecipe.popover (2026-10-06 follow-up); the helper
|
|
125
|
+
// default edge padding 16 disagreed with the recipe's collisionPadding 8.
|
|
126
|
+
gap: selectRecipe.popover.sideOffset,
|
|
127
|
+
viewportPadding: selectRecipe.popover.collisionPadding,
|
|
123
128
|
matchAnchorWidth: true,
|
|
124
|
-
zIndex:
|
|
129
|
+
zIndex: layer.dropdown,
|
|
125
130
|
});
|
|
126
131
|
const setListboxRef = useCallback((node) => {
|
|
127
132
|
listboxRef.current = node;
|
|
@@ -339,7 +344,12 @@ function SelectInner(props, forwardedRef) {
|
|
|
339
344
|
color: "currentColor",
|
|
340
345
|
size: triggerLeadingSize,
|
|
341
346
|
});
|
|
342
|
-
return (_jsxs("div", { ref: rootRef, className: classNames("hjm-field hjm-select", fieldClassName),
|
|
347
|
+
return (_jsxs("div", { ref: rootRef, className: classNames("hjm-field hjm-select", fieldClassName),
|
|
348
|
+
// fieldRecipe.disabledScope fades label and trigger; the amount is selectRecipe.states,
|
|
349
|
+
// which Native already read (Web used the frame default 0.6 until 2026-10-06).
|
|
350
|
+
style: disabled
|
|
351
|
+
? { ...layoutStyle, "--hjm-field-disabled-opacity": selectRecipe.states.disabledOpacity }
|
|
352
|
+
: layoutStyle, "data-state": disabled ? "disabled" : error ? "invalid" : open ? "focused" : "idle", "data-size": size, "data-density": density, "data-async-state": asyncState.status, "data-busy": busy || undefined, children: [label !== undefined ? (_jsxs("label", { className: "hjm-field__label", htmlFor: controlId, children: [label, required ? _jsx("span", { "aria-hidden": "true", children: " *" }) : null] })) : null, _jsxs("div", { className: "hjm-select__anchor", children: [_jsxs("button", { ...buttonProps, ref: (node) => {
|
|
343
353
|
triggerRef.current = node;
|
|
344
354
|
if (typeof forwardedRef === "function")
|
|
345
355
|
forwardedRef(node);
|
package/dist/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,GAInB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GAIvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,YAAY,GAGb,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,GAOT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,cAAc,EACd,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AAmBrB,MAAM,iBAAiB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAoF/D,SAAS,WAAW,CAClB,KAAmC,EACnC,YAAmD;IAEnD,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,kBAAkB,EAClB,WAAW,EACX,KAAK,EACL,WAAW,EACX,mBAAmB,EACnB,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAC/B,YAAY,EACZ,sBAAsB,GAAG,sBAAsB,CAAC,sBAAsB,EACtE,IAAI,GAAG,sBAAsB,CAAC,IAAI,EAClC,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EACjC,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EACvC,KAAK,GAAG,OAAO,EACf,cAAc,EACd,eAAe,EACf,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,EAAE,EAAE,MAAM,EACV,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,WAAW,EAAE,eAAe,EAC5B,kBAAkB,EAClB,iBAAiB,EACjB,IAAI,EAAE,QAAQ,EACd,WAAW,GAAG,KAAK,EACnB,YAAY,EACZ,OAAO,EACP,OAAO,EACP,MAAM,EACN,SAAS,EACT,GAAG,WAAW,EACf,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAA4C,QAAQ,KAAK,SAAS;QAC5E,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE;QACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,EACL,kBAAkB,EAClB,QAAQ,CACT,CAAC;IACF,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACjG,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ;QAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACjB,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,EACrE,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,mBAAmB,GAAG,MAAM,CAAyC,IAAI,CAAC,CAAC;IACjF,IAAI,mBAAmB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzC,mBAAmB,CAAC,OAAO,GAAG;YAC5B,KAAK,EAAE,wBAAwB,CAC7B,MAAM,EACN,eAAe,IAAI,kBAAkB,IAAI,IAAI,EAC7C;gBACA,sBAAsB;gBACtB,UAAU;gBACV,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;aACtD,CACF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,oBAAoB,CAAa;QAC3E,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpE,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK;QAC/C,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,EAAE;QAChF,sBAAsB;QACtB,UAAU;QACV,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,wBAAwB,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,qBAAqB,EAAE,CAAC;YAChD,wBAAwB,CAAC,OAAO,GAAG,SAAS,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,iBAAiB,IAAI,SAAS,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC;QACzF,IAAI,wBAAwB,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO;QACvD,wBAAwB,CAAC,OAAO,GAAG,KAAK,CAAC;QACzC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC/D,MAAM,oBAAoB,GAAG,yBAAyB,CACpD,MAAM,EACN,qBAAqB,EACrB,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,EAAE,KAAK,qBAAqB;QACrE,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,QAAQ,KAAK,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IACtD,MAAM,qBAAqB,GAAG,MAAM,CAAsB,SAAS,CAAC,CAAC;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,qBAAqB,CAAC,OAAO,KAAK,IAAI;YAAE,qBAAqB,CAAC,OAAO,GAAG,SAAS,CAAC;IACxF,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,QAAiB,EAAE,MAA8B,EAAE,EAAE;QACpD,IAAI,QAAQ,KAAK,IAAI,IAAI,qBAAqB,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO;QAC5E,qBAAqB,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzC,IAAI,CAAC,cAAc;YAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;YAC/B,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,qBAAqB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC3C,qBAAqB,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,IAAI,cAAc,WAAW,EAAE,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,SAAS,UAAU,CAAC;IACzC,MAAM,aAAa,GAAG,GAAG,SAAS,cAAc,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,SAAS,QAAQ,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,EAAE,CAC5B,GAAG,SAAS,WAAW,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,EAA2C,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC;IACxF,MAAM,uBAAuB,GAAG,CAAC,sBAAsB,IAAI,WAAW,CAAC;IACvE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,qBAAqB,IAAI,CAAC,qBAAqB,CAAC,QAAQ;QAC/E,CAAC,CAAC,qBAAqB,CAAC,EAAE;QAC1B,CAAC,CAAC,qBAAqB,KAAK,IAAI,IAAI,uBAAuB;YACzD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IACzE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,gBAAgB,CACjB,CAAC;IACF,MAAM,eAAe,GAAG,WAAW,IAAI,cAAc,KAAK,iBAAiB;QACzE,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,cAAc,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,SAAS,GAAmC,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC5F,CAAC,CAAC,eAAe,CAAC,EAAE;QACpB,CAAC,CAAC,cAAc,KAAK,iBAAiB,IAAI,uBAAuB;YAC/D,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,cAAc,GAAG,SAAS,KAAK,iBAAiB;QACpD,CAAC,CAAC,GAAG,SAAS,eAAe;QAC7B,CAAC,CAAC,SAAS,KAAK,IAAI;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE;QAC9D,KAAK;QACL,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAA2B,EAAE,EAAE;QAChE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC5B,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;gBAChC,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW;YAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC/B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAE,EAAE;YAChD,IACE,KAAK,CAAC,MAAM,YAAY,IAAI;gBAC5B,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxC,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3C,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC5D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAC9E,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,CAAC,SAA2B,OAAO,EAAE,EAAE;QAC5D,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QACzC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ;YAC3D,CAAC,CAAC,gBAAgB,CAAC,EAAE;YACrB,CAAC,CAAC,qBAAqB,KAAK,IAAI,IAAI,uBAAuB;gBACzD,CAAC,CAAC,iBAAiB;gBACnB,sEAAsE;gBACtE,0EAA0E;gBAC1E,2EAA2E;gBAC3E,0EAA0E;gBAC1E,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,uBAAuB;oBAC7C,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QAC1E,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,MAA8C,EAAE,EAAE;QACvE,MAAM,WAAW,GAAG,SAAS;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;aAChC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,+EAA+E;QAC/E,8EAA8E;QAC9E,2EAA2E;QAC3E,iFAAiF;QACjF,kFAAkF;QAClF,+BAA+B;QAC/B,IAAI,uBAAuB,EAAE,CAAC;YAC5B,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YACD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,IAAI,QAAQ,KAAK,SAAS;wBAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACxD,OAAO;gBACT,CAAC;gBACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,IAAI,IAAI,IAAI,OAAO,KAAK,SAAS;wBAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBACD,0EAA0E;YAC5E,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACpD,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;oBACrC,OAAO;gBACT,CAAC;gBACD,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;oBACvD,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;oBACrC,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,6BAA6B,CAC1C,MAAM,EACN,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,MAAM,EACN,IAAI,CACL,CAAC;QACF,IAAI,MAAM,KAAK,SAAS;YAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,GAA4B,EAAE,EAAE;QAC9C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,uBAAuB;gBAAE,OAAO;YAC7D,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,IACE,CAAC,IAAI;YACL,IAAI,CAAC,QAAQ;YACb,QAAQ;YACR,IAAI;YACJ,QAAQ;YACR,UAAU,CAAC,MAAM,KAAK,SAAS;YAC/B,OAAO;QACT,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG;YACpD,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK;YAC5B,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChF,YAAY,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE;YACvD,cAAc,EAAE,SAAS,KAAK,iBAAiB;gBAC7C,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,SAAS,IAAI,qBAAqB;YACtC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI;gBAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,KAAuC,EAAE,EAAE;QAChE,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,gBAAgB,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QACnE,MAAM,gBAAgB,GAAG,6BAA6B,CACpD,KAAK,CAAC,GAAqB,CAC5B,CAAC;QACF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,cAAc,CACZ,gBAAgB,KAAK,UAAU,IAAI,gBAAgB,KAAK,MAAM;oBAC5D,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,OAAO,CACZ,CAAC;YACJ,CAAC;;gBACI,aAAa,CAAC,gBAAgB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI;gBAAE,cAAc,EAAE,CAAC;iBACvB,IAAI,SAAS,KAAK,IAAI;gBAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;YACvC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;aAAM,IACL,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YACtB,KAAK,CAAC,GAAG,KAAK,GAAG;YACjB,CAAC,KAAK,CAAC,MAAM;YACb,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,KAAK,CAAC,gBAAgB;YAAE,OAAO;QACnC,cAAc,CAAC,GAAG,EAAE;YAClB,IACE,IAAI;gBACJ,QAAQ,CAAC,aAAa,YAAY,IAAI;gBACtC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAClD,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACrD,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,MAAM,YAAY,GAAG,CAAC,IAA+B,EAAE,EAAE;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,KAAK,qBAAqB,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;QACrC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC,IAAI,EAAE;YAC1C,QAAQ;YACR,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;YAChC,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,OAAO,CACL,eAEE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI;oBAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;oBAC3C,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC,EACD,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EACrB,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,oBAAoB,mBACf,QAAQ,mBACR,IAAI,CAAC,QAAQ,IAAI,SAAS,gBAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,iBAC1D,MAAM,IAAI,SAAS,EAChC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC9C,WAAW,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,aAE7B,OAAO,CAAC,CAAC,CAAC,CACT,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAC5D,OAAO,GACH,CACR,CAAC,CAAC,CAAC,IAAI,EACR,gBAAM,SAAS,EAAC,yBAAyB,aACvC,yBAAO,IAAI,CAAC,KAAK,GAAQ,EACxB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,eAAM,SAAS,EAAC,gCAAgC,YAAE,IAAI,CAAC,WAAW,GAAQ,CAC3E,CAAC,CAAC,CAAC,IAAI,IACH,EACN,QAAQ,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,mBAAmB,iBAAa,MAAM,uBAAS,CAAC,CAAC,CAAC,IAAI,KA7B7E,IAAI,CAAC,EAAE,CA8BR,CACP,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,aAAa,EAAE,CAAC,oBAAoB,EAAE;QAC3D,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,kBAAkB;KACzB,CAAC,CAAC;IAEH,OAAO,CACL,eACE,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE,cAAc,CAAC,gBACjD,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,eACtE,IAAI,kBACD,OAAO,sBACH,UAAU,CAAC,MAAM,eACxB,IAAI,IAAI,SAAS,aAE3B,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,iBAAO,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,SAAS,aACnD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,8BAAkB,MAAM,mBAAU,CAAC,CAAC,CAAC,IAAI,IACtD,CACT,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,oBAAoB,aACjC,qBACM,WAAW,EACf,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;4BACZ,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;4BAC1B,IAAI,OAAO,YAAY,KAAK,UAAU;gCAAE,YAAY,CAAC,IAAI,CAAC,CAAC;iCACtD,IAAI,YAAY;gCAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;wBACrD,CAAC,EACD,EAAE,EAAE,SAAS,EACb,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,SAAS,EAAE,UAAU,CAAC,wCAAwC,EAAE,SAAS,CAAC,EAC1E,QAAQ,EAAE,QAAQ,mBACH,IAAI,IAAI,SAAS,gBACpB,kBAAkB,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,mBACtE,SAAS,mBACR,IAAI,mBACJ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,2BACpB,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,eAC7C,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,IAAI,SAAS,eAC3F,IAAI,IAAI,SAAS,kBACd,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,sBACpB,WAAW,mBACd,QAAQ,IAAI,SAAS,mBACrB,QAAQ,IAAI,SAAS,EACpC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4BACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;4BACjB,IAAI,KAAK,CAAC,gBAAgB,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;gCAAE,OAAO;4BACnE,IAAI,IAAI;gCAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;;gCAClC,cAAc,EAAE,CAAC;wBACxB,CAAC,aAEA,cAAc,CAAC,CAAC,CAAC,CAChB,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,YACrD,cAAc,GACV,CACR,CAAC,CAAC,CAAC,IAAI,EACR,eACE,SAAS,EAAC,mBAAmB,gBACjB,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,YAE5D,oBAAoB,EAAE,KAAK,IAAI,WAAW,GACtC,EACN,IAAI,CAAC,CAAC,CAAC,CACN,eAAM,SAAS,EAAC,0BAA0B,iBAAa,MAAM,YAAC,eAAM,SAAS,EAAC,4BAA4B,GAAG,GAAO,CACrH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,uBAAuB,iBAAa,MAAM,uBAAS,CACpE,IACM,EACR,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,cAAc,IACb,SAAS,EAAE,UAAU,EACrB,WAAW,EAAC,QAAQ,KAChB,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,YAEzE,eACE,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,SAAS,EACb,IAAI,EAAC,SAAS,gBACF,cAAc,EAC1B,SAAS,EAAC,qBAAqB,kBACjB,OAAO,oBACL,aAAa,CAAC,SAAS,gBAC3B,aAAa,CAAC,KAAK,EAC/B,KAAK,EAAE,aAAa,CAAC,KAAK,aAE3B,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAC9B,cACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,YAEvD,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,qBAAqB,YAAE,UAAU,CAAC,OAAO,GAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,GAC5J,CACP,CAAC,CAAC,CAAC,IAAI,EAKP,CAAC,sBAAsB,IAAI,WAAW,CAAC,CAAC,CAAC,CACxC,cACE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;wCACZ,IAAI,IAAI;4CAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;;4CACrD,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;oCACpD,CAAC,EACD,EAAE,EAAE,GAAG,SAAS,eAAe,EAC/B,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8CAA8C,mBACzC,qBAAqB,KAAK,IAAI,gBACjC,qBAAqB,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,iBACnD,SAAS,KAAK,iBAAiB,IAAI,SAAS,EACzD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC9C,WAAW,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EACvD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAEvC,mBAAmB,GAChB,CACP,CAAC,CAAC,CAAC,IAAI,EACP,WAAW,CAAC,CAAC,CAAC,CACb,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;oCAChD,MAAM,cAAc,GAAG,GAAG,SAAS,YAAY,OAAO,CAAC,EAAE,EAAE,CAAC;oCAC5D,OAAO,CACL,eAEE,IAAI,EAAC,OAAO,qBACK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,gBAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAClE,SAAS,EAAC,qBAAqB,aAE9B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,cAAK,EAAE,EAAE,cAAc,EAAE,SAAS,EAAC,2BAA2B,YAC3D,OAAO,CAAC,KAAK,GACV,CACP,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAX3B,OAAO,CAAC,EAAE,CAYX,CACP,CAAC;gCACJ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CACpC,CAAC,CAAC,CAAC,IAAI,IACF,GACS,CAClB,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACvB,cAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAC,wBAAwB,YAAE,WAAW,GAAO,CAC/E,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,CAAC,CAAC,CAAC,cAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAO,CAAC,CAAC,CAAC,IAAI,EAC3E,IAAI,CAAC,CAAC,CAAC,gBAAO,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,IAAI,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,IAClF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAKpB,CAAC","sourcesContent":["import {\n getCollectionNavigationIntent,\n getCollectionNavigationTarget,\n getCollectionTypeaheadMatch,\n reconcileSelectSelection,\n resolveCollectionItem,\n resolveSelectSelectedItem,\n validateCollection,\n type SelectCollectionSectionDescriptor,\n type SelectCollectionSource,\n type SelectOpenChangeReason,\n} from \"@hjmds/design-contracts/components/collection\";\nimport {\n resolveControlAccessibleName,\n selectBehaviorDefaults,\n type AsyncCollectionState,\n type SelectItemDescriptor,\n type WebKeyboardKey,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n selectRecipe,\n type SelectDensity,\n type SelectSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type FocusEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport {\n AnchoredPortal,\n useAnchoredPopup,\n type AnchoredPopupAlign,\n} from \"./portal.js\";\n\nexport type SelectItem<Key extends string = string> = SelectItemDescriptor<Key>;\nexport type SelectSection<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectCollectionSectionDescriptor<Key, SectionKey>;\n\nexport type SelectLeadingRenderProps = Readonly<{\n color: \"currentColor\";\n size: number;\n}>;\n\nexport type SelectOptionLeadingRenderProps = SelectLeadingRenderProps & Readonly<{\n selected: boolean;\n highlighted: boolean;\n disabled: boolean;\n}>;\n\nconst emptySelectionKey = Symbol(\"hjm-select-empty-selection\");\ntype SelectHighlightKey<Key extends string> = Key | typeof emptySelectionKey;\n\ntype SelectSourceProps<Key extends string, SectionKey extends string> =\n SelectCollectionSource<Key, SectionKey>;\n\ntype SelectSelectionProps<Key extends string> =\n | Readonly<{\n selectedKey: Key | null;\n defaultSelectedKey?: never;\n onSelectionChange(key: Key | null): void;\n }>\n | Readonly<{\n selectedKey?: never;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n }>;\n\ntype SelectOpenProps =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange(open: boolean, reason: SelectOpenChangeReason): void;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, reason: SelectOpenChangeReason) => void;\n }>;\n\ntype SelectLabelProps =\n | Readonly<{ label: string; accessibilityLabel?: string }>\n | Readonly<{ label?: never; accessibilityLabel: string }>;\n\ntype SelectBaseProps<Key extends string> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"aria-label\"\n | \"children\"\n | \"defaultValue\"\n | \"onChange\"\n | \"role\"\n | \"value\"\n> &\n Readonly<{\n description?: ReactNode;\n error?: ReactNode;\n /** Localized text shown when no item is selected. */\n placeholder: string;\n /** Localized label for the nullable empty-selection option. */\n emptySelectionLabel: string;\n asyncState?: AsyncCollectionState;\n selectedItem?: SelectItemDescriptor<Key>;\n disallowEmptySelection?: boolean;\n loop?: boolean;\n /** Locks interaction without removing the trigger from the focus order. */\n busy?: boolean;\n readOnly?: boolean;\n required?: boolean;\n size?: SelectSize;\n density?: SelectDensity;\n /** Logical listbox alignment against the trigger; automatically mirrors in RTL. */\n align?: AnchoredPopupAlign;\n fieldClassName?: string;\n portalContainer?: HTMLElement;\n locale?: string | readonly string[];\n renderLeading?: (\n item: SelectItemDescriptor<Key> | null,\n appearance: SelectLeadingRenderProps,\n ) => ReactNode;\n renderOptionLeading?: (\n item: SelectItemDescriptor<Key>,\n appearance: SelectOptionLeadingRenderProps,\n ) => ReactNode;\n }>;\n\nexport type SelectProps<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectBaseProps<Key> &\n SelectSourceProps<Key, SectionKey> &\n SelectSelectionProps<Key> &\n SelectOpenProps &\n SelectLabelProps;\n\nfunction SelectInner<Key extends string, SectionKey extends string>(\n props: SelectProps<Key, SectionKey>,\n forwardedRef: React.ForwardedRef<HTMLButtonElement>,\n) {\n const {\n items,\n sections,\n label,\n accessibilityLabel,\n description,\n error,\n placeholder,\n emptySelectionLabel,\n asyncState = { status: \"idle\" },\n selectedItem,\n disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection,\n loop = selectBehaviorDefaults.loop,\n busy = false,\n readOnly = false,\n size = selectRecipe.defaults.size,\n density = selectRecipe.defaults.density,\n align = \"start\",\n fieldClassName,\n portalContainer,\n locale,\n renderLeading,\n renderOptionLeading,\n className,\n id: idProp,\n name,\n disabled = false,\n required = false,\n selectedKey: selectedKeyProp,\n defaultSelectedKey,\n onSelectionChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onClick,\n onFocus,\n onBlur,\n onKeyDown,\n ...buttonProps\n } = props;\n const source: SelectCollectionSource<Key, SectionKey> = sections === undefined\n ? { items: items ?? [] }\n : { sections };\n validateCollection(source);\n const accessibleName = resolveControlAccessibleName(\n label,\n accessibilityLabel,\n \"Select\",\n );\n if (placeholder.trim().length === 0) throw new TypeError(\"Select placeholder must not be empty\");\n if (emptySelectionLabel.trim().length === 0) {\n throw new TypeError(\"Select emptySelectionLabel must not be empty\");\n }\n const flatItems = source.sections\n ? source.sections.flatMap((section) => section.items)\n : source.items;\n if (\n flatItems.length === 0 &&\n (asyncState.status === \"idle\" || asyncState.status === \"loadingMore\")\n ) {\n throw new TypeError(\"Select requires options unless its async state is transient or empty\");\n }\n const initialSelectionRef = useRef<Readonly<{ value: Key | null }> | null>(null);\n if (initialSelectionRef.current === null) {\n initialSelectionRef.current = {\n value: reconcileSelectSelection(\n source,\n selectedKeyProp ?? defaultSelectedKey ?? null,\n {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n },\n ),\n };\n }\n const [storedSelectedKey, setSelectedKey] = useControllableState<Key | null>({\n ...(selectedKeyProp === undefined ? {} : { value: selectedKeyProp }),\n defaultValue: initialSelectionRef.current.value,\n ...(onSelectionChange === undefined ? {} : { onChange: onSelectionChange }),\n });\n const reconciledSelectedKey = reconcileSelectSelection(source, storedSelectedKey, {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n });\n const reconciliationRequestRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (storedSelectedKey === reconciledSelectedKey) {\n reconciliationRequestRef.current = undefined;\n return;\n }\n const token = `${storedSelectedKey ?? \"<empty>\"}->${reconciledSelectedKey ?? \"<empty>\"}`;\n if (reconciliationRequestRef.current === token) return;\n reconciliationRequestRef.current = token;\n setSelectedKey(reconciledSelectedKey);\n }, [reconciledSelectedKey, setSelectedKey, storedSelectedKey]);\n const resolvedSelectedItem = resolveSelectSelectedItem(\n source,\n reconciledSelectedKey,\n selectedItem !== undefined && selectedItem.id === reconciledSelectedKey\n ? selectedItem\n : undefined,\n );\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp : internalOpen;\n const pendingOpenRequestRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (pendingOpenRequestRef.current === open) pendingOpenRequestRef.current = undefined;\n }, [open]);\n const changeOpen = useCallback(\n (nextOpen: boolean, reason: SelectOpenChangeReason) => {\n if (nextOpen === open || pendingOpenRequestRef.current === nextOpen) return;\n pendingOpenRequestRef.current = nextOpen;\n if (!openControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen, reason);\n if (openControlled && nextOpen) {\n queueMicrotask(() => {\n if (pendingOpenRequestRef.current === true) {\n pendingOpenRequestRef.current = undefined;\n }\n });\n }\n },\n [onOpenChange, open, openControlled],\n );\n\n const generatedId = useId().replaceAll(\":\", \"\");\n const controlId = idProp ?? `hjm-select-${generatedId}`;\n const listboxId = `${controlId}-listbox`;\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const optionId = (key: Key) =>\n `${controlId}-option-${flatItems.findIndex((item) => item.id === key)}`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const listboxRef = useRef<HTMLDivElement | null>(null);\n const [listboxNode, setListboxNode] = useState<HTMLDivElement | null>(null);\n const optionRefs = useRef(new Map<SelectHighlightKey<Key>, HTMLDivElement>());\n const typeaheadRef = useRef({ value: \"\", time: 0 });\n const restoreFocusRef = useRef(false);\n const showOptions = asyncState.status === \"idle\" || asyncState.status === \"loadingMore\";\n const emptySelectionAvailable = !disallowEmptySelection && showOptions;\n const selectionItemInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const initialHighlight = selectionItemInSource && !selectionItemInSource.disabled\n ? selectionItemInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, \"first\", loop) ?? null;\n const [highlightedKey, setHighlightedKey] = useState<SelectHighlightKey<Key> | null>(\n initialHighlight,\n );\n const highlightedItem = showOptions && highlightedKey !== emptySelectionKey\n ? resolveCollectionItem(source, highlightedKey)\n : null;\n const activeKey: SelectHighlightKey<Key> | null = highlightedItem && !highlightedItem.disabled\n ? highlightedItem.id\n : highlightedKey === emptySelectionKey && emptySelectionAvailable\n ? emptySelectionKey\n : null;\n const activeOptionId = activeKey === emptySelectionKey\n ? `${controlId}-option-empty`\n : activeKey === null\n ? undefined\n : optionId(activeKey);\n const popupPosition = useAnchoredPopup(triggerRef, listboxNode, {\n align,\n matchAnchorWidth: true,\n zIndex: 800,\n });\n const setListboxRef = useCallback((node: HTMLDivElement | null) => {\n listboxRef.current = node;\n setListboxNode(node);\n }, []);\n\n useEffect(() => {\n if (!open) {\n if (restoreFocusRef.current) {\n restoreFocusRef.current = false;\n queueMicrotask(() => triggerRef.current?.focus());\n }\n return;\n }\n if (activeKey === null && showOptions) setHighlightedKey(initialHighlight);\n }, [activeKey, initialHighlight, open, showOptions]);\n useEffect(() => {\n if (open && activeKey !== null) {\n optionRefs.current.get(activeKey)?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeKey, open]);\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (\n event.target instanceof Node &&\n !rootRef.current?.contains(event.target) &&\n !listboxRef.current?.contains(event.target)\n ) {\n changeOpen(false, \"outside\");\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [changeOpen, open]);\n\n const openWithIntent = (intent: \"first\" | \"last\" = \"first\") => {\n if (disabled || busy || readOnly) return;\n const selectedInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const target = selectedInSource && !selectedInSource.disabled\n ? selectedInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n // The empty-selection entry renders first in the listbox, so only the\n // \"first\" intent (Home/ArrowDown on a closed trigger) lands on it; \"last\"\n // (End/ArrowUp) must reach the last real option. The previous mapping sent\n // \"last\" to the empty entry, which contradicted DOM order. See issue #18.\n : intent === \"first\" && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, intent, loop) ?? null;\n setHighlightedKey(target);\n changeOpen(true, \"keyboard\");\n };\n const moveHighlight = (intent: \"next\" | \"previous\" | \"first\" | \"last\") => {\n const enabledKeys = flatItems\n .filter((item) => !item.disabled)\n .map((item) => item.id);\n const firstKey = enabledKeys[0];\n const lastKey = enabledKeys.at(-1);\n // Treat the empty-selection entry as the first row, matching DOM order. `loop`\n // only joins the two ends of the list: moving between the empty entry and the\n // first option is adjacency, not a wrap, so it stays loop-independent. The\n // previous code gated that \"next\" on `loop`, which trapped the arrow keys on the\n // empty entry for every Select using the defaults (disallowEmptySelection: false,\n // loop: false). See issue #18.\n if (emptySelectionAvailable) {\n if (intent === \"first\") {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (activeKey === emptySelectionKey) {\n if (intent === \"next\") {\n if (firstKey !== undefined) setHighlightedKey(firstKey);\n return;\n }\n if (intent === \"previous\") {\n if (loop && lastKey !== undefined) setHighlightedKey(lastKey);\n return;\n }\n // intent === \"last\" falls through: the shared path picks the last option.\n } else {\n if (intent === \"previous\" && activeKey === firstKey) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (intent === \"next\" && activeKey === lastKey && loop) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n }\n }\n const target = getCollectionNavigationTarget(\n source,\n activeKey === emptySelectionKey ? null : activeKey,\n intent,\n loop,\n );\n if (target !== undefined) setHighlightedKey(target);\n };\n const commit = (key: SelectHighlightKey<Key>) => {\n if (key === emptySelectionKey) {\n if (disabled || readOnly || !emptySelectionAvailable) return;\n setSelectedKey(null);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n return;\n }\n const item = resolveCollectionItem(source, key);\n if (\n !item ||\n item.disabled ||\n disabled ||\n busy ||\n readOnly ||\n asyncState.status === \"loading\"\n ) return;\n setSelectedKey(key);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n };\n const runTypeahead = (key: string) => {\n const now = Date.now();\n const previous = now - typeaheadRef.current.time < 500\n ? typeaheadRef.current.value\n : \"\";\n const combined = `${previous}${key}`;\n const query = new Set(combined.toLocaleLowerCase()).size === 1 ? key : combined;\n typeaheadRef.current = { value: combined, time: now };\n const match = getCollectionTypeaheadMatch(source, query, {\n startsAfterKey: activeKey === emptySelectionKey\n ? reconciledSelectedKey\n : activeKey ?? reconciledSelectedKey,\n ...(locale === undefined ? {} : { locale }),\n });\n if (match !== undefined) {\n setHighlightedKey(match);\n if (!open) changeOpen(true, \"keyboard\");\n }\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n const navigationIntent = getCollectionNavigationIntent(\n event.key as WebKeyboardKey,\n );\n if (navigationIntent !== undefined) {\n event.preventDefault();\n if (!open) {\n openWithIntent(\n navigationIntent === \"previous\" || navigationIntent === \"last\"\n ? \"last\"\n : \"first\",\n );\n }\n else moveHighlight(navigationIntent);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (!open) openWithIntent();\n else if (activeKey !== null) commit(activeKey);\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n restoreFocusRef.current = true;\n changeOpen(false, \"escape\");\n } else if (event.key === \"Tab\" && open) {\n changeOpen(false, \"blur\");\n } else if (\n event.key.length === 1 &&\n event.key !== \" \" &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n event.preventDefault();\n runTypeahead(event.key);\n }\n };\n const handleBlur = (event: FocusEvent<HTMLButtonElement>) => {\n onBlur?.(event);\n if (event.defaultPrevented) return;\n queueMicrotask(() => {\n if (\n open &&\n document.activeElement instanceof Node &&\n !rootRef.current?.contains(document.activeElement) &&\n !listboxRef.current?.contains(document.activeElement)\n ) changeOpen(false, \"blur\");\n });\n };\n const describedBy = error ? errorId : description ? descriptionId : undefined;\n\n const renderOption = (item: SelectItemDescriptor<Key>) => {\n const selected = item.id === reconciledSelectedKey;\n const active = item.id === activeKey;\n const leadingSize = iconRecipe.sizes[selectRecipe.optionLeading.glyph];\n const leading = renderOptionLeading?.(item, {\n selected,\n highlighted: active,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n });\n return (\n <div\n key={item.id}\n ref={(node) => {\n if (node) optionRefs.current.set(item.id, node);\n else optionRefs.current.delete(item.id);\n }}\n id={optionId(item.id)}\n role=\"option\"\n className=\"hjm-select__option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n data-state={item.disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"}\n data-active={active || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!item.disabled) setHighlightedKey(item.id);\n }}\n onClick={() => commit(item.id)}\n >\n {leading ? (\n <span className=\"hjm-select__option-leading\" aria-hidden=\"true\">\n {leading}\n </span>\n ) : null}\n <span className=\"hjm-select__option-copy\">\n <span>{item.label}</span>\n {item.description ? (\n <span className=\"hjm-select__option-description\">{item.description}</span>\n ) : null}\n </span>\n {selected ? <span className=\"hjm-select__check\" aria-hidden=\"true\">✓</span> : null}\n </div>\n );\n };\n\n const triggerLeadingSize = iconRecipe.sizes[selectRecipe.sizes[size].glyph];\n const triggerLeading = renderLeading?.(resolvedSelectedItem, {\n color: \"currentColor\",\n size: triggerLeadingSize,\n });\n\n return (\n <div\n ref={rootRef}\n className={classNames(\"hjm-field hjm-select\", fieldClassName)}\n data-state={disabled ? \"disabled\" : error ? \"invalid\" : open ? \"focused\" : \"idle\"}\n data-size={size}\n data-density={density}\n data-async-state={asyncState.status}\n data-busy={busy || undefined}\n >\n {label !== undefined ? (\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}{required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n ) : null}\n <div className=\"hjm-select__anchor\">\n <button\n {...buttonProps}\n ref={(node) => {\n triggerRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n }}\n id={controlId}\n type=\"button\"\n role=\"combobox\"\n className={classNames(\"hjm-field__control hjm-select__trigger\", className)}\n disabled={disabled}\n aria-disabled={busy || undefined}\n aria-label={accessibilityLabel ?? (label === undefined ? accessibleName : undefined)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open ? activeOptionId : undefined}\n aria-busy={busy || asyncState.status === \"loading\" || asyncState.status === \"loadingMore\" || undefined}\n data-busy={busy || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy}\n aria-readonly={readOnly || undefined}\n aria-required={required || undefined}\n onFocus={onFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n if (open) changeOpen(false, \"trigger\");\n else openWithIntent();\n }}\n >\n {triggerLeading ? (\n <span className=\"hjm-select__leading\" aria-hidden=\"true\">\n {triggerLeading}\n </span>\n ) : null}\n <span\n className=\"hjm-select__value\"\n data-state={resolvedSelectedItem ? \"selected\" : \"placeholder\"}\n >\n {resolvedSelectedItem?.label ?? placeholder}\n </span>\n {busy ? (\n <span className=\"hjm-select__busy-overlay\" aria-hidden=\"true\"><span className=\"hjm-select__busy-indicator\" /></span>\n ) : (\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n )}\n </button>\n {open ? (\n <AnchoredPortal\n anchorRef={triggerRef}\n ssrFallback=\"inline\"\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <div\n ref={setListboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={accessibleName}\n className=\"hjm-select__listbox\"\n data-density={density}\n data-placement={popupPosition.placement}\n data-align={popupPosition.align}\n style={popupPosition.style}\n >\n {asyncState.status !== \"idle\" ? (\n <div\n className=\"hjm-select__message\"\n role={asyncState.status === \"error\" ? \"alert\" : \"status\"}\n >\n {asyncState.status === \"loading\" || asyncState.status === \"loadingMore\" ? <span className=\"hjm-visually-hidden\">{asyncState.message}</span> : asyncState.message}\n </div>\n ) : null}\n {/* Rendered before the options: with no selection the active descendant\n starts on this entry, and a trailing position made that starting point\n the bottom of the list, where ArrowDown has nowhere to go (issue #18).\n moveHighlight follows this DOM order. */}\n {!disallowEmptySelection && showOptions ? (\n <div\n ref={(node) => {\n if (node) optionRefs.current.set(emptySelectionKey, node);\n else optionRefs.current.delete(emptySelectionKey);\n }}\n id={`${controlId}-option-empty`}\n role=\"option\"\n className=\"hjm-select__option hjm-select__option--empty\"\n aria-selected={reconciledSelectedKey === null}\n data-state={reconciledSelectedKey === null ? \"selected\" : \"idle\"}\n data-active={activeKey === emptySelectionKey || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => setHighlightedKey(emptySelectionKey)}\n onClick={() => commit(emptySelectionKey)}\n >\n {emptySelectionLabel}\n </div>\n ) : null}\n {showOptions ? (\n source.sections ? source.sections.map((section) => {\n const sectionLabelId = `${controlId}-section-${section.id}`;\n return (\n <div\n key={section.id}\n role=\"group\"\n aria-labelledby={section.label ? sectionLabelId : undefined}\n aria-label={section.label ? undefined : section.accessibilityLabel}\n className=\"hjm-select__section\"\n >\n {section.label ? (\n <div id={sectionLabelId} className=\"hjm-select__section-label\">\n {section.label}\n </div>\n ) : null}\n {section.items.map(renderOption)}\n </div>\n );\n }) : source.items.map(renderOption)\n ) : null}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n {description && !error ? (\n <div id={descriptionId} className=\"hjm-field__description\">{description}</div>\n ) : null}\n {error ? <div id={errorId} className=\"hjm-field__error\">{error}</div> : null}\n {name ? <input type=\"hidden\" name={name} value={reconciledSelectedKey ?? \"\"} /> : null}\n </div>\n );\n}\n\nexport const Select = forwardRef(SelectInner) as <\n Key extends string = string,\n SectionKey extends string = string,\n>(\n props: SelectProps<Key, SectionKey> & RefAttributes<HTMLButtonElement>,\n) => ReactElement | null;\n"]}
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n getCollectionNavigationIntent,\n getCollectionNavigationTarget,\n getCollectionTypeaheadMatch,\n reconcileSelectSelection,\n resolveCollectionItem,\n resolveSelectSelectedItem,\n validateCollection,\n type SelectCollectionSectionDescriptor,\n type SelectCollectionSource,\n type SelectOpenChangeReason,\n} from \"@hjmds/design-contracts/components/collection\";\nimport {\n resolveControlAccessibleName,\n selectBehaviorDefaults,\n type AsyncCollectionState,\n type SelectItemDescriptor,\n type WebKeyboardKey,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n selectRecipe,\n type SelectDensity,\n type SelectSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport {\n AnchoredPortal,\n useAnchoredPopup,\n type AnchoredPopupAlign,\n} from \"./portal.js\";\n\nexport type SelectItem<Key extends string = string> = SelectItemDescriptor<Key>;\nexport type SelectSection<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectCollectionSectionDescriptor<Key, SectionKey>;\n\nexport type SelectLeadingRenderProps = Readonly<{\n color: \"currentColor\";\n size: number;\n}>;\n\nexport type SelectOptionLeadingRenderProps = SelectLeadingRenderProps & Readonly<{\n selected: boolean;\n highlighted: boolean;\n disabled: boolean;\n}>;\n\nconst emptySelectionKey = Symbol(\"hjm-select-empty-selection\");\ntype SelectHighlightKey<Key extends string> = Key | typeof emptySelectionKey;\n\ntype SelectSourceProps<Key extends string, SectionKey extends string> =\n SelectCollectionSource<Key, SectionKey>;\n\ntype SelectSelectionProps<Key extends string> =\n | Readonly<{\n selectedKey: Key | null;\n defaultSelectedKey?: never;\n onSelectionChange(key: Key | null): void;\n }>\n | Readonly<{\n selectedKey?: never;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n }>;\n\ntype SelectOpenProps =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange(open: boolean, reason: SelectOpenChangeReason): void;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, reason: SelectOpenChangeReason) => void;\n }>;\n\ntype SelectLabelProps =\n | Readonly<{ label: string; accessibilityLabel?: string }>\n | Readonly<{ label?: never; accessibilityLabel: string }>;\n\ntype SelectBaseProps<Key extends string> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"aria-label\"\n | \"children\"\n | \"defaultValue\"\n | \"onChange\"\n | \"role\"\n | \"value\"\n> &\n Readonly<{\n description?: ReactNode;\n error?: ReactNode;\n /** Localized text shown when no item is selected. */\n placeholder: string;\n /** Localized label for the nullable empty-selection option. */\n emptySelectionLabel: string;\n asyncState?: AsyncCollectionState;\n selectedItem?: SelectItemDescriptor<Key>;\n disallowEmptySelection?: boolean;\n loop?: boolean;\n /** Locks interaction without removing the trigger from the focus order. */\n busy?: boolean;\n readOnly?: boolean;\n required?: boolean;\n size?: SelectSize;\n density?: SelectDensity;\n /** Logical listbox alignment against the trigger; automatically mirrors in RTL. */\n align?: AnchoredPopupAlign;\n fieldClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the trigger button, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n portalContainer?: HTMLElement;\n locale?: string | readonly string[];\n renderLeading?: (\n item: SelectItemDescriptor<Key> | null,\n appearance: SelectLeadingRenderProps,\n ) => ReactNode;\n renderOptionLeading?: (\n item: SelectItemDescriptor<Key>,\n appearance: SelectOptionLeadingRenderProps,\n ) => ReactNode;\n }>;\n\nexport type SelectProps<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectBaseProps<Key> &\n SelectSourceProps<Key, SectionKey> &\n SelectSelectionProps<Key> &\n SelectOpenProps &\n SelectLabelProps;\n\nfunction SelectInner<Key extends string, SectionKey extends string>(\n props: SelectProps<Key, SectionKey>,\n forwardedRef: React.ForwardedRef<HTMLButtonElement>,\n) {\n const {\n items,\n sections,\n label,\n accessibilityLabel,\n description,\n error,\n placeholder,\n emptySelectionLabel,\n asyncState = { status: \"idle\" },\n selectedItem,\n disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection,\n loop = selectBehaviorDefaults.loop,\n busy = false,\n readOnly = false,\n size = selectRecipe.defaults.size,\n density = selectRecipe.defaults.density,\n align = \"start\",\n fieldClassName,\n layoutStyle,\n portalContainer,\n locale,\n renderLeading,\n renderOptionLeading,\n className,\n id: idProp,\n name,\n disabled = false,\n required = false,\n selectedKey: selectedKeyProp,\n defaultSelectedKey,\n onSelectionChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onClick,\n onFocus,\n onBlur,\n onKeyDown,\n ...buttonProps\n } = props;\n const source: SelectCollectionSource<Key, SectionKey> = sections === undefined\n ? { items: items ?? [] }\n : { sections };\n validateCollection(source);\n const accessibleName = resolveControlAccessibleName(\n label,\n accessibilityLabel,\n \"Select\",\n );\n if (placeholder.trim().length === 0) throw new TypeError(\"Select placeholder must not be empty\");\n if (emptySelectionLabel.trim().length === 0) {\n throw new TypeError(\"Select emptySelectionLabel must not be empty\");\n }\n const flatItems = source.sections\n ? source.sections.flatMap((section) => section.items)\n : source.items;\n if (\n flatItems.length === 0 &&\n (asyncState.status === \"idle\" || asyncState.status === \"loadingMore\")\n ) {\n throw new TypeError(\"Select requires options unless its async state is transient or empty\");\n }\n const initialSelectionRef = useRef<Readonly<{ value: Key | null }> | null>(null);\n if (initialSelectionRef.current === null) {\n initialSelectionRef.current = {\n value: reconcileSelectSelection(\n source,\n selectedKeyProp ?? defaultSelectedKey ?? null,\n {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n },\n ),\n };\n }\n const [storedSelectedKey, setSelectedKey] = useControllableState<Key | null>({\n ...(selectedKeyProp === undefined ? {} : { value: selectedKeyProp }),\n defaultValue: initialSelectionRef.current.value,\n ...(onSelectionChange === undefined ? {} : { onChange: onSelectionChange }),\n });\n const reconciledSelectedKey = reconcileSelectSelection(source, storedSelectedKey, {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n });\n const reconciliationRequestRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (storedSelectedKey === reconciledSelectedKey) {\n reconciliationRequestRef.current = undefined;\n return;\n }\n const token = `${storedSelectedKey ?? \"<empty>\"}->${reconciledSelectedKey ?? \"<empty>\"}`;\n if (reconciliationRequestRef.current === token) return;\n reconciliationRequestRef.current = token;\n setSelectedKey(reconciledSelectedKey);\n }, [reconciledSelectedKey, setSelectedKey, storedSelectedKey]);\n const resolvedSelectedItem = resolveSelectSelectedItem(\n source,\n reconciledSelectedKey,\n selectedItem !== undefined && selectedItem.id === reconciledSelectedKey\n ? selectedItem\n : undefined,\n );\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp : internalOpen;\n const pendingOpenRequestRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (pendingOpenRequestRef.current === open) pendingOpenRequestRef.current = undefined;\n }, [open]);\n const changeOpen = useCallback(\n (nextOpen: boolean, reason: SelectOpenChangeReason) => {\n if (nextOpen === open || pendingOpenRequestRef.current === nextOpen) return;\n pendingOpenRequestRef.current = nextOpen;\n if (!openControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen, reason);\n if (openControlled && nextOpen) {\n queueMicrotask(() => {\n if (pendingOpenRequestRef.current === true) {\n pendingOpenRequestRef.current = undefined;\n }\n });\n }\n },\n [onOpenChange, open, openControlled],\n );\n\n const generatedId = useId().replaceAll(\":\", \"\");\n const controlId = idProp ?? `hjm-select-${generatedId}`;\n const listboxId = `${controlId}-listbox`;\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const optionId = (key: Key) =>\n `${controlId}-option-${flatItems.findIndex((item) => item.id === key)}`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const listboxRef = useRef<HTMLDivElement | null>(null);\n const [listboxNode, setListboxNode] = useState<HTMLDivElement | null>(null);\n const optionRefs = useRef(new Map<SelectHighlightKey<Key>, HTMLDivElement>());\n const typeaheadRef = useRef({ value: \"\", time: 0 });\n const restoreFocusRef = useRef(false);\n const showOptions = asyncState.status === \"idle\" || asyncState.status === \"loadingMore\";\n const emptySelectionAvailable = !disallowEmptySelection && showOptions;\n const selectionItemInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const initialHighlight = selectionItemInSource && !selectionItemInSource.disabled\n ? selectionItemInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, \"first\", loop) ?? null;\n const [highlightedKey, setHighlightedKey] = useState<SelectHighlightKey<Key> | null>(\n initialHighlight,\n );\n const highlightedItem = showOptions && highlightedKey !== emptySelectionKey\n ? resolveCollectionItem(source, highlightedKey)\n : null;\n const activeKey: SelectHighlightKey<Key> | null = highlightedItem && !highlightedItem.disabled\n ? highlightedItem.id\n : highlightedKey === emptySelectionKey && emptySelectionAvailable\n ? emptySelectionKey\n : null;\n const activeOptionId = activeKey === emptySelectionKey\n ? `${controlId}-option-empty`\n : activeKey === null\n ? undefined\n : optionId(activeKey);\n const popupPosition = useAnchoredPopup(triggerRef, listboxNode, {\n align,\n // Offset and edge padding come from selectRecipe.popover (2026-10-06 follow-up); the helper\n // default edge padding 16 disagreed with the recipe's collisionPadding 8.\n gap: selectRecipe.popover.sideOffset,\n viewportPadding: selectRecipe.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\n useEffect(() => {\n if (!open) {\n if (restoreFocusRef.current) {\n restoreFocusRef.current = false;\n queueMicrotask(() => triggerRef.current?.focus());\n }\n return;\n }\n if (activeKey === null && showOptions) setHighlightedKey(initialHighlight);\n }, [activeKey, initialHighlight, open, showOptions]);\n useEffect(() => {\n if (open && activeKey !== null) {\n optionRefs.current.get(activeKey)?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeKey, open]);\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (\n event.target instanceof Node &&\n !rootRef.current?.contains(event.target) &&\n !listboxRef.current?.contains(event.target)\n ) {\n changeOpen(false, \"outside\");\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [changeOpen, open]);\n\n const openWithIntent = (intent: \"first\" | \"last\" = \"first\") => {\n if (disabled || busy || readOnly) return;\n const selectedInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const target = selectedInSource && !selectedInSource.disabled\n ? selectedInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n // The empty-selection entry renders first in the listbox, so only the\n // \"first\" intent (Home/ArrowDown on a closed trigger) lands on it; \"last\"\n // (End/ArrowUp) must reach the last real option. The previous mapping sent\n // \"last\" to the empty entry, which contradicted DOM order. See issue #18.\n : intent === \"first\" && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, intent, loop) ?? null;\n setHighlightedKey(target);\n changeOpen(true, \"keyboard\");\n };\n const moveHighlight = (intent: \"next\" | \"previous\" | \"first\" | \"last\") => {\n const enabledKeys = flatItems\n .filter((item) => !item.disabled)\n .map((item) => item.id);\n const firstKey = enabledKeys[0];\n const lastKey = enabledKeys.at(-1);\n // Treat the empty-selection entry as the first row, matching DOM order. `loop`\n // only joins the two ends of the list: moving between the empty entry and the\n // first option is adjacency, not a wrap, so it stays loop-independent. The\n // previous code gated that \"next\" on `loop`, which trapped the arrow keys on the\n // empty entry for every Select using the defaults (disallowEmptySelection: false,\n // loop: false). See issue #18.\n if (emptySelectionAvailable) {\n if (intent === \"first\") {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (activeKey === emptySelectionKey) {\n if (intent === \"next\") {\n if (firstKey !== undefined) setHighlightedKey(firstKey);\n return;\n }\n if (intent === \"previous\") {\n if (loop && lastKey !== undefined) setHighlightedKey(lastKey);\n return;\n }\n // intent === \"last\" falls through: the shared path picks the last option.\n } else {\n if (intent === \"previous\" && activeKey === firstKey) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (intent === \"next\" && activeKey === lastKey && loop) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n }\n }\n const target = getCollectionNavigationTarget(\n source,\n activeKey === emptySelectionKey ? null : activeKey,\n intent,\n loop,\n );\n if (target !== undefined) setHighlightedKey(target);\n };\n const commit = (key: SelectHighlightKey<Key>) => {\n if (key === emptySelectionKey) {\n if (disabled || readOnly || !emptySelectionAvailable) return;\n setSelectedKey(null);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n return;\n }\n const item = resolveCollectionItem(source, key);\n if (\n !item ||\n item.disabled ||\n disabled ||\n busy ||\n readOnly ||\n asyncState.status === \"loading\"\n ) return;\n setSelectedKey(key);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n };\n const runTypeahead = (key: string) => {\n const now = Date.now();\n const previous = now - typeaheadRef.current.time < 500\n ? typeaheadRef.current.value\n : \"\";\n const combined = `${previous}${key}`;\n const query = new Set(combined.toLocaleLowerCase()).size === 1 ? key : combined;\n typeaheadRef.current = { value: combined, time: now };\n const match = getCollectionTypeaheadMatch(source, query, {\n startsAfterKey: activeKey === emptySelectionKey\n ? reconciledSelectedKey\n : activeKey ?? reconciledSelectedKey,\n ...(locale === undefined ? {} : { locale }),\n });\n if (match !== undefined) {\n setHighlightedKey(match);\n if (!open) changeOpen(true, \"keyboard\");\n }\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n const navigationIntent = getCollectionNavigationIntent(\n event.key as WebKeyboardKey,\n );\n if (navigationIntent !== undefined) {\n event.preventDefault();\n if (!open) {\n openWithIntent(\n navigationIntent === \"previous\" || navigationIntent === \"last\"\n ? \"last\"\n : \"first\",\n );\n }\n else moveHighlight(navigationIntent);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (!open) openWithIntent();\n else if (activeKey !== null) commit(activeKey);\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n restoreFocusRef.current = true;\n changeOpen(false, \"escape\");\n } else if (event.key === \"Tab\" && open) {\n changeOpen(false, \"blur\");\n } else if (\n event.key.length === 1 &&\n event.key !== \" \" &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n event.preventDefault();\n runTypeahead(event.key);\n }\n };\n const handleBlur = (event: FocusEvent<HTMLButtonElement>) => {\n onBlur?.(event);\n if (event.defaultPrevented) return;\n queueMicrotask(() => {\n if (\n open &&\n document.activeElement instanceof Node &&\n !rootRef.current?.contains(document.activeElement) &&\n !listboxRef.current?.contains(document.activeElement)\n ) changeOpen(false, \"blur\");\n });\n };\n const describedBy = error ? errorId : description ? descriptionId : undefined;\n\n const renderOption = (item: SelectItemDescriptor<Key>) => {\n const selected = item.id === reconciledSelectedKey;\n const active = item.id === activeKey;\n const leadingSize = iconRecipe.sizes[selectRecipe.optionLeading.glyph];\n const leading = renderOptionLeading?.(item, {\n selected,\n highlighted: active,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n });\n return (\n <div\n key={item.id}\n ref={(node) => {\n if (node) optionRefs.current.set(item.id, node);\n else optionRefs.current.delete(item.id);\n }}\n id={optionId(item.id)}\n role=\"option\"\n className=\"hjm-select__option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n data-state={item.disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"}\n data-active={active || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!item.disabled) setHighlightedKey(item.id);\n }}\n onClick={() => commit(item.id)}\n >\n {leading ? (\n <span className=\"hjm-select__option-leading\" aria-hidden=\"true\">\n {leading}\n </span>\n ) : null}\n <span className=\"hjm-select__option-copy\">\n <span>{item.label}</span>\n {item.description ? (\n <span className=\"hjm-select__option-description\">{item.description}</span>\n ) : null}\n </span>\n {selected ? <span className=\"hjm-select__check\" aria-hidden=\"true\">✓</span> : null}\n </div>\n );\n };\n\n const triggerLeadingSize = iconRecipe.sizes[selectRecipe.sizes[size].glyph];\n const triggerLeading = renderLeading?.(resolvedSelectedItem, {\n color: \"currentColor\",\n size: triggerLeadingSize,\n });\n\n return (\n <div\n ref={rootRef}\n className={classNames(\"hjm-field hjm-select\", fieldClassName)}\n // fieldRecipe.disabledScope fades label and trigger; the amount is selectRecipe.states,\n // which Native already read (Web used the frame default 0.6 until 2026-10-06).\n style={disabled\n ? ({ ...layoutStyle, \"--hjm-field-disabled-opacity\": selectRecipe.states.disabledOpacity } as CSSProperties)\n : layoutStyle}\n data-state={disabled ? \"disabled\" : error ? \"invalid\" : open ? \"focused\" : \"idle\"}\n data-size={size}\n data-density={density}\n data-async-state={asyncState.status}\n data-busy={busy || undefined}\n >\n {label !== undefined ? (\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}{required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n ) : null}\n <div className=\"hjm-select__anchor\">\n <button\n {...buttonProps}\n ref={(node) => {\n triggerRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n }}\n id={controlId}\n type=\"button\"\n role=\"combobox\"\n className={classNames(\"hjm-field__control hjm-select__trigger\", className)}\n disabled={disabled}\n aria-disabled={busy || undefined}\n aria-label={accessibilityLabel ?? (label === undefined ? accessibleName : undefined)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open ? activeOptionId : undefined}\n aria-busy={busy || asyncState.status === \"loading\" || asyncState.status === \"loadingMore\" || undefined}\n data-busy={busy || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy}\n aria-readonly={readOnly || undefined}\n aria-required={required || undefined}\n onFocus={onFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n if (open) changeOpen(false, \"trigger\");\n else openWithIntent();\n }}\n >\n {triggerLeading ? (\n <span className=\"hjm-select__leading\" aria-hidden=\"true\">\n {triggerLeading}\n </span>\n ) : null}\n <span\n className=\"hjm-select__value\"\n data-state={resolvedSelectedItem ? \"selected\" : \"placeholder\"}\n >\n {resolvedSelectedItem?.label ?? placeholder}\n </span>\n {busy ? (\n <span className=\"hjm-select__busy-overlay\" aria-hidden=\"true\"><span className=\"hjm-select__busy-indicator\" /></span>\n ) : (\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n )}\n </button>\n {open ? (\n <AnchoredPortal\n anchorRef={triggerRef}\n ssrFallback=\"inline\"\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <div\n ref={setListboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={accessibleName}\n className=\"hjm-select__listbox\"\n data-density={density}\n data-placement={popupPosition.placement}\n data-align={popupPosition.align}\n style={popupPosition.style}\n >\n {asyncState.status !== \"idle\" ? (\n <div\n className=\"hjm-select__message\"\n role={asyncState.status === \"error\" ? \"alert\" : \"status\"}\n >\n {asyncState.status === \"loading\" || asyncState.status === \"loadingMore\" ? <span className=\"hjm-visually-hidden\">{asyncState.message}</span> : asyncState.message}\n </div>\n ) : null}\n {/* Rendered before the options: with no selection the active descendant\n starts on this entry, and a trailing position made that starting point\n the bottom of the list, where ArrowDown has nowhere to go (issue #18).\n moveHighlight follows this DOM order. */}\n {!disallowEmptySelection && showOptions ? (\n <div\n ref={(node) => {\n if (node) optionRefs.current.set(emptySelectionKey, node);\n else optionRefs.current.delete(emptySelectionKey);\n }}\n id={`${controlId}-option-empty`}\n role=\"option\"\n className=\"hjm-select__option hjm-select__option--empty\"\n aria-selected={reconciledSelectedKey === null}\n data-state={reconciledSelectedKey === null ? \"selected\" : \"idle\"}\n data-active={activeKey === emptySelectionKey || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => setHighlightedKey(emptySelectionKey)}\n onClick={() => commit(emptySelectionKey)}\n >\n {emptySelectionLabel}\n </div>\n ) : null}\n {showOptions ? (\n source.sections ? source.sections.map((section) => {\n const sectionLabelId = `${controlId}-section-${section.id}`;\n return (\n <div\n key={section.id}\n role=\"group\"\n aria-labelledby={section.label ? sectionLabelId : undefined}\n aria-label={section.label ? undefined : section.accessibilityLabel}\n className=\"hjm-select__section\"\n >\n {section.label ? (\n <div id={sectionLabelId} className=\"hjm-select__section-label\">\n {section.label}\n </div>\n ) : null}\n {section.items.map(renderOption)}\n </div>\n );\n }) : source.items.map(renderOption)\n ) : null}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n {description && !error ? (\n <div id={descriptionId} className=\"hjm-field__description\">{description}</div>\n ) : null}\n {error ? <div id={errorId} className=\"hjm-field__error\">{error}</div> : null}\n {name ? <input type=\"hidden\" name={name} value={reconciledSelectedKey ?? \"\"} /> : null}\n </div>\n );\n}\n\nexport const Select = forwardRef(SelectInner) as <\n Key extends string = string,\n SectionKey extends string = string,\n>(\n props: SelectProps<Key, SectionKey> & RefAttributes<HTMLButtonElement>,\n) => ReactElement | null;\n"]}
|
package/dist/selection.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ type ChipBaseProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" |
|
|
|
18
18
|
color: "currentColor";
|
|
19
19
|
size: number;
|
|
20
20
|
}>) => ReactNode;
|
|
21
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
22
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
21
23
|
}>;
|
|
22
24
|
type ActionChipProps = Readonly<{
|
|
23
25
|
selectionMode?: "action";
|
|
@@ -45,8 +47,13 @@ export type CheckboxProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" |
|
|
|
45
47
|
presentation?: SelectionControlPresentation;
|
|
46
48
|
size?: SelectionControlSize;
|
|
47
49
|
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
50
|
+
/**
|
|
51
|
+
* Canonical layout-only placement on the root `<label>`. `style` keeps going
|
|
52
|
+
* to the native input, where it always went, so existing callers do not move.
|
|
53
|
+
*/
|
|
54
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
48
55
|
}>;
|
|
49
|
-
export declare const Checkbox: import("react").ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "onChange" | "
|
|
56
|
+
export declare const Checkbox: import("react").ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "onChange" | "size" | "children" | "defaultChecked" | "type" | "checked"> & Readonly<{
|
|
50
57
|
label: ReactNode;
|
|
51
58
|
description?: ReactNode;
|
|
52
59
|
checked?: boolean;
|
|
@@ -57,6 +64,11 @@ export declare const Checkbox: import("react").ForwardRefExoticComponent<Omit<In
|
|
|
57
64
|
presentation?: SelectionControlPresentation;
|
|
58
65
|
size?: SelectionControlSize;
|
|
59
66
|
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
67
|
+
/**
|
|
68
|
+
* Canonical layout-only placement on the root `<label>`. `style` keeps going
|
|
69
|
+
* to the native input, where it always went, so existing callers do not move.
|
|
70
|
+
*/
|
|
71
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
60
72
|
}> & RefAttributes<HTMLInputElement>>;
|
|
61
73
|
type RadioState = Readonly<{
|
|
62
74
|
checked: boolean;
|
|
@@ -74,6 +86,11 @@ export type RadioProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "c
|
|
|
74
86
|
presentation?: SelectionControlPresentation;
|
|
75
87
|
size?: SelectionControlSize;
|
|
76
88
|
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
89
|
+
/**
|
|
90
|
+
* Canonical layout-only placement on the root `<label>`. `style` keeps going
|
|
91
|
+
* to the native input, where it always went, so existing callers do not move.
|
|
92
|
+
*/
|
|
93
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
77
94
|
}>;
|
|
78
95
|
/** Native radio item primitive. Use RadioGroup when the renderer owns group state. */
|
|
79
96
|
export declare const Radio: import("react").ForwardRefExoticComponent<RadioProps & RefAttributes<HTMLInputElement>>;
|
|
@@ -91,6 +108,8 @@ type CheckboxGroupBaseProps<Key extends string> = Omit<FieldsetHTMLAttributes<HT
|
|
|
91
108
|
required?: boolean;
|
|
92
109
|
readOnly?: boolean;
|
|
93
110
|
renderLeading?: (item: CheckboxGroupItem<Key>, appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
111
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
112
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
94
113
|
}>;
|
|
95
114
|
export type CheckboxGroupProps<Key extends string = string> = CheckboxGroupBaseProps<Key> & CheckboxGroupSelection<Key>;
|
|
96
115
|
export declare const CheckboxGroup: <Key extends string = string>(props: CheckboxGroupProps<Key> & RefAttributes<HTMLFieldSetElement>) => ReactElement;
|
|
@@ -121,6 +140,8 @@ export type RadioGroupProps = Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>,
|
|
|
121
140
|
required?: boolean;
|
|
122
141
|
readOnly?: boolean;
|
|
123
142
|
renderLeading?: (item: RadioGroupItem, appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
143
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
144
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
124
145
|
}>;
|
|
125
146
|
export declare const RadioGroup: import("react").ForwardRefExoticComponent<RadioGroupProps & RefAttributes<HTMLFieldSetElement>>;
|
|
126
147
|
export type SwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "role" | "onChange" | "value"> & Readonly<{
|
|
@@ -165,7 +186,10 @@ export type SegmentedControlProps = Omit<FieldsetHTMLAttributes<HTMLFieldSetElem
|
|
|
165
186
|
defaultValue?: string;
|
|
166
187
|
onValueChange?: (value: string) => void;
|
|
167
188
|
size?: SegmentedControlSize;
|
|
189
|
+
presentation?: "connected" | "pills";
|
|
168
190
|
name?: string;
|
|
191
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
192
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
169
193
|
}>;
|
|
170
194
|
export declare const SegmentedControl: import("react").ForwardRefExoticComponent<Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "value" | "defaultValue" | "onChange"> & Readonly<{
|
|
171
195
|
label: string;
|
|
@@ -174,6 +198,9 @@ export declare const SegmentedControl: import("react").ForwardRefExoticComponent
|
|
|
174
198
|
defaultValue?: string;
|
|
175
199
|
onValueChange?: (value: string) => void;
|
|
176
200
|
size?: SegmentedControlSize;
|
|
201
|
+
presentation?: "connected" | "pills";
|
|
177
202
|
name?: string;
|
|
203
|
+
/** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
|
|
204
|
+
layoutStyle?: HjmCompositionStyleProp;
|
|
178
205
|
}> & RefAttributes<HTMLFieldSetElement>>;
|
|
179
206
|
//# sourceMappingURL=selection.d.ts.map
|
package/dist/selection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAMV,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;AAC/C,OAAO,EAQL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,KAAK,aAAa,GAAG,IAAI,CACvB,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC7C,GACC,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC;IACrC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC1C,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,cAAc,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,KAAK,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.tsx"],"names":[],"mappings":"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"}
|