mlform 0.1.7 → 0.1.8

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 (218) hide show
  1. package/README.md +39 -12
  2. package/dist/builtins-DegwhFGA.js +3507 -0
  3. package/dist/builtins-ml-9qB2MOxt.js +51 -0
  4. package/dist/{design-system-CrrSGfFB.js → design-system-Dxx1Sh7r.js} +284 -268
  5. package/dist/errors-B3H1wRwj.js +8 -0
  6. package/dist/kit-CuRF6dhL.js +1847 -0
  7. package/dist/mlform/behaviors.mjs +32 -0
  8. package/dist/mlform/builtins-ml.mjs +3 -0
  9. package/dist/mlform/design-system.mjs +1 -1
  10. package/dist/mlform/kit.mjs +3 -3
  11. package/dist/mlform/presentation.mjs +2 -0
  12. package/dist/mlform/primitives.mjs +2 -2
  13. package/dist/mlform/runtime.mjs +5 -0
  14. package/dist/mlform/schema.mjs +102 -0
  15. package/dist/mlform/transport.mjs +2 -2
  16. package/dist/mlform.mjs +8 -4
  17. package/dist/presentation-CkQuYheR.js +200 -0
  18. package/dist/{primitives-BqjFDDhL.js → primitives-Duag8Lj0.js} +1367 -1312
  19. package/dist/runtime-DMjDVo0H.js +1824 -0
  20. package/dist/strings-CWwrrYzz.js +4 -0
  21. package/dist/{transport-A1RsnZhD.js → transport-CtVX8ZUT.js} +311 -336
  22. package/dist/types/src/behaviors/index.d.ts +3 -0
  23. package/dist/types/src/builtins-ml/index.d.ts +5 -0
  24. package/dist/types/src/design-system/runtime/fingerprint.d.ts +8 -0
  25. package/dist/types/src/design-system/runtime/host-observer.d.ts +1 -0
  26. package/dist/types/src/design-system/runtime/hydration-state.d.ts +13 -0
  27. package/dist/types/src/design-system/runtime/inherited-scheme.d.ts +5 -0
  28. package/dist/types/src/design-system/runtime/media.d.ts +19 -0
  29. package/dist/types/src/index.d.ts +10 -4
  30. package/dist/types/src/kit/accordion-root-styles.d.ts +1 -0
  31. package/dist/types/src/kit/accordion-root.d.ts +24 -0
  32. package/dist/types/src/kit/accordion.d.ts +2 -0
  33. package/dist/types/src/kit/constants.d.ts +29 -0
  34. package/dist/types/src/kit/defaults.d.ts +2 -2
  35. package/dist/types/src/kit/index.d.ts +6 -1
  36. package/dist/types/src/kit/layout-helpers.d.ts +29 -0
  37. package/dist/types/src/kit/layout-node-render.d.ts +18 -0
  38. package/dist/types/src/kit/layout-node-resolver.d.ts +3 -0
  39. package/dist/types/src/kit/layout-types.d.ts +124 -0
  40. package/dist/types/src/kit/layout-utils.d.ts +9 -0
  41. package/dist/types/src/kit/layout.d.ts +8 -0
  42. package/dist/types/src/kit/mount-types.d.ts +54 -0
  43. package/dist/types/src/kit/panel-nav.d.ts +9 -0
  44. package/dist/types/src/{questionnaire/primitives/components → kit}/step-indicator.d.ts +3 -3
  45. package/dist/types/src/kit/tabs-root-styles.d.ts +1 -0
  46. package/dist/types/src/kit/tabs-root.d.ts +24 -0
  47. package/dist/types/src/kit/tabs.d.ts +2 -0
  48. package/dist/types/src/kit/types.d.ts +4 -51
  49. package/dist/types/src/kit/view-layout-state.d.ts +14 -0
  50. package/dist/types/src/kit/view-navigation.d.ts +8 -0
  51. package/dist/types/src/kit/view-snapshot-cache.d.ts +14 -0
  52. package/dist/types/src/kit/view-snapshot.d.ts +15 -0
  53. package/dist/types/src/kit/view-types.d.ts +172 -0
  54. package/dist/types/src/kit/view.d.ts +8 -0
  55. package/dist/types/src/kit/wizard-constants.d.ts +19 -0
  56. package/dist/types/src/kit/wizard-root-styles.d.ts +1 -0
  57. package/dist/types/src/kit/wizard-root.d.ts +23 -0
  58. package/dist/types/src/kit/wizard.d.ts +2 -0
  59. package/dist/types/src/packs/default.d.ts +2 -0
  60. package/dist/types/src/packs/index.d.ts +3 -0
  61. package/dist/types/src/packs/ml.d.ts +2 -0
  62. package/dist/types/src/packs/shared.d.ts +25 -0
  63. package/dist/types/src/presentation/define-explanation-kind.d.ts +11 -0
  64. package/dist/types/src/presentation/define-field-kind.d.ts +18 -0
  65. package/dist/types/src/presentation/define-report-kind.d.ts +15 -0
  66. package/dist/types/src/presentation/index.d.ts +10 -0
  67. package/dist/types/src/presentation/register-kind.d.ts +6 -0
  68. package/dist/types/src/presentation/registry.d.ts +15 -0
  69. package/dist/types/src/presentation/types/explanation.d.ts +32 -0
  70. package/dist/types/src/presentation/types/field.d.ts +36 -0
  71. package/dist/types/src/presentation/types/report.d.ts +41 -0
  72. package/dist/types/src/primitives/base-explanation-element.d.ts +2 -1
  73. package/dist/types/src/primitives/base-field-element.d.ts +2 -1
  74. package/dist/types/src/primitives/base-report-element.d.ts +2 -1
  75. package/dist/types/src/primitives/components/explanation-panel.d.ts +4 -2
  76. package/dist/types/src/primitives/components/field-frame-feedback.d.ts +9 -0
  77. package/dist/types/src/primitives/components/field-frame-styles.d.ts +1 -0
  78. package/dist/types/src/primitives/components/field-frame.d.ts +5 -3
  79. package/dist/types/src/primitives/components/form-errors.d.ts +1 -1
  80. package/dist/types/src/primitives/components/form-root-presenters.d.ts +17 -0
  81. package/dist/types/src/primitives/components/form-root-state.d.ts +19 -0
  82. package/dist/types/src/primitives/components/form-root-styles.d.ts +1 -0
  83. package/dist/types/src/primitives/components/form-root-templates.d.ts +42 -0
  84. package/dist/types/src/primitives/components/form-root.d.ts +4 -2
  85. package/dist/types/src/primitives/components/presentation.d.ts +1 -1
  86. package/dist/types/src/primitives/components/report-frame.d.ts +4 -2
  87. package/dist/types/src/primitives/components/submit-button.d.ts +1 -1
  88. package/dist/types/src/primitives/constants.d.ts +1 -1
  89. package/dist/types/src/primitives/fields/series-field-helpers.d.ts +23 -0
  90. package/dist/types/src/primitives/fields/series-field-styles.d.ts +1 -0
  91. package/dist/types/src/primitives/mount-form.d.ts +1 -1
  92. package/dist/types/src/primitives/presentation.d.ts +8 -0
  93. package/dist/types/src/primitives/types.d.ts +4 -1
  94. package/dist/types/src/{engine → runtime}/builtins/index.d.ts +1 -3
  95. package/dist/types/src/{engine → runtime}/builtins/reports/classifier.d.ts +1 -1
  96. package/dist/types/src/{engine → runtime}/builtins/shared.d.ts +2 -0
  97. package/dist/types/src/runtime/declarative/presentation.d.ts +61 -0
  98. package/dist/types/src/runtime/fields/state-calculations.d.ts +25 -0
  99. package/dist/types/src/runtime/fields/state.d.ts +2 -0
  100. package/dist/types/src/runtime/form.d.ts +1 -0
  101. package/dist/types/src/runtime/index.d.ts +16 -0
  102. package/dist/types/src/runtime/registry/index.d.ts +5 -0
  103. package/dist/types/src/runtime/runtime-behaviors.d.ts +23 -0
  104. package/dist/types/src/runtime/runtime-controller.d.ts +34 -0
  105. package/dist/types/src/runtime/runtime-refresh.d.ts +14 -0
  106. package/dist/types/src/runtime/runtime-values.d.ts +19 -0
  107. package/dist/types/src/runtime/submission/create-submitter.d.ts +2 -0
  108. package/dist/types/src/runtime/submission/error-flow.d.ts +19 -0
  109. package/dist/types/src/runtime/submission/field-updates.d.ts +14 -0
  110. package/dist/types/src/runtime/submission/report-updates.d.ts +16 -0
  111. package/dist/types/src/runtime/submission/stream-progress.d.ts +4 -0
  112. package/dist/types/src/runtime/submission/submitter.d.ts +2 -0
  113. package/dist/types/src/runtime/submission/types.d.ts +60 -0
  114. package/dist/types/src/runtime/types/behavior.d.ts +32 -0
  115. package/dist/types/src/runtime/types/explanation.d.ts +22 -0
  116. package/dist/types/src/runtime/types/field.d.ts +24 -0
  117. package/dist/types/src/{engine → runtime}/types/form.d.ts +8 -11
  118. package/dist/types/src/runtime/types/index.d.ts +9 -0
  119. package/dist/types/src/runtime/types/registry.d.ts +6 -0
  120. package/dist/types/src/runtime/types/report.d.ts +23 -0
  121. package/dist/types/src/{engine → runtime}/utils.d.ts +2 -2
  122. package/dist/types/src/{engine/validation/field.d.ts → runtime/validation/field-state.d.ts} +3 -19
  123. package/dist/types/src/runtime/validation/field-validator.d.ts +18 -0
  124. package/dist/types/src/runtime/validation/field.d.ts +2 -0
  125. package/dist/types/src/schema/index.d.ts +7 -0
  126. package/dist/types/src/schema/normalize.d.ts +2 -0
  127. package/dist/types/src/schema/registry.d.ts +9 -0
  128. package/dist/types/src/schema/types/explanation.d.ts +43 -0
  129. package/dist/types/src/{engine → schema}/types/field.d.ts +3 -45
  130. package/dist/types/src/schema/types/form.d.ts +13 -0
  131. package/dist/types/src/schema/types/report.d.ts +43 -0
  132. package/dist/types/src/shared/index.d.ts +2 -0
  133. package/dist/types/src/shared/object.d.ts +1 -0
  134. package/dist/types/src/shared/strings.d.ts +1 -0
  135. package/dist/types/src/transport/composition/fanout-helpers.d.ts +2 -0
  136. package/dist/types/src/transport/composition/fanout.d.ts +1 -2
  137. package/dist/types/src/transport/composition/index.d.ts +1 -0
  138. package/dist/types/src/transport/composition/quorum-fanout.d.ts +2 -0
  139. package/dist/types/src/transport/internal-core.d.ts +21 -0
  140. package/dist/types/src/transport/internal-errors.d.ts +21 -0
  141. package/dist/types/src/transport/internal-request.d.ts +21 -0
  142. package/dist/types/src/transport/internal-routing.d.ts +25 -0
  143. package/dist/types/src/transport/internal-sse.d.ts +14 -0
  144. package/dist/types/src/transport/internal-stream.d.ts +13 -0
  145. package/dist/types/src/transport/internal.d.ts +6 -110
  146. package/dist/types/src/transport/types/options-http.d.ts +85 -0
  147. package/dist/types/src/transport/types/options-middleware.d.ts +96 -0
  148. package/dist/types/src/transport/types/options-routing.d.ts +82 -0
  149. package/dist/types/src/transport/types/options.d.ts +3 -258
  150. package/package.json +20 -8
  151. package/dist/engine-CEy1IX7y.js +0 -5367
  152. package/dist/kit-DrrbtxI2.js +0 -76
  153. package/dist/mlform/engine.mjs +0 -3
  154. package/dist/mlform/questionnaire.mjs +0 -640
  155. package/dist/types/src/engine/index.d.ts +0 -11
  156. package/dist/types/src/engine/registry/index.d.ts +0 -26
  157. package/dist/types/src/engine/submission/submitter.d.ts +0 -40
  158. package/dist/types/src/engine/types/explanation.d.ts +0 -109
  159. package/dist/types/src/engine/types/index.d.ts +0 -9
  160. package/dist/types/src/engine/types/report.d.ts +0 -87
  161. package/dist/types/src/questionnaire/constants.d.ts +0 -31
  162. package/dist/types/src/questionnaire/defaults.d.ts +0 -8
  163. package/dist/types/src/questionnaire/engine/controller.d.ts +0 -12
  164. package/dist/types/src/questionnaire/engine/schema.d.ts +0 -9
  165. package/dist/types/src/questionnaire/errors.d.ts +0 -3
  166. package/dist/types/src/questionnaire/index.d.ts +0 -6
  167. package/dist/types/src/questionnaire/mount.d.ts +0 -3
  168. package/dist/types/src/questionnaire/primitives/components/questionnaire-root.d.ts +0 -23
  169. package/dist/types/src/questionnaire/primitives/register.d.ts +0 -0
  170. package/dist/types/src/questionnaire/types.d.ts +0 -69
  171. package/dist/types/src/{engine/declarative → presentation/types}/presentation.d.ts +0 -0
  172. package/dist/types/src/{engine → runtime}/builtins/fields/boolean.d.ts +0 -0
  173. package/dist/types/src/{engine → runtime}/builtins/fields/category.d.ts +0 -0
  174. package/dist/types/src/{engine → runtime}/builtins/fields/date.d.ts +0 -0
  175. package/dist/types/src/{engine → runtime}/builtins/fields/long-text.d.ts +0 -0
  176. package/dist/types/src/{engine → runtime}/builtins/fields/mapped-category.d.ts +0 -0
  177. package/dist/types/src/{engine → runtime}/builtins/fields/multi-choice.d.ts +0 -0
  178. package/dist/types/src/{engine → runtime}/builtins/fields/number.d.ts +0 -0
  179. package/dist/types/src/{engine → runtime}/builtins/fields/rating.d.ts +0 -0
  180. package/dist/types/src/{engine → runtime}/builtins/fields/series.d.ts +0 -0
  181. package/dist/types/src/{engine → runtime}/builtins/fields/single-choice.d.ts +0 -0
  182. package/dist/types/src/{engine → runtime}/builtins/fields/text.d.ts +0 -0
  183. package/dist/types/src/{engine → runtime}/builtins/reports/regressor.d.ts +0 -0
  184. package/dist/types/src/{engine → runtime}/comparison.d.ts +0 -0
  185. package/dist/types/src/{engine → runtime}/constants.d.ts +0 -0
  186. package/dist/types/src/{engine/form.d.ts → runtime/create-runtime.d.ts} +0 -0
  187. package/dist/types/src/{engine → runtime}/declarative/explanation.d.ts +0 -0
  188. package/dist/types/src/{engine → runtime}/declarative/field.d.ts +0 -0
  189. package/dist/types/src/{engine → runtime}/declarative/report.d.ts +0 -0
  190. package/dist/types/src/{engine → runtime}/equality.d.ts +0 -0
  191. package/dist/types/src/{engine → runtime}/errors.d.ts +0 -0
  192. package/dist/types/src/{engine → runtime}/explanations/controller.d.ts +0 -0
  193. package/dist/types/src/{engine → runtime}/explanations/index.d.ts +0 -0
  194. package/dist/types/src/{engine → runtime}/fields/controller.d.ts +0 -0
  195. package/dist/types/src/{engine → runtime}/fields/index.d.ts +0 -0
  196. package/dist/types/src/{engine → runtime}/paths.d.ts +0 -0
  197. package/dist/types/src/{engine → runtime}/reports/controller.d.ts +0 -0
  198. package/dist/types/src/{engine → runtime}/reports/index.d.ts +0 -0
  199. package/dist/types/src/{engine → runtime}/schema/index.d.ts +0 -0
  200. package/dist/types/src/{engine → runtime}/state/engine.d.ts +0 -0
  201. package/dist/types/src/{engine → runtime}/state/index.d.ts +0 -0
  202. package/dist/types/src/{engine → runtime}/state/snapshots.d.ts +0 -0
  203. package/dist/types/src/{engine → runtime}/state/store.d.ts +0 -0
  204. package/dist/types/src/{engine → runtime}/submission/abort.d.ts +0 -0
  205. package/dist/types/src/{engine → runtime}/submission/explanations.d.ts +0 -0
  206. package/dist/types/src/{engine → runtime}/submission/index.d.ts +0 -0
  207. package/dist/types/src/{engine → runtime}/submission/lifecycle.d.ts +0 -0
  208. package/dist/types/src/{engine → runtime}/submission/pipeline.d.ts +0 -0
  209. package/dist/types/src/{engine → runtime}/submission/reports.d.ts +0 -0
  210. package/dist/types/src/{engine → runtime}/submission/request.d.ts +0 -0
  211. package/dist/types/src/{engine → runtime}/submission/result.d.ts +0 -0
  212. package/dist/types/src/{engine → runtime}/types/pipeline.d.ts +0 -0
  213. package/dist/types/src/{engine → runtime}/types/transport.d.ts +0 -0
  214. package/dist/types/src/{engine → runtime}/validation/conditions.d.ts +0 -0
  215. package/dist/types/src/{engine → runtime}/validation/form.d.ts +0 -0
  216. package/dist/types/src/{engine → runtime}/validation/index.d.ts +0 -0
  217. package/dist/types/src/{engine → runtime}/values.d.ts +0 -0
  218. package/dist/types/src/{engine → schema}/types/registry.d.ts +1 -1
@@ -0,0 +1,1847 @@
1
+ import { f as e, h as t, r as n } from "./design-system-Dxx1Sh7r.js";
2
+ import { t as r } from "./strings-CWwrrYzz.js";
3
+ import { i, n as a } from "./builtins-ml-9qB2MOxt.js";
4
+ import { a as o, t as s } from "./runtime-DMjDVo0H.js";
5
+ import { _ as c, b as l, d as u, f as d, g as f, h as p, m, o as h, p as g, r as _, s as v, t as y, v as b, x, y as S } from "./primitives-Duag8Lj0.js";
6
+ //#region src/kit/defaults.ts
7
+ var C = { ...d }, w = {
8
+ mode: "auto",
9
+ theme: "neutral",
10
+ recipe: "default"
11
+ }, ee = (e) => {
12
+ if (!e) return a().registry;
13
+ let t = s();
14
+ for (let n of e.listFields()) t.registerField(n);
15
+ for (let n of e.listReports()) t.registerReport(n);
16
+ for (let n of e.listExplanations()) t.registerExplanation(n);
17
+ return t;
18
+ }, te = (e) => e?.clone() ?? _(), ne = (e) => e?.clone() ?? t.clone(), T = (e = {}) => ({
19
+ ...C,
20
+ ...e
21
+ }), E = (t = {}) => e(w, t), re = x`
22
+ :host {
23
+ display: block;
24
+ inline-size: 100%;
25
+ block-size: 100%;
26
+ color: var(--mlf-shell-color, var(--mlf-color-text, #0f172a));
27
+ background: var(--mlf-shell-bg, var(--mlf-color-bg, #f5f7fa));
28
+ font-family: var(--mlf-font-family-body);
29
+ }
30
+ *,
31
+ *::before,
32
+ *::after {
33
+ box-sizing: border-box;
34
+ }
35
+ .root {
36
+ display: grid;
37
+ grid-template-rows: auto 1fr auto;
38
+ min-height: 100%;
39
+ border-radius: var(--mlf-panel-radius, 12px);
40
+ border: var(--mlf-border-width, 1px) solid
41
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
42
+ background: var(--mlf-panel-bg, var(--mlf-color-surface, #ffffff));
43
+ box-shadow:
44
+ 0 2px 4px var(--mlf-panel-shadow-soft, rgba(0, 0, 0, 0.04)),
45
+ 0 8px 16px var(--mlf-panel-shadow, rgba(0, 0, 0, 0.04));
46
+ overflow: hidden;
47
+ }
48
+ .header,
49
+ .footer {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: space-between;
53
+ gap: 0.75rem;
54
+ padding: 0.85rem 1rem;
55
+ background: var(--mlf-panel-header-bg, rgba(255, 255, 255, 0.6));
56
+ border-bottom: var(--mlf-border-width, 1px) solid
57
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
58
+ }
59
+ .footer {
60
+ border-bottom: none;
61
+ border-top: var(--mlf-border-width, 1px) solid
62
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
63
+ background: var(--mlf-panel-footer-bg, var(--mlf-color-bg-light, #f5f7fa));
64
+ }
65
+ .title {
66
+ margin: 0;
67
+ font-size: 1rem;
68
+ font-weight: 700;
69
+ }
70
+ .actions {
71
+ display: inline-flex;
72
+ gap: 0.5rem;
73
+ flex-wrap: wrap;
74
+ }
75
+ .body {
76
+ display: grid;
77
+ gap: 0;
78
+ overflow-y: auto;
79
+ overflow-x: hidden;
80
+ }
81
+ .section + .section {
82
+ border-top: var(--mlf-border-width, 1px) solid
83
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
84
+ }
85
+ .section-toggle {
86
+ inline-size: 100%;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ gap: 0.75rem;
91
+ padding: 1rem;
92
+ border: none;
93
+ background: transparent;
94
+ color: inherit;
95
+ font: inherit;
96
+ text-align: left;
97
+ cursor: pointer;
98
+ }
99
+ .section-copy,
100
+ .nested-copy {
101
+ display: grid;
102
+ gap: 0.35rem;
103
+ }
104
+ .section-title {
105
+ margin: 0;
106
+ font-size: 0.96rem;
107
+ font-weight: 700;
108
+ }
109
+ .section-description,
110
+ .nested-description {
111
+ margin: 0;
112
+ font-size: var(--mlf-font-size-sm, 0.84rem);
113
+ color: var(--mlf-color-text-muted, #475569);
114
+ line-height: 1.5;
115
+ }
116
+ .chevron {
117
+ font-size: 1.1rem;
118
+ color: var(--mlf-color-text-muted, #475569);
119
+ }
120
+ .section-panel {
121
+ display: grid;
122
+ gap: 1rem;
123
+ padding: 0 1rem 1rem;
124
+ }
125
+ .collection,
126
+ .section-children,
127
+ .nested-section,
128
+ .group {
129
+ display: grid;
130
+ gap: var(--mlf-section-gap, 1rem);
131
+ }
132
+ .nested-copy {
133
+ padding: 0 0.5rem;
134
+ }
135
+ .nested-title {
136
+ margin: 0;
137
+ font-size: 0.95rem;
138
+ font-weight: 700;
139
+ }
140
+ .group.columns-2 {
141
+ grid-template-columns: repeat(2, minmax(0, 1fr));
142
+ }
143
+ .group.columns-3 {
144
+ grid-template-columns: repeat(3, minmax(0, 1fr));
145
+ }
146
+ .btn {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ min-height: 2.5rem;
151
+ padding: 0.5rem 1rem;
152
+ border-radius: var(--mlf-input-radius, 12px);
153
+ border: var(--mlf-border-width, 1px) solid var(--mlf-input-border, #e2e8f0);
154
+ background: #fff;
155
+ color: var(--mlf-color-text, #0f172a);
156
+ font: inherit;
157
+ font-size: 0.92rem;
158
+ font-weight: 600;
159
+ cursor: pointer;
160
+ }
161
+ .btn-submit {
162
+ border-color: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
163
+ background: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
164
+ color: var(--mlf-submit-color, #ffffff);
165
+ }
166
+ .btn:disabled {
167
+ cursor: not-allowed;
168
+ opacity: 0.55;
169
+ }
170
+ @media (max-width: 900px) {
171
+ .group.columns-2,
172
+ .group.columns-3 {
173
+ grid-template-columns: minmax(0, 1fr);
174
+ }
175
+ .header,
176
+ .footer {
177
+ flex-direction: column;
178
+ align-items: stretch;
179
+ }
180
+ }
181
+ `, D = {
182
+ invalidDesignSystemSnapshot: "replaceDesignSystem requires an explicit mode, theme, and recipe.",
183
+ fieldDuplicateInLayout: (e) => `Field "${e}" appears multiple times in layout.`,
184
+ fieldMissingInLayout: (e) => `Field "${e}" is missing from layout.`,
185
+ reportDuplicateInLayout: (e) => `Report "${e}" appears multiple times in layout.`,
186
+ explanationDuplicateInLayout: (e) => `Explanation "${e}" appears multiple times in layout.`,
187
+ unknownFieldReference: (e) => `Layout references unknown field "${e}".`,
188
+ unknownReportReference: (e) => `Layout references unknown report "${e}".`,
189
+ unknownExplanationReference: (e) => `Layout references unknown explanation "${e}".`,
190
+ wizardRequiresSteps: "Wizard layout must define at least one step.",
191
+ wizardStepEmpty: (e) => `Wizard step "${e}" must contain at least one layout node.`,
192
+ tabsRequiresTabs: "Tabs layout must define at least one tab.",
193
+ tabEmpty: (e) => `Tab "${e}" must contain at least one layout node.`,
194
+ accordionRequiresSections: "Accordion layout must define at least one section.",
195
+ accordionSectionEmpty: (e) => `Accordion section "${e}" must contain at least one layout node.`,
196
+ wizardMissingLayout: "mountWizardForm requires a wizard layout.",
197
+ tabsMissingLayout: "mountTabsForm requires a tabs layout.",
198
+ accordionMissingLayout: "mountAccordionForm requires an accordion layout.",
199
+ nonWizardNextStep: "nextStep() is only available for wizard layouts.",
200
+ nonWizardGoToStep: "goToStep() is only available for wizard layouts.",
201
+ nonTabsSetActiveTab: "setActiveTab() is only available for tabs layouts.",
202
+ nonAccordionToggleSection: "Accordion section controls are only available for accordion layouts.",
203
+ unknownTab: (e) => `Unknown tab "${e}".`,
204
+ unknownWizardStep: (e) => `Unknown wizard step "${e}".`,
205
+ unknownAccordionSection: (e) => `Unknown accordion section "${e}".`
206
+ }, O = {
207
+ wizard: "mlf-kit-wizard",
208
+ tabs: "mlf-kit-tabs",
209
+ accordion: "mlf-kit-accordion",
210
+ stepIndicator: "mlf-kit-step-indicator"
211
+ }, k = ({ node: e, snapshot: t, registry: n, primitiveText: r = g, sectionClass: i, sectionCopyClass: a, sectionTitleClass: o, sectionDescriptionClass: s, childrenClass: c, groupBaseClass: u }) => {
212
+ switch (e.kind) {
213
+ case "section": return l`
214
+ <section class=${i} data-section-id=${e.id}>
215
+ ${e.title || e.description ? l`
216
+ <div class=${a}>
217
+ ${e.title ? l`<h2 class=${o}>${e.title}</h2>` : S}
218
+ ${e.description ? l`<p class=${s}>${e.description}</p>` : S}
219
+ </div>
220
+ ` : S}
221
+ <div class=${c}>
222
+ ${h(e.children, (t, n) => `${e.id}-${n}`, (e) => k({
223
+ node: e,
224
+ snapshot: t,
225
+ registry: n,
226
+ primitiveText: r,
227
+ sectionClass: i,
228
+ sectionCopyClass: a,
229
+ sectionTitleClass: o,
230
+ sectionDescriptionClass: s,
231
+ childrenClass: c,
232
+ groupBaseClass: u
233
+ }))}
234
+ </div>
235
+ </section>
236
+ `;
237
+ case "group": return l`
238
+ <div
239
+ class=${`${u}${e.columns ? ` columns-${e.columns}` : ""}`}
240
+ data-group-id=${e.id}
241
+ >
242
+ ${h(e.children, (t, n) => `${e.id}-${n}`, (e) => k({
243
+ node: e,
244
+ snapshot: t,
245
+ registry: n,
246
+ primitiveText: r,
247
+ sectionClass: i,
248
+ sectionCopyClass: a,
249
+ sectionTitleClass: o,
250
+ sectionDescriptionClass: s,
251
+ childrenClass: c,
252
+ groupBaseClass: u
253
+ }))}
254
+ </div>
255
+ `;
256
+ case "field": {
257
+ let i = t.fields.find((t) => t.id === e.field);
258
+ return i ? l`
259
+ <mlf-field-frame
260
+ .controller=${i.controller}
261
+ .descriptor=${i.descriptor}
262
+ .registry=${n}
263
+ .text=${r}
264
+ ></mlf-field-frame>
265
+ ` : S;
266
+ }
267
+ case "report": {
268
+ let i = t.reports.find((t) => t.id === e.report);
269
+ return i ? l`
270
+ <mlf-report-frame
271
+ .controller=${i.controller}
272
+ .descriptor=${i.descriptor}
273
+ .registry=${n}
274
+ .text=${r}
275
+ .lastResult=${t.form.lastResult}
276
+ ></mlf-report-frame>
277
+ ` : S;
278
+ }
279
+ case "explanation": {
280
+ let i = t.explanations.find((t) => t.id === e.explanation);
281
+ return i ? l`
282
+ <mlf-explanation-panel
283
+ .controller=${i.controller}
284
+ .descriptor=${i.descriptor}
285
+ .registry=${n}
286
+ .text=${r}
287
+ .lastResult=${t.form.lastResult}
288
+ ></mlf-explanation-panel>
289
+ ` : S;
290
+ }
291
+ }
292
+ }, A = class extends b {
293
+ static styles = re;
294
+ #e;
295
+ get view() {
296
+ return this.#e;
297
+ }
298
+ set view(e) {
299
+ this.#e = e;
300
+ }
301
+ #t;
302
+ get registry() {
303
+ return this.#t;
304
+ }
305
+ set registry(e) {
306
+ this.#t = e;
307
+ }
308
+ #n = g;
309
+ get primitiveText() {
310
+ return this.#n;
311
+ }
312
+ set primitiveText(e) {
313
+ this.#n = e;
314
+ }
315
+ #r = "Submit";
316
+ get submitLabel() {
317
+ return this.#r;
318
+ }
319
+ set submitLabel(e) {
320
+ this.#r = e;
321
+ }
322
+ #i = "Validating...";
323
+ get validatingLabel() {
324
+ return this.#i;
325
+ }
326
+ set validatingLabel(e) {
327
+ this.#i = e;
328
+ }
329
+ #a = "Submitting...";
330
+ get submittingLabel() {
331
+ return this.#a;
332
+ }
333
+ set submittingLabel(e) {
334
+ this.#a = e;
335
+ }
336
+ #o = null;
337
+ get snapshot() {
338
+ return this.#o;
339
+ }
340
+ set snapshot(e) {
341
+ this.#o = e;
342
+ }
343
+ #s = null;
344
+ willUpdate(e) {
345
+ e.has("view") && (this.#s?.(), this.#s = null, this.snapshot = this.view?.getSnapshot() ?? null, this.view && (this.#s = this.view.subscribe((e) => {
346
+ this.snapshot = e;
347
+ })));
348
+ }
349
+ disconnectedCallback() {
350
+ this.#s?.(), this.#s = null, super.disconnectedCallback();
351
+ }
352
+ render() {
353
+ let e = this.snapshot, t = e?.accordion;
354
+ if (!e || !t || e.layout.kind !== "accordion") return l``;
355
+ let n = e.form.status, r = n === "validating" ? this.validatingLabel : n === "submitting" ? this.submittingLabel : this.submitLabel;
356
+ return l`
357
+ <section class="root" part="accordion-panel">
358
+ <header class="header">
359
+ <h1 class="title">Accordion Form</h1>
360
+ <div class="actions">
361
+ <button type="button" class="btn" @click=${this.#c}>Open all</button>
362
+ <button type="button" class="btn" @click=${this.#l}>Close all</button>
363
+ </div>
364
+ </header>
365
+
366
+ <div class="body">
367
+ ${h(e.layout.sections, (e) => e.id, (n) => {
368
+ let r = t.openSectionIds.includes(n.id);
369
+ return l`
370
+ <section class="section">
371
+ <button
372
+ type="button"
373
+ class="section-toggle"
374
+ aria-expanded=${String(r)}
375
+ @click=${() => this.view?.toggleSection(n.id)}
376
+ >
377
+ <span class="section-copy">
378
+ <span class="section-title">${n.title}</span>
379
+ ${n.description ? l`<span class="section-description">${n.description}</span>` : S}
380
+ </span>
381
+ <span class="chevron">${r ? "−" : "+"}</span>
382
+ </button>
383
+ ${r ? l`
384
+ <div class="section-panel">
385
+ <div class="collection">
386
+ ${h(n.children, (e, t) => `${n.id}-${t}`, (t) => k({
387
+ node: t,
388
+ snapshot: e,
389
+ registry: this.registry,
390
+ primitiveText: this.primitiveText,
391
+ sectionClass: "nested-section",
392
+ sectionCopyClass: "nested-copy",
393
+ sectionTitleClass: "nested-title",
394
+ sectionDescriptionClass: "nested-description",
395
+ childrenClass: "section-children",
396
+ groupBaseClass: "group"
397
+ }))}
398
+ </div>
399
+ </div>
400
+ ` : S}
401
+ </section>
402
+ `;
403
+ })}
404
+ </div>
405
+
406
+ <footer class="footer" part="actions">
407
+ <span>${t.openSectionIds.length} / ${t.sectionCount} open</span>
408
+ <button
409
+ type="button"
410
+ class="btn btn-submit"
411
+ ?disabled=${n === "validating" || n === "submitting"}
412
+ @click=${this.#u}
413
+ >
414
+ ${r}
415
+ </button>
416
+ </footer>
417
+ </section>
418
+ `;
419
+ }
420
+ #c = () => {
421
+ this.view?.openAllSections();
422
+ };
423
+ #l = () => {
424
+ this.view?.closeAllSections();
425
+ };
426
+ #u = async () => {
427
+ await this.view?.submit();
428
+ };
429
+ };
430
+ u([f({ attribute: !1 })], A.prototype, "view", null), u([f({ attribute: !1 })], A.prototype, "registry", null), u([f({ attribute: !1 })], A.prototype, "primitiveText", null), u([f({ type: String })], A.prototype, "submitLabel", null), u([f({ type: String })], A.prototype, "validatingLabel", null), u([f({ type: String })], A.prototype, "submittingLabel", null), u([p()], A.prototype, "snapshot", null), A = u([c(O.accordion)], A);
431
+ //#endregion
432
+ //#region src/kit/layout-helpers.ts
433
+ var ie = (e, t, n) => ({
434
+ fieldIds: new Set(e.map((e) => e.id)),
435
+ reportIds: new Set(t.map((e) => e.id)),
436
+ explanationIds: new Set(n.map((e) => e.id))
437
+ }), ae = () => ({
438
+ fieldStepIds: /* @__PURE__ */ new Map(),
439
+ reportStepIds: /* @__PURE__ */ new Map(),
440
+ explanationStepIds: /* @__PURE__ */ new Map(),
441
+ fieldTabIds: /* @__PURE__ */ new Map(),
442
+ reportTabIds: /* @__PURE__ */ new Map(),
443
+ explanationTabIds: /* @__PURE__ */ new Map(),
444
+ fieldIdsInLayout: /* @__PURE__ */ new Set(),
445
+ reportIdsInLayout: /* @__PURE__ */ new Set(),
446
+ explanationIdsInLayout: /* @__PURE__ */ new Set()
447
+ }), j = (e, t, n) => {
448
+ let i = r(t ?? e) || e, a = n.get(i) ?? 0;
449
+ return n.set(i, a + 1), a === 0 ? i : `${i}-${a + 1}`;
450
+ }, oe = (e, t) => {
451
+ if (!t.fieldIds.has(e)) throw TypeError(D.unknownFieldReference(e));
452
+ }, se = (e, t) => {
453
+ if (!t.reportIds.has(e)) throw TypeError(D.unknownReportReference(e));
454
+ }, ce = (e, t) => {
455
+ if (!t.explanationIds.has(e)) throw TypeError(D.unknownExplanationReference(e));
456
+ }, le = (e, t, n, r) => {
457
+ if (t.fieldIdsInLayout.has(e)) throw TypeError(D.fieldDuplicateInLayout(e));
458
+ t.fieldIdsInLayout.add(e), n && t.fieldStepIds.set(e, n), r && t.fieldTabIds.set(e, r);
459
+ }, ue = (e, t, n, r) => {
460
+ if (t.reportIdsInLayout.has(e)) throw TypeError(D.reportDuplicateInLayout(e));
461
+ t.reportIdsInLayout.add(e), n && t.reportStepIds.set(e, n), r && t.reportTabIds.set(e, r);
462
+ }, de = (e, t, n, r) => {
463
+ if (t.explanationIdsInLayout.has(e)) throw TypeError(D.explanationDuplicateInLayout(e));
464
+ t.explanationIdsInLayout.add(e), n && t.explanationStepIds.set(e, n), r && t.explanationTabIds.set(e, r);
465
+ }, fe = (e, t, n) => [
466
+ ...e.map((e) => ({
467
+ kind: "field",
468
+ field: e.id
469
+ })),
470
+ ...t.map((e) => ({
471
+ kind: "explanation",
472
+ explanation: e.id
473
+ })),
474
+ ...n.map((e) => ({
475
+ kind: "report",
476
+ report: e.id
477
+ }))
478
+ ], M = (e, t) => {
479
+ for (let n of e) if (!t.fieldIdsInLayout.has(n.id)) throw TypeError(D.fieldMissingInLayout(n.id));
480
+ }, N = (e, t, n, r, i, a) => e.map((e) => {
481
+ switch (e.kind) {
482
+ case "section": return {
483
+ kind: "section",
484
+ id: j("section", e.id ?? e.title, r),
485
+ title: e.title,
486
+ description: e.description,
487
+ children: N(e.children, t, n, r, i, a)
488
+ };
489
+ case "group": return {
490
+ kind: "group",
491
+ id: j("group", e.id, r),
492
+ columns: e.columns,
493
+ children: N(e.children, t, n, r, i, a)
494
+ };
495
+ case "field": return oe(e.field, t), le(e.field, n, i, a), {
496
+ kind: "field",
497
+ field: e.field
498
+ };
499
+ case "report": return se(e.report, t), ue(e.report, n, i, a), {
500
+ kind: "report",
501
+ report: e.report
502
+ };
503
+ case "explanation": return ce(e.explanation, t), de(e.explanation, n, i, a), {
504
+ kind: "explanation",
505
+ explanation: e.explanation
506
+ };
507
+ }
508
+ }), pe = (e, t, n, r) => {
509
+ let i = ie(t, n, r), a = ae(), o = /* @__PURE__ */ new Map();
510
+ if (!e || e.kind === void 0 || e.kind === "single-page") {
511
+ let s = N(e?.children ?? fe(t, r, n), i, a, o, null, null);
512
+ return M(t, a), {
513
+ layout: {
514
+ kind: "single-page",
515
+ children: s
516
+ },
517
+ maps: a
518
+ };
519
+ }
520
+ if (e.kind === "tabs") {
521
+ if (e.tabs.length === 0) throw TypeError(D.tabsRequiresTabs);
522
+ let n = /* @__PURE__ */ new Map(), r = e.tabs.map((e, t) => {
523
+ let r = j("tab", e.id ?? e.title ?? `tab-${t + 1}`, n), s = N(e.children, i, a, o, null, r);
524
+ if (s.length === 0) throw TypeError(D.tabEmpty(r));
525
+ return {
526
+ id: r,
527
+ title: e.title,
528
+ description: e.description,
529
+ children: s
530
+ };
531
+ });
532
+ return M(t, a), {
533
+ layout: {
534
+ kind: "tabs",
535
+ tabs: r
536
+ },
537
+ maps: a
538
+ };
539
+ }
540
+ if (e.kind === "accordion") {
541
+ if (e.sections.length === 0) throw TypeError(D.accordionRequiresSections);
542
+ let n = /* @__PURE__ */ new Map(), r = e.sections.map((e, t) => {
543
+ let r = j("section", e.id ?? e.title ?? `section-${t + 1}`, n), s = N(e.children, i, a, o, null, r);
544
+ if (s.length === 0) throw TypeError(D.accordionSectionEmpty(r));
545
+ return {
546
+ id: r,
547
+ title: e.title,
548
+ description: e.description,
549
+ defaultOpen: e.defaultOpen ?? t === 0,
550
+ children: s
551
+ };
552
+ });
553
+ return M(t, a), {
554
+ layout: {
555
+ kind: "accordion",
556
+ sections: r
557
+ },
558
+ maps: a
559
+ };
560
+ }
561
+ let s = e;
562
+ if (s.steps.length === 0) throw TypeError(D.wizardRequiresSteps);
563
+ let c = /* @__PURE__ */ new Map(), l = s.steps.map((e, t) => {
564
+ let n = j("step", e.id ?? e.title ?? `step-${t + 1}`, c), r = N(e.children, i, a, o, n, null);
565
+ if (r.length === 0) throw TypeError(D.wizardStepEmpty(n));
566
+ return {
567
+ id: n,
568
+ title: e.title,
569
+ description: e.description,
570
+ children: r
571
+ };
572
+ });
573
+ return M(t, a), {
574
+ layout: {
575
+ kind: "wizard",
576
+ steps: l
577
+ },
578
+ maps: a
579
+ };
580
+ }, P = (e, t) => {
581
+ if (t(e), "children" in e) for (let n of e.children) P(n, t);
582
+ }, F = (e, t) => {
583
+ switch (e.kind) {
584
+ case "single-page":
585
+ for (let n of e.children) P(n, t);
586
+ return;
587
+ case "wizard":
588
+ for (let n of e.steps) for (let e of n.children) P(e, t);
589
+ return;
590
+ case "tabs":
591
+ for (let n of e.tabs) for (let e of n.children) P(e, t);
592
+ return;
593
+ case "accordion": for (let n of e.sections) for (let e of n.children) P(e, t);
594
+ }
595
+ }, I = (e) => {
596
+ let t = [];
597
+ return F(e, (e) => {
598
+ t.push(e);
599
+ }), t;
600
+ }, L = (e) => {
601
+ let t = {
602
+ fields: [],
603
+ reports: [],
604
+ explanations: []
605
+ };
606
+ for (let n of I(e)) switch (n.kind) {
607
+ case "field":
608
+ t.fields.push(n.field);
609
+ break;
610
+ case "report":
611
+ t.reports.push(n.report);
612
+ break;
613
+ case "explanation":
614
+ t.explanations.push(n.explanation);
615
+ break;
616
+ default: break;
617
+ }
618
+ return t;
619
+ }, R = (e, t, n) => {
620
+ if (n.length === 0) return null;
621
+ let r = Math.min(Math.max(t, 0), n.length - 1);
622
+ return {
623
+ kind: e,
624
+ index: r,
625
+ count: n.length,
626
+ currentId: n[r] ?? n[0],
627
+ canGoNext: r < n.length - 1,
628
+ canGoPrev: r > 0
629
+ };
630
+ }, z = ({ layout: e, stepIndex: t, formState: n }) => {
631
+ let r = R("wizard-step", t, (e.kind === "wizard" ? e.steps : []).map((e) => e.id));
632
+ return r ? {
633
+ stepIndex: r.index,
634
+ stepCount: r.count,
635
+ currentStepId: r.currentId,
636
+ canNext: n.status !== "validating" && n.status !== "submitting",
637
+ canPrev: r.canGoPrev,
638
+ isLastStep: r.index === r.count - 1
639
+ } : null;
640
+ }, B = ({ layout: e, activeTabIndex: t }) => {
641
+ let n = R("tab", t, (e.kind === "tabs" ? e.tabs : []).map((e) => e.id));
642
+ return n ? {
643
+ activeTabIndex: n.index,
644
+ tabCount: n.count,
645
+ currentTabId: n.currentId,
646
+ canGoNext: n.canGoNext,
647
+ canGoPrev: n.canGoPrev
648
+ } : null;
649
+ }, V = ({ layout: e, openSectionIds: t }) => {
650
+ let n = e.kind === "accordion" ? e.sections : [];
651
+ return n.length === 0 ? null : {
652
+ openSectionIds: n.map((e) => e.id).filter((e) => t.has(e)),
653
+ sectionCount: n.length
654
+ };
655
+ }, me = (e) => ({
656
+ form: e.formState,
657
+ wizard: z(e),
658
+ tabs: B(e),
659
+ accordion: V(e)
660
+ }), H = (e, t, n, r, i, a) => e.kind === "wizard" ? i === (e.steps[t]?.id ?? null) : e.kind === "tabs" ? a === (e.tabs[n]?.id ?? null) : e.kind === "accordion" ? a !== null && r.has(a) : !0, he = (e, t, n, r, i, a) => {
661
+ let o = n.maps.fieldStepIds.get(e.id) ?? null, s = n.maps.fieldTabIds.get(e.id) ?? null, c = t.getField(e.kind);
662
+ return {
663
+ id: e.id,
664
+ kind: e.kind,
665
+ config: e.config,
666
+ controller: e,
667
+ state: e.state,
668
+ descriptor: c?.describe(e.config, {
669
+ fieldId: e.id,
670
+ state: e.state,
671
+ value: e.state.value
672
+ }) ?? v(e),
673
+ stepId: o,
674
+ tabId: s,
675
+ visibleInLayout: H(n.layout, r, i, a, o, s)
676
+ };
677
+ }, ge = (e, t, n, r, i, a, o) => {
678
+ let s = r.maps.reportStepIds.get(e.id) ?? null, c = r.maps.reportTabIds.get(e.id) ?? null, l = n.getReport(e.kind);
679
+ return {
680
+ id: e.id,
681
+ kind: e.kind,
682
+ config: e.config,
683
+ controller: e,
684
+ state: e.state,
685
+ descriptor: l ? l.describe(e.config, {
686
+ reportId: e.id,
687
+ state: e.state,
688
+ payload: e.state.payload,
689
+ result: t.state.lastResult
690
+ }) : null,
691
+ stepId: s,
692
+ tabId: c,
693
+ visibleInLayout: H(r.layout, i, a, o, s, c)
694
+ };
695
+ }, _e = (e, t, n, r, i, a) => {
696
+ let o = n.maps.explanationStepIds.get(e.id) ?? null, s = n.maps.explanationTabIds.get(e.id) ?? null, c = t.getExplanation(e.kind);
697
+ return {
698
+ id: e.id,
699
+ kind: e.kind,
700
+ config: e.config,
701
+ controller: e,
702
+ state: e.state,
703
+ descriptor: c ? c.describe(e.config, {
704
+ explanationId: e.id,
705
+ state: e.state
706
+ }) : null,
707
+ stepId: o,
708
+ tabId: s,
709
+ visibleInLayout: H(n.layout, r, i, a, o, s)
710
+ };
711
+ }, ve = ({ form: e, presentationRegistry: t, resolvedLayout: n, stepIndex: r, activeTabIndex: i, openSectionIds: a }) => ({
712
+ form: e.state,
713
+ layout: n.layout,
714
+ fields: e.fields.map((e) => he(e, t, n, r, i, a)),
715
+ reports: e.reports.map((o) => ge(o, e, t, n, r, i, a)),
716
+ explanations: e.explanations.map((e) => _e(e, t, n, r, i, a)),
717
+ wizard: z({
718
+ layout: n.layout,
719
+ stepIndex: r,
720
+ activeTabIndex: i,
721
+ openSectionIds: a,
722
+ formState: e.state
723
+ }),
724
+ tabs: B({
725
+ layout: n.layout,
726
+ stepIndex: r,
727
+ activeTabIndex: i,
728
+ openSectionIds: a,
729
+ formState: e.state
730
+ }),
731
+ accordion: V({
732
+ layout: n.layout,
733
+ stepIndex: r,
734
+ activeTabIndex: i,
735
+ openSectionIds: a,
736
+ formState: e.state
737
+ })
738
+ }), ye = (e, t, n, r, i) => me({
739
+ formState: e.state,
740
+ layout: t,
741
+ stepIndex: n,
742
+ activeTabIndex: r,
743
+ openSectionIds: i
744
+ }), be = ({ form: e, presentationRegistry: t, resolvedLayout: n, getStepIndex: r, getActiveTabIndex: i, getOpenSectionIds: a }) => {
745
+ let o = e.state, s = -1, c = -1, l = "", u = null;
746
+ return () => {
747
+ let d = r(), f = i(), p = a(), m = e.state, h = Array.from(p).sort().join("|");
748
+ return u && o === m && s === d && c === f && l === h ? u : (o = m, s = d, c = f, l = h, u = ve({
749
+ form: e,
750
+ presentationRegistry: t,
751
+ resolvedLayout: n,
752
+ stepIndex: d,
753
+ activeTabIndex: f,
754
+ openSectionIds: p
755
+ }), u);
756
+ };
757
+ }, xe = async (e, t, n) => {
758
+ if (t.layout.kind !== "wizard") return !1;
759
+ let r = t.layout.steps[n]?.id;
760
+ if (!r) return !1;
761
+ let i = e.fields.filter((e) => t.maps.fieldStepIds.get(e.id) === r && e.state.visible);
762
+ return (await Promise.all(i.map((e) => e.validate()))).every((e) => e.errors.length === 0);
763
+ }, Se = (e, t, n, r) => {
764
+ switch (e.layout.kind) {
765
+ case "single-page": return e.layout.children;
766
+ case "wizard": return e.layout.steps[t]?.children ?? [];
767
+ case "tabs": return e.layout.tabs[n]?.children ?? [];
768
+ case "accordion": return e.layout.sections.filter((e) => r.has(e.id)).flatMap((e) => e.children);
769
+ }
770
+ }, U = (e, t, n) => {
771
+ if (e.layout.kind !== "accordion") throw TypeError(D.nonAccordionToggleSection);
772
+ if (!t.some((e) => e.id === n)) throw TypeError(D.unknownAccordionSection(n));
773
+ }, W = (e) => {
774
+ if (e.layout.kind !== "accordion") throw TypeError(D.nonAccordionToggleSection);
775
+ }, G = (e) => {
776
+ let t = !e.registry || !e.presentationRegistry || !e.behaviors ? a() : null, n = e.registry ? ee(e.registry) : t.registry, r = e.presentationRegistry?.clone() ?? t.presentationRegistry;
777
+ e.registry && !e.presentationRegistry && i(r, n);
778
+ let s = te(e.primitiveRegistry), c = ne(e.designSystemRegistry), l = o({
779
+ schema: e.schema,
780
+ registry: n,
781
+ behaviors: e.behaviors ?? t?.behaviors,
782
+ transport: e.transport,
783
+ initialValues: e.initialValues,
784
+ validators: e.validators,
785
+ hooks: e.hooks,
786
+ hookFailurePolicy: e.hookFailurePolicy,
787
+ inactiveFieldPolicy: e.inactiveFieldPolicy,
788
+ listenerErrorPolicy: e.listenerErrorPolicy,
789
+ onListenerError: e.onListenerError
790
+ }), u = pe(e.layout, l.fields, l.reports, l.explanations), d = 0, f = 0, p = new Set(u.layout.kind === "accordion" ? u.layout.sections.filter((e) => e.defaultOpen).map((e) => e.id) : []), m = /* @__PURE__ */ new Set(), h = u.layout.kind === "wizard" ? u.layout.steps : [], g = u.layout.kind === "tabs" ? u.layout.tabs : [], _ = u.layout.kind === "accordion" ? u.layout.sections : [], v = L(u.layout), y = /* @__PURE__ */ new Map();
791
+ for (let e of I(u.layout)) "id" in e && y.set(e.id, e);
792
+ let b = () => ye(l, u.layout, d, f, p), x = be({
793
+ form: l,
794
+ presentationRegistry: r,
795
+ resolvedLayout: u,
796
+ getStepIndex: () => d,
797
+ getActiveTabIndex: () => f,
798
+ getOpenSectionIds: () => p
799
+ }), S = () => {
800
+ let e = x();
801
+ for (let t of m) t(e);
802
+ };
803
+ return l.subscribe(() => {
804
+ S();
805
+ }), Object.freeze({
806
+ form: l,
807
+ engineRegistry: n,
808
+ presentationRegistry: r,
809
+ primitiveRegistry: s,
810
+ designSystemRegistry: c,
811
+ get state() {
812
+ return b();
813
+ },
814
+ getSnapshot: x,
815
+ getNodeById(e) {
816
+ return y.get(e);
817
+ },
818
+ getField(e) {
819
+ return x().fields.find((t) => t.id === e);
820
+ },
821
+ getReport(e) {
822
+ return x().reports.find((t) => t.id === e);
823
+ },
824
+ getExplanation(e) {
825
+ return x().explanations.find((t) => t.id === e);
826
+ },
827
+ getVisibleFields() {
828
+ return x().fields.filter((e) => e.visibleInLayout && e.state.visible);
829
+ },
830
+ getVisibleReports() {
831
+ return x().reports.filter((e) => e.visibleInLayout);
832
+ },
833
+ getVisibleExplanations() {
834
+ return x().explanations.filter((e) => e.visibleInLayout);
835
+ },
836
+ getActiveLayoutNodes() {
837
+ return Se(u, d, f, p);
838
+ },
839
+ getLayoutReferences() {
840
+ return v;
841
+ },
842
+ validate() {
843
+ return l.validate();
844
+ },
845
+ submit(e) {
846
+ return l.submit(e);
847
+ },
848
+ reset() {
849
+ l.reset();
850
+ },
851
+ subscribe(e) {
852
+ return m.add(e), () => {
853
+ m.delete(e);
854
+ };
855
+ },
856
+ async nextStep() {
857
+ return u.layout.kind !== "wizard" || !await xe(l, u, d) ? !1 : (d < h.length - 1 && (d += 1, S()), !0);
858
+ },
859
+ prevStep() {
860
+ u.layout.kind === "wizard" && d > 0 && (--d, S());
861
+ },
862
+ async goToStep(e) {
863
+ if (u.layout.kind !== "wizard") throw TypeError(D.nonWizardGoToStep);
864
+ let t = h.findIndex((t) => t.id === e);
865
+ if (t < 0) throw TypeError(D.unknownWizardStep(e));
866
+ if (t <= d) return d = t, S(), !0;
867
+ for (; d < t;) if (!await this.nextStep()) return !1;
868
+ return !0;
869
+ },
870
+ setActiveTab(e) {
871
+ if (u.layout.kind !== "tabs") throw TypeError(D.nonTabsSetActiveTab);
872
+ let t = g.findIndex((t) => t.id === e);
873
+ if (t < 0) throw TypeError(D.unknownTab(e));
874
+ t !== f && (f = t, S());
875
+ },
876
+ nextTab() {
877
+ return u.layout.kind !== "tabs" || f >= g.length - 1 ? !1 : (f += 1, S(), !0);
878
+ },
879
+ prevTab() {
880
+ return u.layout.kind !== "tabs" || f <= 0 ? !1 : (--f, S(), !0);
881
+ },
882
+ toggleSection(e) {
883
+ U(u, _, e), p.has(e) ? p.delete(e) : p.add(e), S();
884
+ },
885
+ openSection(e) {
886
+ U(u, _, e), p.has(e) || (p.add(e), S());
887
+ },
888
+ closeSection(e) {
889
+ U(u, _, e), p.delete(e) && S();
890
+ },
891
+ openAllSections() {
892
+ W(u), p = new Set(_.map((e) => e.id)), S();
893
+ },
894
+ closeAllSections() {
895
+ W(u), p = /* @__PURE__ */ new Set(), S();
896
+ }
897
+ });
898
+ }, K = Symbol("mlform.kit.accordion.mounted"), Ce = (e) => "view" in e, we = (e, t) => {
899
+ let r = e;
900
+ r[K]?.unmount();
901
+ let i = Ce(t) ? t.view : G({
902
+ schema: t.schema,
903
+ transport: t.transport,
904
+ registry: t.registry,
905
+ primitiveRegistry: t.primitiveRegistry,
906
+ designSystemRegistry: t.designSystemRegistry,
907
+ designSystem: t.designSystem,
908
+ initialValues: t.initialValues,
909
+ validators: t.validators,
910
+ hooks: t.hooks,
911
+ hookFailurePolicy: t.hookFailurePolicy,
912
+ inactiveFieldPolicy: t.inactiveFieldPolicy,
913
+ listenerErrorPolicy: t.listenerErrorPolicy,
914
+ onListenerError: t.onListenerError,
915
+ layout: t.layout
916
+ });
917
+ if (i.getSnapshot().layout.kind !== "accordion") throw TypeError(D.accordionMissingLayout);
918
+ let a = T(t.labels), o = m(t.primitiveText), s = E(t.designSystem), c = document.createElement(O.accordion);
919
+ c.view = i, c.registry = i.primitiveRegistry, c.primitiveText = o, c.submitLabel = a.submit, c.validatingLabel = a.validating, c.submittingLabel = a.submitting, e.replaceChildren(c);
920
+ let l = n(c, {
921
+ config: s,
922
+ registry: i.designSystemRegistry,
923
+ onChange: t.onDesignSystemChange
924
+ }), u = !1, d = Object.freeze({
925
+ view: i,
926
+ form: i.form,
927
+ host: c,
928
+ designSystem: l,
929
+ unmount() {
930
+ u || (u = !0, r[K] === d && delete r[K], i.form.abortSubmit("unmount"), l.disconnect(), c.remove());
931
+ }
932
+ });
933
+ return r[K] = d, d;
934
+ }, q = Symbol("mlform.kit.mounted"), Te = (e) => {
935
+ if (!e.mode || !e.theme || !e.recipe) throw TypeError(D.invalidDesignSystemSnapshot);
936
+ }, Ee = (e, t) => {
937
+ let r = e;
938
+ r[q]?.unmount();
939
+ let i = G({
940
+ schema: t.schema,
941
+ transport: t.transport,
942
+ registry: t.registry,
943
+ presentationRegistry: t.presentationRegistry,
944
+ primitiveRegistry: t.primitiveRegistry,
945
+ designSystemRegistry: t.designSystemRegistry,
946
+ designSystem: t.designSystem,
947
+ initialValues: t.initialValues,
948
+ validators: t.validators,
949
+ hooks: t.hooks,
950
+ hookFailurePolicy: t.hookFailurePolicy,
951
+ inactiveFieldPolicy: t.inactiveFieldPolicy,
952
+ listenerErrorPolicy: t.listenerErrorPolicy,
953
+ onListenerError: t.onListenerError,
954
+ reportPane: t.reportPane,
955
+ reportTransport: t.reportTransport,
956
+ labels: t.labels,
957
+ primitiveText: t.primitiveText,
958
+ containerStrategy: t.containerStrategy,
959
+ onDesignSystemChange: t.onDesignSystemChange
960
+ }), a = T(t.labels), o = E(t.designSystem), s = y(e, i.form, {
961
+ registry: i.primitiveRegistry,
962
+ presentationRegistry: i.presentationRegistry,
963
+ layout: t.layout,
964
+ containerStrategy: t.containerStrategy,
965
+ formLabel: a.form,
966
+ reportsLabel: a.reports,
967
+ submitLabel: a.submit,
968
+ validatingLabel: a.validating,
969
+ submittingLabel: a.submitting,
970
+ reportPane: t.reportPane,
971
+ text: t.primitiveText,
972
+ reportTransport: t.reportTransport
973
+ }), c = n(s.host, {
974
+ config: o,
975
+ registry: i.designSystemRegistry,
976
+ onChange: t.onDesignSystemChange
977
+ }), l = !1, u = Object.freeze({
978
+ form: i.form,
979
+ host: s.host,
980
+ engineRegistry: i.engineRegistry,
981
+ presentationRegistry: i.presentationRegistry,
982
+ primitiveRegistry: i.primitiveRegistry,
983
+ designSystemRegistry: i.designSystemRegistry,
984
+ designSystem: c,
985
+ updateDesignSystem(e) {
986
+ c.update(e);
987
+ },
988
+ replaceDesignSystem(e) {
989
+ Te(e), c.replace(e);
990
+ },
991
+ resetDesignSystem() {
992
+ c.reset();
993
+ },
994
+ unmount() {
995
+ l || (l = !0, r[q] === u && delete r[q], i.form.abortSubmit("unmount"), c.disconnect(), s.unmount());
996
+ }
997
+ });
998
+ return r[q] = u, u;
999
+ }, De = (e) => {
1000
+ e.unmount();
1001
+ }, Oe = x`
1002
+ :host {
1003
+ display: block;
1004
+ flex: 1 1 auto;
1005
+ align-self: stretch;
1006
+ inline-size: 100%;
1007
+ block-size: 100%;
1008
+ color: var(--mlf-shell-color, var(--mlf-color-text, #0f172a));
1009
+ background: var(--mlf-shell-bg, var(--mlf-color-bg, #f5f7fa));
1010
+ font-family: var(--mlf-font-family-body);
1011
+ min-width: 0;
1012
+ min-height: 0;
1013
+ }
1014
+ *,
1015
+ *::before,
1016
+ *::after {
1017
+ box-sizing: border-box;
1018
+ }
1019
+ .root {
1020
+ display: grid;
1021
+ grid-template-rows: auto 1fr auto;
1022
+ inline-size: 100%;
1023
+ block-size: 100%;
1024
+ min-width: 0;
1025
+ min-height: 0;
1026
+ overflow: hidden;
1027
+ border-radius: var(--mlf-panel-radius, 12px);
1028
+ border: var(--mlf-border-width, 1px) solid
1029
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1030
+ background: var(--mlf-panel-bg, var(--mlf-color-surface, #ffffff));
1031
+ box-shadow:
1032
+ 0 2px 4px var(--mlf-panel-shadow-soft, rgba(0, 0, 0, 0.04)),
1033
+ 0 8px 16px var(--mlf-panel-shadow, rgba(0, 0, 0, 0.04));
1034
+ }
1035
+ .tablist {
1036
+ display: flex;
1037
+ gap: 0.35rem;
1038
+ overflow-x: auto;
1039
+ padding: 0.85rem 1rem 0;
1040
+ border-bottom: var(--mlf-border-width, 1px) solid
1041
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1042
+ background: var(--mlf-panel-header-bg, rgba(255, 255, 255, 0.6));
1043
+ scrollbar-width: thin;
1044
+ }
1045
+ .tab {
1046
+ position: relative;
1047
+ border: none;
1048
+ border-radius: 12px 12px 0 0;
1049
+ background: transparent;
1050
+ color: var(--mlf-color-text-muted, #475569);
1051
+ font: inherit;
1052
+ font-size: 0.94rem;
1053
+ font-weight: 600;
1054
+ padding: 0.85rem 1rem 0.75rem;
1055
+ cursor: pointer;
1056
+ white-space: nowrap;
1057
+ }
1058
+ .tab[aria-selected="true"] {
1059
+ color: var(--mlf-color-text, #0f172a);
1060
+ background: color-mix(in srgb, var(--mlf-color-surface, #ffffff) 94%, transparent);
1061
+ }
1062
+ .tab[aria-selected="true"]::after {
1063
+ content: "";
1064
+ position: absolute;
1065
+ inset-inline: 0.8rem;
1066
+ inset-block-end: 0;
1067
+ block-size: 3px;
1068
+ border-radius: 999px;
1069
+ background: var(--mlf-color-accent, #1e40af);
1070
+ }
1071
+ .tab-panel {
1072
+ display: grid;
1073
+ grid-template-rows: auto 1fr;
1074
+ min-width: 0;
1075
+ min-height: 0;
1076
+ overflow: hidden;
1077
+ }
1078
+ .tab-header {
1079
+ display: grid;
1080
+ gap: 0.35rem;
1081
+ padding: 1rem 1.25rem 0.5rem;
1082
+ }
1083
+ .tab-title {
1084
+ margin: 0;
1085
+ font-size: 1.08rem;
1086
+ font-weight: 700;
1087
+ color: var(--mlf-color-text, #0f172a);
1088
+ line-height: 1.3;
1089
+ }
1090
+ .tab-description {
1091
+ margin: 0;
1092
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1093
+ color: var(--mlf-color-text-muted, #475569);
1094
+ line-height: 1.5;
1095
+ }
1096
+ .body {
1097
+ display: grid;
1098
+ align-content: start;
1099
+ gap: 1rem;
1100
+ padding: 0.5rem 1rem 1.25rem;
1101
+ overflow-y: auto;
1102
+ overflow-x: hidden;
1103
+ }
1104
+ .collection,
1105
+ .section-children,
1106
+ .group {
1107
+ display: grid;
1108
+ gap: var(--mlf-section-gap, 1rem);
1109
+ }
1110
+ .section {
1111
+ display: grid;
1112
+ gap: 0.9rem;
1113
+ }
1114
+ .section-copy {
1115
+ display: grid;
1116
+ gap: 0.35rem;
1117
+ padding: 0 0.5rem;
1118
+ }
1119
+ .section-title {
1120
+ margin: 0;
1121
+ font-size: 0.95rem;
1122
+ font-weight: 700;
1123
+ color: var(--mlf-color-text, #0f172a);
1124
+ }
1125
+ .section-description {
1126
+ margin: 0;
1127
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1128
+ color: var(--mlf-color-text-muted, #475569);
1129
+ line-height: 1.5;
1130
+ }
1131
+ .group.columns-2 {
1132
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1133
+ }
1134
+ .group.columns-3 {
1135
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1136
+ }
1137
+ .footer {
1138
+ display: flex;
1139
+ align-items: center;
1140
+ justify-content: space-between;
1141
+ gap: 0.75rem;
1142
+ padding: 0.85rem 1rem 1rem;
1143
+ border-top: var(--mlf-border-width, 1px) solid
1144
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1145
+ background: var(--mlf-panel-footer-bg, var(--mlf-color-bg-light, #f5f7fa));
1146
+ }
1147
+ .nav {
1148
+ display: inline-flex;
1149
+ gap: 0.5rem;
1150
+ }
1151
+ .btn {
1152
+ display: inline-flex;
1153
+ align-items: center;
1154
+ justify-content: center;
1155
+ min-height: 2.5rem;
1156
+ padding: 0.5rem 1rem;
1157
+ border-radius: var(--mlf-input-radius, 12px);
1158
+ border: var(--mlf-border-width, 1px) solid var(--mlf-input-border, #e2e8f0);
1159
+ background: #fff;
1160
+ color: var(--mlf-color-text, #0f172a);
1161
+ font: inherit;
1162
+ font-size: 0.92rem;
1163
+ font-weight: 600;
1164
+ cursor: pointer;
1165
+ }
1166
+ .btn:disabled {
1167
+ cursor: not-allowed;
1168
+ opacity: 0.55;
1169
+ }
1170
+ .btn-submit {
1171
+ border-color: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
1172
+ background: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
1173
+ color: var(--mlf-submit-color, #ffffff);
1174
+ }
1175
+ @media (max-width: 900px) {
1176
+ .group.columns-2,
1177
+ .group.columns-3 {
1178
+ grid-template-columns: minmax(0, 1fr);
1179
+ }
1180
+ .footer {
1181
+ flex-direction: column;
1182
+ align-items: stretch;
1183
+ }
1184
+ .nav {
1185
+ justify-content: space-between;
1186
+ }
1187
+ }
1188
+ `, J = class extends b {
1189
+ static styles = Oe;
1190
+ #e;
1191
+ get view() {
1192
+ return this.#e;
1193
+ }
1194
+ set view(e) {
1195
+ this.#e = e;
1196
+ }
1197
+ #t;
1198
+ get registry() {
1199
+ return this.#t;
1200
+ }
1201
+ set registry(e) {
1202
+ this.#t = e;
1203
+ }
1204
+ #n = g;
1205
+ get primitiveText() {
1206
+ return this.#n;
1207
+ }
1208
+ set primitiveText(e) {
1209
+ this.#n = e;
1210
+ }
1211
+ #r = "Submit";
1212
+ get submitLabel() {
1213
+ return this.#r;
1214
+ }
1215
+ set submitLabel(e) {
1216
+ this.#r = e;
1217
+ }
1218
+ #i = "Validating...";
1219
+ get validatingLabel() {
1220
+ return this.#i;
1221
+ }
1222
+ set validatingLabel(e) {
1223
+ this.#i = e;
1224
+ }
1225
+ #a = "Submitting...";
1226
+ get submittingLabel() {
1227
+ return this.#a;
1228
+ }
1229
+ set submittingLabel(e) {
1230
+ this.#a = e;
1231
+ }
1232
+ #o = null;
1233
+ get snapshot() {
1234
+ return this.#o;
1235
+ }
1236
+ set snapshot(e) {
1237
+ this.#o = e;
1238
+ }
1239
+ #s = null;
1240
+ willUpdate(e) {
1241
+ e.has("view") && (this.#s?.(), this.#s = null, this.snapshot = this.view?.getSnapshot() ?? null, this.view && (this.#s = this.view.subscribe((e) => {
1242
+ this.snapshot = e;
1243
+ })));
1244
+ }
1245
+ disconnectedCallback() {
1246
+ this.#s?.(), this.#s = null, super.disconnectedCallback();
1247
+ }
1248
+ render() {
1249
+ let e = this.snapshot, t = e?.tabs;
1250
+ if (!e || !t || e.layout.kind !== "tabs") return l``;
1251
+ let n = e.layout.tabs[t.activeTabIndex];
1252
+ if (!n) return l``;
1253
+ let r = e.form.status, i = r === "validating" ? this.validatingLabel : r === "submitting" ? this.submittingLabel : this.submitLabel;
1254
+ return l`
1255
+ <section class="root" part="tabs-panel">
1256
+ <div class="tablist" role="tablist" aria-label="Form sections">
1257
+ ${h(e.layout.tabs, (e) => e.id, (e, n) => l`
1258
+ <button
1259
+ type="button"
1260
+ class="tab"
1261
+ role="tab"
1262
+ aria-selected=${String(n === t.activeTabIndex)}
1263
+ aria-controls=${`panel-${e.id}`}
1264
+ id=${`tab-${e.id}`}
1265
+ @click=${() => this.view?.setActiveTab(e.id)}
1266
+ >
1267
+ ${e.title}
1268
+ </button>
1269
+ `)}
1270
+ </div>
1271
+
1272
+ <div
1273
+ class="tab-panel"
1274
+ role="tabpanel"
1275
+ id=${`panel-${n.id}`}
1276
+ aria-labelledby=${`tab-${n.id}`}
1277
+ >
1278
+ ${n.title || n.description ? l`
1279
+ <header class="tab-header">
1280
+ <h1 class="tab-title">${n.title}</h1>
1281
+ ${n.description ? l`<p class="tab-description">${n.description}</p>` : S}
1282
+ </header>
1283
+ ` : S}
1284
+
1285
+ <div class="body">
1286
+ <div class="collection">
1287
+ ${h(n.children, (e, t) => `${n.id}-${t}`, (t) => k({
1288
+ node: t,
1289
+ snapshot: e,
1290
+ registry: this.registry,
1291
+ primitiveText: this.primitiveText,
1292
+ sectionClass: "section",
1293
+ sectionCopyClass: "section-copy",
1294
+ sectionTitleClass: "section-title",
1295
+ sectionDescriptionClass: "section-description",
1296
+ childrenClass: "section-children",
1297
+ groupBaseClass: "group"
1298
+ }))}
1299
+ </div>
1300
+ </div>
1301
+ </div>
1302
+
1303
+ <footer class="footer" part="actions">
1304
+ <div class="nav">
1305
+ <button
1306
+ type="button"
1307
+ class="btn"
1308
+ ?disabled=${!t.canGoPrev}
1309
+ @click=${() => this.view?.prevTab()}
1310
+ >
1311
+ Previous
1312
+ </button>
1313
+ <button
1314
+ type="button"
1315
+ class="btn"
1316
+ ?disabled=${!t.canGoNext}
1317
+ @click=${() => this.view?.nextTab()}
1318
+ >
1319
+ Next
1320
+ </button>
1321
+ </div>
1322
+ <button
1323
+ type="button"
1324
+ class="btn btn-submit"
1325
+ ?disabled=${r === "validating" || r === "submitting"}
1326
+ @click=${this.#c}
1327
+ >
1328
+ ${i}
1329
+ </button>
1330
+ </footer>
1331
+ </section>
1332
+ `;
1333
+ }
1334
+ #c = async () => {
1335
+ await this.view?.submit();
1336
+ };
1337
+ };
1338
+ u([f({ attribute: !1 })], J.prototype, "view", null), u([f({ attribute: !1 })], J.prototype, "registry", null), u([f({ attribute: !1 })], J.prototype, "primitiveText", null), u([f({ type: String })], J.prototype, "submitLabel", null), u([f({ type: String })], J.prototype, "validatingLabel", null), u([f({ type: String })], J.prototype, "submittingLabel", null), u([p()], J.prototype, "snapshot", null), J = u([c(O.tabs)], J);
1339
+ //#endregion
1340
+ //#region src/kit/tabs.ts
1341
+ var Y = Symbol("mlform.kit.tabs.mounted"), ke = (e) => "view" in e, Ae = (e, t) => {
1342
+ let r = e;
1343
+ r[Y]?.unmount();
1344
+ let i = ke(t) ? t.view : G({
1345
+ schema: t.schema,
1346
+ transport: t.transport,
1347
+ registry: t.registry,
1348
+ primitiveRegistry: t.primitiveRegistry,
1349
+ designSystemRegistry: t.designSystemRegistry,
1350
+ designSystem: t.designSystem,
1351
+ initialValues: t.initialValues,
1352
+ validators: t.validators,
1353
+ hooks: t.hooks,
1354
+ hookFailurePolicy: t.hookFailurePolicy,
1355
+ inactiveFieldPolicy: t.inactiveFieldPolicy,
1356
+ listenerErrorPolicy: t.listenerErrorPolicy,
1357
+ onListenerError: t.onListenerError,
1358
+ layout: t.layout
1359
+ });
1360
+ if (i.getSnapshot().layout.kind !== "tabs") throw TypeError(D.tabsMissingLayout);
1361
+ let a = T(t.labels), o = m(t.primitiveText), s = E(t.designSystem), c = document.createElement(O.tabs);
1362
+ c.view = i, c.registry = i.primitiveRegistry, c.primitiveText = o, c.submitLabel = a.submit, c.validatingLabel = a.validating, c.submittingLabel = a.submitting, e.replaceChildren(c);
1363
+ let l = n(c, {
1364
+ config: s,
1365
+ registry: i.designSystemRegistry,
1366
+ onChange: t.onDesignSystemChange
1367
+ }), u = !1, d = Object.freeze({
1368
+ view: i,
1369
+ form: i.form,
1370
+ host: c,
1371
+ designSystem: l,
1372
+ unmount() {
1373
+ u || (u = !0, r[Y] === d && delete r[Y], i.form.abortSubmit("unmount"), l.disconnect(), c.remove());
1374
+ }
1375
+ });
1376
+ return r[Y] = d, d;
1377
+ }, X = class extends b {
1378
+ static styles = x`
1379
+ :host {
1380
+ display: block;
1381
+ min-width: 0;
1382
+ }
1383
+
1384
+ *,
1385
+ *::before,
1386
+ *::after {
1387
+ box-sizing: border-box;
1388
+ }
1389
+
1390
+ .indicator {
1391
+ display: grid;
1392
+ gap: 0.5rem;
1393
+ }
1394
+
1395
+ .header {
1396
+ display: flex;
1397
+ align-items: center;
1398
+ justify-content: space-between;
1399
+ gap: 1rem;
1400
+ }
1401
+
1402
+ .step-label {
1403
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1404
+ font-weight: 600;
1405
+ letter-spacing: 0.05em;
1406
+ text-transform: uppercase;
1407
+ color: var(--mlf-color-text-muted, #475569);
1408
+ }
1409
+
1410
+ .step-fraction {
1411
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1412
+ font-weight: 700;
1413
+ color: var(--mlf-color-accent, #1e40af);
1414
+ }
1415
+
1416
+ .track {
1417
+ height: 4px;
1418
+ border-radius: 999px;
1419
+ background: var(--mlf-color-border, #e2e8f0);
1420
+ overflow: hidden;
1421
+ }
1422
+
1423
+ .fill {
1424
+ height: 100%;
1425
+ border-radius: 999px;
1426
+ background: var(--mlf-color-accent, #1e40af);
1427
+ transition: width 0.3s ease;
1428
+ }
1429
+
1430
+ .dots {
1431
+ display: flex;
1432
+ gap: 0.4rem;
1433
+ flex-wrap: wrap;
1434
+ }
1435
+
1436
+ .dot {
1437
+ width: 8px;
1438
+ height: 8px;
1439
+ border-radius: 50%;
1440
+ background: var(--mlf-color-border, #e2e8f0);
1441
+ transition:
1442
+ background-color 0.2s ease,
1443
+ transform 0.2s ease;
1444
+ }
1445
+
1446
+ .dot.active {
1447
+ background: var(--mlf-color-accent, #1e40af);
1448
+ transform: scale(1.25);
1449
+ }
1450
+
1451
+ .dot.done {
1452
+ background: color-mix(in srgb, var(--mlf-color-accent, #1e40af) 50%, transparent);
1453
+ }
1454
+ `;
1455
+ #e = 1;
1456
+ get current() {
1457
+ return this.#e;
1458
+ }
1459
+ set current(e) {
1460
+ this.#e = e;
1461
+ }
1462
+ #t = 1;
1463
+ get total() {
1464
+ return this.#t;
1465
+ }
1466
+ set total(e) {
1467
+ this.#t = e;
1468
+ }
1469
+ #n = "Step";
1470
+ get label() {
1471
+ return this.#n;
1472
+ }
1473
+ set label(e) {
1474
+ this.#n = e;
1475
+ }
1476
+ render() {
1477
+ let e = this.total > 0 ? Math.round(this.current / this.total * 100) : 0;
1478
+ return l`
1479
+ <div
1480
+ class="indicator"
1481
+ role="status"
1482
+ aria-label=${`${this.label} ${this.current} of ${this.total}`}
1483
+ >
1484
+ <div class="header">
1485
+ <span class="step-label">${this.label}</span>
1486
+ <span class="step-fraction">${this.current} / ${this.total}</span>
1487
+ </div>
1488
+ <div class="track" aria-hidden="true">
1489
+ <div class="fill" style="width: ${e}%"></div>
1490
+ </div>
1491
+ <div class="dots" aria-hidden="true">
1492
+ ${Array.from({ length: this.total }, (e, t) => l`<div class=${t + 1 < this.current ? "dot done" : t + 1 === this.current ? "dot active" : "dot"}></div>`)}
1493
+ </div>
1494
+ </div>
1495
+ `;
1496
+ }
1497
+ };
1498
+ u([f({ type: Number })], X.prototype, "current", null), u([f({ type: Number })], X.prototype, "total", null), u([f({ type: String })], X.prototype, "label", null), X = u([c(O.stepIndicator)], X);
1499
+ //#endregion
1500
+ //#region src/kit/wizard-constants.ts
1501
+ var Z = {
1502
+ prev: "Previous",
1503
+ next: "Next",
1504
+ submit: "Submit",
1505
+ validating: "Validating...",
1506
+ submitting: "Submitting..."
1507
+ }, je = Object.freeze({
1508
+ stepLabel: (e, t) => `Step ${e} of ${t}`,
1509
+ prevLabel: "Previous",
1510
+ nextLabel: "Next",
1511
+ submitLabel: "Submit",
1512
+ validatingLabel: "Validating...",
1513
+ submittingLabel: "Submitting..."
1514
+ }), Me = (e) => e ? Object.freeze({
1515
+ ...je,
1516
+ ...e
1517
+ }) : je, Ne = x`
1518
+ :host {
1519
+ display: block;
1520
+ flex: 1 1 auto;
1521
+ align-self: stretch;
1522
+ inline-size: 100%;
1523
+ block-size: 100%;
1524
+ color: var(--mlf-shell-color, var(--mlf-color-text, #0f172a));
1525
+ background: var(--mlf-shell-bg, var(--mlf-color-bg, #f5f7fa));
1526
+ font-family: var(--mlf-font-family-body);
1527
+ min-width: 0;
1528
+ min-height: 0;
1529
+ }
1530
+ *,
1531
+ *::before,
1532
+ *::after {
1533
+ box-sizing: border-box;
1534
+ }
1535
+ .root {
1536
+ display: grid;
1537
+ grid-template-rows: 1fr;
1538
+ gap: var(--mlf-shell-gap, 1rem);
1539
+ inline-size: 100%;
1540
+ block-size: 100%;
1541
+ min-width: 0;
1542
+ min-height: 0;
1543
+ }
1544
+ .panel {
1545
+ display: flex;
1546
+ flex-direction: column;
1547
+ min-width: 0;
1548
+ min-height: 0;
1549
+ overflow: hidden;
1550
+ border-radius: var(--mlf-panel-radius, 12px);
1551
+ border: var(--mlf-border-width, 1px) solid
1552
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1553
+ background: var(--mlf-panel-bg, var(--mlf-color-surface, #ffffff));
1554
+ box-shadow:
1555
+ 0 2px 4px var(--mlf-panel-shadow-soft, rgba(0, 0, 0, 0.04)),
1556
+ 0 8px 16px var(--mlf-panel-shadow, rgba(0, 0, 0, 0.04));
1557
+ }
1558
+ .pane-header {
1559
+ flex: 0 0 auto;
1560
+ display: grid;
1561
+ gap: 0.85rem;
1562
+ padding: 1rem 1.5rem;
1563
+ border-bottom: var(--mlf-border-width, 1px) solid
1564
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1565
+ background: var(--mlf-panel-header-bg, rgba(255, 255, 255, 0.6));
1566
+ backdrop-filter: blur(var(--mlf-header-blur, 3px));
1567
+ -webkit-backdrop-filter: blur(var(--mlf-header-blur, 3px));
1568
+ }
1569
+ .step-title {
1570
+ margin: 0;
1571
+ font-size: 1.1rem;
1572
+ font-weight: 700;
1573
+ color: var(--mlf-pane-title-color, var(--mlf-color-text, #0f172a));
1574
+ line-height: 1.3;
1575
+ }
1576
+ .step-description {
1577
+ margin: 0;
1578
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1579
+ color: var(--mlf-color-text-muted, #475569);
1580
+ line-height: 1.5;
1581
+ }
1582
+ .pane-body {
1583
+ flex: 1 1 auto;
1584
+ display: grid;
1585
+ align-content: start;
1586
+ gap: 1rem;
1587
+ padding: 1rem 1rem 1.25rem;
1588
+ overflow-y: auto;
1589
+ overflow-x: hidden;
1590
+ }
1591
+ .collection,
1592
+ .section-children,
1593
+ .section,
1594
+ .group {
1595
+ display: grid;
1596
+ gap: var(--mlf-section-gap, 1rem);
1597
+ }
1598
+ .section-copy {
1599
+ display: grid;
1600
+ gap: 0.35rem;
1601
+ padding: 0 0.5rem;
1602
+ }
1603
+ .section-title {
1604
+ margin: 0;
1605
+ font-size: 0.95rem;
1606
+ font-weight: 700;
1607
+ color: var(--mlf-color-text, #0f172a);
1608
+ }
1609
+ .section-description {
1610
+ margin: 0;
1611
+ font-size: var(--mlf-font-size-sm, 0.84rem);
1612
+ color: var(--mlf-color-text-muted, #475569);
1613
+ line-height: 1.5;
1614
+ }
1615
+ .group.columns-2 {
1616
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1617
+ }
1618
+ .group.columns-3 {
1619
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1620
+ }
1621
+ .actions {
1622
+ flex: 0 0 auto;
1623
+ display: flex;
1624
+ align-items: center;
1625
+ justify-content: space-between;
1626
+ gap: 1rem;
1627
+ padding: 0.75rem 1.5rem;
1628
+ border-top: var(--mlf-border-width, 1px) solid
1629
+ var(--mlf-panel-border, var(--mlf-color-border, #e2e8f0));
1630
+ background: var(--mlf-panel-footer-bg, var(--mlf-color-bg-light, #f5f7fa));
1631
+ }
1632
+ .btn {
1633
+ display: inline-flex;
1634
+ align-items: center;
1635
+ justify-content: center;
1636
+ gap: 0.5rem;
1637
+ min-height: 2.5rem;
1638
+ padding: 0.5rem 1.25rem;
1639
+ border: var(--mlf-border-width, 1px) solid transparent;
1640
+ border-radius: var(--mlf-input-radius, 12px);
1641
+ font: inherit;
1642
+ font-size: 0.95rem;
1643
+ font-weight: 600;
1644
+ cursor: pointer;
1645
+ transition:
1646
+ background-color 0.2s ease,
1647
+ border-color 0.2s ease,
1648
+ opacity 0.2s ease;
1649
+ }
1650
+ .btn:disabled {
1651
+ cursor: not-allowed;
1652
+ opacity: 0.55;
1653
+ }
1654
+ .btn-prev {
1655
+ background: transparent;
1656
+ border-color: var(--mlf-input-border, var(--mlf-color-border, #e2e8f0));
1657
+ color: var(--mlf-color-text-muted, #475569);
1658
+ }
1659
+ .btn-next,
1660
+ .btn-submit {
1661
+ background: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
1662
+ border-color: var(--mlf-submit-bg, var(--mlf-color-accent, #1e40af));
1663
+ color: var(--mlf-submit-color, #ffffff);
1664
+ }
1665
+ .spacer {
1666
+ flex: 1 1 auto;
1667
+ }
1668
+ @media (max-width: 900px) {
1669
+ .group.columns-2,
1670
+ .group.columns-3 {
1671
+ grid-template-columns: minmax(0, 1fr);
1672
+ }
1673
+ }
1674
+ `, Q = class extends b {
1675
+ static styles = Ne;
1676
+ #e;
1677
+ get view() {
1678
+ return this.#e;
1679
+ }
1680
+ set view(e) {
1681
+ this.#e = e;
1682
+ }
1683
+ #t;
1684
+ get registry() {
1685
+ return this.#t;
1686
+ }
1687
+ set registry(e) {
1688
+ this.#t = e;
1689
+ }
1690
+ #n = g;
1691
+ get primitiveText() {
1692
+ return this.#n;
1693
+ }
1694
+ set primitiveText(e) {
1695
+ this.#n = e;
1696
+ }
1697
+ #r = Z;
1698
+ get labels() {
1699
+ return this.#r;
1700
+ }
1701
+ set labels(e) {
1702
+ this.#r = e;
1703
+ }
1704
+ #i = Me();
1705
+ get text() {
1706
+ return this.#i;
1707
+ }
1708
+ set text(e) {
1709
+ this.#i = e;
1710
+ }
1711
+ #a = null;
1712
+ get snapshot() {
1713
+ return this.#a;
1714
+ }
1715
+ set snapshot(e) {
1716
+ this.#a = e;
1717
+ }
1718
+ #o = null;
1719
+ willUpdate(e) {
1720
+ e.has("view") && (this.#o?.(), this.#o = null, this.snapshot = this.view?.getSnapshot() ?? null, this.view && (this.#o = this.view.subscribe((e) => {
1721
+ this.snapshot = e;
1722
+ })));
1723
+ }
1724
+ disconnectedCallback() {
1725
+ this.#o?.(), this.#o = null, super.disconnectedCallback();
1726
+ }
1727
+ render() {
1728
+ let e = this.snapshot, t = e?.wizard;
1729
+ if (!e || !t || e.layout.kind !== "wizard") return l``;
1730
+ let n = e.layout.steps[t.stepIndex];
1731
+ if (!n) return l``;
1732
+ let r = e.form.status, i = r === "validating" || r === "submitting", a = t.isLastStep ? r === "validating" ? this.labels.validating : r === "submitting" ? this.labels.submitting : this.labels.submit : this.labels.next;
1733
+ return l`
1734
+ <div class="root">
1735
+ <section class="panel" part="wizard-panel">
1736
+ <header class="pane-header">
1737
+ <mlf-kit-step-indicator
1738
+ .current=${t.stepIndex + 1}
1739
+ .total=${t.stepCount}
1740
+ .label=${this.text.stepLabel(t.stepIndex + 1, t.stepCount).split(" ")[0] ?? "Step"}
1741
+ ></mlf-kit-step-indicator>
1742
+ <h1 class="step-title">${n.title}</h1>
1743
+ ${n.description ? l`<p class="step-description">${n.description}</p>` : S}
1744
+ </header>
1745
+
1746
+ <div class="pane-body">
1747
+ <div class="collection">
1748
+ ${h(n.children, (e, t) => `${n.id}-${t}`, (t) => k({
1749
+ node: t,
1750
+ snapshot: e,
1751
+ registry: this.registry,
1752
+ primitiveText: this.primitiveText,
1753
+ sectionClass: "section",
1754
+ sectionCopyClass: "section-copy",
1755
+ sectionTitleClass: "section-title",
1756
+ sectionDescriptionClass: "section-description",
1757
+ childrenClass: "section-children",
1758
+ groupBaseClass: "group"
1759
+ }))}
1760
+ </div>
1761
+ </div>
1762
+
1763
+ <div class="actions" part="actions">
1764
+ <button
1765
+ type="button"
1766
+ class="btn btn-prev"
1767
+ ?disabled=${!t.canPrev || i}
1768
+ @click=${this.#s}
1769
+ >
1770
+ ${this.labels.prev}
1771
+ </button>
1772
+ <span class="spacer"></span>
1773
+ <button
1774
+ type="button"
1775
+ class=${t.isLastStep ? "btn btn-submit" : "btn btn-next"}
1776
+ ?disabled=${i}
1777
+ @click=${t.isLastStep ? this.#l : this.#c}
1778
+ >
1779
+ ${a}
1780
+ </button>
1781
+ </div>
1782
+ </section>
1783
+ </div>
1784
+ `;
1785
+ }
1786
+ #s = () => {
1787
+ this.view?.prevStep();
1788
+ };
1789
+ #c = async () => {
1790
+ await this.view?.nextStep();
1791
+ };
1792
+ #l = async () => {
1793
+ this.view && await this.view.nextStep() && await this.view.submit();
1794
+ };
1795
+ };
1796
+ u([f({ attribute: !1 })], Q.prototype, "view", null), u([f({ attribute: !1 })], Q.prototype, "registry", null), u([f({ attribute: !1 })], Q.prototype, "primitiveText", null), u([f({ attribute: !1 })], Q.prototype, "labels", null), u([f({ attribute: !1 })], Q.prototype, "text", null), u([p()], Q.prototype, "snapshot", null), Q = u([c(O.wizard)], Q);
1797
+ //#endregion
1798
+ //#region src/kit/wizard.ts
1799
+ var $ = Symbol("mlform.kit.wizard.mounted"), Pe = (e) => "view" in e, Fe = (e, t) => {
1800
+ let r = e;
1801
+ r[$]?.unmount();
1802
+ let i = Pe(t) ? t.view : G({
1803
+ schema: t.schema,
1804
+ transport: t.transport,
1805
+ registry: t.registry,
1806
+ primitiveRegistry: t.primitiveRegistry,
1807
+ designSystemRegistry: t.designSystemRegistry,
1808
+ designSystem: t.designSystem,
1809
+ initialValues: t.initialValues,
1810
+ validators: t.validators,
1811
+ hooks: t.hooks,
1812
+ hookFailurePolicy: t.hookFailurePolicy,
1813
+ inactiveFieldPolicy: t.inactiveFieldPolicy,
1814
+ listenerErrorPolicy: t.listenerErrorPolicy,
1815
+ onListenerError: t.onListenerError,
1816
+ layout: t.layout
1817
+ });
1818
+ if (i.getSnapshot().layout.kind !== "wizard") throw TypeError(D.wizardMissingLayout);
1819
+ let a = document.createElement(O.wizard), o = {
1820
+ ...Z,
1821
+ ...t.labels
1822
+ }, s = Me({
1823
+ ...t.text,
1824
+ prevLabel: o.prev,
1825
+ nextLabel: o.next,
1826
+ submitLabel: o.submit,
1827
+ validatingLabel: o.validating,
1828
+ submittingLabel: o.submitting
1829
+ }), c = m(t.primitiveText), l = E(t.designSystem);
1830
+ a.view = i, a.registry = i.primitiveRegistry, a.primitiveText = c, a.labels = o, a.text = s, e.replaceChildren(a);
1831
+ let u = n(a, {
1832
+ config: l,
1833
+ registry: i.designSystemRegistry,
1834
+ onChange: t.onDesignSystemChange
1835
+ }), d = !1, f = Object.freeze({
1836
+ view: i,
1837
+ form: i.form,
1838
+ host: a,
1839
+ designSystem: u,
1840
+ unmount() {
1841
+ d || (d = !0, r[$] === f && delete r[$], i.form.abortSubmit("unmount"), u.disconnect(), a.remove());
1842
+ }
1843
+ });
1844
+ return r[$] = f, f;
1845
+ };
1846
+ //#endregion
1847
+ export { we as a, I as c, C as d, De as i, F as l, Ae as n, G as o, Ee as r, L as s, Fe as t, w as u };