@hjmds/design-contracts 1.41.2 → 1.43.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/affix.d.ts +18 -0
- package/dist/affix.d.ts.map +1 -1
- package/dist/affix.js +13 -1
- package/dist/affix.js.map +1 -1
- package/dist/alert-dialog.d.ts +32 -0
- package/dist/alert-dialog.d.ts.map +1 -1
- package/dist/alert-dialog.js +52 -0
- package/dist/alert-dialog.js.map +1 -1
- package/dist/behaviors.d.ts +6 -5
- package/dist/behaviors.d.ts.map +1 -1
- package/dist/behaviors.js +1 -1
- package/dist/behaviors.js.map +1 -1
- package/dist/catalog.d.ts +168 -15
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +4 -4
- package/dist/catalog.js.map +1 -1
- package/dist/character-count.d.ts +103 -0
- package/dist/character-count.d.ts.map +1 -0
- package/dist/character-count.js +68 -0
- package/dist/character-count.js.map +1 -0
- package/dist/chart.d.ts +30 -0
- package/dist/chart.d.ts.map +1 -1
- package/dist/chart.js +18 -0
- package/dist/chart.js.map +1 -1
- package/dist/collection-rail.d.ts +13 -1
- package/dist/collection-rail.d.ts.map +1 -1
- package/dist/collection-rail.js +9 -2
- package/dist/collection-rail.js.map +1 -1
- package/dist/communication.d.ts +25 -0
- package/dist/communication.d.ts.map +1 -1
- package/dist/communication.js +3 -0
- package/dist/communication.js.map +1 -1
- package/dist/component-recipes.d.ts +172 -2
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +122 -8
- package/dist/component-recipes.js.map +1 -1
- package/dist/design-system-provider.d.ts +13 -2
- package/dist/design-system-provider.d.ts.map +1 -1
- package/dist/design-system-provider.js +19 -3
- package/dist/design-system-provider.js.map +1 -1
- package/dist/foundations.d.ts +15 -0
- package/dist/foundations.d.ts.map +1 -1
- package/dist/foundations.js +7 -0
- package/dist/foundations.js.map +1 -1
- package/dist/icon-button-recipe.d.ts +33 -0
- package/dist/icon-button-recipe.d.ts.map +1 -1
- package/dist/icon-button-recipe.js +36 -1
- package/dist/icon-button-recipe.js.map +1 -1
- package/dist/image.d.ts +13 -0
- package/dist/image.d.ts.map +1 -1
- package/dist/image.js +17 -0
- package/dist/image.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/recipes.d.ts +1 -1
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +1 -1
- package/dist/recipes.js.map +1 -1
- package/dist/screen-patterns.d.ts +95 -0
- package/dist/screen-patterns.d.ts.map +1 -1
- package/dist/screen-patterns.js +83 -2
- package/dist/screen-patterns.js.map +1 -1
- package/dist/selection-helpers.d.ts +6 -0
- package/dist/selection-helpers.d.ts.map +1 -1
- package/dist/selection-helpers.js +12 -0
- package/dist/selection-helpers.js.map +1 -1
- package/dist/sidebar.d.ts +17 -2
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +8 -2
- package/dist/sidebar.js.map +1 -1
- package/dist/steps.d.ts +19 -19
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +21 -9
- package/dist/steps.js.map +1 -1
- package/dist/timeline.d.ts +41 -0
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +47 -1
- package/dist/timeline.js.map +1 -1
- package/dist/top.d.ts +21 -2
- package/dist/top.d.ts.map +1 -1
- package/dist/top.js +17 -1
- package/dist/top.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/affix.md +7 -0
- package/docs/avatar-fallback.md +19 -0
- package/docs/brand-boundary.md +24 -2
- package/docs/chart.md +7 -0
- package/docs/collection-rail.md +4 -1
- package/docs/generated/component-maturity.md +1 -1
- package/docs/generated/renderer-evidence.json +10 -6
- package/docs/generated/renderer-evidence.md +1 -1
- package/docs/generated/showcase-manifest.json +12 -5
- package/docs/image.md +5 -0
- package/docs/list-row.md +8 -0
- package/docs/optional-adapters.md +3 -0
- package/docs/overlay-stack.md +27 -0
- package/docs/screen-patterns.md +39 -2
- package/docs/sidebar.md +15 -0
- package/docs/steps.md +23 -19
- package/docs/theme-palette.md +3 -3
- package/docs/theming.md +1 -0
- package/docs/timeline.md +18 -1
- package/docs/top.md +7 -0
- package/docs/usage/README.md +9 -2
- package/docs/usage/components/affix.md +18 -4
- package/docs/usage/components/alert-dialog.md +28 -0
- package/docs/usage/components/avatar.md +30 -9
- package/docs/usage/components/badge.md +20 -5
- package/docs/usage/components/chart.md +19 -1
- package/docs/usage/components/chat-message.md +5 -0
- package/docs/usage/components/chat-room-actions.md +58 -0
- package/docs/usage/components/chat-room-create.md +58 -0
- package/docs/usage/components/chat-room-details.md +58 -0
- package/docs/usage/components/chat-room-invite.md +58 -0
- package/docs/usage/components/chat-room-members.md +58 -0
- package/docs/usage/components/chat-room-profile.md +58 -0
- package/docs/usage/components/checkbox-group.md +24 -1
- package/docs/usage/components/choice-row.md +19 -4
- package/docs/usage/components/composition-layout.md +6 -2
- package/docs/usage/components/counter-badge.md +2 -2
- package/docs/usage/components/design-system-provider.md +2 -1
- package/docs/usage/components/divider.md +12 -1
- package/docs/usage/components/field.md +51 -0
- package/docs/usage/components/icon-button.md +48 -4
- package/docs/usage/components/icon-tile.md +13 -2
- package/docs/usage/components/image.md +25 -0
- package/docs/usage/components/list-row.md +8 -4
- package/docs/usage/components/list.md +1 -1
- package/docs/usage/components/notification-item.md +5 -1
- package/docs/usage/components/permission-screen.md +25 -4
- package/docs/usage/components/screen-layout.md +27 -1
- package/docs/usage/components/segmented-control.md +16 -3
- package/docs/usage/components/select.md +1 -0
- package/docs/usage/components/settings-screen.md +5 -4
- package/docs/usage/components/sheet.md +2 -1
- package/docs/usage/components/sidebar.md +34 -6
- package/docs/usage/components/steps.md +29 -8
- package/docs/usage/components/surface.md +2 -1
- package/docs/usage/components/text-area.md +2 -1
- package/docs/usage/components/timeline.md +25 -4
- package/docs/usage/components/top.md +15 -2
- package/docs/usage/compositions/chat-room.md +110 -0
- package/docs/usage/screens/common-settings.md +3 -2
- package/docs/usage/screens/flow-permission.md +3 -3
- package/docs/usage/tokens/elevation-opacity.md +14 -2
- package/package.json +7 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { fontWeight, numeric, spacing } from "./foundations.js";
|
|
2
|
+
import { formatNumber } from "./formatters.js";
|
|
3
|
+
export const characterCountRecipe = {
|
|
4
|
+
defaults: { min: 0, overflow: "block", measure: "length" },
|
|
5
|
+
/** BurnTok switched to the remaining sentence at 40 of 300–1000; one tenth of max is the shared default. */
|
|
6
|
+
nearLimitRatio: 0.1,
|
|
7
|
+
separator: "/",
|
|
8
|
+
textVariant: "label",
|
|
9
|
+
colors: { idle: "textMuted", invalid: "danger" },
|
|
10
|
+
/** The counter only gains weight when it must be fixed; color is not the only cue. */
|
|
11
|
+
counterFontWeight: { idle: fontWeight.regular, invalid: fontWeight.semibold },
|
|
12
|
+
numeric: numeric.tabular,
|
|
13
|
+
/** Between the sentence and the counter on one row. */
|
|
14
|
+
gap: spacing.sm,
|
|
15
|
+
/**
|
|
16
|
+
* Statuses announced (politely) when the value enters them. Announcing every keystroke drowns the typed text,
|
|
17
|
+
* so `within` is silent and the counter is read on focus through the description link instead.
|
|
18
|
+
*/
|
|
19
|
+
announcedStatuses: ["near", "short", "over"],
|
|
20
|
+
};
|
|
21
|
+
function assertCount(value, name) {
|
|
22
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
23
|
+
throw new RangeError(`characterCount ${name} must be a nonnegative integer`);
|
|
24
|
+
}
|
|
25
|
+
export function resolveCharacterCount(value, options) {
|
|
26
|
+
const { max, messages } = options;
|
|
27
|
+
const min = options.min ?? characterCountRecipe.defaults.min;
|
|
28
|
+
const measure = options.measure ?? characterCountRecipe.defaults.measure;
|
|
29
|
+
assertCount(max, "max");
|
|
30
|
+
assertCount(min, "min");
|
|
31
|
+
if (max === 0 || min > max)
|
|
32
|
+
throw new RangeError("characterCount requires 0 <= min <= max and max > 0");
|
|
33
|
+
if (measure !== "length" && measure !== "trimmed")
|
|
34
|
+
throw new TypeError(`Unknown characterCount measure: ${String(measure)}`);
|
|
35
|
+
const overflow = options.overflow ?? characterCountRecipe.defaults.overflow;
|
|
36
|
+
if (overflow !== "block" && overflow !== "allow")
|
|
37
|
+
throw new TypeError(`Unknown characterCount overflow: ${String(overflow)}`);
|
|
38
|
+
const nearLimit = options.nearLimit ?? Math.ceil(max * characterCountRecipe.nearLimitRatio);
|
|
39
|
+
assertCount(nearLimit, "nearLimit");
|
|
40
|
+
const length = (measure === "trimmed" ? value.trim() : value).length;
|
|
41
|
+
const remaining = max - length;
|
|
42
|
+
// Same precedence as BurnTok: what blocks submission first, then the approaching limit, then the range.
|
|
43
|
+
const status = length > max ? "over"
|
|
44
|
+
: length > 0 && length < min ? "short"
|
|
45
|
+
: remaining <= nearLimit ? "near"
|
|
46
|
+
: "within";
|
|
47
|
+
const message = status === "over" ? messages?.over?.({ count: -remaining })
|
|
48
|
+
: status === "short" ? messages?.needed?.({ count: min - length })
|
|
49
|
+
: status === "near" ? messages?.remaining?.({ count: remaining })
|
|
50
|
+
: messages?.range?.({ min, max });
|
|
51
|
+
const counter = `${formatNumber(length, { locale: options.locale })}${characterCountRecipe.separator}${formatNumber(max, { locale: options.locale })}`;
|
|
52
|
+
return {
|
|
53
|
+
length, min, max, remaining, status, invalid: status === "over" || status === "short", counter,
|
|
54
|
+
...(message ? { message } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** The platform `maxLength` for the options: only `block` limits typing. */
|
|
58
|
+
export function resolveCharacterCountMaxLength(options) {
|
|
59
|
+
if (!options)
|
|
60
|
+
return undefined;
|
|
61
|
+
return (options.overflow ?? characterCountRecipe.defaults.overflow) === "block" ? options.max : undefined;
|
|
62
|
+
}
|
|
63
|
+
/** Announce on entering an announced status (not on mount, not on every keystroke inside one status). */
|
|
64
|
+
export function shouldAnnounceCharacterCount(previous, next) {
|
|
65
|
+
return previous !== undefined && previous !== next.status && next.message !== undefined
|
|
66
|
+
&& characterCountRecipe.announcedStatuses.includes(next.status);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=character-count.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-count.js","sourceRoot":"","sources":["../src/character-count.ts"],"names":[],"mappings":"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","sourcesContent":["import { fontWeight, numeric, spacing, type FontWeightValue, type TextVariant } from \"./foundations.js\";\nimport { formatNumber } from \"./formatters.js\";\nimport type { ThemeColors } from \"./colors.js\";\n\n/**\n * Character count under TextField / TextArea (2026-10-23).\n *\n * BurnTok drew the same rule twice — web `components/ComposerCount.tsx` and app `components/TextLengthHint.tsx`:\n * a `length/max` counter, one sentence chosen in the order over → still short → near the limit → allowed range,\n * and the danger color for the short/over states. The thresholds already drifted (web emphasised the counter at\n * 50 remaining, the app did not). Measuring and choosing the state live here; the product supplies the localized\n * sentences and the locale, and the renderer formats the numbers with that locale.\n */\n\n/**\n * `length` counts UTF-16 code units, the unit of the platform `maxLength` on both renderers, so the counter\n * and the block agree. `trimmed` counts after removing leading/trailing whitespace (BurnTok's server policy).\n */\nexport type CharacterCountMeasure = \"length\" | \"trimmed\";\n/**\n * `block` passes `max` to the platform `maxLength`, so typing stops at the limit. `allow` keeps typing past\n * the limit so a pasted or long draft is preserved and the user is told how much to remove; submission must\n * then check `status !== \"over\"`.\n */\nexport type CharacterCountOverflow = \"block\" | \"allow\";\n/** `over` > max · `short` non-empty and < min · `near` remaining ≤ nearLimit · `within` otherwise. */\nexport type CharacterCountStatus = \"over\" | \"short\" | \"near\" | \"within\";\n\nexport type CharacterCountMessages = Readonly<{\n /** Within the limits and not near the end, e.g. `${min}–${max}자`. Omit to show only the counter. */\n range?: (params: Readonly<{ min: number; max: number }>) => string;\n /** Near the limit, e.g. `${count}자 더 쓸 수 있어요`. */\n remaining?: (params: Readonly<{ count: number }>) => string;\n /** Non-empty and below `min`, e.g. `${count}자만 더 적어주세요`. */\n needed?: (params: Readonly<{ count: number }>) => string;\n /** Above `max` (only reachable with `overflow: \"allow\"`), e.g. `${count}자를 줄여주세요`. */\n over?: (params: Readonly<{ count: number }>) => string;\n}>;\n\nexport type CharacterCountOptions = Readonly<{\n max: number;\n /** Default 0. An empty value is never `short`: an untouched field is not an error. */\n min?: number;\n /** Default `block`. */\n overflow?: CharacterCountOverflow;\n /** Default `length`. */\n measure?: CharacterCountMeasure;\n /** Remaining count at or below which the state is `near`. Default `ceil(max × characterCountRecipe.nearLimitRatio)`. */\n nearLimit?: number;\n /** Required: the counter numbers are formatted for this locale (no silent environment default). */\n locale: string | readonly string[];\n messages?: CharacterCountMessages;\n}>;\n\nexport type CharacterCountState = Readonly<{\n length: number;\n min: number;\n max: number;\n /** Negative when over, so the product can say how much to remove. */\n remaining: number;\n status: CharacterCountStatus;\n /** `short` or `over`: the counter row uses the error color. */\n invalid: boolean;\n /** The visible counter, e.g. `1,024/1,000`. */\n counter: string;\n /** The product sentence for this status, when supplied. */\n message?: string;\n}>;\n\nexport const characterCountRecipe = {\n defaults: { min: 0, overflow: \"block\", measure: \"length\" },\n /** BurnTok switched to the remaining sentence at 40 of 300–1000; one tenth of max is the shared default. */\n nearLimitRatio: 0.1,\n separator: \"/\",\n textVariant: \"label\",\n colors: { idle: \"textMuted\", invalid: \"danger\" },\n /** The counter only gains weight when it must be fixed; color is not the only cue. */\n counterFontWeight: { idle: fontWeight.regular, invalid: fontWeight.semibold },\n numeric: numeric.tabular,\n /** Between the sentence and the counter on one row. */\n gap: spacing.sm,\n /**\n * Statuses announced (politely) when the value enters them. Announcing every keystroke drowns the typed text,\n * so `within` is silent and the counter is read on focus through the description link instead.\n */\n announcedStatuses: [\"near\", \"short\", \"over\"],\n} as const satisfies {\n defaults: { min: number; overflow: CharacterCountOverflow; measure: CharacterCountMeasure };\n nearLimitRatio: number;\n separator: string;\n textVariant: TextVariant;\n colors: Record<\"idle\" | \"invalid\", keyof ThemeColors>;\n counterFontWeight: Record<\"idle\" | \"invalid\", FontWeightValue>;\n numeric: string;\n gap: number;\n announcedStatuses: readonly CharacterCountStatus[];\n};\n\nfunction assertCount(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`characterCount ${name} must be a nonnegative integer`);\n}\n\nexport function resolveCharacterCount(value: string, options: CharacterCountOptions): CharacterCountState {\n const { max, messages } = options;\n const min = options.min ?? characterCountRecipe.defaults.min;\n const measure = options.measure ?? characterCountRecipe.defaults.measure;\n assertCount(max, \"max\");\n assertCount(min, \"min\");\n if (max === 0 || min > max) throw new RangeError(\"characterCount requires 0 <= min <= max and max > 0\");\n if (measure !== \"length\" && measure !== \"trimmed\") throw new TypeError(`Unknown characterCount measure: ${String(measure)}`);\n const overflow = options.overflow ?? characterCountRecipe.defaults.overflow;\n if (overflow !== \"block\" && overflow !== \"allow\") throw new TypeError(`Unknown characterCount overflow: ${String(overflow)}`);\n const nearLimit = options.nearLimit ?? Math.ceil(max * characterCountRecipe.nearLimitRatio);\n assertCount(nearLimit, \"nearLimit\");\n const length = (measure === \"trimmed\" ? value.trim() : value).length;\n const remaining = max - length;\n // Same precedence as BurnTok: what blocks submission first, then the approaching limit, then the range.\n const status: CharacterCountStatus = length > max ? \"over\"\n : length > 0 && length < min ? \"short\"\n : remaining <= nearLimit ? \"near\"\n : \"within\";\n const message = status === \"over\" ? messages?.over?.({ count: -remaining })\n : status === \"short\" ? messages?.needed?.({ count: min - length })\n : status === \"near\" ? messages?.remaining?.({ count: remaining })\n : messages?.range?.({ min, max });\n const counter = `${formatNumber(length, { locale: options.locale })}${characterCountRecipe.separator}${formatNumber(max, { locale: options.locale })}`;\n return {\n length, min, max, remaining, status, invalid: status === \"over\" || status === \"short\", counter,\n ...(message ? { message } : {}),\n };\n}\n\n/** The platform `maxLength` for the options: only `block` limits typing. */\nexport function resolveCharacterCountMaxLength(options: CharacterCountOptions | undefined): number | undefined {\n if (!options) return undefined;\n return (options.overflow ?? characterCountRecipe.defaults.overflow) === \"block\" ? options.max : undefined;\n}\n\n/** Announce on entering an announced status (not on mount, not on every keystroke inside one status). */\nexport function shouldAnnounceCharacterCount(previous: CharacterCountStatus | undefined, next: CharacterCountState): boolean {\n return previous !== undefined && previous !== next.status && next.message !== undefined\n && (characterCountRecipe.announcedStatuses as readonly CharacterCountStatus[]).includes(next.status);\n}\n"]}
|
package/dist/chart.d.ts
CHANGED
|
@@ -33,6 +33,12 @@ export type ChartInsets = Readonly<{
|
|
|
33
33
|
export type ChartCurve = "linear" | "monotone" | "step";
|
|
34
34
|
export type ChartOrientation = "vertical" | "horizontal";
|
|
35
35
|
export type ChartBarLayout = "grouped" | "stacked";
|
|
36
|
+
/**
|
|
37
|
+
* ChartLegend arrangement (2026-10-23). `stack`: one row per series (32 minimum row, values aligned at the end).
|
|
38
|
+
* `inline`: entries flow on one line and wrap — a compact key under a map or chart. Choose-window's map legend could
|
|
39
|
+
* not adopt ChartLegend because Native only stacked rows.
|
|
40
|
+
*/
|
|
41
|
+
export type ChartLegendLayout = "stack" | "inline";
|
|
36
42
|
export type ChartPlot = Readonly<{
|
|
37
43
|
index: number;
|
|
38
44
|
seriesIndex: number;
|
|
@@ -108,6 +114,29 @@ export declare const chartRecipe: {
|
|
|
108
114
|
readonly reference: {
|
|
109
115
|
readonly dash: readonly [2, 4];
|
|
110
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* ChartLegend geometry shared by both renderers. `itemGap` separates swatch, label and value inside one entry;
|
|
119
|
+
* `inline` puts `columnGap` between entries and `rowGap` between wrapped lines. The values are the ones Web already
|
|
120
|
+
* drew for its passive legend, now also used by Native.
|
|
121
|
+
*/
|
|
122
|
+
readonly legend: {
|
|
123
|
+
readonly swatch: {
|
|
124
|
+
readonly size: 10;
|
|
125
|
+
readonly radius: 3;
|
|
126
|
+
};
|
|
127
|
+
readonly itemGap: 8;
|
|
128
|
+
readonly dimmedOpacity: 0.5;
|
|
129
|
+
readonly layouts: {
|
|
130
|
+
readonly stack: {
|
|
131
|
+
readonly rowGap: 4;
|
|
132
|
+
readonly rowMinHeight: 32;
|
|
133
|
+
};
|
|
134
|
+
readonly inline: {
|
|
135
|
+
readonly rowGap: 4;
|
|
136
|
+
readonly columnGap: 16;
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
};
|
|
111
140
|
readonly chrome: {
|
|
112
141
|
readonly axisLine: Readonly<{
|
|
113
142
|
source: "theme";
|
|
@@ -160,6 +189,7 @@ export declare const chartRecipe: {
|
|
|
160
189
|
readonly legendVariant: "label";
|
|
161
190
|
};
|
|
162
191
|
};
|
|
192
|
+
export declare function validateChartLegendLayout(value: unknown): asserts value is ChartLegendLayout;
|
|
163
193
|
export declare function validateChartSeries(categories: readonly string[], series: readonly ChartSeries[]): void;
|
|
164
194
|
export declare const isChartNumber: (value: ChartValue | undefined) => value is number;
|
|
165
195
|
/** "Nice" step (1, 2, 2.5, 5 × 10^n) so axis labels read like 0/25/50 rather than 0/23.7/47.4. */
|
package/dist/chart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,+FAA+F;IAC/F,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjG,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,CAAC;AACzD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9G,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"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"}
|
package/dist/chart.js
CHANGED
|
@@ -15,8 +15,26 @@ export const chartRecipe = {
|
|
|
15
15
|
sparkline: { width: 72, height: 28, strokeWidth: 1.8, padding: 2 },
|
|
16
16
|
cursor: { strokeWidth: stroke.subtle, dash: [2, 3] },
|
|
17
17
|
reference: { dash: [2, 4] },
|
|
18
|
+
/**
|
|
19
|
+
* ChartLegend geometry shared by both renderers. `itemGap` separates swatch, label and value inside one entry;
|
|
20
|
+
* `inline` puts `columnGap` between entries and `rowGap` between wrapped lines. The values are the ones Web already
|
|
21
|
+
* drew for its passive legend, now also used by Native.
|
|
22
|
+
*/
|
|
23
|
+
legend: {
|
|
24
|
+
swatch: { size: 10, radius: 3 },
|
|
25
|
+
itemGap: spacing.xs,
|
|
26
|
+
dimmedOpacity: 0.5,
|
|
27
|
+
layouts: {
|
|
28
|
+
stack: { rowGap: spacing.xxs, rowMinHeight: 32 },
|
|
29
|
+
inline: { rowGap: spacing.xxs, columnGap: spacing.md },
|
|
30
|
+
},
|
|
31
|
+
},
|
|
18
32
|
chrome: datavizChromeTokens,
|
|
19
33
|
};
|
|
34
|
+
export function validateChartLegendLayout(value) {
|
|
35
|
+
if (value !== "stack" && value !== "inline")
|
|
36
|
+
throw new TypeError(`Unsupported ChartLegend layout: ${String(value)}`);
|
|
37
|
+
}
|
|
20
38
|
// ---------------------------------------------------------------------------------------------
|
|
21
39
|
// Validation
|
|
22
40
|
// ---------------------------------------------------------------------------------------------
|
package/dist/chart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsC3D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IACjE,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QAClF,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;KAC3E;IACD,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAU,EAAE,cAAc,EAAE,IAAI,EAAE;IAC5I,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IAC5C,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;IAC9F,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE;IAC9D,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE;IAChF,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;IACtC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;IAClE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAU,EAAE;IAC7D,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAU,EAAE;IACpC,MAAM,EAAE,mBAAmB;CACnB,CAAC;AAEX,gGAAgG;AAChG,aAAa;AACb,gGAAgG;AAEhG,MAAM,UAAU,mBAAmB,CAAC,UAA6B,EAAE,MAA8B;IAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9E,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,iBAAiB,IAAI,CAAC,EAAE,2BAA2B,CAAC,CAAC;QACjG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,IAAI,UAAU,CAAC,iBAAiB,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,eAAe,UAAU,CAAC,MAAM,aAAa,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAA6B,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAErI,gGAAgG;AAChG,mBAAmB;AACnB,gGAAgG;AAEhG,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;IACzF,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO,IAAI,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW,EAAE,KAAK,GAAG,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9D,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,KAAK,CAAC;AACf,CAAC;AAGD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA6B,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,GAAG,CAAC,KAAyB,EAAE;IACnJ,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7D,IAAI,WAAW,EAAE,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC;IACpE,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAAC,GAAG,IAAI,GAAG,CAAC;QAAC,GAAG,IAAI,GAAG,CAAC;IAAC,CAAC;IAClF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC;QAAC,IAAI,CAAC,CAAC,WAAW,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,GAAG,IAAI,GAAG,CAAC;QAAC,GAAG,IAAI,GAAG,CAAC;IAAC,CAAC;IAChH,IAAI,IAAI,EAAE,CAAC;QAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IAC3H,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,MAAiC,EAAE,KAAgC,EAAE,MAAM,GAAG,KAAK;IAC7G,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IAC1F,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACpF,CAAC;AAGD,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,KAAgC,EAAE,UAAkB,WAAW,CAAC,GAAG,CAAC,WAAW;IACtH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5G,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;AACpJ,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,KAAgC;IAC5E,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,gGAAgG;AAChG,QAAQ;AACR,gGAAgG;AAEhG,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAG1D,wGAAwG;AACxG,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAa,EAAE,EAAE,QAAQ,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1H,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;IACvH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACxE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAAC,CAAC;IACpH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAqB,EAAE,QAAoB,QAAQ;IAC1E,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9I,IAAI,KAAK,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IACD,OAAO,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,MAAqB,EAAE,KAAa,EAAE,QAAoB,QAAQ,EAAE,KAAqB;IAChH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtE,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACrG,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAAqC,KAAmB;IACnF,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,IAAI,OAAO,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,OAAO,CAAC,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,IAAwB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AAClB,CAAC;AA4BD,MAAM,UAAU,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,aAAa,EAAqB;IAC/K,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IACjH,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9H,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC;IACzH,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACjE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChD,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvH,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5M,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1F,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,WAAW,CAAC,MAA8B;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzI,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;QAC1E,IAAI,KAAK,IAAI,CAAC;YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;;YAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC1D,OAAO,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC;IAC9B,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AA0BD,MAAM,UAAU,kBAAkB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,aAAa,EAAoB;IAC1L,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IACjH,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzI,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,WAAW,KAAK,UAAU,CAAC;IAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1H,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClH,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1I,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnH,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACtH,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5H,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACjJ,CAAC;AAOD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,KAAa,EAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEvI,mFAAmF;AACnF,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,WAAmB,EAAE,WAAmB,EAAE,UAAkB,EAAE,QAAgB;IAC5H,MAAM,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAChC,4DAA4D;QAC5D,MAAM,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/H,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7F,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAChL,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7F,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACvP,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,MAA6B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAiG;IAC9O,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAS,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9G,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QAChD,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1H,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/O,KAAK,IAAI,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAID;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAkM;IACxW,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;IACzF,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,CAAC,CAAC;QACnH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAiB,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAgB,CAAC,CAAC,CAAC,KAAc,EAAE,CAAC;IAC9I,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACjJ,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;YAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtG,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;IAC3H,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC;AAaD,MAAM,UAAU,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAgL;IAChS,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IACjH,MAAM,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3K,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnL,CAAC;AAED,gGAAgG;AAChG,0CAA0C;AAC1C,gGAAgG;AAEhG,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,CAAS,EAAE,SAA6B;IAC/F,MAAM,UAAU,GAAG,SAAS,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,IAAI,GAAkB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAE,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;YAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,IAAI,GAAG,KAAK,CAAC;QAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,MAAuD,EAAE,CAAS,EAAE,CAAS,EAAE,WAAW,GAAG,EAAE;IACjI,IAAI,IAAI,GAAkB,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IACrE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,CAAC,CAAC;QAAC,IAAI,GAAG,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO,IAAI,CAAC;AACd,CAAC;AACD,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,SAA4B,EAAE,OAAsB,EAAE,SAAiB;IACpG,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAC/E,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;AAC5G,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,MAA8B;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7G,CAAC;AACD,gGAAgG;AAChG,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO;QAClC,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAE;YAAE,GAAG,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAE;YAAE,GAAG,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAA6B,EAAE,MAA8B,EAAE,MAAiC,EAAE,OAAe;IAC7I,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtM,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,MAAM,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;IAC9F,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;IACjI,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE;IACzE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC1E,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;IACxG,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;IAC3F,SAAS,EAAE;QACT,uDAAuD;QACvD,gDAAgD;QAChD,0CAA0C;QAC1C,uEAAuE;QACvE,4EAA4E;QAC5E,gFAAgF;QAChF,0DAA0D;QAC1D,6BAA6B;QAC7B,+CAA+C;KAChD;CACkC,CAAC;AAEtC,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,IAA+D,EAAE,cAAiC,EAAE;IACvI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAClF,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACrI,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrJ,8FAA8F;IAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChI,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAS,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;IAC9E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AACrI,CAAC;AAGD;uFACuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,IAAmB,EAAE,EAAiB;IAC1E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3I,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAE,QAAgB,EAAM,EAAE;QAC7D,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;QACzI,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1I,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,QAAgB,EAAQ,EAAE;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACzH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport { datavizChromeTokens } from \"./dataviz.js\";\nimport { radius, spacing, stroke } from \"./foundations.js\";\n\n/**\n * Chart geometry contract (2026-10-14, user request: \"absorb the well-known chart libraries into our\n * system\"). Until 1.20 HJM only shipped dataviz *tokens* and delegated drawing to product libraries\n * (see docs/chart.md for the earlier decision). Products then rebuilt the same scrubbing line chart,\n * bars, and stat tables separately (Yajalal's StockChart/RecordTable), so drawing moves into HJM.\n *\n * Everything here is renderer-neutral math: both the Web (SVG DOM) and Native (react-native-svg)\n * renderers receive the same coordinates, paths and accessibility summaries and only paint them.\n * The public shapes were studied from — not copied from — these MIT/ISC libraries:\n * - react-native-wagmi-charts: line + cursor crosshair, price/datetime text driven by the focused index\n * - victory-native (XL): CartesianChart x/y keys, chart press state, rounded bars, domain padding\n * - react-native-gifted-charts: bar/line/pie/radar props (focus on press, stacked bars, donut center)\n * - Recharts: series/category data model, stacking, nice ticks, radar polar grid\n * - d3-shape / d3-scale: monotone-X cubic curve (Fritsch–Carlson) and \"nice\" tick steps (algorithms\n * re-derived here; no source is vendored)\n */\n\nexport type ChartValue = number | null;\n\nexport type ChartSeries = Readonly<{\n id: string;\n /** Visible legend text and the series' accessible name. Product-localized. */\n label: string;\n /** One value per category; `null` is a missing observation (drawn as a gap, never as zero). */\n values: readonly ChartValue[];\n /** Product-owned series color; renderers fall back to the dataviz series palette by index. */\n color?: string;\n}>;\n\nexport type ChartInsets = Readonly<{ top: number; right: number; bottom: number; left: number }>;\nexport type ChartCurve = \"linear\" | \"monotone\" | \"step\";\nexport type ChartOrientation = \"vertical\" | \"horizontal\";\nexport type ChartBarLayout = \"grouped\" | \"stacked\";\n\nexport type ChartPlot = Readonly<{ index: number; seriesIndex: number; x: number; y: number; value: number }>;\n\nexport const chartRecipe = {\n heights: { sparkline: 28, compact: 128, regular: 180, tall: 240 },\n insets: {\n plot: { top: spacing.lg, right: spacing.xs, bottom: spacing.xs, left: spacing.xs },\n axis: { top: spacing.md, right: spacing.xs, bottom: spacing.lg, left: 36 },\n },\n line: { strokeWidth: 2.4, pointRadius: 4.5, focusHaloRadius: 9, focusHaloOpacity: 0.25, missingDash: [1, 5] as const, missingOpacity: 0.55 },\n area: { topOpacity: 0.32, bottomOpacity: 0 },\n bar: { radius: radius.sm / 2, maxWidth: 28, bandPadding: 0.36, groupGap: 2, restOpacity: 0.4 },\n pie: { donutRatio: 0.62, padAngle: 0.012, minLabelPercent: 4 },\n radar: { levels: 4, strokeWidth: 2, fillOpacity: 0.22, labelOffset: spacing.sm },\n scatter: { radius: 5, focusRadius: 8 },\n sparkline: { width: 72, height: 28, strokeWidth: 1.8, padding: 2 },\n cursor: { strokeWidth: stroke.subtle, dash: [2, 3] as const },\n reference: { dash: [2, 4] as const },\n chrome: datavizChromeTokens,\n} as const;\n\n// ---------------------------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------------------------\n\nexport function validateChartSeries(categories: readonly string[], series: readonly ChartSeries[]): void {\n if (series.length === 0) throw new TypeError(\"Chart needs at least one series\");\n const ids = new Set<string>();\n for (const item of series) {\n if (!item.id.trim()) throw new TypeError(\"Chart series id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate chart series id: ${item.id}`);\n ids.add(item.id);\n if (!item.label.trim()) throw new TypeError(`Chart series \"${item.id}\" label must not be empty`);\n if (item.values.length !== categories.length) {\n throw new RangeError(`Chart series \"${item.id}\" has ${item.values.length} values for ${categories.length} categories`);\n }\n }\n}\n\nexport const isChartNumber = (value: ChartValue | undefined): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n// ---------------------------------------------------------------------------------------------\n// Scales and ticks\n// ---------------------------------------------------------------------------------------------\n\n/** \"Nice\" step (1, 2, 2.5, 5 × 10^n) so axis labels read like 0/25/50 rather than 0/23.7/47.4. */\nexport function niceStep(span: number, count: number): number {\n if (!(span > 0) || count < 1) return 1;\n const raw = span / count, power = 10 ** Math.floor(Math.log10(raw)), ratio = raw / power;\n const nice = ratio <= 1 ? 1 : ratio <= 2 ? 2 : ratio <= 2.5 ? 2.5 : ratio <= 5 ? 5 : 10;\n return nice * power;\n}\n\nexport function niceTicks(min: number, max: number, count = 4): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [];\n if (min === max) return [min];\n const step = niceStep(max - min, count), start = Math.ceil(min / step - 1e-9) * step;\n const ticks: number[] = [];\n for (let tick = start; tick <= max + step * 1e-9; tick += step) ticks.push(Number(tick.toPrecision(12)));\n return ticks;\n}\n\nexport type ChartDomainOptions = Readonly<{ domain?: readonly [number, number] | undefined; includeZero?: boolean | undefined; nice?: boolean | undefined; padding?: number | undefined }>;\n/**\n * Value domain. Lines zoom to the observed range (stock charts) unless `includeZero`; bars always\n * include zero so heights compare honestly. `padding` widens a flat series so it is not drawn on an edge.\n */\nexport function resolveChartDomain(values: readonly ChartValue[], { domain, includeZero = false, nice = false, padding = 0 }: ChartDomainOptions = {}): readonly [number, number] {\n if (domain) return domain;\n const observed = values.filter(isChartNumber);\n if (!observed.length) return [0, 1];\n let min = Math.min(...observed), max = Math.max(...observed);\n if (includeZero) { min = Math.min(0, min); max = Math.max(0, max); }\n if (min === max) { const pad = Math.abs(min) * 0.1 || 1; min -= pad; max += pad; }\n if (padding > 0) { const pad = (max - min) * padding; if (!(includeZero && min === 0)) min -= pad; max += pad; }\n if (nice) { const step = niceStep(max - min, 4); min = Math.floor(min / step) * step; max = Math.ceil(max / step) * step; }\n return [min, max];\n}\n\n/** Linear scale from value domain to pixel range; `invert` puts the minimum at the top (ranks, ERA). */\nexport function scaleLinear(domain: readonly [number, number], range: readonly [number, number], invert = false): (value: number) => number {\n const [d0, d1] = domain, [r0, r1] = invert ? [range[1], range[0]] : range, span = d1 - d0;\n return value => span === 0 ? (r0 + r1) / 2 : r0 + (value - d0) / span * (r1 - r0);\n}\n\nexport type ChartBand = Readonly<{ step: number; bandwidth: number; start(index: number): number; center(index: number): number }>;\nexport function scaleBand(count: number, range: readonly [number, number], padding: number = chartRecipe.bar.bandPadding): ChartBand {\n const length = range[1] - range[0], step = count > 0 ? length / count : 0, bandwidth = step * (1 - padding);\n return { step, bandwidth, start: index => range[0] + index * step + (step - bandwidth) / 2, center: index => range[0] + index * step + step / 2 };\n}\n\n/** Evenly spaced x positions for line/area categories (first and last on the plot edges). */\nexport function pointPositions(count: number, range: readonly [number, number]): number[] {\n if (count <= 1) return [Math.round((range[0] + range[1]) / 2)];\n const step = (range[1] - range[0]) / (count - 1);\n return Array.from({ length: count }, (_, i) => range[0] + i * step);\n}\n\n// ---------------------------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------------------------\n\nconst fixed = (value: number) => Number(value.toFixed(2));\ntype XY = Readonly<{ x: number; y: number }>;\n\n/** Monotone-X cubic (Fritsch–Carlson): smooth without overshooting the data, like d3.curveMonotoneX. */\nfunction monotoneTangents(points: readonly XY[]): number[] {\n const n = points.length, slopes: number[] = [], tangents: number[] = new Array(n).fill(0);\n for (let i = 0; i < n - 1; i++) slopes.push((points[i + 1]!.y - points[i]!.y) / ((points[i + 1]!.x - points[i]!.x) || 1));\n tangents[0] = slopes[0] ?? 0; tangents[n - 1] = slopes[n - 2] ?? 0;\n for (let i = 1; i < n - 1; i++) tangents[i] = slopes[i - 1]! * slopes[i]! <= 0 ? 0 : (slopes[i - 1]! + slopes[i]!) / 2;\n for (let i = 0; i < n - 1; i++) {\n if (slopes[i] === 0) { tangents[i] = 0; tangents[i + 1] = 0; continue; }\n const a = tangents[i]! / slopes[i]!, b = tangents[i + 1]! / slopes[i]!, h = a * a + b * b;\n if (h > 9) { const t = 3 / Math.sqrt(h); tangents[i] = t * a * slopes[i]!; tangents[i + 1] = t * b * slopes[i]!; }\n }\n return tangents;\n}\n\nexport function linePath(points: readonly XY[], curve: ChartCurve = \"linear\"): string {\n if (!points.length) return \"\";\n const head = `M${fixed(points[0]!.x)},${fixed(points[0]!.y)}`;\n if (points.length === 1) return head;\n if (curve === \"step\") return head + points.slice(1).map((p, i) => `H${fixed((points[i]!.x + p.x) / 2)}V${fixed(p.y)}H${fixed(p.x)}`).join(\"\");\n if (curve === \"monotone\" && points.length > 2) {\n const t = monotoneTangents(points);\n return head + points.slice(1).map((p, i) => {\n const a = points[i]!, dx = (p.x - a.x) / 3;\n return `C${fixed(a.x + dx)},${fixed(a.y + dx * t[i]!)} ${fixed(p.x - dx)},${fixed(p.y - dx * t[i + 1]!)} ${fixed(p.x)},${fixed(p.y)}`;\n }).join(\"\");\n }\n return head + points.slice(1).map(p => `L${fixed(p.x)},${fixed(p.y)}`).join(\"\");\n}\n\n/** Closed area under a line down to `floor` (or between two edges for stacked areas via `lower`). */\nexport function areaPath(points: readonly XY[], floor: number, curve: ChartCurve = \"linear\", lower?: readonly XY[]): string {\n if (points.length < 2) return \"\";\n const top = linePath(points, curve);\n if (lower && lower.length === points.length) {\n const back = linePath([...lower].reverse(), curve).replace(/^M/, \"L\");\n return `${top}${back}Z`;\n }\n return `${top}L${fixed(points.at(-1)!.x)},${fixed(floor)}L${fixed(points[0]!.x)},${fixed(floor)}Z`;\n}\n\n/** Splits a series at missing values: a skipped month is a gap, never an interpolated trend. */\nexport function splitSegments<T extends { value: number } | null>(plots: readonly T[]): Exclude<T, null>[][] {\n const segments: Exclude<T, null>[][] = [];\n let current: Exclude<T, null>[] = [];\n for (const plot of plots) {\n if (plot === null) { if (current.length) segments.push(current); current = []; continue; }\n current.push(plot as Exclude<T, null>);\n }\n if (current.length) segments.push(current);\n return segments;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cartesian: line / area\n// ---------------------------------------------------------------------------------------------\n\nexport type LineGeometryInput = Readonly<{\n categories: readonly string[];\n series: readonly ChartSeries[];\n width: number;\n height: number;\n insets?: ChartInsets;\n invert?: boolean;\n stacked?: boolean;\n} & ChartDomainOptions>;\n\nexport type LineGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n domain: readonly [number, number];\n ticks: readonly number[];\n xs: readonly number[];\n y(value: number): number;\n /** Per series, per category: the plotted point or null for a gap. */\n plots: readonly (readonly (ChartPlot | null)[])[];\n /** Stacked areas: the lower edge per series (previous cumulative). */\n lower: readonly (readonly (ChartPlot | null)[])[] | null;\n}>;\n\nexport function resolveLineGeometry({ categories, series, width, height, insets = chartRecipe.insets.plot, invert = false, stacked = false, ...domainOptions }: LineGeometryInput): LineGeometry {\n validateChartSeries(categories, series);\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const totals = stacked ? stackValues(series) : null;\n const domainValues = totals ? totals.flatMap(row => row.map(cell => cell?.[1] ?? null)) : series.flatMap(item => item.values);\n const domain = resolveChartDomain(domainValues, { includeZero: stacked || domainOptions.includeZero, ...domainOptions });\n const y = scaleLinear(domain, [plot.bottom, plot.top], invert);\n const xs = pointPositions(categories.length, [plot.left, plot.right]);\n const plots = series.map((item, s) => item.values.map((value, i) => {\n const top = totals ? totals[s]![i]?.[1] : value;\n return isChartNumber(value) && isChartNumber(top) ? { index: i, seriesIndex: s, x: xs[i]!, y: y(top), value } : null;\n }));\n const lower = totals ? series.map((_, s) => categories.map((__, i) => { const cell = totals[s]![i]; return cell ? { index: i, seriesIndex: s, x: xs[i]!, y: y(cell[0]), value: cell[0] } : null; })) : null;\n return { plot, domain, ticks: niceTicks(domain[0], domain[1], 4), xs, y, plots, lower };\n}\n\n/** Cumulative [lower, upper] per series per category; missing values do not add to the stack. */\nexport function stackValues(series: readonly ChartSeries[]): (readonly [number, number] | null)[][] {\n const length = series[0]?.values.length ?? 0, positive = new Array<number>(length).fill(0), negative = new Array<number>(length).fill(0);\n return series.map(item => item.values.map((value, i) => {\n if (!isChartNumber(value)) return null;\n const base = value >= 0 ? positive[i]! : negative[i]!, top = base + value;\n if (value >= 0) positive[i] = top; else negative[i] = top;\n return [base, top] as const;\n }));\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cartesian: bars\n// ---------------------------------------------------------------------------------------------\n\nexport type ChartBar = Readonly<{ index: number; seriesIndex: number; value: number; x: number; y: number; width: number; height: number }>;\nexport type BarGeometryInput = Readonly<{\n categories: readonly string[];\n series: readonly ChartSeries[];\n width: number;\n height: number;\n insets?: ChartInsets;\n orientation?: ChartOrientation;\n layout?: ChartBarLayout;\n} & ChartDomainOptions>;\nexport type BarGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n domain: readonly [number, number];\n ticks: readonly number[];\n bars: readonly ChartBar[];\n /** Category band centers along the category axis (x for vertical, y for horizontal). */\n centers: readonly number[];\n value(value: number): number;\n}>;\n\nexport function resolveBarGeometry({ categories, series, width, height, insets = chartRecipe.insets.plot, orientation = \"vertical\", layout = \"grouped\", ...domainOptions }: BarGeometryInput): BarGeometry {\n validateChartSeries(categories, series);\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const stacks = layout === \"stacked\" ? stackValues(series) : null;\n const values = stacks ? stacks.flatMap(row => row.flatMap(cell => cell ? [cell[0], cell[1]] : [])) : series.flatMap(item => item.values);\n const domain = resolveChartDomain(values, { includeZero: true, ...domainOptions });\n const vertical = orientation === \"vertical\";\n const valueScale = vertical ? scaleLinear(domain, [plot.bottom, plot.top]) : scaleLinear(domain, [plot.left, plot.right]);\n const band = scaleBand(categories.length, vertical ? [plot.left, plot.right] : [plot.top, plot.bottom]);\n const thickness = Math.min(chartRecipe.bar.maxWidth * (layout === \"grouped\" ? series.length : 1), band.bandwidth);\n const each = layout === \"grouped\" ? Math.max(1, (thickness - chartRecipe.bar.groupGap * (series.length - 1)) / series.length) : thickness;\n const bars: ChartBar[] = [];\n series.forEach((item, s) => item.values.forEach((value, i) => {\n if (!isChartNumber(value)) return;\n const [from, to] = stacks ? stacks[s]![i]! : [0, value];\n const a = valueScale(from), b = valueScale(to);\n const offset = band.center(i) - thickness / 2 + (layout === \"grouped\" ? s * (each + chartRecipe.bar.groupGap) : 0);\n bars.push(vertical\n ? { index: i, seriesIndex: s, value, x: offset, y: Math.min(a, b), width: each, height: Math.max(1, Math.abs(a - b)) }\n : { index: i, seriesIndex: s, value, x: Math.min(a, b), y: offset, width: Math.max(1, Math.abs(a - b)), height: each });\n }));\n return { plot, domain, ticks: niceTicks(domain[0], domain[1], 4), bars, centers: categories.map((_, i) => band.center(i)), value: valueScale };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Polar: pie / donut / radar\n// ---------------------------------------------------------------------------------------------\n\nexport type PieSlice = Readonly<{ index: number; value: number; percent: number; startAngle: number; endAngle: number; path: string; centroid: XY }>;\nconst polar = (cx: number, cy: number, r: number, angle: number): XY => ({ x: cx + r * Math.sin(angle), y: cy - r * Math.cos(angle) });\n\n/** Annular sector from 12 o'clock clockwise. `innerRadius` 0 draws a pie wedge. */\nexport function arcPath(cx: number, cy: number, outerRadius: number, innerRadius: number, startAngle: number, endAngle: number): string {\n const sweep = endAngle - startAngle;\n if (sweep >= Math.PI * 2 - 1e-6) {\n // A full circle cannot be one arc command; draw two halves.\n const mid = startAngle + Math.PI;\n return arcPath(cx, cy, outerRadius, innerRadius, startAngle, mid) + arcPath(cx, cy, outerRadius, innerRadius, mid, endAngle);\n }\n const large = sweep > Math.PI ? 1 : 0;\n const o0 = polar(cx, cy, outerRadius, startAngle), o1 = polar(cx, cy, outerRadius, endAngle);\n if (innerRadius <= 0) return `M${fixed(cx)},${fixed(cy)}L${fixed(o0.x)},${fixed(o0.y)}A${fixed(outerRadius)},${fixed(outerRadius)} 0 ${large} 1 ${fixed(o1.x)},${fixed(o1.y)}Z`;\n const i1 = polar(cx, cy, innerRadius, endAngle), i0 = polar(cx, cy, innerRadius, startAngle);\n return `M${fixed(o0.x)},${fixed(o0.y)}A${fixed(outerRadius)},${fixed(outerRadius)} 0 ${large} 1 ${fixed(o1.x)},${fixed(o1.y)}L${fixed(i1.x)},${fixed(i1.y)}A${fixed(innerRadius)},${fixed(innerRadius)} 0 ${large} 0 ${fixed(i0.x)},${fixed(i0.y)}Z`;\n}\n\n/** Negative and missing values are excluded: a share of a whole cannot be negative. */\nexport function resolvePieGeometry(values: readonly ChartValue[], { cx, cy, radius: outer, innerRadius = 0, padAngle = chartRecipe.pie.padAngle }: Readonly<{ cx: number; cy: number; radius: number; innerRadius?: number; padAngle?: number }>): PieSlice[] {\n const total = values.reduce<number>((sum, value) => sum + (isChartNumber(value) && value > 0 ? value : 0), 0);\n if (total <= 0) return [];\n let angle = 0;\n const slices: PieSlice[] = [];\n values.forEach((value, index) => {\n if (!isChartNumber(value) || value <= 0) return;\n const sweep = value / total * Math.PI * 2, pad = slices.length || sweep < Math.PI * 2 ? Math.min(padAngle, sweep / 4) : 0;\n const start = angle + pad / 2, end = angle + sweep - pad / 2, mid = (start + end) / 2;\n slices.push({ index, value, percent: value / total * 100, startAngle: start, endAngle: end, path: arcPath(cx, cy, outer, innerRadius, start, end), centroid: polar(cx, cy, innerRadius > 0 ? (outer + innerRadius) / 2 : outer * 0.62, mid) });\n angle += sweep;\n });\n return slices;\n}\n\nexport type RadarAxis = Readonly<{ index: number; label: string; angle: number; end: XY; labelAt: XY; anchor: \"start\" | \"middle\" | \"end\" }>;\nexport type RadarGeometry = Readonly<{ axes: readonly RadarAxis[]; rings: readonly string[]; polygons: readonly Readonly<{ seriesIndex: number; path: string; points: readonly (XY & { index: number; value: number | null })[] }>[] }>;\n/**\n * Radar (spider) chart. All axes share one domain (0..max by default) because the products'\n * ratings are on one 0–100 scale; per-axis scales would make the polygon area meaningless.\n */\nexport function resolveRadarGeometry({ categories, series, cx, cy, radius: outer, domain, levels = chartRecipe.radar.levels, labelOffset = chartRecipe.radar.labelOffset }: Readonly<{ categories: readonly string[]; series: readonly ChartSeries[]; cx: number; cy: number; radius: number; domain?: readonly [number, number]; levels?: number; labelOffset?: number }>): RadarGeometry {\n validateChartSeries(categories, series);\n if (categories.length < 3) throw new RangeError(\"Radar chart needs at least three axes\");\n const [min, max] = domain ?? [0, Math.max(...series.flatMap(item => item.values.filter(isChartNumber)), 1)];\n const step = Math.PI * 2 / categories.length;\n const axes = categories.map((label, index) => {\n const angle = index * step, end = polar(cx, cy, outer, angle), labelAt = polar(cx, cy, outer + labelOffset, angle);\n const sin = Math.sin(angle);\n return { index, label, angle, end, labelAt, anchor: Math.abs(sin) < 0.2 ? \"middle\" as const : sin > 0 ? \"start\" as const : \"end\" as const };\n });\n const rings = Array.from({ length: levels }, (_, level) => {\n const r = outer * (level + 1) / levels;\n return axes.map((axis, i) => { const p = polar(cx, cy, r, axis.angle); return `${i ? \"L\" : \"M\"}${fixed(p.x)},${fixed(p.y)}`; }).join(\"\") + \"Z\";\n });\n const polygons = series.map((item, seriesIndex) => {\n const points = axes.map(axis => {\n const value = item.values[axis.index] ?? null;\n const ratio = isChartNumber(value) ? Math.max(0, Math.min(1, (value - min) / ((max - min) || 1))) : 0;\n return { ...polar(cx, cy, outer * ratio, axis.angle), index: axis.index, value: isChartNumber(value) ? value : null };\n });\n return { seriesIndex, points, path: points.map((p, i) => `${i ? \"L\" : \"M\"}${fixed(p.x)},${fixed(p.y)}`).join(\"\") + \"Z\" };\n });\n return { axes, rings, polygons };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Scatter\n// ---------------------------------------------------------------------------------------------\n\nexport type ScatterDatum = Readonly<{ id: string; label: string; x: number; y: number; seriesIndex?: number }>;\nexport type ScatterGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n xDomain: readonly [number, number]; yDomain: readonly [number, number];\n xTicks: readonly number[]; yTicks: readonly number[];\n points: readonly (ScatterDatum & { px: number; py: number })[];\n}>;\nexport function resolveScatterGeometry({ points, width, height, insets = chartRecipe.insets.axis, xDomain, yDomain }: Readonly<{ points: readonly ScatterDatum[]; width: number; height: number; insets?: ChartInsets; xDomain?: readonly [number, number]; yDomain?: readonly [number, number] }>): ScatterGeometry {\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const xd = resolveChartDomain(points.map(p => p.x), { domain: xDomain, padding: 0.06 }), yd = resolveChartDomain(points.map(p => p.y), { domain: yDomain, padding: 0.06 });\n const sx = scaleLinear(xd, [plot.left, plot.right]), sy = scaleLinear(yd, [plot.bottom, plot.top]);\n return { plot, xDomain: xd, yDomain: yd, xTicks: niceTicks(xd[0], xd[1], 4), yTicks: niceTicks(yd[0], yd[1], 4), points: points.map(p => ({ ...p, px: sx(p.x), py: sy(p.y) })) };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Focus (scrub / press) and accessibility\n// ---------------------------------------------------------------------------------------------\n\n/** Category index whose x is closest to a pointer x, among categories that have any value. */\nexport function nearestChartIndex(xs: readonly number[], x: number, available?: readonly number[]): number | null {\n const candidates = available ?? xs.map((_, i) => i);\n let best: number | null = null, distance = Infinity;\n for (const index of candidates) {\n const d = Math.abs(xs[index]! - x);\n if (d < distance) { distance = d; best = index; }\n }\n return best;\n}\nexport function nearestScatterPoint(points: readonly Readonly<{ px: number; py: number }>[], x: number, y: number, maxDistance = 32): number | null {\n let best: number | null = null, distance = maxDistance * maxDistance;\n points.forEach((p, i) => { const d = (p.px - x) ** 2 + (p.py - y) ** 2; if (d <= distance) { distance = d; best = i; } });\n return best;\n}\n/** Adjustable-role step (VoiceOver swipe, arrow keys) over observed indices only. */\nexport function stepChartIndex(available: readonly number[], current: number | null, direction: 1 | -1): number | null {\n if (!available.length) return null;\n if (current === null) return direction > 0 ? available[0]! : available.at(-1)!;\n const position = available.indexOf(current);\n return available[Math.min(available.length - 1, Math.max(0, (position < 0 ? 0 : position) + direction))]!;\n}\nexport function observedIndices(series: readonly ChartSeries[]): number[] {\n const length = series[0]?.values.length ?? 0;\n return Array.from({ length }, (_, i) => i).filter(i => series.some(item => isChartNumber(item.values[i])));\n}\n/** Index of the highest and lowest observation of one series (stock-chart high/low markers). */\nexport function seriesExtremes(values: readonly ChartValue[]): Readonly<{ max: number; min: number }> | null {\n let max = -1, min = -1;\n values.forEach((value, i) => {\n if (!isChartNumber(value)) return;\n if (max < 0 || value > values[max]!) max = i;\n if (min < 0 || value < values[min]!) min = i;\n });\n return max < 0 ? null : { max, min };\n}\n\n/**\n * Text alternative for an image-like chart: every category's values in order, product-formatted.\n * Products pass localized `format`; HJM never formats numbers into a language itself.\n */\nexport function describeChart(categories: readonly string[], series: readonly ChartSeries[], format: (value: number) => string, missing: string): string {\n return series.map(item => `${item.label}: ${categories.map((category, i) => { const v = item.values[i]; return `${category} ${isChartNumber(v) ? format(v) : missing}`; }).join(\", \")}`).join(\". \");\n}\n\nexport const chartBehavior = {\n controlled: [\"focusIndex\"],\n inputs: [\"categories\", \"series\", \"kind\", \"orientation\", \"layout\", \"domain\", \"invert\", \"curve\"],\n events: [\"onFocusChange\"],\n configuration: { curve: [\"linear\", \"monotone\", \"step\"], orientation: [\"vertical\", \"horizontal\"], layout: [\"grouped\", \"stacked\"] },\n defaults: { curve: \"linear\", orientation: \"vertical\", layout: \"grouped\" },\n stateAxes: { value: [\"focused\", \"scrubbing\"], content: [\"idle\", \"empty\"] },\n web: { roles: [\"img\", \"slider\"], keyboard: [\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"], focus: \"native\" },\n native: { roles: [\"adjustable\", \"image\"], states: [], actions: [\"increment\", \"decrement\"] },\n scenarios: [\n \"missing-values-split-the-line-instead-of-drawing-zero\",\n \"bars-and-stacks-always-include-a-zero-baseline\",\n \"inverted-scale-puts-the-best-rank-on-top\",\n \"scrubbing-reports-the-focused-index-and-releasing-restores-the-latest\",\n \"the-focused-point-is-reachable-without-a-drag-via-adjustable-or-arrow-keys\",\n \"series-colors-come-from-the-product-or-the-dataviz-palette-never-status-colors\",\n \"every-chart-exposes-a-product-formatted-text-alternative\",\n \"radar-axes-share-one-domain\",\n \"pie-slices-ignore-negative-and-missing-values\",\n ],\n} as const satisfies BehaviorContract;\n\n/** Excluding a slice changes the denominator; selecting one only emphasizes it (Lucian 097). */\nexport function resolvePieVisibility(data: readonly Readonly<{ id: string; value: number | null }>[], excludedIds: readonly string[] = []) {\n const ids = new Set(data.map(datum => datum.id)), excluded = new Set(excludedIds);\n if (ids.size !== data.length || data.some(datum => !datum.id.trim())) throw new TypeError(\"Pie data requires distinct nonempty ids\");\n if (excluded.size !== excludedIds.length || excludedIds.some(id => !ids.has(id))) throw new TypeError(\"Excluded pie ids must be distinct known ids\");\n // Keep the existing geometry contract: negative/nonfinite/missing values never enter a share.\n const values = data.map(datum => excluded.has(datum.id) || !isChartNumber(datum.value) || datum.value < 0 ? null : datum.value);\n const total = values.reduce<number>((sum, value) => sum + (value ?? 0), 0);\n if (!Number.isFinite(total)) throw new RangeError(\"Pie total must be finite\");\n return { values, total, includedCount: data.length - excluded.size, observedCount: values.filter(value => value !== null).length };\n}\nexport type PieVisibilitySummary = ReturnType<typeof resolvePieVisibility>;\n\n/** Match both actual polyline vertices before period morphing. Union knots preserve\n * every observation for linear paths; work is bounded by the caller for large data. */\nexport function prepareChartLineMorph(from: readonly XY[], to: readonly XY[]) {\n if (from.length < 2 || to.length < 2) return null;\n const knots = [...new Set([...from.map((_, i) => i / (from.length - 1)), ...to.map((_, i) => i / (to.length - 1))])].sort((a, b) => a - b);\n const sample = (points: readonly XY[], position: number): XY => {\n const index = position * (points.length - 1), start = Math.floor(index), end = Math.min(points.length - 1, start + 1), t = index - start;\n return { x: points[start]!.x + (points[end]!.x - points[start]!.x) * t, y: points[start]!.y + (points[end]!.y - points[start]!.y) * t };\n };\n const first = knots.map(k => sample(from, k)), last = knots.map(k => sample(to, k));\n return (progress: number): XY[] => {\n const t = Math.max(0, Math.min(1, progress));\n return first.map((point, i) => ({ x: point.x + (last[i]!.x - point.x) * t, y: point.y + (last[i]!.y - point.y) * t }));\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport { datavizChromeTokens } from \"./dataviz.js\";\nimport { radius, spacing, stroke } from \"./foundations.js\";\n\n/**\n * Chart geometry contract (2026-10-14, user request: \"absorb the well-known chart libraries into our\n * system\"). Until 1.20 HJM only shipped dataviz *tokens* and delegated drawing to product libraries\n * (see docs/chart.md for the earlier decision). Products then rebuilt the same scrubbing line chart,\n * bars, and stat tables separately (Yajalal's StockChart/RecordTable), so drawing moves into HJM.\n *\n * Everything here is renderer-neutral math: both the Web (SVG DOM) and Native (react-native-svg)\n * renderers receive the same coordinates, paths and accessibility summaries and only paint them.\n * The public shapes were studied from — not copied from — these MIT/ISC libraries:\n * - react-native-wagmi-charts: line + cursor crosshair, price/datetime text driven by the focused index\n * - victory-native (XL): CartesianChart x/y keys, chart press state, rounded bars, domain padding\n * - react-native-gifted-charts: bar/line/pie/radar props (focus on press, stacked bars, donut center)\n * - Recharts: series/category data model, stacking, nice ticks, radar polar grid\n * - d3-shape / d3-scale: monotone-X cubic curve (Fritsch–Carlson) and \"nice\" tick steps (algorithms\n * re-derived here; no source is vendored)\n */\n\nexport type ChartValue = number | null;\n\nexport type ChartSeries = Readonly<{\n id: string;\n /** Visible legend text and the series' accessible name. Product-localized. */\n label: string;\n /** One value per category; `null` is a missing observation (drawn as a gap, never as zero). */\n values: readonly ChartValue[];\n /** Product-owned series color; renderers fall back to the dataviz series palette by index. */\n color?: string;\n}>;\n\nexport type ChartInsets = Readonly<{ top: number; right: number; bottom: number; left: number }>;\nexport type ChartCurve = \"linear\" | \"monotone\" | \"step\";\nexport type ChartOrientation = \"vertical\" | \"horizontal\";\nexport type ChartBarLayout = \"grouped\" | \"stacked\";\n/**\n * ChartLegend arrangement (2026-10-23). `stack`: one row per series (32 minimum row, values aligned at the end).\n * `inline`: entries flow on one line and wrap — a compact key under a map or chart. Choose-window's map legend could\n * not adopt ChartLegend because Native only stacked rows.\n */\nexport type ChartLegendLayout = \"stack\" | \"inline\";\n\nexport type ChartPlot = Readonly<{ index: number; seriesIndex: number; x: number; y: number; value: number }>;\n\nexport const chartRecipe = {\n heights: { sparkline: 28, compact: 128, regular: 180, tall: 240 },\n insets: {\n plot: { top: spacing.lg, right: spacing.xs, bottom: spacing.xs, left: spacing.xs },\n axis: { top: spacing.md, right: spacing.xs, bottom: spacing.lg, left: 36 },\n },\n line: { strokeWidth: 2.4, pointRadius: 4.5, focusHaloRadius: 9, focusHaloOpacity: 0.25, missingDash: [1, 5] as const, missingOpacity: 0.55 },\n area: { topOpacity: 0.32, bottomOpacity: 0 },\n bar: { radius: radius.sm / 2, maxWidth: 28, bandPadding: 0.36, groupGap: 2, restOpacity: 0.4 },\n pie: { donutRatio: 0.62, padAngle: 0.012, minLabelPercent: 4 },\n radar: { levels: 4, strokeWidth: 2, fillOpacity: 0.22, labelOffset: spacing.sm },\n scatter: { radius: 5, focusRadius: 8 },\n sparkline: { width: 72, height: 28, strokeWidth: 1.8, padding: 2 },\n cursor: { strokeWidth: stroke.subtle, dash: [2, 3] as const },\n reference: { dash: [2, 4] as const },\n /**\n * ChartLegend geometry shared by both renderers. `itemGap` separates swatch, label and value inside one entry;\n * `inline` puts `columnGap` between entries and `rowGap` between wrapped lines. The values are the ones Web already\n * drew for its passive legend, now also used by Native.\n */\n legend: {\n swatch: { size: 10, radius: 3 },\n itemGap: spacing.xs,\n dimmedOpacity: 0.5,\n layouts: {\n stack: { rowGap: spacing.xxs, rowMinHeight: 32 },\n inline: { rowGap: spacing.xxs, columnGap: spacing.md },\n },\n },\n chrome: datavizChromeTokens,\n} as const;\n\nexport function validateChartLegendLayout(value: unknown): asserts value is ChartLegendLayout {\n if (value !== \"stack\" && value !== \"inline\") throw new TypeError(`Unsupported ChartLegend layout: ${String(value)}`);\n}\n\n// ---------------------------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------------------------\n\nexport function validateChartSeries(categories: readonly string[], series: readonly ChartSeries[]): void {\n if (series.length === 0) throw new TypeError(\"Chart needs at least one series\");\n const ids = new Set<string>();\n for (const item of series) {\n if (!item.id.trim()) throw new TypeError(\"Chart series id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate chart series id: ${item.id}`);\n ids.add(item.id);\n if (!item.label.trim()) throw new TypeError(`Chart series \"${item.id}\" label must not be empty`);\n if (item.values.length !== categories.length) {\n throw new RangeError(`Chart series \"${item.id}\" has ${item.values.length} values for ${categories.length} categories`);\n }\n }\n}\n\nexport const isChartNumber = (value: ChartValue | undefined): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n// ---------------------------------------------------------------------------------------------\n// Scales and ticks\n// ---------------------------------------------------------------------------------------------\n\n/** \"Nice\" step (1, 2, 2.5, 5 × 10^n) so axis labels read like 0/25/50 rather than 0/23.7/47.4. */\nexport function niceStep(span: number, count: number): number {\n if (!(span > 0) || count < 1) return 1;\n const raw = span / count, power = 10 ** Math.floor(Math.log10(raw)), ratio = raw / power;\n const nice = ratio <= 1 ? 1 : ratio <= 2 ? 2 : ratio <= 2.5 ? 2.5 : ratio <= 5 ? 5 : 10;\n return nice * power;\n}\n\nexport function niceTicks(min: number, max: number, count = 4): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [];\n if (min === max) return [min];\n const step = niceStep(max - min, count), start = Math.ceil(min / step - 1e-9) * step;\n const ticks: number[] = [];\n for (let tick = start; tick <= max + step * 1e-9; tick += step) ticks.push(Number(tick.toPrecision(12)));\n return ticks;\n}\n\nexport type ChartDomainOptions = Readonly<{ domain?: readonly [number, number] | undefined; includeZero?: boolean | undefined; nice?: boolean | undefined; padding?: number | undefined }>;\n/**\n * Value domain. Lines zoom to the observed range (stock charts) unless `includeZero`; bars always\n * include zero so heights compare honestly. `padding` widens a flat series so it is not drawn on an edge.\n */\nexport function resolveChartDomain(values: readonly ChartValue[], { domain, includeZero = false, nice = false, padding = 0 }: ChartDomainOptions = {}): readonly [number, number] {\n if (domain) return domain;\n const observed = values.filter(isChartNumber);\n if (!observed.length) return [0, 1];\n let min = Math.min(...observed), max = Math.max(...observed);\n if (includeZero) { min = Math.min(0, min); max = Math.max(0, max); }\n if (min === max) { const pad = Math.abs(min) * 0.1 || 1; min -= pad; max += pad; }\n if (padding > 0) { const pad = (max - min) * padding; if (!(includeZero && min === 0)) min -= pad; max += pad; }\n if (nice) { const step = niceStep(max - min, 4); min = Math.floor(min / step) * step; max = Math.ceil(max / step) * step; }\n return [min, max];\n}\n\n/** Linear scale from value domain to pixel range; `invert` puts the minimum at the top (ranks, ERA). */\nexport function scaleLinear(domain: readonly [number, number], range: readonly [number, number], invert = false): (value: number) => number {\n const [d0, d1] = domain, [r0, r1] = invert ? [range[1], range[0]] : range, span = d1 - d0;\n return value => span === 0 ? (r0 + r1) / 2 : r0 + (value - d0) / span * (r1 - r0);\n}\n\nexport type ChartBand = Readonly<{ step: number; bandwidth: number; start(index: number): number; center(index: number): number }>;\nexport function scaleBand(count: number, range: readonly [number, number], padding: number = chartRecipe.bar.bandPadding): ChartBand {\n const length = range[1] - range[0], step = count > 0 ? length / count : 0, bandwidth = step * (1 - padding);\n return { step, bandwidth, start: index => range[0] + index * step + (step - bandwidth) / 2, center: index => range[0] + index * step + step / 2 };\n}\n\n/** Evenly spaced x positions for line/area categories (first and last on the plot edges). */\nexport function pointPositions(count: number, range: readonly [number, number]): number[] {\n if (count <= 1) return [Math.round((range[0] + range[1]) / 2)];\n const step = (range[1] - range[0]) / (count - 1);\n return Array.from({ length: count }, (_, i) => range[0] + i * step);\n}\n\n// ---------------------------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------------------------\n\nconst fixed = (value: number) => Number(value.toFixed(2));\ntype XY = Readonly<{ x: number; y: number }>;\n\n/** Monotone-X cubic (Fritsch–Carlson): smooth without overshooting the data, like d3.curveMonotoneX. */\nfunction monotoneTangents(points: readonly XY[]): number[] {\n const n = points.length, slopes: number[] = [], tangents: number[] = new Array(n).fill(0);\n for (let i = 0; i < n - 1; i++) slopes.push((points[i + 1]!.y - points[i]!.y) / ((points[i + 1]!.x - points[i]!.x) || 1));\n tangents[0] = slopes[0] ?? 0; tangents[n - 1] = slopes[n - 2] ?? 0;\n for (let i = 1; i < n - 1; i++) tangents[i] = slopes[i - 1]! * slopes[i]! <= 0 ? 0 : (slopes[i - 1]! + slopes[i]!) / 2;\n for (let i = 0; i < n - 1; i++) {\n if (slopes[i] === 0) { tangents[i] = 0; tangents[i + 1] = 0; continue; }\n const a = tangents[i]! / slopes[i]!, b = tangents[i + 1]! / slopes[i]!, h = a * a + b * b;\n if (h > 9) { const t = 3 / Math.sqrt(h); tangents[i] = t * a * slopes[i]!; tangents[i + 1] = t * b * slopes[i]!; }\n }\n return tangents;\n}\n\nexport function linePath(points: readonly XY[], curve: ChartCurve = \"linear\"): string {\n if (!points.length) return \"\";\n const head = `M${fixed(points[0]!.x)},${fixed(points[0]!.y)}`;\n if (points.length === 1) return head;\n if (curve === \"step\") return head + points.slice(1).map((p, i) => `H${fixed((points[i]!.x + p.x) / 2)}V${fixed(p.y)}H${fixed(p.x)}`).join(\"\");\n if (curve === \"monotone\" && points.length > 2) {\n const t = monotoneTangents(points);\n return head + points.slice(1).map((p, i) => {\n const a = points[i]!, dx = (p.x - a.x) / 3;\n return `C${fixed(a.x + dx)},${fixed(a.y + dx * t[i]!)} ${fixed(p.x - dx)},${fixed(p.y - dx * t[i + 1]!)} ${fixed(p.x)},${fixed(p.y)}`;\n }).join(\"\");\n }\n return head + points.slice(1).map(p => `L${fixed(p.x)},${fixed(p.y)}`).join(\"\");\n}\n\n/** Closed area under a line down to `floor` (or between two edges for stacked areas via `lower`). */\nexport function areaPath(points: readonly XY[], floor: number, curve: ChartCurve = \"linear\", lower?: readonly XY[]): string {\n if (points.length < 2) return \"\";\n const top = linePath(points, curve);\n if (lower && lower.length === points.length) {\n const back = linePath([...lower].reverse(), curve).replace(/^M/, \"L\");\n return `${top}${back}Z`;\n }\n return `${top}L${fixed(points.at(-1)!.x)},${fixed(floor)}L${fixed(points[0]!.x)},${fixed(floor)}Z`;\n}\n\n/** Splits a series at missing values: a skipped month is a gap, never an interpolated trend. */\nexport function splitSegments<T extends { value: number } | null>(plots: readonly T[]): Exclude<T, null>[][] {\n const segments: Exclude<T, null>[][] = [];\n let current: Exclude<T, null>[] = [];\n for (const plot of plots) {\n if (plot === null) { if (current.length) segments.push(current); current = []; continue; }\n current.push(plot as Exclude<T, null>);\n }\n if (current.length) segments.push(current);\n return segments;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cartesian: line / area\n// ---------------------------------------------------------------------------------------------\n\nexport type LineGeometryInput = Readonly<{\n categories: readonly string[];\n series: readonly ChartSeries[];\n width: number;\n height: number;\n insets?: ChartInsets;\n invert?: boolean;\n stacked?: boolean;\n} & ChartDomainOptions>;\n\nexport type LineGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n domain: readonly [number, number];\n ticks: readonly number[];\n xs: readonly number[];\n y(value: number): number;\n /** Per series, per category: the plotted point or null for a gap. */\n plots: readonly (readonly (ChartPlot | null)[])[];\n /** Stacked areas: the lower edge per series (previous cumulative). */\n lower: readonly (readonly (ChartPlot | null)[])[] | null;\n}>;\n\nexport function resolveLineGeometry({ categories, series, width, height, insets = chartRecipe.insets.plot, invert = false, stacked = false, ...domainOptions }: LineGeometryInput): LineGeometry {\n validateChartSeries(categories, series);\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const totals = stacked ? stackValues(series) : null;\n const domainValues = totals ? totals.flatMap(row => row.map(cell => cell?.[1] ?? null)) : series.flatMap(item => item.values);\n const domain = resolveChartDomain(domainValues, { includeZero: stacked || domainOptions.includeZero, ...domainOptions });\n const y = scaleLinear(domain, [plot.bottom, plot.top], invert);\n const xs = pointPositions(categories.length, [plot.left, plot.right]);\n const plots = series.map((item, s) => item.values.map((value, i) => {\n const top = totals ? totals[s]![i]?.[1] : value;\n return isChartNumber(value) && isChartNumber(top) ? { index: i, seriesIndex: s, x: xs[i]!, y: y(top), value } : null;\n }));\n const lower = totals ? series.map((_, s) => categories.map((__, i) => { const cell = totals[s]![i]; return cell ? { index: i, seriesIndex: s, x: xs[i]!, y: y(cell[0]), value: cell[0] } : null; })) : null;\n return { plot, domain, ticks: niceTicks(domain[0], domain[1], 4), xs, y, plots, lower };\n}\n\n/** Cumulative [lower, upper] per series per category; missing values do not add to the stack. */\nexport function stackValues(series: readonly ChartSeries[]): (readonly [number, number] | null)[][] {\n const length = series[0]?.values.length ?? 0, positive = new Array<number>(length).fill(0), negative = new Array<number>(length).fill(0);\n return series.map(item => item.values.map((value, i) => {\n if (!isChartNumber(value)) return null;\n const base = value >= 0 ? positive[i]! : negative[i]!, top = base + value;\n if (value >= 0) positive[i] = top; else negative[i] = top;\n return [base, top] as const;\n }));\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cartesian: bars\n// ---------------------------------------------------------------------------------------------\n\nexport type ChartBar = Readonly<{ index: number; seriesIndex: number; value: number; x: number; y: number; width: number; height: number }>;\nexport type BarGeometryInput = Readonly<{\n categories: readonly string[];\n series: readonly ChartSeries[];\n width: number;\n height: number;\n insets?: ChartInsets;\n orientation?: ChartOrientation;\n layout?: ChartBarLayout;\n} & ChartDomainOptions>;\nexport type BarGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n domain: readonly [number, number];\n ticks: readonly number[];\n bars: readonly ChartBar[];\n /** Category band centers along the category axis (x for vertical, y for horizontal). */\n centers: readonly number[];\n value(value: number): number;\n}>;\n\nexport function resolveBarGeometry({ categories, series, width, height, insets = chartRecipe.insets.plot, orientation = \"vertical\", layout = \"grouped\", ...domainOptions }: BarGeometryInput): BarGeometry {\n validateChartSeries(categories, series);\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const stacks = layout === \"stacked\" ? stackValues(series) : null;\n const values = stacks ? stacks.flatMap(row => row.flatMap(cell => cell ? [cell[0], cell[1]] : [])) : series.flatMap(item => item.values);\n const domain = resolveChartDomain(values, { includeZero: true, ...domainOptions });\n const vertical = orientation === \"vertical\";\n const valueScale = vertical ? scaleLinear(domain, [plot.bottom, plot.top]) : scaleLinear(domain, [plot.left, plot.right]);\n const band = scaleBand(categories.length, vertical ? [plot.left, plot.right] : [plot.top, plot.bottom]);\n const thickness = Math.min(chartRecipe.bar.maxWidth * (layout === \"grouped\" ? series.length : 1), band.bandwidth);\n const each = layout === \"grouped\" ? Math.max(1, (thickness - chartRecipe.bar.groupGap * (series.length - 1)) / series.length) : thickness;\n const bars: ChartBar[] = [];\n series.forEach((item, s) => item.values.forEach((value, i) => {\n if (!isChartNumber(value)) return;\n const [from, to] = stacks ? stacks[s]![i]! : [0, value];\n const a = valueScale(from), b = valueScale(to);\n const offset = band.center(i) - thickness / 2 + (layout === \"grouped\" ? s * (each + chartRecipe.bar.groupGap) : 0);\n bars.push(vertical\n ? { index: i, seriesIndex: s, value, x: offset, y: Math.min(a, b), width: each, height: Math.max(1, Math.abs(a - b)) }\n : { index: i, seriesIndex: s, value, x: Math.min(a, b), y: offset, width: Math.max(1, Math.abs(a - b)), height: each });\n }));\n return { plot, domain, ticks: niceTicks(domain[0], domain[1], 4), bars, centers: categories.map((_, i) => band.center(i)), value: valueScale };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Polar: pie / donut / radar\n// ---------------------------------------------------------------------------------------------\n\nexport type PieSlice = Readonly<{ index: number; value: number; percent: number; startAngle: number; endAngle: number; path: string; centroid: XY }>;\nconst polar = (cx: number, cy: number, r: number, angle: number): XY => ({ x: cx + r * Math.sin(angle), y: cy - r * Math.cos(angle) });\n\n/** Annular sector from 12 o'clock clockwise. `innerRadius` 0 draws a pie wedge. */\nexport function arcPath(cx: number, cy: number, outerRadius: number, innerRadius: number, startAngle: number, endAngle: number): string {\n const sweep = endAngle - startAngle;\n if (sweep >= Math.PI * 2 - 1e-6) {\n // A full circle cannot be one arc command; draw two halves.\n const mid = startAngle + Math.PI;\n return arcPath(cx, cy, outerRadius, innerRadius, startAngle, mid) + arcPath(cx, cy, outerRadius, innerRadius, mid, endAngle);\n }\n const large = sweep > Math.PI ? 1 : 0;\n const o0 = polar(cx, cy, outerRadius, startAngle), o1 = polar(cx, cy, outerRadius, endAngle);\n if (innerRadius <= 0) return `M${fixed(cx)},${fixed(cy)}L${fixed(o0.x)},${fixed(o0.y)}A${fixed(outerRadius)},${fixed(outerRadius)} 0 ${large} 1 ${fixed(o1.x)},${fixed(o1.y)}Z`;\n const i1 = polar(cx, cy, innerRadius, endAngle), i0 = polar(cx, cy, innerRadius, startAngle);\n return `M${fixed(o0.x)},${fixed(o0.y)}A${fixed(outerRadius)},${fixed(outerRadius)} 0 ${large} 1 ${fixed(o1.x)},${fixed(o1.y)}L${fixed(i1.x)},${fixed(i1.y)}A${fixed(innerRadius)},${fixed(innerRadius)} 0 ${large} 0 ${fixed(i0.x)},${fixed(i0.y)}Z`;\n}\n\n/** Negative and missing values are excluded: a share of a whole cannot be negative. */\nexport function resolvePieGeometry(values: readonly ChartValue[], { cx, cy, radius: outer, innerRadius = 0, padAngle = chartRecipe.pie.padAngle }: Readonly<{ cx: number; cy: number; radius: number; innerRadius?: number; padAngle?: number }>): PieSlice[] {\n const total = values.reduce<number>((sum, value) => sum + (isChartNumber(value) && value > 0 ? value : 0), 0);\n if (total <= 0) return [];\n let angle = 0;\n const slices: PieSlice[] = [];\n values.forEach((value, index) => {\n if (!isChartNumber(value) || value <= 0) return;\n const sweep = value / total * Math.PI * 2, pad = slices.length || sweep < Math.PI * 2 ? Math.min(padAngle, sweep / 4) : 0;\n const start = angle + pad / 2, end = angle + sweep - pad / 2, mid = (start + end) / 2;\n slices.push({ index, value, percent: value / total * 100, startAngle: start, endAngle: end, path: arcPath(cx, cy, outer, innerRadius, start, end), centroid: polar(cx, cy, innerRadius > 0 ? (outer + innerRadius) / 2 : outer * 0.62, mid) });\n angle += sweep;\n });\n return slices;\n}\n\nexport type RadarAxis = Readonly<{ index: number; label: string; angle: number; end: XY; labelAt: XY; anchor: \"start\" | \"middle\" | \"end\" }>;\nexport type RadarGeometry = Readonly<{ axes: readonly RadarAxis[]; rings: readonly string[]; polygons: readonly Readonly<{ seriesIndex: number; path: string; points: readonly (XY & { index: number; value: number | null })[] }>[] }>;\n/**\n * Radar (spider) chart. All axes share one domain (0..max by default) because the products'\n * ratings are on one 0–100 scale; per-axis scales would make the polygon area meaningless.\n */\nexport function resolveRadarGeometry({ categories, series, cx, cy, radius: outer, domain, levels = chartRecipe.radar.levels, labelOffset = chartRecipe.radar.labelOffset }: Readonly<{ categories: readonly string[]; series: readonly ChartSeries[]; cx: number; cy: number; radius: number; domain?: readonly [number, number]; levels?: number; labelOffset?: number }>): RadarGeometry {\n validateChartSeries(categories, series);\n if (categories.length < 3) throw new RangeError(\"Radar chart needs at least three axes\");\n const [min, max] = domain ?? [0, Math.max(...series.flatMap(item => item.values.filter(isChartNumber)), 1)];\n const step = Math.PI * 2 / categories.length;\n const axes = categories.map((label, index) => {\n const angle = index * step, end = polar(cx, cy, outer, angle), labelAt = polar(cx, cy, outer + labelOffset, angle);\n const sin = Math.sin(angle);\n return { index, label, angle, end, labelAt, anchor: Math.abs(sin) < 0.2 ? \"middle\" as const : sin > 0 ? \"start\" as const : \"end\" as const };\n });\n const rings = Array.from({ length: levels }, (_, level) => {\n const r = outer * (level + 1) / levels;\n return axes.map((axis, i) => { const p = polar(cx, cy, r, axis.angle); return `${i ? \"L\" : \"M\"}${fixed(p.x)},${fixed(p.y)}`; }).join(\"\") + \"Z\";\n });\n const polygons = series.map((item, seriesIndex) => {\n const points = axes.map(axis => {\n const value = item.values[axis.index] ?? null;\n const ratio = isChartNumber(value) ? Math.max(0, Math.min(1, (value - min) / ((max - min) || 1))) : 0;\n return { ...polar(cx, cy, outer * ratio, axis.angle), index: axis.index, value: isChartNumber(value) ? value : null };\n });\n return { seriesIndex, points, path: points.map((p, i) => `${i ? \"L\" : \"M\"}${fixed(p.x)},${fixed(p.y)}`).join(\"\") + \"Z\" };\n });\n return { axes, rings, polygons };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Scatter\n// ---------------------------------------------------------------------------------------------\n\nexport type ScatterDatum = Readonly<{ id: string; label: string; x: number; y: number; seriesIndex?: number }>;\nexport type ScatterGeometry = Readonly<{\n plot: Readonly<{ left: number; right: number; top: number; bottom: number }>;\n xDomain: readonly [number, number]; yDomain: readonly [number, number];\n xTicks: readonly number[]; yTicks: readonly number[];\n points: readonly (ScatterDatum & { px: number; py: number })[];\n}>;\nexport function resolveScatterGeometry({ points, width, height, insets = chartRecipe.insets.axis, xDomain, yDomain }: Readonly<{ points: readonly ScatterDatum[]; width: number; height: number; insets?: ChartInsets; xDomain?: readonly [number, number]; yDomain?: readonly [number, number] }>): ScatterGeometry {\n const plot = { left: insets.left, right: width - insets.right, top: insets.top, bottom: height - insets.bottom };\n const xd = resolveChartDomain(points.map(p => p.x), { domain: xDomain, padding: 0.06 }), yd = resolveChartDomain(points.map(p => p.y), { domain: yDomain, padding: 0.06 });\n const sx = scaleLinear(xd, [plot.left, plot.right]), sy = scaleLinear(yd, [plot.bottom, plot.top]);\n return { plot, xDomain: xd, yDomain: yd, xTicks: niceTicks(xd[0], xd[1], 4), yTicks: niceTicks(yd[0], yd[1], 4), points: points.map(p => ({ ...p, px: sx(p.x), py: sy(p.y) })) };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Focus (scrub / press) and accessibility\n// ---------------------------------------------------------------------------------------------\n\n/** Category index whose x is closest to a pointer x, among categories that have any value. */\nexport function nearestChartIndex(xs: readonly number[], x: number, available?: readonly number[]): number | null {\n const candidates = available ?? xs.map((_, i) => i);\n let best: number | null = null, distance = Infinity;\n for (const index of candidates) {\n const d = Math.abs(xs[index]! - x);\n if (d < distance) { distance = d; best = index; }\n }\n return best;\n}\nexport function nearestScatterPoint(points: readonly Readonly<{ px: number; py: number }>[], x: number, y: number, maxDistance = 32): number | null {\n let best: number | null = null, distance = maxDistance * maxDistance;\n points.forEach((p, i) => { const d = (p.px - x) ** 2 + (p.py - y) ** 2; if (d <= distance) { distance = d; best = i; } });\n return best;\n}\n/** Adjustable-role step (VoiceOver swipe, arrow keys) over observed indices only. */\nexport function stepChartIndex(available: readonly number[], current: number | null, direction: 1 | -1): number | null {\n if (!available.length) return null;\n if (current === null) return direction > 0 ? available[0]! : available.at(-1)!;\n const position = available.indexOf(current);\n return available[Math.min(available.length - 1, Math.max(0, (position < 0 ? 0 : position) + direction))]!;\n}\nexport function observedIndices(series: readonly ChartSeries[]): number[] {\n const length = series[0]?.values.length ?? 0;\n return Array.from({ length }, (_, i) => i).filter(i => series.some(item => isChartNumber(item.values[i])));\n}\n/** Index of the highest and lowest observation of one series (stock-chart high/low markers). */\nexport function seriesExtremes(values: readonly ChartValue[]): Readonly<{ max: number; min: number }> | null {\n let max = -1, min = -1;\n values.forEach((value, i) => {\n if (!isChartNumber(value)) return;\n if (max < 0 || value > values[max]!) max = i;\n if (min < 0 || value < values[min]!) min = i;\n });\n return max < 0 ? null : { max, min };\n}\n\n/**\n * Text alternative for an image-like chart: every category's values in order, product-formatted.\n * Products pass localized `format`; HJM never formats numbers into a language itself.\n */\nexport function describeChart(categories: readonly string[], series: readonly ChartSeries[], format: (value: number) => string, missing: string): string {\n return series.map(item => `${item.label}: ${categories.map((category, i) => { const v = item.values[i]; return `${category} ${isChartNumber(v) ? format(v) : missing}`; }).join(\", \")}`).join(\". \");\n}\n\nexport const chartBehavior = {\n controlled: [\"focusIndex\"],\n inputs: [\"categories\", \"series\", \"kind\", \"orientation\", \"layout\", \"domain\", \"invert\", \"curve\"],\n events: [\"onFocusChange\"],\n configuration: { curve: [\"linear\", \"monotone\", \"step\"], orientation: [\"vertical\", \"horizontal\"], layout: [\"grouped\", \"stacked\"] },\n defaults: { curve: \"linear\", orientation: \"vertical\", layout: \"grouped\" },\n stateAxes: { value: [\"focused\", \"scrubbing\"], content: [\"idle\", \"empty\"] },\n web: { roles: [\"img\", \"slider\"], keyboard: [\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"], focus: \"native\" },\n native: { roles: [\"adjustable\", \"image\"], states: [], actions: [\"increment\", \"decrement\"] },\n scenarios: [\n \"missing-values-split-the-line-instead-of-drawing-zero\",\n \"bars-and-stacks-always-include-a-zero-baseline\",\n \"inverted-scale-puts-the-best-rank-on-top\",\n \"scrubbing-reports-the-focused-index-and-releasing-restores-the-latest\",\n \"the-focused-point-is-reachable-without-a-drag-via-adjustable-or-arrow-keys\",\n \"series-colors-come-from-the-product-or-the-dataviz-palette-never-status-colors\",\n \"every-chart-exposes-a-product-formatted-text-alternative\",\n \"radar-axes-share-one-domain\",\n \"pie-slices-ignore-negative-and-missing-values\",\n ],\n} as const satisfies BehaviorContract;\n\n/** Excluding a slice changes the denominator; selecting one only emphasizes it (Lucian 097). */\nexport function resolvePieVisibility(data: readonly Readonly<{ id: string; value: number | null }>[], excludedIds: readonly string[] = []) {\n const ids = new Set(data.map(datum => datum.id)), excluded = new Set(excludedIds);\n if (ids.size !== data.length || data.some(datum => !datum.id.trim())) throw new TypeError(\"Pie data requires distinct nonempty ids\");\n if (excluded.size !== excludedIds.length || excludedIds.some(id => !ids.has(id))) throw new TypeError(\"Excluded pie ids must be distinct known ids\");\n // Keep the existing geometry contract: negative/nonfinite/missing values never enter a share.\n const values = data.map(datum => excluded.has(datum.id) || !isChartNumber(datum.value) || datum.value < 0 ? null : datum.value);\n const total = values.reduce<number>((sum, value) => sum + (value ?? 0), 0);\n if (!Number.isFinite(total)) throw new RangeError(\"Pie total must be finite\");\n return { values, total, includedCount: data.length - excluded.size, observedCount: values.filter(value => value !== null).length };\n}\nexport type PieVisibilitySummary = ReturnType<typeof resolvePieVisibility>;\n\n/** Match both actual polyline vertices before period morphing. Union knots preserve\n * every observation for linear paths; work is bounded by the caller for large data. */\nexport function prepareChartLineMorph(from: readonly XY[], to: readonly XY[]) {\n if (from.length < 2 || to.length < 2) return null;\n const knots = [...new Set([...from.map((_, i) => i / (from.length - 1)), ...to.map((_, i) => i / (to.length - 1))])].sort((a, b) => a - b);\n const sample = (points: readonly XY[], position: number): XY => {\n const index = position * (points.length - 1), start = Math.floor(index), end = Math.min(points.length - 1, start + 1), t = index - start;\n return { x: points[start]!.x + (points[end]!.x - points[start]!.x) * t, y: points[start]!.y + (points[end]!.y - points[start]!.y) * t };\n };\n const first = knots.map(k => sample(from, k)), last = knots.map(k => sample(to, k));\n return (progress: number): XY[] => {\n const t = Math.max(0, Math.min(1, progress));\n return first.map((point, i) => ({ x: point.x + (last[i]!.x - point.x) * t, y: point.y + (last[i]!.y - point.y) * t }));\n };\n}\n"]}
|
|
@@ -2,14 +2,26 @@ export type CollectionRailItem<Id extends string = string> = Readonly<{
|
|
|
2
2
|
id: Id;
|
|
3
3
|
label: string;
|
|
4
4
|
}>;
|
|
5
|
-
export type CollectionRailDensity = "compact" | "comfortable";
|
|
5
|
+
export type CollectionRailDensity = "compact" | "comfortable" | "chip";
|
|
6
6
|
export type CollectionRailIntent = "previous" | "next" | "first" | "last";
|
|
7
7
|
export declare const collectionRailRecipe: {
|
|
8
|
+
/**
|
|
9
|
+
* `chip` (2026-10-23): Yajalal's home strip of 145pt mini scoreboards used a raw ScrollView because every rail item
|
|
10
|
+
* took card width (240+). Chips are uniform, so a narrow step keeps the shared one-stride geometry; content-sized
|
|
11
|
+
* items were not added because previous/next, the start anchor and focus reveal step by a single item width.
|
|
12
|
+
*/
|
|
8
13
|
readonly itemMaxWidth: {
|
|
9
14
|
readonly compact: number;
|
|
10
15
|
readonly comfortable: number;
|
|
16
|
+
readonly chip: number;
|
|
11
17
|
};
|
|
12
18
|
readonly gap: 16;
|
|
19
|
+
/** Gap per density as a spacing step (profile-aware on Native); chips sit closer than cards. */
|
|
20
|
+
readonly gapSteps: {
|
|
21
|
+
readonly compact: "md";
|
|
22
|
+
readonly comfortable: "md";
|
|
23
|
+
readonly chip: "xs";
|
|
24
|
+
};
|
|
13
25
|
readonly edgeHint: 24;
|
|
14
26
|
readonly defaults: {
|
|
15
27
|
readonly density: "comfortable";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-rail.d.ts","sourceRoot":"","sources":["../src/collection-rail.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAAE,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjG,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"collection-rail.d.ts","sourceRoot":"","sources":["../src/collection-rail.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAAE,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjG,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAI1E,eAAO,MAAM,oBAAoB;IAC/B;;;;OAIG;;;;;;;IAGH,gGAAgG;;;;;;;;;;CAIxF,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAC1G,CAAC,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtG;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA6D,EACvG,GAAG,GAAE,MAAgE,GACpE,oBAAoB,CAYtB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG9F;AAMD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;;;;;EAKzF;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAUhI;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/F;AAED,+EAA+E;AAC/E,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjH;AAED,qFAAqF;AACrF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAGrI;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,oBAAoB,GAAG,SAAS,CAMvH"}
|
package/dist/collection-rail.js
CHANGED
|
@@ -3,8 +3,15 @@ import { layout, spacing } from "./foundations.js";
|
|
|
3
3
|
// A finite rail exposes every item's independent actions. Carousel's single
|
|
4
4
|
// selected/inert panel is therefore not its state engine (docs/collection-rail.md).
|
|
5
5
|
export const collectionRailRecipe = {
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* `chip` (2026-10-23): Yajalal's home strip of 145pt mini scoreboards used a raw ScrollView because every rail item
|
|
8
|
+
* took card width (240+). Chips are uniform, so a narrow step keeps the shared one-stride geometry; content-sized
|
|
9
|
+
* items were not added because previous/next, the start anchor and focus reveal step by a single item width.
|
|
10
|
+
*/
|
|
11
|
+
itemMaxWidth: { compact: layout.readingMaxWidth / 3, comfortable: layout.readingMaxWidth / 2, chip: layout.readingMaxWidth / 5 },
|
|
7
12
|
gap: spacing.md,
|
|
13
|
+
/** Gap per density as a spacing step (profile-aware on Native); chips sit closer than cards. */
|
|
14
|
+
gapSteps: { compact: "md", comfortable: "md", chip: "xs" },
|
|
8
15
|
edgeHint: spacing.xl,
|
|
9
16
|
defaults: { density: "comfortable" },
|
|
10
17
|
};
|
|
@@ -14,7 +21,7 @@ export function validateCollectionRail(items, initialKey) {
|
|
|
14
21
|
throw new RangeError("CollectionRail defaultStartKey must identify an item");
|
|
15
22
|
}
|
|
16
23
|
}
|
|
17
|
-
export function resolveCollectionRailLayout(count, viewport, density = collectionRailRecipe.defaults.density, gap = collectionRailRecipe.
|
|
24
|
+
export function resolveCollectionRailLayout(count, viewport, density = collectionRailRecipe.defaults.density, gap = spacing[collectionRailRecipe.gapSteps[density] ?? "md"]) {
|
|
18
25
|
if (!Number.isSafeInteger(count) || count < 0)
|
|
19
26
|
throw new RangeError("CollectionRail count must be a nonnegative integer");
|
|
20
27
|
if (!Number.isFinite(viewport) || viewport < 0 || !Number.isFinite(gap) || gap < 0) {
|