@philosaether/chipper 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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +778 -0
  3. package/dist/base.css +1 -0
  4. package/dist/headless.d.ts +16 -0
  5. package/dist/headless.d.ts.map +1 -0
  6. package/dist/headless.js +18 -0
  7. package/dist/index.js +1445 -0
  8. package/dist/src/builder/index.d.ts +82 -0
  9. package/dist/src/builder/index.d.ts.map +1 -0
  10. package/dist/src/builder/predicates.d.ts +18 -0
  11. package/dist/src/builder/predicates.d.ts.map +1 -0
  12. package/dist/src/components/Chip.d.ts +15 -0
  13. package/dist/src/components/Chip.d.ts.map +1 -0
  14. package/dist/src/components/ChipInfoPopup.d.ts +12 -0
  15. package/dist/src/components/ChipInfoPopup.d.ts.map +1 -0
  16. package/dist/src/components/ChipPopup.d.ts +20 -0
  17. package/dist/src/components/ChipPopup.d.ts.map +1 -0
  18. package/dist/src/components/Chipper.d.ts +25 -0
  19. package/dist/src/components/Chipper.d.ts.map +1 -0
  20. package/dist/src/components/Clause.d.ts +13 -0
  21. package/dist/src/components/Clause.d.ts.map +1 -0
  22. package/dist/src/components/Sentence.d.ts +15 -0
  23. package/dist/src/components/Sentence.d.ts.map +1 -0
  24. package/dist/src/components/index.d.ts +12 -0
  25. package/dist/src/components/index.d.ts.map +1 -0
  26. package/dist/src/components/popups/AlternativeCoordinatePopup.d.ts +16 -0
  27. package/dist/src/components/popups/AlternativeCoordinatePopup.d.ts.map +1 -0
  28. package/dist/src/components/popups/KeywordGroupList.d.ts +29 -0
  29. package/dist/src/components/popups/KeywordGroupList.d.ts.map +1 -0
  30. package/dist/src/components/popups/KeywordOrExpressionPopup.d.ts +30 -0
  31. package/dist/src/components/popups/KeywordOrExpressionPopup.d.ts.map +1 -0
  32. package/dist/src/components/popups/MultiSelectPopup.d.ts +20 -0
  33. package/dist/src/components/popups/MultiSelectPopup.d.ts.map +1 -0
  34. package/dist/src/components/popups/NumericInput.d.ts +16 -0
  35. package/dist/src/components/popups/NumericInput.d.ts.map +1 -0
  36. package/dist/src/components/popups/ReferencePopup.d.ts +20 -0
  37. package/dist/src/components/popups/ReferencePopup.d.ts.map +1 -0
  38. package/dist/src/core/actions/set-chip-value.d.ts +17 -0
  39. package/dist/src/core/actions/set-chip-value.d.ts.map +1 -0
  40. package/dist/src/core/actions/set-context.d.ts +18 -0
  41. package/dist/src/core/actions/set-context.d.ts.map +1 -0
  42. package/dist/src/core/actions/set-display-value.d.ts +18 -0
  43. package/dist/src/core/actions/set-display-value.d.ts.map +1 -0
  44. package/dist/src/core/actions/toggle-clause.d.ts +15 -0
  45. package/dist/src/core/actions/toggle-clause.d.ts.map +1 -0
  46. package/dist/src/core/context-resolution.d.ts +36 -0
  47. package/dist/src/core/context-resolution.d.ts.map +1 -0
  48. package/dist/src/core/initialize.d.ts +43 -0
  49. package/dist/src/core/initialize.d.ts.map +1 -0
  50. package/dist/src/core/mode-switching.d.ts +10 -0
  51. package/dist/src/core/mode-switching.d.ts.map +1 -0
  52. package/dist/src/core/reducer.d.ts +16 -0
  53. package/dist/src/core/reducer.d.ts.map +1 -0
  54. package/dist/src/core/resolve-keyword-label.d.ts +7 -0
  55. package/dist/src/core/resolve-keyword-label.d.ts.map +1 -0
  56. package/dist/src/core/serialize.d.ts +34 -0
  57. package/dist/src/core/serialize.d.ts.map +1 -0
  58. package/dist/src/core/state.d.ts +59 -0
  59. package/dist/src/core/state.d.ts.map +1 -0
  60. package/dist/src/core/store.d.ts +23 -0
  61. package/dist/src/core/store.d.ts.map +1 -0
  62. package/dist/src/core/types.d.ts +242 -0
  63. package/dist/src/core/types.d.ts.map +1 -0
  64. package/dist/src/domains/alternative-coordinate.d.ts +110 -0
  65. package/dist/src/domains/alternative-coordinate.d.ts.map +1 -0
  66. package/dist/src/domains/create-domain.d.ts +30 -0
  67. package/dist/src/domains/create-domain.d.ts.map +1 -0
  68. package/dist/src/domains/facades.d.ts +134 -0
  69. package/dist/src/domains/facades.d.ts.map +1 -0
  70. package/dist/src/domains/index.d.ts +14 -0
  71. package/dist/src/domains/index.d.ts.map +1 -0
  72. package/dist/src/domains/keyword-or-expression.d.ts +148 -0
  73. package/dist/src/domains/keyword-or-expression.d.ts.map +1 -0
  74. package/dist/src/domains/multi-select.d.ts +68 -0
  75. package/dist/src/domains/multi-select.d.ts.map +1 -0
  76. package/dist/src/domains/normalize-keywords.d.ts +83 -0
  77. package/dist/src/domains/normalize-keywords.d.ts.map +1 -0
  78. package/dist/src/domains/reference.d.ts +89 -0
  79. package/dist/src/domains/reference.d.ts.map +1 -0
  80. package/dist/src/hooks/SentenceProvider.d.ts +17 -0
  81. package/dist/src/hooks/SentenceProvider.d.ts.map +1 -0
  82. package/dist/src/hooks/context.d.ts +31 -0
  83. package/dist/src/hooks/context.d.ts.map +1 -0
  84. package/dist/src/hooks/index.d.ts +13 -0
  85. package/dist/src/hooks/index.d.ts.map +1 -0
  86. package/dist/src/hooks/useChip.d.ts +21 -0
  87. package/dist/src/hooks/useChip.d.ts.map +1 -0
  88. package/dist/src/hooks/useDisplaySource.d.ts +16 -0
  89. package/dist/src/hooks/useDisplaySource.d.ts.map +1 -0
  90. package/dist/src/hooks/useKeyboardNavigation.d.ts +44 -0
  91. package/dist/src/hooks/useKeyboardNavigation.d.ts.map +1 -0
  92. package/dist/src/hooks/usePopup.d.ts +13 -0
  93. package/dist/src/hooks/usePopup.d.ts.map +1 -0
  94. package/dist/src/hooks/useReferenceDisplay.d.ts +22 -0
  95. package/dist/src/hooks/useReferenceDisplay.d.ts.map +1 -0
  96. package/dist/src/hooks/useSentence.d.ts +14 -0
  97. package/dist/src/hooks/useSentence.d.ts.map +1 -0
  98. package/dist/src/index.d.ts +25 -0
  99. package/dist/src/index.d.ts.map +1 -0
  100. package/dist/src/palette/index.d.ts +29 -0
  101. package/dist/src/palette/index.d.ts.map +1 -0
  102. package/dist/src/themes/apply-theme.d.ts +34 -0
  103. package/dist/src/themes/apply-theme.d.ts.map +1 -0
  104. package/dist/src/themes/create-hue.d.ts +23 -0
  105. package/dist/src/themes/create-hue.d.ts.map +1 -0
  106. package/dist/src/themes/index.d.ts +13 -0
  107. package/dist/src/themes/index.d.ts.map +1 -0
  108. package/dist/src/themes/midnight.d.ts +11 -0
  109. package/dist/src/themes/midnight.d.ts.map +1 -0
  110. package/dist/src/themes/praxis.d.ts +11 -0
  111. package/dist/src/themes/praxis.d.ts.map +1 -0
  112. package/dist/src/themes/terminal.d.ts +9 -0
  113. package/dist/src/themes/terminal.d.ts.map +1 -0
  114. package/dist/src/themes/types.d.ts +72 -0
  115. package/dist/src/themes/types.d.ts.map +1 -0
  116. package/dist/styles.css +1 -0
  117. package/dist/themes/index.js +256 -0
  118. package/dist/themes/midnight.css +1 -0
  119. package/dist/themes/praxis.css +1 -0
  120. package/dist/themes/terminal.css +1 -0
  121. package/dist/usePopup-Of6OHa1_.js +653 -0
  122. package/package.json +75 -0
@@ -0,0 +1,653 @@
1
+ import { jsx as q } from "react/jsx-runtime";
2
+ import { createContext as F, useReducer as U, useState as G, useRef as R, useEffect as H, useMemo as K, useContext as B, useCallback as D } from "react";
3
+ function S(e, t, n, s, o) {
4
+ const u = L(e, s, o);
5
+ if (t.contextProductions)
6
+ for (const [r, a] of Object.entries(t.contextProductions)) {
7
+ const i = n[a];
8
+ i && (u[r] = i.value);
9
+ }
10
+ return u;
11
+ }
12
+ function L(e, t, n) {
13
+ var u;
14
+ const s = {};
15
+ let o = e;
16
+ for (; o; ) {
17
+ const r = t.get(o), a = (u = r == null ? void 0 : r.contingency) == null ? void 0 : u.superclauseId;
18
+ if (a) {
19
+ const i = n.find((c) => c.clauseId === a);
20
+ if (i)
21
+ for (const [c, l] of Object.entries(i.values))
22
+ c in s || (s[c] = l);
23
+ }
24
+ o = a;
25
+ }
26
+ return s;
27
+ }
28
+ function X(e, t) {
29
+ var s;
30
+ const n = t.get(e);
31
+ return ((s = n == null ? void 0 : n.contingency) == null ? void 0 : s.superclauseId) ?? null;
32
+ }
33
+ function E(e, t, n) {
34
+ var v;
35
+ const { clauseById: s, clausesBySuper: o } = e, u = e.state.contexts.findIndex((d) => d.clauseId === t), r = X(t, s), a = { clauseId: t, values: n, parentScopeId: r };
36
+ let i = u >= 0 ? e.state.contexts.map((d, y) => y === u ? a : d) : [...e.state.contexts, a], c = { ...e.state.clauses }, l = { ...e.domains };
37
+ const p = o.get(t) ?? [];
38
+ for (const d of p) {
39
+ const y = L(d.id, s, i), m = d.contingency.present ? d.contingency.present(y) : !0, x = c[d.id];
40
+ if (x) {
41
+ if (x.present !== m && (c = {
42
+ ...c,
43
+ [d.id]: { ...x, present: m }
44
+ }), d.contingency.configure && m) {
45
+ const f = d.contingency.configure(y);
46
+ if (f.chipOverrides)
47
+ for (const [h, C] of Object.entries(f.chipOverrides)) {
48
+ const w = e.domains[h];
49
+ w && (l = { ...l, [h]: { ...w, ...C } });
50
+ }
51
+ }
52
+ if (m)
53
+ for (const f of d.chips) {
54
+ const h = l[f.id];
55
+ if (h != null && h.onContextChange) {
56
+ const C = h.onContextChange(y);
57
+ l = { ...l, [f.id]: { ...h, ...C } };
58
+ }
59
+ }
60
+ if (m) {
61
+ const f = S(
62
+ d.id,
63
+ d,
64
+ c[d.id].chips,
65
+ s,
66
+ i
67
+ );
68
+ c = z(d, e, l, c, f);
69
+ } else
70
+ c = z(d, e, l, c);
71
+ if (m) {
72
+ const f = c[d.id];
73
+ if (f) {
74
+ const h = S(
75
+ d.id,
76
+ d,
77
+ f.chips,
78
+ s,
79
+ i
80
+ ), C = V(d.segments, h);
81
+ c = {
82
+ ...c,
83
+ [d.id]: {
84
+ ...f,
85
+ visibleChips: C,
86
+ valid: _(f.chips, C)
87
+ }
88
+ };
89
+ }
90
+ }
91
+ if (m && d.contextProductions && ((v = c[d.id]) != null && v.present)) {
92
+ const f = T(
93
+ d.contextProductions,
94
+ c[d.id]
95
+ ), h = E(
96
+ { ...e, state: { ...e.state, contexts: i, clauses: c }, domains: l },
97
+ d.id,
98
+ f
99
+ );
100
+ c = h.state.clauses, i = h.state.contexts, l = h.domains;
101
+ }
102
+ if (!m) {
103
+ i = i.filter((h) => h.clauseId !== d.id);
104
+ const f = $(d.id, e.clausesBySuper, c, i);
105
+ c = f.clauses, i = f.contexts;
106
+ }
107
+ }
108
+ }
109
+ return {
110
+ ...e,
111
+ domains: l,
112
+ state: {
113
+ ...e.state,
114
+ contexts: i,
115
+ clauses: c,
116
+ valid: I(c)
117
+ }
118
+ };
119
+ }
120
+ function z(e, t, n, s, o) {
121
+ let u = s;
122
+ for (const r of e.chips) {
123
+ const a = n[r.id] !== t.domains[r.id];
124
+ if (!a && !o) continue;
125
+ const i = u[e.id], c = i == null ? void 0 : i.chips[r.id];
126
+ if (i && c) {
127
+ const l = n[r.id], p = a ? l.validate(c.value) : c.valid, v = j(l, c.value, p, o);
128
+ if (v === c.displayValue && p === c.valid) continue;
129
+ const d = {
130
+ ...c,
131
+ valid: p,
132
+ displayValue: v
133
+ }, y = { ...i.chips, [r.id]: d };
134
+ u = {
135
+ ...u,
136
+ [e.id]: {
137
+ ...i,
138
+ chips: y,
139
+ valid: _(y, i.visibleChips)
140
+ }
141
+ };
142
+ }
143
+ }
144
+ return u;
145
+ }
146
+ function $(e, t, n, s) {
147
+ let o = n, u = s;
148
+ const r = t.get(e) ?? [];
149
+ for (const a of r) {
150
+ const i = o[a.id];
151
+ if (i != null && i.present) {
152
+ o = { ...o, [a.id]: { ...i, present: !1 } }, u = u.filter((l) => l.clauseId !== a.id);
153
+ const c = $(a.id, t, o, u);
154
+ o = c.clauses, u = c.contexts;
155
+ }
156
+ }
157
+ return { clauses: o, contexts: u };
158
+ }
159
+ function Y(e) {
160
+ let t = e;
161
+ for (const n of e.definition.clauses) {
162
+ if (!n.contextProductions) continue;
163
+ const s = t.state.clauses[n.id];
164
+ if (!(s != null && s.present)) continue;
165
+ const o = T(
166
+ n.contextProductions,
167
+ s
168
+ );
169
+ t = E(t, n.id, o);
170
+ }
171
+ return t;
172
+ }
173
+ function J(e, t) {
174
+ const n = t.domains[e];
175
+ if (!n)
176
+ throw new Error(
177
+ `Domain "${e}" not found in palette. Available domains: ${Object.keys(t.domains).join(", ") || "(none)"}`
178
+ );
179
+ return n;
180
+ }
181
+ function j(e, t, n, s) {
182
+ return n ? e.display(t, s) : e.placeholder ?? e.display(t, s);
183
+ }
184
+ function _(e, t) {
185
+ for (const [n, s] of Object.entries(e))
186
+ if (!(t && !t.includes(n)) && !s.valid)
187
+ return !1;
188
+ return !0;
189
+ }
190
+ function I(e) {
191
+ return Object.values(e).every((t) => !(t.present && t.active) || t.valid);
192
+ }
193
+ function T(e, t) {
194
+ const n = {};
195
+ for (const [s, o] of Object.entries(e)) {
196
+ if (t.visibleChips && !t.visibleChips.includes(o)) continue;
197
+ const u = t.chips[o];
198
+ u && (n[s] = u.value);
199
+ }
200
+ return n;
201
+ }
202
+ function V(e, t) {
203
+ let n = !1;
204
+ const s = [];
205
+ for (const o of e)
206
+ o.type === "chip" && (o.present ? (n = !0, o.present(t) && s.push(o.chipId)) : s.push(o.chipId));
207
+ return n ? s : void 0;
208
+ }
209
+ function M(e, t) {
210
+ const n = {}, s = {}, o = t == null ? void 0 : t.__active, u = t == null ? void 0 : t.__expressionMode;
211
+ for (const l of e.clauses) {
212
+ const p = {};
213
+ for (const x of l.chips) {
214
+ const f = J(x.domainName, e.palette);
215
+ n[x.id] = f;
216
+ const h = t == null ? void 0 : t[x.id], C = h !== void 0 ? h : f.defaultValue, w = f.validate(C);
217
+ p[x.id] = {
218
+ value: C,
219
+ displayValue: j(f, C, w),
220
+ valid: w,
221
+ dirty: h !== void 0,
222
+ expressionMode: (u == null ? void 0 : u[x.id]) ?? void 0
223
+ };
224
+ }
225
+ const v = V(l.segments, {}), d = l.necessity === "optional", y = !d, m = d && o ? o[l.id] ?? y : y;
226
+ s[l.id] = {
227
+ present: !l.contingency,
228
+ active: m,
229
+ chips: p,
230
+ valid: _(p, v),
231
+ visibleChips: v
232
+ };
233
+ }
234
+ const r = {
235
+ clauses: s,
236
+ contexts: [],
237
+ valid: I(s)
238
+ }, a = new Map(e.clauses.map((l) => [l.id, l])), i = /* @__PURE__ */ new Map();
239
+ for (const l of e.clauses)
240
+ if (l.contingency) {
241
+ const p = l.contingency.superclauseId, v = i.get(p);
242
+ v ? v.push(l) : i.set(p, [l]);
243
+ }
244
+ return Y({ state: r, domains: n, definition: e, clauseById: a, clausesBySuper: i });
245
+ }
246
+ const Q = Symbol("chipper:trigger");
247
+ function W(e, t) {
248
+ var w, b;
249
+ const { clauseId: n, chipId: s, value: o } = t, u = e.domains[s], r = e.state.clauses[n];
250
+ if (!u)
251
+ throw new Error(`Domain not resolved for chip "${s}".`);
252
+ if (!r)
253
+ throw new Error(`Clause "${n}" not found in sentence state.`);
254
+ const a = (w = u.meta) == null ? void 0 : w.trigger;
255
+ let i = o, c = (b = r.chips[s]) == null ? void 0 : b.expressionMode;
256
+ a && (o === Q ? (c = !0, i = a.default) : c && u.keywords.some((g) => g.value === o) && (c = !1));
257
+ const l = u.validate(i), p = e.clauseById.get(n), v = { ...r.chips, [s]: { ...r.chips[s], value: i } }, d = p ? S(n, p, v, e.clauseById, e.state.contexts) : void 0, y = {
258
+ value: i,
259
+ displayValue: j(u, i, l, d),
260
+ valid: l,
261
+ dirty: !0,
262
+ // false → undefined so the field is absent (not false) when not in expression mode
263
+ expressionMode: c || void 0
264
+ }, m = { ...r.chips, [s]: y };
265
+ let x = r.visibleChips;
266
+ if (p && p.segments.some(
267
+ (P) => P.type === "chip" && P.present
268
+ )) {
269
+ const P = d ?? S(
270
+ n,
271
+ p,
272
+ m,
273
+ e.clauseById,
274
+ e.state.contexts
275
+ );
276
+ x = V(p.segments, P);
277
+ }
278
+ const f = {
279
+ ...r,
280
+ chips: m,
281
+ valid: _(m, x),
282
+ visibleChips: x
283
+ }, h = {
284
+ ...e.state.clauses,
285
+ [n]: f
286
+ }, C = {
287
+ ...e,
288
+ state: {
289
+ ...e.state,
290
+ clauses: h,
291
+ valid: I(h)
292
+ }
293
+ };
294
+ if (p != null && p.contextProductions) {
295
+ const g = T(p.contextProductions, f);
296
+ return E(C, n, g);
297
+ }
298
+ return C;
299
+ }
300
+ function Z(e, t) {
301
+ const { clauseId: n } = t, s = e.state.clauses[n];
302
+ if (!s)
303
+ throw new Error(`Clause "${n}" not found in sentence state.`);
304
+ const o = { ...s, active: !s.active }, u = { ...e.state.clauses, [n]: o };
305
+ return {
306
+ ...e,
307
+ state: {
308
+ ...e.state,
309
+ clauses: u,
310
+ valid: I(u)
311
+ }
312
+ };
313
+ }
314
+ function N(e, t) {
315
+ return E(e, t.clauseId, t.values);
316
+ }
317
+ function ee(e, t) {
318
+ const { chipId: n, value: s, loading: o, error: u } = t, r = e.domains[n];
319
+ if (!r) return e;
320
+ let a;
321
+ for (const f of e.definition.clauses)
322
+ if (f.chips.some((h) => h.id === n)) {
323
+ a = f.id;
324
+ break;
325
+ }
326
+ if (!a) return e;
327
+ const i = e.state.clauses[a];
328
+ if (!i) return e;
329
+ const c = i.chips[n];
330
+ if (!c) return e;
331
+ const l = o ? c.valid : r.validate(s), p = o ? c.displayValue : j(r, s, l), v = {
332
+ ...c,
333
+ value: o ? c.value : s,
334
+ displayValue: p,
335
+ valid: l,
336
+ loading: o ?? !1,
337
+ error: u ?? void 0,
338
+ lastUpdated: !o && !u ? Date.now() : c.lastUpdated
339
+ }, d = { ...i.chips, [n]: v }, y = {
340
+ ...i,
341
+ chips: d,
342
+ valid: _(d, i.visibleChips)
343
+ }, m = { ...e.state.clauses, [a]: y }, x = {
344
+ ...e.state,
345
+ clauses: m,
346
+ valid: I(m)
347
+ };
348
+ return { ...e, state: x };
349
+ }
350
+ function te(e, t) {
351
+ switch (t.type) {
352
+ case "SET_CHIP_VALUE":
353
+ return W(e, t);
354
+ case "TOGGLE_CLAUSE":
355
+ return Z(e, t);
356
+ case "SET_CONTEXT":
357
+ return N(e, t);
358
+ case "SET_DISPLAY_VALUE":
359
+ return ee(e, t);
360
+ }
361
+ }
362
+ function ae(e, t) {
363
+ if (e.serializer)
364
+ return e.serializer(t);
365
+ const n = {}, s = {}, o = {};
366
+ for (const u of e.clauses) {
367
+ const r = t.clauses[u.id];
368
+ if (r && !(!r.present || !r.active)) {
369
+ u.necessity === "optional" && (s[u.id] = !0);
370
+ for (const a of u.chips) {
371
+ if (a.mode.type === "display" && a.mode.source.type !== "static") continue;
372
+ const c = r.chips[a.id];
373
+ c && (n[a.id] = c.value, c.expressionMode && (o[a.id] = !0));
374
+ }
375
+ }
376
+ }
377
+ return Object.keys(s).length > 0 && (n.__active = s), Object.keys(o).length > 0 && (n.__expressionMode = o), n;
378
+ }
379
+ function ue(e, t) {
380
+ const n = e.deserializer ? e.deserializer(t) : t;
381
+ return M(e, n);
382
+ }
383
+ const k = {
384
+ domains: {},
385
+ clauseTemplates: {}
386
+ };
387
+ function le(e) {
388
+ return { ...e };
389
+ }
390
+ function de(e, t) {
391
+ const n = t !== void 0 ? e : k, s = t !== void 0 ? t : e;
392
+ if ("domains" in s && !("chips" in s))
393
+ throw new Error(
394
+ "extendPalette() expects { chips, patterns }, not { domains, clauseTemplates }. See builder-dx.md §6."
395
+ );
396
+ return {
397
+ domains: { ...n.domains, ...s.chips },
398
+ clauseTemplates: { ...n.clauseTemplates, ...s.patterns }
399
+ };
400
+ }
401
+ function ne(e) {
402
+ if (typeof e == "function")
403
+ return { type: "derived", compute: e };
404
+ if (typeof e == "object" && e !== null) {
405
+ const t = e;
406
+ if ("url" in t && typeof t.url == "string")
407
+ return {
408
+ type: "remote",
409
+ url: t.url,
410
+ extract: t.extract,
411
+ interval: t.interval
412
+ };
413
+ if ("subscribe" in t)
414
+ return {
415
+ type: "external",
416
+ subscribe: t.subscribe
417
+ };
418
+ }
419
+ return { type: "static", value: e };
420
+ }
421
+ function se(e, t, n) {
422
+ typeof t == "object" && t !== null && (n = t, t = void 0);
423
+ let s = { type: "interactive" };
424
+ return (n == null ? void 0 : n.display) !== void 0 ? s = { type: "display", source: ne(n.display), info: n.info } : n != null && n.mode && (s = n.mode), {
425
+ id: e,
426
+ domainName: t ?? e,
427
+ mode: s
428
+ };
429
+ }
430
+ function pe() {
431
+ const e = [], t = [];
432
+ let n = "required", s, o, u;
433
+ const r = {
434
+ required() {
435
+ return n = "required", r;
436
+ },
437
+ optional() {
438
+ return n = "optional", r;
439
+ },
440
+ text(a, i) {
441
+ return e.push({ type: "text", value: a, present: i == null ? void 0 : i.present }), r;
442
+ },
443
+ leads(a, i) {
444
+ return e.push({ type: "text", value: a }), r;
445
+ },
446
+ placeholder(a) {
447
+ return s = a, r;
448
+ },
449
+ chip(a, i, c) {
450
+ typeof i == "object" && i !== null && (c = i, i = void 0);
451
+ const l = se(a, i, c);
452
+ return t.push(l), e.push({ type: "chip", chipId: a, present: c == null ? void 0 : c.present }), r;
453
+ },
454
+ punc(a) {
455
+ return e.push({
456
+ type: "text",
457
+ value: "__punctuation_sentinel__",
458
+ __punctuation: { config: a }
459
+ }), r;
460
+ },
461
+ contingentOn(a, i) {
462
+ return o = typeof i == "function" ? { superclauseId: a, present: i } : { superclauseId: a, ...i }, r;
463
+ },
464
+ produces(a) {
465
+ return typeof a == "string" ? u = { [a]: a } : u = a, r;
466
+ },
467
+ _build(a) {
468
+ return {
469
+ id: a,
470
+ necessity: n,
471
+ segments: e,
472
+ chips: t,
473
+ placeholder: s,
474
+ contingency: o,
475
+ contextProductions: u
476
+ };
477
+ }
478
+ };
479
+ return r;
480
+ }
481
+ function fe(e, t) {
482
+ const n = e._build("__template__"), s = n.segments.find((r) => r.type === "text"), o = (s == null ? void 0 : s.type) === "text" ? s.value : "", u = typeof o == "function" ? "" : o;
483
+ return {
484
+ firstLead: u,
485
+ restLead: u,
486
+ min: t.min ?? 0,
487
+ max: t.max ?? 5,
488
+ template: n
489
+ };
490
+ }
491
+ function ce(e, t, n) {
492
+ const s = n.clauses[e];
493
+ return !(s != null && s.present) || !(s != null && s.active) ? "" : t.some((u) => {
494
+ const r = n.clauses[u];
495
+ return r && r.present && r.active;
496
+ }) ? "," : ".";
497
+ }
498
+ function he(e) {
499
+ const t = e ?? k, n = [], s = [];
500
+ let o = -1, u, r;
501
+ function a(c) {
502
+ o < 0 && (s.push({ clauseIds: [], indent: c == null ? void 0 : c.indent }), o = 0);
503
+ }
504
+ const i = {
505
+ clause(c, l) {
506
+ return a(), n.push(l._build(c)), s[o].clauseIds.push(c), i;
507
+ },
508
+ clauses(c) {
509
+ a();
510
+ for (const l of c) {
511
+ const p = `_composed_${n.length}`;
512
+ n.push(l._build(p)), s[o].clauseIds.push(p);
513
+ }
514
+ return i;
515
+ },
516
+ line(c) {
517
+ return s.push({ clauseIds: [], indent: c == null ? void 0 : c.indent }), o = s.length - 1, i;
518
+ },
519
+ serializer(c) {
520
+ return u = c, i;
521
+ },
522
+ deserializer(c) {
523
+ return r = c, i;
524
+ },
525
+ build() {
526
+ const c = /* @__PURE__ */ new Set();
527
+ for (const d of n)
528
+ for (const y of d.chips) {
529
+ if (c.has(y.id))
530
+ throw new Error(`Duplicate chip ID "${y.id}" in sentence definition`);
531
+ c.add(y.id);
532
+ }
533
+ const l = {
534
+ clauses: n,
535
+ lines: s.length > 0 ? s : void 0,
536
+ palette: t,
537
+ serializer: u,
538
+ deserializer: r
539
+ }, p = new Map(l.clauses.map((d) => [d.id, d])), v = l.lines ? l.lines.flatMap((d) => d.clauseIds) : l.clauses.map((d) => d.id);
540
+ for (const d of l.clauses)
541
+ for (let y = 0; y < d.segments.length; y++) {
542
+ const m = d.segments[y];
543
+ if (m.__punctuation) {
544
+ const { config: x } = m.__punctuation, f = d.id, h = v.indexOf(f), C = v.slice(h + 1);
545
+ d.segments[y] = {
546
+ type: "text",
547
+ value: x != null && x.display ? (w) => {
548
+ const b = w.clauses[f];
549
+ if (!(b != null && b.present) || !(b != null && b.active)) return "";
550
+ const g = S(f, d, b.chips, p, w.contexts);
551
+ return x.display(g);
552
+ } : (w) => ce(f, C, w),
553
+ present: x == null ? void 0 : x.present
554
+ };
555
+ }
556
+ }
557
+ return l;
558
+ }
559
+ };
560
+ return i;
561
+ }
562
+ const A = {
563
+ chipId: null,
564
+ clauseId: null,
565
+ anchorElement: null
566
+ }, O = F(null);
567
+ function ve({ definition: e, initialValues: t, onChange: n, children: s }) {
568
+ const [o, u] = U(
569
+ te,
570
+ void 0,
571
+ () => M(e, t)
572
+ ), [r, a] = G(A), i = R(n);
573
+ i.current = n, H(() => {
574
+ var l;
575
+ (l = i.current) == null || l.call(i, o.state);
576
+ }, [o.state]);
577
+ const c = K(
578
+ () => ({ store: o, dispatch: u, definition: e, popupState: r, setPopupState: a }),
579
+ [o, u, e, r, a]
580
+ );
581
+ return /* @__PURE__ */ q(O.Provider, { value: c, children: s });
582
+ }
583
+ function ie() {
584
+ const e = B(O);
585
+ if (!e)
586
+ throw new Error("useSentence must be used within a <SentenceProvider>.");
587
+ return {
588
+ state: e.store.state,
589
+ dispatch: e.dispatch,
590
+ definition: e.definition,
591
+ domains: e.store.domains,
592
+ clauseById: e.store.clauseById
593
+ };
594
+ }
595
+ function ye(e, t) {
596
+ var l, p;
597
+ const { state: n, dispatch: s, definition: o, domains: u } = ie(), r = (l = n.clauses[e]) == null ? void 0 : l.chips[t];
598
+ if (!r)
599
+ throw new Error(`Chip "${t}" not found in clause "${e}".`);
600
+ const a = u[t];
601
+ if (!a)
602
+ throw new Error(`Domain not resolved for chip "${t}".`);
603
+ const i = (p = o.clauses.find((v) => v.id === e)) == null ? void 0 : p.chips.find((v) => v.id === t);
604
+ if (!i)
605
+ throw new Error(`Chip definition "${t}" not found in clause "${e}".`);
606
+ const c = D(
607
+ (v) => {
608
+ s({ type: "SET_CHIP_VALUE", clauseId: e, chipId: t, value: v });
609
+ },
610
+ [s, e, t]
611
+ );
612
+ return {
613
+ ...r,
614
+ domain: a,
615
+ chipDefinition: i,
616
+ setValue: c
617
+ };
618
+ }
619
+ function xe() {
620
+ const e = B(O);
621
+ if (!e)
622
+ throw new Error("usePopup must be used within a <SentenceProvider>.");
623
+ const { popupState: t, setPopupState: n } = e, s = D(
624
+ (r, a, i) => {
625
+ n({ chipId: a, clauseId: r, anchorElement: i });
626
+ },
627
+ [n]
628
+ ), o = D(() => {
629
+ n(A);
630
+ }, [n]), u = D(
631
+ (r) => t.chipId === r,
632
+ [t.chipId]
633
+ );
634
+ return { popup: t, open: s, close: o, isOpen: u };
635
+ }
636
+ export {
637
+ ve as S,
638
+ Q as T,
639
+ le as a,
640
+ pe as b,
641
+ se as c,
642
+ ue as d,
643
+ de as e,
644
+ te as f,
645
+ ae as g,
646
+ xe as h,
647
+ M as i,
648
+ ie as j,
649
+ S as k,
650
+ fe as r,
651
+ he as s,
652
+ ye as u
653
+ };