@starci/grammar 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/common/index.d.ts +74 -0
  4. package/dist/common/index.d.ts.map +1 -0
  5. package/dist/common/index.js +203 -0
  6. package/dist/common/index.js.map +1 -0
  7. package/dist/common/styles.css +2 -0
  8. package/dist/core/StateMark.d.ts +6 -0
  9. package/dist/core/StateMark.d.ts.map +1 -0
  10. package/dist/core/StateMark.js +9 -0
  11. package/dist/core/StateMark.js.map +1 -0
  12. package/dist/core/branch/Rail/index.d.ts +17 -0
  13. package/dist/core/branch/Rail/index.d.ts.map +1 -0
  14. package/dist/core/branch/Rail/index.js +11 -0
  15. package/dist/core/branch/Rail/index.js.map +1 -0
  16. package/dist/core/branch/SurfaceCard/index.d.ts +34 -0
  17. package/dist/core/branch/SurfaceCard/index.d.ts.map +1 -0
  18. package/dist/core/branch/SurfaceCard/index.js +14 -0
  19. package/dist/core/branch/SurfaceCard/index.js.map +1 -0
  20. package/dist/core/branch/SurfaceListCard/index.d.ts +29 -0
  21. package/dist/core/branch/SurfaceListCard/index.d.ts.map +1 -0
  22. package/dist/core/branch/SurfaceListCard/index.js +16 -0
  23. package/dist/core/branch/SurfaceListCard/index.js.map +1 -0
  24. package/dist/core/contracts.d.ts +190 -0
  25. package/dist/core/contracts.d.ts.map +1 -0
  26. package/dist/core/contracts.js +91 -0
  27. package/dist/core/contracts.js.map +1 -0
  28. package/dist/core/grammar.d.ts +18 -0
  29. package/dist/core/grammar.d.ts.map +1 -0
  30. package/dist/core/grammar.js +27 -0
  31. package/dist/core/grammar.js.map +1 -0
  32. package/dist/core/index.d.ts +8 -0
  33. package/dist/core/index.d.ts.map +1 -0
  34. package/dist/core/index.js +8 -0
  35. package/dist/core/index.js.map +1 -0
  36. package/dist/core/rules.d.ts +45 -0
  37. package/dist/core/rules.d.ts.map +1 -0
  38. package/dist/core/rules.js +45 -0
  39. package/dist/core/rules.js.map +1 -0
  40. package/dist/core/state.d.ts +10 -0
  41. package/dist/core/state.d.ts.map +1 -0
  42. package/dist/core/state.js +24 -0
  43. package/dist/core/state.js.map +1 -0
  44. package/dist/core/styles.css +193 -0
  45. package/dist/offset-pop/index.d.ts +266 -0
  46. package/dist/offset-pop/index.d.ts.map +1 -0
  47. package/dist/offset-pop/index.js +69 -0
  48. package/dist/offset-pop/index.js.map +1 -0
  49. package/dist/offset-pop/styles.css +393 -0
  50. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 StarCi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # `@starci/grammar`
2
+
3
+ Business-neutral UI contracts and versioned StarCi Grammar bundles.
4
+
5
+ ## Public entry points
6
+
7
+ - `@starci/grammar/common` — contract kernel and runtime validation.
8
+ - `@starci/grammar/core` — generic StarCi owners and base contracts.
9
+ - `@starci/grammar/offset-pop` — one declared visual extension of Core.
10
+ - `@starci/grammar/common/styles.css`, `core/styles.css`, `offset-pop/styles.css` — canonical cascade entries. Short `.css` aliases are also exported.
11
+
12
+ Install this workspace package while it is under development. Published consumers must pin one
13
+ exact version rather than a range:
14
+
15
+ ```sh
16
+ npm install ./packages/grammar
17
+ # after publication: npm install --save-exact @starci/grammar@0.1.0
18
+ ```
19
+
20
+ ```ts
21
+ import { createContractRegistry } from "@starci/grammar/common"
22
+ import { CORE_COMPONENT_CONTRACTS } from "@starci/grammar/core"
23
+ import { offsetPopGrammar } from "@starci/grammar/offset-pop"
24
+ ```
25
+
26
+ ```css
27
+ @import "@starci/grammar/common/styles.css";
28
+ @import "@starci/grammar/core/styles.css";
29
+ @import "@starci/grammar/offset-pop/styles.css";
30
+ ```
31
+
32
+ `common` contains no React, Next.js, business entity, operation or domain state. A Product Block translates domain state into `PresentationState`; Grammar consumes only that neutral state.
33
+
34
+ Contracts are immutable. Extensions may resolve only axes explicitly opened by the base contract. They cannot replace anatomy, mutate a closed invariant, substitute the owner or silently replace a duplicate registry key.
35
+
36
+ ## Package checks
37
+
38
+ ```sh
39
+ npm run typecheck
40
+ npm test
41
+ npm pack --dry-run
42
+ ```
@@ -0,0 +1,74 @@
1
+ /** Render-neutral states accepted by Grammar contracts. Product Blocks own every domain mapping. */
2
+ export declare const PRESENTATION_STATES: readonly ["neutral", "informative", "affirmative", "cautionary", "negative", "pending", "unavailable"];
3
+ export type PresentationState = (typeof PRESENTATION_STATES)[number];
4
+ export declare const isPresentationState: (value: unknown) => value is PresentationState;
5
+ export declare const assertPresentationState: (value: unknown) => asserts value is PresentationState;
6
+ /** Package-owned component tiers. The spelling matches the public export topology. */
7
+ export type GrammarLayer = "leaves" | "branch" | "composites";
8
+ /** Contract boundaries that an extension can never reopen. */
9
+ export type ClosedContractChange = "anatomy" | "closed-invariant" | "owner-substitution";
10
+ /** The only dimensions on which a derived Grammar may supply values. */
11
+ export type GrammarExtensionPolicy<Axis extends string = string> = Readonly<{
12
+ allowedAxes: ReadonlyArray<Axis>;
13
+ forbiddenChanges: ReadonlyArray<ClosedContractChange>;
14
+ }>;
15
+ /** Business-neutral reusable owner contract. Additional package metadata must remain data-only. */
16
+ export type GrammarContractSpec<Axis extends string = string> = Readonly<{
17
+ version: string;
18
+ layer: GrammarLayer;
19
+ slots: ReadonlyArray<string>;
20
+ stateInputs: ReadonlyArray<string>;
21
+ variableAxes: ReadonlyArray<Axis>;
22
+ extensionPolicy: GrammarExtensionPolicy<Axis>;
23
+ closedInvariants: ReadonlyArray<string>;
24
+ }>;
25
+ /** One declared derivation. Every value key must have a matching requested axis. */
26
+ export type GrammarContractExtension<Axis extends string = string> = Readonly<{
27
+ id: string;
28
+ version: string;
29
+ base: Readonly<{
30
+ key: string;
31
+ version: string;
32
+ }>;
33
+ axes: ReadonlyArray<Axis>;
34
+ values: Readonly<Record<Axis, unknown>>;
35
+ }>;
36
+ /** Immutable provenance for a contract derived from another contract. */
37
+ export type GrammarContractBase = Readonly<{
38
+ key: string;
39
+ version: string;
40
+ rootKey: string;
41
+ rootVersion: string;
42
+ }>;
43
+ /** A closed, runtime-validated contract value. */
44
+ export type GrammarContract<Key extends string = string, Spec extends GrammarContractSpec = GrammarContractSpec> = Readonly<{
45
+ key: Key;
46
+ version: string;
47
+ spec: Readonly<Spec>;
48
+ base: GrammarContractBase | null;
49
+ resolvedAxes: Readonly<Record<string, unknown>>;
50
+ }>;
51
+ /** Stable refusal identities for callers and tests. */
52
+ export type GrammarContractErrorCode = "invalid-key" | "invalid-version" | "invalid-spec" | "duplicate-entry" | "allowed-axis-not-variable" | "duplicate-contract-key" | "missing-base-contract" | "same-extension-key" | "extension-id-mismatch" | "extension-base-mismatch" | "axis-not-allowed" | "axis-already-resolved" | "missing-axis-value" | "undeclared-axis-value" | "cyclic-value" | "unsupported-value";
53
+ /** Fail-closed error emitted by every runtime guard in this module. */
54
+ export declare class GrammarContractError extends Error {
55
+ readonly code: GrammarContractErrorCode;
56
+ constructor(code: GrammarContractErrorCode, message: string);
57
+ }
58
+ /** Define one immutable base contract after validating its closed boundaries. */
59
+ export declare const defineGrammarContract: <const Key extends string, const Spec extends GrammarContractSpec>(key: Key, spec: Spec) => GrammarContract<Key, Spec>;
60
+ /** Derive a contract by resolving declared axes without changing its base anatomy or invariants. */
61
+ export declare const extendGrammarContract: <const Key extends string, Spec extends GrammarContractSpec, Axis extends string>(key: Key, base: GrammarContract<string, Spec>, extension: GrammarContractExtension<Axis>) => GrammarContract<Key, Spec>;
62
+ /** Typed in-memory registry used by each Grammar bundle while it assembles its public contracts. */
63
+ export type GrammarContractRegistry<Spec extends GrammarContractSpec> = Readonly<{
64
+ define: <const Key extends string, const Input extends Spec>(key: Key, spec: Input) => GrammarContract<Key, Input>;
65
+ extend: <const Key extends string, Axis extends string>(key: Key, baseKey: string, extension: GrammarContractExtension<Axis>) => GrammarContract<Key, Spec>;
66
+ register: <const Key extends string, const Input extends Spec>(contract: GrammarContract<Key, Input>) => GrammarContract<Key, Input>;
67
+ get: (key: string) => GrammarContract<string, Spec> | undefined;
68
+ require: (key: string) => GrammarContract<string, Spec>;
69
+ has: (key: string) => boolean;
70
+ entries: () => ReadonlyArray<GrammarContract<string, Spec>>;
71
+ }>;
72
+ /** Create an isolated fail-closed registry. Duplicate keys never replace an earlier contract. */
73
+ export declare const createContractRegistry: <Spec extends GrammarContractSpec>() => GrammarContractRegistry<Spec>;
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ /** Render-neutral states accepted by Grammar contracts. Product Blocks own every domain mapping. */
2
+ export const PRESENTATION_STATES = [
3
+ "neutral",
4
+ "informative",
5
+ "affirmative",
6
+ "cautionary",
7
+ "negative",
8
+ "pending",
9
+ "unavailable",
10
+ ];
11
+ const presentationStateSet = new Set(PRESENTATION_STATES);
12
+ export const isPresentationState = (value) => (typeof value === "string" && presentationStateSet.has(value));
13
+ export const assertPresentationState = (value) => {
14
+ if (!isPresentationState(value))
15
+ throw new TypeError(`Unknown neutral presentation state: ${JSON.stringify(value)}`);
16
+ };
17
+ /** Fail-closed error emitted by every runtime guard in this module. */
18
+ export class GrammarContractError extends Error {
19
+ code;
20
+ constructor(code, message) {
21
+ super(message);
22
+ this.name = "GrammarContractError";
23
+ this.code = code;
24
+ }
25
+ }
26
+ const stableKeyPattern = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/;
27
+ const exactVersionPattern = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z]+(?:[.-][0-9A-Za-z]+)*)?$/;
28
+ const requiredForbiddenChanges = [
29
+ "anatomy",
30
+ "closed-invariant",
31
+ "owner-substitution",
32
+ ];
33
+ const fail = (code, message) => {
34
+ throw new GrammarContractError(code, message);
35
+ };
36
+ const validateStableKey = (value, label) => {
37
+ if (!stableKeyPattern.test(value))
38
+ fail("invalid-key", `${label} must be a stable lowercase key: ${value}`);
39
+ };
40
+ const validateExactVersion = (value, label) => {
41
+ if (!exactVersionPattern.test(value)) {
42
+ fail("invalid-version", `${label} must be one exact semantic version: ${value}`);
43
+ }
44
+ };
45
+ const validateStringSet = (values, label) => {
46
+ if (!Array.isArray(values))
47
+ fail("invalid-spec", `${label} must be an array`);
48
+ const seen = new Set();
49
+ for (const value of values) {
50
+ if (typeof value !== "string" || value.length === 0 || value.trim() !== value) {
51
+ fail("invalid-spec", `${label} contains an empty or untrimmed value`);
52
+ }
53
+ validateStableKey(value, label);
54
+ if (seen.has(value))
55
+ fail("duplicate-entry", `${label} contains duplicate value: ${value}`);
56
+ seen.add(value);
57
+ }
58
+ };
59
+ const cloneClosed = (value, path, ancestors) => {
60
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean")
61
+ return value;
62
+ if (Array.isArray(value)) {
63
+ if (ancestors.has(value))
64
+ fail("cyclic-value", `${path} contains a cycle`);
65
+ ancestors.add(value);
66
+ const copy = value.map((item, index) => cloneClosed(item, `${path}[${index}]`, ancestors));
67
+ ancestors.delete(value);
68
+ return Object.freeze(copy);
69
+ }
70
+ if (typeof value === "object") {
71
+ if (ancestors.has(value))
72
+ fail("cyclic-value", `${path} contains a cycle`);
73
+ const prototype = Object.getPrototypeOf(value);
74
+ if (prototype !== Object.prototype && prototype !== null) {
75
+ fail("unsupported-value", `${path} must contain only plain data`);
76
+ }
77
+ ancestors.add(value);
78
+ const copy = {};
79
+ for (const [key, child] of Object.entries(value))
80
+ copy[key] = cloneClosed(child, `${path}.${key}`, ancestors);
81
+ ancestors.delete(value);
82
+ return Object.freeze(copy);
83
+ }
84
+ return fail("unsupported-value", `${path} contains unsupported ${typeof value}`);
85
+ };
86
+ const closedCopy = (value, path) => cloneClosed(value, path, new WeakSet());
87
+ const validateSpec = (spec) => {
88
+ if (spec === null || typeof spec !== "object")
89
+ fail("invalid-spec", "contract spec must be an object");
90
+ validateExactVersion(spec.version, "contract version");
91
+ if (!["leaves", "branch", "composites"].includes(spec.layer)) {
92
+ fail("invalid-spec", `unsupported Grammar layer: ${String(spec.layer)}`);
93
+ }
94
+ validateStringSet(spec.slots, "slots");
95
+ validateStringSet(spec.stateInputs, "stateInputs");
96
+ validateStringSet(spec.variableAxes, "variableAxes");
97
+ if (spec.extensionPolicy === null || typeof spec.extensionPolicy !== "object") {
98
+ fail("invalid-spec", "extensionPolicy must be an object");
99
+ }
100
+ validateStringSet(spec.extensionPolicy.allowedAxes, "extensionPolicy.allowedAxes");
101
+ validateStringSet(spec.extensionPolicy.forbiddenChanges, "extensionPolicy.forbiddenChanges");
102
+ validateStringSet(spec.closedInvariants, "closedInvariants");
103
+ const variableAxes = new Set(spec.variableAxes);
104
+ for (const axis of spec.extensionPolicy.allowedAxes) {
105
+ if (!variableAxes.has(axis)) {
106
+ fail("allowed-axis-not-variable", `allowed extension axis is not a variable axis: ${axis}`);
107
+ }
108
+ }
109
+ for (const change of requiredForbiddenChanges) {
110
+ if (!spec.extensionPolicy.forbiddenChanges.includes(change)) {
111
+ fail("invalid-spec", `extensionPolicy.forbiddenChanges must include ${change}`);
112
+ }
113
+ }
114
+ };
115
+ /** Define one immutable base contract after validating its closed boundaries. */
116
+ export const defineGrammarContract = (key, spec) => {
117
+ validateStableKey(key, "contract key");
118
+ validateSpec(spec);
119
+ return Object.freeze({
120
+ key,
121
+ version: spec.version,
122
+ spec: closedCopy(spec, `contract ${key}`),
123
+ base: null,
124
+ resolvedAxes: Object.freeze({}),
125
+ });
126
+ };
127
+ /** Derive a contract by resolving declared axes without changing its base anatomy or invariants. */
128
+ export const extendGrammarContract = (key, base, extension) => {
129
+ validateStableKey(key, "extension key");
130
+ validateStableKey(extension.id, "extension id");
131
+ validateExactVersion(extension.version, "extension version");
132
+ validateStableKey(extension.base.key, "extension base key");
133
+ validateExactVersion(extension.base.version, "extension base version");
134
+ if (key === base.key)
135
+ fail("same-extension-key", `extension key must differ from base key: ${key}`);
136
+ if (extension.id !== key) {
137
+ fail("extension-id-mismatch", `extension id ${extension.id} does not match registered key ${key}`);
138
+ }
139
+ if (extension.base.key !== base.key || extension.base.version !== base.version) {
140
+ fail("extension-base-mismatch", `extension base ${extension.base.key}@${extension.base.version} does not match ${base.key}@${base.version}`);
141
+ }
142
+ validateStringSet(extension.axes, "extension.axes");
143
+ if (extension.values === null || typeof extension.values !== "object" || Array.isArray(extension.values)) {
144
+ fail("invalid-spec", "extension.values must be an object");
145
+ }
146
+ const requested = new Set(extension.axes);
147
+ const allowed = new Set(base.spec.extensionPolicy.allowedAxes);
148
+ for (const axis of extension.axes) {
149
+ if (!allowed.has(axis))
150
+ fail("axis-not-allowed", `extension axis is closed: ${axis}`);
151
+ if (Object.hasOwn(base.resolvedAxes, axis)) {
152
+ fail("axis-already-resolved", `extension axis is already resolved: ${axis}`);
153
+ }
154
+ if (!Object.hasOwn(extension.values, axis))
155
+ fail("missing-axis-value", `extension axis has no value: ${axis}`);
156
+ }
157
+ for (const axis of Object.keys(extension.values)) {
158
+ if (!requested.has(axis))
159
+ fail("undeclared-axis-value", `extension value has no declared axis: ${axis}`);
160
+ }
161
+ const values = closedCopy(extension.values, `extension ${key}`);
162
+ const baseRef = Object.freeze({
163
+ key: base.key,
164
+ version: base.version,
165
+ rootKey: base.base?.rootKey ?? base.key,
166
+ rootVersion: base.base?.rootVersion ?? base.version,
167
+ });
168
+ return Object.freeze({
169
+ key,
170
+ version: extension.version,
171
+ spec: base.spec,
172
+ base: baseRef,
173
+ resolvedAxes: Object.freeze({ ...base.resolvedAxes, ...values }),
174
+ });
175
+ };
176
+ /** Create an isolated fail-closed registry. Duplicate keys never replace an earlier contract. */
177
+ export const createContractRegistry = () => {
178
+ const contracts = new Map();
179
+ const register = (contract) => {
180
+ if (contracts.has(contract.key)) {
181
+ fail("duplicate-contract-key", `contract key is already registered: ${contract.key}`);
182
+ }
183
+ contracts.set(contract.key, contract);
184
+ return contract;
185
+ };
186
+ const requireContract = (key) => {
187
+ const contract = contracts.get(key);
188
+ if (contract === undefined) {
189
+ return fail("missing-base-contract", `contract key is not registered: ${key}`);
190
+ }
191
+ return contract;
192
+ };
193
+ return Object.freeze({
194
+ define: (key, spec) => (register(defineGrammarContract(key, spec))),
195
+ extend: (key, baseKey, extension) => register(extendGrammarContract(key, requireContract(baseKey), extension)),
196
+ register,
197
+ get: (key) => contracts.get(key),
198
+ require: requireContract,
199
+ has: (key) => contracts.has(key),
200
+ entries: () => Object.freeze(Array.from(contracts.values())),
201
+ });
202
+ };
203
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /* Establish one deterministic cascade without owning product colour or business meaning. */
2
+ @layer starci-grammar-common, starci-grammar-core, starci-grammar-extension;
@@ -0,0 +1,6 @@
1
+ import type { PresentationState } from "./state.js";
2
+ export type StateMarkProps = {
3
+ readonly state: PresentationState;
4
+ };
5
+ export declare const StateMark: ({ state }: StateMarkProps) => import("react").JSX.Element | null;
6
+ //# sourceMappingURL=StateMark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateMark.d.ts","sourceRoot":"","sources":["../../src/core/StateMark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAGnD,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,uCAclD,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { treatmentFor } from "./state.js";
3
+ export const StateMark = ({ state }) => {
4
+ const treatment = treatmentFor(state);
5
+ if (treatment.mark !== "check")
6
+ return null;
7
+ return (_jsx("svg", { "aria-hidden": "true", "data-grammar-state-mark": "check", focusable: "false", viewBox: "0 0 20 20", children: _jsx("path", { d: "M5 10.5 8.25 14 15 6.5", fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2" }) }));
8
+ };
9
+ //# sourceMappingURL=StateMark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateMark.js","sourceRoot":"","sources":["../../src/core/StateMark.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAMzC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAkB,EAAE,EAAE;IACnD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAA;IAE3C,OAAO,CACH,6BACgB,MAAM,6BACM,OAAO,EAC/B,SAAS,EAAC,OAAO,EACjB,OAAO,EAAC,WAAW,YAEnB,eAAM,CAAC,EAAC,wBAAwB,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,GAAG,GAChI,CACT,CAAA;AACL,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { type ReactNode } from "react";
2
+ import { type PresentationState } from "../../state.js";
3
+ export type RailProps = {
4
+ readonly label: string;
5
+ readonly children: ReactNode;
6
+ readonly footer?: ReactNode;
7
+ readonly mode?: "flow" | "sticky";
8
+ readonly width?: "compact" | "standard" | "wide";
9
+ readonly state?: PresentationState;
10
+ };
11
+ export declare const Rail: ({ label, children, footer, mode, width, state, }: RailProps) => import("react").JSX.Element;
12
+ export declare const meta: {
13
+ readonly shape: "branch";
14
+ readonly grammar: "core";
15
+ readonly contract: "core.branch.rail";
16
+ };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/branch/Rail/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE9F,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,kDAOlB,SAAS,gCAwBX,CAAA;AAED,eAAO,MAAM,IAAI;;;;CAA8E,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { assertPresentationState, treatmentFor } from "../../state.js";
4
+ export const Rail = ({ label, children, footer, mode = "flow", width = "standard", state = "neutral", }) => {
5
+ assertPresentationState(state);
6
+ const headingId = useId();
7
+ const treatment = treatmentFor(state);
8
+ return (_jsx("aside", { "aria-labelledby": headingId, className: "starci-core-rail", "data-grammar-rail": "true", "data-grammar-rail-mode": mode, "data-grammar-rail-width": width, "data-grammar-state": state, "data-grammar-treatment": treatment.tone, children: _jsxs("div", { className: "starci-core-rail-frame", "data-grammar-rail-frame": "true", children: [_jsx("h2", { "data-grammar-rail-heading": "true", id: headingId, children: label }), _jsx("div", { className: "starci-core-rail-body", "data-grammar-rail-body": "true", children: children }), footer === undefined ? null : (_jsx("div", { className: "starci-core-rail-footer", "data-grammar-rail-footer": "true", children: footer }))] }) }));
9
+ };
10
+ export const meta = { shape: "branch", grammar: "core", contract: "core.branch.rail" };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/branch/Rail/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAA;AAW9F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACjB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,GAAG,MAAM,EACb,KAAK,GAAG,UAAU,EAClB,KAAK,GAAG,SAAS,GACT,EAAE,EAAE;IACZ,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAErC,OAAO,CACH,mCACqB,SAAS,EAC1B,SAAS,EAAC,kBAAkB,uBACV,MAAM,4BACA,IAAI,6BACH,KAAK,wBACV,KAAK,4BACD,SAAS,CAAC,IAAI,YAEtC,eAAK,SAAS,EAAC,wBAAwB,6BAAyB,MAAM,aAClE,0CAA8B,MAAM,EAAC,EAAE,EAAE,SAAS,YAAG,KAAK,GAAM,EAChE,cAAK,SAAS,EAAC,uBAAuB,4BAAwB,MAAM,YAAE,QAAQ,GAAO,EACpF,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3B,cAAK,SAAS,EAAC,yBAAyB,8BAA0B,MAAM,YAAE,MAAM,GAAO,CAC1F,IACC,GACF,CACX,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAW,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { type ReactNode } from "react";
2
+ import { type PresentationState } from "../../state.js";
3
+ export type WholeCardAction = {
4
+ readonly kind: "link";
5
+ readonly href: string;
6
+ readonly label: string;
7
+ } | {
8
+ readonly kind: "button";
9
+ readonly press: () => void;
10
+ readonly label: string;
11
+ };
12
+ type LabelledSurfaceCard = {
13
+ readonly label: string;
14
+ readonly ariaLabel?: string;
15
+ };
16
+ type SelfNamedSurfaceCard = {
17
+ readonly label?: undefined;
18
+ readonly ariaLabel: string;
19
+ };
20
+ export type SurfaceCardProps = (LabelledSurfaceCard | SelfNamedSurfaceCard) & {
21
+ readonly children: ReactNode;
22
+ readonly fact?: string;
23
+ readonly depth?: "top" | "nested";
24
+ readonly state?: PresentationState;
25
+ readonly wholeAction?: WholeCardAction;
26
+ };
27
+ export declare const SurfaceCard: ({ label, ariaLabel, children, fact, depth, state, wholeAction, }: SurfaceCardProps) => import("react").JSX.Element;
28
+ export declare const meta: {
29
+ readonly shape: "branch";
30
+ readonly grammar: "core";
31
+ readonly contract: "core.branch.surface-card";
32
+ };
33
+ export {};
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/branch/SurfaceCard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE9F,MAAM,MAAM,eAAe,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACzB,GACC;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACzB,CAAA;AAEL,KAAK,mBAAmB,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,KAAK,oBAAoB,GAAG;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,GAAG,oBAAoB,CAAC,GAAG;IAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAA;CACzC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,kEAQzB,gBAAgB,gCAiDlB,CAAA;AAED,eAAO,MAAM,IAAI;;;;CAAsF,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { assertPresentationState, treatmentFor } from "../../state.js";
4
+ export const SurfaceCard = ({ label, ariaLabel, children, fact, depth = "top", state = "neutral", wholeAction, }) => {
5
+ assertPresentationState(state);
6
+ const headingId = useId();
7
+ const treatment = treatmentFor(state);
8
+ const disabled = state === "unavailable" || state === "pending";
9
+ const accessibleName = ariaLabel ?? label;
10
+ const action = wholeAction?.kind === "link" ? (_jsx("a", { "aria-disabled": disabled || undefined, "aria-label": wholeAction.label, "data-grammar-whole-action": "link", href: disabled ? undefined : wholeAction.href, tabIndex: disabled ? -1 : undefined })) : wholeAction?.kind === "button" ? (_jsx("button", { "aria-label": wholeAction.label, "data-grammar-whole-action": "button", disabled: disabled, onClick: wholeAction.press, type: "button" })) : null;
11
+ return (_jsxs("section", { className: "starci-core-surface-card", "data-grammar-surface-card": "true", children: [label === undefined ? null : (_jsxs("div", { className: "starci-core-surface-label", "data-grammar-surface-label": "true", children: [_jsx("h3", { id: headingId, children: label }), fact === undefined ? null : _jsx("span", { children: fact })] })), _jsxs("div", { "aria-label": label === undefined ? accessibleName : undefined, "aria-labelledby": label === undefined ? undefined : headingId, className: "starci-core-surface", "data-grammar-state": state, "data-grammar-surface": "true", "data-grammar-surface-depth": depth, "data-grammar-treatment": treatment.tone, children: [_jsx("div", { className: "starci-core-surface-content", "data-grammar-surface-content": "true", children: children }), action] })] }));
12
+ };
13
+ export const meta = { shape: "branch", grammar: "core", contract: "core.branch.surface-card" };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/branch/SurfaceCard/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAA;AAgC9F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EACxB,KAAK,EACL,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,SAAS,EACjB,WAAW,GACI,EAAE,EAAE;IACnB,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,SAAS,CAAA;IAC/D,MAAM,cAAc,GAAG,SAAS,IAAI,KAAK,CAAA;IAEzC,MAAM,MAAM,GAAG,WAAW,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC1C,6BACmB,QAAQ,IAAI,SAAS,gBACxB,WAAW,CAAC,KAAK,+BACH,MAAM,EAChC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAC7C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GACrC,CACL,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACjC,+BACgB,WAAW,CAAC,KAAK,+BACH,QAAQ,EAClC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,CAAC,KAAK,EAC1B,IAAI,EAAC,QAAQ,GACf,CACL,CAAC,CAAC,CAAC,IAAI,CAAA;IAER,OAAO,CACH,mBAAS,SAAS,EAAC,0BAA0B,+BAA2B,MAAM,aACzE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,eAAK,SAAS,EAAC,2BAA2B,gCAA4B,MAAM,aACxE,aAAI,EAAE,EAAE,SAAS,YAAG,KAAK,GAAM,EAC9B,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAO,IAAI,GAAQ,IAC9C,CACT,EACD,6BACgB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,qBAC3C,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC5D,SAAS,EAAC,qBAAqB,wBACX,KAAK,0BACJ,MAAM,gCACC,KAAK,4BACT,SAAS,CAAC,IAAI,aAEtC,cAAK,SAAS,EAAC,6BAA6B,kCAA8B,MAAM,YAC3E,QAAQ,GACP,EACL,MAAM,IACL,IACA,CACb,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAW,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { type PresentationState } from "../../state.js";
2
+ export type SurfaceListItem = {
3
+ readonly id: string;
4
+ readonly label: string;
5
+ readonly description?: string;
6
+ readonly state?: PresentationState;
7
+ };
8
+ type LabelledSurfaceList = {
9
+ readonly label: string;
10
+ readonly ariaLabel?: string;
11
+ };
12
+ type SelfNamedSurfaceList = {
13
+ readonly label?: undefined;
14
+ readonly ariaLabel: string;
15
+ };
16
+ export type SurfaceListCardProps = (LabelledSurfaceList | SelfNamedSurfaceList) & {
17
+ readonly items: ReadonlyArray<SurfaceListItem>;
18
+ readonly fact?: string;
19
+ readonly depth?: "top" | "nested";
20
+ readonly emptyLabel?: string;
21
+ };
22
+ export declare const SurfaceListCard: ({ label, ariaLabel, items, fact, depth, emptyLabel, }: SurfaceListCardProps) => import("react").JSX.Element;
23
+ export declare const meta: {
24
+ readonly shape: "branch";
25
+ readonly grammar: "core";
26
+ readonly contract: "core.branch.surface-list-card";
27
+ };
28
+ export {};
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/branch/SurfaceListCard/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE9F,MAAM,MAAM,eAAe,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;CACrC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,KAAK,oBAAoB,GAAG;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,mBAAmB,GAAG,oBAAoB,CAAC,GAAG;IAC9E,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,uDAO7B,oBAAoB,gCA+CtB,CAAA;AAED,eAAO,MAAM,IAAI;;;;CAA2F,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { StateMark } from "../../StateMark.js";
4
+ import { assertPresentationState, treatmentFor } from "../../state.js";
5
+ export const SurfaceListCard = ({ label, ariaLabel, items, fact, depth = "top", emptyLabel = "No items", }) => {
6
+ const headingId = useId();
7
+ for (const item of items)
8
+ assertPresentationState(item.state ?? "neutral");
9
+ return (_jsxs("section", { className: "starci-core-surface-list", "data-grammar-surface-list": "true", children: [label === undefined ? null : (_jsxs("div", { className: "starci-core-surface-label", "data-grammar-surface-label": "true", children: [_jsx("h3", { id: headingId, children: label }), fact === undefined ? null : _jsx("span", { children: fact })] })), _jsx("div", { "aria-label": label === undefined ? ariaLabel : undefined, "aria-labelledby": label === undefined ? undefined : headingId, className: "starci-core-surface starci-core-list-shell", "data-grammar-surface": "true", "data-grammar-surface-depth": depth, children: items.length === 0 ? (_jsx("p", { className: "starci-core-empty-row", "data-grammar-state": "neutral", children: emptyLabel })) : (_jsx("ul", { className: "starci-core-static-list", "data-grammar-list": "true", children: items.map((item) => {
10
+ const state = item.state ?? "neutral";
11
+ const treatment = treatmentFor(state);
12
+ return (_jsxs("li", { className: "starci-core-static-row", "data-grammar-row": "true", "data-grammar-state": state, "data-grammar-treatment": treatment.tone, children: [_jsx(StateMark, { state: state }), _jsxs("span", { className: "starci-core-static-row-copy", children: [_jsx("span", { children: item.label }), item.description === undefined ? null : _jsx("span", { children: item.description })] })] }, item.id));
13
+ }) })) })] }));
14
+ };
15
+ export const meta = { shape: "branch", grammar: "core", contract: "core.branch.surface-list-card" };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/branch/SurfaceListCard/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAA;AA0B9F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,EACL,IAAI,EACJ,KAAK,GAAG,KAAK,EACb,UAAU,GAAG,UAAU,GACJ,EAAE,EAAE;IACvB,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,uBAAuB,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAA;IAE1E,OAAO,CACH,mBAAS,SAAS,EAAC,0BAA0B,+BAA2B,MAAM,aACzE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,eAAK,SAAS,EAAC,2BAA2B,gCAA4B,MAAM,aACxE,aAAI,EAAE,EAAE,SAAS,YAAG,KAAK,GAAM,EAC9B,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAO,IAAI,GAAQ,IAC9C,CACT,EACD,4BACgB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,qBACtC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC5D,SAAS,EAAC,4CAA4C,0BACjC,MAAM,gCACC,KAAK,YAEhC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAClB,YAAG,SAAS,EAAC,uBAAuB,wBAAoB,SAAS,YAAE,UAAU,GAAK,CACrF,CAAC,CAAC,CAAC,CACA,aAAI,SAAS,EAAC,yBAAyB,uBAAmB,MAAM,YAC3D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAA;wBACrC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;wBACrC,OAAO,CACH,cACI,SAAS,EAAC,wBAAwB,sBACjB,MAAM,wBACH,KAAK,4BACD,SAAS,CAAC,IAAI,aAGtC,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,EAC3B,gBAAM,SAAS,EAAC,6BAA6B,aACzC,yBAAO,IAAI,CAAC,KAAK,GAAQ,EACxB,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAO,IAAI,CAAC,WAAW,GAAQ,IACrE,KANF,IAAI,CAAC,EAAE,CAOX,CACR,CAAA;oBACL,CAAC,CAAC,GACD,CACR,GACC,IACA,CACb,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,+BAA+B,EAAW,CAAA"}