@nice2dev/ui-forms 1.0.10

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.
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DaXUT-OK.cjs");exports.NiceFormBuilder=e.NiceFormBuilder;exports.NiceFormBuilderAI=e.NiceFormBuilderAI;exports.NiceFormDesigner=e.NiceFormDesigner;exports.schemaToFormItems=e.schemaToFormItems;exports.useFormDesigner=e.useFormDesigner;exports.validateFormSchema=e.validateFormSchema;
@@ -0,0 +1,468 @@
1
+ import { default as default_2 } from 'react';
2
+ import { NiceBaseProps } from '@nice2dev/ui';
3
+
4
+ declare interface AIGeneratedField {
5
+ label: string;
6
+ field: string;
7
+ type: string;
8
+ required?: boolean;
9
+ options?: string[];
10
+ placeholder?: string;
11
+ helpText?: string;
12
+ }
13
+
14
+ declare interface BarcodeConfig {
15
+ formats: ('ean13' | 'ean8' | 'code128' | 'code39' | 'qr' | 'datamatrix' | 'pdf417')[];
16
+ autoFill?: {
17
+ field: string;
18
+ property: string;
19
+ }[];
20
+ enableCamera?: boolean;
21
+ enableManualEntry?: boolean;
22
+ }
23
+
24
+ declare interface CalculationConfig {
25
+ expression: string;
26
+ dependencies: string[];
27
+ format?: 'number' | 'currency' | 'percentage' | 'date';
28
+ precision?: number;
29
+ currencyCode?: string;
30
+ }
31
+
32
+ declare interface DataBindingConfig {
33
+ entityType: string;
34
+ fieldPath: string;
35
+ direction: 'read' | 'write' | 'both';
36
+ transform?: string;
37
+ defaultFromEntity?: boolean;
38
+ }
39
+
40
+ declare interface FieldI18n {
41
+ label?: Record<string, string>;
42
+ placeholder?: Record<string, string>;
43
+ helpText?: Record<string, string>;
44
+ options?: Record<string, {
45
+ value: string;
46
+ label: string;
47
+ }[]>;
48
+ }
49
+
50
+ declare interface FormDesignerContextValue {
51
+ schema: FormDesignerSchema;
52
+ selectedFieldId: string | null;
53
+ selectedTabId: string | null;
54
+ locale: string;
55
+ setSchema: (schema: FormDesignerSchema) => void;
56
+ selectField: (fieldId: string | null) => void;
57
+ selectTab: (tabId: string | null) => void;
58
+ addField: (containerId: string, field: FormDesignerField, index?: number) => void;
59
+ updateField: (fieldId: string, updates: Partial<FormDesignerField>) => void;
60
+ removeField: (fieldId: string) => void;
61
+ moveField: (fieldId: string, toContainerId: string, toIndex: number) => void;
62
+ duplicateField: (fieldId: string) => void;
63
+ addTab: (tab: FormDesignerTab, index?: number) => void;
64
+ updateTab: (tabId: string, updates: Partial<FormDesignerTab>) => void;
65
+ removeTab: (tabId: string) => void;
66
+ setLocale: (locale: string) => void;
67
+ loadTemplate: (template: FormTemplate) => void;
68
+ saveAsTemplate: (name: string, category: string) => FormTemplate;
69
+ }
70
+
71
+ declare interface FormDesignerField {
72
+ id: string;
73
+ type: FormDesignerFieldType;
74
+ name: string;
75
+ label?: string;
76
+ placeholder?: string;
77
+ helpText?: string;
78
+ defaultValue?: unknown;
79
+ options?: FormFieldOption_2[];
80
+ validations?: FormFieldValidation_2[];
81
+ conditions?: FormFieldCondition_2[];
82
+ colSpan?: number;
83
+ rowSpan?: number;
84
+ className?: string;
85
+ style?: default_2.CSSProperties;
86
+ disabled?: boolean;
87
+ readonly?: boolean;
88
+ hidden?: boolean;
89
+ lookup?: LookupConfig;
90
+ calculation?: CalculationConfig;
91
+ barcode?: BarcodeConfig;
92
+ dataBinding?: DataBindingConfig;
93
+ i18n?: FieldI18n;
94
+ children?: FormDesignerField[];
95
+ props?: Record<string, unknown>;
96
+ }
97
+
98
+ declare type FormDesignerFieldType = 'text' | 'textarea' | 'number' | 'email' | 'password' | 'phone' | 'url' | 'date' | 'datetime' | 'time' | 'dateRange' | 'select' | 'multiselect' | 'checkbox' | 'toggle' | 'radio' | 'slider' | 'rating' | 'richtext' | 'markdown' | 'code' | 'file' | 'image' | 'signature' | 'lookup' | 'calculated' | 'barcode' | 'qrcode' | 'currency' | 'percentage' | 'section' | 'tab' | 'divider' | 'spacer' | 'heading' | 'paragraph' | 'repeater' | 'table' | 'address' | 'geolocation';
99
+
100
+ declare interface FormDesignerSchema {
101
+ version: string;
102
+ id: string;
103
+ title?: string;
104
+ description?: string;
105
+ entityType?: string;
106
+ layout: {
107
+ type: 'flat' | 'tabs' | 'wizard' | 'accordion';
108
+ columns: 1 | 2 | 3 | 4;
109
+ labelPosition: 'top' | 'left' | 'floating';
110
+ size: 'sm' | 'md' | 'lg';
111
+ gap: 'sm' | 'md' | 'lg';
112
+ };
113
+ sections?: FormDesignerSection[];
114
+ tabs?: FormDesignerTab[];
115
+ submit?: {
116
+ label: string;
117
+ labelKey?: string;
118
+ style?: 'primary' | 'secondary' | 'success';
119
+ position?: 'left' | 'center' | 'right';
120
+ showCancel?: boolean;
121
+ cancelLabel?: string;
122
+ cancelLabelKey?: string;
123
+ };
124
+ computedFields?: {
125
+ name: string;
126
+ expression: string;
127
+ dependencies: string[];
128
+ }[];
129
+ validations?: {
130
+ type: 'crossField';
131
+ expression: string;
132
+ message: string;
133
+ messageKey?: string;
134
+ }[];
135
+ defaultLocale?: string;
136
+ supportedLocales?: string[];
137
+ i18n?: {
138
+ title?: Record<string, string>;
139
+ description?: Record<string, string>;
140
+ };
141
+ meta?: {
142
+ createdAt?: string;
143
+ updatedAt?: string;
144
+ author?: string;
145
+ tags?: string[];
146
+ };
147
+ }
148
+
149
+ declare interface FormDesignerSection {
150
+ id: string;
151
+ title?: string;
152
+ description?: string;
153
+ collapsible?: boolean;
154
+ defaultCollapsed?: boolean;
155
+ columns?: 1 | 2 | 3 | 4;
156
+ fields: FormDesignerField[];
157
+ i18n?: {
158
+ title?: Record<string, string>;
159
+ description?: Record<string, string>;
160
+ };
161
+ }
162
+
163
+ declare interface FormDesignerTab {
164
+ id: string;
165
+ title: string;
166
+ icon?: string;
167
+ disabled?: boolean;
168
+ badge?: string | number;
169
+ fields: FormDesignerField[];
170
+ i18n?: {
171
+ title?: Record<string, string>;
172
+ };
173
+ }
174
+
175
+ /**
176
+ * Conditional visibility rule
177
+ */
178
+ declare interface FormFieldCondition {
179
+ field: string;
180
+ operator: 'equals' | 'notEquals' | 'contains' | 'greaterThan' | 'lessThan' | 'isEmpty' | 'isNotEmpty';
181
+ value?: any;
182
+ }
183
+
184
+ declare interface FormFieldCondition_2 {
185
+ field: string;
186
+ operator: 'equals' | 'notEquals' | 'contains' | 'startsWith' | 'endsWith' | 'greaterThan' | 'lessThan' | 'isEmpty' | 'isNotEmpty' | 'in' | 'notIn';
187
+ value?: unknown;
188
+ logicalOperator?: 'and' | 'or';
189
+ }
190
+
191
+ /**
192
+ * Form field definition
193
+ */
194
+ export declare interface FormFieldDefinition {
195
+ /** Unique field ID */
196
+ id: string;
197
+ /** Field type */
198
+ type: FormFieldType;
199
+ /** Field name (for form data) */
200
+ name: string;
201
+ /** Display label */
202
+ label?: string;
203
+ /** Placeholder text */
204
+ placeholder?: string;
205
+ /** Help text */
206
+ helpText?: string;
207
+ /** Default value */
208
+ defaultValue?: any;
209
+ /** Options for select/radio fields. Plain strings are treated as `{ value: s, label: s }`. */
210
+ options?: Array<FormFieldOption | string>;
211
+ /** Validation rules */
212
+ validations?: FormFieldValidation[];
213
+ /** Convenience flag — expanded into a `required` validation rule when serialised. */
214
+ required?: boolean;
215
+ /** Conditional visibility */
216
+ conditions?: FormFieldCondition[];
217
+ /** Is field disabled */
218
+ disabled?: boolean;
219
+ /** Is field readonly */
220
+ readonly?: boolean;
221
+ /** Column span (1-12) */
222
+ colSpan?: number;
223
+ /** Custom CSS class */
224
+ className?: string;
225
+ /** Custom styles */
226
+ style?: default_2.CSSProperties;
227
+ /** Additional field-specific props */
228
+ props?: Record<string, any>;
229
+ /** Nested fields (for section type) */
230
+ children?: FormFieldDefinition[];
231
+ }
232
+
233
+ /**
234
+ * Option for select/radio fields
235
+ */
236
+ declare interface FormFieldOption {
237
+ value: string | number;
238
+ label: string;
239
+ disabled?: boolean;
240
+ /** Optional stable identifier for keyed rendering. */
241
+ id?: string;
242
+ }
243
+
244
+ declare interface FormFieldOption_2 {
245
+ value: string | number;
246
+ label: string;
247
+ disabled?: boolean;
248
+ icon?: string;
249
+ }
250
+
251
+ /**
252
+ * Available field types
253
+ */
254
+ export declare type FormFieldType = 'text' | 'textarea' | 'number' | 'email' | 'password' | 'phone' | 'url' | 'date' | 'datetime' | 'time' | 'select' | 'multiselect' | 'checkbox' | 'toggle' | 'radio' | 'slider' | 'rating' | 'color' | 'file' | 'signature' | 'richtext' | 'markdown' | 'code' | 'heading' | 'paragraph' | 'divider' | 'spacer' | 'image' | 'section';
255
+
256
+ /**
257
+ * Validation rule
258
+ */
259
+ declare interface FormFieldValidation {
260
+ type: 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'email' | 'url' | 'custom';
261
+ value?: string | number | boolean;
262
+ message?: string;
263
+ }
264
+
265
+ declare interface FormFieldValidation_2 {
266
+ type: 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'email' | 'url' | 'custom' | 'unique';
267
+ value?: string | number | boolean;
268
+ message?: string;
269
+ errorMessageKey?: string;
270
+ }
271
+
272
+ /**
273
+ * Complete form schema
274
+ */
275
+ export declare interface FormSchema {
276
+ /** Schema version */
277
+ version: string;
278
+ /** Form ID */
279
+ id: string;
280
+ /** Form title */
281
+ title?: string;
282
+ /** Form description */
283
+ description?: string;
284
+ /** Layout settings */
285
+ layout: {
286
+ columns: 1 | 2 | 3 | 4;
287
+ labelPosition: 'top' | 'left' | 'floating';
288
+ size: 'sm' | 'md' | 'lg';
289
+ gap: 'sm' | 'md' | 'lg';
290
+ };
291
+ /** Form sections */
292
+ sections: FormSectionDefinition[];
293
+ /** Submit button settings */
294
+ submit?: {
295
+ label: string;
296
+ style?: 'primary' | 'secondary' | 'success';
297
+ position?: 'left' | 'center' | 'right';
298
+ };
299
+ /** Meta information */
300
+ meta?: {
301
+ createdAt?: string;
302
+ updatedAt?: string;
303
+ author?: string;
304
+ };
305
+ }
306
+
307
+ /**
308
+ * Form section definition
309
+ */
310
+ export declare interface FormSectionDefinition {
311
+ id: string;
312
+ title?: string;
313
+ description?: string;
314
+ collapsible?: boolean;
315
+ defaultCollapsed?: boolean;
316
+ columns?: 1 | 2 | 3 | 4;
317
+ fields: FormFieldDefinition[];
318
+ }
319
+
320
+ declare interface FormTemplate {
321
+ id: string;
322
+ name: string;
323
+ description?: string;
324
+ category: string;
325
+ schema: FormDesignerSchema;
326
+ thumbnail?: string;
327
+ createdAt?: string;
328
+ updatedAt?: string;
329
+ }
330
+
331
+ declare interface LookupConfig {
332
+ entityType: string;
333
+ displayField: string;
334
+ valueField: string;
335
+ searchFields?: string[];
336
+ filterExpression?: string;
337
+ sortField?: string;
338
+ sortDirection?: 'asc' | 'desc';
339
+ pageSize?: number;
340
+ fetchUrl?: string;
341
+ dependsOn?: string[];
342
+ cascadeFields?: {
343
+ source: string;
344
+ target: string;
345
+ }[];
346
+ }
347
+
348
+ export declare function NiceFormBuilder({ initialSchema, fields, onChange, onExport, onPreview, className, style, }: NiceFormBuilderProps): JSX.Element;
349
+
350
+ export declare const NiceFormBuilderAI: default_2.ForwardRefExoticComponent<NiceFormBuilderAIProps & default_2.RefAttributes<NiceFormBuilderAIRef>>;
351
+
352
+ export declare interface NiceFormBuilderAIProps extends Omit<NiceFormBuilderProps, 'ref' | 'onChange' | 'initialSchema'> {
353
+ /** Enable AI features (requires NiceAIProvider) */
354
+ enableAI?: boolean;
355
+ /** AI model to use */
356
+ aiModel?: string;
357
+ /** Enable form generation from description */
358
+ enableGenerate?: boolean;
359
+ /** Enable field suggestions */
360
+ enableSuggestions?: boolean;
361
+ /** Callback when AI generates form */
362
+ onGenerate?: (description: string, fields: AIGeneratedField[]) => void;
363
+ /** Show AI toolbar */
364
+ showAIToolbar?: boolean;
365
+ /** Preset form templates */
366
+ templates?: {
367
+ name: string;
368
+ description: string;
369
+ }[];
370
+ /** Initial form fields */
371
+ fields?: FormFieldDefinition[];
372
+ /** Callback when form fields change */
373
+ onChange?: (fields: FormFieldDefinition[]) => void;
374
+ /** Test ID */
375
+ 'data-testid'?: string;
376
+ }
377
+
378
+ declare interface NiceFormBuilderAIRef {
379
+ /** Generate form from natural language description */
380
+ generateForm: (description: string) => Promise<AIGeneratedField[]>;
381
+ /** Get current form fields */
382
+ getFields: () => FormFieldDefinition[];
383
+ /** Apply generated fields to the form */
384
+ applyFields: (fields: AIGeneratedField[]) => void;
385
+ /** Clear all fields */
386
+ clearFields: () => void;
387
+ }
388
+
389
+ export declare interface NiceFormBuilderProps {
390
+ /** Initial form schema */
391
+ initialSchema?: FormSchema;
392
+ /** Convenience flat list of fields — wrapped into a default schema if `initialSchema` is omitted. */
393
+ fields?: Array<Partial<FormFieldDefinition> & {
394
+ id: string;
395
+ type: string;
396
+ label?: string;
397
+ }>;
398
+ /** Called when schema changes */
399
+ onChange?: (schema: FormSchema) => void;
400
+ /** Called when export is requested */
401
+ onExport?: (schema: FormSchema) => void;
402
+ /** Called when preview is requested */
403
+ onPreview?: (schema: FormSchema) => void;
404
+ /** Custom class */
405
+ className?: string;
406
+ /** Style */
407
+ style?: default_2.CSSProperties;
408
+ }
409
+
410
+ export declare const NiceFormDesigner: default_2.FC<NiceFormDesignerProps>;
411
+
412
+ export declare interface NiceFormDesignerProps extends NiceBaseProps {
413
+ /** Initial form schema */
414
+ schema?: FormDesignerSchema;
415
+ /** Called when schema changes */
416
+ onChange?: (schema: FormDesignerSchema) => void;
417
+ /** Read-only mode */
418
+ readOnly?: boolean;
419
+ /** Current locale for preview */
420
+ locale?: string;
421
+ /** Available locales */
422
+ locales?: {
423
+ code: string;
424
+ name: string;
425
+ }[];
426
+ /** Show palette */
427
+ showPalette?: boolean;
428
+ /** Show properties panel */
429
+ showProperties?: boolean;
430
+ /** Show preview toggle */
431
+ showPreview?: boolean;
432
+ /** Show toolbar */
433
+ showToolbar?: boolean;
434
+ /** Available entity types for data binding */
435
+ entityTypes?: {
436
+ name: string;
437
+ fields: {
438
+ name: string;
439
+ type: string;
440
+ label: string;
441
+ }[];
442
+ }[];
443
+ /** Form templates */
444
+ templates?: FormTemplate[];
445
+ /** Called to save as template */
446
+ onSaveTemplate?: (template: FormTemplate) => void;
447
+ /** Called to load template */
448
+ onLoadTemplate?: (templateId: string) => FormTemplate | null;
449
+ /** Enable validation */
450
+ enableValidation?: boolean;
451
+ }
452
+
453
+ /**
454
+ * Convert form schema to NiceForm items
455
+ */
456
+ export declare function schemaToFormItems(schema: FormSchema): any[];
457
+
458
+ export declare function useFormDesigner(): FormDesignerContextValue;
459
+
460
+ /**
461
+ * Validate form schema
462
+ */
463
+ export declare function validateFormSchema(schema: FormSchema): {
464
+ valid: boolean;
465
+ errors: string[];
466
+ };
467
+
468
+ export { }
package/dist/index.mjs ADDED
@@ -0,0 +1,9 @@
1
+ import { U as r, V as s, X as m, _ as o, a0 as i, a1 as F } from "./index-B3TLwoy5.js";
2
+ export {
3
+ r as NiceFormBuilder,
4
+ s as NiceFormBuilderAI,
5
+ m as NiceFormDesigner,
6
+ o as schemaToFormItems,
7
+ i as useFormDesigner,
8
+ F as validateFormSchema
9
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .nice-form-builder-ai{--ai-primary: #6366f1;--ai-primary-light: #818cf8;--ai-bg: #f8fafc;--ai-border: #e2e8f0;--ai-text: #334155;--ai-text-muted: #64748b;--ai-success: #22c55e;--ai-panel-bg: #ffffff;display:flex;flex-direction:column;border-radius:8px;overflow:hidden;border:1px solid var(--ai-border);background:var(--ai-panel-bg)}[data-theme=dark] .nice-form-builder-ai,.nice-form-builder-ai.dark{--ai-primary: #818cf8;--ai-primary-light: #a5b4fc;--ai-bg: #1e293b;--ai-border: #334155;--ai-text: #e2e8f0;--ai-text-muted: #94a3b8;--ai-success: #4ade80;--ai-panel-bg: #0f172a}.nice-form-builder-ai__toolbar{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:linear-gradient(135deg,#6366f1,#8b5cf6);gap:12px}.nice-form-builder-ai__toolbar-left{display:flex;align-items:center;gap:12px}.nice-form-builder-ai__badge{display:inline-flex;align-items:center;justify-content:center;padding:3px 10px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--ai-primary);background:#fff;border-radius:4px}.nice-form-builder-ai__loading{font-size:12px;color:#fff;opacity:.9;animation:pulse-opacity 1.5s ease-in-out infinite}@keyframes pulse-opacity{0%,to{opacity:.5}50%{opacity:1}}.nice-form-builder-ai__toolbar-right{display:flex;align-items:center;gap:8px}.nice-form-builder-ai__btn{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;color:#fff;background:#fff3;border:1px solid rgba(255,255,255,.3);border-radius:6px;cursor:pointer;transition:all .15s ease}.nice-form-builder-ai__btn:hover:not(:disabled){background:#ffffff4d}.nice-form-builder-ai__btn:disabled{opacity:.5;cursor:not-allowed}.nice-form-builder-ai__btn--secondary{background:transparent;border-color:#fff6}.nice-form-builder-ai__templates-dropdown{position:relative}.nice-form-builder-ai__templates-menu{position:absolute;top:100%;right:0;min-width:280px;margin-top:6px;background:var(--ai-panel-bg);border:1px solid var(--ai-border);border-radius:8px;box-shadow:0 10px 30px #00000026;z-index:100;animation:dropIn .15s ease-out}@keyframes dropIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.nice-form-builder-ai__template-item{display:flex;flex-direction:column;gap:2px;width:100%;padding:12px 16px;text-align:left;background:transparent;border:none;border-bottom:1px solid var(--ai-border);cursor:pointer;transition:background .1s ease}.nice-form-builder-ai__template-item:last-child{border-bottom:none;border-radius:0 0 8px 8px}.nice-form-builder-ai__template-item:first-child{border-radius:8px 8px 0 0}.nice-form-builder-ai__template-item:hover{background:var(--ai-bg)}.nice-form-builder-ai__template-name{font-size:14px;font-weight:500;color:var(--ai-text)}.nice-form-builder-ai__template-desc{font-size:12px;color:var(--ai-text-muted)}.nice-form-builder-ai__builder-wrapper{flex:1;min-height:400px}.nice-form-builder-ai__panel{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:1000}.nice-form-builder-ai__panel-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:#0006}.nice-form-builder-ai__panel-content{position:relative;width:90%;max-width:600px;max-height:80vh;background:var(--ai-panel-bg);border-radius:12px;box-shadow:0 25px 50px #00000040;display:flex;flex-direction:column;animation:modalIn .2s ease-out}@keyframes modalIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.nice-form-builder-ai__panel-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background:var(--ai-bg);border-bottom:1px solid var(--ai-border);border-radius:12px 12px 0 0}.nice-form-builder-ai__panel-header h4{margin:0;font-size:16px;font-weight:600;color:var(--ai-text)}.nice-form-builder-ai__panel-close{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;font-size:16px;color:var(--ai-text-muted);background:transparent;border:none;border-radius:6px;cursor:pointer;transition:all .15s ease}.nice-form-builder-ai__panel-close:hover{color:var(--ai-text);background:var(--ai-border)}.nice-form-builder-ai__panel-body{flex:1;overflow-y:auto;padding:20px}.nice-form-builder-ai__panel-footer{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px;border-top:1px solid var(--ai-border)}.nice-form-builder-ai__prompt-section{display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.nice-form-builder-ai__label{font-size:14px;font-weight:500;color:var(--ai-text)}.nice-form-builder-ai__textarea{width:100%;padding:12px;font-size:14px;font-family:inherit;line-height:1.5;color:var(--ai-text);background:var(--ai-bg);border:1px solid var(--ai-border);border-radius:6px;resize:vertical;outline:none;transition:border-color .15s ease}.nice-form-builder-ai__textarea:focus{border-color:var(--ai-primary)}.nice-form-builder-ai__textarea::placeholder{color:var(--ai-text-muted)}.nice-form-builder-ai__generate-btn{align-self:flex-end;padding:10px 24px;font-size:14px;font-weight:500;color:#fff;background:var(--ai-primary);border:none;border-radius:6px;cursor:pointer;transition:all .15s ease}.nice-form-builder-ai__generate-btn:hover:not(:disabled){background:var(--ai-primary-light)}.nice-form-builder-ai__generate-btn:disabled{opacity:.6;cursor:not-allowed}.nice-form-builder-ai__preview-section{border-top:1px solid var(--ai-border);padding-top:16px}.nice-form-builder-ai__preview-section h5{margin:0 0 12px;font-size:13px;font-weight:600;color:var(--ai-text-muted);text-transform:uppercase;letter-spacing:.5px}.nice-form-builder-ai__fields-preview{display:flex;flex-direction:column;gap:8px;max-height:250px;overflow-y:auto}.nice-form-builder-ai__field-preview{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--ai-bg);border:1px solid var(--ai-border);border-radius:6px}.nice-form-builder-ai__field-icon{font-size:16px}.nice-form-builder-ai__field-info{flex:1;display:flex;flex-direction:column;gap:2px}.nice-form-builder-ai__field-label{font-size:14px;font-weight:500;color:var(--ai-text)}.nice-form-builder-ai__required{color:#ef4444;margin-left:2px}.nice-form-builder-ai__field-type{font-size:12px;color:var(--ai-text-muted);text-transform:capitalize}.nice-form-builder-ai__field-options{font-size:11px;color:var(--ai-primary);padding:2px 6px;background:#6366f11a;border-radius:3px}.nice-form-builder-ai__apply-btn{padding:10px 24px;font-size:14px;font-weight:500;color:#fff;background:var(--ai-success);border:none;border-radius:6px;cursor:pointer;transition:all .15s ease}.nice-form-builder-ai__apply-btn:hover:not(:disabled){background:#16a34a}.nice-form-builder-ai__apply-btn:disabled{opacity:.6;cursor:not-allowed}.nice-form-builder-ai__cancel-btn{padding:10px 24px;font-size:14px;font-weight:500;color:var(--ai-text-muted);background:transparent;border:1px solid var(--ai-border);border-radius:6px;cursor:pointer;transition:all .15s ease}.nice-form-builder-ai__cancel-btn:hover{color:var(--ai-text);background:var(--ai-bg)}@media (max-width: 640px){.nice-form-builder-ai__toolbar{flex-wrap:wrap}.nice-form-builder-ai__toolbar-right{width:100%;justify-content:center;margin-top:8px}.nice-form-builder-ai__panel-content{width:95%;max-height:90vh}.nice-form-builder-ai__templates-menu{right:auto;left:0}}.nice-form-designer{display:flex;flex-direction:column;height:100%;background:var(--nice-bg-secondary, #f8f9fa);font-family:var(--nice-font-family, system-ui, -apple-system, sans-serif)}.nice-form-designer__toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem 1rem;background:var(--nice-bg-primary, #fff);border-bottom:1px solid var(--nice-border-color, #ddd)}.nice-form-designer__toolbar-group{display:flex;align-items:center;gap:.5rem}.nice-form-designer__toolbar select,.nice-form-designer__toolbar button{padding:.4rem .8rem;border:1px solid var(--nice-border-color, #ddd);border-radius:4px;background:var(--nice-bg-primary, #fff);cursor:pointer;font-size:.875rem}.nice-form-designer__toolbar button:hover,.nice-form-designer__toolbar button.active{background:var(--nice-primary, #0066cc);color:#fff;border-color:var(--nice-primary, #0066cc)}.nice-form-designer__body{display:flex;flex:1;overflow:hidden}.nice-form-designer__palette{width:200px;background:var(--nice-bg-primary, #fff);border-right:1px solid var(--nice-border-color, #ddd);display:flex;flex-direction:column;overflow:hidden}.nice-form-designer__palette-tabs{display:flex;padding:.5rem;gap:.25rem;border-bottom:1px solid var(--nice-border-color, #ddd);flex-wrap:wrap}.nice-form-designer__palette-tabs button{padding:.3rem .5rem;border:none;background:transparent;border-radius:4px;cursor:pointer;font-size:1rem;opacity:.6}.nice-form-designer__palette-tabs button:hover{background:var(--nice-bg-hover, #f0f0f0);opacity:1}.nice-form-designer__palette-tabs button.active{background:var(--nice-primary, #0066cc);opacity:1}.nice-form-designer__palette-items{flex:1;overflow-y:auto;padding:.5rem}.nice-form-designer__palette-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;margin-bottom:.25rem;border:1px solid var(--nice-border-color, #ddd);border-radius:4px;background:var(--nice-bg-primary, #fff);cursor:grab;transition:all .2s;-webkit-user-select:none;user-select:none}.nice-form-designer__palette-item:hover{border-color:var(--nice-primary, #0066cc);box-shadow:0 2px 4px #0000001a}.nice-form-designer__palette-item:active{cursor:grabbing}.nice-form-designer__palette-icon{font-size:1.25rem}.nice-form-designer__palette-label{font-size:.8rem;color:var(--nice-text-primary, #333)}.nice-form-designer__canvas{flex:1;overflow:auto;padding:1rem}.nice-form-designer__section{background:var(--nice-bg-primary, #fff);border:1px solid var(--nice-border-color, #ddd);border-radius:8px;padding:1rem;margin-bottom:1rem;min-height:100px}.nice-form-designer__section-title{margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid var(--nice-border-color, #ddd);font-size:1rem;font-weight:600;color:var(--nice-text-primary, #333)}.nice-form-designer__fields-grid{display:grid;gap:.75rem;min-height:60px}.nice-form-designer__drop-hint{grid-column:1 / -1;display:flex;align-items:center;justify-content:center;min-height:60px;border:2px dashed var(--nice-border-color, #ddd);border-radius:4px;color:var(--nice-text-muted, #999);font-size:.875rem}.nice-form-designer__field{position:relative;padding:.75rem;border:1px solid var(--nice-border-color, #ddd);border-radius:6px;background:var(--nice-bg-primary, #fff);cursor:pointer;transition:all .2s}.nice-form-designer__field:hover{border-color:var(--nice-primary, #0066cc)}.nice-form-designer__field--selected{border-color:var(--nice-primary, #0066cc);box-shadow:0 0 0 2px #06c3}.nice-form-designer__field-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.25rem}.nice-form-designer__field-icon{font-size:1rem}.nice-form-designer__field-label{font-size:.875rem;font-weight:500;color:var(--nice-text-primary, #333)}.nice-form-designer__field-required{color:var(--nice-error, #dc3545);margin-left:auto}.nice-form-designer__field-type{font-size:.7rem;color:var(--nice-text-muted, #999);text-transform:uppercase}.nice-form-designer__field-actions{position:absolute;top:.25rem;right:.25rem;display:flex;gap:.25rem;opacity:0;transition:opacity .2s}.nice-form-designer__field--selected .nice-form-designer__field-actions{opacity:1}.nice-form-designer__field-actions button{padding:.25rem .4rem;border:none;background:var(--nice-bg-secondary, #f0f0f0);border-radius:3px;cursor:pointer;font-size:.75rem}.nice-form-designer__field-actions button:hover{background:var(--nice-primary, #0066cc)}.nice-form-designer__preview-input,.nice-form-designer__preview-textarea,.nice-form-designer__preview-select{width:100%;padding:.4rem .6rem;border:1px solid var(--nice-border-color, #ddd);border-radius:4px;background:var(--nice-bg-secondary, #f8f9fa);font-size:.8rem;margin-top:.25rem}.nice-form-designer__preview-textarea{min-height:60px;resize:none}.nice-form-designer__preview-calculated,.nice-form-designer__preview-barcode,.nice-form-designer__preview-placeholder{padding:.4rem .6rem;font-size:.75rem;color:var(--nice-text-muted, #999);background:var(--nice-bg-secondary, #f8f9fa);border-radius:4px;margin-top:.25rem}.nice-form-designer__tabs{background:var(--nice-bg-primary, #fff);border-radius:8px;overflow:hidden}.nice-form-designer__tab-list{display:flex;border-bottom:1px solid var(--nice-border-color, #ddd);padding:0 1rem;background:var(--nice-bg-secondary, #f8f9fa)}.nice-form-designer__tab-btn{padding:.75rem 1rem;border:none;background:transparent;cursor:pointer;font-size:.875rem;color:var(--nice-text-secondary, #666);border-bottom:2px solid transparent;margin-bottom:-1px}.nice-form-designer__tab-btn:hover{color:var(--nice-text-primary, #333)}.nice-form-designer__tab-btn.active{color:var(--nice-primary, #0066cc);border-bottom-color:var(--nice-primary, #0066cc);background:var(--nice-bg-primary, #fff)}.nice-form-designer__tab-badge{margin-left:.5rem;padding:.1rem .4rem;font-size:.7rem;background:var(--nice-primary, #0066cc);color:#fff;border-radius:10px}.nice-form-designer__tab-add{padding:.75rem 1rem;border:none;background:transparent;cursor:pointer;font-size:1.25rem;color:var(--nice-text-muted, #999)}.nice-form-designer__tab-add:hover{color:var(--nice-primary, #0066cc)}.nice-form-designer__tab-content{padding:1rem;min-height:200px}.nice-form-designer__properties{width:280px;background:var(--nice-bg-primary, #fff);border-left:1px solid var(--nice-border-color, #ddd);overflow-y:auto;padding:1rem}.nice-form-designer__properties h3{margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid var(--nice-border-color, #ddd);font-size:.9rem;font-weight:600;color:var(--nice-text-primary, #333)}.nice-form-designer__properties h4{margin:1rem 0 .5rem;font-size:.8rem;font-weight:600;color:var(--nice-text-secondary, #666);text-transform:uppercase}.nice-form-designer__prop-group{margin-bottom:.75rem}.nice-form-designer__prop-group>label{display:flex;align-items:center;gap:.5rem;margin-bottom:.25rem;font-size:.8rem;color:var(--nice-text-secondary, #666)}.nice-form-designer__prop-group input[type=text],.nice-form-designer__prop-group input[type=number],.nice-form-designer__prop-group select,.nice-form-designer__prop-group textarea{width:100%;padding:.4rem .6rem;border:1px solid var(--nice-border-color, #ddd);border-radius:4px;font-size:.8rem}.nice-form-designer__prop-group input[type=checkbox]{margin-right:.5rem}.nice-form-designer__prop-section{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--nice-border-color, #ddd)}@media (max-width: 1024px){.nice-form-designer__palette{width:160px}.nice-form-designer__properties{width:240px}}@media (max-width: 768px){.nice-form-designer__body{flex-direction:column}.nice-form-designer__palette{width:100%;max-height:200px;border-right:none;border-bottom:1px solid var(--nice-border-color, #ddd)}.nice-form-designer__properties{width:100%;border-left:none;border-top:1px solid var(--nice-border-color, #ddd)}}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@nice2dev/ui-forms",
3
+ "version": "1.0.10",
4
+ "description": "Nice2Dev UI Forms - Form builders & designers: NiceFormBuilder, NiceFormBuilderAI, NiceFormDesigner",
5
+ "type": "module",
6
+ "sideEffects": [
7
+ "*.css"
8
+ ],
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.mjs",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.mjs",
15
+ "require": "./dist/index.cjs",
16
+ "types": "./dist/index.d.ts"
17
+ },
18
+ "./style.css": "./dist/style.css"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "vite build",
26
+ "build:types": "tsc --emitDeclarationOnly",
27
+ "dev": "vite build --watch",
28
+ "lint": "eslint src --ext .ts,.tsx",
29
+ "test": "vitest run --passWithNoTests",
30
+ "test:watch": "vitest"
31
+ },
32
+ "dependencies": {},
33
+ "peerDependencies": {
34
+ "@nice2dev/ui": "^1.0.10",
35
+ "react": ">=17.0.0",
36
+ "react-dom": ">=17.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@testing-library/react": "^14.1.0",
40
+ "@types/react": "^18.2.0",
41
+ "@types/react-dom": "^18.2.0",
42
+ "react": "^18.2.0",
43
+ "react-dom": "^18.2.0",
44
+ "typescript": "^5.3.0",
45
+ "vite": "^5.0.0",
46
+ "vite-plugin-dts": "^4.5.4",
47
+ "vitest": "^4.1.0"
48
+ },
49
+ "keywords": [
50
+ "forms",
51
+ "form-builder",
52
+ "form-designer",
53
+ "schema",
54
+ "validation",
55
+ "ai",
56
+ "nice2dev",
57
+ "react"
58
+ ],
59
+ "author": "Nice2Dev",
60
+ "license": "MIT",
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/nicetoDev/nicetoDev-ui.git",
64
+ "directory": "packages/ui-forms"
65
+ }
66
+ }