@mdxui/terminal 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +571 -0
  2. package/dist/ansi-css-Sk5mWtdK.d.ts +119 -0
  3. package/dist/ansi-css-V6JIHGsM.d.ts +119 -0
  4. package/dist/ansi-css-_3eSEU9d.d.ts +119 -0
  5. package/dist/chunk-3EFDH7PK.js +5235 -0
  6. package/dist/chunk-3RG5ZIWI.js +10 -0
  7. package/dist/chunk-3X5IR6WE.js +884 -0
  8. package/dist/chunk-4FV5ZDCE.js +5236 -0
  9. package/dist/chunk-4OVMSF2J.js +243 -0
  10. package/dist/chunk-63FEETIS.js +4048 -0
  11. package/dist/chunk-B43KP7XJ.js +884 -0
  12. package/dist/chunk-BMTJXWUV.js +655 -0
  13. package/dist/chunk-C3SVH4N7.js +882 -0
  14. package/dist/chunk-EVWR7Y47.js +874 -0
  15. package/dist/chunk-F6A5VWUC.js +1285 -0
  16. package/dist/chunk-FD7KW7GE.js +882 -0
  17. package/dist/chunk-GBQ6UD6I.js +655 -0
  18. package/dist/chunk-GMDD3M6U.js +5227 -0
  19. package/dist/chunk-JBHRXOXM.js +1058 -0
  20. package/dist/chunk-JFOO3EYO.js +1182 -0
  21. package/dist/chunk-JQ5H3WXL.js +1291 -0
  22. package/dist/chunk-JQD5NASE.js +234 -0
  23. package/dist/chunk-KRHJP5R7.js +592 -0
  24. package/dist/chunk-KWF6WVJE.js +962 -0
  25. package/dist/chunk-LHYQVN3H.js +1038 -0
  26. package/dist/chunk-M3TLQLGC.js +1032 -0
  27. package/dist/chunk-MVW4Q5OP.js +240 -0
  28. package/dist/chunk-NXCZSWLU.js +1294 -0
  29. package/dist/chunk-O25TNRO6.js +607 -0
  30. package/dist/chunk-PNECDA2I.js +884 -0
  31. package/dist/chunk-QIHWRLJR.js +962 -0
  32. package/dist/chunk-QW5YMQ7K.js +882 -0
  33. package/dist/chunk-R5U7XKVJ.js +16 -0
  34. package/dist/chunk-RP2MVQLR.js +962 -0
  35. package/dist/chunk-TP6RXGXA.js +1087 -0
  36. package/dist/chunk-TQQSTITZ.js +655 -0
  37. package/dist/chunk-X24GWXQV.js +1281 -0
  38. package/dist/components/index.d.ts +802 -0
  39. package/dist/components/index.js +149 -0
  40. package/dist/data/index.d.ts +2554 -0
  41. package/dist/data/index.js +51 -0
  42. package/dist/forms/index.d.ts +1596 -0
  43. package/dist/forms/index.js +464 -0
  44. package/dist/index-CQRFZntR.d.ts +867 -0
  45. package/dist/index.d.ts +579 -0
  46. package/dist/index.js +786 -0
  47. package/dist/interactive-D0JkWosD.d.ts +217 -0
  48. package/dist/keyboard/index.d.ts +2 -0
  49. package/dist/keyboard/index.js +43 -0
  50. package/dist/renderers/index.d.ts +546 -0
  51. package/dist/renderers/index.js +2157 -0
  52. package/dist/storybook/index.d.ts +396 -0
  53. package/dist/storybook/index.js +641 -0
  54. package/dist/theme/index.d.ts +1339 -0
  55. package/dist/theme/index.js +123 -0
  56. package/dist/types-Bxu5PAgA.d.ts +710 -0
  57. package/dist/types-CIlop5Ji.d.ts +701 -0
  58. package/dist/types-Ca8p_p5X.d.ts +710 -0
  59. package/package.json +90 -0
  60. package/src/__tests__/components/data/card.test.ts +458 -0
  61. package/src/__tests__/components/data/list.test.ts +473 -0
  62. package/src/__tests__/components/data/metrics.test.ts +541 -0
  63. package/src/__tests__/components/data/table.test.ts +448 -0
  64. package/src/__tests__/components/input/field.test.ts +555 -0
  65. package/src/__tests__/components/input/form.test.ts +870 -0
  66. package/src/__tests__/components/input/search.test.ts +1238 -0
  67. package/src/__tests__/components/input/select.test.ts +658 -0
  68. package/src/__tests__/components/navigation/breadcrumb.test.ts +923 -0
  69. package/src/__tests__/components/navigation/command-palette.test.ts +1095 -0
  70. package/src/__tests__/components/navigation/sidebar.test.ts +1018 -0
  71. package/src/__tests__/components/navigation/tabs.test.ts +995 -0
  72. package/src/__tests__/components.test.tsx +1197 -0
  73. package/src/__tests__/core/compiler.test.ts +986 -0
  74. package/src/__tests__/core/parser.test.ts +785 -0
  75. package/src/__tests__/core/tier-switcher.test.ts +1103 -0
  76. package/src/__tests__/core/types.test.ts +1398 -0
  77. package/src/__tests__/data/collections.test.ts +1337 -0
  78. package/src/__tests__/data/db.test.ts +1265 -0
  79. package/src/__tests__/data/reactive.test.ts +1010 -0
  80. package/src/__tests__/data/sync.test.ts +1614 -0
  81. package/src/__tests__/errors.test.ts +660 -0
  82. package/src/__tests__/forms/integration.test.ts +444 -0
  83. package/src/__tests__/integration.test.ts +905 -0
  84. package/src/__tests__/keyboard.test.ts +1791 -0
  85. package/src/__tests__/renderer.test.ts +489 -0
  86. package/src/__tests__/renderers/ansi-css.test.ts +948 -0
  87. package/src/__tests__/renderers/ansi.test.ts +1366 -0
  88. package/src/__tests__/renderers/ascii.test.ts +1360 -0
  89. package/src/__tests__/renderers/interactive.test.ts +2353 -0
  90. package/src/__tests__/renderers/markdown.test.ts +1483 -0
  91. package/src/__tests__/renderers/text.test.ts +1369 -0
  92. package/src/__tests__/renderers/unicode.test.ts +1307 -0
  93. package/src/__tests__/theme.test.ts +639 -0
  94. package/src/__tests__/utils/assertions.ts +685 -0
  95. package/src/__tests__/utils/index.ts +115 -0
  96. package/src/__tests__/utils/test-renderer.ts +381 -0
  97. package/src/__tests__/utils/utils.test.ts +560 -0
  98. package/src/components/containers/card.ts +56 -0
  99. package/src/components/containers/dialog.ts +53 -0
  100. package/src/components/containers/index.ts +9 -0
  101. package/src/components/containers/panel.ts +59 -0
  102. package/src/components/feedback/badge.ts +40 -0
  103. package/src/components/feedback/index.ts +8 -0
  104. package/src/components/feedback/spinner.ts +23 -0
  105. package/src/components/helpers.ts +81 -0
  106. package/src/components/index.ts +153 -0
  107. package/src/components/layout/breadcrumb.ts +31 -0
  108. package/src/components/layout/index.ts +10 -0
  109. package/src/components/layout/list.ts +29 -0
  110. package/src/components/layout/sidebar.ts +79 -0
  111. package/src/components/layout/table.ts +62 -0
  112. package/src/components/primitives/box.ts +95 -0
  113. package/src/components/primitives/button.ts +54 -0
  114. package/src/components/primitives/index.ts +11 -0
  115. package/src/components/primitives/input.ts +88 -0
  116. package/src/components/primitives/select.ts +97 -0
  117. package/src/components/primitives/text.ts +60 -0
  118. package/src/components/render.ts +155 -0
  119. package/src/components/templates/app.ts +43 -0
  120. package/src/components/templates/index.ts +8 -0
  121. package/src/components/templates/site.ts +54 -0
  122. package/src/components/types.ts +777 -0
  123. package/src/core/compiler.ts +718 -0
  124. package/src/core/parser.ts +127 -0
  125. package/src/core/tier-switcher.ts +607 -0
  126. package/src/core/types.ts +672 -0
  127. package/src/data/collection.ts +316 -0
  128. package/src/data/collections.ts +50 -0
  129. package/src/data/context.tsx +174 -0
  130. package/src/data/db.ts +127 -0
  131. package/src/data/hooks.ts +532 -0
  132. package/src/data/index.ts +138 -0
  133. package/src/data/reactive.ts +1225 -0
  134. package/src/data/saas-collections.ts +375 -0
  135. package/src/data/sync.ts +1213 -0
  136. package/src/data/types.ts +660 -0
  137. package/src/forms/converters.ts +512 -0
  138. package/src/forms/index.ts +133 -0
  139. package/src/forms/schemas.ts +403 -0
  140. package/src/forms/types.ts +476 -0
  141. package/src/index.ts +542 -0
  142. package/src/keyboard/focus.ts +748 -0
  143. package/src/keyboard/index.ts +96 -0
  144. package/src/keyboard/integration.ts +371 -0
  145. package/src/keyboard/manager.ts +377 -0
  146. package/src/keyboard/presets.ts +90 -0
  147. package/src/renderers/ansi-css.ts +576 -0
  148. package/src/renderers/ansi.ts +802 -0
  149. package/src/renderers/ascii.ts +680 -0
  150. package/src/renderers/breadcrumb.ts +480 -0
  151. package/src/renderers/command-palette.ts +802 -0
  152. package/src/renderers/components/field.ts +210 -0
  153. package/src/renderers/components/form.ts +327 -0
  154. package/src/renderers/components/index.ts +21 -0
  155. package/src/renderers/components/search.ts +449 -0
  156. package/src/renderers/components/select.ts +222 -0
  157. package/src/renderers/index.ts +101 -0
  158. package/src/renderers/interactive/component-handlers.ts +622 -0
  159. package/src/renderers/interactive/cursor-manager.ts +147 -0
  160. package/src/renderers/interactive/focus-manager.ts +279 -0
  161. package/src/renderers/interactive/index.ts +661 -0
  162. package/src/renderers/interactive/input-handler.ts +164 -0
  163. package/src/renderers/interactive/keyboard-handler.ts +212 -0
  164. package/src/renderers/interactive/mouse-handler.ts +167 -0
  165. package/src/renderers/interactive/state-manager.ts +109 -0
  166. package/src/renderers/interactive/types.ts +338 -0
  167. package/src/renderers/interactive-string.ts +299 -0
  168. package/src/renderers/interactive.ts +59 -0
  169. package/src/renderers/markdown.ts +950 -0
  170. package/src/renderers/sidebar.ts +549 -0
  171. package/src/renderers/tabs.ts +682 -0
  172. package/src/renderers/text.ts +791 -0
  173. package/src/renderers/unicode.ts +917 -0
  174. package/src/renderers/utils.ts +942 -0
  175. package/src/router/adapters.ts +383 -0
  176. package/src/router/types.ts +140 -0
  177. package/src/router/utils.ts +452 -0
  178. package/src/schemas.ts +205 -0
  179. package/src/storybook/index.ts +91 -0
  180. package/src/storybook/interactive-decorator.tsx +659 -0
  181. package/src/storybook/keyboard-simulator.ts +501 -0
  182. package/src/theme/ansi-codes.ts +80 -0
  183. package/src/theme/box-drawing.ts +132 -0
  184. package/src/theme/color-convert.ts +254 -0
  185. package/src/theme/color-support.ts +321 -0
  186. package/src/theme/index.ts +134 -0
  187. package/src/theme/strip-ansi.ts +50 -0
  188. package/src/theme/tailwind-map.ts +469 -0
  189. package/src/theme/text-styles.ts +206 -0
  190. package/src/theme/theme-system.ts +568 -0
  191. package/src/types.ts +103 -0
@@ -0,0 +1,464 @@
1
+ import "../chunk-3RG5ZIWI.js";
2
+
3
+ // src/forms/schemas.ts
4
+ import { z } from "zod";
5
+ var FieldValueSchema = z.union([
6
+ z.string(),
7
+ z.number(),
8
+ z.boolean(),
9
+ z.null(),
10
+ z.undefined(),
11
+ z.array(z.string())
12
+ ]);
13
+ var SelectOptionSchema = z.object({
14
+ label: z.string(),
15
+ value: z.string(),
16
+ disabled: z.boolean().optional(),
17
+ description: z.string().optional()
18
+ });
19
+ var SearchSuggestionSchema = z.object({
20
+ label: z.string(),
21
+ value: z.string(),
22
+ description: z.string().optional(),
23
+ icon: z.string().optional()
24
+ });
25
+ var FieldTypeSchema = z.enum([
26
+ "text",
27
+ "email",
28
+ "password",
29
+ "number",
30
+ "checkbox",
31
+ "textarea",
32
+ "select"
33
+ ]);
34
+ var FieldConfigSchema = z.object({
35
+ name: z.string().min(1, "Field name is required"),
36
+ label: z.string().optional(),
37
+ type: FieldTypeSchema.optional(),
38
+ value: FieldValueSchema.optional(),
39
+ placeholder: z.string().optional(),
40
+ required: z.boolean().optional(),
41
+ error: z.string().optional(),
42
+ valid: z.boolean().optional(),
43
+ disabled: z.boolean().optional(),
44
+ readonly: z.boolean().optional(),
45
+ helperText: z.string().optional(),
46
+ focused: z.boolean().optional(),
47
+ cursorPosition: z.number().int().nonnegative().optional(),
48
+ selectionStart: z.number().int().nonnegative().optional(),
49
+ selectionEnd: z.number().int().nonnegative().optional(),
50
+ options: z.array(SelectOptionSchema).optional()
51
+ });
52
+ var FieldGroupSchema = z.object({
53
+ title: z.string(),
54
+ fields: z.array(FieldConfigSchema),
55
+ collapsible: z.boolean().optional(),
56
+ collapsed: z.boolean().optional()
57
+ });
58
+ var FormStateSchema = z.object({
59
+ title: z.string().optional(),
60
+ description: z.string().optional(),
61
+ fields: z.array(FieldConfigSchema).optional(),
62
+ groups: z.array(FieldGroupSchema).optional(),
63
+ error: z.string().optional(),
64
+ success: z.string().optional(),
65
+ loading: z.boolean().optional(),
66
+ submitLabel: z.string().optional(),
67
+ cancelLabel: z.string().optional(),
68
+ submitDisabled: z.boolean().optional(),
69
+ submitHotkey: z.string().optional(),
70
+ border: z.boolean().optional()
71
+ });
72
+ var SelectStateSchema = z.object({
73
+ options: z.array(SelectOptionSchema),
74
+ value: z.union([z.string(), z.array(z.string())]).optional(),
75
+ label: z.string().optional(),
76
+ placeholder: z.string().optional(),
77
+ required: z.boolean().optional(),
78
+ error: z.string().optional(),
79
+ valid: z.boolean().optional(),
80
+ disabled: z.boolean().optional(),
81
+ open: z.boolean().optional(),
82
+ multiple: z.boolean().optional(),
83
+ highlightedIndex: z.number().int().optional(),
84
+ searchable: z.boolean().optional(),
85
+ searchValue: z.string().optional(),
86
+ filteredOptions: z.array(SelectOptionSchema).optional(),
87
+ loading: z.boolean().optional()
88
+ });
89
+ var SearchStateSchema = z.object({
90
+ value: z.string(),
91
+ placeholder: z.string().optional(),
92
+ label: z.string().optional(),
93
+ disabled: z.boolean().optional(),
94
+ loading: z.boolean().optional(),
95
+ error: z.string().optional(),
96
+ focused: z.boolean().optional(),
97
+ cursorPosition: z.number().int().nonnegative().optional(),
98
+ suggestions: z.array(SearchSuggestionSchema).nullable().optional(),
99
+ showSuggestions: z.boolean().optional(),
100
+ highlightedIndex: z.number().int().optional(),
101
+ maxSuggestions: z.number().int().positive().optional(),
102
+ highlightMatches: z.boolean().optional(),
103
+ isTyping: z.boolean().optional()
104
+ });
105
+ var EmailSchema = z.string().email("Please enter a valid email address");
106
+ var PasswordSchema = z.string().min(8, "Password must be at least 8 characters").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number");
107
+ var SimplePasswordSchema = z.string().min(8, "Password must be at least 8 characters");
108
+ var UsernameSchema = z.string().min(3, "Username must be at least 3 characters").max(20, "Username must be at most 20 characters").regex(/^[a-zA-Z0-9_-]+$/, "Username can only contain letters, numbers, underscores, and hyphens");
109
+ var UrlSchema = z.string().url("Please enter a valid URL");
110
+ var PhoneSchema = z.string().regex(/^\+?[1-9]\d{1,14}$/, "Please enter a valid phone number");
111
+ function createLoginSchema(options) {
112
+ const base = z.object({
113
+ email: EmailSchema,
114
+ password: options?.strictPassword ? PasswordSchema : SimplePasswordSchema
115
+ });
116
+ if (options?.rememberMe) {
117
+ return base.extend({
118
+ rememberMe: z.boolean().optional().default(false)
119
+ });
120
+ }
121
+ return base;
122
+ }
123
+ function createRegistrationSchema(options) {
124
+ let schema = z.object({
125
+ email: EmailSchema,
126
+ password: PasswordSchema
127
+ });
128
+ if (options?.usernameRequired) {
129
+ schema = schema.extend({
130
+ username: UsernameSchema
131
+ });
132
+ }
133
+ if (options?.confirmPassword) {
134
+ schema = schema.extend({
135
+ confirmPassword: z.string()
136
+ });
137
+ return schema.refine(
138
+ (data) => {
139
+ const d = data;
140
+ return d.password === d.confirmPassword;
141
+ },
142
+ {
143
+ message: "Passwords do not match",
144
+ path: ["confirmPassword"]
145
+ }
146
+ ).and(
147
+ options?.termsRequired ? z.object({ acceptTerms: z.literal(true, { errorMap: () => ({ message: "You must accept the terms" }) }) }) : z.object({})
148
+ );
149
+ }
150
+ if (options?.termsRequired) {
151
+ return schema.extend({
152
+ acceptTerms: z.literal(true, {
153
+ errorMap: () => ({ message: "You must accept the terms" })
154
+ })
155
+ });
156
+ }
157
+ return schema;
158
+ }
159
+ function createContactSchema(options) {
160
+ let schema = z.object({
161
+ name: z.string().min(1, "Name is required"),
162
+ email: EmailSchema,
163
+ message: z.string().min(10, "Message must be at least 10 characters")
164
+ });
165
+ if (options?.phoneRequired) {
166
+ schema = schema.extend({
167
+ phone: PhoneSchema
168
+ });
169
+ }
170
+ if (options?.subjectRequired) {
171
+ schema = schema.extend({
172
+ subject: z.string().min(1, "Subject is required")
173
+ });
174
+ }
175
+ return schema;
176
+ }
177
+ function createProfileSchema() {
178
+ return z.object({
179
+ firstName: z.string().min(1, "First name is required"),
180
+ lastName: z.string().min(1, "Last name is required"),
181
+ email: EmailSchema,
182
+ bio: z.string().max(500, "Bio must be at most 500 characters").optional(),
183
+ website: UrlSchema.optional().or(z.literal("")),
184
+ location: z.string().optional(),
185
+ timezone: z.string().optional()
186
+ });
187
+ }
188
+ function createSettingsSchema() {
189
+ return z.object({
190
+ emailNotifications: z.boolean().default(true),
191
+ pushNotifications: z.boolean().default(true),
192
+ marketingEmails: z.boolean().default(false),
193
+ theme: z.enum(["light", "dark", "system"]).default("system"),
194
+ language: z.string().default("en")
195
+ });
196
+ }
197
+
198
+ // src/forms/converters.ts
199
+ function convertRHFToFormState(rhfState, fields, options) {
200
+ const enhancedFields = fields.map((field) => {
201
+ const error = rhfState.errors[field.name];
202
+ const isTouched = rhfState.touchedFields[field.name];
203
+ const isDirty = rhfState.dirtyFields[field.name];
204
+ const value = options?.values?.[field.name];
205
+ return {
206
+ ...field,
207
+ value: value ?? field.value,
208
+ error: error?.message ?? field.error,
209
+ valid: isTouched && !error && field.required ? true : field.valid
210
+ // Mark as valid if touched without error and was required
211
+ };
212
+ });
213
+ const enhancedGroups = options?.groups?.map((group) => ({
214
+ ...group,
215
+ fields: group.fields.map((field) => {
216
+ const error = rhfState.errors[field.name];
217
+ const isTouched = rhfState.touchedFields[field.name];
218
+ const value = options?.values?.[field.name];
219
+ return {
220
+ ...field,
221
+ value: value ?? field.value,
222
+ error: error?.message ?? field.error,
223
+ valid: isTouched && !error && field.required ? true : field.valid
224
+ };
225
+ })
226
+ }));
227
+ return {
228
+ title: options?.title,
229
+ description: options?.description,
230
+ fields: enhancedFields,
231
+ groups: enhancedGroups,
232
+ loading: rhfState.isSubmitting,
233
+ submitLabel: options?.submitLabel,
234
+ cancelLabel: options?.cancelLabel,
235
+ submitDisabled: !rhfState.isValid || rhfState.isSubmitting,
236
+ submitHotkey: options?.submitHotkey,
237
+ border: options?.border,
238
+ values: options?.values
239
+ };
240
+ }
241
+ function formStateToUINode(formState) {
242
+ return {
243
+ type: "form",
244
+ props: {
245
+ title: formState.title,
246
+ description: formState.description,
247
+ fields: formState.fields,
248
+ groups: formState.groups,
249
+ error: formState.error,
250
+ success: formState.success,
251
+ loading: formState.loading,
252
+ submitLabel: formState.submitLabel,
253
+ cancelLabel: formState.cancelLabel,
254
+ submitDisabled: formState.submitDisabled,
255
+ submitHotkey: formState.submitHotkey,
256
+ border: formState.border
257
+ }
258
+ };
259
+ }
260
+ function fieldConfigToUINode(field) {
261
+ return {
262
+ type: "field",
263
+ props: {
264
+ name: field.name,
265
+ label: field.label,
266
+ type: field.type,
267
+ value: field.value,
268
+ placeholder: field.placeholder,
269
+ required: field.required,
270
+ error: field.error,
271
+ valid: field.valid,
272
+ disabled: field.disabled,
273
+ readonly: field.readonly,
274
+ helperText: field.helperText,
275
+ focused: field.focused,
276
+ cursorPosition: field.cursorPosition,
277
+ selectionStart: field.selectionStart,
278
+ selectionEnd: field.selectionEnd
279
+ }
280
+ };
281
+ }
282
+ function createFieldFromRegister(name, registerResult, options) {
283
+ return {
284
+ name: registerResult.name,
285
+ label: options?.label ?? name.charAt(0).toUpperCase() + name.slice(1),
286
+ type: options?.type ?? "text",
287
+ placeholder: options?.placeholder,
288
+ required: options?.required,
289
+ helperText: options?.helperText,
290
+ disabled: options?.disabled,
291
+ readonly: options?.readonly
292
+ };
293
+ }
294
+ function selectStateToUINode(selectState) {
295
+ return {
296
+ type: "select",
297
+ props: {
298
+ options: selectState.options,
299
+ value: selectState.value,
300
+ label: selectState.label,
301
+ placeholder: selectState.placeholder,
302
+ required: selectState.required,
303
+ error: selectState.error,
304
+ valid: selectState.valid,
305
+ disabled: selectState.disabled,
306
+ open: selectState.open ?? true,
307
+ multiple: selectState.multiple,
308
+ highlightedIndex: selectState.highlightedIndex ?? -1,
309
+ searchable: selectState.searchable,
310
+ searchValue: selectState.searchValue,
311
+ filteredOptions: selectState.filteredOptions,
312
+ loading: selectState.loading
313
+ }
314
+ };
315
+ }
316
+ function createSelectForController(name, options, fieldOptions) {
317
+ return {
318
+ options,
319
+ value: fieldOptions?.value,
320
+ label: fieldOptions?.label ?? name.charAt(0).toUpperCase() + name.slice(1),
321
+ placeholder: fieldOptions?.placeholder ?? `Select ${name}...`,
322
+ required: fieldOptions?.required,
323
+ error: fieldOptions?.error,
324
+ disabled: fieldOptions?.disabled,
325
+ multiple: fieldOptions?.multiple,
326
+ searchable: fieldOptions?.searchable,
327
+ open: true,
328
+ highlightedIndex: -1
329
+ };
330
+ }
331
+ function searchStateToUINode(searchState) {
332
+ return {
333
+ type: "search",
334
+ props: {
335
+ value: searchState.value,
336
+ placeholder: searchState.placeholder,
337
+ label: searchState.label,
338
+ disabled: searchState.disabled,
339
+ loading: searchState.loading,
340
+ error: searchState.error,
341
+ focused: searchState.focused,
342
+ cursorPosition: searchState.cursorPosition,
343
+ suggestions: searchState.suggestions,
344
+ showSuggestions: searchState.showSuggestions,
345
+ highlightedIndex: searchState.highlightedIndex ?? -1,
346
+ maxSuggestions: searchState.maxSuggestions ?? 10,
347
+ highlightMatches: searchState.highlightMatches,
348
+ isTyping: searchState.isTyping
349
+ }
350
+ };
351
+ }
352
+ function createDebouncedSearch(onSearch, delay = 300) {
353
+ let timeoutId = null;
354
+ let currentState = {
355
+ suggestions: null,
356
+ showSuggestions: false,
357
+ loading: false,
358
+ isTyping: false
359
+ };
360
+ const handleChange = (value) => {
361
+ if (timeoutId) {
362
+ clearTimeout(timeoutId);
363
+ }
364
+ currentState = {
365
+ ...currentState,
366
+ isTyping: true,
367
+ showSuggestions: true
368
+ };
369
+ timeoutId = setTimeout(async () => {
370
+ currentState = {
371
+ ...currentState,
372
+ isTyping: false,
373
+ loading: true
374
+ };
375
+ try {
376
+ const results = await onSearch(value);
377
+ currentState = {
378
+ ...currentState,
379
+ suggestions: results,
380
+ loading: false
381
+ };
382
+ } catch {
383
+ currentState = {
384
+ ...currentState,
385
+ suggestions: [],
386
+ loading: false
387
+ };
388
+ }
389
+ }, delay);
390
+ };
391
+ const handleFocus = () => {
392
+ currentState = {
393
+ ...currentState,
394
+ showSuggestions: true
395
+ };
396
+ };
397
+ const handleBlur = () => {
398
+ setTimeout(() => {
399
+ currentState = {
400
+ ...currentState,
401
+ showSuggestions: false
402
+ };
403
+ }, 200);
404
+ };
405
+ const getState = () => ({ ...currentState });
406
+ return { handleChange, handleFocus, handleBlur, getState };
407
+ }
408
+ function extractFieldErrors(errors, fieldNames) {
409
+ const result = {};
410
+ const names = fieldNames ?? Object.keys(errors);
411
+ for (const name of names) {
412
+ const error = errors[name];
413
+ if (error?.message) {
414
+ result[name] = error.message;
415
+ }
416
+ }
417
+ return result;
418
+ }
419
+ function hasFormErrors(errors) {
420
+ return Object.keys(errors).length > 0;
421
+ }
422
+ function getFirstErrorField(errors, fieldOrder) {
423
+ if (fieldOrder) {
424
+ for (const name of fieldOrder) {
425
+ if (errors[name]) {
426
+ return name;
427
+ }
428
+ }
429
+ }
430
+ return Object.keys(errors)[0];
431
+ }
432
+ export {
433
+ EmailSchema,
434
+ FieldConfigSchema,
435
+ FieldGroupSchema,
436
+ FieldTypeSchema,
437
+ FieldValueSchema,
438
+ FormStateSchema,
439
+ PasswordSchema,
440
+ PhoneSchema,
441
+ SearchStateSchema,
442
+ SearchSuggestionSchema,
443
+ SelectOptionSchema,
444
+ SelectStateSchema,
445
+ SimplePasswordSchema,
446
+ UrlSchema,
447
+ UsernameSchema,
448
+ convertRHFToFormState,
449
+ createContactSchema,
450
+ createDebouncedSearch,
451
+ createFieldFromRegister,
452
+ createLoginSchema,
453
+ createProfileSchema,
454
+ createRegistrationSchema,
455
+ createSelectForController,
456
+ createSettingsSchema,
457
+ extractFieldErrors,
458
+ fieldConfigToUINode,
459
+ formStateToUINode,
460
+ getFirstErrorField,
461
+ hasFormErrors,
462
+ searchStateToUINode,
463
+ selectStateToUINode
464
+ };