@hjmds/react 1.27.2 → 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.
Files changed (56) hide show
  1. package/dist/auth-screen.d.ts +32 -2
  2. package/dist/auth-screen.d.ts.map +1 -1
  3. package/dist/auth-screen.js +52 -4
  4. package/dist/auth-screen.js.map +1 -1
  5. package/dist/chart.d.ts +1 -1
  6. package/dist/chart.js.map +1 -1
  7. package/dist/collection-editing.js.map +1 -1
  8. package/dist/communication.js +1 -1
  9. package/dist/communication.js.map +1 -1
  10. package/dist/data-table.d.ts +2 -2
  11. package/dist/data-table.d.ts.map +1 -1
  12. package/dist/data-table.js.map +1 -1
  13. package/dist/display.d.ts.map +1 -1
  14. package/dist/display.js +5 -2
  15. package/dist/display.js.map +1 -1
  16. package/dist/evidence.d.ts +1 -1
  17. package/dist/evidence.js +2 -2
  18. package/dist/evidence.js.map +1 -1
  19. package/dist/feedback.d.ts +10 -0
  20. package/dist/feedback.d.ts.map +1 -1
  21. package/dist/feedback.js +6 -1
  22. package/dist/feedback.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/internal/list-row-scroll-room.d.ts +16 -0
  28. package/dist/internal/list-row-scroll-room.d.ts.map +1 -0
  29. package/dist/internal/list-row-scroll-room.js +17 -0
  30. package/dist/internal/list-row-scroll-room.js.map +1 -0
  31. package/dist/notification-bell.d.ts +4 -1
  32. package/dist/notification-bell.d.ts.map +1 -1
  33. package/dist/notification-bell.js +5 -2
  34. package/dist/notification-bell.js.map +1 -1
  35. package/dist/overlays.js +2 -2
  36. package/dist/overlays.js.map +1 -1
  37. package/dist/screen-flows.d.ts +2 -2
  38. package/dist/screen-flows.d.ts.map +1 -1
  39. package/dist/screen-flows.js +1 -1
  40. package/dist/screen-flows.js.map +1 -1
  41. package/dist/screens.d.ts +1 -1
  42. package/dist/screens.d.ts.map +1 -1
  43. package/dist/screens.js.map +1 -1
  44. package/dist/selection.d.ts.map +1 -1
  45. package/dist/selection.js +2 -2
  46. package/dist/selection.js.map +1 -1
  47. package/dist/styles.css +183 -108
  48. package/dist/styles.layered.css +183 -108
  49. package/dist/theme.d.ts.map +1 -1
  50. package/dist/theme.js +14 -3
  51. package/dist/theme.js.map +1 -1
  52. package/dist/top.js +1 -1
  53. package/dist/top.js.map +1 -1
  54. package/dist/virtual-list.js +4 -4
  55. package/dist/virtual-list.js.map +1 -1
  56. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"collection-editing.js","sourceRoot":"","sources":["../src/collection-editing.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { assertDistinctIds, changeColumnSettings, collectionEditingRecipe, focusAfterRemoval, recoverableFilters, snapshotSelection, type ColumnSetting, type FilterRecoveryOption, type FocusTarget, type SelectionAction } from \"@hjmds/design-contracts/collection-editing\";\nimport { Button, IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { TextField } from \"./forms.js\";\nimport { Checkbox } from \"./selection.js\";\nimport { Stack, Text } from \"./layout.js\";\nimport { FieldGroup, type FieldGroupBinding, type FieldGroupProps } from \"./field-group.js\";\n\n\nfunction ErrorMessage({ children }: { children: ReactNode }) {\n return <div role=\"alert\" style={{ display: \"grid\", placeItems: \"center\", textAlign: \"center\" }}><Text tone=\"danger\">{children}</Text></div>;\n}\n\nexport type InlineEditProps = Readonly<{\n id: string; value: string; label: string; editLabel: string; saveLabel: string; cancelLabel: string; errorLabel: string;\n disabled?: boolean; validate?: (draft: string) => string | undefined;\n /** Resolve only after confirming and updating the product value; reject to preserve the draft. */\n onSave: (draft: string) => void | Promise<void>;\n}>;\nexport function InlineEdit(props: InlineEditProps) { return <InlineEditBody key={props.id} {...props} />; }\nfunction InlineEditBody(props: InlineEditProps) {\n const [editing, setEditing] = useState(false), [draft, setDraft] = useState(props.value);\n const action = useCompositionAction(props.disabled);\n const input = useRef<HTMLInputElement>(null), trigger = useRef<HTMLButtonElement>(null), group = useRef<HTMLDivElement>(null);\n const restore = useRef(false);\n useLayoutEffect(() => {\n if (editing) input.current?.focus();\n else if (restore.current) { restore.current = false; trigger.current?.focus(); }\n }, [editing]);\n const error = props.validate?.(draft);\n const close = () => {\n restore.current = group.current?.contains(document.activeElement) ?? false;\n setEditing(false);\n };\n const save = async () => {\n if (props.disabled || error || action.pending || action.session.getSnapshot().status === \"pending\") return;\n const result = await action.run(\"save\", () => props.onSave(draft));\n if (result.status === \"success\") close();\n };\n return <div ref={group} role=\"group\" aria-label={props.label}>\n {/* Read state names the value with its label and edits through a pencil tool at the row end; a bare value beside a\n text \"제목 수정\" button lost the label (2026-10-17 review). */}\n {!editing ? <Stack axis=\"inline\" gap=\"sm\" align=\"center\">\n <Stack gap=\"xxs\" layoutStyle={{ flex: 1, minInlineSize: 0 }}><Text variant=\"caption\" tone=\"muted\">{props.label}</Text><Text emphasis=\"strong\">{props.value}</Text></Stack>\n <IconButton ref={trigger} label={props.editLabel} tone=\"ghost\" edge=\"end\" disabled={props.disabled ?? false} onClick={() => { setDraft(props.value); action.session.reset(null); setEditing(true); }}><Icon name=\"edit\" /></IconButton>\n </Stack>\n : <Stack gap={collectionEditingRecipe.actionGap}>\n <TextField ref={input} label={props.label} value={draft} disabled={props.disabled ?? false} readOnly={action.pending}\n {...(error ? { error, \"aria-invalid\": true } : {})} onValueChange={setDraft}\n onKeyDown={event => {\n // Enter during IME composition confirms a character, not the title.\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"Enter\") { event.preventDefault(); void save(); }\n if (event.key === \"Escape\" && !action.pending) { event.preventDefault(); event.stopPropagation(); close(); }\n }} />\n <Stack axis=\"inline\" gap=\"sm\" wrap><Button tone=\"ghost\" disabled={action.pending} onClick={close}>{props.cancelLabel}</Button>\n <Button loading={action.pending} disabled={props.disabled === true || !!error} onClick={() => void save()}>{props.saveLabel}</Button></Stack>\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack>}\n </div>;\n}\n\nexport type RepeatableFieldGroupProps = Omit<FieldGroupProps, \"renderField\"> & Readonly<{\n renderField: (binding: FieldGroupBinding & { focusRef: (target: FocusTarget | null) => void }) => ReactNode;\n addLabel: string; removeLabel: (id: string) => string; minFields?: number; maxFields?: number;\n /** Return the new stable id to focus after the controlled descriptor includes it. */\n onAdd: () => string | undefined; onRemove: (id: string) => void;\n}>;\nexport function RepeatableFieldGroup({ renderField, addLabel, removeLabel, minFields = 0, maxFields = Infinity, onAdd, onRemove, ...props }: RepeatableFieldGroupProps) {\n const targets = useRef(new Map<string, FocusTarget>()), add = useRef<HTMLButtonElement>(null);\n const focus = useRef<string | null | undefined>(undefined);\n useLayoutEffect(() => {\n if (focus.current === undefined) return;\n if (focus.current === null) { add.current?.focus(); focus.current = undefined; }\n else if (targets.current.has(focus.current)) { targets.current.get(focus.current)?.focus(); focus.current = undefined; }\n });\n const fields = props.descriptor.fields;\n const live = useRef(true), policy = useRef({ fields, minFields, maxFields, onAdd, onRemove, disabled: props.descriptor.disabled });\n policy.current = { fields, minFields, maxFields, onAdd, onRemove, disabled: props.descriptor.disabled };\n useEffect(() => { live.current = true; return () => { live.current = false; }; }, []);\n return <Stack gap={collectionEditingRecipe.gap}>\n {/* Remove is a row tool: a trash IconButton at the field's end whose label names the row (icon-button.md), not a\n full-width ghost text button under the field (2026-10-17 review). End-aligned so it sits beside the input. */}\n <FieldGroup {...props} renderField={binding => <Stack axis=\"inline\" gap=\"xs\" align=\"end\">\n <div style={{ flex: 1, minInlineSize: 0 }}>{renderField({ ...binding, focusRef: target => { if (target) targets.current.set(binding.id, target); else targets.current.delete(binding.id); } })}</div>\n <IconButton label={removeLabel(binding.id)} tone=\"ghost\" edge=\"end\" disabled={binding.controlProps.disabled || fields.length <= minFields} onClick={binding.guardChange(() => {\n const current = policy.current;\n if (!live.current || current.disabled || current.fields.length <= current.minFields) return;\n focus.current = focusAfterRemoval(current.fields.map(field => field.id), binding.id, current.fields.filter(field => field.disabled).map(field => field.id)) ?? null;\n current.onRemove(binding.id);\n })}><Icon name=\"delete\" /></IconButton>\n </Stack>} />\n <Button ref={add} tone=\"secondary\" disabled={props.descriptor.disabled === true || fields.length >= maxFields} onClick={() => {\n const current = policy.current;\n if (!live.current || current.disabled || current.fields.length >= current.maxFields) return;\n const id = current.onAdd(); if (id !== undefined) focus.current = id;\n }}>{addLabel}</Button>\n </Stack>;\n}\n\nexport type SelectionActionBarProps = Readonly<{\n selectedIds: readonly string[]; selectionLabel: (count: number) => string;\n clearLabel: string; onClear: () => void; actions: readonly SelectionAction[];\n onAction: (actionId: string, selectedIds: readonly string[]) => void | Promise<void>; errorLabel: string; disabled?: boolean;\n /** Product supplies the exact confirmed operation to undo; never restore an entire collection. */\n recovery?: Readonly<{ label: string; onUndo: () => void | Promise<void> }>;\n}>;\nexport function SelectionActionBar(props: SelectionActionBarProps) {\n const action = useCompositionAction(props.disabled);\n assertDistinctIds(props.actions); snapshotSelection(props.selectedIds);\n if (!props.selectedIds.length && !props.recovery && !action.pending && !action.failed) return null;\n return <div role=\"group\" aria-label={props.selectionLabel(props.selectedIds.length)}><Stack gap=\"sm\">\n <Text role=\"status\">{props.selectionLabel(props.selectedIds.length)}</Text>\n <Stack axis=\"inline\" gap=\"sm\" wrap>\n {props.actions.map(item => <Button key={item.id} tone={item.destructive ? \"danger\" : \"secondary\"} loading={action.active === `action:${item.id}`} disabled={props.disabled === true || (action.pending && action.active !== `action:${item.id}`) || !props.selectedIds.length} onClick={() => {\n if (props.disabled) return;\n const scope = snapshotSelection(props.selectedIds);\n if (scope.length) void action.run(`action:${item.id}`, () => props.onAction(item.id, scope));\n }}>{item.label}</Button>)}\n <Button tone=\"ghost\" disabled={props.disabled === true || action.pending || !props.selectedIds.length} onClick={props.onClear}>{props.clearLabel}</Button>\n {props.recovery ? <Button tone=\"ghost\" loading={action.active === \"undo\"} disabled={props.disabled === true || (action.pending && action.active !== \"undo\")} onClick={() => {\n if (!props.disabled) void action.run(\"undo\", () => props.recovery!.onUndo());\n }}>{props.recovery.label}</Button> : null}\n </Stack>\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack></div>;\n}\n\nexport type FilterRecoveryProps = Readonly<{\n title: string; description?: string; options: readonly FilterRecoveryOption[];\n optionLabel: (option: FilterRecoveryOption) => string; onApply: (id: string) => void | Promise<void>;\n errorLabel: string; disabled?: boolean;\n}>;\nexport function FilterRecovery(props: FilterRecoveryProps) {\n const action = useCompositionAction(props.disabled), options = recoverableFilters(props.options);\n // Fills the result area its host gives it (flex parent) and centers there, like Native.\n return <div role=\"group\" aria-label={props.title} style={{ display: \"grid\", placeItems: \"center\", flexGrow: 1, textAlign: \"center\" }}><Stack gap=\"sm\" align=\"center\">\n <Text emphasis=\"strong\">{props.title}</Text>{props.description ? <Text tone=\"muted\">{props.description}</Text> : null}\n {options.map(option => <Button key={option.id} tone=\"secondary\" loading={action.active === option.id} disabled={props.disabled === true || (action.pending && action.active !== option.id)}\n onClick={() => { if (!props.disabled) void action.run(option.id, () => props.onApply(option.id)); }}>{props.optionLabel(option)}</Button>)}\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack></div>;\n}\n\nexport type TableColumnSettingsProps = Readonly<{\n label: string; columns: readonly ColumnSetting[]; disabled?: boolean;\n earlierLabel: (column: ColumnSetting) => string; laterLabel: (column: ColumnSetting) => string;\n onColumnsChange: (columns: readonly ColumnSetting[]) => void;\n}>;\nexport function TableColumnSettings(props: TableColumnSettingsProps) {\n assertDistinctIds(props.columns);\n const change = (id: string, kind: \"toggle\" | \"earlier\" | \"later\") => {\n if (props.disabled) return;\n const next = changeColumnSettings(props.columns, id, kind); if (next !== props.columns) props.onColumnsChange(next);\n };\n const labelId = useId(), disabled = props.disabled === true;\n // One row per column: visibility checkbox, then reorder as icon tools (labels stay the accessible names); the last\n // tool takes edge=\"end\" so its glyph slot ends on the group's edge like the checkbox starts on it (2026-10-17 audit).\n // The group label is HJM Text like Native; a browser-default <legend> rendered differently (2026-10-17 review).\n return <Stack gap=\"sm\" role=\"group\" aria-labelledby={labelId}><Text id={labelId} emphasis=\"strong\">{props.label}</Text>\n {props.columns.map(column => <Stack key={column.id} axis=\"inline\" gap=\"xs\" align=\"center\">\n <Checkbox label={column.label} checked={column.visible} layoutStyle={{ flex: 1, minInlineSize: 0 }} disabled={disabled || column.locked === true || (column.visible && props.columns.filter(item => item.visible).length === 1)} onCheckedChange={() => change(column.id, \"toggle\")} />\n <IconButton label={props.earlierLabel(column)} tone=\"ghost\" disabled={disabled || changeColumnSettings(props.columns, column.id, \"earlier\") === props.columns} onClick={() => change(column.id, \"earlier\")}><Icon name=\"chevronUp\" /></IconButton>\n <IconButton label={props.laterLabel(column)} tone=\"ghost\" edge=\"end\" disabled={disabled || changeColumnSettings(props.columns, column.id, \"later\") === props.columns} onClick={() => change(column.id, \"later\")}><Icon name=\"chevronDown\" /></IconButton>\n </Stack>)}\n </Stack>;\n}\n"]}
1
+ {"version":3,"file":"collection-editing.js","sourceRoot":"","sources":["../src/collection-editing.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { assertDistinctIds, changeColumnSettings, collectionEditingRecipe, focusAfterRemoval, recoverableFilters, snapshotSelection, type ColumnSetting, type FilterRecoveryOption, type FocusTarget, type SelectionAction } from \"@hjmds/design-contracts/collection-editing\";\nimport { Button, IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { TextField } from \"./forms.js\";\nimport { Checkbox } from \"./selection.js\";\nimport { Stack, Text } from \"./layout.js\";\nimport { FieldGroup, type FieldGroupBinding, type FieldGroupProps } from \"./field-group.js\";\n\n\nfunction ErrorMessage({ children }: { children: ReactNode }) {\n return <div role=\"alert\" style={{ display: \"grid\", placeItems: \"center\", textAlign: \"center\" }}><Text tone=\"danger\">{children}</Text></div>;\n}\n\nexport type InlineEditProps = Readonly<{\n id: string; value: string; label: string; editLabel: string; saveLabel: string; cancelLabel: string; errorLabel: string;\n disabled?: boolean; validate?: (draft: string) => string | undefined;\n /** Resolve only after confirming and updating the product value; reject to preserve the draft. */\n onSave: (draft: string) => void | Promise<void>;\n}>;\nexport function InlineEdit(props: InlineEditProps) { return <InlineEditBody key={props.id} {...props} />; }\nfunction InlineEditBody(props: InlineEditProps) {\n const [editing, setEditing] = useState(false), [draft, setDraft] = useState(props.value);\n const action = useCompositionAction(props.disabled);\n const input = useRef<HTMLInputElement>(null), trigger = useRef<HTMLButtonElement>(null), group = useRef<HTMLDivElement>(null);\n const restore = useRef(false);\n useLayoutEffect(() => {\n if (editing) input.current?.focus();\n else if (restore.current) { restore.current = false; trigger.current?.focus(); }\n }, [editing]);\n const error = props.validate?.(draft);\n const close = () => {\n restore.current = group.current?.contains(document.activeElement) ?? false;\n setEditing(false);\n };\n const save = async () => {\n if (props.disabled || error || action.pending || action.session.getSnapshot().status === \"pending\") return;\n const result = await action.run(\"save\", () => props.onSave(draft));\n if (result.status === \"success\") close();\n };\n return <div ref={group} role=\"group\" aria-label={props.label}>\n {/* Read state names the value with its label and edits through a pencil tool at the row end; a bare value beside a\n text \"Edit title\" button lost the label (2026-10-17 review). */}\n {!editing ? <Stack axis=\"inline\" gap=\"sm\" align=\"center\">\n <Stack gap=\"xxs\" layoutStyle={{ flex: 1, minInlineSize: 0 }}><Text variant=\"caption\" tone=\"muted\">{props.label}</Text><Text emphasis=\"strong\">{props.value}</Text></Stack>\n <IconButton ref={trigger} label={props.editLabel} tone=\"ghost\" edge=\"end\" disabled={props.disabled ?? false} onClick={() => { setDraft(props.value); action.session.reset(null); setEditing(true); }}><Icon name=\"edit\" /></IconButton>\n </Stack>\n : <Stack gap={collectionEditingRecipe.actionGap}>\n <TextField ref={input} label={props.label} value={draft} disabled={props.disabled ?? false} readOnly={action.pending}\n {...(error ? { error, \"aria-invalid\": true } : {})} onValueChange={setDraft}\n onKeyDown={event => {\n // Enter during IME composition confirms a character, not the title.\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"Enter\") { event.preventDefault(); void save(); }\n if (event.key === \"Escape\" && !action.pending) { event.preventDefault(); event.stopPropagation(); close(); }\n }} />\n <Stack axis=\"inline\" gap=\"sm\" wrap><Button tone=\"ghost\" disabled={action.pending} onClick={close}>{props.cancelLabel}</Button>\n <Button loading={action.pending} disabled={props.disabled === true || !!error} onClick={() => void save()}>{props.saveLabel}</Button></Stack>\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack>}\n </div>;\n}\n\nexport type RepeatableFieldGroupProps = Omit<FieldGroupProps, \"renderField\"> & Readonly<{\n renderField: (binding: FieldGroupBinding & { focusRef: (target: FocusTarget | null) => void }) => ReactNode;\n addLabel: string; removeLabel: (id: string) => string; minFields?: number; maxFields?: number;\n /** Return the new stable id to focus after the controlled descriptor includes it. */\n onAdd: () => string | undefined; onRemove: (id: string) => void;\n}>;\nexport function RepeatableFieldGroup({ renderField, addLabel, removeLabel, minFields = 0, maxFields = Infinity, onAdd, onRemove, ...props }: RepeatableFieldGroupProps) {\n const targets = useRef(new Map<string, FocusTarget>()), add = useRef<HTMLButtonElement>(null);\n const focus = useRef<string | null | undefined>(undefined);\n useLayoutEffect(() => {\n if (focus.current === undefined) return;\n if (focus.current === null) { add.current?.focus(); focus.current = undefined; }\n else if (targets.current.has(focus.current)) { targets.current.get(focus.current)?.focus(); focus.current = undefined; }\n });\n const fields = props.descriptor.fields;\n const live = useRef(true), policy = useRef({ fields, minFields, maxFields, onAdd, onRemove, disabled: props.descriptor.disabled });\n policy.current = { fields, minFields, maxFields, onAdd, onRemove, disabled: props.descriptor.disabled };\n useEffect(() => { live.current = true; return () => { live.current = false; }; }, []);\n return <Stack gap={collectionEditingRecipe.gap}>\n {/* Remove is a row tool: a trash IconButton at the field's end whose label names the row (icon-button.md), not a\n full-width ghost text button under the field (2026-10-17 review). End-aligned so it sits beside the input. */}\n <FieldGroup {...props} renderField={binding => <Stack axis=\"inline\" gap=\"xs\" align=\"end\">\n <div style={{ flex: 1, minInlineSize: 0 }}>{renderField({ ...binding, focusRef: target => { if (target) targets.current.set(binding.id, target); else targets.current.delete(binding.id); } })}</div>\n <IconButton label={removeLabel(binding.id)} tone=\"ghost\" edge=\"end\" disabled={binding.controlProps.disabled || fields.length <= minFields} onClick={binding.guardChange(() => {\n const current = policy.current;\n if (!live.current || current.disabled || current.fields.length <= current.minFields) return;\n focus.current = focusAfterRemoval(current.fields.map(field => field.id), binding.id, current.fields.filter(field => field.disabled).map(field => field.id)) ?? null;\n current.onRemove(binding.id);\n })}><Icon name=\"delete\" /></IconButton>\n </Stack>} />\n <Button ref={add} tone=\"secondary\" disabled={props.descriptor.disabled === true || fields.length >= maxFields} onClick={() => {\n const current = policy.current;\n if (!live.current || current.disabled || current.fields.length >= current.maxFields) return;\n const id = current.onAdd(); if (id !== undefined) focus.current = id;\n }}>{addLabel}</Button>\n </Stack>;\n}\n\nexport type SelectionActionBarProps = Readonly<{\n selectedIds: readonly string[]; selectionLabel: (count: number) => string;\n clearLabel: string; onClear: () => void; actions: readonly SelectionAction[];\n onAction: (actionId: string, selectedIds: readonly string[]) => void | Promise<void>; errorLabel: string; disabled?: boolean;\n /** Product supplies the exact confirmed operation to undo; never restore an entire collection. */\n recovery?: Readonly<{ label: string; onUndo: () => void | Promise<void> }>;\n}>;\nexport function SelectionActionBar(props: SelectionActionBarProps) {\n const action = useCompositionAction(props.disabled);\n assertDistinctIds(props.actions); snapshotSelection(props.selectedIds);\n if (!props.selectedIds.length && !props.recovery && !action.pending && !action.failed) return null;\n return <div role=\"group\" aria-label={props.selectionLabel(props.selectedIds.length)}><Stack gap=\"sm\">\n <Text role=\"status\">{props.selectionLabel(props.selectedIds.length)}</Text>\n <Stack axis=\"inline\" gap=\"sm\" wrap>\n {props.actions.map(item => <Button key={item.id} tone={item.destructive ? \"danger\" : \"secondary\"} loading={action.active === `action:${item.id}`} disabled={props.disabled === true || (action.pending && action.active !== `action:${item.id}`) || !props.selectedIds.length} onClick={() => {\n if (props.disabled) return;\n const scope = snapshotSelection(props.selectedIds);\n if (scope.length) void action.run(`action:${item.id}`, () => props.onAction(item.id, scope));\n }}>{item.label}</Button>)}\n <Button tone=\"ghost\" disabled={props.disabled === true || action.pending || !props.selectedIds.length} onClick={props.onClear}>{props.clearLabel}</Button>\n {props.recovery ? <Button tone=\"ghost\" loading={action.active === \"undo\"} disabled={props.disabled === true || (action.pending && action.active !== \"undo\")} onClick={() => {\n if (!props.disabled) void action.run(\"undo\", () => props.recovery!.onUndo());\n }}>{props.recovery.label}</Button> : null}\n </Stack>\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack></div>;\n}\n\nexport type FilterRecoveryProps = Readonly<{\n title: string; description?: string; options: readonly FilterRecoveryOption[];\n optionLabel: (option: FilterRecoveryOption) => string; onApply: (id: string) => void | Promise<void>;\n errorLabel: string; disabled?: boolean;\n}>;\nexport function FilterRecovery(props: FilterRecoveryProps) {\n const action = useCompositionAction(props.disabled), options = recoverableFilters(props.options);\n // Fills the result area its host gives it (flex parent) and centers there, like Native.\n return <div role=\"group\" aria-label={props.title} style={{ display: \"grid\", placeItems: \"center\", flexGrow: 1, textAlign: \"center\" }}><Stack gap=\"sm\" align=\"center\">\n <Text emphasis=\"strong\">{props.title}</Text>{props.description ? <Text tone=\"muted\">{props.description}</Text> : null}\n {options.map(option => <Button key={option.id} tone=\"secondary\" loading={action.active === option.id} disabled={props.disabled === true || (action.pending && action.active !== option.id)}\n onClick={() => { if (!props.disabled) void action.run(option.id, () => props.onApply(option.id)); }}>{props.optionLabel(option)}</Button>)}\n {action.failed ? <ErrorMessage>{props.errorLabel}</ErrorMessage> : null}\n </Stack></div>;\n}\n\nexport type TableColumnSettingsProps = Readonly<{\n label: string; columns: readonly ColumnSetting[]; disabled?: boolean;\n earlierLabel: (column: ColumnSetting) => string; laterLabel: (column: ColumnSetting) => string;\n onColumnsChange: (columns: readonly ColumnSetting[]) => void;\n}>;\nexport function TableColumnSettings(props: TableColumnSettingsProps) {\n assertDistinctIds(props.columns);\n const change = (id: string, kind: \"toggle\" | \"earlier\" | \"later\") => {\n if (props.disabled) return;\n const next = changeColumnSettings(props.columns, id, kind); if (next !== props.columns) props.onColumnsChange(next);\n };\n const labelId = useId(), disabled = props.disabled === true;\n // One row per column: visibility checkbox, then reorder as icon tools (labels stay the accessible names); the last\n // tool takes edge=\"end\" so its glyph slot ends on the group's edge like the checkbox starts on it (2026-10-17 audit).\n // The group label is HJM Text like Native; a browser-default <legend> rendered differently (2026-10-17 review).\n return <Stack gap=\"sm\" role=\"group\" aria-labelledby={labelId}><Text id={labelId} emphasis=\"strong\">{props.label}</Text>\n {props.columns.map(column => <Stack key={column.id} axis=\"inline\" gap=\"xs\" align=\"center\">\n <Checkbox label={column.label} checked={column.visible} layoutStyle={{ flex: 1, minInlineSize: 0 }} disabled={disabled || column.locked === true || (column.visible && props.columns.filter(item => item.visible).length === 1)} onCheckedChange={() => change(column.id, \"toggle\")} />\n <IconButton label={props.earlierLabel(column)} tone=\"ghost\" disabled={disabled || changeColumnSettings(props.columns, column.id, \"earlier\") === props.columns} onClick={() => change(column.id, \"earlier\")}><Icon name=\"chevronUp\" /></IconButton>\n <IconButton label={props.laterLabel(column)} tone=\"ghost\" edge=\"end\" disabled={disabled || changeColumnSettings(props.columns, column.id, \"later\") === props.columns} onClick={() => change(column.id, \"later\")}><Icon name=\"chevronDown\" /></IconButton>\n </Stack>)}\n </Stack>;\n}\n"]}
@@ -68,7 +68,7 @@ export function ExpandableSearch(props) {
68
68
  return; setCommitted(normalized); props.onSubmit?.(normalized); };
69
69
  const current = snapshot?.query === props.query ? snapshot.response : null;
70
70
  // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading
71
- // close exit. A full-width primary "펼치기" button and a text "닫기" button read as product actions (2026-10-17 review).
71
+ // close exit. A full-width primary "Expand" button and a text "Close" button read as product actions (2026-10-17 review).
72
72
  return _jsx(Stack, { ref: host, gap: "sm", children: !props.expanded ? _jsx(IconButton, { ref: opener, label: props.labels.open, tone: "ghost", disabled: props.disabled === true, layoutStyle: { alignSelf: "flex-end" }, onClick: () => props.onExpandedChange(true), children: _jsx(Icon, { name: "search" }) }) : _jsxs(_Fragment, { children: [_jsx(SearchScreen, { title: props.labels.title, titleVisibility: "hidden", exit: { kind: "close", label: props.labels.cancel, onClick: cancel }, queryLabel: props.labels.query, queryClearLabel: props.labels.clear, query: props.query, onQueryChange: props.onQueryChange, onSearch: search, ...(props.debounceMs === undefined ? {} : { debounceMs: props.debounceMs }), ...(props.recentQueries ? { recentQueries: props.recentQueries } : {}), committedQuery: committed, onSubmit: commit, searching: pending, searchingLabel: props.labels.searching, suggestions: { items: current?.suggestions ?? [], commitLabel: props.labels.commit, countLabel: props.labels.suggestionCount }, children: current ? props.renderResult(current.result) : null }), failed ? _jsx(Text, { role: "alert", tone: "danger", style: { textAlign: "center" }, children: props.labels.error }) : null] }) });
73
73
  }
74
74
  //# sourceMappingURL=communication.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useEffect,useRef,useState,type ReactNode } from \"react\";\nimport { resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport { validateReplyTarget,type ReplyTarget,type SearchResponse } from \"@hjmds/design-contracts/communication\";\nimport { ChatMessage,MessageComposer,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"펼치기\" button and a text \"닫기\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n"]}
1
+ {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useEffect,useRef,useState,type ReactNode } from \"react\";\nimport { resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport { validateReplyTarget,type ReplyTarget,type SearchResponse } from \"@hjmds/design-contracts/communication\";\nimport { ChatMessage,MessageComposer,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"Expand\" button and a text \"Close\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n"]}
@@ -29,9 +29,9 @@ export type DataTableProps<ColumnKey extends string = string, RowKey extends str
29
29
  * each column; HJM never computes the aggregate (2026-10-14, stat tables).
30
30
  */
31
31
  summaryRow?: (columnId: ColumnKey) => ReactNode;
32
- /** Header bands above leaf columns (타격 | 주루). */
32
+ /** Header bands above leaf columns (Batting | Running). */
33
33
  columnGroups?: readonly DataTableColumnGroup<ColumnKey>[];
34
- /** Labeled row sections (선발 / 교체); each renders as its own `tbody`. */
34
+ /** Labeled row sections (Starters / Substitutes); each renders as its own `tbody`. */
35
35
  rowGroups?: readonly DataTableRowGroup<RowKey>[];
36
36
  /** Per-cell emphasis decided by the product (AG Grid cellClassRules / Savant percentile heat). */
37
37
  cellStyle?: (rowId: RowKey, columnId: ColumnKey) => Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,GAa3B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAsC,MAAM,OAAO,CAAC;AACnH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAwB,MAAM,mBAAmB,CAAC;AA6C5E,SAAS,mBAAmB,CAC1B,SAAiD;IAEjD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,GAAG,EAAU,CAAC;IACtE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,kBAAkB,IAAI,IAAI,CAAC;QAC1E,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,mBAAmB,IAAI,IAAI,GAAG,EAAU,CAAC;AACtF,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAA0F;IAC9I,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAC;IACnE,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,kBAAe,aAAa,KAAK,SAAS,IAAI,SAAS,EAAE,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,YAC7K,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAID,gGAAgG;AAChG,SAAS,YAAY,CAAS,KAAoD;IAChF,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAChH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;IAChD,CAAC;IACD,gFAAgF;IAChF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,SAAS,CAIpD,EACE,OAAO,EACP,IAAI,EACJ,MAAM,EACN,UAAU,EACV,SAAS,EACT,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,iBAAiB,CAAC,SAAS,EACvC,YAAY,EACZ,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAC/B,OAAO,EAAE,WAAW,EACpB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,GACuB,EACpC,YAAyC;IAEzC,uEAAuE;IACvE,MAAM,cAAc,GAAG,oBAAoB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,WAAW,IAAI,cAAc,CAAC;IAC9C,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,0BAA0B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,KAAK,UAAU,CAAC;IAChD,MAAM,MAAM,GAAG,SAAS,EAAE,IAAI,KAAK,QAAQ,CAAC;IAC5C,oEAAoE;IACpE,gFAAgF;IAChF,gFAAgF;IAChF,+EAA+E;IAC/E,MAAM,mBAAmB,GAAG,MAAM;QAChC,CAAC,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS;QACrC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAsB,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpH,MAAM,YAAY,GAAwB,mBAAmB;QAC3D,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC;QAChC,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,eAAe,GAAG,CAAC,IAAyB,EAAE,EAAE;QACpD,IAAI,CAAC,mBAAmB;YAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC;IACzE,gGAAgG;IAChG,8FAA8F;IAC9F,MAAM,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACvE,MAAM,YAAY,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC1E,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,GAAG,IAAI,WAAW,KAAK,CAAC;YAAE,OAAO;QACtC,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACnD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,GAAG,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;YAAC,CAAC;YAC3F,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChJ,CAAC,CAAC;QACF,OAAO,EAAE,CAAC;QACV,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QAClD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,gGAAgG;IAChG,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,MAAe,EAA2D,EAAE;QAC9G,IAAI,WAAW,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,wBAAwB;YACnG,KAAK,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;SAC1D,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtI,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1J,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAS,oBAAoB,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,SAAS,GAAG,CAAC,GAAmC,EAAE,EAAE;QACxD,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACpE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACzD,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC,sBAAsB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7F,eAAe,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7E,SAAS,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,SAAS,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,0EAA0E;QAC1E,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,cAAc,KAAK,IAAI;YAClC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,SAAS,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,kBAAgB,OAAO,aAC/F,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACrC,YAAG,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,YAAG,UAAU,CAAC,OAAO,GAAK,CACxH,EACD,KAAC,WAAW,IAAC,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,YAClE,iBAAO,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,uBAAuB,gBAAa,MAAM,CAAC,KAAK,eAAa,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,aAC3I,4BACG,KAAK,CAAC,CAAC,CAAC,CACP,cAAI,SAAS,EAAC,uBAAuB,aAClC,WAAW,CAAC,CAAC,CAAC,4BAAgB,MAAM,EAAC,SAAS,EAAE,UAAU,CAAC,0BAA0B,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EACxJ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;4CAClB,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;4CAC7E,2FAA2F;4CAC3F,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4CAC3F,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;4CACvH,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI;gDACzB,CAAC,CAAC,4BAA8B,MAAM,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,IAA/F,IAAI,CAAC,EAAE,CAA4F;gDAC9G,CAAC,CAAC,aAAkB,KAAK,EAAC,UAAU,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,YAAE,yBAAO,IAAI,CAAC,MAAM,GAAQ,IAA7J,IAAI,CAAC,EAAE,CAA2J,CAAC;wCAClL,CAAC,CAAC,IACC,CACN,CAAC,CAAC,CAAC,IAAI,EACR,cAAI,GAAG,EAAE,YAAY,aAClB,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACxC,aAAI,KAAK,EAAC,KAAK,EAAC,SAAS,EAAE,UAAU,CAAC,0BAA0B,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,YACrH,QAAQ,CAAC,CAAC,CAAC,CACV,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,kBACD,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,KAAK,IAAI,CAAqB,gBAC5F,MAAM,CAAC,SAAS,EAC5B,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,SAAS,YAEjB,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAC/D,CACV,CAAC,CAAC,CAAC,IAAI,GACL,CACN,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;4CACnC,MAAM,MAAM,GAAG,SAAS,EAAE,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;4CAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;4CACzC,OAAO,CACL,aAEE,KAAK,EAAC,KAAK,eAGA,MAAM,IAAI,SAAS,EAC9B,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAmB,YAE9H,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gDACjB,uDAAuD;gDACvD,KAAC,eAAe,IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EACtD,SAAS,EAAC,sBAAsB,EAChC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,SAAuC,CAAC;oDACzF,yEAAyE;oDACzE,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,yBAAyB,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,GAC7H,CACH,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAnBZ,MAAM,CAAC,EAAE,CAoBX,CACN,CAAC;wCACJ,CAAC,CAAC,IACC,IACC,EACP,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC3B,4BACG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,aAAI,SAAS,EAAC,uBAAuB,YACnC,aAAI,KAAK,EAAC,UAAU,EAAC,OAAO,EAAE,UAAU,YAAE,yBAAO,OAAO,CAAC,KAAK,CAAC,KAAK,GAAQ,GAAK,GAC9E,CACN,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC7D,+BAAgC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,mBAAiB,GAAG,CAAC,QAAQ,IAAI,SAAS,aACpJ,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACxC,aAAI,SAAS,EAAE,UAAU,CAAC,0BAA0B,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,YAC1G,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,kBACvB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,gBAC1B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,mBACrB,GAAG,CAAC,QAAQ,IAAI,SAAS,EACxC,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,YAE5B,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAC7B,GACN,CACN,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;4CACnC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;4CACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;4CAC/E,kGAAkG;4CAClG,MAAM,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4CACrD,OAAO,CACL,aAEE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,wBAAwB,CAAC,eACvE,QAAQ,CAAC,IAAI,eACb,QAAQ,CAAC,IAAI,gBACZ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EACzC,KAAK,EAAE;oDACL,SAAS,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,KAAK;oDACxD,GAAG,QAAQ,CAAC,KAAK;oDACjB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,GAAG,KAAK,GAAG,qBAAqB,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oDACrG,GAAG,MAAM,CAAC,KAAK;iDACC,YAEjB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,IAZzB,MAAM,CAAC,EAAE,CAaX,CACN,CAAC;wCACJ,CAAC,CAAC,KAtCK,GAAG,CAAC,EAAE,CAuCV,CACN,CAAC,KA/CQ,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,MAAM,CAgD/B,CACP,CAAC,EACD,UAAU,CAAC,CAAC,CAAC,CACZ,0BACE,cAAI,SAAS,EAAC,yBAAyB,aACpC,WAAW,CAAC,CAAC,CAAC,aAAI,SAAS,EAAE,UAAU,CAAC,0BAA0B,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EACrI,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;wCACnC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;wCACzC,OAAO,CACL,aAAoB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAmB,YACnJ,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IADf,MAAM,CAAC,EAAE,CAEb,CACN,CAAC;oCACJ,CAAC,CAAC,IACC,GACC,CACT,CAAC,CAAC,CAAC,IAAI,IACF,GACM,EAEb,MAAM,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,wBAAwB,YAAE,MAAM,GAAO,CAAC,CAAC,CAAC,IAAI,IACnE,CACP,CAAC;AACJ,CAAC,CAE6B,CAAC;AAE/B,OAAO,EACL,SAAS,EACT,WAAW,EACX,eAAe,GAKhB,MAAM,mBAAmB,CAAC","sourcesContent":["import { TableSortButton } from \"./table-sort-button.js\";\nimport {\n dataTableColumnDefaults,\n dataTableDefaults,\n dataTableFamilyRecipe,\n dataTableFirstSortDirection,\n getNextDataTableSortState,\n resolveDataTableBody,\n resolveDataTableHeaderBands,\n splitPinnedDataTableColumns,\n resolveDataTableSelectAllState,\n validateDataTableColumns,\n validateDataTableRows,\n validateDataTableSortState,\n type DataTableAsyncState,\n type DataTableBodyItem,\n type DataTableCellHeat,\n type DataTableCellTone,\n type DataTableColumnDescriptor,\n type DataTableColumnGroup,\n type DataTableDensity,\n type DataTableRowDescriptor,\n type DataTableRowGroup,\n type DataTableSelection,\n type DataTableSortCycle,\n type DataTableSortState,\n} from \"@hjmds/design-contracts/components/data-table\";\nimport { forwardRef, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { useHjmDensityDefault } from \"./provider.js\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { tableCellEmphasis, type TableHeatColors } from \"./table-family.js\";\n\nexport type DataTableLabels = Readonly<{\n /** Accessible name for the table itself. */\n table: string;\n selectAll: string;\n /** Composes one row's selection control name from its id. */\n selectRow: (rowId: string) => string;\n /** Composes a sortable header's action name, including its current direction. */\n sortColumn: (header: string, direction: DataTableSortState<string>) => string;\n}>;\n\nexport type DataTableProps<ColumnKey extends string = string, RowKey extends string = string> = Readonly<{\n columns: readonly DataTableColumnDescriptor<ColumnKey>[];\n rows: readonly DataTableRowDescriptor<RowKey>[];\n labels: DataTableLabels;\n renderCell: (rowId: RowKey, columnId: ColumnKey) => ReactNode;\n selection?: DataTableSelection<RowKey>;\n sortState?: DataTableSortState<ColumnKey>;\n sortCycle?: DataTableSortCycle;\n onSortChange?: (next: DataTableSortState<ColumnKey>) => void;\n asyncState?: DataTableAsyncState;\n density?: DataTableDensity;\n /** Composed beneath the table by the product — pagination, load more, totals. */\n footer?: ReactNode;\n /**\n * Optional summary row rendered as the table's `tfoot` (totals, averages). Returns the cell for\n * each column; HJM never computes the aggregate (2026-10-14, stat tables).\n */\n summaryRow?: (columnId: ColumnKey) => ReactNode;\n /** Header bands above leaf columns (타격 | 주루). */\n columnGroups?: readonly DataTableColumnGroup<ColumnKey>[];\n /** Labeled row sections (선발 / 교체); each renders as its own `tbody`. */\n rowGroups?: readonly DataTableRowGroup<RowKey>[];\n /** Per-cell emphasis decided by the product (AG Grid cellClassRules / Savant percentile heat). */\n cellStyle?: (rowId: RowKey, columnId: ColumnKey) => Readonly<{ tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }> | null;\n /** Heat base colors (any CSS color); default high = danger red, low = info blue (Savant). */\n heatColors?: TableHeatColors;\n /** Bounds the scroll box height in px; the header stays fixed while rows scroll. */\n maxBodyHeight?: number;\n className?: string;\n /** Canonical layout-only placement on the root wrapper. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nfunction selectedRowKeysFrom<RowKey extends string>(\n selection: DataTableSelection<RowKey> | undefined,\n): ReadonlySet<RowKey> {\n if (!selection || selection.mode === \"none\") return new Set<RowKey>();\n if (selection.mode === \"single\") {\n const key = selection.selectedKey ?? selection.defaultSelectedKey ?? null;\n return key === null ? new Set<RowKey>() : new Set<RowKey>([key]);\n }\n return selection.selectedKeys ?? selection.defaultSelectedKeys ?? new Set<RowKey>();\n}\n\n/**\n * Pinned columns and bounded heights need their own scroll box (sticky cells stick to it);\n * other tables keep the original DOM.\n */\nfunction TableScroll({ scroll, maxBodyHeight, children }: Readonly<{ scroll: boolean; maxBodyHeight?: number | undefined; children: ReactNode }>) {\n if (!scroll && maxBodyHeight === undefined) return <>{children}</>;\n return (\n <div className=\"hjm-data-table__scroll\" data-bounded={maxBodyHeight !== undefined || undefined} style={maxBodyHeight !== undefined ? { maxBlockSize: maxBodyHeight } : undefined}>\n {children}\n </div>\n );\n}\n\ntype BodySection<RowKey> = { group: Readonly<{ id: string; label: string }> | null; rows: RowKey[] };\n\n/** Splits the resolved body into `tbody` sections: loose rows first, then one per row group. */\nfunction bodySections<RowKey>(items: readonly DataTableBodyItem<RowKey & string>[]): BodySection<RowKey>[] {\n const sections: BodySection<RowKey>[] = [];\n for (const item of items) {\n if (item.kind === \"group\") { sections.push({ group: { id: item.id, label: item.label }, rows: [] }); continue; }\n if (sections.length === 0) sections.push({ group: null, rows: [] });\n sections.at(-1)!.rows.push(item.id as RowKey);\n }\n // An empty table still renders one (empty) tbody, as before row groups existed.\n return sections.length > 0 ? sections : [{ group: null, rows: [] }];\n}\n\nexport const DataTable = forwardRef(function DataTable<\n ColumnKey extends string = string,\n RowKey extends string = string,\n>(\n {\n columns,\n rows,\n labels,\n renderCell,\n selection,\n sortState = null,\n sortCycle = dataTableDefaults.sortCycle,\n onSortChange,\n asyncState = { status: \"idle\" },\n density: densityProp,\n footer,\n summaryRow,\n columnGroups,\n rowGroups,\n cellStyle,\n heatColors,\n maxBodyHeight,\n className,\n layoutStyle,\n }: DataTableProps<ColumnKey, RowKey>,\n forwardedRef: React.Ref<HTMLTableElement>,\n) {\n // Unconditional: `??` on the hook call would break the rules of hooks.\n const densityDefault = useHjmDensityDefault({ comfortable: \"regular\", compact: \"compact\" });\n const density = densityProp ?? densityDefault;\n validateDataTableColumns(columns);\n validateDataTableRows(rows);\n validateDataTableSortState(sortState, columns);\n const multiple = selection?.mode === \"multiple\";\n const single = selection?.mode === \"single\";\n // `defaultSelectedKey(s)` used to be re-read on every render, so an\n // uncontrolled table reported the click to `onSelectionChange` but kept showing\n // the default (same defect and fix as Tree, 2026-10-06). The uncontrolled value\n // lives in state; a controlled `selectedKey(s)` (including `null`) still wins.\n const selectionControlled = single\n ? selection.selectedKey !== undefined\n : multiple ? selection.selectedKeys !== undefined : true;\n const [uncontrolledKeys, setUncontrolledKeys] = useState<ReadonlySet<RowKey>>(() => selectedRowKeysFrom(selection));\n const selectedKeys: ReadonlySet<RowKey> = selectionControlled\n ? selectedRowKeysFrom(selection)\n : uncontrolledKeys;\n const commitSelection = (next: ReadonlySet<RowKey>) => {\n if (!selectionControlled) setUncontrolledKeys(next);\n };\n const hasSelector = selection !== undefined && selection.mode !== \"none\";\n // Only an unbroken leading run is pinned (contract). Sticky offsets need the rendered widths of\n // the cells before each pinned column, so they are measured rather than guessed from `width`.\n const pinnedCount = splitPinnedDataTableColumns(columns).pinned.length;\n const headerRowRef = useRef<HTMLTableRowElement>(null);\n const [pinnedOffsets, setPinnedOffsets] = useState<readonly number[]>([]);\n useLayoutEffect(() => {\n const row = headerRowRef.current;\n if (!row || pinnedCount === 0) return;\n const stickyCells = pinnedCount + (hasSelector ? 1 : 0);\n const measure = () => {\n const cells = [...row.cells].slice(0, stickyCells);\n const offsets: number[] = [];\n let sum = 0;\n for (const cell of cells) { offsets.push(sum); sum += cell.getBoundingClientRect().width; }\n setPinnedOffsets((previous) => previous.length === offsets.length && previous.every((value, i) => value === offsets[i]) ? previous : offsets);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n for (const cell of [...row.cells].slice(0, stickyCells)) observer.observe(cell);\n return () => observer.disconnect();\n }, [pinnedCount, hasSelector, columns]);\n // Sticky props for the selector cell (when pinning) and each pinned column, by visual position.\n const stickyAt = (position: number, isLast: boolean): Readonly<{ className?: string; style?: CSSProperties }> => {\n if (pinnedCount === 0) return {};\n return {\n className: isLast ? \"hjm-data-table__pinned hjm-data-table__pinned-edge\" : \"hjm-data-table__pinned\",\n style: { insetInlineStart: pinnedOffsets[position] ?? 0 },\n };\n };\n const selectorSticky = hasSelector && pinnedCount > 0 ? stickyAt(0, false) : {};\n const columnSticky = (index: number) => index < pinnedCount ? stickyAt(index + (hasSelector ? 1 : 0), index === pinnedCount - 1) : {};\n const selectAllState = multiple ? resolveDataTableSelectAllState(rows, selectedKeys) : false;\n const bands = useMemo(() => columnGroups && columnGroups.length > 0 ? resolveDataTableHeaderBands(columns, columnGroups) : null, [columns, columnGroups]);\n const sections = useMemo(() => bodySections<RowKey>(resolveDataTableBody(rows, rowGroups ?? [])), [rows, rowGroups]);\n const rowById = useMemo(() => new Map(rows.map((row) => [row.id, row])), [rows]);\n const columnSpan = columns.length + (hasSelector ? 1 : 0);\n\n const toggleRow = (row: DataTableRowDescriptor<RowKey>) => {\n if (row.disabled || !selection || selection.mode === \"none\") return;\n if (selection.mode === \"single\") {\n const current = selectedKeys.has(row.id) ? row.id : null;\n const next = current === row.id && selection.disallowEmptySelection !== true ? null : row.id;\n commitSelection(next === null ? new Set<RowKey>() : new Set<RowKey>([next]));\n selection.onSelectionChange?.(next);\n return;\n }\n const next = new Set(selectedKeys);\n if (next.has(row.id)) next.delete(row.id); else next.add(row.id);\n commitSelection(next);\n selection.onSelectionChange?.(next);\n };\n const toggleAll = () => {\n if (!multiple) return;\n // Disabled rows stay out of both the denominator and the result, matching\n // the shared select-all accounting.\n const selectable = rows.filter((row) => !row.disabled);\n const next = selectAllState === true\n ? new Set([...selectedKeys].filter((id) => !selectable.some((row) => row.id === id)))\n : new Set([...selectedKeys, ...selectable.map((row) => row.id)]);\n commitSelection(next);\n selection.onSelectionChange?.(next);\n };\n\n return (\n <div className={classNames(\"hjm-data-table\", className)} style={layoutStyle} data-density={density}>\n {asyncState.status === \"idle\" ? null : (\n <p className=\"hjm-data-table__state\" role={asyncState.status === \"error\" ? \"alert\" : \"status\"}>{asyncState.message}</p>\n )}\n <TableScroll scroll={pinnedCount > 0} maxBodyHeight={maxBodyHeight}>\n <table ref={forwardedRef} className=\"hjm-data-table__table\" aria-label={labels.table} aria-busy={asyncState.status === \"loading\" || undefined}>\n <thead>\n {bands ? (\n <tr className=\"hjm-data-table__bands\">\n {hasSelector ? <td aria-hidden=\"true\" className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style} /> : null}\n {bands.map((band) => {\n const first = columns.findIndex((column) => column.id === band.columnIds[0]);\n // A band sticks only when every column under it is pinned; otherwise it scrolls with them.\n const sticky = first + band.span <= pinnedCount ? columnSticky(first + band.span - 1) : {};\n const stickyStyle = sticky.style ? { insetInlineStart: pinnedOffsets[first + (hasSelector ? 1 : 0)] ?? 0 } : undefined;\n return band.header === null\n ? <td key={band.id} aria-hidden=\"true\" colSpan={band.span} className={sticky.className} style={stickyStyle} />\n : <th key={band.id} scope=\"colgroup\" colSpan={band.span} className={classNames(\"hjm-data-table__band\", sticky.className)} style={stickyStyle}><span>{band.header}</span></th>;\n })}\n </tr>\n ) : null}\n <tr ref={headerRowRef}>\n {selection && selection.mode !== \"none\" ? (\n <th scope=\"col\" className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style}>\n {multiple ? (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selectAllState === \"mixed\" ? \"mixed\" : String(selectAllState === true) as \"true\" | \"false\"}\n aria-label={labels.selectAll}\n className=\"hjm-data-table__check\"\n onClick={toggleAll}\n >\n {selectAllState === true ? \"✓\" : selectAllState === \"mixed\" ? \"–\" : \"\"}\n </button>\n ) : null}\n </th>\n ) : null}\n {columns.map((column, columnIndex) => {\n const sorted = sortState?.columnId === column.id ? sortState.direction : null;\n const sticky = columnSticky(columnIndex);\n return (\n <th\n key={column.id}\n scope=\"col\"\n // The direction passes straight through to aria-sort; the\n // contract already speaks that vocabulary.\n aria-sort={sorted ?? undefined}\n className={sticky.className}\n style={{ inlineSize: column.width, textAlign: column.align ?? dataTableColumnDefaults.align, ...sticky.style } as CSSProperties}\n >\n {column.sortable ? (\n // A button inside the header, never the header itself.\n <TableSortButton\n header={column.header}\n direction={sorted}\n glyphs={{ ascending: \"▲\", descending: \"▼\", none: \"↕\" }}\n className=\"hjm-data-table__sort\"\n accessibleName={labels.sortColumn(column.header, sortState as DataTableSortState<string>)}\n // `sortDescFirst` columns (stat tables: highest first) start descending.\n onSort={() => onSortChange?.(getNextDataTableSortState(sortState, column.id, sortCycle, dataTableFirstSortDirection(column)))}\n />\n ) : column.header}\n </th>\n );\n })}\n </tr>\n </thead>\n {sections.map((section) => (\n <tbody key={section.group?.id ?? \"rows\"}>\n {section.group ? (\n <tr className=\"hjm-data-table__group\">\n <th scope=\"rowgroup\" colSpan={columnSpan}><span>{section.group.label}</span></th>\n </tr>\n ) : null}\n {section.rows.map((rowId) => rowById.get(rowId)!).map((row) => (\n <tr key={row.id} aria-selected={selection && selection.mode !== \"none\" ? selectedKeys.has(row.id) : undefined} data-disabled={row.disabled || undefined}>\n {selection && selection.mode !== \"none\" ? (\n <td className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style}>\n <button\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={selectedKeys.has(row.id)}\n aria-label={labels.selectRow(row.id)}\n aria-disabled={row.disabled || undefined}\n className=\"hjm-data-table__check\"\n onClick={() => toggleRow(row)}\n >\n {selectedKeys.has(row.id) ? \"✓\" : \"\"}\n </button>\n </td>\n ) : null}\n {columns.map((column, columnIndex) => {\n const sticky = columnSticky(columnIndex);\n const emphasis = tableCellEmphasis(cellStyle?.(row.id, column.id), heatColors);\n // Sub-rows (TanStack `depth`) indent only the first column, which is the pinned one when pinning.\n const depth = columnIndex === 0 ? row.depth ?? 0 : 0;\n return (\n <td\n key={column.id}\n className={classNames(sticky.className, emphasis.heat && \"hjm-table-family__heat\")}\n data-tone={emphasis.tone}\n data-heat={emphasis.heat}\n data-depth={depth > 0 ? depth : undefined}\n style={{\n textAlign: column.align ?? dataTableColumnDefaults.align,\n ...emphasis.style,\n ...(depth > 0 ? { \"--hjm-data-table-indent\": `${depth * dataTableFamilyRecipe.depthIndent}px` } : {}),\n ...sticky.style,\n } as CSSProperties}\n >\n {renderCell(row.id, column.id)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n ))}\n {summaryRow ? (\n <tfoot>\n <tr className=\"hjm-data-table__summary\">\n {hasSelector ? <td className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style} /> : null}\n {columns.map((column, columnIndex) => {\n const sticky = columnSticky(columnIndex);\n return (\n <td key={column.id} className={sticky.className} style={{ textAlign: column.align ?? dataTableColumnDefaults.align, ...sticky.style } as CSSProperties}>\n {summaryRow(column.id)}\n </td>\n );\n })}\n </tr>\n </tfoot>\n ) : null}\n </table>\n </TableScroll>\n {/* Pagination or load-more is composed beneath the table, never owned by it. */}\n {footer ? <div className=\"hjm-data-table__footer\">{footer}</div> : null}\n </div>\n );\n}) as <ColumnKey extends string = string, RowKey extends string = string>(\n props: DataTableProps<ColumnKey, RowKey> & { ref?: React.Ref<HTMLTableElement> },\n) => React.ReactElement | null;\n\nexport {\n LineScore,\n MatrixTable,\n ComparisonTable,\n type LineScoreProps,\n type MatrixTableProps,\n type ComparisonTableProps,\n type TableHeatColors,\n} from \"./table-family.js\";\n"]}
1
+ {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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","sourcesContent":["import { TableSortButton } from \"./table-sort-button.js\";\nimport {\n dataTableColumnDefaults,\n dataTableDefaults,\n dataTableFamilyRecipe,\n dataTableFirstSortDirection,\n getNextDataTableSortState,\n resolveDataTableBody,\n resolveDataTableHeaderBands,\n splitPinnedDataTableColumns,\n resolveDataTableSelectAllState,\n validateDataTableColumns,\n validateDataTableRows,\n validateDataTableSortState,\n type DataTableAsyncState,\n type DataTableBodyItem,\n type DataTableCellHeat,\n type DataTableCellTone,\n type DataTableColumnDescriptor,\n type DataTableColumnGroup,\n type DataTableDensity,\n type DataTableRowDescriptor,\n type DataTableRowGroup,\n type DataTableSelection,\n type DataTableSortCycle,\n type DataTableSortState,\n} from \"@hjmds/design-contracts/components/data-table\";\nimport { forwardRef, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { useHjmDensityDefault } from \"./provider.js\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { tableCellEmphasis, type TableHeatColors } from \"./table-family.js\";\n\nexport type DataTableLabels = Readonly<{\n /** Accessible name for the table itself. */\n table: string;\n selectAll: string;\n /** Composes one row's selection control name from its id. */\n selectRow: (rowId: string) => string;\n /** Composes a sortable header's action name, including its current direction. */\n sortColumn: (header: string, direction: DataTableSortState<string>) => string;\n}>;\n\nexport type DataTableProps<ColumnKey extends string = string, RowKey extends string = string> = Readonly<{\n columns: readonly DataTableColumnDescriptor<ColumnKey>[];\n rows: readonly DataTableRowDescriptor<RowKey>[];\n labels: DataTableLabels;\n renderCell: (rowId: RowKey, columnId: ColumnKey) => ReactNode;\n selection?: DataTableSelection<RowKey>;\n sortState?: DataTableSortState<ColumnKey>;\n sortCycle?: DataTableSortCycle;\n onSortChange?: (next: DataTableSortState<ColumnKey>) => void;\n asyncState?: DataTableAsyncState;\n density?: DataTableDensity;\n /** Composed beneath the table by the product — pagination, load more, totals. */\n footer?: ReactNode;\n /**\n * Optional summary row rendered as the table's `tfoot` (totals, averages). Returns the cell for\n * each column; HJM never computes the aggregate (2026-10-14, stat tables).\n */\n summaryRow?: (columnId: ColumnKey) => ReactNode;\n /** Header bands above leaf columns (Batting | Running). */\n columnGroups?: readonly DataTableColumnGroup<ColumnKey>[];\n /** Labeled row sections (Starters / Substitutes); each renders as its own `tbody`. */\n rowGroups?: readonly DataTableRowGroup<RowKey>[];\n /** Per-cell emphasis decided by the product (AG Grid cellClassRules / Savant percentile heat). */\n cellStyle?: (rowId: RowKey, columnId: ColumnKey) => Readonly<{ tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }> | null;\n /** Heat base colors (any CSS color); default high = danger red, low = info blue (Savant). */\n heatColors?: TableHeatColors;\n /** Bounds the scroll box height in px; the header stays fixed while rows scroll. */\n maxBodyHeight?: number;\n className?: string;\n /** Canonical layout-only placement on the root wrapper. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nfunction selectedRowKeysFrom<RowKey extends string>(\n selection: DataTableSelection<RowKey> | undefined,\n): ReadonlySet<RowKey> {\n if (!selection || selection.mode === \"none\") return new Set<RowKey>();\n if (selection.mode === \"single\") {\n const key = selection.selectedKey ?? selection.defaultSelectedKey ?? null;\n return key === null ? new Set<RowKey>() : new Set<RowKey>([key]);\n }\n return selection.selectedKeys ?? selection.defaultSelectedKeys ?? new Set<RowKey>();\n}\n\n/**\n * Pinned columns and bounded heights need their own scroll box (sticky cells stick to it);\n * other tables keep the original DOM.\n */\nfunction TableScroll({ scroll, maxBodyHeight, children }: Readonly<{ scroll: boolean; maxBodyHeight?: number | undefined; children: ReactNode }>) {\n if (!scroll && maxBodyHeight === undefined) return <>{children}</>;\n return (\n <div className=\"hjm-data-table__scroll\" data-bounded={maxBodyHeight !== undefined || undefined} style={maxBodyHeight !== undefined ? { maxBlockSize: maxBodyHeight } : undefined}>\n {children}\n </div>\n );\n}\n\ntype BodySection<RowKey> = { group: Readonly<{ id: string; label: string }> | null; rows: RowKey[] };\n\n/** Splits the resolved body into `tbody` sections: loose rows first, then one per row group. */\nfunction bodySections<RowKey>(items: readonly DataTableBodyItem<RowKey & string>[]): BodySection<RowKey>[] {\n const sections: BodySection<RowKey>[] = [];\n for (const item of items) {\n if (item.kind === \"group\") { sections.push({ group: { id: item.id, label: item.label }, rows: [] }); continue; }\n if (sections.length === 0) sections.push({ group: null, rows: [] });\n sections.at(-1)!.rows.push(item.id as RowKey);\n }\n // An empty table still renders one (empty) tbody, as before row groups existed.\n return sections.length > 0 ? sections : [{ group: null, rows: [] }];\n}\n\nexport const DataTable = forwardRef(function DataTable<\n ColumnKey extends string = string,\n RowKey extends string = string,\n>(\n {\n columns,\n rows,\n labels,\n renderCell,\n selection,\n sortState = null,\n sortCycle = dataTableDefaults.sortCycle,\n onSortChange,\n asyncState = { status: \"idle\" },\n density: densityProp,\n footer,\n summaryRow,\n columnGroups,\n rowGroups,\n cellStyle,\n heatColors,\n maxBodyHeight,\n className,\n layoutStyle,\n }: DataTableProps<ColumnKey, RowKey>,\n forwardedRef: React.Ref<HTMLTableElement>,\n) {\n // Unconditional: `??` on the hook call would break the rules of hooks.\n const densityDefault = useHjmDensityDefault({ comfortable: \"regular\", compact: \"compact\" });\n const density = densityProp ?? densityDefault;\n validateDataTableColumns(columns);\n validateDataTableRows(rows);\n validateDataTableSortState(sortState, columns);\n const multiple = selection?.mode === \"multiple\";\n const single = selection?.mode === \"single\";\n // `defaultSelectedKey(s)` used to be re-read on every render, so an\n // uncontrolled table reported the click to `onSelectionChange` but kept showing\n // the default (same defect and fix as Tree, 2026-10-06). The uncontrolled value\n // lives in state; a controlled `selectedKey(s)` (including `null`) still wins.\n const selectionControlled = single\n ? selection.selectedKey !== undefined\n : multiple ? selection.selectedKeys !== undefined : true;\n const [uncontrolledKeys, setUncontrolledKeys] = useState<ReadonlySet<RowKey>>(() => selectedRowKeysFrom(selection));\n const selectedKeys: ReadonlySet<RowKey> = selectionControlled\n ? selectedRowKeysFrom(selection)\n : uncontrolledKeys;\n const commitSelection = (next: ReadonlySet<RowKey>) => {\n if (!selectionControlled) setUncontrolledKeys(next);\n };\n const hasSelector = selection !== undefined && selection.mode !== \"none\";\n // Only an unbroken leading run is pinned (contract). Sticky offsets need the rendered widths of\n // the cells before each pinned column, so they are measured rather than guessed from `width`.\n const pinnedCount = splitPinnedDataTableColumns(columns).pinned.length;\n const headerRowRef = useRef<HTMLTableRowElement>(null);\n const [pinnedOffsets, setPinnedOffsets] = useState<readonly number[]>([]);\n useLayoutEffect(() => {\n const row = headerRowRef.current;\n if (!row || pinnedCount === 0) return;\n const stickyCells = pinnedCount + (hasSelector ? 1 : 0);\n const measure = () => {\n const cells = [...row.cells].slice(0, stickyCells);\n const offsets: number[] = [];\n let sum = 0;\n for (const cell of cells) { offsets.push(sum); sum += cell.getBoundingClientRect().width; }\n setPinnedOffsets((previous) => previous.length === offsets.length && previous.every((value, i) => value === offsets[i]) ? previous : offsets);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n for (const cell of [...row.cells].slice(0, stickyCells)) observer.observe(cell);\n return () => observer.disconnect();\n }, [pinnedCount, hasSelector, columns]);\n // Sticky props for the selector cell (when pinning) and each pinned column, by visual position.\n const stickyAt = (position: number, isLast: boolean): Readonly<{ className?: string; style?: CSSProperties }> => {\n if (pinnedCount === 0) return {};\n return {\n className: isLast ? \"hjm-data-table__pinned hjm-data-table__pinned-edge\" : \"hjm-data-table__pinned\",\n style: { insetInlineStart: pinnedOffsets[position] ?? 0 },\n };\n };\n const selectorSticky = hasSelector && pinnedCount > 0 ? stickyAt(0, false) : {};\n const columnSticky = (index: number) => index < pinnedCount ? stickyAt(index + (hasSelector ? 1 : 0), index === pinnedCount - 1) : {};\n const selectAllState = multiple ? resolveDataTableSelectAllState(rows, selectedKeys) : false;\n const bands = useMemo(() => columnGroups && columnGroups.length > 0 ? resolveDataTableHeaderBands(columns, columnGroups) : null, [columns, columnGroups]);\n const sections = useMemo(() => bodySections<RowKey>(resolveDataTableBody(rows, rowGroups ?? [])), [rows, rowGroups]);\n const rowById = useMemo(() => new Map(rows.map((row) => [row.id, row])), [rows]);\n const columnSpan = columns.length + (hasSelector ? 1 : 0);\n\n const toggleRow = (row: DataTableRowDescriptor<RowKey>) => {\n if (row.disabled || !selection || selection.mode === \"none\") return;\n if (selection.mode === \"single\") {\n const current = selectedKeys.has(row.id) ? row.id : null;\n const next = current === row.id && selection.disallowEmptySelection !== true ? null : row.id;\n commitSelection(next === null ? new Set<RowKey>() : new Set<RowKey>([next]));\n selection.onSelectionChange?.(next);\n return;\n }\n const next = new Set(selectedKeys);\n if (next.has(row.id)) next.delete(row.id); else next.add(row.id);\n commitSelection(next);\n selection.onSelectionChange?.(next);\n };\n const toggleAll = () => {\n if (!multiple) return;\n // Disabled rows stay out of both the denominator and the result, matching\n // the shared select-all accounting.\n const selectable = rows.filter((row) => !row.disabled);\n const next = selectAllState === true\n ? new Set([...selectedKeys].filter((id) => !selectable.some((row) => row.id === id)))\n : new Set([...selectedKeys, ...selectable.map((row) => row.id)]);\n commitSelection(next);\n selection.onSelectionChange?.(next);\n };\n\n return (\n <div className={classNames(\"hjm-data-table\", className)} style={layoutStyle} data-density={density}>\n {asyncState.status === \"idle\" ? null : (\n <p className=\"hjm-data-table__state\" role={asyncState.status === \"error\" ? \"alert\" : \"status\"}>{asyncState.message}</p>\n )}\n <TableScroll scroll={pinnedCount > 0} maxBodyHeight={maxBodyHeight}>\n <table ref={forwardedRef} className=\"hjm-data-table__table\" aria-label={labels.table} aria-busy={asyncState.status === \"loading\" || undefined}>\n <thead>\n {bands ? (\n <tr className=\"hjm-data-table__bands\">\n {hasSelector ? <td aria-hidden=\"true\" className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style} /> : null}\n {bands.map((band) => {\n const first = columns.findIndex((column) => column.id === band.columnIds[0]);\n // A band sticks only when every column under it is pinned; otherwise it scrolls with them.\n const sticky = first + band.span <= pinnedCount ? columnSticky(first + band.span - 1) : {};\n const stickyStyle = sticky.style ? { insetInlineStart: pinnedOffsets[first + (hasSelector ? 1 : 0)] ?? 0 } : undefined;\n return band.header === null\n ? <td key={band.id} aria-hidden=\"true\" colSpan={band.span} className={sticky.className} style={stickyStyle} />\n : <th key={band.id} scope=\"colgroup\" colSpan={band.span} className={classNames(\"hjm-data-table__band\", sticky.className)} style={stickyStyle}><span>{band.header}</span></th>;\n })}\n </tr>\n ) : null}\n <tr ref={headerRowRef}>\n {selection && selection.mode !== \"none\" ? (\n <th scope=\"col\" className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style}>\n {multiple ? (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selectAllState === \"mixed\" ? \"mixed\" : String(selectAllState === true) as \"true\" | \"false\"}\n aria-label={labels.selectAll}\n className=\"hjm-data-table__check\"\n onClick={toggleAll}\n >\n {selectAllState === true ? \"✓\" : selectAllState === \"mixed\" ? \"–\" : \"\"}\n </button>\n ) : null}\n </th>\n ) : null}\n {columns.map((column, columnIndex) => {\n const sorted = sortState?.columnId === column.id ? sortState.direction : null;\n const sticky = columnSticky(columnIndex);\n return (\n <th\n key={column.id}\n scope=\"col\"\n // The direction passes straight through to aria-sort; the\n // contract already speaks that vocabulary.\n aria-sort={sorted ?? undefined}\n className={sticky.className}\n style={{ inlineSize: column.width, textAlign: column.align ?? dataTableColumnDefaults.align, ...sticky.style } as CSSProperties}\n >\n {column.sortable ? (\n // A button inside the header, never the header itself.\n <TableSortButton\n header={column.header}\n direction={sorted}\n glyphs={{ ascending: \"▲\", descending: \"▼\", none: \"↕\" }}\n className=\"hjm-data-table__sort\"\n accessibleName={labels.sortColumn(column.header, sortState as DataTableSortState<string>)}\n // `sortDescFirst` columns (stat tables: highest first) start descending.\n onSort={() => onSortChange?.(getNextDataTableSortState(sortState, column.id, sortCycle, dataTableFirstSortDirection(column)))}\n />\n ) : column.header}\n </th>\n );\n })}\n </tr>\n </thead>\n {sections.map((section) => (\n <tbody key={section.group?.id ?? \"rows\"}>\n {section.group ? (\n <tr className=\"hjm-data-table__group\">\n <th scope=\"rowgroup\" colSpan={columnSpan}><span>{section.group.label}</span></th>\n </tr>\n ) : null}\n {section.rows.map((rowId) => rowById.get(rowId)!).map((row) => (\n <tr key={row.id} aria-selected={selection && selection.mode !== \"none\" ? selectedKeys.has(row.id) : undefined} data-disabled={row.disabled || undefined}>\n {selection && selection.mode !== \"none\" ? (\n <td className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style}>\n <button\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={selectedKeys.has(row.id)}\n aria-label={labels.selectRow(row.id)}\n aria-disabled={row.disabled || undefined}\n className=\"hjm-data-table__check\"\n onClick={() => toggleRow(row)}\n >\n {selectedKeys.has(row.id) ? \"✓\" : \"\"}\n </button>\n </td>\n ) : null}\n {columns.map((column, columnIndex) => {\n const sticky = columnSticky(columnIndex);\n const emphasis = tableCellEmphasis(cellStyle?.(row.id, column.id), heatColors);\n // Sub-rows (TanStack `depth`) indent only the first column, which is the pinned one when pinning.\n const depth = columnIndex === 0 ? row.depth ?? 0 : 0;\n return (\n <td\n key={column.id}\n className={classNames(sticky.className, emphasis.heat && \"hjm-table-family__heat\")}\n data-tone={emphasis.tone}\n data-heat={emphasis.heat}\n data-depth={depth > 0 ? depth : undefined}\n style={{\n textAlign: column.align ?? dataTableColumnDefaults.align,\n ...emphasis.style,\n ...(depth > 0 ? { \"--hjm-data-table-indent\": `${depth * dataTableFamilyRecipe.depthIndent}px` } : {}),\n ...sticky.style,\n } as CSSProperties}\n >\n {renderCell(row.id, column.id)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n ))}\n {summaryRow ? (\n <tfoot>\n <tr className=\"hjm-data-table__summary\">\n {hasSelector ? <td className={classNames(\"hjm-data-table__selector\", selectorSticky.className)} style={selectorSticky.style} /> : null}\n {columns.map((column, columnIndex) => {\n const sticky = columnSticky(columnIndex);\n return (\n <td key={column.id} className={sticky.className} style={{ textAlign: column.align ?? dataTableColumnDefaults.align, ...sticky.style } as CSSProperties}>\n {summaryRow(column.id)}\n </td>\n );\n })}\n </tr>\n </tfoot>\n ) : null}\n </table>\n </TableScroll>\n {/* Pagination or load-more is composed beneath the table, never owned by it. */}\n {footer ? <div className=\"hjm-data-table__footer\">{footer}</div> : null}\n </div>\n );\n}) as <ColumnKey extends string = string, RowKey extends string = string>(\n props: DataTableProps<ColumnKey, RowKey> & { ref?: React.Ref<HTMLTableElement> },\n) => React.ReactElement | null;\n\nexport {\n LineScore,\n MatrixTable,\n ComparisonTable,\n type LineScoreProps,\n type MatrixTableProps,\n type ComparisonTableProps,\n type TableHeatColors,\n} from \"./table-family.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../src/display.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../src/display.tsx"],"names":[],"mappings":"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"}
package/dist/display.js CHANGED
@@ -41,7 +41,7 @@ export const ListRow = forwardRef(function ListRow({ title, description, leading
41
41
  const density = densityProp ?? densityDefault;
42
42
  if (loading) {
43
43
  // A loading row is never interactive: there is nothing to activate yet.
44
- return (_jsxs("div", { ...props, ref: ref, role: loadingLabel ? "status" : undefined, "aria-busy": loadingLabel ? true : undefined, "aria-hidden": loadingLabel ? undefined : true, "aria-label": loadingLabel, className: classNames("hjm-list-row", "hjm-list-row--loading", className), "data-density": density, "data-lines": description ? "two" : "one", "data-state": "loading", style: { ...style, ...layoutStyle }, children: [leading ? _jsx("span", { className: "hjm-list-row__leading", "data-shape": leadingShape, "data-placeholder": "" }) : null, _jsxs("span", { className: "hjm-list-row__content", children: [_jsx("span", { className: "hjm-list-row__title", "data-placeholder": "", style: { width: `${listRowRecipe.loading.titleWidthPercent}%` } }), description ? _jsx("span", { className: "hjm-list-row__description", "data-placeholder": "", style: { width: `${listRowRecipe.loading.descriptionWidthPercent}%` } }) : null] }), trailing ? _jsx("span", { className: "hjm-list-row__trailing", "data-placeholder": "", style: { width: listRowRecipe.loading.trailingWidth } }) : null] }));
44
+ return (_jsxs("div", { ...props, ref: ref, role: loadingLabel ? "status" : undefined, "aria-busy": loadingLabel ? true : undefined, "aria-hidden": loadingLabel ? undefined : true, "aria-label": loadingLabel, className: classNames("hjm-list-row", "hjm-list-row--loading", className), "data-density": density, "data-leading": leading ? "" : undefined, "data-lines": description ? "two" : "one", "data-state": "loading", style: { ...style, ...layoutStyle }, children: [leading ? _jsx("span", { className: "hjm-list-row__leading", "data-shape": leadingShape, "data-placeholder": "" }) : null, _jsxs("span", { className: "hjm-list-row__content", children: [_jsx("span", { className: "hjm-list-row__title", "data-placeholder": "", style: { width: `${listRowRecipe.loading.titleWidthPercent}%` } }), description ? _jsx("span", { className: "hjm-list-row__description", "data-placeholder": "", style: { width: `${listRowRecipe.loading.descriptionWidthPercent}%` } }) : null] }), trailing ? _jsx("span", { className: "hjm-list-row__trailing", "data-placeholder": "", style: { width: listRowRecipe.loading.trailingWidth } }) : null] }));
45
45
  }
46
46
  const element = href ? "a" : onClick ? "button" : "div";
47
47
  const interactiveProps = href
@@ -65,6 +65,9 @@ export const ListRow = forwardRef(function ListRow({ title, description, leading
65
65
  ref,
66
66
  className: classNames("hjm-list-row", className),
67
67
  "data-density": density,
68
+ // Exposes the text column to the enclosing List: its indented separator starts after the leading frame
69
+ // (listRecipe.separators.indented.leadingInsetStart) only when this row has one.
70
+ "data-leading": leading ? "" : undefined,
68
71
  "data-tone": tone,
69
72
  // One- and two-line rows have different minimum heights in the recipe;
70
73
  // the web renderer used a single hardcoded value until now.
@@ -79,6 +82,6 @@ export const ListRow = forwardRef(function ListRow({ title, description, leading
79
82
  const linked = href && renderLink ? renderLink(row.props) : row;
80
83
  // The frame owns the row surface and its bleed so the command and the separate action share one fill, as Native;
81
84
  // the action stays outside the link/button (styles.css `.hjm-list-row-frame`).
82
- return trailingAction ? (_jsxs("div", { className: "hjm-list-row-frame", "data-density": density, "data-state": disabled ? "disabled" : selected ? "selected" : "idle", style: layoutStyle, children: [linked, _jsx("div", { className: "hjm-list-row__action", children: trailingAction })] })) : linked;
85
+ return trailingAction ? (_jsxs("div", { className: "hjm-list-row-frame", "data-density": density, "data-leading": leading ? "" : undefined, "data-state": disabled ? "disabled" : selected ? "selected" : "idle", style: layoutStyle, children: [linked, _jsx("div", { className: "hjm-list-row__action", children: trailingAction })] })) : linked;
83
86
  });
84
87
  //# sourceMappingURL=display.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"display.js","sourceRoot":"","sources":["../src/display.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n badgeRecipe,\n listRowRecipe,\n type BadgeSize,\n type BadgeTone,\n type BadgeVariant as ContractBadgeVariant,\n type ListRowDensity,\n type ListRowLeadingShape,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n resolveTagDescriptor,\n type TagTone,\n} from \"@hjmds/design-contracts/components/tag\";\nimport {\n cardRecipe,\n type CardHeadingLevel,\n} from \"@hjmds/design-contracts/components/card\";\nimport {\n surfaceGeometry,\n type SurfacePadding,\n type SurfaceRadius,\n type SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n createElement,\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { useHjmDensityDefault } from \"./provider.js\";\nimport { Surface, Text } from \"./layout.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type { CardHeadingLevel } from \"@hjmds/design-contracts/components/card\";\nexport type { TagTone } from \"@hjmds/design-contracts/components/tag\";\nexport type BadgeVariant = ContractBadgeVariant;\n\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> &\n Readonly<{\n tone?: BadgeTone;\n size?: BadgeSize;\n variant?: BadgeVariant;\n leading?: ReactNode;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n {\n tone = badgeRecipe.defaults.tone,\n size = badgeRecipe.defaults.size,\n variant = badgeRecipe.defaults.variant,\n leading,\n className,\n children,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n return (\n <span\n {...props}\n style={{ ...style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-badge\", className)}\n data-tone={tone}\n data-size={size}\n data-variant={variant}\n >\n {leading === undefined ? null : (\n <span aria-hidden=\"true\" className=\"hjm-badge__icon\">\n {leading}\n </span>\n )}\n <span className=\"hjm-badge__label\">{children}</span>\n </span>\n );\n});\n\nexport type TagProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n children: string;\n tone?: TagTone;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { children, tone, className, layoutStyle, style, ...props },\n ref,\n) {\n const descriptor = resolveTagDescriptor({\n label: children,\n ...(tone === undefined ? {} : { tone }),\n });\n return (\n <span\n {...props}\n style={{ ...style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-tag\", className)}\n data-tone={descriptor.tone}\n >\n <span className=\"hjm-tag__label\">{descriptor.label}</span>\n </span>\n );\n});\n\nexport type CardProps = Omit<HTMLAttributes<HTMLElement>, \"title\"> &\n Readonly<{\n title?: ReactNode;\n description?: ReactNode;\n leading?: ReactNode;\n media?: ReactNode;\n actions?: ReactNode;\n headingLevel?: CardHeadingLevel;\n selected?: boolean;\n /** Whole-card activation. Do not combine with interactive children or actions. */\n onActivate?: () => void;\n disabled?: boolean;\n tone?: SurfaceTone;\n bordered?: boolean;\n padding?: SurfacePadding;\n radius?: SurfaceRadius;\n /** Canonical layout-only placement; forwarded to the root Surface, which applies it. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Card = forwardRef<HTMLElement, CardProps>(function Card(\n {\n title,\n description,\n leading,\n media,\n actions,\n headingLevel = cardRecipe.defaults.headingLevel,\n selected = cardRecipe.defaults.selected,\n onActivate,\n disabled = false,\n tone = cardRecipe.defaults.tone,\n bordered = cardRecipe.defaults.bordered,\n padding = cardRecipe.defaults.padding,\n radius,\n className,\n children,\n ...props\n },\n ref,\n) {\n if (onActivate && (!props[\"aria-label\"]?.trim() || actions !== undefined)) {\n throw new TypeError(\"Interactive Card requires aria-label and no actions\");\n }\n const hasHeader =\n leading !== undefined || title !== undefined || description !== undefined;\n\n return (\n <Surface\n {...props}\n ref={ref}\n as={onActivate ? \"button\" : \"article\"}\n {...(onActivate ? {\n type: \"button\" as const, disabled, \"aria-pressed\": selected,\n \"data-interactive\": true, onClick: () => { if (!disabled) onActivate(); },\n } : {})}\n tone={selected ? cardRecipe.selectedTone : tone}\n bordered={bordered}\n {...(radius === undefined ? {} : { radius })}\n className={classNames(\"hjm-card\", className)}\n data-state={onActivate && disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"}\n style={{ \"--hjm-card-disabled-opacity\": cardRecipe.interaction.disabledOpacity,\n \"--hjm-card-pressed-opacity\": cardRecipe.interaction.pressedOpacity, ...props.style } as CSSProperties}\n >\n {media ? <div className=\"hjm-card__media\" data-slot=\"media\">{media}</div> : null}\n <div\n className=\"hjm-card__body\"\n data-slot=\"body\"\n style={{ padding: surfaceGeometry.paddings[padding] }}\n >\n {hasHeader ? (\n <div className=\"hjm-card__header\" data-slot=\"header\">\n {leading === undefined ? null : (\n <span className=\"hjm-card__leading\" data-slot=\"leading\">\n {leading}\n </span>\n )}\n <div className=\"hjm-card__copy\">\n {title === undefined\n ? null\n : createElement(\n `h${headingLevel}`,\n { className: \"hjm-card__title\", \"data-slot\": \"title\" },\n title,\n )}\n {description === undefined ? null : (\n <Text\n as=\"p\"\n tone=\"muted\"\n className=\"hjm-card__description\"\n data-slot=\"description\"\n >\n {description}\n </Text>\n )}\n </div>\n </div>\n ) : null}\n {children === undefined ? null : (\n <div className=\"hjm-card__content\" data-slot=\"content\">{children}</div>\n )}\n </div>\n {actions ? <div className=\"hjm-card__actions\" data-slot=\"actions\">{actions}</div> : null}\n </Surface>\n );\n});\n\nexport type ListRowProps = Omit<HTMLAttributes<HTMLElement>, \"title\" | \"onClick\"> &\n Readonly<{\n title: ReactNode;\n description?: ReactNode;\n leading?: ReactNode;\n trailing?: ReactNode;\n /** Independent command outside the row's navigation target. */\n trailingAction?: ReactNode;\n /** Supply a framework Link without replacing the shared row layout. */\n renderLink?: (props: React.ComponentPropsWithRef<\"a\">) => ReactNode;\n density?: ListRowDensity;\n /** Semantic emphasis for destructive destinations; selection stays independent. */\n tone?: keyof typeof listRowRecipe.tones;\n /** Frame the ListRow paints around `leading`; the recipe owns its size. */\n leadingShape?: ListRowLeadingShape;\n selected?: boolean;\n disabled?: boolean;\n /**\n * Placeholder row while the real one loads. It keeps the row's own height\n * and slot geometry, so a list does not jump when the content arrives —\n * which is exactly what a product-owned skeleton next to the list cannot do.\n */\n loading?: boolean;\n /** Localized status text announced while `loading`. */\n loadingLabel?: string;\n href?: string;\n onClick?: MouseEventHandler<HTMLElement>;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const ListRow = forwardRef<HTMLElement, ListRowProps>(function ListRow(\n {\n title,\n description,\n leading,\n trailing,\n trailingAction,\n renderLink,\n density: densityProp,\n tone = listRowRecipe.defaults.tone,\n leadingShape = \"square\",\n selected = listRowRecipe.defaults.selected,\n disabled = false,\n loading = false,\n loadingLabel,\n href,\n onClick,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n // The hook runs unconditionally — `??` would short-circuit it and break the\n // rules of hooks on the very first row that passes `density`.\n const densityDefault = useHjmDensityDefault({\n comfortable: listRowRecipe.defaults.density,\n compact: \"compact\",\n });\n const density = densityProp ?? densityDefault;\n if (loading) {\n // A loading row is never interactive: there is nothing to activate yet.\n return (\n <div\n {...props}\n ref={ref as React.Ref<HTMLDivElement>}\n role={loadingLabel ? \"status\" : undefined}\n aria-busy={loadingLabel ? true : undefined}\n aria-hidden={loadingLabel ? undefined : true}\n aria-label={loadingLabel}\n className={classNames(\"hjm-list-row\", \"hjm-list-row--loading\", className)}\n data-density={density}\n data-lines={description ? \"two\" : \"one\"}\n data-state=\"loading\"\n style={{ ...style, ...layoutStyle }}\n >\n {leading ? <span className=\"hjm-list-row__leading\" data-shape={leadingShape} data-placeholder=\"\" /> : null}\n <span className=\"hjm-list-row__content\">\n <span className=\"hjm-list-row__title\" data-placeholder=\"\" style={{ width: `${listRowRecipe.loading.titleWidthPercent}%` }} />\n {description ? <span className=\"hjm-list-row__description\" data-placeholder=\"\" style={{ width: `${listRowRecipe.loading.descriptionWidthPercent}%` }} /> : null}\n </span>\n {trailing ? <span className=\"hjm-list-row__trailing\" data-placeholder=\"\" style={{ width: listRowRecipe.loading.trailingWidth }} /> : null}\n </div>\n );\n }\n const element = href ? \"a\" : onClick ? \"button\" : \"div\";\n const interactiveProps = href\n ? {\n href: disabled ? undefined : href,\n \"aria-current\": selected ? (\"page\" as const) : undefined,\n \"aria-disabled\": disabled || undefined,\n tabIndex: disabled ? -1 : undefined,\n }\n : onClick\n ? {\n type: \"button\" as const,\n onClick: disabled ? undefined : onClick,\n disabled,\n \"aria-pressed\": selected,\n }\n : {};\n\n const row = createElement(\n element,\n {\n ...props,\n ...interactiveProps,\n ref,\n className: classNames(\"hjm-list-row\", className),\n \"data-density\": density,\n \"data-tone\": tone,\n // One- and two-line rows have different minimum heights in the recipe;\n // the web renderer used a single hardcoded value until now.\n \"data-lines\": description ? \"two\" : \"one\",\n \"data-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\n // Placement wins over the legacy `style`, matching Surface's ordering.\n // With trailingAction the frame is the placed root, as Native's outer View.\n style: trailingAction ? style : { ...style, ...layoutStyle },\n },\n leading\n ? <span className=\"hjm-list-row__leading\" data-shape={leadingShape}>{leading}</span>\n : null,\n <span className=\"hjm-list-row__content\">\n <span className=\"hjm-list-row__title\">{title}</span>\n {description ? (\n <span className=\"hjm-list-row__description\">{description}</span>\n ) : null}\n </span>,\n trailing ? <span className=\"hjm-list-row__trailing\">{trailing}</span> : null,\n );\n const linked = href && renderLink ? renderLink(row.props as React.ComponentPropsWithRef<\"a\">) : row;\n // The frame owns the row surface and its bleed so the command and the separate action share one fill, as Native;\n // the action stays outside the link/button (styles.css `.hjm-list-row-frame`).\n return trailingAction ? (\n <div className=\"hjm-list-row-frame\" data-density={density}\n data-state={disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"} style={layoutStyle}>\n {linked}\n <div className=\"hjm-list-row__action\">{trailingAction}</div>\n </div>\n ) : linked;\n});\n"]}
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../src/display.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n badgeRecipe,\n listRowRecipe,\n type BadgeSize,\n type BadgeTone,\n type BadgeVariant as ContractBadgeVariant,\n type ListRowDensity,\n type ListRowLeadingShape,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n resolveTagDescriptor,\n type TagTone,\n} from \"@hjmds/design-contracts/components/tag\";\nimport {\n cardRecipe,\n type CardHeadingLevel,\n} from \"@hjmds/design-contracts/components/card\";\nimport {\n surfaceGeometry,\n type SurfacePadding,\n type SurfaceRadius,\n type SurfaceTone,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n createElement,\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { useHjmDensityDefault } from \"./provider.js\";\nimport { Surface, Text } from \"./layout.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type { CardHeadingLevel } from \"@hjmds/design-contracts/components/card\";\nexport type { TagTone } from \"@hjmds/design-contracts/components/tag\";\nexport type BadgeVariant = ContractBadgeVariant;\n\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> &\n Readonly<{\n tone?: BadgeTone;\n size?: BadgeSize;\n variant?: BadgeVariant;\n leading?: ReactNode;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n {\n tone = badgeRecipe.defaults.tone,\n size = badgeRecipe.defaults.size,\n variant = badgeRecipe.defaults.variant,\n leading,\n className,\n children,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n return (\n <span\n {...props}\n style={{ ...style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-badge\", className)}\n data-tone={tone}\n data-size={size}\n data-variant={variant}\n >\n {leading === undefined ? null : (\n <span aria-hidden=\"true\" className=\"hjm-badge__icon\">\n {leading}\n </span>\n )}\n <span className=\"hjm-badge__label\">{children}</span>\n </span>\n );\n});\n\nexport type TagProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n children: string;\n tone?: TagTone;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { children, tone, className, layoutStyle, style, ...props },\n ref,\n) {\n const descriptor = resolveTagDescriptor({\n label: children,\n ...(tone === undefined ? {} : { tone }),\n });\n return (\n <span\n {...props}\n style={{ ...style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-tag\", className)}\n data-tone={descriptor.tone}\n >\n <span className=\"hjm-tag__label\">{descriptor.label}</span>\n </span>\n );\n});\n\nexport type CardProps = Omit<HTMLAttributes<HTMLElement>, \"title\"> &\n Readonly<{\n title?: ReactNode;\n description?: ReactNode;\n leading?: ReactNode;\n media?: ReactNode;\n actions?: ReactNode;\n headingLevel?: CardHeadingLevel;\n selected?: boolean;\n /** Whole-card activation. Do not combine with interactive children or actions. */\n onActivate?: () => void;\n disabled?: boolean;\n tone?: SurfaceTone;\n bordered?: boolean;\n padding?: SurfacePadding;\n radius?: SurfaceRadius;\n /** Canonical layout-only placement; forwarded to the root Surface, which applies it. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Card = forwardRef<HTMLElement, CardProps>(function Card(\n {\n title,\n description,\n leading,\n media,\n actions,\n headingLevel = cardRecipe.defaults.headingLevel,\n selected = cardRecipe.defaults.selected,\n onActivate,\n disabled = false,\n tone = cardRecipe.defaults.tone,\n bordered = cardRecipe.defaults.bordered,\n padding = cardRecipe.defaults.padding,\n radius,\n className,\n children,\n ...props\n },\n ref,\n) {\n if (onActivate && (!props[\"aria-label\"]?.trim() || actions !== undefined)) {\n throw new TypeError(\"Interactive Card requires aria-label and no actions\");\n }\n const hasHeader =\n leading !== undefined || title !== undefined || description !== undefined;\n\n return (\n <Surface\n {...props}\n ref={ref}\n as={onActivate ? \"button\" : \"article\"}\n {...(onActivate ? {\n type: \"button\" as const, disabled, \"aria-pressed\": selected,\n \"data-interactive\": true, onClick: () => { if (!disabled) onActivate(); },\n } : {})}\n tone={selected ? cardRecipe.selectedTone : tone}\n bordered={bordered}\n {...(radius === undefined ? {} : { radius })}\n className={classNames(\"hjm-card\", className)}\n data-state={onActivate && disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"}\n style={{ \"--hjm-card-disabled-opacity\": cardRecipe.interaction.disabledOpacity,\n \"--hjm-card-pressed-opacity\": cardRecipe.interaction.pressedOpacity, ...props.style } as CSSProperties}\n >\n {media ? <div className=\"hjm-card__media\" data-slot=\"media\">{media}</div> : null}\n <div\n className=\"hjm-card__body\"\n data-slot=\"body\"\n style={{ padding: surfaceGeometry.paddings[padding] }}\n >\n {hasHeader ? (\n <div className=\"hjm-card__header\" data-slot=\"header\">\n {leading === undefined ? null : (\n <span className=\"hjm-card__leading\" data-slot=\"leading\">\n {leading}\n </span>\n )}\n <div className=\"hjm-card__copy\">\n {title === undefined\n ? null\n : createElement(\n `h${headingLevel}`,\n { className: \"hjm-card__title\", \"data-slot\": \"title\" },\n title,\n )}\n {description === undefined ? null : (\n <Text\n as=\"p\"\n tone=\"muted\"\n className=\"hjm-card__description\"\n data-slot=\"description\"\n >\n {description}\n </Text>\n )}\n </div>\n </div>\n ) : null}\n {children === undefined ? null : (\n <div className=\"hjm-card__content\" data-slot=\"content\">{children}</div>\n )}\n </div>\n {actions ? <div className=\"hjm-card__actions\" data-slot=\"actions\">{actions}</div> : null}\n </Surface>\n );\n});\n\nexport type ListRowProps = Omit<HTMLAttributes<HTMLElement>, \"title\" | \"onClick\"> &\n Readonly<{\n title: ReactNode;\n description?: ReactNode;\n leading?: ReactNode;\n trailing?: ReactNode;\n /** Independent command outside the row's navigation target. */\n trailingAction?: ReactNode;\n /** Supply a framework Link without replacing the shared row layout. */\n renderLink?: (props: React.ComponentPropsWithRef<\"a\">) => ReactNode;\n density?: ListRowDensity;\n /** Semantic emphasis for destructive destinations; selection stays independent. */\n tone?: keyof typeof listRowRecipe.tones;\n /** Frame the ListRow paints around `leading`; the recipe owns its size. */\n leadingShape?: ListRowLeadingShape;\n selected?: boolean;\n disabled?: boolean;\n /**\n * Placeholder row while the real one loads. It keeps the row's own height\n * and slot geometry, so a list does not jump when the content arrives —\n * which is exactly what a product-owned skeleton next to the list cannot do.\n */\n loading?: boolean;\n /** Localized status text announced while `loading`. */\n loadingLabel?: string;\n href?: string;\n onClick?: MouseEventHandler<HTMLElement>;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const ListRow = forwardRef<HTMLElement, ListRowProps>(function ListRow(\n {\n title,\n description,\n leading,\n trailing,\n trailingAction,\n renderLink,\n density: densityProp,\n tone = listRowRecipe.defaults.tone,\n leadingShape = \"square\",\n selected = listRowRecipe.defaults.selected,\n disabled = false,\n loading = false,\n loadingLabel,\n href,\n onClick,\n className,\n layoutStyle,\n style,\n ...props\n },\n ref,\n) {\n // The hook runs unconditionally — `??` would short-circuit it and break the\n // rules of hooks on the very first row that passes `density`.\n const densityDefault = useHjmDensityDefault({\n comfortable: listRowRecipe.defaults.density,\n compact: \"compact\",\n });\n const density = densityProp ?? densityDefault;\n if (loading) {\n // A loading row is never interactive: there is nothing to activate yet.\n return (\n <div\n {...props}\n ref={ref as React.Ref<HTMLDivElement>}\n role={loadingLabel ? \"status\" : undefined}\n aria-busy={loadingLabel ? true : undefined}\n aria-hidden={loadingLabel ? undefined : true}\n aria-label={loadingLabel}\n className={classNames(\"hjm-list-row\", \"hjm-list-row--loading\", className)}\n data-density={density}\n data-leading={leading ? \"\" : undefined}\n data-lines={description ? \"two\" : \"one\"}\n data-state=\"loading\"\n style={{ ...style, ...layoutStyle }}\n >\n {leading ? <span className=\"hjm-list-row__leading\" data-shape={leadingShape} data-placeholder=\"\" /> : null}\n <span className=\"hjm-list-row__content\">\n <span className=\"hjm-list-row__title\" data-placeholder=\"\" style={{ width: `${listRowRecipe.loading.titleWidthPercent}%` }} />\n {description ? <span className=\"hjm-list-row__description\" data-placeholder=\"\" style={{ width: `${listRowRecipe.loading.descriptionWidthPercent}%` }} /> : null}\n </span>\n {trailing ? <span className=\"hjm-list-row__trailing\" data-placeholder=\"\" style={{ width: listRowRecipe.loading.trailingWidth }} /> : null}\n </div>\n );\n }\n const element = href ? \"a\" : onClick ? \"button\" : \"div\";\n const interactiveProps = href\n ? {\n href: disabled ? undefined : href,\n \"aria-current\": selected ? (\"page\" as const) : undefined,\n \"aria-disabled\": disabled || undefined,\n tabIndex: disabled ? -1 : undefined,\n }\n : onClick\n ? {\n type: \"button\" as const,\n onClick: disabled ? undefined : onClick,\n disabled,\n \"aria-pressed\": selected,\n }\n : {};\n\n const row = createElement(\n element,\n {\n ...props,\n ...interactiveProps,\n ref,\n className: classNames(\"hjm-list-row\", className),\n \"data-density\": density,\n // Exposes the text column to the enclosing List: its indented separator starts after the leading frame\n // (listRecipe.separators.indented.leadingInsetStart) only when this row has one.\n \"data-leading\": leading ? \"\" : undefined,\n \"data-tone\": tone,\n // One- and two-line rows have different minimum heights in the recipe;\n // the web renderer used a single hardcoded value until now.\n \"data-lines\": description ? \"two\" : \"one\",\n \"data-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\n // Placement wins over the legacy `style`, matching Surface's ordering.\n // With trailingAction the frame is the placed root, as Native's outer View.\n style: trailingAction ? style : { ...style, ...layoutStyle },\n },\n leading\n ? <span className=\"hjm-list-row__leading\" data-shape={leadingShape}>{leading}</span>\n : null,\n <span className=\"hjm-list-row__content\">\n <span className=\"hjm-list-row__title\">{title}</span>\n {description ? (\n <span className=\"hjm-list-row__description\">{description}</span>\n ) : null}\n </span>,\n trailing ? <span className=\"hjm-list-row__trailing\">{trailing}</span> : null,\n );\n const linked = href && renderLink ? renderLink(row.props as React.ComponentPropsWithRef<\"a\">) : row;\n // The frame owns the row surface and its bleed so the command and the separate action share one fill, as Native;\n // the action stays outside the link/button (styles.css `.hjm-list-row-frame`).\n return trailingAction ? (\n <div className=\"hjm-list-row-frame\" data-density={density} data-leading={leading ? \"\" : undefined}\n data-state={disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"} style={layoutStyle}>\n {linked}\n <div className=\"hjm-list-row__action\">{trailingAction}</div>\n </div>\n ) : linked;\n});\n"]}
@@ -34,7 +34,7 @@ export type ReactRendererEvidenceManifest = Readonly<{
34
34
  export declare const reactRendererEvidence: {
35
35
  readonly schemaVersion: 2;
36
36
  readonly packageName: "@hjmds/react";
37
- readonly packageVersion: "1.27.2";
37
+ readonly packageVersion: "1.28.0";
38
38
  readonly surface: "web";
39
39
  readonly components: readonly [Readonly<{
40
40
  /** Canonical component id from the design-contracts catalog. */
package/dist/evidence.js CHANGED
@@ -155,7 +155,7 @@ function toastClaim() {
155
155
  export const reactRendererEvidence = {
156
156
  schemaVersion: reactRendererEvidenceSchemaVersion,
157
157
  packageName: "@hjmds/react",
158
- packageVersion: "1.27.2",
158
+ packageVersion: "1.28.0",
159
159
  surface: "web",
160
160
  components: [
161
161
  defaultClaim("top-bar", ["TopBar"], "./top-bar"),
@@ -212,7 +212,7 @@ export const reactRendererEvidence = {
212
212
  keyboardClaim("sidebar", ["Sidebar"], "./sidebar", "test/sidebar.browser.test.tsx"),
213
213
  keyboardClaim("date-range-picker", ["DateRangePicker"], "./date-range", "test/date-range.keyboard.browser.test.tsx"),
214
214
  keyboardClaim("auth-provider-button", ["AuthProviderButton"], "./provider-button"),
215
- defaultClaim("auth-screen", ["AuthScreenLayout"], "./auth-screen"),
215
+ defaultClaim("auth-screen", ["AuthScreenLayout", "AuthScreenHero", "AuthScreenFooter"], "./auth-screen"),
216
216
  keyboardClaim("data-table", ["DataTable"], "./data-table", "test/data-table.keyboard.browser.test.tsx"),
217
217
  keyboardClaim("collapsible", ["Collapsible"], "./collapsible", "test/collapsible.keyboard.browser.test.tsx"),
218
218
  keyboardAndLongCopyClaim("context-menu", ["ContextMenu"], "./context-menu", "test/context-menu.interactions.browser.test.tsx"),