@hjmds/react 1.27.1 → 1.28.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 +26 -4
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +4 -4
- package/dist/actions.js.map +1 -1
- package/dist/auth-screen.d.ts +32 -2
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +52 -4
- package/dist/auth-screen.js.map +1 -1
- package/dist/chart.d.ts +1 -1
- package/dist/chart.js.map +1 -1
- package/dist/collection-editing.d.ts.map +1 -1
- package/dist/collection-editing.js +5 -4
- package/dist/collection-editing.js.map +1 -1
- package/dist/communication.js +1 -1
- package/dist/communication.js.map +1 -1
- package/dist/data-table.d.ts +2 -2
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js.map +1 -1
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +9 -3
- package/dist/display.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +2 -2
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts +10 -0
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +6 -1
- package/dist/feedback.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/list-row-scroll-room.d.ts +16 -0
- package/dist/internal/list-row-scroll-room.d.ts.map +1 -0
- package/dist/internal/list-row-scroll-room.js +17 -0
- package/dist/internal/list-row-scroll-room.js.map +1 -0
- package/dist/internal/screen-exit.d.ts.map +1 -1
- package/dist/internal/screen-exit.js +2 -1
- package/dist/internal/screen-exit.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 -2
- package/dist/notification-bell.js.map +1 -1
- package/dist/overlays.js +2 -2
- package/dist/overlays.js.map +1 -1
- package/dist/saved-items.js +1 -1
- package/dist/saved-items.js.map +1 -1
- package/dist/screen-flows.d.ts +2 -2
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +14 -13
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +1 -1
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +2 -2
- package/dist/screens.js.map +1 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +2 -2
- package/dist/selection.js.map +1 -1
- package/dist/styles.css +271 -125
- package/dist/styles.layered.css +271 -125
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +40 -4
- package/dist/theme.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +4 -1
- package/dist/toast.js.map +1 -1
- package/dist/top.js +1 -1
- package/dist/top.js.map +1 -1
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +1 -1
- package/dist/upload-item.js.map +1 -1
- package/dist/virtual-list.d.ts.map +1 -1
- package/dist/virtual-list.js +5 -1
- package/dist/virtual-list.js.map +1 -1
- package/package.json +3 -3
package/dist/screen-flows.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-flows.js","sourceRoot":"","sources":["../src/screen-flows.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode, type Ref, type RefObject } from \"react\";\nimport { CompositionLayout, ScreenLayout, type ScreenLayoutProps } from \"./screens.js\";\nimport { ScreenExitButton } from \"./internal/screen-exit.js\";\nimport { Button, IconButton } from \"./actions.js\";\nimport { MessageReactions, type MessageMenuAction } from \"./internal/message-reactions.js\";\nimport type { ReactionPickerProps } from \"./reaction-picker.js\";\nimport { Stack, Text, Grid, VisuallyHidden } from \"./layout.js\";\nimport { SearchField } from \"./forms.js\";\nimport { Chip, RadioGroup } from \"./selection.js\";\nimport { AlertDialog, Menu, Sheet, type SheetProps } from \"./overlays.js\";\nimport { UploadItem } from \"./upload-item.js\";\nimport { type UploadItemDescriptor, type UploadItemLabels } from \"@hjmds/design-contracts/components/upload-item\";\nimport { type AlertDialogRequest } from \"@hjmds/design-contracts/components/alert-dialog\";\nimport { validateCommentThread, resolvePermissionAction, resolveOnboardingStep, resolveSearchCommit, resolveSearchDebounceMs, resolveSearchEmptyCause, resolveSearchScreenPhase, resolveFocusAfterRemoval, screenPatternRecipe, commentThreadRecipe, profileSummaryRecipe, searchScreenRecipe, resolveCommentMenuItems, type CommentMenuItemDescriptor, type SearchEmptyCause, type PermissionScreenStatus, type PhotoSource, type PhotoSourceLabels } from \"@hjmds/design-contracts/screen-patterns\";\nimport { resolveWindowClass } from \"@hjmds/design-contracts/responsive\";\nimport { containerRecipe, type ContainerGutter } from \"@hjmds/design-contracts/components/container\";\nimport { ListRow } from \"./display.js\";\nimport { Heading } from \"./heading.js\";\nimport { EmptyState, Skeleton } from \"./feedback.js\";\n\n/** Copy, pending state and mutations are controlled by the consuming product. */\n/** `icon` renders an icon-only button named by `label`; header actions (top-right) use it so a centered title keeps its width (2026-10-17). */\nexport type ScreenFlowAction = Readonly<{label:string; onAction():void; disabled?:boolean; pending?:boolean; icon?:ReactNode}>;\n/** Header tool action (refresh, add): icon-only so it never pushes the centered title. A required text `add` made\n * products route exits (\"취소\") through it as a header text button (2026-10-17 screen review); exits use `exit`. */\nexport type ScreenFlowIconAction = ScreenFlowAction & Readonly<{icon:ReactNode}>;\nfunction Action({action,secondary=false,buttonRef}:{action:ScreenFlowAction;secondary?:boolean;buttonRef?:Ref<HTMLButtonElement>}){if(action.icon)return <IconButton ref={buttonRef} label={action.label} tone=\"ghost\" disabled={!!(action.disabled||action.pending)} onClick={action.onAction}>{action.icon}</IconButton>;return <Button ref={buttonRef} tone={secondary?\"ghost\":\"primary\"} disabled={!!(action.disabled||action.pending)} loading={action.pending??false} onClick={action.onAction}>{action.label}</Button>;}\ntype Base = Omit<ScreenLayoutProps,\"children\"|\"footer\">;\n// Stacked footer/sheet buttons use Stack gap \"xs\" (actionGroupRecipe.stackedGap 8); 12 read as split groups (button.md, 2026-10-17).\n\nexport type ListDetailScreenProps = Base & { list:ReactNode; detail?:Pick<ScreenLayoutProps,\"title\"|\"state\"|\"stateAction\"|\"notice\"|\"titleVisibility\"|\"headerAlignment\"> & {content:ReactNode}; back:ScreenFlowAction; refresh?:ScreenFlowIconAction; loadMore?:ScreenFlowAction };\n/** Keep the list mounted so input and scroll survive a detail visit. Routers may instead restore host scroll state. */\nexport function ListDetailScreen({list,detail,back,refresh,loadMore,layoutStyle,...screen}:ListDetailScreenProps){\n const open=!!detail;\n // Seed with the first render: a deep link that mounts with detail open is not a user transition,\n // so it must not pull focus from wherever the host left it (address bar, router focus target).\n const listHost=useRef<HTMLDivElement>(null),detailHost=useRef<HTMLDivElement>(null),returnFocus=useRef<HTMLElement|null>(null),wasOpen=useRef(open);\n // The retained host is a fallback when a virtualized list removes its focused item.\n // Hidden lists preserve scroll but drop browser focus; retain the trigger and move into the\n // detail once, then restore it (or the list body if the item was removed). See usage/ListDetailScreen.\n useLayoutEffect(()=>{\n if(open&&!wasOpen.current)detailHost.current?.querySelector<HTMLElement>(\"button\")?.focus({preventScroll:true});\n if(!open&&wasOpen.current){\n const target=returnFocus.current;\n if(target?.isConnected&&!target.closest(\"[hidden]\"))target.focus({preventScroll:true});\n // A retained trigger can also become disabled while detail is open.\n if(document.activeElement!==target)(listHost.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')??listHost.current)?.focus({preventScroll:true});\n }\n wasOpen.current=open;\n },[open]);\n // layoutStyle places the outer host that owns both panes, not the inner list ScreenLayout.\n // \"더 보기\" ends the list inside the scroll body, centered like LoadMore; the fixed footer is the bottom CTA slot (2026-10-17 review).\n return <div style={{height:\"100%\",...layoutStyle}}>\n <div ref={listHost} tabIndex={-1} hidden={open} style={{height:\"100%\"}} onFocusCapture={event=>{returnFocus.current=event.target as HTMLElement;}}><ScreenLayout {...screen} {...(refresh||screen.actions?{actions:<Stack axis=\"inline\" gap=\"xs\" align=\"center\">{/* Refresh no longer replaces the screen's own actions (2026-10-16 composition review). */}{screen.actions}{refresh?<Action action={refresh} secondary/>:null}</Stack>}:{})}>{loadMore?<div style={{display:\"flex\",flexDirection:\"column\",flex:\"1 1 auto\",minHeight:0,gap:screenPatternRecipe.itemGap}}>{list}<div style={{display:\"flex\",justifyContent:\"center\"}}><Action action={loadMore} secondary/></div></div>:list}</ScreenLayout></div>\n {detail?<div ref={detailHost} style={{height:\"100%\"}}><ScreenLayout title={detail.title} {...(detail.titleVisibility === undefined ? {} : { titleVisibility: detail.titleVisibility })} {...(detail.headerAlignment === undefined ? {} : { headerAlignment: detail.headerAlignment })} {...(detail.state === undefined ? {} : {state:detail.state})} stateAction={detail.stateAction} notice={detail.notice} exit={{kind:\"back\",label:back.label,onClick:back.onAction,disabled:!!(back.disabled||back.pending)}}>{detail.content}</ScreenLayout></div>:null}\n </div>;\n}\n\nexport type EditorScreenProps = Omit<Base,\"leading\"|\"exit\"> & {children:ReactNode;submitPlacement?:\"header\"|\"footer\";dirty:boolean;submit:ScreenFlowAction;cancel:ScreenFlowAction;discard:Omit<Extract<AlertDialogRequest,{mode:\"confirm\"}>,\"onConfirm\"|\"fallbackErrorMessage\"> & {fallbackErrorMessage:string};draftStatus?:ReactNode};\nexport function EditorScreen({children,dirty,submitPlacement=\"footer\",submit,cancel,discard,draftStatus,...screen}:EditorScreenProps){\n const [confirm,setConfirm]=useState(false);\n const cancelLocked=!!(cancel.disabled||cancel.pending||submit.pending);\n const submitAction={...submit,disabled:!!(submit.disabled||screen.state&&screen.state.kind!==\"ready\")};\n // A prompt opened before an external save must not bypass the current leave lock\n // or reappear once the save finishes. Keep the draft mounted throughout.\n useEffect(()=>{if(cancelLocked)setConfirm(false);},[cancelLocked]);\n // Preserve an async host result so AlertDialog can retain failure and retry.\n const leave=()=>{if(!cancelLocked)return cancel.onAction();};\n return <><ScreenLayout {...screen}\n exit={{kind:\"close\",label:cancel.label,disabled:cancelLocked,onClick:()=>{if(cancelLocked)return;if(dirty)setConfirm(true);else leave();}}}\n actions={submitPlacement===\"header\"?<Action action={submitAction}/>:screen.actions}\n footer={submitPlacement===\"header\"?draftStatus:<Stack gap=\"sm\">{draftStatus}<Action action={submitAction}/></Stack>}\n >{children}</ScreenLayout><AlertDialog open={confirm&&!cancelLocked} onOpenChange={setConfirm} request={{...discard,mode:\"confirm\",onConfirm:leave}}/></>;\n}\n\nexport type ProfileScreenProps = Base & {summary:ReactNode;edit:ScreenFlowAction;children?:ReactNode;accountActions?:ReactNode};\nexport function ProfileScreen({summary,edit,children,accountActions,...screen}:ProfileScreenProps){return <ScreenLayout {...screen}><Stack gap=\"xl\"><CompositionLayout footer={<Action action={edit} secondary/>}>{summary}</CompositionLayout>{children}{accountActions}</Stack></ScreenLayout>;}\n\nexport type ModerationScreenProps = Base & {reasonPicker?:ReactNode;reasons:readonly {value:string;label:string}[];reason:string|null;onReasonChange(value:string):void;reasonLabel:string;children?:ReactNode;submit:ScreenFlowAction;block?:{action:ScreenFlowAction;confirmation:Extract<AlertDialogRequest,{mode:\"confirm\"}>}};\nexport function ModerationScreen({reasonPicker,reasons,reason,onReasonChange,reasonLabel,children,submit,block,...screen}:ModerationScreenProps){\n const [confirm,setConfirm]=useState(false);\n const hasBlock=!!block;\n // Withdrawing the action ends that confirmation session; a later action needs\n // a new explicit press even if the screen itself stays mounted.\n useEffect(()=>{if(!hasBlock)setConfirm(false);},[hasBlock]);\n return <><ScreenLayout {...screen} footer={<Stack gap=\"xs\"><Action action={{...submit,disabled:submit.disabled||!!screen.state&&screen.state.kind!==\"ready\"||!reasons.some(item=>item.value===reason)}}/>{block?<Action action={{...block.action,onAction:()=>setConfirm(true)}} secondary/>:null}</Stack>}><Stack gap=\"lg\">{reasonPicker??(reasons.length?<RadioGroup accessibilityLabel={reasonLabel} orientation=\"vertical\" items={reasons} value={reason} onValueChange={value=>{if(value)onReasonChange(value);}}/>:null)}{children}</Stack></ScreenLayout>{block?<AlertDialog open={confirm} onOpenChange={setConfirm} request={block.confirmation}/>:null}</>;}\n\n\n/** Source choice only: permission, capture, decoding and draft persistence belong to the host. */\nexport type PhotoSourceSheetProps = Readonly<{\n open:boolean;onOpenChange(open:boolean):void;onSelect(source:PhotoSource):void;\n labels:PhotoSourceLabels;disabled?:boolean;cameraAvailable?:boolean;\n}>;\nexport function PhotoSourceSheet({open,onOpenChange,onSelect,labels,disabled=false,cameraAvailable=true}:PhotoSourceSheetProps){\n // File-input click must stay in the user's activation stack. Deferring until the\n // sheet animation ends can cause browsers to reject camera/album selection.\n const select=(source:PhotoSource)=>{if(disabled)return;onOpenChange(false);onSelect(source);};\n return <Sheet open={open} onOpenChange={onOpenChange} title={labels.title} closeLabel={labels.cancel}><Stack gap=\"xs\">\n <Button tone=\"secondary\" disabled={disabled} onClick={()=>select(\"library\")}>{labels.library}</Button>\n {cameraAvailable?<Button tone=\"secondary\" disabled={disabled} onClick={()=>select(\"camera\")}>{labels.camera}</Button>:null}\n </Stack></Sheet>;\n}\n\nexport type MediaSelectionItem = {descriptor:UploadItemDescriptor;preview?:ReactNode};\nexport type MediaSelectionScreenProps = Base & {library?:ReactNode;selectionSummary?:ReactNode;items:readonly MediaSelectionItem[];add?:ScreenFlowIconAction;done:ScreenFlowAction;labels:UploadItemLabels;actionLabels:{remove:string;moveUp:string;moveDown:string};removeLabel(item:MediaSelectionItem):string;moveUpLabel(item:MediaSelectionItem):string;moveDownLabel(item:MediaSelectionItem):string;onRemove(id:string):void;onMove(id:string,direction:-1|1):void;onRetry(id:string):void;onCancel(id:string):void};\n/** A photo is the primary content; upload status stays below it instead of replacing the thumbnail. */\nexport function MediaSelectionScreen({library,selectionSummary,items,add,done,labels,actionLabels,removeLabel,moveUpLabel,moveDownLabel,onRemove,onMove,onRetry,onCancel,...screen}:MediaSelectionScreenProps){\n const grid = useRef<HTMLDivElement>(null), addButton = useRef<HTMLButtonElement>(null);\n const focusedItem = useRef<{node:HTMLElement;id:string;index:number;body:HTMLElement|null}|null>(null);\n useLayoutEffect(() => {\n const previous = focusedItem.current, host = grid.current;\n if (!previous) return;\n const active = document.activeElement;\n if (!host) {\n focusedItem.current = null;\n // Empty-state replacement unmounts the grid; the ordinary last-removal\n // destination still applies. Other state/library replacements own their focus.\n if (!previous.node.isConnected && !items.length && screen.state?.kind === \"empty\" && library == null\n && (active === document.body || active === previous.body) && !addButton.current?.disabled) addButton.current?.focus({preventScroll:true});\n return;\n }\n const index = items.findIndex(item => item.descriptor.id === previous.id), moved = index >= 0 && index !== previous.index;\n if (index >= 0) previous.index = index;\n const reveal = (node:HTMLElement) => {\n const body = previous.body;\n if (!body?.contains(node) || body.dataset.scroll !== \"screen\") return;\n const bounds = node.getBoundingClientRect(), clip = body.getBoundingClientRect();\n // Scroll only the owned body, by the minimum needed to keep the action visible.\n if (bounds.top < clip.top) body.scrollTop += Math.floor(bounds.top - clip.top);\n else if (bounds.bottom > clip.bottom) body.scrollTop += Math.ceil(bounds.bottom - clip.bottom);\n };\n const disabled = previous.node.matches(\":disabled\");\n if (active !== document.body && active !== previous.body && !(active === previous.node && disabled)) {\n if (active === previous.node && moved) reveal(previous.node);\n return;\n }\n // A keyed reorder may detach a focused node; a boundary move may disable it.\n // Recover only focus owned by this grid, after the product accepts the change.\n const id = index < 0 ? items[Math.min(previous.index, items.length - 1)]?.descriptor.id : previous.id;\n const row = Array.from(host.querySelectorAll<HTMLElement>(\"[data-hjm-media-item]\")).find(node => node.dataset.hjmMediaItem === id);\n const target = index >= 0 && previous.node.isConnected && !disabled ? previous.node\n : row?.querySelector<HTMLButtonElement>(index < 0 ? '[data-media-action=\"remove\"]' : 'button[data-media-action]:not(:disabled)')\n ?? (!addButton.current?.disabled ? addButton.current : null);\n focusedItem.current = null;\n if (target) { target.focus({preventScroll:true}); reveal(target); }\n });\n return <ScreenLayout {...screen} {...(add||screen.actions?{actions:<Stack axis=\"inline\" gap=\"xs\" align=\"center\">{screen.actions}{add?<Action action={add} buttonRef={addButton}/>:null}</Stack>}:{})} footer={<Stack gap=\"sm\">{selectionSummary}<Action action={done}/></Stack>}>\n {library??<Grid ref={grid} columns={{compact:2,expanded:3}} gap={{compact:\"md\"}}\n onFocusCapture={event => {\n const node = event.target as HTMLElement, row = node.closest<HTMLElement>(\"[data-hjm-media-item]\");\n const id = row?.dataset.hjmMediaItem;\n if (id !== undefined) focusedItem.current = {node,id,index:items.findIndex(item => item.descriptor.id === id),body:node.closest<HTMLElement>(\".hjm-screen__body\")};\n }}\n onBlurCapture={event => {\n const node = event.target as HTMLElement;\n // Explicit blur/outside focus relinquishes ownership; DOM removal and a newly\n // disabled move button retain it until the layout effect chooses a successor.\n if (event.relatedTarget ? !event.currentTarget.contains(event.relatedTarget as Node) : node.isConnected && !node.matches(\":disabled\")) focusedItem.current = null;\n }}>\n {items.map((item,index)=><Stack key={item.descriptor.id} data-hjm-media-item={item.descriptor.id} gap=\"xs\">\n {item.preview}<UploadItem descriptor={item.descriptor} labels={labels} onRetry={onRetry} onCancel={onCancel}/>\n <Stack axis=\"inline\" gap=\"xxs\" layoutStyle={{flexWrap:\"wrap\"}}>\n <Button data-media-action=\"up\" aria-label={moveUpLabel(item)} size=\"small\" tone=\"ghost\" disabled={index===0} onClick={()=>onMove(item.descriptor.id,-1)}>{actionLabels.moveUp}</Button>\n <Button data-media-action=\"down\" aria-label={moveDownLabel(item)} size=\"small\" tone=\"ghost\" disabled={index===items.length-1} onClick={()=>onMove(item.descriptor.id,1)}>{actionLabels.moveDown}</Button>\n <Button data-media-action=\"remove\" aria-label={removeLabel(item)} size=\"small\" tone=\"ghost\" onClick={()=>onRemove(item.descriptor.id)}>{actionLabels.remove}</Button>\n </Stack>\n </Stack>)}\n </Grid>}\n </ScreenLayout>;\n}\n\n\n/*\n * SearchScreen phase sections (2026-10-06, user-delegated decision to lift the search preview logic into\n * the public API; design: packages/design-contracts/docs/screen-patterns.md, SearchScreen two-step section).\n * Products supply data, copy, icons and requests; HJM owns placement, commit routing, focus after removal\n * and count announcements. Before this, every product had to rebuild these from Showcase preview code,\n * which AGENTS.md rules out as an adoption path. Kept in this file, not an internal module: a new module\n * edge would push ./screen-flows past its reviewed module-count budget (scripts/check-renderer-budgets.mjs).\n */\n\n/** Recent searches before typing. Rows commit; the trailing button removes one. */\nexport type SearchRecentQueries = Readonly<{\n items: readonly string[];\n title: string;\n clearAllLabel: string;\n onClearAll(): void;\n removeLabel(query: string): string;\n onRemove(query: string): void;\n /** Decorative leading glyph (for example a history icon). */\n icon?: ReactNode;\n /** Glyph inside the remove button; defaults to \"×\". */\n removeIcon?: ReactNode;\n /** Rows shown; default `searchScreenRecipe.recentVisible` (5). */\n maxVisible?: number;\n}>;\n/** Product-chosen queries shown before typing and after a query-caused zero result. */\nexport type SearchSuggestedQueries = Readonly<{ title: string; items: readonly string[] }>;\n/** A typed-ahead completion. `match` bolds the matched range (weight, not color, so it survives dark mode). */\nexport type SearchSuggestion = Readonly<{ query: string; match?: Readonly<{ start: number; end: number }> }>;\nexport type SearchSuggestions = Readonly<{\n items: readonly SearchSuggestion[];\n /** First row that commits the typed text as is, e.g. \"Search ‘q’\". */\n commitLabel(query: string): string;\n /** Polite announcement of the suggestion count. */\n countLabel(count: number): string;\n icon?: ReactNode;\n /** Rows shown under the commit row; default `searchScreenRecipe.suggestionVisible` (6). */\n maxVisible?: number;\n}>;\nexport type SearchSortOption = Readonly<{ id: string; label: string }>;\nexport type SearchSort = Readonly<{\n /** Accessible name of the sort menu. */\n label: string;\n /** Visible trigger text, usually the current option (\"Sort: Newest\"). */\n triggerLabel: string;\n value: string;\n options: readonly SearchSortOption[];\n onChange(id: string): void;\n /** Trailing glyph of the trigger (for example a chevron). */\n icon?: ReactNode;\n}>;\nexport type SearchResultSummary = Readonly<{\n /** Result total for the committed query; `null` while it loads (skeleton rows replace `children`). */\n count: number | null;\n /** Hide the visual total without losing loading, empty-state or announcement behavior. */\n countVisibility?: \"visible\" | \"hidden\";\n countLabel(count: number): string;\n /** Announced while loading. */\n loadingLabel: string;\n sort?: SearchSort;\n /** Above the count, e.g. a retained-results error Notice with retry. */\n notice?: ReactNode;\n /** Zero-result copy. Filters as the cause add \"clear all\"; the query as the cause adds suggested queries. */\n empty?: Readonly<{ title: string; description?: string }>;\n}>;\nexport type SearchAppliedFilter = Readonly<{ key: string; label: string }>;\nexport type SearchAppliedFilters = Readonly<{\n items: readonly SearchAppliedFilter[];\n removeLabel(label: string): string;\n onRemove(key: string): void;\n clearAllLabel: string;\n onClearAll(): void;\n removeIcon?: ReactNode;\n}>;\nexport type SearchFilterSheetLabels = Readonly<{\n close: string;\n reset: string;\n /** Primary action text for a live draft count, e.g. \"Show 12 results\"; `null` while counting. */\n apply(count: number | null): string;\n}>;\n/**\n * Draft/applied filter sheet. HJM copies `value` into a draft when the sheet opens, discards the draft\n * on any dismissal, and calls `onApply(draft)` only from the primary action.\n */\nexport type SearchFilterSheet<F> = Readonly<{\n open: boolean;\n onOpenChange(open: boolean): void;\n /** Sheet title; products that open one section from a facet chip pass that section's name. */\n title: string;\n /** Applied filters. */\n value: F;\n onApply(next: F): void;\n /** Live count for a draft. Return `null` while an async count is pending; `0` disables apply. */\n count(draft: F): number | null;\n /** Draft after \"reset\" (the open section, or everything). */\n reset(draft: F): F;\n /** Disables \"reset\" when the draft already equals its reset value. */\n isDefault(draft: F): boolean;\n renderContent(draft: F, setDraft: (next: F) => void): ReactNode;\n labels: SearchFilterSheetLabels;\n /** Default `large`; section sheets usually pass `auto`. */\n size?: SheetProps[\"size\"];\n /** First item of the filter rail that opens the sheet, named with the applied count. */\n trigger?: Readonly<{ label(appliedCount: number): string; accessibilityLabel(appliedCount: number): string; icon?: ReactNode }>;\n}>;\n\ntype Removal = { list: \"recent\" | \"applied\" | \"clearRecent\" | \"clearApplied\"; index: number; from: number };\n\nfunction Highlighted({ text, match }: { text: string; match: SearchSuggestion[\"match\"] }): ReactNode {\n if (!match || match.start < 0 || match.end <= match.start || match.end > text.length) return text;\n return <>{text.slice(0, match.start)}<Text as=\"span\" emphasis=\"strong\">{text.slice(match.start, match.end)}</Text>{text.slice(match.end)}</>;\n}\n\n/** Focus targets after removing a chip or row; returns refs and a scheduler the screen calls from its handlers. */\nfunction useSearchRemovalFocus(recentCount: number, appliedCount: number, input: () => HTMLElement | null | undefined) {\n const pending = useRef<Removal | null>(null);\n const recentHost = useRef<HTMLDivElement>(null);\n const appliedHost = useRef<HTMLDivElement>(null);\n const filterTrigger = useRef<HTMLButtonElement>(null);\n // Wait for the product to actually shrink the list: an async onRemove would otherwise focus the\n // chip that is about to disappear.\n useLayoutEffect(() => {\n const removal = pending.current;\n if (!removal) return;\n const recent = removal.list === \"recent\" || removal.list === \"clearRecent\";\n const now = recent ? recentCount : appliedCount;\n if (now >= removal.from) return;\n pending.current = null;\n const host = recent ? recentHost.current : appliedHost.current;\n const selector = recent ? \"[data-search-recent-remove]\" : \"[data-search-applied-filter]\";\n const items = Array.from(host?.querySelectorAll<HTMLElement>(selector) ?? []);\n const index = removal.list.startsWith(\"clear\") ? -1 : resolveFocusAfterRemoval(removal.index, items.length);\n const fallback = recent ? input() : filterTrigger.current ?? input();\n (index >= 0 ? items[index] : fallback)?.focus();\n }, [recentCount, appliedCount, input]);\n return { recentHost, appliedHost, filterTrigger, schedule: (removal: Removal) => { pending.current = removal; } };\n}\n\nfunction SearchAnnouncement({ text }: { text: string }) {\n // Only the text changes the live region, so the same count is not re-read on every render.\n return <VisuallyHidden role=\"status\">{text}</VisuallyHidden>;\n}\n\nfunction SearchIdleSections({ recent, suggested, legacy, onCommit, hostRef, onRemove, onClearAll }: {\n recent: SearchRecentQueries | undefined; suggested: SearchSuggestedQueries | undefined; legacy: ReactNode;\n onCommit(query: string): void; hostRef: RefObject<HTMLDivElement | null>;\n onRemove(query: string, index: number): void; onClearAll(): void;\n}) {\n const visible = recent?.items.slice(0, Math.max(0, recent.maxVisible ?? searchScreenRecipe.recentVisible)) ?? [];\n // Without the structured sections the legacy `recentSearches` slot renders exactly as before 2026-10-06.\n if (!visible.length && !suggested?.items.length) return <>{legacy}</>;\n return <Stack gap=\"xl\">\n {legacy}\n {recent && visible.length ? <Stack gap=\"sm\" ref={hostRef}>\n <Stack axis=\"inline\" justify=\"between\" align=\"center\" gap=\"sm\">\n <Heading level=\"level5\" semanticLevel={2}>{recent.title}</Heading>\n <Button tone=\"ghost\" size=\"small\" onClick={onClearAll}>{recent.clearAllLabel}</Button>\n </Stack>\n <Stack gap=\"xxs\">{visible.map((item, index) => <Stack key={item} axis=\"inline\" align=\"center\" gap=\"xxs\">\n <ListRow density=\"compact\" leading={recent.icon} title={item} onClick={() => onCommit(item)} layoutStyle={{ flex: 1, minWidth: 0 }} />\n <IconButton data-search-recent-remove=\"\" label={recent.removeLabel(item)} tone=\"ghost\" onClick={() => onRemove(item, index)}>{recent.removeIcon ?? \"×\"}</IconButton>\n </Stack>)}</Stack>\n </Stack> : null}\n {suggested?.items.length ? <SearchSuggestedChips suggested={suggested} onCommit={onCommit} /> : null}\n </Stack>;\n}\n\nfunction SearchSuggestedChips({ suggested, onCommit }: { suggested: SearchSuggestedQueries; onCommit(query: string): void }) {\n return <Stack gap=\"sm\">\n <Heading level=\"level5\" semanticLevel={2}>{suggested.title}</Heading>\n <Stack axis=\"inline\" wrap gap=\"xs\">{suggested.items.map(item => <Chip key={item} label={item} onPress={() => onCommit(item)} />)}</Stack>\n </Stack>;\n}\n\nfunction SearchSuggestionList({ query, suggestions, onCommit }: { query: string; suggestions: SearchSuggestions; onCommit(query: string): void }) {\n const typed = query.trim();\n const items = suggestions.items.slice(0, Math.max(0, suggestions.maxVisible ?? searchScreenRecipe.suggestionVisible));\n return <Stack gap=\"xxs\">\n <ListRow density=\"compact\" leading={suggestions.icon} title={suggestions.commitLabel(typed)} onClick={() => onCommit(typed)} />\n {items.map(item => <ListRow key={item.query} density=\"compact\" leading={suggestions.icon} title={<Highlighted text={item.query} match={item.match} />} onClick={() => onCommit(item.query)} />)}\n </Stack>;\n}\n\nfunction SearchResultsHeader({ summary, applied, cause, appliedHost, onRemove, onClearAll, onSortChange }: {\n summary: SearchResultSummary | undefined; applied: SearchAppliedFilters | undefined; cause: SearchEmptyCause;\n appliedHost: RefObject<HTMLDivElement | null>; onRemove(key: string, index: number): void; onClearAll(): void; onSortChange(id: string): void;\n}) {\n const sort = summary?.sort;\n const showCount = summary && cause === \"none\" && summary.countVisibility !== \"hidden\";\n // A count-free search still owns its sorting action; do not hide it with the total.\n const showSort = summary && cause === \"none\" && sort;\n if (!summary?.notice && !showCount && !showSort && !applied?.items.length) return null;\n return <Stack gap=\"sm\">\n {summary?.notice}\n {showCount || showSort ? <Stack axis=\"inline\" justify={showCount ? \"between\" : \"end\"} align=\"center\" gap=\"sm\" wrap>\n {showCount ? (summary!.count === null ? <Skeleton shape=\"text\" width=\"30%\" /> : <Text tone=\"muted\">{summary!.countLabel(summary!.count)}</Text>) : null}\n {sort ? <Menu label={sort.label} align=\"end\" selectionMode=\"single\" value={sort.value} onValueChange={onSortChange}\n items={sort.options.map(option => ({ id: option.id, label: option.label }))}\n trigger={<Button size=\"small\" tone=\"ghost\" {...(sort.icon === undefined ? {} : { trailing: sort.icon })}>{sort.triggerLabel}</Button>} /> : null}\n </Stack> : null}\n {applied?.items.length ? <Stack ref={appliedHost} axis=\"inline\" wrap gap=\"xs\" align=\"center\">\n {applied.items.map((item, index) => <Chip key={item.key} data-search-applied-filter=\"\" label={item.label} aria-label={applied.removeLabel(item.label)}\n trailing={applied.removeIcon ?? <span aria-hidden=\"true\">×</span>} onPress={() => onRemove(item.key, index)} />)}\n <Button tone=\"ghost\" size=\"small\" onClick={onClearAll}>{applied.clearAllLabel}</Button>\n </Stack> : null}\n </Stack>;\n}\n\nfunction SearchResultsBody({ summary, applied, suggested, cause, onCommit, onClearAll, children }: {\n summary: SearchResultSummary | undefined; applied: SearchAppliedFilters | undefined; suggested: SearchSuggestedQueries | undefined;\n cause: SearchEmptyCause; onCommit(query: string): void; onClearAll(): void; children: ReactNode;\n}) {\n // Loading keeps each row's own height (ListRow `loading`), so the list does not jump when results land.\n if (summary?.count === null) return <Stack gap=\"xxs\">{Array.from({ length: searchScreenRecipe.loadingRows }, (_, index) =>\n <ListRow key={index} loading title=\"\" description={summary.loadingLabel} {...(index === 0 ? { loadingLabel: summary.loadingLabel } : {})} />)}</Stack>;\n if (cause === \"none\" || !summary?.empty) return <>{children}</>;\n return <Stack gap=\"lg\">\n <EmptyState density=\"compact\" title={summary.empty.title} {...(summary.empty.description === undefined ? {} : { description: summary.empty.description })}\n {...(cause === \"filters\" && applied ? { action: <Button tone=\"secondary\" onClick={onClearAll}>{applied.clearAllLabel}</Button> } : {})} />\n {cause === \"query\" && suggested?.items.length ? <SearchSuggestedChips suggested={suggested} onCommit={onCommit} /> : null}\n {children}\n </Stack>;\n}\n\nfunction SearchFilterTrigger<F>({ sheet, appliedCount, triggerRef }: { sheet: SearchFilterSheet<F>; appliedCount: number; triggerRef: RefObject<HTMLButtonElement | null> }) {\n const trigger = sheet.trigger!;\n return <Chip ref={triggerRef} label={trigger.label(appliedCount)} aria-label={trigger.accessibilityLabel(appliedCount)} aria-haspopup=\"dialog\"\n {...(trigger.icon === undefined ? {} : { leading: trigger.icon })} onPress={() => sheet.onOpenChange(true)} />;\n}\n\n/** Wide windows get a side sheet so results stay visible beside the conditions (expanded = 960+). */\nfunction sidePlacement() {\n return typeof window !== \"undefined\" && [\"expanded\", \"wide\"].includes(resolveWindowClass(window.innerWidth));\n}\n\nfunction SearchFilterSheetView<F>({ sheet }: { sheet: SearchFilterSheet<F> }) {\n // The draft lives only while the sheet is open: seeded from `value` on open, dropped on every close,\n // so closing (×, scrim, back, Escape) never leaks half-edited conditions into the next opening.\n const [session, setSession] = useState<{ draft: F; side: boolean } | null>(null);\n if (sheet.open && !session) setSession({ draft: sheet.value, side: sidePlacement() });\n if (!sheet.open && session) setSession(null);\n const draft = session ? session.draft : sheet.value;\n const setDraft = (next: F) => setSession(current => current ? { ...current, draft: next } : current);\n const count = sheet.count(draft);\n // Reset sits left of the primary action on Web (sheet.md [secondary][primary]) and is always present,\n // disabled at the default, so the primary action does not jump when the draft changes.\n const footer = <Stack axis=\"inline\" justify=\"end\" gap=\"sm\" wrap>\n <Button tone=\"secondary\" disabled={sheet.isDefault(draft)} onClick={() => setDraft(sheet.reset(draft))}>{sheet.labels.reset}</Button>\n <Button disabled={count === 0} onClick={() => { sheet.onApply(draft); sheet.onOpenChange(false); }}>{sheet.labels.apply(count)}</Button>\n </Stack>;\n return <Sheet open={sheet.open} onOpenChange={open => sheet.onOpenChange(open)} title={sheet.title} closeLabel={sheet.labels.close}\n placement={session?.side ? \"end\" : \"bottom\"} size={sheet.size ?? \"large\"} footer={footer}>\n {sheet.renderContent(draft, setDraft)}\n </Sheet>;\n}\n\ntype SearchInputSlot = {queryField: ReactNode; queryClearLabel?: string} | {queryField?: never; queryClearLabel: string};\n/** `committedQuery` turns on two-step search; every commit (Enter, suggestion, recent, suggested query) then goes through `onSubmit`. */\n/** One name for the default field's progress on both platforms (Web SearchField `loading`, Native `busy`+`busyLabel`). */\ntype SearchProgressSlot = {searching?: never; searchingLabel?: never} | {searching: boolean; searchingLabel: string};\ntype SearchCommitSlot = {committedQuery?: never; onSubmit?: (query:string)=>void} | {committedQuery: string; onSubmit:(query:string)=>void};\nexport type SearchScreenProps<F = unknown> = Base & SearchInputSlot & SearchCommitSlot & SearchProgressSlot & {query:string;queryLabel:string;onQueryChange(value:string):void;onSearch(query:string,context:{signal:AbortSignal}):void;debounceMs?:number;filters?:ReactNode;recentSearches?:ReactNode;children:ReactNode;\n /** `scroll` keeps `filters` on one horizontally scrolling line that bleeds to the screen edges. */\n filtersOverflow?:\"wrap\"|\"scroll\";\n /** Gutter the host (Container `gutter`, Sheet = `regular`) already applies around this screen; the scroll rail bleeds over it too. */\n hostGutter?:ContainerGutter;\n /** `hidden` drops the visible label (the field keeps `queryLabel` as its accessible name and placeholder). */\n queryLabelVisibility?:\"visible\"|\"hidden\";\n recentQueries?:SearchRecentQueries;suggestedQueries?:SearchSuggestedQueries;suggestions?:SearchSuggestions;\n resultSummary?:SearchResultSummary;appliedFilters?:SearchAppliedFilters;filterSheet?:SearchFilterSheet<F>};\n/** Abort is supplied to the host request; the host must ignore aborted responses before committing results. */\nexport function SearchScreen<F = unknown>({query,queryLabel,queryField,queryClearLabel,onQueryChange,onSearch,debounceMs,filters,recentSearches,children,onSubmit,committedQuery,filtersOverflow=\"wrap\",hostGutter=\"none\",queryLabelVisibility=\"visible\",searching,searchingLabel,recentQueries,suggestedQueries,suggestions,resultSummary,appliedFilters,filterSheet,...screen}:SearchScreenProps<F>){\n // The host owns localized copy. A custom queryField owns its own clear affordance.\n if (queryField == null && !queryClearLabel?.trim()) throw new TypeError(\"SearchScreen requires a localized queryClearLabel for its default search field\");\n const searchDelay=resolveSearchDebounceMs(debounceMs);\n const callback=useRef(onSearch);callback.current=onSearch;\n useEffect(()=>{const controller=new AbortController();const timer=setTimeout(()=>callback.current(query,{signal:controller.signal}),searchDelay);return()=>{clearTimeout(timer);controller.abort();};},[query,searchDelay]);\n const fieldHost=useRef<HTMLDivElement>(null),bodyHost=useRef<HTMLDivElement>(null);\n const input=useCallback(()=>fieldHost.current?.querySelector<HTMLElement>(\"input\"),[]);\n const focus=useSearchRemovalFocus(recentQueries?.items.length??0,appliedFilters?.items.length??0,input);\n // Every commit path funnels through here so \"only committed searches are recorded\" holds at the API:\n // onSearch (debounced typing) never reaches onSubmit. Without onSubmit (one-step search) a pick only fills the field.\n const commit=(value:string)=>{const next=resolveSearchCommit(value);if(next===null)return;if(next!==query)onQueryChange(next);onSubmit?.(next);};\n // A picked suggestion/recent/suggested query unmounts with its phase, which dropped focus to <body>; move it to the\n // results region first (1.13.1, utilverse adoption 2026-10-06, Native twin: Keyboard.dismiss on every commit).\n // Leaving the field also closes a mobile browser's keyboard. Enter keeps focus in the field instead: it is still on\n // screen with the committed text, and moving it would make keyboard users Shift+Tab back to refine. Rejected: blur()\n // without a target, which leaves focus on <body> and loses the reading position for screen readers.\n const pick=(value:string)=>{if(resolveSearchCommit(value)!==null)bodyHost.current?.focus({preventScroll:true});commit(value);};\n // onSubmit separates \"typing\" from \"committed\" (recent-search writes, suggestion → results) without making\n // products rebuild the default field through queryField (2026-10-06 search redesign, usage/components/search-screen.md).\n // Enter while an IME is composing (Korean/Japanese) only confirms the syllable, so it must not commit.\n // The pending debounce is left alone: products decide whether submit should also flush a request.\n const submitProps=onSubmit?{enterKeyHint:\"search\" as const,onKeyDown:(event:KeyboardEvent<HTMLInputElement>)=>{if(event.key!==\"Enter\"||event.nativeEvent.isComposing||event.keyCode===229)return;commit(event.currentTarget.value);}}:{};\n // Reference services hide the label behind a placeholder; the placeholder names the search target (Apple HIG\n // search fields) and aria-label keeps the accessible name, so hiding never leaves an unnamed field.\n const labelProps=queryLabelVisibility===\"hidden\"?{\"aria-label\":queryLabel,placeholder:queryLabel}:{label:queryLabel};\n const phase=resolveSearchScreenPhase(query,committedQuery);\n const appliedCount=appliedFilters?.items.length??0;\n const cause=phase===\"results\"&&resultSummary?resolveSearchEmptyCause(resultSummary.count,appliedCount):\"none\";\n // Two-step search shows the rail only beside results (typing keeps the pinned area short), and a\n // query-caused zero hides it because no filter can fix that; a filter-caused zero keeps it to undo the filter.\n const showRail=(committedQuery===undefined||phase===\"results\")&&cause!==\"query\";\n const trigger=filterSheet?.trigger?<SearchFilterTrigger sheet={filterSheet} appliedCount={appliedCount} triggerRef={focus.filterTrigger}/>:null;\n const rail=!showRail?null:trigger&&filters!=null?<Stack axis=\"inline\" gap=\"xs\" wrap={filtersOverflow===\"wrap\"}>{trigger}{filters}</Stack>:trigger??filters;\n // Wrapping chips grow the pinned area line by line at large text; the scroll rail caps it at one row.\n // A product-owned CSS/ScrollView rail would re-derive bleed, scroll padding and RTL per app.\n // contentInset=\"none\" leaves the gutter to the host, which CSS cannot see; hostGutter names it (Native twin).\n const bleed=(screen.contentInset===\"none\"?0:screenPatternRecipe.padding)+containerRecipe.gutters[hostGutter];\n const filterSlot=rail!=null&&filtersOverflow===\"scroll\"?<div className=\"hjm-search-screen__filters\" data-overflow=\"scroll\" style={{\"--hjm-search-filters-bleed\":`${bleed}px`} as CSSProperties}>{rail}</div>:rail;\n const visibleSuggestions=suggestions?.items.slice(0,Math.max(0,suggestions.maxVisible??searchScreenRecipe.suggestionVisible)).length??0;\n const countAnnouncement=phase===\"typing\"&&suggestions?suggestions.countLabel(visibleSuggestions):phase===\"results\"&&resultSummary&&resultSummary.count!==null?resultSummary.countLabel(resultSummary.count):\"\";\n // 2026-10-06 utilverse adoption: products swapped the whole field just to show progress. The Web spinner is\n // aria-hidden, so the localized searching label goes through the same status region as the counts.\n const announcement=searching&&searchingLabel?searchingLabel:countAnnouncement;\n const removeRecent=(item:string,index:number)=>{focus.schedule({list:\"recent\",index,from:recentQueries!.items.length});recentQueries!.onRemove(item);};\n const clearRecent=()=>{focus.schedule({list:\"clearRecent\",index:-1,from:recentQueries!.items.length});recentQueries!.onClearAll();};\n const removeApplied=(key:string,index:number)=>{focus.schedule({list:\"applied\",index,from:appliedCount});appliedFilters!.onRemove(key);};\n const clearApplied=()=>{focus.schedule({list:\"clearApplied\",index:-1,from:appliedCount});appliedFilters!.onClearAll();};\n // A new order starts at the top; the previous offset would land mid-list in unrelated results.\n const changeSort=(id:string)=>{resultSummary?.sort?.onChange(id);bodyHost.current?.closest(\".hjm-screen__body\")?.scrollTo?.({top:0});};\n const idle=<SearchIdleSections recent={recentQueries} suggested={suggestedQueries} legacy={recentSearches} onCommit={pick} hostRef={focus.recentHost} onRemove={removeRecent} onClearAll={clearRecent}/>;\n const body=phase===\"idle\"?<>{idle}{committedQuery===undefined?children:null}</>\n :phase===\"typing\"?(suggestions?<SearchSuggestionList query={query} suggestions={suggestions} onCommit={pick}/>:null)\n :<><SearchResultsHeader summary={resultSummary} applied={appliedFilters} cause={cause} appliedHost={focus.appliedHost} onRemove={removeApplied} onClearAll={clearApplied} onSortChange={changeSort}/>\n <SearchResultsBody summary={resultSummary} applied={appliedFilters} suggested={suggestedQueries} cause={cause} onCommit={pick} onClearAll={clearApplied}>{children}</SearchResultsBody></>;\n // Search-first routes have no visible heading: navigation and input share one row.\n // Keep explicit host headers and described/titled screens in their existing layout.\n const inlineNavigation=screen.titleVisibility===\"hidden\"&&screen.header==null&&!screen.description;\n const searchInput=queryField ?? <SearchField {...labelProps} clearLabel={queryClearLabel!} value={query} onValueChange={onQueryChange} loading={searching??false} {...submitProps}/>;\n const queryRow=inlineNavigation?<Stack axis=\"inline\" align=\"center\" gap=\"sm\">{screen.exit?<ScreenExitButton {...screen.exit}/>:null}<div style={{flex:1,minWidth:0}}>{searchInput}</div>{screen.actions}</Stack>:searchInput;\n return <><ScreenLayout {...screen} {...(inlineNavigation?{header:<></>}: {})} notice={<Stack gap=\"sm\" ref={fieldHost}>{queryRow}{filterSlot}{screen.notice}</Stack>}><Stack gap=\"lg\" ref={bodyHost} className=\"hjm-search-screen__results\" tabIndex={-1}>{suggestions||resultSummary||searchingLabel?<SearchAnnouncement text={announcement}/>:null}{body}</Stack></ScreenLayout>\n {filterSheet?<SearchFilterSheetView sheet={filterSheet}/>:null}</>;\n}\n\nexport type PermissionScreenProps = Base & {status:PermissionScreenStatus;illustration?:ReactNode;explanation:ReactNode;request:ScreenFlowAction;settings:ScreenFlowAction;continueAction:ScreenFlowAction;skip?:ScreenFlowAction};\nexport function PermissionScreen({status,illustration,explanation,request,settings,continueAction,skip,...screen}:PermissionScreenProps){const kind=resolvePermissionAction(status);const primary=kind===\"request\"?request:kind===\"settings\"?settings:kind===\"continue\"?continueAction:null;return <ScreenLayout {...screen} footer={<Stack gap=\"xs\">{primary?<Action action={primary}/>:null}{skip?<Action action={skip} secondary/>:null}</Stack>}><Stack gap=\"xl\" align=\"center\">{illustration}{explanation}</Stack></ScreenLayout>;}\n\nexport type OnboardingStep = {id:string;title:string;description:string;content:ReactNode};\nexport type OnboardingScreenProps = {steps:readonly OnboardingStep[];index:number;onIndexChange(index:number):void;nextLabel:string;backLabel:string;complete:ScreenFlowAction;skip?:ScreenFlowAction;progressLabel(index:number,total:number):string;layoutStyle?:ScreenLayoutProps[\"layoutStyle\"]};\nexport function OnboardingScreen({steps,index,onIndexChange,nextLabel,backLabel,complete,skip,progressLabel,layoutStyle}:OnboardingScreenProps){const position=resolveOnboardingStep(steps.length,index);const step=steps[index]!;\n // Completion and skip persist the same flow: keep navigation stable until the receipt.\n const host=useRef<HTMLDivElement|null>(null);\n // ScreenLayout owns this scroll region; keep focus while resetting each new step.\n useLayoutEffect(()=>{const body=host.current?.querySelector<HTMLElement>(\".hjm-screen__body\");if(body)body.scrollTop=0;},[index]);\n const pending=!!(complete.pending||skip?.pending);\n return <div ref={host} style={{display:\"contents\"}}><ScreenLayout {...(layoutStyle===undefined?{}:{layoutStyle})} title={step.title} description={step.description} actions={skip?<Action action={{...skip,disabled:!!(skip.disabled||pending)}} secondary/>:null} notice={<Text variant=\"caption\" tone=\"muted\">{progressLabel(index+1,steps.length)}</Text>} footer={<Stack gap=\"xs\"><Action action={position.last?{...complete,disabled:!!(complete.disabled||pending)}:{label:nextLabel,disabled:pending,onAction:()=>onIndexChange(index+1)}}/>{!position.first?<Action action={{label:backLabel,disabled:pending,onAction:()=>onIndexChange(index-1)}} secondary/>:null}</Stack>}>{step.content}</ScreenLayout></div>;}\n\nexport type CommentThreadItem = Readonly<{id:string;parentId:string|null;author:string;body:ReactNode;bodyText?:string;timeLabel:string;timeDateTime?:string;likeCountLabel:string;avatar?:ReactNode;likeIcon:ReactNode;likeLabel:string;likeAction?:ReactNode;actions?:ReactNode;canReply?:boolean;replyDisabled?:boolean;\n /** Long-press the comment (author and body) to react; the product owns the stored value and summary. */\n reactions?:CommentReactions;reactionSummary?:ReactNode;\n /** Optional photo or sticker under the body; HJM bounds its width and corners, the product sizes the image. */\n media?:ReactNode}>;\nexport type CommentReactions = ReactionPickerProps & Readonly<{closeLabel:string;menuAction?:Readonly<{label:string;onPress():void;disabled?:boolean}>;menuActions?:readonly MessageMenuAction[];reportAction?:Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;interactiveContent?:boolean;/** Icon for the automatic \"reply\" row of the hold menu. */replyIcon?:ReactNode}>;\n/**\n * HJM-owned \"more\" menu per comment (2026-10-17: common comment structure belongs to HJM, review S4#7). HJM draws the\n * vertical-dots button at the row's trailing edge and opens the shared Menu with danger items last; the product supplies\n * only the localized button name, the items allowed for that comment and the action callback.\n */\nexport type CommentMenu = Readonly<{\n /** Localized accessible name of the button, e.g. \"seoyeon 댓글 더 보기\". */\n label(item: CommentThreadItem): string;\n /** Items allowed for this comment (permission is product-owned). An empty list omits the button for that row. */\n items(item: CommentThreadItem): readonly CommentMenuItemDescriptor[];\n /** Runs after the menu closes, so a confirmation dialog can open without competing with the menu for focus. */\n onAction(item: CommentThreadItem, id: string): void;\n}>;\nexport type CommentThreadScreenProps = Base & {items:readonly CommentThreadItem[];expandedIds:readonly string[];onExpandedChange(id:string):void;onLike(id:string):void;onReply(id:string):void;replyLabel:string;repliesLabel(count:number,expanded:boolean):string;composer?:ReactNode;threadHeader?:ReactNode;threadFooter?:ReactNode;commentMenu?:CommentMenu};\nexport type CommentThreadRowProps = Readonly<{ layoutStyle?: ScreenLayoutProps[\"layoutStyle\"]; item: CommentThreadItem; onLike(id: string): void; onReply(id: string): void; replyLabel: string; commentMenu?: CommentMenu }>;\n/** Quiet secondary actions (reply, expand) read as muted copy beside the body, not as filled buttons. */\nfunction CommentTextAction({label,onPress,disabled=false,expanded}:Readonly<{label:string;onPress():void;disabled?:boolean;expanded?:boolean}>){\n return <button type=\"button\" className=\"hjm-comment-row__action\" disabled={disabled} aria-expanded={expanded} onClick={onPress}>{label}</button>;\n}\n\n/** Vertical dots drawn in the icon grid, matching Native's drawn glyph (the semantic `more` icon is horizontal). */\nfunction CommentMenuGlyph(){const size=commentThreadRecipe.menuGlyphSize;return <svg aria-hidden=\"true\" focusable=\"false\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">{[5,12,19].map(y=><circle key={y} cx=\"12\" cy={y} r=\"1.75\"/>)}</svg>;}\nfunction CommentMenuButton({item,menu}:Readonly<{item:CommentThreadItem;menu:CommentMenu}>){\n const items=resolveCommentMenuItems(menu.items(item));\n if(!items.length)return null;\n const label=menu.label(item);\n return <Menu label={label} align=\"end\" trigger={<IconButton label={label} tone=\"ghost\"><CommentMenuGlyph/></IconButton>} items={items.map(entry=>({id:entry.id,label:entry.label,textValue:entry.label,...(entry.tone===undefined?{}:{tone:entry.tone}),...(entry.disabled===undefined?{}:{disabled:entry.disabled})}))} onActionAfterDismiss={id=>menu.onAction(item,id)}/>;\n}\n\n/** Virtualized hosts reuse the same row as CommentThreadScreen; product slots add content, not a second layout. */\nexport function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle, commentMenu }: CommentThreadRowProps) {\n const avatarSize=item.parentId===null?commentThreadRecipe.avatarSize:commentThreadRecipe.replyAvatarSize;\n const canReply=item.canReply??item.parentId===null;\n const time=item.timeLabel?<time dateTime={item.timeDateTime}><Text variant=\"caption\" tone=\"muted\">{item.timeLabel}</Text></time>:null;\n // The like count sits under the heart so the text column carries only identity, body and reply.\n return <Stack key={item.id} axis=\"inline\" align=\"start\" gap=\"xs\" {...(layoutStyle === undefined ? {} : {layoutStyle})}>{item.avatar?<div className=\"hjm-comment-row__avatar\" style={{inlineSize:avatarSize}}>{item.avatar}</div>:null}<div className=\"hjm-comment-row__text\" style={{gap:commentThreadRecipe.lineGap}}>\n {/* Only identity and body are the hold target, so the reply action keeps its own button semantics. */}\n {(()=>{const identity=<>{item.bodyText!==undefined?<Text><Text emphasis=\"strong\">{item.author}</Text>{\" \"}{item.bodyText}</Text>:(item.author||item.timeLabel)?<Stack axis=\"inline\" gap=\"xxs\" align=\"center\" layoutStyle={{flexWrap:\"wrap\"}}>{item.author?<Text variant=\"caption\" emphasis=\"strong\">{item.author}</Text>:null}{time}</Stack>:null}\n {item.body}{item.media?<div className=\"hjm-comment-row__media\" style={{maxInlineSize:commentThreadRecipe.mediaMaxWidth,borderRadius:commentThreadRecipe.mediaRadius}}>{item.media}</div>:null}</>;return item.reactions?<MessageReactions {...item.reactions} {...((item.canReply??item.parentId===null)&&!item.replyDisabled ? {replyAction:{label:replyLabel,onPress:()=>onReply(item.id),...(item.reactions.replyIcon===undefined?{}:{icon:item.reactions.replyIcon})}} : {})} triggerClassName=\"hjm-comment-row__reactions\">{identity}</MessageReactions>:identity;})()}\n {(item.bodyText!==undefined&&time)||canReply||item.reactionSummary?<Stack axis=\"inline\" gap=\"sm\" align=\"center\" layoutStyle={{flexWrap:\"wrap\"}}>{item.bodyText!==undefined?time:null}{item.reactionSummary}{canReply?<CommentTextAction label={replyLabel} disabled={item.replyDisabled??false} onPress={()=>onReply(item.id)}/>:null}</Stack>:null}</div>\n <div className=\"hjm-comment-row__like\"><Stack axis=\"inline\" gap=\"xxs\" align=\"center\" layoutStyle={{flexShrink:0}}>{item.likeAction!==undefined?item.likeAction:<IconButton label={item.likeLabel} tone=\"ghost\" onClick={()=>onLike(item.id)}>{item.likeIcon}</IconButton>}{item.actions}{commentMenu?<CommentMenuButton item={item} menu={commentMenu}/>:null}</Stack>{item.likeCountLabel?<div className=\"hjm-comment-row__like-count\" style={{inlineSize:commentThreadRecipe.likeColumnWidth}}><Text variant=\"caption\" tone=\"muted\">{item.likeCountLabel}</Text></div>:null}</div></Stack>;\n}\n\n/** Controlled thread: server ordering, permission checks and receipt-based draft clearing belong to the product. */\nexport function CommentThreadScreen({items,expandedIds,onExpandedChange,onLike,onReply,replyLabel,repliesLabel,composer,threadHeader,threadFooter,commentMenu,...screen}:CommentThreadScreenProps){\n validateCommentThread(items);\n // Index replies once; rescanning every item for each root makes long threads quadratic.\n const roots:CommentThreadItem[]=[], repliesByParent=new Map<string,CommentThreadItem[]>();\n const expanded=new Set(expandedIds);\n for(const item of items){\n if(item.parentId===null)roots.push(item);\n else {const siblings=repliesByParent.get(item.parentId);if(siblings)siblings.push(item);else repliesByParent.set(item.parentId,[item]);}\n }\n const row=(item:CommentThreadItem)=><CommentThreadRow key={item.id} item={item} onLike={onLike} onReply={onReply} replyLabel={replyLabel} {...(commentMenu===undefined?{}:{commentMenu})}/>;\n // Product context belongs in the same scroll body as comments. Putting a tall\n // overview in the fixed header forced a second scroll region in Spint (2026-10-08).\n return <ScreenLayout {...screen} footer={!screen.state||screen.state.kind===\"ready\"||screen.state.kind===\"empty\"?composer:null}><Stack gap=\"lg\">{threadHeader}<div className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap}}>{roots.map(item=>{const replies=repliesByParent.get(item.id)??[];return <div key={item.id} className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap}}>{row(item)}{replies.length?<div className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap,marginInlineStart:commentThreadRecipe.replyIndent}}><CommentTextAction label={repliesLabel(replies.length,expanded.has(item.id))} expanded={expanded.has(item.id)} onPress={()=>onExpandedChange(item.id)}/>{expanded.has(item.id)?replies.map(row):null}</div>:null}</div>;})}</div>{threadFooter}</Stack></ScreenLayout>;\n}\n\nexport type ProfileSummaryProps = Readonly<{\n name: string;\n headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;\n avatar: ReactNode;\n badge?: ReactNode;\n nameActions?: ReactNode;\n stats?: readonly Readonly<{ id: string; value: string; label: string; onPress?(): void; disabled?: boolean }>[];\n actions?: ReactNode;\n children?: ReactNode;\n}>;\n\n/** Profile identity and counts are common; routing and mutations stay controlled by the product. */\nexport function ProfileSummary({ name, headingLevel = 2, avatar, badge, nameActions, stats = [], actions, children }: ProfileSummaryProps) {\n return <CompositionLayout title={name} headingLevel={headingLevel} leading={<span style={{ display: \"flex\", width: profileSummaryRecipe.avatarSize, height: profileSummaryRecipe.avatarSize, flexShrink: 0, borderRadius: \"50%\", overflow: \"hidden\" }}>{avatar}</span>} badge={badge} actions={nameActions} footer={children}>\n {/* Static and actionable counts occupy identical cells; button hit areas must not shift their baselines. */}\n {stats.length ? <Stack axis=\"inline\" gap=\"md\" align=\"stretch\" layoutStyle={{ width: \"100%\" }}>{stats.map(stat =>\n <Stack key={stat.id} gap=\"xxs\" align=\"center\" justify=\"center\" layoutStyle={{ flex: 1, minWidth: 0 }}>\n {stat.onPress ? <Button tone=\"ghost\" aria-label={`${stat.value} ${stat.label}`} disabled={stat.disabled ?? false} onClick={stat.onPress} layoutStyle={{ width: \"100%\" }}><Stack gap=\"xxs\" align=\"center\"><Text emphasis=\"strong\">{stat.value}</Text><Text variant=\"caption\" tone=\"muted\">{stat.label}</Text></Stack></Button>\n : <><Text emphasis=\"strong\">{stat.value}</Text><Text variant=\"caption\" tone=\"muted\">{stat.label}</Text></>}\n </Stack>)}</Stack> : null}\n {actions ? <Stack axis=\"inline\" gap=\"sm\" wrap>{actions}</Stack> : null}\n </CompositionLayout>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"screen-flows.js","sourceRoot":"","sources":["../src/screen-flows.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode, type Ref, type RefObject } from \"react\";\nimport { CompositionLayout, ScreenLayout, type ScreenLayoutProps } from \"./screens.js\";\nimport { ScreenExitButton } from \"./internal/screen-exit.js\";\nimport { Button, IconButton } from \"./actions.js\";\nimport { MessageReactions, type MessageMenuAction } from \"./internal/message-reactions.js\";\nimport type { ReactionPickerProps } from \"./reaction-picker.js\";\nimport { Stack, Text, Grid, VisuallyHidden } from \"./layout.js\";\nimport { SearchField } from \"./forms.js\";\nimport { Chip, RadioGroup } from \"./selection.js\";\nimport { AlertDialog, Menu, Sheet, type SheetProps } from \"./overlays.js\";\nimport { UploadItem } from \"./upload-item.js\";\nimport { type UploadItemDescriptor, type UploadItemLabels } from \"@hjmds/design-contracts/components/upload-item\";\nimport { type AlertDialogRequest } from \"@hjmds/design-contracts/components/alert-dialog\";\nimport { validateCommentThread, resolvePermissionAction, resolveOnboardingStep, resolveSearchCommit, resolveSearchDebounceMs, resolveSearchEmptyCause, resolveSearchScreenPhase, resolveFocusAfterRemoval, screenPatternRecipe, commentThreadRecipe, profileSummaryRecipe, searchScreenRecipe, resolveCommentMenuItems, type CommentMenuItemDescriptor, type SearchEmptyCause, type PermissionScreenStatus, type PhotoSource, type PhotoSourceLabels } from \"@hjmds/design-contracts/screen-patterns\";\nimport { resolveWindowClass } from \"@hjmds/design-contracts/responsive\";\nimport { containerRecipe, type ContainerGutter } from \"@hjmds/design-contracts/components/container\";\nimport { ListRow } from \"./display.js\";\nimport { Heading } from \"./heading.js\";\nimport { EmptyState, Skeleton } from \"./feedback.js\";\n\n/** Copy, pending state and mutations are controlled by the consuming product. */\n/** `icon` renders an icon-only button named by `label`; header actions (top-right) use it so a centered title keeps its width (2026-10-17). */\nexport type ScreenFlowAction = Readonly<{label:string; onAction():void; disabled?:boolean; pending?:boolean; icon?:ReactNode}>;\n/** Header tool action (refresh, add): icon-only so it never pushes the centered title. A required text `add` made\n * products route exits (a \"Cancel\" label) through it as a header text button (2026-10-17 screen review); exits use `exit`. */\nexport type ScreenFlowIconAction = ScreenFlowAction & Readonly<{icon:ReactNode}>;\n// `edge`: the action ends a header/row edge (IconButton/Button edge rule, 2026-10-17 audit); framed tones ignore it.\nfunction Action({action,secondary=false,buttonRef,edge}:{action:ScreenFlowAction;secondary?:boolean;buttonRef?:Ref<HTMLButtonElement>;edge?:\"start\"|\"end\"}){if(action.icon)return <IconButton ref={buttonRef} label={action.label} tone=\"ghost\" {...(edge?{edge}:{})} disabled={!!(action.disabled||action.pending)} onClick={action.onAction}>{action.icon}</IconButton>;return <Button ref={buttonRef} tone={secondary?\"ghost\":\"primary\"} {...(edge?{edge}:{})} disabled={!!(action.disabled||action.pending)} loading={action.pending??false} onClick={action.onAction}>{action.label}</Button>;}\ntype Base = Omit<ScreenLayoutProps,\"children\"|\"footer\">;\n// Stacked footer/sheet buttons use Stack gap \"xs\" (actionGroupRecipe.stackedGap 8); 12 read as split groups (button.md, 2026-10-17).\n\nexport type ListDetailScreenProps = Base & { list:ReactNode; detail?:Pick<ScreenLayoutProps,\"title\"|\"state\"|\"stateAction\"|\"notice\"|\"titleVisibility\"|\"headerAlignment\"> & {content:ReactNode}; back:ScreenFlowAction; refresh?:ScreenFlowIconAction; loadMore?:ScreenFlowAction };\n/** Keep the list mounted so input and scroll survive a detail visit. Routers may instead restore host scroll state. */\nexport function ListDetailScreen({list,detail,back,refresh,loadMore,layoutStyle,...screen}:ListDetailScreenProps){\n const open=!!detail;\n // Seed with the first render: a deep link that mounts with detail open is not a user transition,\n // so it must not pull focus from wherever the host left it (address bar, router focus target).\n const listHost=useRef<HTMLDivElement>(null),detailHost=useRef<HTMLDivElement>(null),returnFocus=useRef<HTMLElement|null>(null),wasOpen=useRef(open);\n // The retained host is a fallback when a virtualized list removes its focused item.\n // Hidden lists preserve scroll but drop browser focus; retain the trigger and move into the\n // detail once, then restore it (or the list body if the item was removed). See usage/ListDetailScreen.\n useLayoutEffect(()=>{\n if(open&&!wasOpen.current)detailHost.current?.querySelector<HTMLElement>(\"button\")?.focus({preventScroll:true});\n if(!open&&wasOpen.current){\n const target=returnFocus.current;\n if(target?.isConnected&&!target.closest(\"[hidden]\"))target.focus({preventScroll:true});\n // A retained trigger can also become disabled while detail is open.\n if(document.activeElement!==target)(listHost.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')??listHost.current)?.focus({preventScroll:true});\n }\n wasOpen.current=open;\n },[open]);\n // layoutStyle places the outer host that owns both panes, not the inner list ScreenLayout.\n // \"Load more\" ends the list inside the scroll body, centered like LoadMore; the fixed footer is the bottom CTA slot (2026-10-17 review).\n return <div style={{height:\"100%\",...layoutStyle}}>\n <div ref={listHost} tabIndex={-1} hidden={open} style={{height:\"100%\"}} onFocusCapture={event=>{returnFocus.current=event.target as HTMLElement;}}><ScreenLayout {...screen} {...(refresh||screen.actions?{actions:<Stack axis=\"inline\" gap=\"xs\" align=\"center\">{/* Refresh no longer replaces the screen's own actions (2026-10-16 composition review). */}{screen.actions}{refresh?<Action action={refresh} secondary edge=\"end\"/>:null}</Stack>}:{})}>{loadMore?<div style={{display:\"flex\",flexDirection:\"column\",flex:\"1 1 auto\",minHeight:0,gap:screenPatternRecipe.itemGap}}>{list}<div style={{display:\"flex\",justifyContent:\"center\"}}><Action action={loadMore} secondary/></div></div>:list}</ScreenLayout></div>\n {detail?<div ref={detailHost} style={{height:\"100%\"}}><ScreenLayout title={detail.title} {...(detail.titleVisibility === undefined ? {} : { titleVisibility: detail.titleVisibility })} {...(detail.headerAlignment === undefined ? {} : { headerAlignment: detail.headerAlignment })} {...(detail.state === undefined ? {} : {state:detail.state})} stateAction={detail.stateAction} notice={detail.notice} exit={{kind:\"back\",label:back.label,onClick:back.onAction,disabled:!!(back.disabled||back.pending)}}>{detail.content}</ScreenLayout></div>:null}\n </div>;\n}\n\nexport type EditorScreenProps = Omit<Base,\"leading\"|\"exit\"> & {children:ReactNode;submitPlacement?:\"header\"|\"footer\";dirty:boolean;submit:ScreenFlowAction;cancel:ScreenFlowAction;discard:Omit<Extract<AlertDialogRequest,{mode:\"confirm\"}>,\"onConfirm\"|\"fallbackErrorMessage\"> & {fallbackErrorMessage:string};draftStatus?:ReactNode};\nexport function EditorScreen({children,dirty,submitPlacement=\"footer\",submit,cancel,discard,draftStatus,...screen}:EditorScreenProps){\n const [confirm,setConfirm]=useState(false);\n const cancelLocked=!!(cancel.disabled||cancel.pending||submit.pending);\n const submitAction={...submit,disabled:!!(submit.disabled||screen.state&&screen.state.kind!==\"ready\")};\n // A prompt opened before an external save must not bypass the current leave lock\n // or reappear once the save finishes. Keep the draft mounted throughout.\n useEffect(()=>{if(cancelLocked)setConfirm(false);},[cancelLocked]);\n // Preserve an async host result so AlertDialog can retain failure and retry.\n const leave=()=>{if(!cancelLocked)return cancel.onAction();};\n return <><ScreenLayout {...screen}\n exit={{kind:\"close\",label:cancel.label,disabled:cancelLocked,onClick:()=>{if(cancelLocked)return;if(dirty)setConfirm(true);else leave();}}}\n actions={submitPlacement===\"header\"?<Action action={submitAction}/>:screen.actions}\n footer={submitPlacement===\"header\"?draftStatus:<Stack gap=\"sm\">{draftStatus}<Action action={submitAction}/></Stack>}\n >{children}</ScreenLayout><AlertDialog open={confirm&&!cancelLocked} onOpenChange={setConfirm} request={{...discard,mode:\"confirm\",onConfirm:leave}}/></>;\n}\n\nexport type ProfileScreenProps = Base & {summary:ReactNode;edit:ScreenFlowAction;children?:ReactNode;accountActions?:ReactNode};\nexport function ProfileScreen({summary,edit,children,accountActions,...screen}:ProfileScreenProps){return <ScreenLayout {...screen}><Stack gap=\"xl\"><CompositionLayout footer={<Action action={edit} secondary/>}>{summary}</CompositionLayout>{children}{accountActions}</Stack></ScreenLayout>;}\n\nexport type ModerationScreenProps = Base & {reasonPicker?:ReactNode;reasons:readonly {value:string;label:string}[];reason:string|null;onReasonChange(value:string):void;reasonLabel:string;children?:ReactNode;submit:ScreenFlowAction;block?:{action:ScreenFlowAction;confirmation:Extract<AlertDialogRequest,{mode:\"confirm\"}>}};\nexport function ModerationScreen({reasonPicker,reasons,reason,onReasonChange,reasonLabel,children,submit,block,...screen}:ModerationScreenProps){\n const [confirm,setConfirm]=useState(false);\n const hasBlock=!!block;\n // Withdrawing the action ends that confirmation session; a later action needs\n // a new explicit press even if the screen itself stays mounted.\n useEffect(()=>{if(!hasBlock)setConfirm(false);},[hasBlock]);\n return <><ScreenLayout {...screen} footer={<Stack gap=\"xs\"><Action action={{...submit,disabled:submit.disabled||!!screen.state&&screen.state.kind!==\"ready\"||!reasons.some(item=>item.value===reason)}}/>{block?<Action action={{...block.action,onAction:()=>setConfirm(true)}} secondary/>:null}</Stack>}><Stack gap=\"lg\">{reasonPicker??(reasons.length?<RadioGroup accessibilityLabel={reasonLabel} orientation=\"vertical\" items={reasons} value={reason} onValueChange={value=>{if(value)onReasonChange(value);}}/>:null)}{children}</Stack></ScreenLayout>{block?<AlertDialog open={confirm} onOpenChange={setConfirm} request={block.confirmation}/>:null}</>;}\n\n\n/** Source choice only: permission, capture, decoding and draft persistence belong to the host. */\nexport type PhotoSourceSheetProps = Readonly<{\n open:boolean;onOpenChange(open:boolean):void;onSelect(source:PhotoSource):void;\n labels:PhotoSourceLabels;disabled?:boolean;cameraAvailable?:boolean;\n}>;\nexport function PhotoSourceSheet({open,onOpenChange,onSelect,labels,disabled=false,cameraAvailable=true}:PhotoSourceSheetProps){\n // File-input click must stay in the user's activation stack. Deferring until the\n // sheet animation ends can cause browsers to reject camera/album selection.\n const select=(source:PhotoSource)=>{if(disabled)return;onOpenChange(false);onSelect(source);};\n return <Sheet open={open} onOpenChange={onOpenChange} title={labels.title} closeLabel={labels.cancel}><Stack gap=\"xs\">\n <Button tone=\"secondary\" disabled={disabled} onClick={()=>select(\"library\")}>{labels.library}</Button>\n {cameraAvailable?<Button tone=\"secondary\" disabled={disabled} onClick={()=>select(\"camera\")}>{labels.camera}</Button>:null}\n </Stack></Sheet>;\n}\n\nexport type MediaSelectionItem = {descriptor:UploadItemDescriptor;preview?:ReactNode};\nexport type MediaSelectionScreenProps = Base & {library?:ReactNode;selectionSummary?:ReactNode;items:readonly MediaSelectionItem[];add?:ScreenFlowIconAction;done:ScreenFlowAction;labels:UploadItemLabels;actionLabels:{remove:string;moveUp:string;moveDown:string};removeLabel(item:MediaSelectionItem):string;moveUpLabel(item:MediaSelectionItem):string;moveDownLabel(item:MediaSelectionItem):string;onRemove(id:string):void;onMove(id:string,direction:-1|1):void;onRetry(id:string):void;onCancel(id:string):void};\n/** A photo is the primary content; upload status stays below it instead of replacing the thumbnail. */\nexport function MediaSelectionScreen({library,selectionSummary,items,add,done,labels,actionLabels,removeLabel,moveUpLabel,moveDownLabel,onRemove,onMove,onRetry,onCancel,...screen}:MediaSelectionScreenProps){\n const grid = useRef<HTMLDivElement>(null), addButton = useRef<HTMLButtonElement>(null);\n const focusedItem = useRef<{node:HTMLElement;id:string;index:number;body:HTMLElement|null}|null>(null);\n useLayoutEffect(() => {\n const previous = focusedItem.current, host = grid.current;\n if (!previous) return;\n const active = document.activeElement;\n if (!host) {\n focusedItem.current = null;\n // Empty-state replacement unmounts the grid; the ordinary last-removal\n // destination still applies. Other state/library replacements own their focus.\n if (!previous.node.isConnected && !items.length && screen.state?.kind === \"empty\" && library == null\n && (active === document.body || active === previous.body) && !addButton.current?.disabled) addButton.current?.focus({preventScroll:true});\n return;\n }\n const index = items.findIndex(item => item.descriptor.id === previous.id), moved = index >= 0 && index !== previous.index;\n if (index >= 0) previous.index = index;\n const reveal = (node:HTMLElement) => {\n const body = previous.body;\n if (!body?.contains(node) || body.dataset.scroll !== \"screen\") return;\n const bounds = node.getBoundingClientRect(), clip = body.getBoundingClientRect();\n // Scroll only the owned body, by the minimum needed to keep the action visible.\n if (bounds.top < clip.top) body.scrollTop += Math.floor(bounds.top - clip.top);\n else if (bounds.bottom > clip.bottom) body.scrollTop += Math.ceil(bounds.bottom - clip.bottom);\n };\n const disabled = previous.node.matches(\":disabled\");\n if (active !== document.body && active !== previous.body && !(active === previous.node && disabled)) {\n if (active === previous.node && moved) reveal(previous.node);\n return;\n }\n // A keyed reorder may detach a focused node; a boundary move may disable it.\n // Recover only focus owned by this grid, after the product accepts the change.\n const id = index < 0 ? items[Math.min(previous.index, items.length - 1)]?.descriptor.id : previous.id;\n const row = Array.from(host.querySelectorAll<HTMLElement>(\"[data-hjm-media-item]\")).find(node => node.dataset.hjmMediaItem === id);\n const target = index >= 0 && previous.node.isConnected && !disabled ? previous.node\n : row?.querySelector<HTMLButtonElement>(index < 0 ? '[data-media-action=\"remove\"]' : 'button[data-media-action]:not(:disabled)')\n ?? (!addButton.current?.disabled ? addButton.current : null);\n focusedItem.current = null;\n if (target) { target.focus({preventScroll:true}); reveal(target); }\n });\n return <ScreenLayout {...screen} {...(add||screen.actions?{actions:<Stack axis=\"inline\" gap=\"xs\" align=\"center\">{screen.actions}{add?<Action action={add} buttonRef={addButton} edge=\"end\"/>:null}</Stack>}:{})} footer={<Stack gap=\"sm\">{selectionSummary}<Action action={done}/></Stack>}>\n {library??<Grid ref={grid} columns={{compact:2,expanded:3}} gap={{compact:\"md\"}}\n onFocusCapture={event => {\n const node = event.target as HTMLElement, row = node.closest<HTMLElement>(\"[data-hjm-media-item]\");\n const id = row?.dataset.hjmMediaItem;\n if (id !== undefined) focusedItem.current = {node,id,index:items.findIndex(item => item.descriptor.id === id),body:node.closest<HTMLElement>(\".hjm-screen__body\")};\n }}\n onBlurCapture={event => {\n const node = event.target as HTMLElement;\n // Explicit blur/outside focus relinquishes ownership; DOM removal and a newly\n // disabled move button retain it until the layout effect chooses a successor.\n if (event.relatedTarget ? !event.currentTarget.contains(event.relatedTarget as Node) : node.isConnected && !node.matches(\":disabled\")) focusedItem.current = null;\n }}>\n {items.map((item,index)=><Stack key={item.descriptor.id} data-hjm-media-item={item.descriptor.id} gap=\"xs\">\n {item.preview}<UploadItem descriptor={item.descriptor} labels={labels} onRetry={onRetry} onCancel={onCancel}/>\n <Stack axis=\"inline\" gap=\"xxs\" layoutStyle={{flexWrap:\"wrap\"}}>\n <Button data-media-action=\"up\" aria-label={moveUpLabel(item)} size=\"small\" tone=\"ghost\" disabled={index===0} onClick={()=>onMove(item.descriptor.id,-1)}>{actionLabels.moveUp}</Button>\n <Button data-media-action=\"down\" aria-label={moveDownLabel(item)} size=\"small\" tone=\"ghost\" disabled={index===items.length-1} onClick={()=>onMove(item.descriptor.id,1)}>{actionLabels.moveDown}</Button>\n <Button data-media-action=\"remove\" aria-label={removeLabel(item)} size=\"small\" tone=\"ghost\" onClick={()=>onRemove(item.descriptor.id)}>{actionLabels.remove}</Button>\n </Stack>\n </Stack>)}\n </Grid>}\n </ScreenLayout>;\n}\n\n\n/*\n * SearchScreen phase sections (2026-10-06, user-delegated decision to lift the search preview logic into\n * the public API; design: packages/design-contracts/docs/screen-patterns.md, SearchScreen two-step section).\n * Products supply data, copy, icons and requests; HJM owns placement, commit routing, focus after removal\n * and count announcements. Before this, every product had to rebuild these from Showcase preview code,\n * which AGENTS.md rules out as an adoption path. Kept in this file, not an internal module: a new module\n * edge would push ./screen-flows past its reviewed module-count budget (scripts/check-renderer-budgets.mjs).\n */\n\n/** Recent searches before typing. Rows commit; the trailing button removes one. */\nexport type SearchRecentQueries = Readonly<{\n items: readonly string[];\n title: string;\n clearAllLabel: string;\n onClearAll(): void;\n removeLabel(query: string): string;\n onRemove(query: string): void;\n /** Decorative leading glyph (for example a history icon). */\n icon?: ReactNode;\n /** Glyph inside the remove button; defaults to \"×\". */\n removeIcon?: ReactNode;\n /** Rows shown; default `searchScreenRecipe.recentVisible` (5). */\n maxVisible?: number;\n}>;\n/** Product-chosen queries shown before typing and after a query-caused zero result. */\nexport type SearchSuggestedQueries = Readonly<{ title: string; items: readonly string[] }>;\n/** A typed-ahead completion. `match` bolds the matched range (weight, not color, so it survives dark mode). */\nexport type SearchSuggestion = Readonly<{ query: string; match?: Readonly<{ start: number; end: number }> }>;\nexport type SearchSuggestions = Readonly<{\n items: readonly SearchSuggestion[];\n /** First row that commits the typed text as is, e.g. \"Search ‘q’\". */\n commitLabel(query: string): string;\n /** Polite announcement of the suggestion count. */\n countLabel(count: number): string;\n icon?: ReactNode;\n /** Rows shown under the commit row; default `searchScreenRecipe.suggestionVisible` (6). */\n maxVisible?: number;\n}>;\nexport type SearchSortOption = Readonly<{ id: string; label: string }>;\nexport type SearchSort = Readonly<{\n /** Accessible name of the sort menu. */\n label: string;\n /** Visible trigger text, usually the current option (\"Sort: Newest\"). */\n triggerLabel: string;\n value: string;\n options: readonly SearchSortOption[];\n onChange(id: string): void;\n /** Trailing glyph of the trigger (for example a chevron). */\n icon?: ReactNode;\n}>;\nexport type SearchResultSummary = Readonly<{\n /** Result total for the committed query; `null` while it loads (skeleton rows replace `children`). */\n count: number | null;\n /** Hide the visual total without losing loading, empty-state or announcement behavior. */\n countVisibility?: \"visible\" | \"hidden\";\n countLabel(count: number): string;\n /** Announced while loading. */\n loadingLabel: string;\n sort?: SearchSort;\n /** Above the count, e.g. a retained-results error Notice with retry. */\n notice?: ReactNode;\n /** Zero-result copy. Filters as the cause add \"clear all\"; the query as the cause adds suggested queries. */\n empty?: Readonly<{ title: string; description?: string }>;\n}>;\nexport type SearchAppliedFilter = Readonly<{ key: string; label: string }>;\nexport type SearchAppliedFilters = Readonly<{\n items: readonly SearchAppliedFilter[];\n removeLabel(label: string): string;\n onRemove(key: string): void;\n clearAllLabel: string;\n onClearAll(): void;\n removeIcon?: ReactNode;\n}>;\nexport type SearchFilterSheetLabels = Readonly<{\n close: string;\n reset: string;\n /** Primary action text for a live draft count, e.g. \"Show 12 results\"; `null` while counting. */\n apply(count: number | null): string;\n}>;\n/**\n * Draft/applied filter sheet. HJM copies `value` into a draft when the sheet opens, discards the draft\n * on any dismissal, and calls `onApply(draft)` only from the primary action.\n */\nexport type SearchFilterSheet<F> = Readonly<{\n open: boolean;\n onOpenChange(open: boolean): void;\n /** Sheet title; products that open one section from a facet chip pass that section's name. */\n title: string;\n /** Applied filters. */\n value: F;\n onApply(next: F): void;\n /** Live count for a draft. Return `null` while an async count is pending; `0` disables apply. */\n count(draft: F): number | null;\n /** Draft after \"reset\" (the open section, or everything). */\n reset(draft: F): F;\n /** Disables \"reset\" when the draft already equals its reset value. */\n isDefault(draft: F): boolean;\n renderContent(draft: F, setDraft: (next: F) => void): ReactNode;\n labels: SearchFilterSheetLabels;\n /** Default `large`; section sheets usually pass `auto`. */\n size?: SheetProps[\"size\"];\n /** First item of the filter rail that opens the sheet, named with the applied count. */\n trigger?: Readonly<{ label(appliedCount: number): string; accessibilityLabel(appliedCount: number): string; icon?: ReactNode }>;\n}>;\n\ntype Removal = { list: \"recent\" | \"applied\" | \"clearRecent\" | \"clearApplied\"; index: number; from: number };\n\nfunction Highlighted({ text, match }: { text: string; match: SearchSuggestion[\"match\"] }): ReactNode {\n if (!match || match.start < 0 || match.end <= match.start || match.end > text.length) return text;\n return <>{text.slice(0, match.start)}<Text as=\"span\" emphasis=\"strong\">{text.slice(match.start, match.end)}</Text>{text.slice(match.end)}</>;\n}\n\n/** Focus targets after removing a chip or row; returns refs and a scheduler the screen calls from its handlers. */\nfunction useSearchRemovalFocus(recentCount: number, appliedCount: number, input: () => HTMLElement | null | undefined) {\n const pending = useRef<Removal | null>(null);\n const recentHost = useRef<HTMLDivElement>(null);\n const appliedHost = useRef<HTMLDivElement>(null);\n const filterTrigger = useRef<HTMLButtonElement>(null);\n // Wait for the product to actually shrink the list: an async onRemove would otherwise focus the\n // chip that is about to disappear.\n useLayoutEffect(() => {\n const removal = pending.current;\n if (!removal) return;\n const recent = removal.list === \"recent\" || removal.list === \"clearRecent\";\n const now = recent ? recentCount : appliedCount;\n if (now >= removal.from) return;\n pending.current = null;\n const host = recent ? recentHost.current : appliedHost.current;\n const selector = recent ? \"[data-search-recent-remove]\" : \"[data-search-applied-filter]\";\n const items = Array.from(host?.querySelectorAll<HTMLElement>(selector) ?? []);\n const index = removal.list.startsWith(\"clear\") ? -1 : resolveFocusAfterRemoval(removal.index, items.length);\n const fallback = recent ? input() : filterTrigger.current ?? input();\n (index >= 0 ? items[index] : fallback)?.focus();\n }, [recentCount, appliedCount, input]);\n return { recentHost, appliedHost, filterTrigger, schedule: (removal: Removal) => { pending.current = removal; } };\n}\n\nfunction SearchAnnouncement({ text }: { text: string }) {\n // Only the text changes the live region, so the same count is not re-read on every render.\n return <VisuallyHidden role=\"status\">{text}</VisuallyHidden>;\n}\n\nfunction SearchIdleSections({ recent, suggested, legacy, onCommit, hostRef, onRemove, onClearAll }: {\n recent: SearchRecentQueries | undefined; suggested: SearchSuggestedQueries | undefined; legacy: ReactNode;\n onCommit(query: string): void; hostRef: RefObject<HTMLDivElement | null>;\n onRemove(query: string, index: number): void; onClearAll(): void;\n}) {\n const visible = recent?.items.slice(0, Math.max(0, recent.maxVisible ?? searchScreenRecipe.recentVisible)) ?? [];\n // Without the structured sections the legacy `recentSearches` slot renders exactly as before 2026-10-06.\n if (!visible.length && !suggested?.items.length) return <>{legacy}</>;\n return <Stack gap=\"xl\">\n {legacy}\n {recent && visible.length ? <Stack gap=\"sm\" ref={hostRef}>\n <Stack axis=\"inline\" justify=\"between\" align=\"center\" gap=\"sm\">\n <Heading level=\"level5\" semanticLevel={2}>{recent.title}</Heading>\n <Button tone=\"ghost\" size=\"small\" edge=\"end\" onClick={onClearAll}>{recent.clearAllLabel}</Button>\n </Stack>\n {/* The remove control is the row's trailingAction on both platforms: it sits outside the row command, the row text\n stays on the gutter and the edge-aligned × glyph ends on the gutter line (2026-10-17 alignment decision). */}\n <Stack gap=\"xxs\">{visible.map((item, index) => <ListRow key={item} density=\"compact\" leading={recent.icon} title={item} onClick={() => onCommit(item)}\n trailingAction={<IconButton data-search-recent-remove=\"\" label={recent.removeLabel(item)} tone=\"ghost\" edge=\"end\" onClick={() => onRemove(item, index)}>{recent.removeIcon ?? \"×\"}</IconButton>} />)}</Stack>\n </Stack> : null}\n {suggested?.items.length ? <SearchSuggestedChips suggested={suggested} onCommit={onCommit} /> : null}\n </Stack>;\n}\n\nfunction SearchSuggestedChips({ suggested, onCommit }: { suggested: SearchSuggestedQueries; onCommit(query: string): void }) {\n return <Stack gap=\"sm\">\n <Heading level=\"level5\" semanticLevel={2}>{suggested.title}</Heading>\n <Stack axis=\"inline\" wrap gap=\"xs\">{suggested.items.map(item => <Chip key={item} label={item} onPress={() => onCommit(item)} />)}</Stack>\n </Stack>;\n}\n\nfunction SearchSuggestionList({ query, suggestions, onCommit }: { query: string; suggestions: SearchSuggestions; onCommit(query: string): void }) {\n const typed = query.trim();\n const items = suggestions.items.slice(0, Math.max(0, suggestions.maxVisible ?? searchScreenRecipe.suggestionVisible));\n return <Stack gap=\"xxs\">\n <ListRow density=\"compact\" leading={suggestions.icon} title={suggestions.commitLabel(typed)} onClick={() => onCommit(typed)} />\n {items.map(item => <ListRow key={item.query} density=\"compact\" leading={suggestions.icon} title={<Highlighted text={item.query} match={item.match} />} onClick={() => onCommit(item.query)} />)}\n </Stack>;\n}\n\nfunction SearchResultsHeader({ summary, applied, cause, appliedHost, onRemove, onClearAll, onSortChange }: {\n summary: SearchResultSummary | undefined; applied: SearchAppliedFilters | undefined; cause: SearchEmptyCause;\n appliedHost: RefObject<HTMLDivElement | null>; onRemove(key: string, index: number): void; onClearAll(): void; onSortChange(id: string): void;\n}) {\n const sort = summary?.sort;\n const showCount = summary && cause === \"none\" && summary.countVisibility !== \"hidden\";\n // A count-free search still owns its sorting action; do not hide it with the total.\n const showSort = summary && cause === \"none\" && sort;\n if (!summary?.notice && !showCount && !showSort && !applied?.items.length) return null;\n // The sort trigger ends the count row: edge=\"end\" puts its chevron on the gutter like the count text starts on it\n // (2026-10-17 measured audit: chevron 29 from the edge against 16).\n return <Stack gap=\"sm\">\n {summary?.notice}\n {showCount || showSort ? <Stack axis=\"inline\" justify={showCount ? \"between\" : \"end\"} align=\"center\" gap=\"sm\" wrap>\n {showCount ? (summary!.count === null ? <Skeleton shape=\"text\" width=\"30%\" /> : <Text tone=\"muted\">{summary!.countLabel(summary!.count)}</Text>) : null}\n {sort ? <Menu label={sort.label} align=\"end\" selectionMode=\"single\" value={sort.value} onValueChange={onSortChange}\n items={sort.options.map(option => ({ id: option.id, label: option.label }))}\n trigger={<Button size=\"small\" tone=\"ghost\" edge=\"end\" {...(sort.icon === undefined ? {} : { trailing: sort.icon })}>{sort.triggerLabel}</Button>} /> : null}\n </Stack> : null}\n {applied?.items.length ? <Stack ref={appliedHost} axis=\"inline\" wrap gap=\"xs\" align=\"center\">\n {applied.items.map((item, index) => <Chip key={item.key} data-search-applied-filter=\"\" label={item.label} aria-label={applied.removeLabel(item.label)}\n trailing={applied.removeIcon ?? <span aria-hidden=\"true\">×</span>} onPress={() => onRemove(item.key, index)} />)}\n <Button tone=\"ghost\" size=\"small\" onClick={onClearAll}>{applied.clearAllLabel}</Button>\n </Stack> : null}\n </Stack>;\n}\n\nfunction SearchResultsBody({ summary, applied, suggested, cause, onCommit, onClearAll, children }: {\n summary: SearchResultSummary | undefined; applied: SearchAppliedFilters | undefined; suggested: SearchSuggestedQueries | undefined;\n cause: SearchEmptyCause; onCommit(query: string): void; onClearAll(): void; children: ReactNode;\n}) {\n // Loading keeps each row's own height (ListRow `loading`), so the list does not jump when results land.\n if (summary?.count === null) return <Stack gap=\"xxs\">{Array.from({ length: searchScreenRecipe.loadingRows }, (_, index) =>\n <ListRow key={index} loading title=\"\" description={summary.loadingLabel} {...(index === 0 ? { loadingLabel: summary.loadingLabel } : {})} />)}</Stack>;\n if (cause === \"none\" || !summary?.empty) return <>{children}</>;\n return <Stack gap=\"lg\">\n <EmptyState density=\"compact\" title={summary.empty.title} {...(summary.empty.description === undefined ? {} : { description: summary.empty.description })}\n {...(cause === \"filters\" && applied ? { action: <Button tone=\"secondary\" onClick={onClearAll}>{applied.clearAllLabel}</Button> } : {})} />\n {cause === \"query\" && suggested?.items.length ? <SearchSuggestedChips suggested={suggested} onCommit={onCommit} /> : null}\n {children}\n </Stack>;\n}\n\nfunction SearchFilterTrigger<F>({ sheet, appliedCount, triggerRef }: { sheet: SearchFilterSheet<F>; appliedCount: number; triggerRef: RefObject<HTMLButtonElement | null> }) {\n const trigger = sheet.trigger!;\n return <Chip ref={triggerRef} label={trigger.label(appliedCount)} aria-label={trigger.accessibilityLabel(appliedCount)} aria-haspopup=\"dialog\"\n {...(trigger.icon === undefined ? {} : { leading: trigger.icon })} onPress={() => sheet.onOpenChange(true)} />;\n}\n\n/** Wide windows get a side sheet so results stay visible beside the conditions (expanded = 960+). */\nfunction sidePlacement() {\n return typeof window !== \"undefined\" && [\"expanded\", \"wide\"].includes(resolveWindowClass(window.innerWidth));\n}\n\nfunction SearchFilterSheetView<F>({ sheet }: { sheet: SearchFilterSheet<F> }) {\n // The draft lives only while the sheet is open: seeded from `value` on open, dropped on every close,\n // so closing (×, scrim, back, Escape) never leaks half-edited conditions into the next opening.\n const [session, setSession] = useState<{ draft: F; side: boolean } | null>(null);\n if (sheet.open && !session) setSession({ draft: sheet.value, side: sidePlacement() });\n if (!sheet.open && session) setSession(null);\n const draft = session ? session.draft : sheet.value;\n const setDraft = (next: F) => setSession(current => current ? { ...current, draft: next } : current);\n const count = sheet.count(draft);\n // Reset sits left of the primary action on Web (sheet.md [secondary][primary]) and is always present,\n // disabled at the default, so the primary action does not jump when the draft changes.\n const footer = <Stack axis=\"inline\" justify=\"end\" gap=\"sm\" wrap>\n <Button tone=\"secondary\" disabled={sheet.isDefault(draft)} onClick={() => setDraft(sheet.reset(draft))}>{sheet.labels.reset}</Button>\n <Button disabled={count === 0} onClick={() => { sheet.onApply(draft); sheet.onOpenChange(false); }}>{sheet.labels.apply(count)}</Button>\n </Stack>;\n return <Sheet open={sheet.open} onOpenChange={open => sheet.onOpenChange(open)} title={sheet.title} closeLabel={sheet.labels.close}\n placement={session?.side ? \"end\" : \"bottom\"} size={sheet.size ?? \"large\"} footer={footer}>\n {sheet.renderContent(draft, setDraft)}\n </Sheet>;\n}\n\ntype SearchInputSlot = {queryField: ReactNode; queryClearLabel?: string} | {queryField?: never; queryClearLabel: string};\n/** `committedQuery` turns on two-step search; every commit (Enter, suggestion, recent, suggested query) then goes through `onSubmit`. */\n/** One name for the default field's progress on both platforms (Web SearchField `loading`, Native `busy`+`busyLabel`). */\ntype SearchProgressSlot = {searching?: never; searchingLabel?: never} | {searching: boolean; searchingLabel: string};\ntype SearchCommitSlot = {committedQuery?: never; onSubmit?: (query:string)=>void} | {committedQuery: string; onSubmit:(query:string)=>void};\nexport type SearchScreenProps<F = unknown> = Base & SearchInputSlot & SearchCommitSlot & SearchProgressSlot & {query:string;queryLabel:string;onQueryChange(value:string):void;onSearch(query:string,context:{signal:AbortSignal}):void;debounceMs?:number;filters?:ReactNode;recentSearches?:ReactNode;children:ReactNode;\n /** `scroll` keeps `filters` on one horizontally scrolling line that bleeds to the screen edges. */\n filtersOverflow?:\"wrap\"|\"scroll\";\n /** Gutter the host (Container `gutter`, Sheet = `regular`) already applies around this screen; the scroll rail bleeds over it too. */\n hostGutter?:ContainerGutter;\n /** `hidden` drops the visible label (the field keeps `queryLabel` as its accessible name and placeholder). */\n queryLabelVisibility?:\"visible\"|\"hidden\";\n recentQueries?:SearchRecentQueries;suggestedQueries?:SearchSuggestedQueries;suggestions?:SearchSuggestions;\n resultSummary?:SearchResultSummary;appliedFilters?:SearchAppliedFilters;filterSheet?:SearchFilterSheet<F>};\n/** Abort is supplied to the host request; the host must ignore aborted responses before committing results. */\nexport function SearchScreen<F = unknown>({query,queryLabel,queryField,queryClearLabel,onQueryChange,onSearch,debounceMs,filters,recentSearches,children,onSubmit,committedQuery,filtersOverflow=\"wrap\",hostGutter=\"none\",queryLabelVisibility=\"visible\",searching,searchingLabel,recentQueries,suggestedQueries,suggestions,resultSummary,appliedFilters,filterSheet,...screen}:SearchScreenProps<F>){\n // The host owns localized copy. A custom queryField owns its own clear affordance.\n if (queryField == null && !queryClearLabel?.trim()) throw new TypeError(\"SearchScreen requires a localized queryClearLabel for its default search field\");\n const searchDelay=resolveSearchDebounceMs(debounceMs);\n const callback=useRef(onSearch);callback.current=onSearch;\n useEffect(()=>{const controller=new AbortController();const timer=setTimeout(()=>callback.current(query,{signal:controller.signal}),searchDelay);return()=>{clearTimeout(timer);controller.abort();};},[query,searchDelay]);\n const fieldHost=useRef<HTMLDivElement>(null),bodyHost=useRef<HTMLDivElement>(null);\n const input=useCallback(()=>fieldHost.current?.querySelector<HTMLElement>(\"input\"),[]);\n const focus=useSearchRemovalFocus(recentQueries?.items.length??0,appliedFilters?.items.length??0,input);\n // Every commit path funnels through here so \"only committed searches are recorded\" holds at the API:\n // onSearch (debounced typing) never reaches onSubmit. Without onSubmit (one-step search) a pick only fills the field.\n const commit=(value:string)=>{const next=resolveSearchCommit(value);if(next===null)return;if(next!==query)onQueryChange(next);onSubmit?.(next);};\n // A picked suggestion/recent/suggested query unmounts with its phase, which dropped focus to <body>; move it to the\n // results region first (1.13.1, utilverse adoption 2026-10-06, Native twin: Keyboard.dismiss on every commit).\n // Leaving the field also closes a mobile browser's keyboard. Enter keeps focus in the field instead: it is still on\n // screen with the committed text, and moving it would make keyboard users Shift+Tab back to refine. Rejected: blur()\n // without a target, which leaves focus on <body> and loses the reading position for screen readers.\n const pick=(value:string)=>{if(resolveSearchCommit(value)!==null)bodyHost.current?.focus({preventScroll:true});commit(value);};\n // onSubmit separates \"typing\" from \"committed\" (recent-search writes, suggestion → results) without making\n // products rebuild the default field through queryField (2026-10-06 search redesign, usage/components/search-screen.md).\n // Enter while an IME is composing (Korean/Japanese) only confirms the syllable, so it must not commit.\n // The pending debounce is left alone: products decide whether submit should also flush a request.\n const submitProps=onSubmit?{enterKeyHint:\"search\" as const,onKeyDown:(event:KeyboardEvent<HTMLInputElement>)=>{if(event.key!==\"Enter\"||event.nativeEvent.isComposing||event.keyCode===229)return;commit(event.currentTarget.value);}}:{};\n // Reference services hide the label behind a placeholder; the placeholder names the search target (Apple HIG\n // search fields) and aria-label keeps the accessible name, so hiding never leaves an unnamed field.\n const labelProps=queryLabelVisibility===\"hidden\"?{\"aria-label\":queryLabel,placeholder:queryLabel}:{label:queryLabel};\n const phase=resolveSearchScreenPhase(query,committedQuery);\n const appliedCount=appliedFilters?.items.length??0;\n const cause=phase===\"results\"&&resultSummary?resolveSearchEmptyCause(resultSummary.count,appliedCount):\"none\";\n // Two-step search shows the rail only beside results (typing keeps the pinned area short), and a\n // query-caused zero hides it because no filter can fix that; a filter-caused zero keeps it to undo the filter.\n const showRail=(committedQuery===undefined||phase===\"results\")&&cause!==\"query\";\n const trigger=filterSheet?.trigger?<SearchFilterTrigger sheet={filterSheet} appliedCount={appliedCount} triggerRef={focus.filterTrigger}/>:null;\n const rail=!showRail?null:trigger&&filters!=null?<Stack axis=\"inline\" gap=\"xs\" wrap={filtersOverflow===\"wrap\"}>{trigger}{filters}</Stack>:trigger??filters;\n // Wrapping chips grow the pinned area line by line at large text; the scroll rail caps it at one row.\n // A product-owned CSS/ScrollView rail would re-derive bleed, scroll padding and RTL per app.\n // contentInset=\"none\" leaves the gutter to the host, which CSS cannot see; hostGutter names it (Native twin).\n const bleed=(screen.contentInset===\"none\"?0:screenPatternRecipe.padding)+containerRecipe.gutters[hostGutter];\n const filterSlot=rail!=null&&filtersOverflow===\"scroll\"?<div className=\"hjm-search-screen__filters\" data-overflow=\"scroll\" style={{\"--hjm-search-filters-bleed\":`${bleed}px`} as CSSProperties}>{rail}</div>:rail;\n const visibleSuggestions=suggestions?.items.slice(0,Math.max(0,suggestions.maxVisible??searchScreenRecipe.suggestionVisible)).length??0;\n const countAnnouncement=phase===\"typing\"&&suggestions?suggestions.countLabel(visibleSuggestions):phase===\"results\"&&resultSummary&&resultSummary.count!==null?resultSummary.countLabel(resultSummary.count):\"\";\n // 2026-10-06 utilverse adoption: products swapped the whole field just to show progress. The Web spinner is\n // aria-hidden, so the localized searching label goes through the same status region as the counts.\n const announcement=searching&&searchingLabel?searchingLabel:countAnnouncement;\n const removeRecent=(item:string,index:number)=>{focus.schedule({list:\"recent\",index,from:recentQueries!.items.length});recentQueries!.onRemove(item);};\n const clearRecent=()=>{focus.schedule({list:\"clearRecent\",index:-1,from:recentQueries!.items.length});recentQueries!.onClearAll();};\n const removeApplied=(key:string,index:number)=>{focus.schedule({list:\"applied\",index,from:appliedCount});appliedFilters!.onRemove(key);};\n const clearApplied=()=>{focus.schedule({list:\"clearApplied\",index:-1,from:appliedCount});appliedFilters!.onClearAll();};\n // A new order starts at the top; the previous offset would land mid-list in unrelated results.\n const changeSort=(id:string)=>{resultSummary?.sort?.onChange(id);bodyHost.current?.closest(\".hjm-screen__body\")?.scrollTo?.({top:0});};\n const idle=<SearchIdleSections recent={recentQueries} suggested={suggestedQueries} legacy={recentSearches} onCommit={pick} hostRef={focus.recentHost} onRemove={removeRecent} onClearAll={clearRecent}/>;\n const body=phase===\"idle\"?<>{idle}{committedQuery===undefined?children:null}</>\n :phase===\"typing\"?(suggestions?<SearchSuggestionList query={query} suggestions={suggestions} onCommit={pick}/>:null)\n :<><SearchResultsHeader summary={resultSummary} applied={appliedFilters} cause={cause} appliedHost={focus.appliedHost} onRemove={removeApplied} onClearAll={clearApplied} onSortChange={changeSort}/>\n <SearchResultsBody summary={resultSummary} applied={appliedFilters} suggested={suggestedQueries} cause={cause} onCommit={pick} onClearAll={clearApplied}>{children}</SearchResultsBody></>;\n // Search-first routes have no visible heading: navigation and input share one row.\n // Keep explicit host headers and described/titled screens in their existing layout.\n const inlineNavigation=screen.titleVisibility===\"hidden\"&&screen.header==null&&!screen.description;\n const searchInput=queryField ?? <SearchField {...labelProps} clearLabel={queryClearLabel!} value={query} onValueChange={onQueryChange} loading={searching??false} {...submitProps}/>;\n const queryRow=inlineNavigation?<Stack axis=\"inline\" align=\"center\" gap=\"sm\">{screen.exit?<ScreenExitButton {...screen.exit}/>:null}<div style={{flex:1,minWidth:0}}>{searchInput}</div>{screen.actions}</Stack>:searchInput;\n return <><ScreenLayout {...screen} {...(inlineNavigation?{header:<></>}: {})} notice={<Stack gap=\"sm\" ref={fieldHost}>{queryRow}{filterSlot}{screen.notice}</Stack>}><Stack gap=\"lg\" ref={bodyHost} className=\"hjm-search-screen__results\" tabIndex={-1}>{suggestions||resultSummary||searchingLabel?<SearchAnnouncement text={announcement}/>:null}{body}</Stack></ScreenLayout>\n {filterSheet?<SearchFilterSheetView sheet={filterSheet}/>:null}</>;\n}\n\nexport type PermissionScreenProps = Base & {status:PermissionScreenStatus;illustration?:ReactNode;explanation:ReactNode;request:ScreenFlowAction;settings:ScreenFlowAction;continueAction:ScreenFlowAction;skip?:ScreenFlowAction};\nexport function PermissionScreen({status,illustration,explanation,request,settings,continueAction,skip,...screen}:PermissionScreenProps){const kind=resolvePermissionAction(status);const primary=kind===\"request\"?request:kind===\"settings\"?settings:kind===\"continue\"?continueAction:null;return <ScreenLayout {...screen} footer={<Stack gap=\"xs\">{primary?<Action action={primary}/>:null}{skip?<Action action={skip} secondary/>:null}</Stack>}><Stack gap=\"xl\" align=\"center\">{illustration}{explanation}</Stack></ScreenLayout>;}\n\nexport type OnboardingStep = {id:string;title:string;description:string;content:ReactNode};\nexport type OnboardingScreenProps = {steps:readonly OnboardingStep[];index:number;onIndexChange(index:number):void;nextLabel:string;backLabel:string;complete:ScreenFlowAction;skip?:ScreenFlowAction;progressLabel(index:number,total:number):string;layoutStyle?:ScreenLayoutProps[\"layoutStyle\"]};\nexport function OnboardingScreen({steps,index,onIndexChange,nextLabel,backLabel,complete,skip,progressLabel,layoutStyle}:OnboardingScreenProps){const position=resolveOnboardingStep(steps.length,index);const step=steps[index]!;\n // Completion and skip persist the same flow: keep navigation stable until the receipt.\n const host=useRef<HTMLDivElement|null>(null);\n // ScreenLayout owns this scroll region; keep focus while resetting each new step.\n useLayoutEffect(()=>{const body=host.current?.querySelector<HTMLElement>(\".hjm-screen__body\");if(body)body.scrollTop=0;},[index]);\n const pending=!!(complete.pending||skip?.pending);\n return <div ref={host} style={{display:\"contents\"}}><ScreenLayout {...(layoutStyle===undefined?{}:{layoutStyle})} title={step.title} description={step.description} actions={skip?<Action action={{...skip,disabled:!!(skip.disabled||pending)}} secondary/>:null} notice={<Text variant=\"caption\" tone=\"muted\">{progressLabel(index+1,steps.length)}</Text>} footer={<Stack gap=\"xs\"><Action action={position.last?{...complete,disabled:!!(complete.disabled||pending)}:{label:nextLabel,disabled:pending,onAction:()=>onIndexChange(index+1)}}/>{!position.first?<Action action={{label:backLabel,disabled:pending,onAction:()=>onIndexChange(index-1)}} secondary/>:null}</Stack>}>{step.content}</ScreenLayout></div>;}\n\nexport type CommentThreadItem = Readonly<{id:string;parentId:string|null;author:string;body:ReactNode;bodyText?:string;timeLabel:string;timeDateTime?:string;likeCountLabel:string;avatar?:ReactNode;likeIcon:ReactNode;likeLabel:string;likeAction?:ReactNode;actions?:ReactNode;canReply?:boolean;replyDisabled?:boolean;\n /** Long-press the comment (author and body) to react; the product owns the stored value and summary. */\n reactions?:CommentReactions;reactionSummary?:ReactNode;\n /** Optional photo or sticker under the body; HJM bounds its width and corners, the product sizes the image. */\n media?:ReactNode}>;\nexport type CommentReactions = ReactionPickerProps & Readonly<{closeLabel:string;menuAction?:Readonly<{label:string;onPress():void;disabled?:boolean}>;menuActions?:readonly MessageMenuAction[];reportAction?:Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;interactiveContent?:boolean;/** Icon for the automatic \"reply\" row of the hold menu. */replyIcon?:ReactNode}>;\n/**\n * HJM-owned \"more\" menu per comment (2026-10-17: common comment structure belongs to HJM, review S4#7). HJM draws the\n * vertical-dots button at the row's trailing edge and opens the shared Menu with danger items last; the product supplies\n * only the localized button name, the items allowed for that comment and the action callback.\n */\nexport type CommentMenu = Readonly<{\n /** Localized accessible name of the button, e.g. \"More options for seoyeon's comment\". */\n label(item: CommentThreadItem): string;\n /** Items allowed for this comment (permission is product-owned). An empty list omits the button for that row. */\n items(item: CommentThreadItem): readonly CommentMenuItemDescriptor[];\n /** Runs after the menu closes, so a confirmation dialog can open without competing with the menu for focus. */\n onAction(item: CommentThreadItem, id: string): void;\n}>;\nexport type CommentThreadScreenProps = Base & {items:readonly CommentThreadItem[];expandedIds:readonly string[];onExpandedChange(id:string):void;onLike(id:string):void;onReply(id:string):void;replyLabel:string;repliesLabel(count:number,expanded:boolean):string;composer?:ReactNode;threadHeader?:ReactNode;threadFooter?:ReactNode;commentMenu?:CommentMenu};\nexport type CommentThreadRowProps = Readonly<{ layoutStyle?: ScreenLayoutProps[\"layoutStyle\"]; item: CommentThreadItem; onLike(id: string): void; onReply(id: string): void; replyLabel: string; commentMenu?: CommentMenu }>;\n/** Quiet secondary actions (reply, expand) read as muted copy beside the body, not as filled buttons. */\nfunction CommentTextAction({label,onPress,disabled=false,expanded}:Readonly<{label:string;onPress():void;disabled?:boolean;expanded?:boolean}>){\n return <button type=\"button\" className=\"hjm-comment-row__action\" disabled={disabled} aria-expanded={expanded} onClick={onPress}>{label}</button>;\n}\n\n/** Vertical dots drawn in the icon grid, matching Native's drawn glyph (the semantic `more` icon is horizontal). */\nfunction CommentMenuGlyph(){const size=commentThreadRecipe.menuGlyphSize;return <svg aria-hidden=\"true\" focusable=\"false\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">{[5,12,19].map(y=><circle key={y} cx=\"12\" cy={y} r=\"1.75\"/>)}</svg>;}\nfunction CommentMenuButton({item,menu,items}:Readonly<{item:CommentThreadItem;menu:CommentMenu;items:readonly CommentMenuItemDescriptor[]}>){\n const label=menu.label(item);\n return <Menu label={label} align=\"end\" trigger={<IconButton label={label} tone=\"ghost\"><CommentMenuGlyph/></IconButton>} items={items.map(entry=>({id:entry.id,label:entry.label,textValue:entry.label,...(entry.tone===undefined?{}:{tone:entry.tone}),...(entry.disabled===undefined?{}:{disabled:entry.disabled})}))} onActionAfterDismiss={id=>menu.onAction(item,id)}/>;\n}\n\n/** Virtualized hosts reuse the same row as CommentThreadScreen; product slots add content, not a second layout. */\nexport function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle, commentMenu }: CommentThreadRowProps) {\n const avatarSize=item.parentId===null?commentThreadRecipe.avatarSize:commentThreadRecipe.replyAvatarSize;\n const canReply=item.canReply??item.parentId===null;\n const menuItems=commentMenu?resolveCommentMenuItems(commentMenu.items(item)):[];\n const time=item.timeLabel?<time className=\"hjm-comment-row__time\" dateTime={item.timeDateTime}><Text variant=\"caption\" tone=\"muted\">{item.timeLabel}</Text></time>:null;\n // The like count sits under the heart so the text column carries only identity, body and reply.\n return <Stack key={item.id} axis=\"inline\" align=\"start\" gap=\"xs\" {...(layoutStyle === undefined ? {} : {layoutStyle})}>{item.avatar?<div className=\"hjm-comment-row__avatar\" style={{inlineSize:avatarSize}}>{item.avatar}</div>:null}<div className=\"hjm-comment-row__text\" style={{gap:commentThreadRecipe.lineGap}}>\n {/* Only identity and body are the hold target, so the reply action keeps its own button semantics. */}\n {(()=>{const identity=<>{item.bodyText!==undefined?<Text><Text emphasis=\"strong\">{item.author}</Text>{\" \"}{item.bodyText}</Text>:(item.author||item.timeLabel)?<Stack axis=\"inline\" gap=\"xxs\" align=\"center\" layoutStyle={{flexWrap:\"wrap\"}}>{item.author?<Text variant=\"caption\" emphasis=\"strong\">{item.author}</Text>:null}{time}</Stack>:null}\n {item.body}{item.media?<div className=\"hjm-comment-row__media\" style={{maxInlineSize:commentThreadRecipe.mediaMaxWidth,borderRadius:commentThreadRecipe.mediaRadius}}>{item.media}</div>:null}</>;return item.reactions?<MessageReactions {...item.reactions} {...((item.canReply??item.parentId===null)&&!item.replyDisabled ? {replyAction:{label:replyLabel,onPress:()=>onReply(item.id),...(item.reactions.replyIcon===undefined?{}:{icon:item.reactions.replyIcon})}} : {})} triggerClassName=\"hjm-comment-row__reactions\">{identity}</MessageReactions>:identity;})()}\n {(item.bodyText!==undefined&&time)||canReply||item.reactionSummary?<Stack axis=\"inline\" gap=\"sm\" align=\"center\" layoutStyle={{flexWrap:\"wrap\"}}>{item.bodyText!==undefined?time:null}{item.reactionSummary}{canReply?<CommentTextAction label={replyLabel} disabled={item.replyDisabled??false} onPress={()=>onReply(item.id)}/>:null}</Stack>:null}</div>\n <div className=\"hjm-comment-row__like\" {...(menuItems.length||item.actions==null&&item.likeAction===undefined?{\"data-edge\":\"end\"}:{})} style={{\"--hjm-comment-anchor-line\":`var(--hjm-type-${item.bodyText!==undefined?commentThreadRecipe.actionAnchor.inlineTextVariant:commentThreadRecipe.actionAnchor.authorTextVariant}-line-height)`} as CSSProperties}><Stack axis=\"inline\" gap=\"xxs\" align=\"center\" layoutStyle={{flexShrink:0}}>{item.likeAction!==undefined?item.likeAction:<IconButton label={item.likeLabel} tone=\"ghost\" onClick={()=>onLike(item.id)}>{item.likeIcon}</IconButton>}{item.actions}{commentMenu&&menuItems.length?<CommentMenuButton item={item} menu={commentMenu} items={menuItems}/>:null}</Stack>{item.likeCountLabel?<div className=\"hjm-comment-row__like-count\" style={{inlineSize:commentThreadRecipe.likeColumnWidth}}><Text variant=\"caption\" tone=\"muted\">{item.likeCountLabel}</Text></div>:null}</div></Stack>;\n}\n\n/** Controlled thread: server ordering, permission checks and receipt-based draft clearing belong to the product. */\nexport function CommentThreadScreen({items,expandedIds,onExpandedChange,onLike,onReply,replyLabel,repliesLabel,composer,threadHeader,threadFooter,commentMenu,...screen}:CommentThreadScreenProps){\n validateCommentThread(items);\n // Index replies once; rescanning every item for each root makes long threads quadratic.\n const roots:CommentThreadItem[]=[], repliesByParent=new Map<string,CommentThreadItem[]>();\n const expanded=new Set(expandedIds);\n for(const item of items){\n if(item.parentId===null)roots.push(item);\n else {const siblings=repliesByParent.get(item.parentId);if(siblings)siblings.push(item);else repliesByParent.set(item.parentId,[item]);}\n }\n const row=(item:CommentThreadItem)=><CommentThreadRow key={item.id} item={item} onLike={onLike} onReply={onReply} replyLabel={replyLabel} {...(commentMenu===undefined?{}:{commentMenu})}/>;\n // Product context belongs in the same scroll body as comments. Putting a tall\n // overview in the fixed header forced a second scroll region in Spint (2026-10-08).\n return <ScreenLayout {...screen} footer={!screen.state||screen.state.kind===\"ready\"||screen.state.kind===\"empty\"?composer:null}><Stack gap=\"lg\">{threadHeader}<div className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap}}>{roots.map(item=>{const replies=repliesByParent.get(item.id)??[];return <div key={item.id} className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap}}>{row(item)}{replies.length?<div className=\"hjm-comment-thread\" style={{gap:commentThreadRecipe.rowGap,marginInlineStart:commentThreadRecipe.replyIndent}}><CommentTextAction label={repliesLabel(replies.length,expanded.has(item.id))} expanded={expanded.has(item.id)} onPress={()=>onExpandedChange(item.id)}/>{expanded.has(item.id)?replies.map(row):null}</div>:null}</div>;})}</div>{threadFooter}</Stack></ScreenLayout>;\n}\n\nexport type ProfileSummaryProps = Readonly<{\n name: string;\n headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;\n avatar: ReactNode;\n badge?: ReactNode;\n nameActions?: ReactNode;\n stats?: readonly Readonly<{ id: string; value: string; label: string; onPress?(): void; disabled?: boolean }>[];\n actions?: ReactNode;\n children?: ReactNode;\n}>;\n\n/** Profile identity and counts are common; routing and mutations stay controlled by the product. */\nexport function ProfileSummary({ name, headingLevel = 2, avatar, badge, nameActions, stats = [], actions, children }: ProfileSummaryProps) {\n return <CompositionLayout title={name} headingLevel={headingLevel} leading={<span style={{ display: \"flex\", width: profileSummaryRecipe.avatarSize, height: profileSummaryRecipe.avatarSize, flexShrink: 0, borderRadius: \"50%\", overflow: \"hidden\" }}>{avatar}</span>} badge={badge} actions={nameActions} footer={children}>\n {/* Static and actionable counts occupy identical cells; button hit areas must not shift their baselines. */}\n {stats.length ? <Stack axis=\"inline\" gap=\"md\" align=\"stretch\" layoutStyle={{ width: \"100%\" }}>{stats.map(stat =>\n <Stack key={stat.id} gap=\"xxs\" align=\"center\" justify=\"center\" layoutStyle={{ flex: 1, minWidth: 0 }}>\n {stat.onPress ? <Button tone=\"ghost\" aria-label={`${stat.value} ${stat.label}`} disabled={stat.disabled ?? false} onClick={stat.onPress} layoutStyle={{ width: \"100%\" }}><Stack gap=\"xxs\" align=\"center\"><Text emphasis=\"strong\">{stat.value}</Text><Text variant=\"caption\" tone=\"muted\">{stat.label}</Text></Stack></Button>\n : <><Text emphasis=\"strong\">{stat.value}</Text><Text variant=\"caption\" tone=\"muted\">{stat.label}</Text></>}\n </Stack>)}</Stack> : null}\n {actions ? <Stack axis=\"inline\" gap=\"sm\" wrap>{actions}</Stack> : null}\n </CompositionLayout>;\n}\n"]}
|
package/dist/screens.d.ts
CHANGED
|
@@ -151,7 +151,7 @@ export type ChatMessageProps = ChatMessageDescriptor & Readonly<{
|
|
|
151
151
|
replyLink?: Readonly<{
|
|
152
152
|
label: string;
|
|
153
153
|
onPress(): void;
|
|
154
|
-
}>; /** HJM-drawn quote ("X
|
|
154
|
+
}>; /** HJM-drawn quote ("Replying to X" + one-line excerpt) heading the bubble; preferred over a custom `reply` node. */
|
|
155
155
|
replyQuote?: Readonly<{
|
|
156
156
|
title: string;
|
|
157
157
|
excerpt: string;
|
package/dist/screens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../src/screens.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE1G,OAAO,EAA8B,KAAK,+BAA+B,EAAE,MAAM,+CAA+C,CAAC;AACjI,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,OAAO,EAA4C,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3F,OAAO,EAA6G,KAAK,2BAA2B,EAAiM,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAGnf,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,kFAAkF;IAClF,eAAe,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACvC,qHAAqH;IACrH,eAAe,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACrC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,uHAAuH;IACvH,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACtC,mEAAmE;IACnE,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,+BAA+B,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,eAA2B,EAAE,eAA0B,EAAE,MAAM,EAAE,YAAwB,EAAE,gBAA0B,EAAE,OAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAyB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAiB,EAAE,EAAE,EAAE,OAAgB,EAAE,SAAS,EAAE,WAAW,EAAG,eAAe,EAAE,EAAE,iBAAiB,GAAG,QAAQ,CAAC;IAA4C,eAAe,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,+
|
|
1
|
+
{"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../src/screens.tsx"],"names":[],"mappings":"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"}
|
package/dist/screens.js
CHANGED
|
@@ -55,7 +55,7 @@ export function ScreenLayout({ title, titleBadge, titleVisibility = "visible", h
|
|
|
55
55
|
if (event.relatedTarget ? !event.currentTarget.contains(event.relatedTarget) : event.target.isConnected) {
|
|
56
56
|
lastBodyFocus.current = null;
|
|
57
57
|
}
|
|
58
|
-
}, className: "hjm-screen__body", "data-content-alignment": contentAlignment, "data-scroll": bodyScroll, "data-replacement": resolved.replacesContent || undefined, "aria-busy": resolved.busy || undefined, children: state.kind === "ready" ? (contentAlignment === "center" ? _jsx("div", { className: "hjm-screen__centered-content", children: children }) : children) : _jsxs("div", { className: "hjm-screen__state",
|
|
58
|
+
}, className: "hjm-screen__body", "data-content-alignment": contentAlignment, "data-scroll": bodyScroll, "data-replacement": resolved.replacesContent || undefined, "aria-busy": resolved.busy || undefined, children: state.kind === "ready" ? (contentAlignment === "center" ? _jsx("div", { className: "hjm-screen__centered-content", children: children }) : 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: _jsx(ScreenFooterContext.Provider, { value: contentInset !== "none", children: footer }) }) : null] });
|
|
59
59
|
}
|
|
60
60
|
export function SettingsScreen({ profile, sections, ...props }) {
|
|
61
61
|
// Keep semantic section headings while using the smaller settings label role.
|
|
@@ -140,7 +140,7 @@ export function ChatMessage({ direction, author, timestamp, timestampPresentatio
|
|
|
140
140
|
}
|
|
141
141
|
export function CompositionLayout({ title, headingLevel = 3, description, badge, leading, actions, notice, children, footer, state = { kind: "ready" }, stateAction, loadingIndicator, layoutStyle }) {
|
|
142
142
|
const resolved = resolveScreenContentState(state);
|
|
143
|
-
return _jsxs(Stack, { gap: "md", ...(layoutStyle === undefined ? {} : { layoutStyle }), children: [title || description || badge || leading || actions ? _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [leading, _jsxs(Stack, { gap: "xxs", layoutStyle: { flex: 1, minWidth: 0 }, children: [_jsxs(Stack, { axis: "inline", gap: "xs", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [title ? _jsx(Heading, { level: "level3", semanticLevel: headingLevel, children: title }) : null, badge] }), description ? _jsx(Text, { tone: "muted", children: description }) : null] }), actions] }) : null, notice, state.kind === "ready" ? children : _jsxs(Stack, { gap: "sm", align: "center", justify: "center",
|
|
143
|
+
return _jsxs(Stack, { gap: "md", ...(layoutStyle === undefined ? {} : { layoutStyle }), children: [title || description || badge || leading || actions ? _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [leading, _jsxs(Stack, { gap: "xxs", layoutStyle: { flex: 1, minWidth: 0 }, children: [_jsxs(Stack, { axis: "inline", gap: "xs", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [title ? _jsx(Heading, { level: "level3", semanticLevel: headingLevel, children: title }) : null, badge] }), description ? _jsx(Text, { tone: "muted", children: description }) : null] }), actions] }) : null, notice, state.kind === "ready" ? children : _jsxs(Stack, { gap: "sm", align: "center", justify: "center", layoutStyle: { flex: 1 }, children: [resolved.busy ? (loadingIndicator ? _jsx("div", { role: "status", "aria-busy": "true", "aria-label": [state.title, state.description].filter(Boolean).join(". "), children: _jsx("div", { "aria-hidden": "true", children: loadingIndicator }) }) : _jsx(Spinner, { label: [state.title, state.description].filter(Boolean).join(". ") })) : _jsxs("div", { role: state.kind === "error" ? "alert" : "status", style: { textAlign: "center" }, children: [_jsx(Text, { as: "p", variant: "title", children: state.title }), state.description ? _jsx(Text, { as: "p", tone: "muted", children: state.description }) : null] }), stateAction] }), footer] });
|
|
144
144
|
}
|
|
145
145
|
/** Router host owns the sole target and localized accessible name, as with ConversationRow. */
|
|
146
146
|
export function NotificationRow({ preview, metadata, avatar, avatarBadge, thumbnail, unread = false }) {
|