@hjmds/design-contracts 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.
- package/dist/authoring-tools.d.ts +38 -0
- package/dist/authoring-tools.d.ts.map +1 -0
- package/dist/authoring-tools.js +35 -0
- package/dist/authoring-tools.js.map +1 -0
- package/dist/behaviors.d.ts +33 -3
- package/dist/behaviors.d.ts.map +1 -1
- package/dist/behaviors.js +2 -0
- package/dist/behaviors.js.map +1 -1
- package/dist/calendar.d.ts +9 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +4 -2
- package/dist/calendar.js.map +1 -1
- package/dist/catalog.d.ts +129 -2
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +6 -2
- package/dist/catalog.js.map +1 -1
- package/dist/chart.d.ts +398 -0
- package/dist/chart.d.ts.map +1 -0
- package/dist/chart.js +414 -0
- package/dist/chart.js.map +1 -0
- package/dist/collection-editing.d.ts +38 -0
- package/dist/collection-editing.d.ts.map +1 -0
- package/dist/collection-editing.js +53 -0
- package/dist/collection-editing.js.map +1 -0
- package/dist/communication.d.ts +29 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +11 -0
- package/dist/communication.js.map +1 -0
- package/dist/component-definitions.d.ts +1 -0
- package/dist/component-definitions.d.ts.map +1 -1
- package/dist/component-definitions.js +1 -0
- package/dist/component-definitions.js.map +1 -1
- package/dist/data-table.d.ts +229 -5
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +242 -6
- package/dist/data-table.js.map +1 -1
- package/dist/data-workflows.d.ts +70 -0
- package/dist/data-workflows.d.ts.map +1 -0
- package/dist/data-workflows.js +109 -0
- package/dist/data-workflows.js.map +1 -0
- package/dist/dataviz.d.ts +7 -6
- package/dist/dataviz.d.ts.map +1 -1
- package/dist/dataviz.js +7 -6
- package/dist/dataviz.js.map +1 -1
- package/dist/gooey-navigation.d.ts +7 -0
- package/dist/gooey-navigation.d.ts.map +1 -1
- package/dist/gooey-navigation.js +10 -0
- package/dist/gooey-navigation.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/media-transport.d.ts +16 -0
- package/dist/media-transport.d.ts.map +1 -0
- package/dist/media-transport.js +17 -0
- package/dist/media-transport.js.map +1 -0
- package/dist/recipes.d.ts +1 -0
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +1 -0
- package/dist/recipes.js.map +1 -1
- package/dist/showcase.d.ts.map +1 -1
- package/dist/showcase.js +3 -1
- package/dist/showcase.js.map +1 -1
- package/dist/social-compositions.d.ts +19 -0
- package/dist/social-compositions.d.ts.map +1 -0
- package/dist/social-compositions.js +33 -0
- package/dist/social-compositions.js.map +1 -0
- package/dist/streaming-answer.d.ts +18 -0
- package/dist/streaming-answer.d.ts.map +1 -0
- package/dist/streaming-answer.js +61 -0
- package/dist/streaming-answer.js.map +1 -0
- package/dist/task-controls.d.ts +31 -0
- package/dist/task-controls.d.ts.map +1 -0
- package/dist/task-controls.js +25 -0
- package/dist/task-controls.js.map +1 -0
- package/dist/toggle-feedback.d.ts +22 -0
- package/dist/toggle-feedback.d.ts.map +1 -0
- package/dist/toggle-feedback.js +32 -0
- package/dist/toggle-feedback.js.map +1 -0
- package/dist/transfer-task.d.ts +13 -0
- package/dist/transfer-task.d.ts.map +1 -0
- package/dist/transfer-task.js +13 -0
- package/dist/transfer-task.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/authoring-tools.md +31 -0
- package/docs/calendar.md +3 -1
- package/docs/catalog-freeze.json +5 -0
- package/docs/chart.md +206 -0
- package/docs/collection-editing.md +83 -0
- package/docs/communication.md +35 -0
- package/docs/data-table.md +56 -6
- package/docs/data-workflows.md +26 -0
- package/docs/generated/component-maturity.md +6 -5
- package/docs/generated/renderer-evidence.json +95 -5
- package/docs/generated/renderer-evidence.md +6 -3
- package/docs/generated/showcase-manifest.json +66 -3
- package/docs/gooey-navigation.md +20 -0
- package/docs/library-gap-analysis.md +4 -2
- package/docs/media-transport.md +37 -0
- package/docs/social-compositions.md +51 -0
- package/docs/streaming-answer.md +57 -0
- package/docs/task-controls.md +38 -0
- package/docs/toggle-feedback.md +56 -0
- package/docs/transfer-task.md +33 -0
- package/docs/usage/README.md +15 -4
- package/docs/usage/components/activity-chip.md +2 -2
- package/docs/usage/components/button.md +39 -0
- package/docs/usage/components/calendar.md +4 -2
- package/docs/usage/components/chart.md +277 -0
- package/docs/usage/components/data-table.md +96 -18
- package/docs/usage/components/screen-layout.md +3 -1
- package/docs/usage/components/search-screen.md +1 -0
- package/docs/usage/components/tabs.md +25 -0
- package/docs/usage/components/toast.md +1 -1
- package/docs/usage/compositions/action-feedback.md +18 -2
- package/docs/usage/compositions/activity-status.md +2 -2
- package/docs/usage/compositions/authoring-tools.md +90 -0
- package/docs/usage/compositions/collection-editing.md +110 -0
- package/docs/usage/compositions/communication.md +100 -0
- package/docs/usage/compositions/data-workflows.md +91 -0
- package/docs/usage/compositions/media-transport.md +87 -0
- package/docs/usage/compositions/social-compositions.md +91 -0
- package/docs/usage/compositions/streaming-answer.md +97 -0
- package/docs/usage/compositions/task-controls.md +93 -0
- package/docs/usage/compositions/toggle-feedback.md +84 -0
- package/docs/usage/compositions/transfer-task.md +86 -0
- package/docs/usage/compositions/web-additions.md +2 -2
- package/docs/usage/screens/common-shell.md +4 -0
- package/package.json +67 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lucian #033/#092/#131/#144/#178 informed these compositions, not their demo state engines.
|
|
3
|
+
* Reuse FieldGroup, ActionSession and controlled table columns; products own data and persistence.
|
|
4
|
+
*/
|
|
5
|
+
export const collectionEditingRecipe = { gap: "md", actionGap: "sm" };
|
|
6
|
+
export function assertDistinctIds(items) {
|
|
7
|
+
const ids = new Set();
|
|
8
|
+
for (const { id } of items) {
|
|
9
|
+
if (!id.trim() || ids.has(id))
|
|
10
|
+
throw new TypeError("Collection editing requires distinct nonempty ids");
|
|
11
|
+
ids.add(id);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** A mutation gets its own immutable scope; a later selection never changes an in-flight request. */
|
|
15
|
+
export function snapshotSelection(ids) {
|
|
16
|
+
assertDistinctIds(ids.map(id => ({ id })));
|
|
17
|
+
return Object.freeze([...ids]);
|
|
18
|
+
}
|
|
19
|
+
/** Focus the next surviving row, then the preceding row, then the add action. */
|
|
20
|
+
export function focusAfterRemoval(ids, removed, disabledIds = []) {
|
|
21
|
+
const index = ids.indexOf(removed);
|
|
22
|
+
if (index < 0)
|
|
23
|
+
return undefined;
|
|
24
|
+
const enabled = (id) => !disabledIds.includes(id);
|
|
25
|
+
return ids.slice(index + 1).find(enabled) ?? ids.slice(0, index).reverse().find(enabled);
|
|
26
|
+
}
|
|
27
|
+
export function recoverableFilters(options) {
|
|
28
|
+
assertDistinctIds(options);
|
|
29
|
+
if (options.some(option => !Number.isSafeInteger(option.resultCount) || option.resultCount < 0)) {
|
|
30
|
+
throw new RangeError("Filter recovery counts must be nonnegative safe integers from product data");
|
|
31
|
+
}
|
|
32
|
+
return options.filter(option => option.resultCount > 0);
|
|
33
|
+
}
|
|
34
|
+
/** Locked columns are barriers: a visibility/order UI must not silently move a fixed column. */
|
|
35
|
+
export function changeColumnSettings(columns, id, action) {
|
|
36
|
+
assertDistinctIds(columns);
|
|
37
|
+
const index = columns.findIndex(column => column.id === id), column = columns[index];
|
|
38
|
+
if (!column || column.locked)
|
|
39
|
+
return columns;
|
|
40
|
+
if (action === "toggle") {
|
|
41
|
+
if (column.visible && columns.filter(item => item.visible).length <= 1)
|
|
42
|
+
return columns;
|
|
43
|
+
return columns.map(item => item.id === id ? { ...item, visible: !item.visible } : item);
|
|
44
|
+
}
|
|
45
|
+
const nextIndex = index + (action === "earlier" ? -1 : 1), neighbor = columns[nextIndex];
|
|
46
|
+
if (!neighbor || neighbor.locked)
|
|
47
|
+
return columns;
|
|
48
|
+
const next = [...columns];
|
|
49
|
+
next[index] = neighbor;
|
|
50
|
+
next[nextIndex] = column;
|
|
51
|
+
return next;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=collection-editing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-editing.js","sourceRoot":"","sources":["../src/collection-editing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lucian #033/#092/#131/#144/#178 informed these compositions, not their demo state engines.\n * Reuse FieldGroup, ActionSession and controlled table columns; products own data and persistence.\n */\nexport const collectionEditingRecipe = { gap: \"md\", actionGap: \"sm\" } as const;\nexport type ColumnSetting = Readonly<{ id: string; label: string; visible: boolean; locked?: boolean }>;\nexport type FilterRecoveryOption = Readonly<{ id: string; label: string; resultCount: number }>;\nexport type SelectionAction = Readonly<{ id: string; label: string; destructive?: boolean }>;\nexport type FocusTarget = { focus(): void };\n\nexport function assertDistinctIds(items: readonly Readonly<{ id: string }>[]): void {\n const ids = new Set<string>();\n for (const { id } of items) {\n if (!id.trim() || ids.has(id)) throw new TypeError(\"Collection editing requires distinct nonempty ids\");\n ids.add(id);\n }\n}\n\n/** A mutation gets its own immutable scope; a later selection never changes an in-flight request. */\nexport function snapshotSelection(ids: readonly string[]): readonly string[] {\n assertDistinctIds(ids.map(id => ({ id })));\n return Object.freeze([...ids]);\n}\n\n/** Focus the next surviving row, then the preceding row, then the add action. */\nexport function focusAfterRemoval(ids: readonly string[], removed: string, disabledIds: readonly string[] = []): string | undefined {\n const index = ids.indexOf(removed);\n if (index < 0) return undefined;\n const enabled = (id: string) => !disabledIds.includes(id);\n return ids.slice(index + 1).find(enabled) ?? ids.slice(0, index).reverse().find(enabled);\n}\n\nexport function recoverableFilters(options: readonly FilterRecoveryOption[]): readonly FilterRecoveryOption[] {\n assertDistinctIds(options);\n if (options.some(option => !Number.isSafeInteger(option.resultCount) || option.resultCount < 0)) {\n throw new RangeError(\"Filter recovery counts must be nonnegative safe integers from product data\");\n }\n return options.filter(option => option.resultCount > 0);\n}\n\n/** Locked columns are barriers: a visibility/order UI must not silently move a fixed column. */\nexport function changeColumnSettings(columns: readonly ColumnSetting[], id: string, action: \"toggle\" | \"earlier\" | \"later\"): readonly ColumnSetting[] {\n assertDistinctIds(columns);\n const index = columns.findIndex(column => column.id === id), column = columns[index];\n if (!column || column.locked) return columns;\n if (action === \"toggle\") {\n if (column.visible && columns.filter(item => item.visible).length <= 1) return columns;\n return columns.map(item => item.id === id ? { ...item, visible: !item.visible } : item);\n }\n const nextIndex = index + (action === \"earlier\" ? -1 : 1), neighbor = columns[nextIndex];\n if (!neighbor || neighbor.locked) return columns;\n const next = [...columns];\n next[index] = neighbor; next[nextIndex] = column;\n return next;\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type ComposerLengthFeedback = Readonly<{
|
|
2
|
+
label: string;
|
|
3
|
+
formatCount: (used: number, max: number) => string;
|
|
4
|
+
threshold?: number;
|
|
5
|
+
}>;
|
|
6
|
+
/** Match the controlled text/maxLength UTF-16 unit; do not silently trim a user's draft. */
|
|
7
|
+
export declare function resolveComposerLimit(value: string, max: number, threshold?: number): {
|
|
8
|
+
used: number;
|
|
9
|
+
max: number;
|
|
10
|
+
near: boolean;
|
|
11
|
+
exceeded: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ReplyTarget = Readonly<{
|
|
14
|
+
id: string;
|
|
15
|
+
author: string;
|
|
16
|
+
excerpt: string;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function validateReplyTarget(target: ReplyTarget | null): void;
|
|
19
|
+
export type SearchResponse<T> = Readonly<{
|
|
20
|
+
result: T;
|
|
21
|
+
suggestions: readonly Readonly<{
|
|
22
|
+
query: string;
|
|
23
|
+
match?: Readonly<{
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
}>;
|
|
27
|
+
}>[];
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=communication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACzI,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK;;;;;EAG9E;AACD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACpF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAC,IAAI,GAAE,IAAI,CAEjE;AACD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,QAAQ,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,SAAS,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,QAAQ,CAAC;YAAC,KAAK,EAAC,MAAM,CAAC;YAAA,GAAG,EAAC,MAAM,CAAA;SAAC,CAAC,CAAA;KAAC,CAAC,EAAE,CAAA;CAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Match the controlled text/maxLength UTF-16 unit; do not silently trim a user's draft. */
|
|
2
|
+
export function resolveComposerLimit(value, max, threshold = .8) {
|
|
3
|
+
if (!Number.isSafeInteger(max) || max <= 0 || !Number.isFinite(threshold) || threshold < 0 || threshold > 1)
|
|
4
|
+
throw new RangeError("Composer limit must be positive and threshold in [0,1]");
|
|
5
|
+
return { used: value.length, max, near: value.length / max >= threshold, exceeded: value.length > max };
|
|
6
|
+
}
|
|
7
|
+
export function validateReplyTarget(target) {
|
|
8
|
+
if (target !== null && !target.id.trim())
|
|
9
|
+
throw new TypeError("Reply target requires the actual message ID");
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=communication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AACA,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,GAAW,EAAE,SAAS,GAAG,EAAE;IAC9E,IAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAE,GAAG,IAAE,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAE,SAAS,GAAC,CAAC,IAAE,SAAS,GAAC,CAAC;QAAC,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAC;IAC5K,OAAO,EAAE,IAAI,EAAC,KAAK,CAAC,MAAM,EAAC,GAAG,EAAC,IAAI,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,IAAE,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC3D,IAAG,MAAM,KAAG,IAAI,IAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAC,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;AACxG,CAAC","sourcesContent":["export type ComposerLengthFeedback = Readonly<{ label: string; formatCount: (used: number, max: number) => string; threshold?: number }>;\n/** Match the controlled text/maxLength UTF-16 unit; do not silently trim a user's draft. */\nexport function resolveComposerLimit(value: string, max: number, threshold = .8) {\n if(!Number.isSafeInteger(max)||max<=0||!Number.isFinite(threshold)||threshold<0||threshold>1)throw new RangeError(\"Composer limit must be positive and threshold in [0,1]\");\n return { used:value.length,max,near:value.length/max>=threshold,exceeded:value.length>max };\n}\nexport type ReplyTarget = Readonly<{ id: string; author: string; excerpt: string }>;\nexport function validateReplyTarget(target: ReplyTarget|null):void {\n if(target!==null&&!target.id.trim())throw new TypeError(\"Reply target requires the actual message ID\");\n}\nexport type SearchResponse<T> = Readonly<{ result: T; suggestions: readonly Readonly<{query: string;match?:Readonly<{start:number;end:number}>}>[] }>;\n"]}
|
|
@@ -80,6 +80,7 @@ export declare const componentIds: {
|
|
|
80
80
|
readonly Statistic: "statistic";
|
|
81
81
|
readonly Timeline: "timeline";
|
|
82
82
|
readonly DataTable: "data-table";
|
|
83
|
+
readonly Chart: "chart";
|
|
83
84
|
readonly Tree: "tree";
|
|
84
85
|
readonly Calendar: "calendar";
|
|
85
86
|
readonly Carousel: "carousel";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-definitions.d.ts","sourceRoot":"","sources":["../src/component-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,IAAI,uBAAuB,EAChD,KAAK,sBAAsB,IAAI,6BAA6B,EAC5D,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAC/E,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACvD,MAAM,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AAEnE,4DAA4D;AAC5D,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"component-definitions.d.ts","sourceRoot":"","sources":["../src/component-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,IAAI,uBAAuB,EAChD,KAAK,sBAAsB,IAAI,6BAA6B,EAC5D,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAC/E,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACvD,MAAM,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AAEnE,4DAA4D;AAC5D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGmC,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC;AAE/D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;QACjB,MAAM,EAAE,eAAe,CAAC;QACxB,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;QAC/B,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;QACnC,OAAO,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;KAC5C,CAAC,CAAC;IACH,QAAQ,EAAE,QAAQ,CAAC;QACjB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,GAAG,EAAE,QAAQ,CAAC;YAAE,MAAM,EAAE,sBAAsB,CAAA;SAAE,CAAC,CAAC;QAClD,MAAM,EAAE,QAAQ,CAAC;YAAE,MAAM,EAAE,sBAAsB,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,EAAE,QAAQ,CAAC;QACb,2GAA2G;QAC3G,OAAO,EAAE,cAAc,WAAW,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC,CAAC;CACJ,CAAC,CAAC;AAeH;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,mBAAmB,EAyB7D,CAAC;AAEH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,WAAW,GAAG,aAAa,GACpC,mBAAmB,GAAG,SAAS,CAIjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-definitions.js","sourceRoot":"","sources":["../src/component-definitions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n componentCatalog,\n getComponentSurfaceStatus,\n type ComponentCatalogEntry,\n type ComponentCategory,\n type ComponentName,\n type ComponentPlatform,\n type ComponentStatus,\n type ComponentSurface as CatalogComponentSurface,\n type ComponentSurfaceStatus as CatalogComponentSurfaceStatus,\n type RecipeName,\n} from \"./catalog.js\";\nimport type { BehaviorName } from \"./behaviors.js\";\n\nexport type ComponentKind = \"primitive\" | \"component\" | \"provider\" | \"utility\";\n/** Kept here as aliases for existing `component-definitions` consumers. */\nexport type ComponentSurface = CatalogComponentSurface;\nexport type ComponentSurfaceStatus = CatalogComponentSurfaceStatus;\n\n/** Stable IDs survive display-name and category changes. */\nexport const componentIds = {\n Text: \"text\",\n TextFormat: \"text-format\",\n Heading: \"heading\",\n Icon: \"icon\",\n Surface: \"surface\",\n Divider: \"divider\",\n Section: \"section\",\n Stack: \"stack\",\n Container: \"container\",\n AspectRatio: \"aspect-ratio\",\n Grid: \"grid\",\n Layout: \"layout\",\n Top: \"top\",\n Masonry: \"masonry\",\n Splitter: \"splitter\",\n Button: \"button\",\n IconButton: \"icon-button\",\n Link: \"link\",\n BottomCTA: \"bottom-cta\",\n FloatingActionButton: \"floating-action-button\",\n AuthProviderButton: \"auth-provider-button\",\n AuthScreenLayout: \"auth-screen\",\n Field: \"field\",\n SearchField: \"search-field\",\n TextArea: \"text-area\",\n PasswordField: \"password-field\",\n OtpField: \"otp-field\",\n Checkbox: \"checkbox\",\n Radio: \"radio\",\n CheckboxGroup: \"checkbox-group\",\n RadioGroup: \"radio-group\",\n Switch: \"switch\",\n Chip: \"chip\",\n SegmentedControl: \"segmented-control\",\n ToggleGroup: \"toggle-group\",\n TagsInput: \"tags-input\",\n Slider: \"slider\",\n NumberField: \"number-field\",\n Select: \"select\",\n Combobox: \"combobox\",\n DatePicker: \"date-picker\",\n DateRangePicker: \"date-range-picker\",\n ColorPicker: \"color-picker\",\n FilePicker: \"file-picker\",\n Form: \"form\",\n Agreement: \"agreement\",\n Mentions: \"mentions\",\n TransferList: \"transfer-list\",\n UploadItem: \"upload-item\",\n Tabs: \"tabs\",\n TopBar: \"top-bar\",\n Sidebar: \"sidebar\",\n BottomNavigation: \"bottom-navigation\",\n Breadcrumb: \"breadcrumb\",\n Pagination: \"pagination\",\n LoadMore: \"load-more\",\n Steps: \"steps\",\n Menubar: \"menubar\",\n ContextMenu: \"context-menu\",\n Menu: \"menu\",\n Anchor: \"anchor\",\n Avatar: \"avatar\",\n Badge: \"badge\",\n CounterBadge: \"counter-badge\",\n Card: \"card\",\n List: \"list\",\n ListRow: \"list-row\",\n VirtualList: \"virtual-list\",\n Collapsible: \"collapsible\",\n Asset: \"asset\",\n Accordion: \"accordion\",\n Statistic: \"statistic\",\n Timeline: \"timeline\",\n DataTable: \"data-table\",\n Tree: \"tree\",\n Calendar: \"calendar\",\n Carousel: \"carousel\",\n DescriptionList: \"description-list\",\n Image: \"image\",\n QRCode: \"qr-code\",\n Tag: \"tag\",\n Tour: \"tour\",\n EmptyState: \"empty-state\",\n Notice: \"notice\",\n Progress: \"progress\",\n ThinkingOrb: \"thinking-orb\",\n Spinner: \"spinner\",\n Skeleton: \"skeleton\",\n Result: \"result\",\n BottomInfo: \"bottom-info\",\n Toast: \"toast\",\n Watermark: \"watermark\",\n Dialog: \"dialog\",\n AlertDialog: \"alert-dialog\",\n Sheet: \"sheet\",\n SidePanel: \"side-panel\",\n Popover: \"popover\",\n Tooltip: \"tooltip\",\n CommandPalette: \"command-palette\",\n Affix: \"affix\",\n DesignSystemProvider: \"design-system-provider\",\n SkipNav: \"skip-nav\",\n VisuallyHidden: \"visually-hidden\",\n} as const satisfies Readonly<Record<ComponentName, string>>;\n\nexport type ComponentId = (typeof componentIds)[ComponentName];\n\nexport type ComponentDefinition = Readonly<{\n id: ComponentId;\n name: ComponentName;\n category: ComponentCategory;\n kind: ComponentKind;\n contract: Readonly<{\n status: ComponentStatus;\n recipes: readonly RecipeName[];\n behaviors: readonly BehaviorName[];\n roadmap?: ComponentCatalogEntry[\"roadmap\"];\n }>;\n surfaces: Readonly<{\n parity: ComponentPlatform;\n web: Readonly<{ status: ComponentSurfaceStatus }>;\n native: Readonly<{ status: ComponentSurfaceStatus }>;\n }>;\n docs: Readonly<{\n /** Stable documentation key; aliases are catalog search terms, not alternate component implementations. */\n storyId: `components/${ComponentId}`;\n aliases: readonly string[];\n }>;\n}>;\n\nconst kindByCategory: Readonly<Record<ComponentCategory, ComponentKind>> = {\n foundation: \"primitive\",\n layout: \"primitive\",\n action: \"component\",\n input: \"component\",\n navigation: \"component\",\n \"data-display\": \"component\",\n feedback: \"component\",\n overlay: \"component\",\n provider: \"provider\",\n utility: \"utility\",\n};\n\n/**\n * Normalized catalog view. Consumers should prefer this shape so a component can evolve to multiple recipes,\n * behaviors, and different Web/Native maturity without another API rewrite.\n */\nexport const componentDefinitions: readonly ComponentDefinition[] = componentCatalog.map((rawEntry) => {\n const entry: ComponentCatalogEntry = rawEntry;\n const name = entry.name as ComponentName;\n const id = componentIds[name];\n return {\n id,\n name,\n category: entry.category,\n kind: kindByCategory[entry.category],\n contract: {\n status: entry.status,\n recipes: entry.recipe ? [entry.recipe] : [],\n behaviors: entry.behavior ? [entry.behavior] : [],\n roadmap: entry.roadmap,\n },\n surfaces: {\n parity: entry.platform,\n web: { status: getComponentSurfaceStatus(entry, \"web\") },\n native: { status: getComponentSurfaceStatus(entry, \"native\") },\n },\n docs: {\n storyId: `components/${id}`,\n aliases: entry.aliases ?? [],\n },\n };\n});\n\nexport function getComponentDefinition(\n idOrName: ComponentId | ComponentName,\n): ComponentDefinition | undefined {\n return componentDefinitions.find(\n (definition) => definition.id === idOrName || definition.name === idOrName,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"component-definitions.js","sourceRoot":"","sources":["../src/component-definitions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n componentCatalog,\n getComponentSurfaceStatus,\n type ComponentCatalogEntry,\n type ComponentCategory,\n type ComponentName,\n type ComponentPlatform,\n type ComponentStatus,\n type ComponentSurface as CatalogComponentSurface,\n type ComponentSurfaceStatus as CatalogComponentSurfaceStatus,\n type RecipeName,\n} from \"./catalog.js\";\nimport type { BehaviorName } from \"./behaviors.js\";\n\nexport type ComponentKind = \"primitive\" | \"component\" | \"provider\" | \"utility\";\n/** Kept here as aliases for existing `component-definitions` consumers. */\nexport type ComponentSurface = CatalogComponentSurface;\nexport type ComponentSurfaceStatus = CatalogComponentSurfaceStatus;\n\n/** Stable IDs survive display-name and category changes. */\nexport const componentIds = {\n Text: \"text\",\n TextFormat: \"text-format\",\n Heading: \"heading\",\n Icon: \"icon\",\n Surface: \"surface\",\n Divider: \"divider\",\n Section: \"section\",\n Stack: \"stack\",\n Container: \"container\",\n AspectRatio: \"aspect-ratio\",\n Grid: \"grid\",\n Layout: \"layout\",\n Top: \"top\",\n Masonry: \"masonry\",\n Splitter: \"splitter\",\n Button: \"button\",\n IconButton: \"icon-button\",\n Link: \"link\",\n BottomCTA: \"bottom-cta\",\n FloatingActionButton: \"floating-action-button\",\n AuthProviderButton: \"auth-provider-button\",\n AuthScreenLayout: \"auth-screen\",\n Field: \"field\",\n SearchField: \"search-field\",\n TextArea: \"text-area\",\n PasswordField: \"password-field\",\n OtpField: \"otp-field\",\n Checkbox: \"checkbox\",\n Radio: \"radio\",\n CheckboxGroup: \"checkbox-group\",\n RadioGroup: \"radio-group\",\n Switch: \"switch\",\n Chip: \"chip\",\n SegmentedControl: \"segmented-control\",\n ToggleGroup: \"toggle-group\",\n TagsInput: \"tags-input\",\n Slider: \"slider\",\n NumberField: \"number-field\",\n Select: \"select\",\n Combobox: \"combobox\",\n DatePicker: \"date-picker\",\n DateRangePicker: \"date-range-picker\",\n ColorPicker: \"color-picker\",\n FilePicker: \"file-picker\",\n Form: \"form\",\n Agreement: \"agreement\",\n Mentions: \"mentions\",\n TransferList: \"transfer-list\",\n UploadItem: \"upload-item\",\n Tabs: \"tabs\",\n TopBar: \"top-bar\",\n Sidebar: \"sidebar\",\n BottomNavigation: \"bottom-navigation\",\n Breadcrumb: \"breadcrumb\",\n Pagination: \"pagination\",\n LoadMore: \"load-more\",\n Steps: \"steps\",\n Menubar: \"menubar\",\n ContextMenu: \"context-menu\",\n Menu: \"menu\",\n Anchor: \"anchor\",\n Avatar: \"avatar\",\n Badge: \"badge\",\n CounterBadge: \"counter-badge\",\n Card: \"card\",\n List: \"list\",\n ListRow: \"list-row\",\n VirtualList: \"virtual-list\",\n Collapsible: \"collapsible\",\n Asset: \"asset\",\n Accordion: \"accordion\",\n Statistic: \"statistic\",\n Timeline: \"timeline\",\n DataTable: \"data-table\",\n Chart: \"chart\",\n Tree: \"tree\",\n Calendar: \"calendar\",\n Carousel: \"carousel\",\n DescriptionList: \"description-list\",\n Image: \"image\",\n QRCode: \"qr-code\",\n Tag: \"tag\",\n Tour: \"tour\",\n EmptyState: \"empty-state\",\n Notice: \"notice\",\n Progress: \"progress\",\n ThinkingOrb: \"thinking-orb\",\n Spinner: \"spinner\",\n Skeleton: \"skeleton\",\n Result: \"result\",\n BottomInfo: \"bottom-info\",\n Toast: \"toast\",\n Watermark: \"watermark\",\n Dialog: \"dialog\",\n AlertDialog: \"alert-dialog\",\n Sheet: \"sheet\",\n SidePanel: \"side-panel\",\n Popover: \"popover\",\n Tooltip: \"tooltip\",\n CommandPalette: \"command-palette\",\n Affix: \"affix\",\n DesignSystemProvider: \"design-system-provider\",\n SkipNav: \"skip-nav\",\n VisuallyHidden: \"visually-hidden\",\n} as const satisfies Readonly<Record<ComponentName, string>>;\n\nexport type ComponentId = (typeof componentIds)[ComponentName];\n\nexport type ComponentDefinition = Readonly<{\n id: ComponentId;\n name: ComponentName;\n category: ComponentCategory;\n kind: ComponentKind;\n contract: Readonly<{\n status: ComponentStatus;\n recipes: readonly RecipeName[];\n behaviors: readonly BehaviorName[];\n roadmap?: ComponentCatalogEntry[\"roadmap\"];\n }>;\n surfaces: Readonly<{\n parity: ComponentPlatform;\n web: Readonly<{ status: ComponentSurfaceStatus }>;\n native: Readonly<{ status: ComponentSurfaceStatus }>;\n }>;\n docs: Readonly<{\n /** Stable documentation key; aliases are catalog search terms, not alternate component implementations. */\n storyId: `components/${ComponentId}`;\n aliases: readonly string[];\n }>;\n}>;\n\nconst kindByCategory: Readonly<Record<ComponentCategory, ComponentKind>> = {\n foundation: \"primitive\",\n layout: \"primitive\",\n action: \"component\",\n input: \"component\",\n navigation: \"component\",\n \"data-display\": \"component\",\n feedback: \"component\",\n overlay: \"component\",\n provider: \"provider\",\n utility: \"utility\",\n};\n\n/**\n * Normalized catalog view. Consumers should prefer this shape so a component can evolve to multiple recipes,\n * behaviors, and different Web/Native maturity without another API rewrite.\n */\nexport const componentDefinitions: readonly ComponentDefinition[] = componentCatalog.map((rawEntry) => {\n const entry: ComponentCatalogEntry = rawEntry;\n const name = entry.name as ComponentName;\n const id = componentIds[name];\n return {\n id,\n name,\n category: entry.category,\n kind: kindByCategory[entry.category],\n contract: {\n status: entry.status,\n recipes: entry.recipe ? [entry.recipe] : [],\n behaviors: entry.behavior ? [entry.behavior] : [],\n roadmap: entry.roadmap,\n },\n surfaces: {\n parity: entry.platform,\n web: { status: getComponentSurfaceStatus(entry, \"web\") },\n native: { status: getComponentSurfaceStatus(entry, \"native\") },\n },\n docs: {\n storyId: `components/${id}`,\n aliases: entry.aliases ?? [],\n },\n };\n});\n\nexport function getComponentDefinition(\n idOrName: ComponentId | ComponentName,\n): ComponentDefinition | undefined {\n return componentDefinitions.find(\n (definition) => definition.id === idOrName || definition.name === idOrName,\n );\n}\n"]}
|
package/dist/data-table.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AsyncCollectionState, CheckboxState, CollectionKey, CollectionSelectionModel } from "./behaviors.js";
|
|
2
|
+
import { type TextVariant } from "./foundations.js";
|
|
2
3
|
export type DataTableAlign = "start" | "center" | "end";
|
|
3
4
|
export type DataTableColumnDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{
|
|
4
5
|
id: Key;
|
|
@@ -8,6 +9,16 @@ export type DataTableColumnDescriptor<Key extends CollectionKey = CollectionKey>
|
|
|
8
9
|
sortable?: boolean;
|
|
9
10
|
/** Layout hint only (px or flex-basis); renderers may ignore or clamp it. */
|
|
10
11
|
width?: number;
|
|
12
|
+
/**
|
|
13
|
+
* First press sorts descending (TanStack Table `sortDescFirst`). Stat tables read "highest first";
|
|
14
|
+
* lower-is-better columns (ERA, rank) leave it false. Added 2026-10-14 with the Native renderer.
|
|
15
|
+
*/
|
|
16
|
+
sortDescFirst?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Keeps the column visible while the others scroll horizontally (AG Grid / TanStack column
|
|
19
|
+
* pinning, start edge only). Only a leading run of pinned columns is honored.
|
|
20
|
+
*/
|
|
21
|
+
pinned?: "start";
|
|
11
22
|
}>;
|
|
12
23
|
export declare const dataTableColumnDefaults: {
|
|
13
24
|
readonly align: "start";
|
|
@@ -24,6 +35,8 @@ export declare function validateDataTableColumns<Key extends CollectionKey>(colu
|
|
|
24
35
|
export type DataTableRowDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{
|
|
25
36
|
id: Key;
|
|
26
37
|
disabled?: boolean;
|
|
38
|
+
/** Sub-row nesting (TanStack `depth`): 1 indents a substitute under a starter. 0–3. */
|
|
39
|
+
depth?: number;
|
|
27
40
|
}>;
|
|
28
41
|
export declare function validateDataTableRows<Key extends CollectionKey>(rows: readonly DataTableRowDescriptor<Key>[]): void;
|
|
29
42
|
/** Row selection is the unmodified Collection base contract — no DataTable-only selection shape. */
|
|
@@ -56,7 +69,34 @@ export declare function validateDataTableSortState<Key extends CollectionKey>(st
|
|
|
56
69
|
* actually re-sorting rows (Combobox's local/external filtering split is the
|
|
57
70
|
* same boundary — HJM judges intent, never executes the data operation).
|
|
58
71
|
*/
|
|
59
|
-
export declare function getNextDataTableSortState<Key extends CollectionKey>(current: DataTableSortState<Key>, columnId: Key, cycle?: DataTableSortCycle): DataTableSortState<Key>;
|
|
72
|
+
export declare function getNextDataTableSortState<Key extends CollectionKey>(current: DataTableSortState<Key>, columnId: Key, cycle?: DataTableSortCycle, firstDirection?: DataTableSortDirection): DataTableSortState<Key>;
|
|
73
|
+
/** The first direction a column's header applies, from `sortDescFirst`. */
|
|
74
|
+
export declare function dataTableFirstSortDirection(column: Pick<DataTableColumnDescriptor, "sortDescFirst">): DataTableSortDirection;
|
|
75
|
+
export type DataTableSortValue = number | string | null | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Sort key for a displayed cell string: "0.340", ".340", "36 ⅓", "13.5억", "61.0%" → numbers;
|
|
78
|
+
* text such as "7승0무3패" or names stay strings; "—", "-" and "" are missing.
|
|
79
|
+
*/
|
|
80
|
+
export declare function toDataTableSortValue(value: unknown): DataTableSortValue;
|
|
81
|
+
/**
|
|
82
|
+
* Pure comparison: numbers numerically, strings with `localeCompare`, numbers before strings.
|
|
83
|
+
* Missing values are not compared here; `sortDataTableRows` always sinks them.
|
|
84
|
+
*/
|
|
85
|
+
export declare function compareDataTableValues(a: Exclude<DataTableSortValue, null | undefined>, b: Exclude<DataTableSortValue, null | undefined>, locale?: string): number;
|
|
86
|
+
/**
|
|
87
|
+
* Optional row-model helper (TanStack `getSortedRowModel` with `sortUndefined: "last"`): stable,
|
|
88
|
+
* missing values always last in both directions. 1.20 left all sorting to products; Yajalal and
|
|
89
|
+
* other stat tables reimplemented the same rules, so the shared helper exists now. Products with
|
|
90
|
+
* server-side sorting keep calling `getNextDataTableSortState` only.
|
|
91
|
+
*/
|
|
92
|
+
export declare function sortDataTableRows<Row, Key extends CollectionKey>(rows: readonly Row[], sort: DataTableSortState<Key>, getValue: (row: Row, columnId: Key) => DataTableSortValue, options?: Readonly<{
|
|
93
|
+
locale?: string;
|
|
94
|
+
}>): Row[];
|
|
95
|
+
/** Leading pinned columns (only an unbroken run from the start is pinned). */
|
|
96
|
+
export declare function splitPinnedDataTableColumns<Column extends Pick<DataTableColumnDescriptor, "pinned">>(columns: readonly Column[]): Readonly<{
|
|
97
|
+
pinned: readonly Column[];
|
|
98
|
+
scrolling: readonly Column[];
|
|
99
|
+
}>;
|
|
60
100
|
/** The whole table's row-loading status — the unmodified Collection base async contract. */
|
|
61
101
|
export type DataTableAsyncState = AsyncCollectionState;
|
|
62
102
|
export type DataTableDensity = "compact" | "regular";
|
|
@@ -168,6 +208,7 @@ export declare const dataTableRecipe: {
|
|
|
168
208
|
};
|
|
169
209
|
};
|
|
170
210
|
};
|
|
211
|
+
export declare const dataTableFamilyScenarios: readonly ["header-groups-span-contiguous-leaf-columns-and-pad-ungrouped-columns", "row-groups-insert-a-section-label-before-their-rows", "cell-tone-and-heat-are-product-decided-semantic-emphasis", "percentile-rank-flips-for-lower-is-better-stats-and-ties-take-the-midpoint", "bounded-height-tables-keep-the-header-fixed-while-the-body-scrolls", "line-score-pads-to-nine-periods-and-extends-for-extra-periods", "matrix-diagonal-is-a-blank-self-cell", "comparison-bars-favor-the-better-side-even-when-lower-is-better"];
|
|
171
212
|
/**
|
|
172
213
|
* No roving-tabindex grid keyboard navigation (arrow keys between cells):
|
|
173
214
|
* no product using this contract has measured demand for full ARIA-grid
|
|
@@ -194,10 +235,193 @@ export declare const dataTableBehavior: {
|
|
|
194
235
|
readonly focus: "native";
|
|
195
236
|
};
|
|
196
237
|
readonly native: {
|
|
197
|
-
readonly roles: readonly [];
|
|
198
|
-
readonly states: readonly [];
|
|
199
|
-
readonly actions: readonly [];
|
|
238
|
+
readonly roles: readonly ["button", "header"];
|
|
239
|
+
readonly states: readonly ["selected"];
|
|
240
|
+
readonly actions: readonly ["activate"];
|
|
200
241
|
};
|
|
201
|
-
readonly scenarios: readonly ["row-selection-reuses-the-shared-collection-selection-model-unchanged", "select-all-reuses-the-shared-tri-state-checkbox-value", "async-state-reuses-the-shared-collection-async-state-unchanged", "sortable-header-is-a-button-inside-the-columnheader-not-the-header-itself", "sort-direction-values-pass-through-to-aria-sort-without-translation", "disabled-rows-are-excluded-from-select-all-accounting", "pagination-or-load-more-is-composed-beneath-the-table-not-owned-by-it", "row-expansion-is-not-owned-here-compose-the-disclosure-group-contract-per-row", "a-data-cell-exposes-at-most-one-focusable-control", "no-roving-tabindex-grid-navigation-is-implied"];
|
|
242
|
+
readonly scenarios: readonly ["sort-desc-first-columns-start-descending-and-cycle-back", "missing-values-sink-to-the-bottom-in-both-directions", "pinned-start-columns-stay-visible-while-the-rest-scrolls", "row-selection-reuses-the-shared-collection-selection-model-unchanged", "select-all-reuses-the-shared-tri-state-checkbox-value", "async-state-reuses-the-shared-collection-async-state-unchanged", "sortable-header-is-a-button-inside-the-columnheader-not-the-header-itself", "sort-direction-values-pass-through-to-aria-sort-without-translation", "disabled-rows-are-excluded-from-select-all-accounting", "pagination-or-load-more-is-composed-beneath-the-table-not-owned-by-it", "row-expansion-is-not-owned-here-compose-the-disclosure-group-contract-per-row", "a-data-cell-exposes-at-most-one-focusable-control", "no-roving-tabindex-grid-navigation-is-implied", "header-groups-span-contiguous-leaf-columns-and-pad-ungrouped-columns", "row-groups-insert-a-section-label-before-their-rows", "cell-tone-and-heat-are-product-decided-semantic-emphasis", "percentile-rank-flips-for-lower-is-better-stats-and-ties-take-the-midpoint", "bounded-height-tables-keep-the-header-fixed-while-the-body-scrolls", "line-score-pads-to-nine-periods-and-extends-for-extra-periods", "matrix-diagonal-is-a-blank-self-cell", "comparison-bars-favor-the-better-side-even-when-lower-is-better"];
|
|
202
243
|
};
|
|
244
|
+
/** One header band above leaf columns. Columns not listed in any group get an empty placeholder cell. */
|
|
245
|
+
export type DataTableColumnGroup<Key extends CollectionKey = CollectionKey> = Readonly<{
|
|
246
|
+
id: string;
|
|
247
|
+
header: string;
|
|
248
|
+
columns: readonly Key[];
|
|
249
|
+
}>;
|
|
250
|
+
export type DataTableHeaderBand = Readonly<{
|
|
251
|
+
id: string;
|
|
252
|
+
header: string | null;
|
|
253
|
+
span: number;
|
|
254
|
+
columnIds: readonly string[];
|
|
255
|
+
}>;
|
|
256
|
+
/**
|
|
257
|
+
* Resolves group bands over the given (already pinned-split) column order. A group must cover a
|
|
258
|
+
* contiguous run; columns outside every group become placeholder bands so leaf widths still line up.
|
|
259
|
+
*/
|
|
260
|
+
export declare function resolveDataTableHeaderBands<Key extends CollectionKey>(columns: readonly Pick<DataTableColumnDescriptor<Key>, "id">[], groups: readonly DataTableColumnGroup<Key>[]): DataTableHeaderBand[];
|
|
261
|
+
/** Labeled row section (e.g. 선발 / 교체, 동부 / 서부). Rows not in any group render first, ungrouped. */
|
|
262
|
+
export type DataTableRowGroup<Key extends CollectionKey = CollectionKey> = Readonly<{
|
|
263
|
+
id: string;
|
|
264
|
+
label: string;
|
|
265
|
+
rows: readonly Key[];
|
|
266
|
+
}>;
|
|
267
|
+
export type DataTableBodyItem<Key extends CollectionKey = CollectionKey> = Readonly<{
|
|
268
|
+
kind: "group";
|
|
269
|
+
id: string;
|
|
270
|
+
label: string;
|
|
271
|
+
}> | Readonly<{
|
|
272
|
+
kind: "row";
|
|
273
|
+
id: Key;
|
|
274
|
+
}>;
|
|
275
|
+
/** Flattens rows + groups into the body order renderers draw. Unknown or duplicated ids throw. */
|
|
276
|
+
export declare function resolveDataTableBody<Key extends CollectionKey>(rows: readonly DataTableRowDescriptor<Key>[], groups?: readonly DataTableRowGroup<Key>[]): DataTableBodyItem<Key>[];
|
|
277
|
+
/**
|
|
278
|
+
* Semantic cell emphasis, decided by the product per cell (AG Grid cellClassRules):
|
|
279
|
+
* `leader` marks a league/table best, `positive`/`negative` a direction, `muted` a non-qualifying value.
|
|
280
|
+
*/
|
|
281
|
+
export type DataTableCellTone = "leader" | "positive" | "negative" | "muted";
|
|
282
|
+
/** Percentile heat (Savant): `high` side toward the best values, `low` toward the worst; strength 1–3. */
|
|
283
|
+
export type DataTableCellHeat = Readonly<{
|
|
284
|
+
side: "high" | "low";
|
|
285
|
+
strength: 1 | 2 | 3;
|
|
286
|
+
}>;
|
|
287
|
+
/**
|
|
288
|
+
* Percentile rank (0–100, best = 100) of `value` among `sample`. `lowerIsBetter` flips ERA-style stats.
|
|
289
|
+
* Ties take the midpoint rank, missing values return null. A one-value sample is the 50th percentile.
|
|
290
|
+
*/
|
|
291
|
+
export declare function percentileRank(value: number | null | undefined, sample: readonly (number | null | undefined)[], options?: Readonly<{
|
|
292
|
+
lowerIsBetter?: boolean;
|
|
293
|
+
}>): number | null;
|
|
294
|
+
/** Maps a percentile to heat: ≥90/≥75/≥60 high, ≤10/≤25/≤40 low, the middle stays neutral (null). */
|
|
295
|
+
export declare function percentileHeat(percentile: number | null): DataTableCellHeat | null;
|
|
296
|
+
export declare const dataTableFamilyRecipe: {
|
|
297
|
+
/** Heat background alpha per strength, over the high/low base colors. */
|
|
298
|
+
readonly heatAlpha: {
|
|
299
|
+
readonly 1: 0.14;
|
|
300
|
+
readonly 2: 0.26;
|
|
301
|
+
readonly 3: 0.42;
|
|
302
|
+
};
|
|
303
|
+
readonly heat: {
|
|
304
|
+
readonly high: Readonly<{
|
|
305
|
+
source: "theme";
|
|
306
|
+
key: "danger";
|
|
307
|
+
alpha?: number;
|
|
308
|
+
}>;
|
|
309
|
+
readonly low: Readonly<{
|
|
310
|
+
source: "accent";
|
|
311
|
+
key: "info";
|
|
312
|
+
alpha?: number;
|
|
313
|
+
}>;
|
|
314
|
+
};
|
|
315
|
+
readonly tone: {
|
|
316
|
+
readonly leader: {
|
|
317
|
+
readonly color: Readonly<{
|
|
318
|
+
source: "theme";
|
|
319
|
+
key: "text";
|
|
320
|
+
alpha?: number;
|
|
321
|
+
}>;
|
|
322
|
+
readonly fontWeight: "700";
|
|
323
|
+
};
|
|
324
|
+
readonly positive: {
|
|
325
|
+
readonly color: Readonly<{
|
|
326
|
+
source: "theme";
|
|
327
|
+
key: "danger";
|
|
328
|
+
alpha?: number;
|
|
329
|
+
}>;
|
|
330
|
+
readonly fontWeight: "700";
|
|
331
|
+
};
|
|
332
|
+
readonly negative: {
|
|
333
|
+
readonly color: Readonly<{
|
|
334
|
+
source: "accent";
|
|
335
|
+
key: "info";
|
|
336
|
+
alpha?: number;
|
|
337
|
+
}>;
|
|
338
|
+
readonly fontWeight: "700";
|
|
339
|
+
};
|
|
340
|
+
readonly muted: {
|
|
341
|
+
readonly color: Readonly<{
|
|
342
|
+
source: "theme";
|
|
343
|
+
key: "textSub";
|
|
344
|
+
alpha?: number;
|
|
345
|
+
}>;
|
|
346
|
+
readonly fontWeight: "400";
|
|
347
|
+
};
|
|
348
|
+
};
|
|
349
|
+
readonly groupRow: {
|
|
350
|
+
readonly background: Readonly<{
|
|
351
|
+
source: "theme";
|
|
352
|
+
key: "surfaceAlt";
|
|
353
|
+
alpha?: number;
|
|
354
|
+
}>;
|
|
355
|
+
readonly color: Readonly<{
|
|
356
|
+
source: "theme";
|
|
357
|
+
key: "textMuted";
|
|
358
|
+
alpha?: number;
|
|
359
|
+
}>;
|
|
360
|
+
readonly textVariant: TextVariant;
|
|
361
|
+
};
|
|
362
|
+
/** Indent per sub-row depth level (substitutes under a starter, players under a team). */
|
|
363
|
+
readonly depthIndent: 16;
|
|
364
|
+
readonly headerBand: {
|
|
365
|
+
readonly color: Readonly<{
|
|
366
|
+
source: "theme";
|
|
367
|
+
key: "textMuted";
|
|
368
|
+
alpha?: number;
|
|
369
|
+
}>;
|
|
370
|
+
readonly borderBottom: Readonly<{
|
|
371
|
+
source: "theme";
|
|
372
|
+
key: "border";
|
|
373
|
+
alpha?: number;
|
|
374
|
+
}>;
|
|
375
|
+
};
|
|
376
|
+
};
|
|
377
|
+
export type LineScoreTeam = Readonly<{
|
|
378
|
+
id: string;
|
|
379
|
+
name: string;
|
|
380
|
+
/** Runs per period; null = not played yet, "X" = home team did not bat in the last inning. */
|
|
381
|
+
periods: readonly (number | "X" | null)[];
|
|
382
|
+
/** Totals in display order, e.g. { R: 5, H: 9, E: 0, B: 4 }. */
|
|
383
|
+
totals: Readonly<Record<string, number | null>>;
|
|
384
|
+
}>;
|
|
385
|
+
export type LineScoreColumn = Readonly<{
|
|
386
|
+
id: string;
|
|
387
|
+
header: string;
|
|
388
|
+
kind: "period" | "total";
|
|
389
|
+
}>;
|
|
390
|
+
/**
|
|
391
|
+
* Period columns are padded to `minPeriods` (9 innings) and extend for extra innings; totals follow.
|
|
392
|
+
* The current period (live game) is reported so renderers can highlight it.
|
|
393
|
+
*/
|
|
394
|
+
export declare function resolveLineScore(teams: readonly LineScoreTeam[], options: Readonly<{
|
|
395
|
+
minPeriods?: number;
|
|
396
|
+
totals: readonly string[];
|
|
397
|
+
currentPeriod?: number | null;
|
|
398
|
+
}>): Readonly<{
|
|
399
|
+
columns: LineScoreColumn[];
|
|
400
|
+
currentPeriod: number | null;
|
|
401
|
+
leaderId: string | null;
|
|
402
|
+
}>;
|
|
403
|
+
export declare function formatLineScoreCell(value: number | "X" | null | undefined): string;
|
|
404
|
+
export type MatrixCell = Readonly<{
|
|
405
|
+
label: string;
|
|
406
|
+
tone?: DataTableCellTone | null;
|
|
407
|
+
heat?: DataTableCellHeat | null;
|
|
408
|
+
}>;
|
|
409
|
+
/**
|
|
410
|
+
* Square cross table (team × team head-to-head). Rows and columns share one id list; the diagonal is
|
|
411
|
+
* a self cell and renders blank. `getCell(row, column)` returns null for no record.
|
|
412
|
+
*/
|
|
413
|
+
export declare function resolveMatrix<Key extends string>(ids: readonly Key[], getCell: (row: Key, column: Key) => MatrixCell | null): readonly (readonly (MatrixCell | "self" | null)[])[];
|
|
414
|
+
export type ComparisonRow = Readonly<{
|
|
415
|
+
id: string;
|
|
416
|
+
label: string;
|
|
417
|
+
values: readonly [number | null, number | null];
|
|
418
|
+
/** Display strings; defaults to String(value). */
|
|
419
|
+
display?: readonly [string, string];
|
|
420
|
+
lowerIsBetter?: boolean;
|
|
421
|
+
}>;
|
|
422
|
+
/** Which side wins a row (null on ties/missing), and each side's bar share of the pair (0–1). */
|
|
423
|
+
export declare function resolveComparisonRow(row: ComparisonRow): Readonly<{
|
|
424
|
+
winner: 0 | 1 | null;
|
|
425
|
+
shares: readonly [number, number];
|
|
426
|
+
}>;
|
|
203
427
|
//# sourceMappingURL=data-table.d.ts.map
|
package/dist/data-table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAEpB,aAAa,EACb,aAAa,EACb,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAEpB,aAAa,EACb,aAAa,EACb,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAsD,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGxG,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,yBAAyB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IAC1F,EAAE,EAAE,GAAG,CAAC;IACR,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;CAGuC,CAAC;AAQ5E,wBAAgB,wBAAwB,CAAC,GAAG,SAAS,aAAa,EAChE,OAAO,EAAE,SAAS,yBAAyB,CAAC,GAAG,CAAC,EAAE,GACjD,IAAI,CAgBN;AAED;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IACvF,EAAE,EAAE,GAAG,CAAC;IACR,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,aAAa,EAC7D,IAAI,EAAE,SAAS,sBAAsB,CAAC,GAAG,CAAC,EAAE,GAC3C,IAAI,CAYN;AAED,oGAAoG;AACpG,MAAM,MAAM,kBAAkB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IACtE,wBAAwB,CAAC,GAAG,CAAC,CAAC;AAEhC;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,SAAS,aAAa,EACtE,IAAI,EAAE,SAAS,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAC5C,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,GAC7B,aAAa,CAOf;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,CAAC;AAEhE,MAAM,MAAM,kBAAkB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IACnF,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,sBAAsB,CAAC;CACnC,CAAC,GAAG,IAAI,CAAC;AAEV,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,aAAa,CAAC;AAE7D,eAAO,MAAM,iBAAiB;;CAEkC,CAAC;AAEjE,wBAAgB,0BAA0B,CAAC,GAAG,SAAS,aAAa,EAClE,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAC9B,OAAO,EAAE,SAAS,yBAAyB,CAAC,GAAG,CAAC,EAAE,GACjD,IAAI,CAYN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,SAAS,aAAa,EACjE,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAChC,QAAQ,EAAE,GAAG,EACb,KAAK,GAAE,kBAAgD,EACvD,cAAc,GAAE,sBAAoC,GACnD,kBAAkB,CAAC,GAAG,CAAC,CASzB;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,EAAE,eAAe,CAAC,GAAG,sBAAsB,CAE5H;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CASvE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,IAAI,GAAG,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlK;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,SAAS,aAAa,EAC9D,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAC7B,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,kBAAkB,EACzD,OAAO,GAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAM,GAC1C,GAAG,EAAE,CAUP;AAED,8EAA8E;AAC9E,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAIvM;AAED,4FAA4F;AAC5F,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF3B,CAAC;AAEF,eAAO,MAAM,wBAAwB,sgBAS3B,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CAgCO,CAAC;AActC,yGAAyG;AACzG,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAE9H;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,SAAS,aAAa,EACnE,OAAO,EAAE,SAAS,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAC9D,MAAM,EAAE,SAAS,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAC3C,mBAAmB,EAAE,CAmBvB;AAED,kGAAkG;AAClG,MAAM,MAAM,iBAAiB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,CAAC,GAAG,SAAS,aAAa,GAAG,aAAa,IACnE,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GACtD,QAAQ,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,GAAG,CAAA;CAAE,CAAC,CAAC;AAEvC,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,aAAa,EAC5D,IAAI,EAAE,SAAS,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAC5C,MAAM,GAAE,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAO,GAC7C,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAiB1B;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE7E,0GAA0G;AAC1G,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC,CAAC;AAExF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,GAAE,QAAQ,CAAC;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAM,GAAG,MAAM,GAAG,IAAI,CAWnL;AAED,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CASlF;AAED,eAAO,MAAM,qBAAqB;IAChC,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAS+C,WAAW;;IACnI,0FAA0F;;;;;;;;;;;;;;CAGlF,CAAC;AAIX,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;IAC1C,gEAAgE;IAChE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAsBvQ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAElF;AAID,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAEvH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAGlL;AAID,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAChD,kDAAkD;IAClD,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,CAAC;AAEH,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAO9H"}
|