@mmapp/react 0.1.0-alpha.18 → 0.1.0-alpha.20

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 (55) hide show
  1. package/dist/actions-HOXZPBTT.mjs +116 -0
  2. package/dist/actions-MFI2V4DX.mjs +116 -0
  3. package/dist/atoms/index.d.mts +2 -2
  4. package/dist/atoms/index.d.ts +2 -2
  5. package/dist/atoms/index.js +1 -1
  6. package/dist/atoms/index.mjs +1 -1
  7. package/dist/builtin-atoms-C-sNyYJl.d.mts +647 -0
  8. package/dist/builtin-atoms-C-sNyYJl.d.ts +647 -0
  9. package/dist/builtin-atoms-DCKrjG7i.d.mts +96 -0
  10. package/dist/builtin-atoms-DCKrjG7i.d.ts +96 -0
  11. package/dist/builtin-atoms-DRD3EwG6.d.mts +648 -0
  12. package/dist/builtin-atoms-DRD3EwG6.d.ts +648 -0
  13. package/dist/builtin-atoms-jt04b7Rw.d.mts +643 -0
  14. package/dist/builtin-atoms-jt04b7Rw.d.ts +643 -0
  15. package/dist/chunk-247T4GDJ.mjs +677 -0
  16. package/dist/chunk-3H6CR7E7.mjs +1924 -0
  17. package/dist/chunk-3PL6FL6I.mjs +96 -0
  18. package/dist/chunk-3SJSW3C4.mjs +2039 -0
  19. package/dist/chunk-5OI2VI57.mjs +1964 -0
  20. package/dist/chunk-CL6FYZ43.mjs +105 -0
  21. package/dist/chunk-ENQOCZI5.mjs +1938 -0
  22. package/dist/chunk-FB3WCZAU.mjs +512 -0
  23. package/dist/chunk-FBKUGKQI.mjs +1938 -0
  24. package/dist/chunk-GLJ7VC7Z.mjs +684 -0
  25. package/dist/chunk-HHMWR6NA.mjs +504 -0
  26. package/dist/chunk-HULEMSN2.mjs +120 -0
  27. package/dist/chunk-J5MW6CRU.mjs +1938 -0
  28. package/dist/chunk-PNTTKNYU.mjs +677 -0
  29. package/dist/chunk-TY5OTJP4.mjs +684 -0
  30. package/dist/chunk-WV7DVCP6.mjs +513 -0
  31. package/dist/chunk-YFMPTGUF.mjs +677 -0
  32. package/dist/chunk-ZAHMWAER.mjs +1960 -0
  33. package/dist/{chunk-2VJQJM7S.mjs → chunk-ZDWACXZN.mjs} +1 -1
  34. package/dist/composition-BJ6QQTWT.mjs +12 -0
  35. package/dist/composition-XBGKKCI7.mjs +57 -0
  36. package/dist/content-QVPFUG4P.mjs +246 -0
  37. package/dist/control-flow-CBREHWJW.mjs +35 -0
  38. package/dist/control-flow-FWBOI6SM.mjs +35 -0
  39. package/dist/control-flow-ZWUGCDSP.mjs +35 -0
  40. package/dist/data-WCMIZYKD.mjs +97 -0
  41. package/dist/grouping-E6F377VZ.mjs +204 -0
  42. package/dist/grouping-FRPOEXO3.mjs +233 -0
  43. package/dist/index.d.mts +4 -433
  44. package/dist/index.d.ts +4 -433
  45. package/dist/index.js +3671 -582
  46. package/dist/index.mjs +335 -1040
  47. package/dist/input-PUOZDNSI.mjs +222 -0
  48. package/dist/layout-RATDMCLP.mjs +106 -0
  49. package/dist/navigation-VCT7ZBMA.mjs +15 -0
  50. package/dist/navigation-WFV7YWOU.mjs +14 -0
  51. package/dist/player/index.d.mts +37 -11
  52. package/dist/player/index.d.ts +37 -11
  53. package/dist/player/index.js +3321 -193
  54. package/dist/player/index.mjs +55 -5
  55. package/package.json +4 -4
@@ -0,0 +1,222 @@
1
+ // src/player/atoms/input.tsx
2
+ import { useState, useCallback, useEffect } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ var inputBase = {
5
+ padding: "6px 12px",
6
+ border: "1px solid #e2e8f0",
7
+ borderRadius: 6,
8
+ fontSize: 14,
9
+ outline: "none",
10
+ width: "100%",
11
+ boxSizing: "border-box",
12
+ background: "#fff",
13
+ color: "#1a202c",
14
+ transition: "border-color 0.15s"
15
+ };
16
+ var TextInput = ({
17
+ value,
18
+ onChange,
19
+ onBlur,
20
+ placeholder,
21
+ label,
22
+ type,
23
+ name,
24
+ disabled,
25
+ required,
26
+ error,
27
+ helperText,
28
+ multiline,
29
+ rows,
30
+ maxLength,
31
+ className,
32
+ style,
33
+ bind: _bind
34
+ }) => {
35
+ const isControlled = typeof onChange === "function";
36
+ const [localValue, setLocalValue] = useState(value ?? "");
37
+ useEffect(() => {
38
+ if (value != null && String(value) !== localValue) {
39
+ setLocalValue(String(value));
40
+ }
41
+ }, [value]);
42
+ const handleChange = useCallback((e) => {
43
+ setLocalValue(e.target.value);
44
+ if (typeof onChange === "function") {
45
+ onChange(e);
46
+ }
47
+ }, [onChange]);
48
+ const displayValue = isControlled ? value ?? "" : localValue;
49
+ const hasError = Boolean(error);
50
+ const inputStyle = {
51
+ ...inputBase,
52
+ borderColor: hasError ? "#e53e3e" : "#e2e8f0",
53
+ ...style
54
+ };
55
+ return /* @__PURE__ */ jsxs("div", { className, style: { width: "100%" }, children: [
56
+ label ? /* @__PURE__ */ jsxs("label", { style: { display: "block", fontSize: 13, fontWeight: 500, marginBottom: 4, color: "#4a5568" }, children: [
57
+ String(label),
58
+ required ? /* @__PURE__ */ jsx("span", { style: { color: "#e53e3e" }, children: " *" }) : null
59
+ ] }) : null,
60
+ multiline ? /* @__PURE__ */ jsx(
61
+ "textarea",
62
+ {
63
+ value: displayValue,
64
+ onChange: handleChange,
65
+ onBlur,
66
+ placeholder,
67
+ name,
68
+ disabled: Boolean(disabled),
69
+ required: Boolean(required),
70
+ rows: Number(rows) || 3,
71
+ maxLength: maxLength ? Number(maxLength) : void 0,
72
+ style: inputStyle
73
+ }
74
+ ) : /* @__PURE__ */ jsx(
75
+ "input",
76
+ {
77
+ type: type ?? "text",
78
+ value: displayValue,
79
+ onChange: handleChange,
80
+ onBlur,
81
+ placeholder,
82
+ name,
83
+ disabled: Boolean(disabled),
84
+ required: Boolean(required),
85
+ maxLength: maxLength ? Number(maxLength) : void 0,
86
+ style: inputStyle
87
+ }
88
+ ),
89
+ error || helperText ? /* @__PURE__ */ jsx("div", { style: { fontSize: 12, marginTop: 2, color: hasError ? "#e53e3e" : "#a0aec0" }, children: String(error || helperText) }) : null
90
+ ] });
91
+ };
92
+ var Select = ({
93
+ value,
94
+ onChange,
95
+ options,
96
+ placeholder,
97
+ label,
98
+ disabled,
99
+ required,
100
+ error,
101
+ name,
102
+ className,
103
+ style
104
+ }) => {
105
+ const [localValue, setLocalValue] = useState(value ?? "");
106
+ const isControlled = typeof onChange === "function";
107
+ useEffect(() => {
108
+ if (value != null && String(value) !== localValue) setLocalValue(String(value));
109
+ }, [value]);
110
+ const handleChange = useCallback((e) => {
111
+ setLocalValue(e.target.value);
112
+ if (typeof onChange === "function") onChange(e);
113
+ }, [onChange]);
114
+ const displayValue = isControlled ? value ?? "" : localValue;
115
+ const opts = Array.isArray(options) ? options : [];
116
+ return /* @__PURE__ */ jsxs("div", { className, children: [
117
+ label ? /* @__PURE__ */ jsxs("label", { style: { display: "block", fontSize: 13, fontWeight: 500, marginBottom: 4, color: "#4a5568" }, children: [
118
+ String(label),
119
+ required ? /* @__PURE__ */ jsx("span", { style: { color: "#e53e3e" }, children: " *" }) : null
120
+ ] }) : null,
121
+ /* @__PURE__ */ jsxs(
122
+ "select",
123
+ {
124
+ value: displayValue,
125
+ onChange: handleChange,
126
+ disabled: Boolean(disabled),
127
+ name,
128
+ style: {
129
+ ...inputBase,
130
+ borderColor: error ? "#e53e3e" : "#e2e8f0",
131
+ ...style
132
+ },
133
+ children: [
134
+ placeholder ? /* @__PURE__ */ jsx("option", { value: "", children: String(placeholder) }) : null,
135
+ opts.map((opt, i) => {
136
+ const val = typeof opt === "object" ? opt.value : opt;
137
+ const lbl = typeof opt === "object" ? opt.label ?? val : opt;
138
+ return /* @__PURE__ */ jsx("option", { value: String(val), children: String(lbl) }, String(val) ?? i);
139
+ })
140
+ ]
141
+ }
142
+ )
143
+ ] });
144
+ };
145
+ var Toggle = ({ value, checked, onChange, label, disabled, className, style }) => {
146
+ const isOn = Boolean(value ?? checked);
147
+ const handleClick = useCallback(() => {
148
+ if (disabled) return;
149
+ if (typeof onChange === "function") onChange(!isOn);
150
+ }, [onChange, isOn, disabled]);
151
+ return /* @__PURE__ */ jsxs(
152
+ "div",
153
+ {
154
+ className,
155
+ style: { display: "flex", alignItems: "center", gap: 8, ...style },
156
+ children: [
157
+ /* @__PURE__ */ jsx(
158
+ "button",
159
+ {
160
+ role: "switch",
161
+ "aria-checked": isOn,
162
+ disabled: Boolean(disabled),
163
+ onClick: handleClick,
164
+ style: {
165
+ width: 40,
166
+ height: 22,
167
+ borderRadius: 11,
168
+ border: "none",
169
+ cursor: disabled ? "not-allowed" : "pointer",
170
+ background: isOn ? "#3182ce" : "#cbd5e0",
171
+ padding: 2,
172
+ transition: "background 0.2s",
173
+ display: "flex",
174
+ alignItems: "center"
175
+ },
176
+ children: /* @__PURE__ */ jsx("div", { style: {
177
+ width: 18,
178
+ height: 18,
179
+ borderRadius: "50%",
180
+ background: "#fff",
181
+ transform: isOn ? "translateX(18px)" : "translateX(0)",
182
+ transition: "transform 0.2s",
183
+ boxShadow: "0 1px 3px rgba(0,0,0,0.2)"
184
+ } })
185
+ }
186
+ ),
187
+ label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 14 }, children: String(label) }) : null
188
+ ]
189
+ }
190
+ );
191
+ };
192
+ var Slider = ({ value, onChange, min, max, step, label, disabled, className, style }) => {
193
+ const numVal = Number(value) || Number(min) || 0;
194
+ const handleChange = useCallback((e) => {
195
+ if (typeof onChange === "function") onChange(Number(e.target.value));
196
+ }, [onChange]);
197
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...style }, children: [
198
+ label ? /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", fontSize: 13, marginBottom: 4 }, children: [
199
+ /* @__PURE__ */ jsx("span", { style: { color: "#4a5568", fontWeight: 500 }, children: String(label) }),
200
+ /* @__PURE__ */ jsx("span", { style: { color: "#718096" }, children: numVal })
201
+ ] }) : null,
202
+ /* @__PURE__ */ jsx(
203
+ "input",
204
+ {
205
+ type: "range",
206
+ value: numVal,
207
+ onChange: handleChange,
208
+ min: Number(min) ?? 0,
209
+ max: Number(max) ?? 100,
210
+ step: Number(step) ?? 1,
211
+ disabled: Boolean(disabled),
212
+ style: { width: "100%" }
213
+ }
214
+ )
215
+ ] });
216
+ };
217
+ export {
218
+ Select,
219
+ Slider,
220
+ TextInput,
221
+ Toggle
222
+ };
@@ -0,0 +1,106 @@
1
+ // src/player/atoms/layout.tsx
2
+ import { jsx } from "react/jsx-runtime";
3
+ var filterHtmlProps = (props) => {
4
+ const html = {};
5
+ for (const [k, v] of Object.entries(props)) {
6
+ if (["className", "style", "id", "role", "tabIndex", "title", "onClick", "data-node-id"].includes(k)) {
7
+ html[k] = v;
8
+ }
9
+ if (k.startsWith("data-") || k.startsWith("aria-")) html[k] = v;
10
+ }
11
+ return html;
12
+ };
13
+ var Stack = ({ children, gap, padding, align, justify, className, style, ...rest }) => /* @__PURE__ */ jsx(
14
+ "div",
15
+ {
16
+ ...filterHtmlProps(rest),
17
+ className,
18
+ style: {
19
+ display: "flex",
20
+ flexDirection: "column",
21
+ gap: gap != null ? Number(gap) * 4 : void 0,
22
+ padding: padding != null ? Number(padding) * 4 : void 0,
23
+ alignItems: align,
24
+ justifyContent: justify,
25
+ ...style
26
+ },
27
+ children
28
+ }
29
+ );
30
+ var Row = ({ children, gap, padding, align, justify, wrap, className, style, ...rest }) => /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ ...filterHtmlProps(rest),
34
+ className,
35
+ style: {
36
+ display: "flex",
37
+ flexDirection: "row",
38
+ gap: gap != null ? Number(gap) * 4 : void 0,
39
+ padding: padding != null ? Number(padding) * 4 : void 0,
40
+ alignItems: align ?? "center",
41
+ justifyContent: justify,
42
+ flexWrap: wrap ? "wrap" : void 0,
43
+ ...style
44
+ },
45
+ children
46
+ }
47
+ );
48
+ var Grid = ({ children, columns, gap, padding, minChildWidth, className, style, ...rest }) => /* @__PURE__ */ jsx(
49
+ "div",
50
+ {
51
+ ...filterHtmlProps(rest),
52
+ className,
53
+ style: {
54
+ display: "grid",
55
+ gridTemplateColumns: minChildWidth ? `repeat(auto-fill, minmax(${Number(minChildWidth)}px, 1fr))` : columns ? `repeat(${Number(columns)}, 1fr)` : "repeat(auto-fill, minmax(200px, 1fr))",
56
+ gap: gap != null ? Number(gap) * 4 : 16,
57
+ padding: padding != null ? Number(padding) * 4 : void 0,
58
+ ...style
59
+ },
60
+ children
61
+ }
62
+ );
63
+ var Column = ({ children, span, className, style, ...rest }) => /* @__PURE__ */ jsx(
64
+ "div",
65
+ {
66
+ ...filterHtmlProps(rest),
67
+ className,
68
+ style: {
69
+ gridColumn: span ? `span ${Number(span)}` : void 0,
70
+ ...style
71
+ },
72
+ children
73
+ }
74
+ );
75
+ var Divider = ({ orientation, className, style }) => /* @__PURE__ */ jsx(
76
+ "hr",
77
+ {
78
+ className,
79
+ style: {
80
+ border: "none",
81
+ borderTop: orientation === "vertical" ? "none" : "1px solid #e2e8f0",
82
+ borderLeft: orientation === "vertical" ? "1px solid #e2e8f0" : "none",
83
+ margin: orientation === "vertical" ? "0 8px" : "8px 0",
84
+ alignSelf: orientation === "vertical" ? "stretch" : void 0,
85
+ ...style
86
+ }
87
+ }
88
+ );
89
+ var Spacer = ({ size, className, style }) => /* @__PURE__ */ jsx(
90
+ "div",
91
+ {
92
+ className,
93
+ style: {
94
+ flex: size ? `0 0 ${Number(size) * 4}px` : "1",
95
+ ...style
96
+ }
97
+ }
98
+ );
99
+ export {
100
+ Column,
101
+ Divider,
102
+ Grid,
103
+ Row,
104
+ Spacer,
105
+ Stack
106
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ NavLink,
3
+ RoleGuard,
4
+ Route,
5
+ Router,
6
+ usePlayerRouter
7
+ } from "./chunk-HULEMSN2.mjs";
8
+ import "./chunk-WV7DVCP6.mjs";
9
+ export {
10
+ NavLink,
11
+ RoleGuard,
12
+ Route,
13
+ Router,
14
+ usePlayerRouter
15
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ NavLink,
3
+ RoleGuard,
4
+ Route,
5
+ Router,
6
+ usePlayerRouter
7
+ } from "./chunk-CL6FYZ43.mjs";
8
+ export {
9
+ NavLink,
10
+ RoleGuard,
11
+ Route,
12
+ Router,
13
+ usePlayerRouter
14
+ };
@@ -1,14 +1,40 @@
1
- import { S as ScopeData } from '../builtin-atoms-B0AUDsW7.mjs';
2
- export { A as AtomComponent, f as AtomRegistry, d as ComponentNode, e as ComponentTree, C as ComponentTreeRenderer, a as ComponentTreeRendererProps, D as DevPlayer, b as DevPlayerProps, c as builtinAtoms } from '../builtin-atoms-B0AUDsW7.mjs';
3
- import 'react';
1
+ export { a3 as ActionDefinition, J as ActionScope, V as ApiDataSource, A as ApiResolverConfig, x as AtomComponent, y as AtomRegistry, n as AtomRegistryImpl, K as AtomRegistryInterface, M as BindingClass, R as BuildScopeOptions, v as ComponentNode, w as ComponentTree, C as ComponentTreeRenderer, q as ComponentTreeRendererProps, T as DataSource, U as DataSourceResult, D as DevPlayer, s as DevPlayerProps, z as ExperienceNode, E as ExperienceRenderer, a as ExperienceRendererProps, L as ExprClass, a8 as ExpressionEvaluator, a9 as FacetEntry, $ as FieldDefinition, I as InstanceData, F as PlayerAuth, c as PlayerContextValue, P as PlayerProvider, b as PlayerProviderProps, B as PlayerResolver, G as PlayerRouter, a6 as QueryParams, a7 as QueryResult, Y as RefDataSource, a2 as RoleDefinition, S as ScopeContext, H as ScopeData, a0 as StateDefinition, X as StaticDataSource, a1 as TransitionDefinition, a4 as TransitionInfo, a5 as TransitionResult, W as WorkflowDataSource, Z as WorkflowDefinition, _ as WorkflowInstance, h as buildActionScope, i as buildEvalContext, l as buildLoopScope, k as buildScope, t as builtinAtoms, f as builtinFunctions, Q as classifyBinding, d as createApiResolver, o as createCoreAtomRegistry, e as evaluateExpression, p as mergeRegistries, m as mergeScope, g as resolveAllBindings, r as resolveBinding, O as setWasmModule, u as usePlayerContext, j as useScope, N as useTheme } from '../builtin-atoms-C-sNyYJl.mjs';
2
+ import React__default from 'react';
4
3
 
5
- /** Minimal expression evaluator for the standalone player. */
4
+ /**
5
+ * Design Tokens — Default theme values for the player runtime.
6
+ *
7
+ * Tokens are resolved via `resolveTokens()` in ExperienceRenderer.
8
+ * Users can override via PlayerProvider's `theme` prop.
9
+ */
10
+ declare const DEFAULT_DESIGN_TOKENS: Record<string, string>;
6
11
 
7
- /** Check if a string contains {{...}} expressions */
8
- declare function containsExpression(value: unknown): boolean;
9
- /** Evaluate a simple expression against scopes */
10
- declare function evaluateExpression(expr: string, scopes: Partial<ScopeData>): unknown;
11
- /** Evaluate a prop value: resolve {{expr}} templates, pass through non-strings */
12
- declare function evaluateProp(value: unknown, scopes: Partial<ScopeData>): unknown;
12
+ /**
13
+ * Composition Atoms — Slot, ModuleOutlet, SlotRegistry
14
+ * Module composition injection points with registry-based contribution resolution.
15
+ */
13
16
 
14
- export { ScopeData, containsExpression, evaluateExpression, evaluateProp };
17
+ interface SlotContribution {
18
+ name: string;
19
+ tree: React__default.ReactNode;
20
+ priority?: number;
21
+ }
22
+ declare const SlotRegistryProvider: React__default.FC<{
23
+ contributions: SlotContribution[];
24
+ children: React__default.ReactNode;
25
+ }>;
26
+ declare function useSlotContributions(name: string): SlotContribution[];
27
+
28
+ /**
29
+ * Navigation Atoms — Router, Route, NavLink, RoleGuard
30
+ * Client-side routing with path matching and active state.
31
+ */
32
+
33
+ interface RouterContextValue {
34
+ path: string;
35
+ navigate: (to: string) => void;
36
+ params: Record<string, string>;
37
+ }
38
+ declare function usePlayerRouter(): RouterContextValue;
39
+
40
+ export { DEFAULT_DESIGN_TOKENS, type SlotContribution, SlotRegistryProvider, usePlayerRouter, useSlotContributions };
@@ -1,14 +1,40 @@
1
- import { S as ScopeData } from '../builtin-atoms-B0AUDsW7.js';
2
- export { A as AtomComponent, f as AtomRegistry, d as ComponentNode, e as ComponentTree, C as ComponentTreeRenderer, a as ComponentTreeRendererProps, D as DevPlayer, b as DevPlayerProps, c as builtinAtoms } from '../builtin-atoms-B0AUDsW7.js';
3
- import 'react';
1
+ export { a3 as ActionDefinition, J as ActionScope, V as ApiDataSource, A as ApiResolverConfig, x as AtomComponent, y as AtomRegistry, n as AtomRegistryImpl, K as AtomRegistryInterface, M as BindingClass, R as BuildScopeOptions, v as ComponentNode, w as ComponentTree, C as ComponentTreeRenderer, q as ComponentTreeRendererProps, T as DataSource, U as DataSourceResult, D as DevPlayer, s as DevPlayerProps, z as ExperienceNode, E as ExperienceRenderer, a as ExperienceRendererProps, L as ExprClass, a8 as ExpressionEvaluator, a9 as FacetEntry, $ as FieldDefinition, I as InstanceData, F as PlayerAuth, c as PlayerContextValue, P as PlayerProvider, b as PlayerProviderProps, B as PlayerResolver, G as PlayerRouter, a6 as QueryParams, a7 as QueryResult, Y as RefDataSource, a2 as RoleDefinition, S as ScopeContext, H as ScopeData, a0 as StateDefinition, X as StaticDataSource, a1 as TransitionDefinition, a4 as TransitionInfo, a5 as TransitionResult, W as WorkflowDataSource, Z as WorkflowDefinition, _ as WorkflowInstance, h as buildActionScope, i as buildEvalContext, l as buildLoopScope, k as buildScope, t as builtinAtoms, f as builtinFunctions, Q as classifyBinding, d as createApiResolver, o as createCoreAtomRegistry, e as evaluateExpression, p as mergeRegistries, m as mergeScope, g as resolveAllBindings, r as resolveBinding, O as setWasmModule, u as usePlayerContext, j as useScope, N as useTheme } from '../builtin-atoms-C-sNyYJl.js';
2
+ import React__default from 'react';
4
3
 
5
- /** Minimal expression evaluator for the standalone player. */
4
+ /**
5
+ * Design Tokens — Default theme values for the player runtime.
6
+ *
7
+ * Tokens are resolved via `resolveTokens()` in ExperienceRenderer.
8
+ * Users can override via PlayerProvider's `theme` prop.
9
+ */
10
+ declare const DEFAULT_DESIGN_TOKENS: Record<string, string>;
6
11
 
7
- /** Check if a string contains {{...}} expressions */
8
- declare function containsExpression(value: unknown): boolean;
9
- /** Evaluate a simple expression against scopes */
10
- declare function evaluateExpression(expr: string, scopes: Partial<ScopeData>): unknown;
11
- /** Evaluate a prop value: resolve {{expr}} templates, pass through non-strings */
12
- declare function evaluateProp(value: unknown, scopes: Partial<ScopeData>): unknown;
12
+ /**
13
+ * Composition Atoms — Slot, ModuleOutlet, SlotRegistry
14
+ * Module composition injection points with registry-based contribution resolution.
15
+ */
13
16
 
14
- export { ScopeData, containsExpression, evaluateExpression, evaluateProp };
17
+ interface SlotContribution {
18
+ name: string;
19
+ tree: React__default.ReactNode;
20
+ priority?: number;
21
+ }
22
+ declare const SlotRegistryProvider: React__default.FC<{
23
+ contributions: SlotContribution[];
24
+ children: React__default.ReactNode;
25
+ }>;
26
+ declare function useSlotContributions(name: string): SlotContribution[];
27
+
28
+ /**
29
+ * Navigation Atoms — Router, Route, NavLink, RoleGuard
30
+ * Client-side routing with path matching and active state.
31
+ */
32
+
33
+ interface RouterContextValue {
34
+ path: string;
35
+ navigate: (to: string) => void;
36
+ params: Record<string, string>;
37
+ }
38
+ declare function usePlayerRouter(): RouterContextValue;
39
+
40
+ export { DEFAULT_DESIGN_TOKENS, type SlotContribution, SlotRegistryProvider, usePlayerRouter, useSlotContributions };