@hjmds/react-native 1.20.0 → 1.22.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 (81) hide show
  1. package/dist/actions.d.ts +10 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js.map +1 -1
  4. package/dist/authoring-tools.d.ts +24 -0
  5. package/dist/authoring-tools.d.ts.map +1 -0
  6. package/dist/authoring-tools.js +28 -0
  7. package/dist/authoring-tools.js.map +1 -0
  8. package/dist/calendar.d.ts.map +1 -1
  9. package/dist/calendar.js +2 -1
  10. package/dist/calendar.js.map +1 -1
  11. package/dist/chart.d.ts +138 -0
  12. package/dist/chart.d.ts.map +1 -0
  13. package/dist/chart.js +271 -0
  14. package/dist/chart.js.map +1 -0
  15. package/dist/collection-editing.d.ts +63 -0
  16. package/dist/collection-editing.d.ts.map +1 -0
  17. package/dist/collection-editing.js +114 -0
  18. package/dist/collection-editing.js.map +1 -0
  19. package/dist/communication.d.ts +51 -0
  20. package/dist/communication.d.ts.map +1 -0
  21. package/dist/communication.js +68 -0
  22. package/dist/communication.js.map +1 -0
  23. package/dist/data-table.d.ts +48 -0
  24. package/dist/data-table.d.ts.map +1 -0
  25. package/dist/data-table.js +90 -0
  26. package/dist/data-table.js.map +1 -0
  27. package/dist/data-workflows.d.ts +68 -0
  28. package/dist/data-workflows.d.ts.map +1 -0
  29. package/dist/data-workflows.js +60 -0
  30. package/dist/data-workflows.js.map +1 -0
  31. package/dist/evidence.d.ts +1 -1
  32. package/dist/evidence.js +1 -1
  33. package/dist/internal/recipe-button.d.ts +4 -0
  34. package/dist/internal/recipe-button.d.ts.map +1 -1
  35. package/dist/internal/recipe-button.js +24 -5
  36. package/dist/internal/recipe-button.js.map +1 -1
  37. package/dist/internal/use-composition-action.d.ts +17 -0
  38. package/dist/internal/use-composition-action.d.ts.map +1 -0
  39. package/dist/internal/use-composition-action.js +17 -0
  40. package/dist/internal/use-composition-action.js.map +1 -0
  41. package/dist/media-transport.d.ts +22 -0
  42. package/dist/media-transport.d.ts.map +1 -0
  43. package/dist/media-transport.js +49 -0
  44. package/dist/media-transport.js.map +1 -0
  45. package/dist/navigation.d.ts +3 -1
  46. package/dist/navigation.d.ts.map +1 -1
  47. package/dist/navigation.js +24 -9
  48. package/dist/navigation.js.map +1 -1
  49. package/dist/screen-flows.d.ts +5 -2
  50. package/dist/screen-flows.d.ts.map +1 -1
  51. package/dist/screen-flows.js +6 -4
  52. package/dist/screen-flows.js.map +1 -1
  53. package/dist/screens.d.ts +8 -2
  54. package/dist/screens.d.ts.map +1 -1
  55. package/dist/screens.js +21 -7
  56. package/dist/screens.js.map +1 -1
  57. package/dist/social-compositions.d.ts +52 -0
  58. package/dist/social-compositions.d.ts.map +1 -0
  59. package/dist/social-compositions.js +40 -0
  60. package/dist/social-compositions.js.map +1 -0
  61. package/dist/streaming-answer.d.ts +24 -0
  62. package/dist/streaming-answer.d.ts.map +1 -0
  63. package/dist/streaming-answer.js +57 -0
  64. package/dist/streaming-answer.js.map +1 -0
  65. package/dist/table-family.d.ts +48 -0
  66. package/dist/table-family.d.ts.map +1 -0
  67. package/dist/table-family.js +56 -0
  68. package/dist/table-family.js.map +1 -0
  69. package/dist/task-controls.d.ts +47 -0
  70. package/dist/task-controls.d.ts.map +1 -0
  71. package/dist/task-controls.js +46 -0
  72. package/dist/task-controls.js.map +1 -0
  73. package/dist/toggle-feedback.d.ts +26 -0
  74. package/dist/toggle-feedback.d.ts.map +1 -0
  75. package/dist/toggle-feedback.js +46 -0
  76. package/dist/toggle-feedback.js.map +1 -0
  77. package/dist/transfer-task.d.ts +18 -0
  78. package/dist/transfer-task.d.ts.map +1 -0
  79. package/dist/transfer-task.js +56 -0
  80. package/dist/transfer-task.js.map +1 -0
  81. package/package.json +75 -3
@@ -0,0 +1,51 @@
1
+ import { type ReactNode } from "react";
2
+ import { type ReplyTarget, type SearchResponse } from "@hjmds/design-contracts/communication";
3
+ import { type ChatMessageProps, type MessageComposerProps } from "./screens.js";
4
+ import { type SearchRecentQueries } from "./screen-flows.js";
5
+ export type ReplyMessageProps = Omit<ChatMessageProps, "replyAction" | "timestampPresentation"> & Readonly<{
6
+ messageId: string;
7
+ onReply: (messageId: string) => void;
8
+ replyLabel: string;
9
+ replyDisabled?: boolean;
10
+ /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */
11
+ swipeAction?: "reply" | "timestamp";
12
+ }>;
13
+ export declare function ReplyMessage({ messageId, onReply, replyLabel, replyDisabled, swipeAction, ...message }: ReplyMessageProps): import("react").JSX.Element;
14
+ export type ReplyComposerProps = Omit<MessageComposerProps, "onSend" | "replyTo" | "pending" | "error"> & Readonly<{
15
+ replyTarget: ReplyTarget | null;
16
+ onReplyCancel: () => void;
17
+ cancelReplyLabel: string;
18
+ errorLabel: string;
19
+ /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */
20
+ onSend: (value: string, context: Readonly<{
21
+ replyToId: string | null;
22
+ }>) => void | Promise<void>;
23
+ }>;
24
+ export declare function ReplyComposer({ replyTarget, onReplyCancel, cancelReplyLabel, errorLabel, onSend, ...composer }: ReplyComposerProps): import("react").JSX.Element;
25
+ export type ExpandableSearchProps<T> = Readonly<{
26
+ expanded: boolean;
27
+ onExpandedChange: (expanded: boolean) => void;
28
+ query: string;
29
+ onQueryChange: (query: string) => void;
30
+ onSearch: (query: string, context: Readonly<{
31
+ signal: AbortSignal;
32
+ }>) => Promise<SearchResponse<T>>;
33
+ renderResult: (result: T) => ReactNode;
34
+ onSubmit?: (query: string) => void;
35
+ recentQueries?: SearchRecentQueries;
36
+ debounceMs?: number;
37
+ disabled?: boolean;
38
+ labels: Readonly<{
39
+ title: string;
40
+ open: string;
41
+ cancel: string;
42
+ query: string;
43
+ clear: string;
44
+ searching: string;
45
+ error: string;
46
+ commit: (query: string) => string;
47
+ suggestionCount: (count: number) => string;
48
+ }>;
49
+ }>;
50
+ export declare function ExpandableSearch<T>(props: ExpandableSearchProps<T>): import("react").JSX.Element;
51
+ //# sourceMappingURL=communication.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { resolveSearchCommit } from "@hjmds/design-contracts/screen-patterns";
5
+ import { validateReplyTarget } from "@hjmds/design-contracts/communication";
6
+ import { ChatMessage, MessageComposer } from "./screens.js";
7
+ import { SearchScreen } from "./screen-flows.js";
8
+ import { Button } from "./actions.js";
9
+ import { Stack, Text } from "./primitives.js";
10
+ import { useCompositionAction } from "./internal/use-composition-action.js";
11
+ import { View, Keyboard } from "react-native";
12
+ import { SearchField } from "./inputs.js";
13
+ export function ReplyMessage({ messageId, onReply, replyLabel, replyDisabled = false, swipeAction = "reply", ...message }) {
14
+ if (!messageId.trim())
15
+ throw new TypeError("Reply message requires the actual message ID");
16
+ return _jsx(ChatMessage, { ...message, timestampPresentation: swipeAction === "timestamp" ? "swipe" : "always", replyAction: { label: replyLabel, onPress: () => onReply(messageId), disabled: replyDisabled } });
17
+ }
18
+ export function ReplyComposer({ replyTarget, onReplyCancel, cancelReplyLabel, errorLabel, onSend, ...composer }) {
19
+ validateReplyTarget(replyTarget);
20
+ const action = useCompositionAction(composer.disabled);
21
+ return _jsxs(Stack, { gap: "sm", children: [_jsx(MessageComposer, { ...composer, pending: action.pending, ...(replyTarget ? { replyTo: { author: replyTarget.author, excerpt: replyTarget.excerpt, cancelLabel: cancelReplyLabel, onCancel: onReplyCancel } } : {}), onSend: value => { const id = replyTarget?.id ?? null; void action.run("send", () => onSend(value, { replyToId: id })); } }), action.failed ? _jsx(Text, { accessibilityRole: "alert", accessibilityLiveRegion: "assertive", tone: "danger", align: "center", children: errorLabel }) : null] });
22
+ }
23
+ export function ExpandableSearch(props) {
24
+ const [snapshot, setSnapshot] = useState(null), [pending, setPending] = useState(false), [failed, setFailed] = useState(false), [committed, setCommitted] = useState("");
25
+ const latest = useRef(props);
26
+ latest.current = props;
27
+ const input = useRef(null), generation = useRef(0), controller = useRef(null);
28
+ useEffect(() => { if (!props.expanded) {
29
+ controller.current?.abort();
30
+ generation.current++;
31
+ setPending(false);
32
+ setCommitted("");
33
+ } }, [props.expanded]);
34
+ useEffect(() => () => { generation.current++; controller.current?.abort(); }, []);
35
+ useEffect(() => { if (props.expanded)
36
+ input.current?.focus(); }, [props.expanded]);
37
+ const search = (query, { signal }) => {
38
+ controller.current?.abort();
39
+ const token = ++generation.current, request = new AbortController();
40
+ controller.current = request;
41
+ const abort = () => request.abort();
42
+ signal.addEventListener("abort", abort, { once: true });
43
+ if (signal.aborted)
44
+ request.abort();
45
+ // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.
46
+ const valid = () => !request.signal.aborted && token === generation.current && latest.current.expanded && latest.current.query === query;
47
+ if (!query.trim()) {
48
+ setSnapshot(null);
49
+ setPending(false);
50
+ setFailed(false);
51
+ signal.removeEventListener("abort", abort);
52
+ return;
53
+ }
54
+ setPending(true);
55
+ setFailed(false);
56
+ const execute = latest.current.onSearch;
57
+ void Promise.resolve().then(() => request.signal.aborted ? null : execute(query, { signal: request.signal })).then(response => { if (valid() && response)
58
+ setSnapshot({ query, response }); }, () => { if (valid())
59
+ setFailed(true); }).finally(() => { signal.removeEventListener("abort", abort); if (valid())
60
+ setPending(false); });
61
+ };
62
+ const cancel = () => { controller.current?.abort(); generation.current++; setPending(false); Keyboard.dismiss(); props.onExpandedChange(false); };
63
+ const commit = (query) => { const normalized = resolveSearchCommit(query); if (normalized === null)
64
+ return; setCommitted(normalized); props.onSubmit?.(normalized); };
65
+ const current = snapshot?.query === props.query ? snapshot.response : null;
66
+ return _jsx(View, { children: _jsx(Stack, { gap: "sm", children: !props.expanded ? _jsx(Button, { disabled: props.disabled === true, onPress: () => props.onExpandedChange(true), children: props.labels.open }) : _jsxs(_Fragment, { children: [_jsx(Button, { tone: "ghost", onPress: cancel, children: props.labels.cancel }), _jsx(SearchScreen, { title: props.labels.title, titleVisibility: "hidden", queryLabel: props.labels.query, queryField: _jsx(SearchField, { ref: input, label: props.labels.query, clearLabel: props.labels.clear, busyLabel: props.labels.searching, value: props.query, onValueChange: props.onQueryChange, busy: pending, onSubmitEditing: () => commit(props.query), returnKeyType: "search" }), 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, { accessibilityRole: "alert", accessibilityLiveRegion: "assertive", tone: "danger", align: "center", children: props.labels.error }) : null] }) }) });
67
+ }
68
+ //# sourceMappingURL=communication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type ReactNode } from "react";
2
+ import { type DataTableAsyncState, type DataTableCellHeat, type DataTableCellTone, type DataTableColumnDescriptor, type DataTableColumnGroup, type DataTableDensity, type DataTableRowDescriptor, type DataTableRowGroup, type DataTableSortCycle, type DataTableSortState } from "@hjmds/design-contracts/components/data-table";
3
+ import type { HjmCompositionStyleProp } from "./composition-style.js";
4
+ export type NativeDataTableLabels = Readonly<{
5
+ /** Accessible name for the table. */
6
+ table: string;
7
+ /** Sortable header action name including its current direction. */
8
+ sortColumn: (header: string, direction: DataTableSortState<string>) => string;
9
+ }>;
10
+ export type DataTableProps<ColumnKey extends string = string, RowKey extends string = string> = Readonly<{
11
+ columns: readonly DataTableColumnDescriptor<ColumnKey>[];
12
+ rows: readonly DataTableRowDescriptor<RowKey>[];
13
+ labels: NativeDataTableLabels;
14
+ /** Strings and numbers render with the recipe's cell text; any other node is placed as-is. */
15
+ renderCell: (rowId: RowKey, columnId: ColumnKey) => ReactNode;
16
+ sortState?: DataTableSortState<ColumnKey>;
17
+ sortCycle?: DataTableSortCycle;
18
+ onSortChange?: (next: DataTableSortState<ColumnKey>) => void;
19
+ onRowPress?: (rowId: RowKey) => void;
20
+ selectedRowId?: RowKey | null;
21
+ /** Optional totals/average row pinned under the body (Web renders it as tfoot). */
22
+ summaryRow?: (columnId: ColumnKey) => ReactNode;
23
+ asyncState?: DataTableAsyncState;
24
+ /** Visible copy for the empty/error/loading body states (product-localized). */
25
+ emptyLabel?: string;
26
+ density?: DataTableDensity;
27
+ footer?: ReactNode;
28
+ /** Header bands above leaf columns (타격 | 주루). */
29
+ columnGroups?: readonly DataTableColumnGroup<ColumnKey>[];
30
+ /** Labeled row sections (선발 / 교체). */
31
+ rowGroups?: readonly DataTableRowGroup<RowKey>[];
32
+ /** Per-cell emphasis decided by the product (AG Grid cellClassRules / Savant percentile heat). */
33
+ cellStyle?: (rowId: RowKey, columnId: ColumnKey) => Readonly<{
34
+ tone?: DataTableCellTone | null;
35
+ heat?: DataTableCellHeat | null;
36
+ }> | null;
37
+ /** Heat base colors; default high = danger red, low = info blue (Savant). */
38
+ heatColors?: Readonly<{
39
+ high: string;
40
+ low: string;
41
+ }>;
42
+ /** Bounds the body height; the header stays fixed while rows scroll (react-native-sticky-table). */
43
+ maxBodyHeight?: number;
44
+ layoutStyle?: HjmCompositionStyleProp;
45
+ }>;
46
+ export declare function DataTable<ColumnKey extends string = string, RowKey extends string = string>({ columns, rows, labels, renderCell, sortState, sortCycle, onSortChange, onRowPress, selectedRowId, summaryRow, asyncState, emptyLabel, density, footer, layoutStyle, columnGroups, rowGroups, cellStyle, heatColors, maxBodyHeight, }: DataTableProps<ColumnKey, RowKey>): import("react").JSX.Element;
47
+ export { LineScore, MatrixTable, ComparisonTable, type LineScoreProps, type MatrixTableProps, type ComparisonTableProps } from "./table-family.js";
48
+ //# sourceMappingURL=data-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, useRef, useState } from "react";
3
+ import { Pressable, ScrollView, Text as NativeText, View } from "react-native";
4
+ import { resolveColorReference } from "@hjmds/design-contracts/color-references";
5
+ import { dataTableColumnDefaults, dataTableDefaults, dataTableFamilyRecipe, dataTableFirstSortDirection, dataTableRecipe, getNextDataTableSortState, resolveDataTableBody, resolveDataTableHeaderBands, splitPinnedDataTableColumns, validateDataTableColumns, validateDataTableRows, validateDataTableSortState, } from "@hjmds/design-contracts/components/data-table";
6
+ import { spacing } from "@hjmds/design-contracts/foundations";
7
+ import { Text } from "./primitives.js";
8
+ import { useHjmNativeTheme } from "./provider.js";
9
+ const DEFAULT_WIDTH = 72, PINNED_WIDTH = 96;
10
+ const alignOf = (align) => align === "end" ? "right" : align === "center" ? "center" : "left";
11
+ export function DataTable({ columns, rows, labels, renderCell, sortState = null, sortCycle = dataTableDefaults.sortCycle, onSortChange, onRowPress, selectedRowId = null, summaryRow, asyncState = { status: "idle" }, emptyLabel, density = dataTableRecipe.defaults.density, footer, layoutStyle, columnGroups = [], rowGroups = [], cellStyle, heatColors, maxBodyHeight, }) {
12
+ validateDataTableColumns(columns);
13
+ validateDataTableRows(rows);
14
+ validateDataTableSortState(sortState, columns);
15
+ const theme = useHjmNativeTheme(), { colors } = theme;
16
+ const color = (reference) => resolveColorReference(reference, theme.palette);
17
+ const [width, setWidth] = useState(0), [atEnd, setAtEnd] = useState(false), [pressed, setPressed] = useState(null);
18
+ const { pinned, scrolling } = useMemo(() => splitPinnedDataTableColumns(columns), [columns]);
19
+ const pad = dataTableRecipe.density[density];
20
+ const rowHeight = density === "compact" ? 40 : 48, headerHeight = density === "compact" ? 34 : 40;
21
+ const pinnedWidth = pinned.reduce((sum, column) => sum + (column.width ?? PINNED_WIDTH), 0);
22
+ // Short tables stretch scrolling columns to fill the card; wide ones keep their widths and scroll.
23
+ const natural = scrolling.reduce((sum, column) => sum + (column.width ?? DEFAULT_WIDTH), 0);
24
+ const stretch = width > 0 && natural > 0 && natural < width - pinnedWidth ? (width - pinnedWidth) / natural : 1;
25
+ const widthOf = (column, pinnedColumn) => pinnedColumn ? column.width ?? PINNED_WIDTH : (column.width ?? DEFAULT_WIDTH) * stretch;
26
+ const overflow = width > 0 && pinnedWidth + natural > width + 1;
27
+ function header(column, pinnedColumn) {
28
+ const sortable = column.sortable ?? dataTableColumnDefaults.sortable;
29
+ const active = sortState?.columnId === column.id ? sortState.direction : null;
30
+ const textColor = active ? color(dataTableRecipe.sortButton.activeColor) : color(dataTableRecipe.header.color);
31
+ const content = _jsxs(NativeText, { numberOfLines: 1, style: { color: textColor, fontSize: 12, fontWeight: "700", textAlign: alignOf(column.align ?? dataTableColumnDefaults.align) }, children: [column.header, active ? (active === "ascending" ? " ▲" : " ▼") : ""] });
32
+ const style = { width: widthOf(column, pinnedColumn), height: headerHeight, paddingHorizontal: pad.paddingHorizontal / 2, justifyContent: "center" };
33
+ return sortable && onSortChange
34
+ ? _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: labels.sortColumn(column.header, sortState?.columnId === column.id ? sortState : null), hitSlop: 4, onPress: () => onSortChange(getNextDataTableSortState(sortState, column.id, sortCycle, dataTableFirstSortDirection(column))), style: style, children: content }, column.id)
35
+ : _jsx(View, { accessibilityRole: "header", style: style, children: content }, column.id);
36
+ }
37
+ const heatBase = { high: heatColors?.high ?? color(dataTableFamilyRecipe.heat.high), low: heatColors?.low ?? color(dataTableFamilyRecipe.heat.low) };
38
+ function cell(node, column, pinnedColumn, emphasis, key, decoration = null, indent = 0) {
39
+ const align = alignOf(column.align ?? dataTableColumnDefaults.align);
40
+ const tone = decoration?.tone ? dataTableFamilyRecipe.tone[decoration.tone] : null, heat = decoration?.heat ?? null;
41
+ return _jsxs(View, { style: { width: widthOf(column, pinnedColumn), height: rowHeight - 1, paddingHorizontal: pad.paddingHorizontal / 2, paddingLeft: pad.paddingHorizontal / 2 + indent, justifyContent: "center", alignItems: align === "right" ? "flex-end" : align === "center" ? "center" : "flex-start" }, children: [heat && _jsx(View, { pointerEvents: "none", style: { position: "absolute", left: 2, right: 2, top: 4, bottom: 4, borderRadius: 6, backgroundColor: heatBase[heat.side], opacity: dataTableFamilyRecipe.heatAlpha[heat.strength] } }), typeof node === "string" || typeof node === "number"
42
+ ? _jsx(NativeText, { numberOfLines: 1, style: { color: tone ? color(tone.color) : emphasis ? colors.text : color(dataTableRecipe.cell.color), fontSize: 14, fontWeight: tone ? tone.fontWeight : emphasis ? "700" : "500", textAlign: align, fontVariant: ["tabular-nums"] }, children: String(node) })
43
+ : node] }, key);
44
+ }
45
+ const rowBackground = (id) => pressed === id ? color(dataTableRecipe.row.hoverBackground) : selectedRowId === id ? color(dataTableRecipe.row.selectedBackground) : "transparent";
46
+ function row(rowDescriptor, part) {
47
+ const list = part === "pinned" ? pinned : scrolling;
48
+ const cells = _jsx(View, { style: { flexDirection: "row" }, children: list.map((column, index) => cell(renderCell(rowDescriptor.id, column.id), column, part === "pinned", part === "pinned" || sortState?.columnId === column.id, `${rowDescriptor.id}-${column.id}`, cellStyle?.(rowDescriptor.id, column.id) ?? null, index === 0 && (part === "pinned" || pinned.length === 0) ? (rowDescriptor.depth ?? 0) * dataTableFamilyRecipe.depthIndent : 0)) });
49
+ const style = { height: rowHeight, borderTopWidth: 1, borderColor: color(dataTableRecipe.row.borderBottom), backgroundColor: rowBackground(rowDescriptor.id), opacity: rowDescriptor.disabled ? 0.5 : 1 };
50
+ // Only the pinned half carries the accessible row button so a row is announced once.
51
+ const name = part === "pinned" ? columns.map(column => { const value = renderCell(rowDescriptor.id, column.id); return typeof value === "string" || typeof value === "number" ? `${column.header} ${value}` : column.header; }).join(", ") : undefined;
52
+ return onRowPress && !rowDescriptor.disabled
53
+ ? _jsx(Pressable, { accessible: part === "pinned" || pinned.length === 0, accessibilityRole: "button", accessibilityState: { selected: selectedRowId === rowDescriptor.id }, accessibilityLabel: name, onPressIn: () => setPressed(rowDescriptor.id), onPressOut: () => setPressed(null), onPress: () => onRowPress(rowDescriptor.id), style: style, children: cells }, rowDescriptor.id)
54
+ : _jsx(View, { accessible: part === "pinned" || pinned.length === 0, accessibilityLabel: name, style: style, children: cells }, rowDescriptor.id);
55
+ }
56
+ const summary = (list, part) => summaryRow ? _jsx(View, { style: { flexDirection: "row", height: rowHeight, borderTopWidth: 1, borderColor: color(dataTableRecipe.header.borderBottom), backgroundColor: color(dataTableRecipe.header.background) }, children: list.map(column => cell(summaryRow(column.id), column, part === "pinned", true, `summary-${column.id}`)) }) : null;
57
+ const headerScroll = useRef(null);
58
+ function onScroll(event) {
59
+ const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent;
60
+ // The header lives outside the body so it can stay fixed vertically; it follows the body horizontally.
61
+ headerScroll.current?.scrollTo({ x: contentOffset.x, animated: false });
62
+ setAtEnd(contentOffset.x + layoutMeasurement.width >= contentSize.width - 4);
63
+ }
64
+ const body = useMemo(() => resolveDataTableBody(rows, rowGroups), [rows, rowGroups]);
65
+ const rowById = useMemo(() => new Map(rows.map(item => [item.id, item])), [rows]);
66
+ const bandHeight = 26;
67
+ function bands(list, part) {
68
+ if (columnGroups.length === 0)
69
+ return null;
70
+ const resolved = resolveDataTableHeaderBands(list, columnGroups);
71
+ return _jsx(View, { style: { flexDirection: "row", height: bandHeight }, children: resolved.map(band => {
72
+ const width = band.columnIds.reduce((sum, id) => sum + widthOf(list.find(column => column.id === id), part === "pinned"), 0);
73
+ return _jsx(View, { accessibilityRole: band.header ? "header" : undefined, style: { width, justifyContent: "flex-end", paddingHorizontal: pad.paddingHorizontal / 2, paddingBottom: 2 }, children: band.header && _jsx(View, { style: { borderBottomWidth: 1, borderColor: color(dataTableFamilyRecipe.headerBand.borderBottom), paddingBottom: 2 }, children: _jsx(NativeText, { numberOfLines: 1, style: { color: color(dataTableFamilyRecipe.headerBand.color), fontSize: 11, fontWeight: "700", textAlign: "center" }, children: band.header }) }) }, band.id);
74
+ }) });
75
+ }
76
+ function groupRow(id, label, part) {
77
+ const showLabel = part === "pinned" || pinned.length === 0;
78
+ return _jsx(View, { accessibilityRole: showLabel ? "header" : undefined, style: { height: 30, justifyContent: "center", paddingHorizontal: pad.paddingHorizontal / 2, borderTopWidth: 1, borderColor: color(dataTableRecipe.row.borderBottom), backgroundColor: color(dataTableFamilyRecipe.groupRow.background) }, children: showLabel && _jsx(NativeText, { numberOfLines: 1, style: { color: color(dataTableFamilyRecipe.groupRow.color), fontSize: 12, fontWeight: "700" }, children: label }) }, `group-${id}`);
79
+ }
80
+ const bodyRows = (part) => body.map(item => item.kind === "group" ? groupRow(item.id, item.label, part) : row(rowById.get(item.id), part));
81
+ const headerBackground = color(dataTableRecipe.header.background);
82
+ const status = asyncState.status;
83
+ const bodyMessage = status === "loading" || status === "error" || rows.length === 0 ? emptyLabel : null;
84
+ const columnsBody = _jsxs(View, { style: { flexDirection: "row" }, children: [pinned.length > 0 && _jsxs(View, { style: { borderRightWidth: overflow ? 1 : 0, borderColor: color(dataTableRecipe.row.borderBottom) }, children: [bodyRows("pinned"), summary(pinned, "pinned")] }), _jsxs(View, { style: { flex: 1 }, children: [_jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, onScroll: onScroll, scrollEventThrottle: 16, children: _jsxs(View, { children: [bodyRows("scrolling"), summary(scrolling, "scrolling")] }) }), overflow && !atEnd && _jsx(View, { pointerEvents: "none", accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: { position: "absolute", right: 0, top: 0, bottom: 0, width: 24, flexDirection: "row" }, children: [0.15, 0.35, 0.55, 0.8].map(alpha => _jsx(View, { style: { flex: 1, backgroundColor: colors.surface, opacity: alpha } }, alpha)) })] })] });
85
+ return _jsxs(View, { style: [{ gap: spacing.sm }, layoutStyle], children: [_jsx(View, { accessibilityLabel: labels.table, onLayout: event => setWidth(event.nativeEvent.layout.width), style: { borderRadius: 12, overflow: "hidden", backgroundColor: colors.surface }, children: bodyMessage
86
+ ? _jsx(View, { style: { minHeight: 120, alignItems: "center", justifyContent: "center", padding: spacing.md }, children: _jsx(Text, { tone: status === "error" ? "danger" : "muted", align: "center", children: bodyMessage }) })
87
+ : _jsxs(_Fragment, { children: [_jsxs(View, { style: { flexDirection: "row", backgroundColor: headerBackground }, children: [pinned.length > 0 && _jsxs(View, { style: { borderRightWidth: overflow ? 1 : 0, borderColor: color(dataTableRecipe.row.borderBottom) }, children: [bands(pinned, "pinned"), _jsx(View, { style: { flexDirection: "row" }, children: pinned.map(column => header(column, true)) })] }), _jsx(ScrollView, { ref: headerScroll, horizontal: true, scrollEnabled: false, showsHorizontalScrollIndicator: false, style: { flex: 1 }, children: _jsxs(View, { children: [bands(scrolling, "scrolling"), _jsx(View, { style: { flexDirection: "row" }, children: scrolling.map(column => header(column, false)) })] }) })] }), maxBodyHeight ? _jsx(ScrollView, { nestedScrollEnabled: true, style: { maxHeight: maxBodyHeight }, children: columnsBody }) : columnsBody] }) }), footer] });
88
+ }
89
+ export { LineScore, MatrixTable, ComparisonTable } from "./table-family.js";
90
+ //# sourceMappingURL=data-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { binHistogram, resolveFunnel, resolveImportMapping, resolveTarget, type Cohort, type CorrelationData, type FunnelStage, type HistogramBin, type ImportMapping, type WorkflowField } from "@hjmds/design-contracts/data-workflows";
2
+ export type ImportFieldMappingProps = Readonly<{
3
+ label: string;
4
+ sources: readonly WorkflowField[];
5
+ targets: readonly WorkflowField[];
6
+ mapping: ImportMapping;
7
+ onMappingChange: (mapping: ImportMapping) => void;
8
+ onImport: (mapping: ImportMapping) => void | Promise<void>;
9
+ importLabel: string;
10
+ dismissLabel: string;
11
+ skipLabel: string;
12
+ errorLabel: string;
13
+ disabled?: boolean;
14
+ validationLabel: (state: ReturnType<typeof resolveImportMapping>) => string;
15
+ previewRows?: readonly Readonly<{
16
+ id: string;
17
+ values: Readonly<Record<string, string>>;
18
+ }>[];
19
+ }>;
20
+ export declare function ImportFieldMapping(props: ImportFieldMappingProps): import("react").JSX.Element;
21
+ export type ConversionFunnelProps = Readonly<{
22
+ label: string;
23
+ stages: readonly FunnelStage[];
24
+ formatCount: (count: number) => string;
25
+ missingLabel: string;
26
+ detailLabel: (stage: ReturnType<typeof resolveFunnel>[number]) => string;
27
+ }>;
28
+ export declare function ConversionFunnel(props: ConversionFunnelProps): import("react").JSX.Element;
29
+ export type CohortRetentionTableProps = Readonly<{
30
+ label: string;
31
+ cohorts: readonly Cohort[];
32
+ periods: readonly string[];
33
+ cohortColumnLabel: string;
34
+ formatRate: (rate: number, retained: number, size: number) => string;
35
+ missingLabel: string;
36
+ }>;
37
+ export declare function CohortRetentionTable(props: CohortRetentionTableProps): import("react").JSX.Element;
38
+ export type CorrelationMatrixProps = Readonly<{
39
+ label: string;
40
+ data: CorrelationData;
41
+ variableColumnLabel: string;
42
+ formatValue: (value: number) => string;
43
+ missingLabel: string;
44
+ }>;
45
+ export declare function CorrelationMatrix(props: CorrelationMatrixProps): import("react").JSX.Element;
46
+ export type TargetSummaryProps = Readonly<{
47
+ label: string;
48
+ actual: number;
49
+ target: number;
50
+ formatActual: (actual: number) => string;
51
+ summaryLabel: (summary: ReturnType<typeof resolveTarget>) => string;
52
+ }>;
53
+ export declare function TargetSummary(props: TargetSummaryProps): import("react").JSX.Element;
54
+ export type HistogramExplorerProps = Readonly<{
55
+ label: string;
56
+ samples: readonly (number | null)[];
57
+ binCounts: readonly number[];
58
+ binCount: number;
59
+ onBinCountChange: (count: number) => void;
60
+ domain?: readonly [number, number];
61
+ binLabel: (bin: HistogramBin) => string;
62
+ binCountLabel: (count: number) => string;
63
+ formatCount: (count: number) => string;
64
+ missingLabel: string;
65
+ summaryLabel: (histogram: ReturnType<typeof binHistogram>) => string;
66
+ }>;
67
+ export declare function HistogramExplorer(props: HistogramExplorerProps): import("react").JSX.Element;
68
+ //# sourceMappingURL=data-workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-workflows.d.ts","sourceRoot":"","sources":["../src/data-workflows.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { binHistogram, resolveCohorts, resolveFunnel, resolveImportMapping, resolveTarget, validateCorrelation } from "@hjmds/design-contracts/data-workflows";
5
+ import { assertDistinctIds } from "@hjmds/design-contracts/collection-editing";
6
+ import { resolveDatavizSeriesColor } from "@hjmds/design-contracts/dataviz";
7
+ import { Button } from "./actions.js";
8
+ import { Select } from "./forms.js";
9
+ import { Stack, Text } from "./primitives.js";
10
+ import { DataTable } from "./data-table.js";
11
+ import { BarChart } from "./chart.js";
12
+ import { Statistic } from "./data-display.js";
13
+ import { Progress } from "./feedback.js";
14
+ import { useHjmNativeTheme } from "./provider.js";
15
+ import { useCompositionAction } from "./internal/use-composition-action.js";
16
+ // These read-only tables expose neither sort controls nor row selection.
17
+ const labelsFor = (label) => ({ table: label, selectAll: label, selectRow: (id) => id, sortColumn: (header) => header });
18
+ export function ImportFieldMapping(props) {
19
+ const action = useCompositionAction(props.disabled), resolved = resolveImportMapping(props.sources, props.targets, props.mapping);
20
+ const locked = props.disabled === true || action.pending, rows = props.previewRows ?? [];
21
+ assertDistinctIds(rows);
22
+ const pairs = props.targets.flatMap(target => { const source = props.sources.find(source => props.mapping[source.id] === target.id); return source ? [{ source, target }] : []; });
23
+ return _jsxs(Stack, { gap: "md", children: [_jsx(Text, { emphasis: "strong", children: props.label }), props.sources.map(source => _jsx(Select, { label: source.label, placeholder: props.skipLabel, dismissLabel: props.dismissLabel, disabled: locked, items: [{ id: resolved.skipKey, label: props.skipLabel, textValue: props.skipLabel }, ...props.targets.map(target => ({ id: target.id, label: target.label, textValue: target.label }))], selectedKey: props.mapping[source.id] ?? resolved.skipKey, onSelectionChange: key => { if (!locked)
24
+ props.onMappingChange({ ...props.mapping, [source.id]: key === resolved.skipKey ? null : key }); } }, source.id)), !resolved.valid ? _jsx(Text, { accessibilityLiveRegion: "polite", align: "center", children: props.validationLabel(resolved) }) : null, resolved.valid && rows.length ? _jsx(DataTable, { columns: pairs.map(pair => ({ id: pair.target.id, header: pair.target.label })), rows: rows.map(row => ({ id: row.id })), labels: labelsFor(props.label), renderCell: (id, column) => rows.find(row => row.id === id)?.values[pairs.find(pair => pair.target.id === column).source.id] ?? "" }) : null, _jsx(Button, { loading: action.pending, disabled: props.disabled === true || !resolved.valid, onPress: () => { if (resolved.valid)
25
+ void action.run("import", () => props.onImport(resolved.mapping)); }, children: props.importLabel }), action.failed ? _jsx(Text, { accessibilityRole: "alert", accessibilityLiveRegion: "assertive", tone: "danger", align: "center", children: props.errorLabel }) : null] });
26
+ }
27
+ export function ConversionFunnel(props) {
28
+ const stages = resolveFunnel(props.stages), [chosen, setChosen] = useState(null);
29
+ const selected = Math.max(0, stages.findIndex(stage => stage.id === chosen));
30
+ return _jsxs(Stack, { gap: "md", children: [_jsx(Text, { emphasis: "strong", children: props.label }), stages.length ? _jsxs(_Fragment, { children: [_jsx(BarChart, { categories: stages.map(stage => stage.label), series: [{ id: "count", label: props.label, values: stages.map(stage => stage.count) }], accessibilityLabel: props.label, formatValue: props.formatCount, missingLabel: props.missingLabel, orientation: "horizontal", focusIndex: selected, onFocusChange: index => { if (index !== null && stages[index])
31
+ setChosen(stages[index].id); } }), _jsx(Stack, { axis: "inline", gap: "sm", wrap: true, children: stages.map(stage => _jsx(Button, { tone: "ghost", selected: stages[selected].id === stage.id, onPress: () => setChosen(stage.id), children: stage.label }, stage.id)) }), _jsx(Text, { accessibilityLiveRegion: "polite", children: props.detailLabel(stages[selected]) })] }) : _jsx(Text, { align: "center", children: props.missingLabel })] });
32
+ }
33
+ export function CohortRetentionTable(props) {
34
+ const rows = resolveCohorts(props.cohorts, props.periods.length);
35
+ const color = useHjmNativeTheme().environment.theme;
36
+ // MatrixTable intentionally suppresses its diagonal for head-to-head teams. Cohort data is rectangular.
37
+ return _jsx(DataTable, { columns: [{ id: "label", header: props.cohortColumnLabel, pinned: "start" }, ...props.periods.map((header, index) => ({ id: `p-${index}`, header }))], rows: rows.map(row => ({ id: row.id })), labels: labelsFor(props.label), heatColors: { high: resolveDatavizSeriesColor(color, 0), low: resolveDatavizSeriesColor(color, 1) }, cellStyle: (rowId, column) => { const rate = rows.find(row => row.id === rowId).rates[Number(column.slice(2))]; return typeof rate === "number" && rate > 0 ? { heat: { side: "high", strength: rate >= .7 ? 3 : rate >= .35 ? 2 : 1 } } : null; }, renderCell: (rowId, column) => { const row = rows.find(row => row.id === rowId); if (column === "label")
38
+ return row.label; const index = Number(column.slice(2)), rate = row.rates[index]; return rate === null || rate === undefined ? props.missingLabel : props.formatRate(rate, row.retained[index], row.size); } });
39
+ }
40
+ export function CorrelationMatrix(props) {
41
+ validateCorrelation(props.data);
42
+ const color = useHjmNativeTheme().environment.theme;
43
+ const valueOf = (row, column) => props.data.values[props.data.variables.findIndex(variable => variable.id === row)][Number(column.slice(2))];
44
+ return _jsx(DataTable, { columns: [{ id: "label", header: props.variableColumnLabel, pinned: "start" }, ...props.data.variables.map((variable, index) => ({ id: `v-${index}`, header: variable.label }))], rows: props.data.variables.map(variable => ({ id: variable.id })), labels: labelsFor(props.label), heatColors: { high: resolveDatavizSeriesColor(color, 0), low: resolveDatavizSeriesColor(color, 1) }, cellStyle: (row, column) => { if (column === "label")
45
+ return null; const value = valueOf(row, column); return value === null || value === undefined || value === 0 ? null : { heat: { side: value > 0 ? "high" : "low", strength: Math.abs(value) >= .7 ? 3 : Math.abs(value) >= .35 ? 2 : 1 } }; }, renderCell: (row, column) => { if (column === "label")
46
+ return props.data.variables.find(variable => variable.id === row).label; const value = valueOf(row, column); return value === null || value === undefined ? props.missingLabel : props.formatValue(value); } });
47
+ }
48
+ export function TargetSummary(props) {
49
+ const summary = resolveTarget(props.actual, props.target), label = props.summaryLabel(summary);
50
+ return _jsxs(Stack, { gap: "sm", children: [_jsx(Statistic, { descriptor: { id: "target-summary", label: props.label, value: props.formatActual(summary.actual), hint: label } }), summary.progress === null ? null : _jsx(Progress, { label: props.label, value: summary.progress, max: 1, valueText: label })] });
51
+ }
52
+ export function HistogramExplorer(props) {
53
+ if (!props.binCounts.length || !props.binCounts.includes(props.binCount) || new Set(props.binCounts).size !== props.binCounts.length)
54
+ throw new RangeError("Histogram requires distinct choices including the selected bin count");
55
+ const variants = props.binCounts.map(count => binHistogram(props.samples, count, props.domain)), histogram = variants[props.binCounts.indexOf(props.binCount)];
56
+ // Hold the y domain across rebinning. Normalizing each set to its tallest bar changes the meaning.
57
+ const maximum = Math.max(...variants.map(variant => variant.maxCount));
58
+ return _jsxs(Stack, { gap: "md", children: [_jsx(Text, { emphasis: "strong", children: props.label }), _jsx(Stack, { axis: "inline", gap: "sm", wrap: true, children: props.binCounts.map(count => _jsx(Button, { tone: "secondary", selected: count === props.binCount, onPress: () => props.onBinCountChange(count), children: props.binCountLabel(count) }, count)) }), histogram.observed ? _jsx(BarChart, { categories: histogram.bins.map(props.binLabel), series: [{ id: "frequency", label: props.label, values: histogram.bins.map(bin => bin.count) }], accessibilityLabel: props.label, formatValue: props.formatCount, missingLabel: props.missingLabel, domain: [0, maximum], showValues: true }) : _jsx(Text, { align: "center", children: props.missingLabel }), _jsx(Text, { accessibilityLiveRegion: "polite", children: props.summaryLabel(histogram) })] });
59
+ }
60
+ //# sourceMappingURL=data-workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-workflows.js","sourceRoot":"","sources":["../src/data-workflows.tsx"],"names":[],"mappings":"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"}
@@ -32,7 +32,7 @@ export type ReactNativeRendererEvidenceManifest = Readonly<{
32
32
  export declare const reactNativeRendererEvidence: {
33
33
  readonly schemaVersion: 2;
34
34
  readonly packageName: "@hjmds/react-native";
35
- readonly packageVersion: "1.20.0";
35
+ readonly packageVersion: "1.22.0";
36
36
  readonly surface: "native";
37
37
  readonly components: readonly [Readonly<{
38
38
  /** Canonical component id from the design-contracts catalog. */
package/dist/evidence.js CHANGED
@@ -129,7 +129,7 @@ function nativeActionAndLongCopyClaim(componentId, exportNames, subpath, proofFi
129
129
  export const reactNativeRendererEvidence = {
130
130
  schemaVersion: reactNativeRendererEvidenceSchemaVersion,
131
131
  packageName: "@hjmds/react-native",
132
- packageVersion: "1.20.0",
132
+ packageVersion: "1.22.0",
133
133
  surface: "native",
134
134
  components: [
135
135
  defaultClaim("design-system-provider", ["HjmNativeProvider", "useHjmNativeTheme"], "./provider"),
@@ -9,6 +9,10 @@ export declare const RecipeButton: import("react").ForwardRefExoticComponent<Omi
9
9
  selected?: boolean;
10
10
  disabled?: boolean;
11
11
  loading?: boolean;
12
+ completion?: Readonly<{
13
+ confirmed: boolean;
14
+ label: string;
15
+ }>;
12
16
  disableWhileLoading?: boolean;
13
17
  growWithContent?: boolean;
14
18
  loadingLabel?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"recipe-button.d.ts","sourceRoot":"","sources":["../../src/internal/recipe-button.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAGL,IAAI,EAEJ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAwBtB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;YAhBJ,SAAS,CAAC,SAAS,CAAC;iBAAe,SAAS,CAAC,SAAS,CAAC;yCAwJ3E,CAAC"}
1
+ {"version":3,"file":"recipe-button.d.ts","sourceRoot":"","sources":["../../src/internal/recipe-button.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAGL,IAAI,EAEJ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAwBtB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;YAhBJ,SAAS,CAAC,SAAS,CAAC;iBAAe,SAAS,CAAC,SAAS,CAAC;yCAoL3E,CAAC"}