@viveksinghind/narrative-form-vue 1.0.2 → 1.0.4

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.
@@ -0,0 +1,313 @@
1
+ import { Ref } from 'vue';
2
+ import { NarrativeFormConfig } from '@viveksinghind/narrative-form-core';
3
+ export interface UseDynamicFormProps {
4
+ fieldsUrl?: string | Ref<string | undefined>;
5
+ fieldsUrlHeaders?: Record<string, string> | Ref<Record<string, string> | undefined>;
6
+ formConfig?: NarrativeFormConfig | Ref<NarrativeFormConfig | undefined>;
7
+ onFetchError?: (error: Error) => void;
8
+ }
9
+ export declare function useDynamicForm(props: UseDynamicFormProps): {
10
+ config: Ref<{
11
+ form: {
12
+ id: string;
13
+ name: string;
14
+ version: number;
15
+ };
16
+ welcome?: {
17
+ show?: boolean | undefined;
18
+ heading?: string | undefined;
19
+ subtext?: string | undefined;
20
+ ctaLabel?: string | undefined;
21
+ } | undefined;
22
+ fields: {
23
+ key: string;
24
+ type: import('@viveksinghind/narrative-form-core').NarrativeFieldType;
25
+ prefix: string;
26
+ suffix?: string | undefined;
27
+ placeholder?: string | undefined;
28
+ order?: number | undefined;
29
+ options?: string[] | undefined;
30
+ animate?: boolean | undefined;
31
+ autoAdvance?: boolean | undefined;
32
+ lockPrevious?: boolean | undefined;
33
+ showIf?: ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean) | undefined;
34
+ className?: string | undefined;
35
+ inputClassName?: string | undefined;
36
+ editable?: boolean | undefined;
37
+ defaultValue?: string | undefined;
38
+ validation?: {
39
+ required?: boolean | undefined;
40
+ requiredMessage?: string | undefined;
41
+ minLength?: number | undefined;
42
+ minLengthMessage?: string | undefined;
43
+ maxLength?: number | undefined;
44
+ maxLengthMessage?: string | undefined;
45
+ exactLength?: number | undefined;
46
+ exactLengthMessage?: string | undefined;
47
+ pattern?: RegExp | undefined;
48
+ patternMessage?: string | undefined;
49
+ isEmail?: boolean | undefined;
50
+ isEmailMessage?: string | undefined;
51
+ min?: number | undefined;
52
+ minMessage?: string | undefined;
53
+ max?: number | undefined;
54
+ maxMessage?: string | undefined;
55
+ custom?: ((value: string, allValues: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean | string | Promise<boolean | string>) | undefined;
56
+ rules?: {
57
+ name: string;
58
+ validate: (value: string, allValues: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean | string | Promise<boolean | string>;
59
+ message?: string | undefined;
60
+ async?: boolean | undefined;
61
+ debounce?: number | undefined;
62
+ }[] | undefined;
63
+ mode?: "bail" | "all" | undefined;
64
+ trigger?: "onChange" | "onBlur" | "onSubmit" | "onConfirm" | "debounced" | undefined;
65
+ debounceMs?: number | undefined;
66
+ errorDisplay?: {
67
+ mode?: "inline" | "toast" | "shake" | "inline+shake" | "tooltip" | undefined;
68
+ position?: "below" | "above" | undefined;
69
+ icon?: boolean | undefined;
70
+ iconChar?: string | undefined;
71
+ animateIn?: "fadeUp" | "slideDown" | "none" | undefined;
72
+ clearOn?: "onChange" | "onFocus" | undefined;
73
+ } | undefined;
74
+ use?: string | string[] | undefined;
75
+ serverValidate?: {
76
+ url: string;
77
+ method?: "GET" | "POST" | undefined;
78
+ headers?: Record<string, string> | undefined;
79
+ debounceMs?: number | undefined;
80
+ timeout?: number | undefined;
81
+ timeoutMessage?: string | undefined;
82
+ responsePath: string;
83
+ errorPath: string;
84
+ } | undefined;
85
+ loadingText?: string | undefined;
86
+ successIndicator?: boolean | undefined;
87
+ } | undefined;
88
+ sanitise?: ((value: string) => string) | undefined;
89
+ format?: ((value: string) => string) | undefined;
90
+ otpLength?: number | undefined;
91
+ onRequest?: (() => void | Promise<void>) | undefined;
92
+ onVerify?: ((otp: string) => void | Promise<void>) | undefined;
93
+ resendLabel?: string | undefined;
94
+ resendDelay?: number | undefined;
95
+ }[];
96
+ theme?: {
97
+ background?: string | undefined;
98
+ textColor?: string | undefined;
99
+ inputBorderColor?: string | undefined;
100
+ placeholderColor?: string | undefined;
101
+ errorColor?: string | undefined;
102
+ filledColor?: string | undefined;
103
+ cursorColor?: string | undefined;
104
+ successColor?: string | undefined;
105
+ loadingColor?: string | undefined;
106
+ fontFamily?: string | undefined;
107
+ uiFontFamily?: string | undefined;
108
+ fontSize?: string | undefined;
109
+ mobileFontSize?: string | undefined;
110
+ inputFontStyle?: string | undefined;
111
+ lineGap?: string | undefined;
112
+ pagePadding?: string | undefined;
113
+ buttonRadius?: string | undefined;
114
+ buttonBackground?: string | undefined;
115
+ buttonColor?: string | undefined;
116
+ enterBtnSize?: string | undefined;
117
+ chipBorderRadius?: string | undefined;
118
+ chipBorderColor?: string | undefined;
119
+ chipActiveBackground?: string | undefined;
120
+ chipActiveColor?: string | undefined;
121
+ chipFontStyle?: string | undefined;
122
+ mode?: "light" | "dark" | "auto" | undefined;
123
+ dark?: {
124
+ background?: string | undefined;
125
+ textColor?: string | undefined;
126
+ inputBorderColor?: string | undefined;
127
+ placeholderColor?: string | undefined;
128
+ errorColor?: string | undefined;
129
+ filledColor?: string | undefined;
130
+ cursorColor?: string | undefined;
131
+ successColor?: string | undefined;
132
+ loadingColor?: string | undefined;
133
+ fontFamily?: string | undefined;
134
+ uiFontFamily?: string | undefined;
135
+ fontSize?: string | undefined;
136
+ mobileFontSize?: string | undefined;
137
+ inputFontStyle?: string | undefined;
138
+ lineGap?: string | undefined;
139
+ pagePadding?: string | undefined;
140
+ buttonRadius?: string | undefined;
141
+ buttonBackground?: string | undefined;
142
+ buttonColor?: string | undefined;
143
+ enterBtnSize?: string | undefined;
144
+ chipBorderRadius?: string | undefined;
145
+ chipBorderColor?: string | undefined;
146
+ chipActiveBackground?: string | undefined;
147
+ chipActiveColor?: string | undefined;
148
+ chipFontStyle?: string | undefined;
149
+ mode?: "light" | "dark" | "auto" | undefined;
150
+ dark?: /*elided*/ any | undefined;
151
+ } | undefined;
152
+ } | undefined;
153
+ done?: {
154
+ show?: boolean | undefined;
155
+ message?: string | ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => string) | undefined;
156
+ ctaLabel?: string | undefined;
157
+ onSubmit?: ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues, meta: import('@viveksinghind/narrative-form-core').NarrativeMeta) => void | Promise<void>) | undefined;
158
+ } | undefined;
159
+ } | null, NarrativeFormConfig | {
160
+ form: {
161
+ id: string;
162
+ name: string;
163
+ version: number;
164
+ };
165
+ welcome?: {
166
+ show?: boolean | undefined;
167
+ heading?: string | undefined;
168
+ subtext?: string | undefined;
169
+ ctaLabel?: string | undefined;
170
+ } | undefined;
171
+ fields: {
172
+ key: string;
173
+ type: import('@viveksinghind/narrative-form-core').NarrativeFieldType;
174
+ prefix: string;
175
+ suffix?: string | undefined;
176
+ placeholder?: string | undefined;
177
+ order?: number | undefined;
178
+ options?: string[] | undefined;
179
+ animate?: boolean | undefined;
180
+ autoAdvance?: boolean | undefined;
181
+ lockPrevious?: boolean | undefined;
182
+ showIf?: ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean) | undefined;
183
+ className?: string | undefined;
184
+ inputClassName?: string | undefined;
185
+ editable?: boolean | undefined;
186
+ defaultValue?: string | undefined;
187
+ validation?: {
188
+ required?: boolean | undefined;
189
+ requiredMessage?: string | undefined;
190
+ minLength?: number | undefined;
191
+ minLengthMessage?: string | undefined;
192
+ maxLength?: number | undefined;
193
+ maxLengthMessage?: string | undefined;
194
+ exactLength?: number | undefined;
195
+ exactLengthMessage?: string | undefined;
196
+ pattern?: RegExp | undefined;
197
+ patternMessage?: string | undefined;
198
+ isEmail?: boolean | undefined;
199
+ isEmailMessage?: string | undefined;
200
+ min?: number | undefined;
201
+ minMessage?: string | undefined;
202
+ max?: number | undefined;
203
+ maxMessage?: string | undefined;
204
+ custom?: ((value: string, allValues: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean | string | Promise<boolean | string>) | undefined;
205
+ rules?: {
206
+ name: string;
207
+ validate: (value: string, allValues: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => boolean | string | Promise<boolean | string>;
208
+ message?: string | undefined;
209
+ async?: boolean | undefined;
210
+ debounce?: number | undefined;
211
+ }[] | undefined;
212
+ mode?: "bail" | "all" | undefined;
213
+ trigger?: "onChange" | "onBlur" | "onSubmit" | "onConfirm" | "debounced" | undefined;
214
+ debounceMs?: number | undefined;
215
+ errorDisplay?: {
216
+ mode?: "inline" | "toast" | "shake" | "inline+shake" | "tooltip" | undefined;
217
+ position?: "below" | "above" | undefined;
218
+ icon?: boolean | undefined;
219
+ iconChar?: string | undefined;
220
+ animateIn?: "fadeUp" | "slideDown" | "none" | undefined;
221
+ clearOn?: "onChange" | "onFocus" | undefined;
222
+ } | undefined;
223
+ use?: string | string[] | undefined;
224
+ serverValidate?: {
225
+ url: string;
226
+ method?: "GET" | "POST" | undefined;
227
+ headers?: Record<string, string> | undefined;
228
+ debounceMs?: number | undefined;
229
+ timeout?: number | undefined;
230
+ timeoutMessage?: string | undefined;
231
+ responsePath: string;
232
+ errorPath: string;
233
+ } | undefined;
234
+ loadingText?: string | undefined;
235
+ successIndicator?: boolean | undefined;
236
+ } | undefined;
237
+ sanitise?: ((value: string) => string) | undefined;
238
+ format?: ((value: string) => string) | undefined;
239
+ otpLength?: number | undefined;
240
+ onRequest?: (() => void | Promise<void>) | undefined;
241
+ onVerify?: ((otp: string) => void | Promise<void>) | undefined;
242
+ resendLabel?: string | undefined;
243
+ resendDelay?: number | undefined;
244
+ }[];
245
+ theme?: {
246
+ background?: string | undefined;
247
+ textColor?: string | undefined;
248
+ inputBorderColor?: string | undefined;
249
+ placeholderColor?: string | undefined;
250
+ errorColor?: string | undefined;
251
+ filledColor?: string | undefined;
252
+ cursorColor?: string | undefined;
253
+ successColor?: string | undefined;
254
+ loadingColor?: string | undefined;
255
+ fontFamily?: string | undefined;
256
+ uiFontFamily?: string | undefined;
257
+ fontSize?: string | undefined;
258
+ mobileFontSize?: string | undefined;
259
+ inputFontStyle?: string | undefined;
260
+ lineGap?: string | undefined;
261
+ pagePadding?: string | undefined;
262
+ buttonRadius?: string | undefined;
263
+ buttonBackground?: string | undefined;
264
+ buttonColor?: string | undefined;
265
+ enterBtnSize?: string | undefined;
266
+ chipBorderRadius?: string | undefined;
267
+ chipBorderColor?: string | undefined;
268
+ chipActiveBackground?: string | undefined;
269
+ chipActiveColor?: string | undefined;
270
+ chipFontStyle?: string | undefined;
271
+ mode?: "light" | "dark" | "auto" | undefined;
272
+ dark?: {
273
+ background?: string | undefined;
274
+ textColor?: string | undefined;
275
+ inputBorderColor?: string | undefined;
276
+ placeholderColor?: string | undefined;
277
+ errorColor?: string | undefined;
278
+ filledColor?: string | undefined;
279
+ cursorColor?: string | undefined;
280
+ successColor?: string | undefined;
281
+ loadingColor?: string | undefined;
282
+ fontFamily?: string | undefined;
283
+ uiFontFamily?: string | undefined;
284
+ fontSize?: string | undefined;
285
+ mobileFontSize?: string | undefined;
286
+ inputFontStyle?: string | undefined;
287
+ lineGap?: string | undefined;
288
+ pagePadding?: string | undefined;
289
+ buttonRadius?: string | undefined;
290
+ buttonBackground?: string | undefined;
291
+ buttonColor?: string | undefined;
292
+ enterBtnSize?: string | undefined;
293
+ chipBorderRadius?: string | undefined;
294
+ chipBorderColor?: string | undefined;
295
+ chipActiveBackground?: string | undefined;
296
+ chipActiveColor?: string | undefined;
297
+ chipFontStyle?: string | undefined;
298
+ mode?: "light" | "dark" | "auto" | undefined;
299
+ dark?: /*elided*/ any | undefined;
300
+ } | undefined;
301
+ } | undefined;
302
+ done?: {
303
+ show?: boolean | undefined;
304
+ message?: string | ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues) => string) | undefined;
305
+ ctaLabel?: string | undefined;
306
+ onSubmit?: ((values: import('@viveksinghind/narrative-form-core').NarrativeFieldValues, meta: import('@viveksinghind/narrative-form-core').NarrativeMeta) => void | Promise<void>) | undefined;
307
+ } | undefined;
308
+ } | null>;
309
+ loading: Ref<boolean, boolean>;
310
+ error: Ref<Error | null, Error | null>;
311
+ retry: () => void;
312
+ };
313
+ //# sourceMappingURL=useDynamicForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDynamicForm.d.ts","sourceRoot":"","sources":["../../src/composables/useDynamicForm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAG9E,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;IACpF,UAAU,CAAC,EAAE,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDxD"}
@@ -0,0 +1,13 @@
1
+ export interface UseTypewriterOptions {
2
+ text: string | (() => string);
3
+ speed?: number;
4
+ enabled?: boolean;
5
+ pauseAfter?: number;
6
+ onComplete?: () => void;
7
+ }
8
+ export declare function useTypewriter(options: UseTypewriterOptions): {
9
+ displayedText: import('vue').ComputedRef<string>;
10
+ isTyping: import('vue').ComputedRef<boolean>;
11
+ isComplete: import('vue').Ref<boolean, boolean>;
12
+ };
13
+ //# sourceMappingURL=useTypewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTypewriter.d.ts","sourceRoot":"","sources":["../../src/composables/useTypewriter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAOD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;EAsE1D"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),C=require("@viveksinghind/narrative-form-core");function I(l){const t=new C.FormStateEngine(l,()=>{n.value=t.getSnapshot(),e.triggerRef(n)}),n=e.shallowRef(t.getSnapshot());return e.onUnmounted(()=>{t.reset()}),{snapshot:n,startTyping:o=>t.startTyping(o),activateField:o=>t.activateField(o),confirmField:(o,u)=>t.confirmField(o,u),editField:o=>t.editField(o),reconfirmField:(o,u)=>t.reconfirmField(o,u),next:()=>t.next(),focusField:o=>t.focusField(o),reset:()=>{t.reset(),n.value=t.getSnapshot()},getValues:()=>t.getValues(),getMeta:(o,u)=>t.getMeta(o,u)}}const R={class:"ns-welcome fade-in"},W={class:"ns-welcome-title"},K={key:0,class:"ns-welcome-subtitle"},U=e.defineComponent({__name:"WelcomeScreen",props:{welcome:{},typewriter:{}},emits:["start"],setup(l,{emit:t}){const n=l,o=t,u=e.ref("");let p;return e.onMounted(()=>{if(!n.typewriter.enabled){u.value=n.welcome.heading||"";return}let m=0;p=setInterval(()=>{u.value=(n.welcome.heading||"").slice(0,m+1),m++,m>=(n.welcome.heading||"").length&&clearInterval(p)},n.typewriter.speed??30)}),e.onUnmounted(()=>{clearInterval(p)}),(m,s)=>(e.openBlock(),e.createElementBlock("div",R,[e.createElementVNode("h1",W,e.toDisplayString(u.value),1),l.welcome.subtext?(e.openBlock(),e.createElementBlock("p",K,e.toDisplayString(l.welcome.subtext),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{type:"button",class:"ns-welcome-start",onClick:s[0]||(s[0]=g=>o("start"))},e.toDisplayString(l.welcome.ctaLabel||"Start"),1)]))}}),B=(l,t)=>{const n=l.__vccOpts||l;for(const[o,u]of t)n[o]=u;return n},D=B(U,[["__scopeId","data-v-dbeb46ea"]]),q={class:"ns-done fade-in"},A={class:"ns-done-title"},O=e.defineComponent({__name:"DoneScreen",props:{done:{},values:{},meta:{},typewriter:{}},setup(l){return(t,n)=>(e.openBlock(),e.createElementBlock("div",q,[e.createElementVNode("h1",A,e.toDisplayString(typeof l.done.message=="function"?l.done.message(l.values):l.done.message),1)]))}}),M=B(O,[["__scopeId","data-v-7802c8f5"]]),P={key:0,class:"ns-error-wrapper"},j={class:"ns-error-text"},H=e.defineComponent({__name:"ErrorMessage",props:{message:{},config:{}},setup(l){return(t,n)=>(e.openBlock(),e.createBlock(e.Transition,{name:"fade-slide"},{default:e.withCtx(()=>[l.message?(e.openBlock(),e.createElementBlock("div",P,[e.createElementVNode("p",j,e.toDisplayString(l.message),1)])):e.createCommentVNode("",!0)]),_:1}))}}),_=B(H,[["__scopeId","data-v-a8be2d7b"]]),z={class:"ns-line fade-in"},G={class:"ns-prompt-row"},J={class:"ns-prompt"},Q={key:0,class:"ns-value"},X={key:0,class:"ns-input-row"},Y=["type","disabled","value","onKeydown"],Z=e.defineComponent({__name:"Line",props:{field:{},status:{},value:{},allValues:{},typewriter:{},editable:{type:Boolean},locked:{type:Boolean},editLabel:{}},emits:["typingComplete","confirm","edit","error","change","focus","blur"],setup(l,{emit:t}){const n=l,o=t,u=e.ref(null),p=e.ref(""),m=e.ref(n.value?String(n.value):""),s=e.ref(null),g=e.ref(!1);let w;e.watch(()=>n.value,f=>{f!==void 0&&String(f)!==m.value&&(m.value=String(f))}),e.watch(()=>n.status,f=>{if(f==="typing"){if(!n.typewriter.enabled){p.value=n.field.prompt,o("typingComplete",n.field.key);return}let i=0;w=setInterval(()=>{p.value=n.field.prompt.slice(0,i+1),i++,i>=n.field.prompt.length&&(clearInterval(w),o("typingComplete",n.field.key))},n.typewriter.speed??30)}else(f==="active"||f==="editing")&&e.nextTick(()=>{var i;(i=u.value)==null||i.focus()})},{immediate:!0}),e.onUnmounted(()=>{clearInterval(w)});const E=f=>{const i=f.target;m.value=i.value,o("change",n.field.key,i.value),s.value&&(s.value=null)},V=async()=>{const f=C.validateField(n.field,m.value);if(!f.valid){s.value=f.error||"Invalid input",o("error",n.field.key,s.value);return}if(C.hasAsyncValidation(n.field)){g.value=!0;const i=await C.validateFieldAsync(n.field,m.value);if(g.value=!1,!i.valid){s.value=i.error||"Invalid input",o("error",n.field.key,s.value);return}}s.value=null,o("confirm",n.field.key,m.value)};return(f,i)=>(e.openBlock(),e.createElementBlock("div",z,[e.createElementVNode("div",G,[e.createElementVNode("span",J,e.toDisplayString(l.status==="typing"?p.value:l.field.prompt),1),l.status==="confirmed"?(e.openBlock(),e.createElementBlock("span",Q,e.toDisplayString(m.value),1)):e.createCommentVNode("",!0),l.status==="confirmed"&&l.editable&&!l.locked?(e.openBlock(),e.createElementBlock("button",{key:1,type:"button",class:"ns-edit-btn",onClick:i[0]||(i[0]=F=>o("edit",l.field.key))},e.toDisplayString(l.editLabel),1)):e.createCommentVNode("",!0)]),l.status==="active"||l.status==="editing"?(e.openBlock(),e.createElementBlock("div",X,[e.createElementVNode("input",{ref_key:"inputRef",ref:u,type:l.field.type==="email"?"email":l.field.type==="password"?"password":"text",class:"ns-input",disabled:g.value,value:m.value,onInput:E,onFocus:i[1]||(i[1]=F=>o("focus",l.field.key)),onBlur:i[2]||(i[2]=F=>o("blur",l.field.key,m.value)),onKeydown:e.withKeys(e.withModifiers(V,["prevent"]),["enter"])},null,40,Y)])):e.createCommentVNode("",!0),e.createVNode(_,{message:s.value},null,8,["message"])]))}}),L=B(Z,[["__scopeId","data-v-d4b482a6"]]),ee={key:1,class:"ns-form-body"},te=e.defineComponent({__name:"NarrativeForm",props:{fields:{},formConfig:{},typewriter:{},welcome:{},done:{},editable:{type:Boolean,default:!0},editLabel:{},callbacks:{},defaultValues:{},values:{},strings:{},reducedMotion:{type:Boolean}},setup(l){const t=l,n=e.computed(()=>t.fields?t.fields:t.formConfig?t.formConfig.fields:[]),o=e.computed(()=>{if(t.welcome)return t.welcome;if(t.formConfig&&"welcome"in t.formConfig)return t.formConfig.welcome}),u=e.computed(()=>{if(t.done)return t.done;if(t.formConfig&&"done"in t.formConfig)return t.formConfig.done}),p=e.computed(()=>{var d;return{...t.typewriter,enabled:t.reducedMotion?!1:((d=t.typewriter)==null?void 0:d.enabled)??!0}}),m=e.computed(()=>C.mergeStrings(t.strings)),{snapshot:s,startTyping:g,activateField:w,confirmField:E,editField:V,reconfirmField:f,getMeta:i}=I(n.value),F=e.computed(()=>{var d;return((d=o.value)==null?void 0:d.show)!==!1&&o.value!==void 0}),b=e.ref(!F.value),N=e.ref(!1),x=()=>{if(!b.value||N.value||n.value.length===0)return;N.value=!0;const d=n.value.find(r=>s.value.statuses[r.key]!=="confirmed");d&&g(d.key)};e.watch(b,x),e.onMounted(x);const T=(d,r)=>{var v;s.value.statuses[d]==="editing"?f(d,r):E(d,r),(v=t.callbacks)!=null&&v.onFieldComplete&&t.callbacks.onFieldComplete(d,r,0);const S=n.value.findIndex(c=>c.key===d);for(let c=S+1;c<n.value.length;c++){const a=n.value[c];if(!(!a||s.value.statuses[a.key]==="confirmed")){g(a.key);break}}},$=e.computed(()=>n.value.filter(d=>{const r=s.value.statuses[d.key];return r==="typing"||r==="active"||r==="confirmed"||r==="editing"})),h=e.ref(null);return e.watch(()=>$.value.length,()=>{e.nextTick(()=>{h.value&&(h.value.scrollTop=h.value.scrollHeight)})}),(d,r)=>(e.openBlock(),e.createElementBlock("div",{class:"ns-root",ref_key:"scrollContainerRef",ref:h},[!b.value&&o.value?(e.openBlock(),e.createBlock(D,{key:0,welcome:o.value,typewriter:p.value,onStart:r[0]||(r[0]=k=>b.value=!0)},null,8,["welcome","typewriter"])):e.createCommentVNode("",!0),b.value?(e.openBlock(),e.createElementBlock("div",ee,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.value,k=>{var S;return e.openBlock(),e.createBlock(L,{key:k.key,field:k,status:e.unref(s).statuses[k.key]??"idle",value:((S=t.values)==null?void 0:S[k.key])??e.unref(s).values[k.key],allValues:e.unref(s).values,typewriter:p.value,editable:t.editable,locked:!1,editLabel:t.editLabel??m.value.editLabel,onTypingComplete:e.unref(w),onConfirm:T,onEdit:r[1]||(r[1]=v=>{var c,a;e.unref(V)(v),(a=(c=t.callbacks)==null?void 0:c.onEdit)==null||a.call(c,v)}),onError:r[2]||(r[2]=(v,c)=>{var a,y;return(y=(a=t.callbacks)==null?void 0:a.onError)==null?void 0:y.call(a,v,c)}),onChange:r[3]||(r[3]=(v,c)=>{var a,y;return(y=(a=t.callbacks)==null?void 0:a.onChange)==null?void 0:y.call(a,v,c)}),onFocus:r[4]||(r[4]=v=>{var c,a;return(a=(c=t.callbacks)==null?void 0:c.onFieldFocus)==null?void 0:a.call(c,v)}),onBlur:r[5]||(r[5]=(v,c)=>{var a,y;return(y=(a=t.callbacks)==null?void 0:a.onFieldBlur)==null?void 0:y.call(a,v,c)})},null,8,["field","status","value","allValues","typewriter","editable","editLabel","onTypingComplete"])}),128))])):e.createCommentVNode("",!0),e.unref(s).isComplete&&u.value?(e.openBlock(),e.createBlock(M,{key:2,done:u.value,values:e.unref(s).values,meta:e.unref(i)(),typewriter:p.value},null,8,["done","values","meta","typewriter"])):e.createCommentVNode("",!0)],512))}}),ne=B(te,[["__scopeId","data-v-33050240"]]);exports.DoneScreen=M;exports.ErrorMessage=_;exports.Line=L;exports.NarrativeForm=ne;exports.WelcomeScreen=D;exports.useFormState=I;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),S=require("@viveksinghind/narrative-form-core");function T(t){const s=new S.FormStateEngine(t,()=>{n.value=s.getSnapshot(),e.triggerRef(n)}),n=e.shallowRef(s.getSnapshot());return e.onUnmounted(()=>{s.reset()}),{snapshot:n,startTyping:l=>s.startTyping(l),activateField:l=>s.activateField(l),confirmField:(l,a)=>s.confirmField(l,a),editField:l=>s.editField(l),reconfirmField:(l,a)=>s.reconfirmField(l,a),next:()=>s.next(),focusField:l=>s.focusField(l),reset:()=>{s.reset(),n.value=s.getSnapshot()},getValues:()=>s.getValues(),getMeta:(l,a)=>s.getMeta(l,a)}}const te={class:"ns-welcome fade-in"},ne={class:"ns-welcome-title"},le={key:0,class:"ns-welcome-subtitle"},oe=e.defineComponent({__name:"WelcomeScreen",props:{welcome:{},typewriter:{}},emits:["start"],setup(t,{emit:s}){const n=t,l=s,a=e.ref("");let r;return e.onMounted(()=>{if(!n.typewriter.enabled){a.value=n.welcome.heading||"";return}let o=0;r=setInterval(()=>{a.value=(n.welcome.heading||"").slice(0,o+1),o++,o>=(n.welcome.heading||"").length&&clearInterval(r)},n.typewriter.speed??30)}),e.onUnmounted(()=>{clearInterval(r)}),(o,i)=>(e.openBlock(),e.createElementBlock("div",te,[e.createElementVNode("h1",ne,e.toDisplayString(a.value),1),t.welcome.subtext?(e.openBlock(),e.createElementBlock("p",le,e.toDisplayString(t.welcome.subtext),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{type:"button",class:"ns-welcome-start",onClick:i[0]||(i[0]=v=>l("start"))},e.toDisplayString(t.welcome.ctaLabel||"Start"),1)]))}}),A=(t,s)=>{const n=t.__vccOpts||t;for(const[l,a]of s)n[l]=a;return n},I=A(oe,[["__scopeId","data-v-dbeb46ea"]]),ae={class:"ns-done fade-in"},se={class:"ns-done-title"},re=e.defineComponent({__name:"DoneScreen",props:{done:{},values:{},meta:{},typewriter:{}},setup(t){return(s,n)=>(e.openBlock(),e.createElementBlock("div",ae,[e.createElementVNode("h1",se,e.toDisplayString(typeof t.done.message=="function"?t.done.message(t.values):t.done.message),1)]))}}),K=A(re,[["__scopeId","data-v-7802c8f5"]]),ie={key:0,class:"ns-error-wrapper"},ue={class:"ns-error-text"},ce=e.defineComponent({__name:"ErrorMessage",props:{message:{},config:{}},setup(t){return(s,n)=>(e.openBlock(),e.createBlock(e.Transition,{name:"fade-slide"},{default:e.withCtx(()=>[t.message?(e.openBlock(),e.createElementBlock("div",ie,[e.createElementVNode("p",ue,e.toDisplayString(t.message),1)])):e.createCommentVNode("",!0)]),_:1}))}}),R=A(ce,[["__scopeId","data-v-a8be2d7b"]]);function de(){return typeof window>"u"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches}function M(t){const s=()=>typeof t.text=="function"?t.text():t.text,n=e.ref(0),l=e.ref(!1);let a=null,r=null;const o=()=>{a!==null&&(clearInterval(a),a=null),r!==null&&(clearTimeout(r),r=null)};e.onUnmounted(o),e.watch([()=>s(),()=>t.speed,()=>t.enabled,()=>t.pauseAfter],([k,y,d,m])=>{var C;o();const g=y??38,F=d??!0,u=m??100,B=String(k||"");if(!F||de()||B.length===0){n.value=B.length,l.value=!0,(C=t.onComplete)==null||C.call(t);return}n.value=0,l.value=!1,a=setInterval(()=>{n.value++,n.value>=B.length&&(a!==null&&(clearInterval(a),a=null),r=setTimeout(()=>{var V;l.value=!0,(V=t.onComplete)==null||V.call(t)},u))},g)},{immediate:!0});const i=e.computed(()=>s().slice(0,n.value)),v=e.computed(()=>n.value<s().length&&!l.value);return{displayedText:i,isTyping:v,isComplete:l}}const z=e.defineComponent({__name:"Cursor",props:{cursorChar:{default:"|"},className:{}},setup(t){const s=t,n=e.computed(()=>["ns-cursor",s.className].filter(Boolean).join(" "));return(l,a)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(n.value),"aria-hidden":"true"},e.toDisplayString(t.cursorChar),3))}}),j=e.defineComponent({__name:"Prose",props:{text:{},animate:{type:Boolean,default:!0},speed:{default:38},cursor:{type:Boolean,default:!0},cursorChar:{default:"|"},pauseAfter:{default:100},className:{}},emits:["complete"],setup(t,{emit:s}){const n=t,l=s,{displayedText:a,isTyping:r}=M({text:()=>n.text,speed:n.speed,enabled:n.animate,pauseAfter:n.pauseAfter,onComplete:()=>l("complete")}),o=e.computed(()=>["ns-prose",r.value?"ns-prose--typing":void 0,n.className].filter(Boolean).join(" "));return(i,v)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(o.value)},[e.createTextVNode(e.toDisplayString(e.unref(a))+" ",1),t.cursor&&e.unref(r)?(e.openBlock(),e.createBlock(z,{key:0,cursorChar:t.cursorChar},null,8,["cursorChar"])):e.createCommentVNode("",!0)],2))}}),fe=["aria-label","title"],P=e.defineComponent({__name:"EditIcon",props:{label:{default:"Edit"},className:{}},emits:["edit"],setup(t,{emit:s}){const n=t,l=s,a=e.computed(()=>["ns-edit-btn",n.className].filter(Boolean).join(" "));return(r,o)=>(e.openBlock(),e.createElementBlock("button",{type:"button",class:e.normalizeClass(a.value),onClick:o[0]||(o[0]=i=>l("edit")),"aria-label":t.label,title:t.label},[...o[1]||(o[1]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[e.createElementVNode("path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"}),e.createElementVNode("path",{d:"m15 5 4 4"})],-1)])],10,fe))}}),me={class:"ns-filled-value"},pe={key:0,class:"ns-suffix"},q=e.defineComponent({__name:"FilledValue",props:{value:{},suffix:{},editable:{type:Boolean,default:!0},editLabel:{default:"Edit"},className:{}},emits:["edit"],setup(t,{emit:s}){const n=t,l=s,a=e.computed(()=>["ns-filled-wrap",n.className].filter(Boolean).join(" "));return(r,o)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(a.value)},[e.createElementVNode("span",me,e.toDisplayString(t.value),1),t.suffix?(e.openBlock(),e.createElementBlock("span",pe,e.toDisplayString(t.suffix),1)):e.createCommentVNode("",!0),t.editable?(e.openBlock(),e.createBlock(P,{key:1,label:t.editLabel,onEdit:o[0]||(o[0]=i=>l("edit"))},null,8,["label"])):e.createCommentVNode("",!0)],2))}}),ve=["aria-label"],ye=["onClick","onKeydown","aria-selected","tabindex"],U=e.defineComponent({__name:"ChipsField",props:{fieldKey:{},options:{},defaultValue:{},autoAdvance:{type:Boolean,default:!1},className:{}},emits:["confirm","change"],setup(t,{emit:s}){const n=t,l=s,a=e.ref(n.defaultValue??null),r=e.ref(0),o=e.ref([]),i=d=>{a.value=d,l("change",d),n.autoAdvance&&l("confirm",d)},v=()=>{a.value!==null&&l("confirm",a.value)},k=(d,m)=>{var g,F;switch(d.key){case"Enter":case" ":{d.preventDefault();const u=n.options[m];u&&i(u);break}case"ArrowRight":case"ArrowDown":{d.preventDefault();const u=(m+1)%n.options.length;r.value=u,(g=o.value[u])==null||g.focus();break}case"ArrowLeft":case"ArrowUp":{d.preventDefault();const u=(m-1+n.options.length)%n.options.length;r.value=u,(F=o.value[u])==null||F.focus();break}}},y=e.computed(()=>["ns-chips-wrap",n.className].filter(Boolean).join(" "));return(d,m)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(y.value),role:"listbox","aria-label":t.fieldKey},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,(g,F)=>(e.openBlock(),e.createElementBlock("button",{key:g,type:"button",class:e.normalizeClass(["ns-chip",a.value===g?"ns-chip--active":void 0].filter(Boolean).join(" ")),onClick:u=>i(g),onKeydown:u=>k(u,F),"aria-selected":a.value===g,role:"option",tabindex:F===r.value?0:-1,ref_for:!0,ref:u=>{u&&(o.value[F]=u)}},e.toDisplayString(g),43,ye))),128)),!t.autoAdvance&&a.value!==null?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ns-enter-btn",onClick:v,"aria-label":"Confirm",style:{opacity:"1",transform:"none"}}," ↵ ")):e.createCommentVNode("",!0)],10,ve))}}),ge=["onClick","onKeydown","onMouseenter","aria-pressed"],O=e.defineComponent({__name:"MultiChipsField",props:{fieldKey:{},options:{},defaultValue:{default:()=>[]},className:{}},emits:["confirm","change"],setup(t,{emit:s}){const n=t,l=s,a=e.ref(new Set(n.defaultValue)),r=e.ref(null),o=y=>{a.value.has(y)?a.value.delete(y):a.value.add(y);const d=Array.from(a.value).join(", ");l("change",d)},i=()=>{a.value.size>0&&l("confirm",Array.from(a.value).join(", "))},v=(y,d)=>{y.key==="Enter"&&a.value.size>0?(y.preventDefault(),i()):y.key===" "&&(y.preventDefault(),o(d))},k=e.computed(()=>["ns-chips-wrap",n.className].filter(Boolean).join(" "));return(y,d)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(k.value)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,(m,g)=>(e.openBlock(),e.createElementBlock("button",{key:m,type:"button",class:e.normalizeClass(["ns-chip",a.value.has(m)?"ns-chip--active":void 0,r.value===g?"ns-chip--hover":void 0].filter(Boolean).join(" ")),onClick:F=>o(m),onKeydown:F=>v(F,m),onMouseenter:F=>r.value=g,onMouseleave:d[0]||(d[0]=F=>r.value=null),"aria-pressed":a.value.has(m),role:"option"},e.toDisplayString(m),43,ge))),128)),a.value.size>0?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ns-enter-btn",onClick:i,"aria-label":"Confirm"}," ↵ ")):e.createCommentVNode("",!0)],2))}}),ke=["id","value","aria-label"],Ce={value:"",disabled:""},he=["value"],W=e.defineComponent({__name:"SelectField",props:{fieldKey:{},options:{},placeholder:{default:"Select…"},defaultValue:{default:""},autoAdvance:{type:Boolean,default:!1},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s,a=e.ref(n.defaultValue),r=e.ref(null);e.onMounted(()=>{var d;(d=r.value)==null||d.focus()});const o=d=>{const g=d.target.value;a.value=g,l("change",g),n.autoAdvance&&g!==""&&l("confirm",g)},i=d=>{d.key==="Enter"&&a.value!==""&&(d.preventDefault(),l("confirm",a.value))},v=()=>{a.value!==""&&l("confirm",a.value)},k=e.computed(()=>["ns-select-wrap",n.className].filter(Boolean).join(" ")),y=e.computed(()=>["ns-select",n.inputClassName].filter(Boolean).join(" "));return(d,m)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(k.value)},[e.createElementVNode("select",{ref_key:"selectRef",ref:r,id:`ns-field-${t.fieldKey}`,class:e.normalizeClass(y.value),value:a.value,onChange:o,onKeydown:i,onFocus:m[0]||(m[0]=g=>l("focus")),onBlur:m[1]||(m[1]=g=>l("blur",a.value)),"aria-label":t.fieldKey},[e.createElementVNode("option",Ce,e.toDisplayString(t.placeholder),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,g=>(e.openBlock(),e.createElementBlock("option",{key:g,value:g},e.toDisplayString(g),9,he))),128))],42,ke),!t.autoAdvance&&a.value!==""?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ns-enter-btn",onClick:v,"aria-label":"Confirm"}," ↵ ")):e.createCommentVNode("",!0)],2))}}),be={class:"ns-otp-boxes"},Be=["value","onInput","onKeydown","onFocus","aria-label"],we={class:"ns-otp-resend-wrap"},Ee={key:1,class:"ns-otp-resend ns-otp-resend--disabled"},Fe={class:"ns-otp-timer"},H=e.defineComponent({__name:"OtpField",props:{fieldKey:{},otpLength:{default:6},autoAdvance:{type:Boolean,default:!0},onRequest:{},onVerify:{},resendLabel:{default:"Resend code"},resendDelay:{default:30},className:{}},emits:["confirm","change"],setup(t,{emit:s}){const n=t,l=s,a=e.ref(Array.from({length:n.otpLength},()=>"")),r=e.ref(0),o=e.ref(n.resendDelay),i=e.ref(!1),v=e.ref([]);let k=null;const y=e.ref(!1),d=()=>{if(n.resendDelay<=0){i.value=!0;return}o.value=n.resendDelay,i.value=!1,k!==null&&clearInterval(k),k=setInterval(()=>{o.value-=1,o.value<=0&&(k!==null&&clearInterval(k),i.value=!0)},1e3)};e.onMounted(()=>{var f,c;y.value||(y.value=!0,(f=n.onRequest)==null||f.call(n)),(c=v.value[0])==null||c.focus(),d()}),e.onUnmounted(()=>{k!==null&&clearInterval(k)}),e.watch(()=>n.resendDelay,d);const m=f=>f.join(""),g=(f,c)=>{var b,h;const N=c.target.value.replace(/\D/g,"").slice(-1);a.value[f]=N;const E=m(a.value);l("change",E),N!==""&&f<n.otpLength-1&&((b=v.value[f+1])==null||b.focus(),r.value=f+1),a.value.every(x=>x!=="")&&((h=n.onVerify)==null||h.call(n,E),n.autoAdvance&&setTimeout(()=>l("confirm",E),0))},F=(f,c)=>{var p,w,N;if(c.key==="Backspace")c.preventDefault(),a.value[f]!==""?(a.value[f]="",l("change",m(a.value))):f>0&&(a.value[f-1]="",(p=v.value[f-1])==null||p.focus(),r.value=f-1,l("change",m(a.value)));else if(c.key==="Enter"){c.preventDefault();const E=m(a.value);a.value.every(b=>b!=="")&&l("confirm",E)}else c.key==="ArrowLeft"&&f>0?(c.preventDefault(),(w=v.value[f-1])==null||w.focus(),r.value=f-1):c.key==="ArrowRight"&&f<n.otpLength-1&&(c.preventDefault(),(N=v.value[f+1])==null||N.focus(),r.value=f+1)},u=f=>{var E,b,h;f.preventDefault();const c=((E=f.clipboardData)==null?void 0:E.getData("text").replace(/\D/g,"").slice(0,n.otpLength))||"";if(c.length===0)return;for(let x=0;x<c.length;x++){const L=c[x];L!==void 0&&(a.value[x]=L)}const p=m(a.value);l("change",p);const w=a.value.findIndex(x=>x===""),N=w===-1?n.otpLength-1:w;(b=v.value[N])==null||b.focus(),r.value=N,a.value.every(x=>x!=="")&&((h=n.onVerify)==null||h.call(n,p),n.autoAdvance&&setTimeout(()=>l("confirm",p),0))},B=()=>{var f,c;i.value&&(i.value=!1,a.value=Array.from({length:n.otpLength},()=>""),r.value=0,(f=v.value[0])==null||f.focus(),(c=n.onRequest)==null||c.call(n),d())},C=f=>{r.value=f},V=()=>{l("confirm",m(a.value))},$=e.computed(()=>["ns-otp-wrap",n.className].filter(Boolean).join(" "));return(f,c)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass($.value)},[e.createElementVNode("span",be,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(p,w)=>(e.openBlock(),e.createElementBlock("input",{key:w,ref_for:!0,ref:N=>{N&&(v.value[w]=N)},type:"text",inputmode:"numeric",maxlength:1,class:e.normalizeClass(["ns-otp-box",p!==""?"ns-otp-box--filled":void 0,r.value===w?"ns-otp-box--active":void 0].filter(Boolean).join(" ")),value:p,onInput:N=>g(w,N),onKeydown:N=>F(w,N),onPaste:u,onFocus:N=>C(w),autocomplete:"one-time-code","aria-label":`Digit ${w+1}`},null,42,Be))),128))]),!t.autoAdvance&&a.value.every(p=>p!=="")?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ns-enter-btn",onClick:V,"aria-label":"Confirm"}," ↵ ")):e.createCommentVNode("",!0),e.createElementVNode("span",we,[i.value?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ns-otp-resend",onClick:B},e.toDisplayString(t.resendLabel),1)):(e.openBlock(),e.createElementBlock("span",Ee,[e.createElementVNode("span",Fe," Resend in "+e.toDisplayString(o.value)+"s ",1)]))])],2))}}),G=e.defineComponent({__name:"EnterButton",props:{label:{default:"↵"},className:{}},emits:["confirm"],setup(t,{emit:s}){const n=t,l=s,a=e.computed(()=>["ns-enter-btn",n.className].filter(Boolean).join(" "));return(r,o)=>(e.openBlock(),e.createElementBlock("button",{type:"button",class:e.normalizeClass(a.value),onClick:o[0]||(o[0]=i=>l("confirm")),"aria-label":"Confirm"},e.toDisplayString(t.label),3))}}),Ne=["id","type","inputmode","value","placeholder","aria-label"],Ve={key:0,class:"ns-suffix"},D=e.defineComponent({__name:"InlineInput",props:{fieldKey:{},type:{default:"text"},placeholder:{},defaultValue:{default:""},suffix:{},sanitise:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur","escape"],setup(t,{emit:s}){const n=t,l=s,a=e.ref(n.defaultValue),r=e.ref(!1),o=e.ref(null);e.onMounted(()=>{var C;(C=o.value)==null||C.focus()});const i=C=>{const V=n.sanitise?n.sanitise(C):C;a.value=V,l("change",V)},v=C=>{const V=C.target;i(V.value)},k=C=>{var $;if(!n.sanitise)return;C.preventDefault();const V=(($=C.clipboardData)==null?void 0:$.getData("text"))||"";i(V)},y=C=>{C.key==="Enter"?(C.preventDefault(),l("confirm",a.value)):C.key==="Escape"&&(C.preventDefault(),l("escape"))},d=()=>{r.value=!0,l("focus")},m=()=>{r.value=!1,l("blur",a.value)},g=()=>{l("confirm",a.value)},F=e.computed(()=>["ns-input-wrap",n.className].filter(Boolean).join(" ")),u=e.computed(()=>["ns-input",`ns-input--${n.type}`,r.value?"ns-input--focused":void 0,n.inputClassName].filter(Boolean).join(" ")),B=e.computed(()=>{switch(n.type){case"tel":return"tel";case"email":return"email";case"number":return"numeric";default:return}});return(C,V)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(F.value)},[e.createElementVNode("input",{ref_key:"inputRef",ref:o,id:`ns-field-${t.fieldKey}`,class:e.normalizeClass(u.value),type:t.type==="number"?"text":t.type,inputmode:B.value,value:a.value,placeholder:t.placeholder,onInput:v,onKeydown:y,onFocus:d,onBlur:m,onPaste:k,autocomplete:"off","aria-label":t.fieldKey},null,42,Ne),e.createVNode(G,{onConfirm:g}),t.suffix?(e.openBlock(),e.createElementBlock("span",Ve,e.toDisplayString(t.suffix),1)):e.createCommentVNode("",!0)],2))}}),Z=e.defineComponent({__name:"PasswordField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s;return(a,r)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"password",onConfirm:r[0]||(r[0]=o=>l("confirm",o)),onChange:r[1]||(r[1]=o=>l("change",o)),onFocus:r[2]||(r[2]=o=>l("focus")),onBlur:r[3]||(r[3]=o=>l("blur",o))}),null,16))}}),_=e.defineComponent({__name:"DateField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s;return(a,r)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"date",onConfirm:r[0]||(r[0]=o=>l("confirm",o)),onChange:r[1]||(r[1]=o=>l("change",o)),onFocus:r[2]||(r[2]=o=>l("focus")),onBlur:r[3]||(r[3]=o=>l("blur",o))}),null,16))}}),J=e.defineComponent({__name:"TextField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s;return(a,r)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"text",onConfirm:r[0]||(r[0]=o=>l("confirm",o)),onChange:r[1]||(r[1]=o=>l("change",o)),onFocus:r[2]||(r[2]=o=>l("focus")),onBlur:r[3]||(r[3]=o=>l("blur",o))}),null,16))}}),Q=e.defineComponent({__name:"EmailField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s;return(a,r)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"email",onConfirm:r[0]||(r[0]=o=>l("confirm",o)),onChange:r[1]||(r[1]=o=>l("change",o)),onFocus:r[2]||(r[2]=o=>l("focus")),onBlur:r[3]||(r[3]=o=>l("blur",o))}),null,16))}}),X=e.defineComponent({__name:"NumberField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s,a=r=>r.replace(/[^\d.-]/g,"");return(r,o)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"number",sanitise:a,onConfirm:o[0]||(o[0]=i=>l("confirm",i)),onChange:o[1]||(o[1]=i=>l("change",i)),onFocus:o[2]||(o[2]=i=>l("focus")),onBlur:o[3]||(o[3]=i=>l("blur",i))}),null,16))}}),Y=e.defineComponent({__name:"TelField",props:{fieldKey:{},placeholder:{},defaultValue:{},suffix:{},inputClassName:{},className:{}},emits:["confirm","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s,a=r=>r.replace(/\D/g,"");return(r,o)=>(e.openBlock(),e.createBlock(D,e.mergeProps(n,{type:"tel",sanitise:a,onConfirm:o[0]||(o[0]=i=>l("confirm",i)),onChange:o[1]||(o[1]=i=>l("change",i)),onFocus:o[2]||(o[2]=i=>l("focus")),onBlur:o[3]||(o[3]=i=>l("blur",i))}),null,16))}}),xe={class:"ns-prompt-row"},$e={key:0,class:"ns-input-row"},De=e.defineComponent({__name:"Line",props:{field:{},status:{},value:{},allValues:{},typewriter:{},editable:{type:Boolean},locked:{type:Boolean},editLabel:{}},emits:["typingComplete","confirm","edit","error","change","focus","blur"],setup(t,{emit:s}){const n=t,l=s,a={chips:U,"multi-chips":O,select:W,otp:H,password:Z,date:_,text:J,email:Q,number:X,tel:Y},r=e.computed(()=>a[n.field.type]||D),o=e.ref(n.value!==void 0?n.value:""),i=e.ref(null),v=e.ref(!1),k=e.computed(()=>n.field.editable!==!1&&n.editable&&!n.locked),y=e.computed(()=>{var u;return n.field.animate!==!1&&((u=n.typewriter)==null?void 0:u.enabled)!==!1});e.watch(()=>n.value,u=>{u!==void 0&&u!==o.value&&(o.value=u)});const d=()=>{n.status==="typing"&&l("typingComplete",n.field.key)},m=u=>{o.value=u;const B=Array.isArray(u)?u.join(", "):String(u);l("change",n.field.key,B),i.value&&(i.value=null)},g=async u=>{o.value=u;const B=Array.isArray(u)?u.join(", "):String(u),C=S.validateField(n.field,u,n.allValues);if(!C.valid){i.value=C.error||"Invalid input",l("error",n.field.key,i.value);return}if(S.hasAsyncValidation(n.field)){v.value=!0;const V=await S.validateFieldAsync(n.field,u,n.allValues);if(v.value=!1,!V.valid){i.value=V.error||"Invalid input",l("error",n.field.key,i.value);return}}i.value=null,l("confirm",n.field.key,B)},F=()=>{i.value=null,l("edit",n.field.key)};return(u,B)=>{var C,V,$,f;return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ns-line fade-in",t.field.className])},[e.createElementVNode("div",xe,[e.createVNode(j,{text:t.field.prefix||t.field.prompt||"",animate:t.status==="typing"&&y.value,speed:(C=t.typewriter)==null?void 0:C.speed,cursor:((V=t.typewriter)==null?void 0:V.cursor)!==!1,cursorChar:($=t.typewriter)==null?void 0:$.cursorChar,pauseAfter:(f=t.typewriter)==null?void 0:f.pauseAfter,onComplete:d},null,8,["text","animate","speed","cursor","cursorChar","pauseAfter"]),t.status==="confirmed"?(e.openBlock(),e.createBlock(q,{key:0,value:Array.isArray(o.value)?o.value.join(", "):String(o.value),suffix:t.field.suffix,editable:k.value,editLabel:t.editLabel,onEdit:F},null,8,["value","suffix","editable","editLabel"])):e.createCommentVNode("",!0)]),t.status==="active"||t.status==="editing"?(e.openBlock(),e.createElementBlock("div",$e,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.value),{fieldKey:t.field.key,type:t.field.type,placeholder:t.field.placeholder,defaultValue:t.status==="editing"?o.value:t.field.defaultValue,suffix:t.field.suffix,options:t.field.options,otpLength:t.field.otpLength,autoAdvance:t.field.autoAdvance,resendLabel:t.field.resendLabel,resendDelay:t.field.resendDelay,sanitise:t.field.sanitise,inputClassName:t.field.inputClassName,disabled:v.value,onConfirm:g,onChange:m,onFocus:B[0]||(B[0]=c=>l("focus",t.field.key)),onBlur:B[1]||(B[1]=c=>l("blur",t.field.key,c)),onRequest:B[2]||(B[2]=c=>t.field.onRequest&&t.field.onRequest()),onVerify:B[3]||(B[3]=c=>t.field.onVerify&&t.field.onVerify(c))},null,40,["fieldKey","type","placeholder","defaultValue","suffix","options","otpLength","autoAdvance","resendLabel","resendDelay","sanitise","inputClassName","disabled"]))])):e.createCommentVNode("",!0),e.createVNode(R,{message:i.value},null,8,["message"])],2)}}}),ee=A(De,[["__scopeId","data-v-7fe5da13"]]),Se={key:1,class:"ns-form-body"},Ae=e.defineComponent({__name:"NarrativeForm",props:{fields:{},formConfig:{},typewriter:{},welcome:{},done:{},editable:{type:Boolean,default:!0},editLabel:{},callbacks:{},defaultValues:{},values:{},strings:{},reducedMotion:{type:Boolean}},setup(t){const s=t,n=e.computed(()=>s.fields?s.fields:s.formConfig?s.formConfig.fields:[]),l=e.computed(()=>{if(s.welcome)return s.welcome;if(s.formConfig&&"welcome"in s.formConfig)return s.formConfig.welcome}),a=e.computed(()=>{if(s.done)return s.done;if(s.formConfig&&"done"in s.formConfig)return s.formConfig.done}),r=e.computed(()=>{var c;return{...s.typewriter,enabled:s.reducedMotion?!1:((c=s.typewriter)==null?void 0:c.enabled)??!0}}),o=e.computed(()=>S.mergeStrings(s.strings)),{snapshot:i,startTyping:v,activateField:k,confirmField:y,editField:d,reconfirmField:m,getMeta:g}=T(n.value),F=e.computed(()=>{var c;return((c=l.value)==null?void 0:c.show)!==!1&&l.value!==void 0}),u=e.ref(!F.value),B=e.ref(!1),C=()=>{if(!u.value||B.value||n.value.length===0)return;B.value=!0;const c=n.value.find(p=>i.value.statuses[p.key]!=="confirmed");c&&v(c.key)};e.watch(u,C),e.onMounted(C);const V=(c,p)=>{var E;i.value.statuses[c]==="editing"?m(c,p):y(c,p),(E=s.callbacks)!=null&&E.onFieldComplete&&s.callbacks.onFieldComplete(c,p,0);const N=n.value.findIndex(b=>b.key===c);for(let b=N+1;b<n.value.length;b++){const h=n.value[b];if(!(!h||i.value.statuses[h.key]==="confirmed")){v(h.key);break}}},$=e.computed(()=>n.value.filter(c=>{const p=i.value.statuses[c.key];return p==="typing"||p==="active"||p==="confirmed"||p==="editing"})),f=e.ref(null);return e.watch(()=>$.value.length,()=>{e.nextTick(()=>{f.value&&(f.value.scrollTop=f.value.scrollHeight)})}),(c,p)=>(e.openBlock(),e.createElementBlock("div",{class:"ns-root",ref_key:"scrollContainerRef",ref:f},[!u.value&&l.value?(e.openBlock(),e.createBlock(I,{key:0,welcome:l.value,typewriter:r.value,onStart:p[0]||(p[0]=w=>u.value=!0)},null,8,["welcome","typewriter"])):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createElementBlock("div",Se,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.value,w=>{var N;return e.openBlock(),e.createBlock(ee,{key:w.key,field:w,status:e.unref(i).statuses[w.key]??"idle",value:((N=s.values)==null?void 0:N[w.key])??e.unref(i).values[w.key],allValues:e.unref(i).values,typewriter:r.value,editable:s.editable,locked:!1,editLabel:s.editLabel??o.value.editLabel,onTypingComplete:e.unref(k),onConfirm:V,onEdit:p[1]||(p[1]=E=>{var b,h;e.unref(d)(E),(h=(b=s.callbacks)==null?void 0:b.onEdit)==null||h.call(b,E)}),onError:p[2]||(p[2]=(E,b)=>{var h,x;return(x=(h=s.callbacks)==null?void 0:h.onError)==null?void 0:x.call(h,E,b)}),onChange:p[3]||(p[3]=(E,b)=>{var h,x;return(x=(h=s.callbacks)==null?void 0:h.onChange)==null?void 0:x.call(h,E,b)}),onFocus:p[4]||(p[4]=E=>{var b,h;return(h=(b=s.callbacks)==null?void 0:b.onFieldFocus)==null?void 0:h.call(b,E)}),onBlur:p[5]||(p[5]=(E,b)=>{var h,x;return(x=(h=s.callbacks)==null?void 0:h.onFieldBlur)==null?void 0:x.call(h,E,b)})},null,8,["field","status","value","allValues","typewriter","editable","editLabel","onTypingComplete"])}),128))])):e.createCommentVNode("",!0),e.unref(i).isComplete&&a.value?(e.openBlock(),e.createBlock(K,{key:2,done:a.value,values:e.unref(i).values,meta:e.unref(g)(),typewriter:r.value},null,8,["done","values","meta","typewriter"])):e.createCommentVNode("",!0)],512))}}),Le=A(Ae,[["__scopeId","data-v-33050240"]]),Te=e.defineComponent({__name:"ThemeProvider",props:{theme:{default:()=>({})}},setup(t){const s=t,n={background:"--ns-bg",textColor:"--ns-text",inputBorderColor:"--ns-border",placeholderColor:"--ns-placeholder-color",errorColor:"--ns-error",filledColor:"--ns-filled-color",cursorColor:"--ns-cursor-color",successColor:"--ns-success-color",loadingColor:"--ns-loading-color",fontFamily:"--ns-font-family",uiFontFamily:"--ns-ui-font",fontSize:"--ns-font-size",mobileFontSize:"--ns-mobile-font-size",inputFontStyle:"--ns-input-font-style",lineGap:"--ns-line-gap",pagePadding:"--ns-page-padding",buttonRadius:"--ns-btn-radius",buttonBackground:"--ns-btn-bg",buttonColor:"--ns-btn-color",enterBtnSize:"--ns-enter-size",chipBorderRadius:"--ns-chip-radius",chipBorderColor:"--ns-chip-border",chipActiveBackground:"--ns-chip-active-bg",chipActiveColor:"--ns-chip-active-color",chipFontStyle:"--ns-chip-font-style"},l=e.ref(!1);let a=null;const r=k=>{l.value=k.matches};e.onMounted(()=>{typeof window<"u"&&(a=window.matchMedia("(prefers-color-scheme: dark)"),l.value=a.matches,a.addEventListener("change",r))}),e.onUnmounted(()=>{a&&a.removeEventListener("change",r)});const o=e.computed(()=>s.theme.mode==="dark"?!0:s.theme.mode==="auto"?l.value:!1),i=e.computed(()=>o.value&&s.theme.dark?{...s.theme,...s.theme.dark}:s.theme),v=e.computed(()=>{const k={};for(const[y,d]of Object.entries(n)){const m=i.value[y];typeof m=="string"&&m.length>0&&(k[d]=m)}return k});return e.provide("themeContext",e.computed(()=>({theme:i.value,isDark:o.value}))),(k,y)=>(e.openBlock(),e.createElementBlock("div",{style:e.normalizeStyle(v.value),class:e.normalizeClass(o.value?"ns-root--dark":void 0)},[e.renderSlot(k.$slots,"default")],6))}}),Ie={key:0,class:"ns-toast-container","aria-live":"polite"},Ke={key:0,class:"ns-toast-icon"},Re={class:"ns-toast-message"},Me=["onClick"],ze=e.defineComponent({__name:"ToastProvider",setup(t){const s=e.ref([]),n=(a,r=!1,o="⚠")=>{const i=Math.random().toString(36).substring(2,9);s.value.push({id:i,message:a,icon:r,iconChar:o}),setTimeout(()=>{s.value=s.value.filter(v=>v.id!==i)},3e3)},l=a=>{s.value=s.value.filter(r=>r.id!==a)};return e.provide("toastContext",{showToast:n,hideToast:l}),(a,r)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.renderSlot(a.$slots,"default"),s.value.length>0?(e.openBlock(),e.createElementBlock("div",Ie,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"ns-toast ns-animate-fade-up"},[o.icon?(e.openBlock(),e.createElementBlock("span",Ke,e.toDisplayString(o.iconChar),1)):e.createCommentVNode("",!0),e.createElementVNode("span",Re,e.toDisplayString(o.message),1),e.createElementVNode("button",{type:"button",class:"ns-toast-close",onClick:i=>l(o.id),"aria-label":"Close"}," × ",8,Me)]))),128))])):e.createCommentVNode("",!0)],64))}});function je(t){const s=e.ref(e.unref(t.formConfig)??null),n=e.ref(!!e.unref(t.fieldsUrl)&&!e.unref(t.formConfig)),l=e.ref(null),a=e.ref(0);return e.watch([()=>e.unref(t.fieldsUrl),()=>e.unref(t.fieldsUrlHeaders),()=>e.unref(t.formConfig),a],async([o,i,v])=>{var k;if(v){s.value=v,n.value=!1,l.value=null;return}if(o){n.value=!0,l.value=null;try{const y=await S.fetchFormConfig(o,{headers:i});s.value=y}catch(y){const d=y instanceof Error?y:new Error(String(y));l.value=d,(k=t.onFetchError)==null||k.call(t,d)}finally{n.value=!1}}},{immediate:!0}),{config:s,loading:n,error:l,retry:()=>{e.unref(t.fieldsUrl)&&!e.unref(t.formConfig)&&a.value++}}}exports.ChipsField=U;exports.Cursor=z;exports.DateField=_;exports.DoneScreen=K;exports.EditIcon=P;exports.EmailField=Q;exports.EnterButton=G;exports.ErrorMessage=R;exports.FilledValue=q;exports.InlineInput=D;exports.Line=ee;exports.MultiChipsField=O;exports.NarrativeForm=Le;exports.NumberField=X;exports.OtpField=H;exports.PasswordField=Z;exports.Prose=j;exports.SelectField=W;exports.TelField=Y;exports.TextField=J;exports.ThemeProvider=Te;exports.ToastProvider=ze;exports.WelcomeScreen=I;exports.useDynamicForm=je;exports.useFormState=T;exports.useTypewriter=M;
package/dist/index.d.ts CHANGED
@@ -3,5 +3,25 @@ export { default as WelcomeScreen } from './components/WelcomeScreen.vue';
3
3
  export { default as DoneScreen } from './components/DoneScreen.vue';
4
4
  export { default as Line } from './components/Line.vue';
5
5
  export { default as ErrorMessage } from './components/ErrorMessage.vue';
6
+ export { default as Cursor } from './components/Cursor.vue';
7
+ export { default as EditIcon } from './components/EditIcon.vue';
8
+ export { default as EnterButton } from './components/EnterButton.vue';
9
+ export { default as FilledValue } from './components/FilledValue.vue';
10
+ export { default as InlineInput } from './components/InlineInput.vue';
11
+ export { default as Prose } from './components/Prose.vue';
12
+ export { default as ThemeProvider } from './components/ThemeProvider.vue';
13
+ export { default as ToastProvider } from './components/ToastProvider.vue';
14
+ export { default as ChipsField } from './components/fields/ChipsField.vue';
15
+ export { default as DateField } from './components/fields/DateField.vue';
16
+ export { default as EmailField } from './components/fields/EmailField.vue';
17
+ export { default as MultiChipsField } from './components/fields/MultiChipsField.vue';
18
+ export { default as NumberField } from './components/fields/NumberField.vue';
19
+ export { default as OtpField } from './components/fields/OtpField.vue';
20
+ export { default as PasswordField } from './components/fields/PasswordField.vue';
21
+ export { default as SelectField } from './components/fields/SelectField.vue';
22
+ export { default as TelField } from './components/fields/TelField.vue';
23
+ export { default as TextField } from './components/fields/TextField.vue';
6
24
  export * from './composables/useFormState';
25
+ export * from './composables/useDynamicForm';
26
+ export * from './composables/useTypewriter';
7
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACxE,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAGzE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC"}