@fnd-platform/cms 1.0.0-alpha.1
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/LICENSE +21 -0
- package/README.md +283 -0
- package/lib/cms-project.d.ts +127 -0
- package/lib/cms-project.d.ts.map +1 -0
- package/lib/cms-project.js +343 -0
- package/lib/cms-project.js.map +1 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +20 -0
- package/lib/index.js.map +1 -0
- package/lib/options.d.ts +59 -0
- package/lib/options.d.ts.map +1 -0
- package/lib/options.js +3 -0
- package/lib/options.js.map +1 -0
- package/lib/templates/admin-breadcrumbs.d.ts +13 -0
- package/lib/templates/admin-breadcrumbs.d.ts.map +1 -0
- package/lib/templates/admin-breadcrumbs.js +80 -0
- package/lib/templates/admin-breadcrumbs.js.map +1 -0
- package/lib/templates/admin-content-route.d.ts +18 -0
- package/lib/templates/admin-content-route.d.ts.map +1 -0
- package/lib/templates/admin-content-route.js +100 -0
- package/lib/templates/admin-content-route.js.map +1 -0
- package/lib/templates/admin-content-type-route.d.ts +9 -0
- package/lib/templates/admin-content-type-route.d.ts.map +1 -0
- package/lib/templates/admin-content-type-route.js +96 -0
- package/lib/templates/admin-content-type-route.js.map +1 -0
- package/lib/templates/admin-header.d.ts +13 -0
- package/lib/templates/admin-header.d.ts.map +1 -0
- package/lib/templates/admin-header.js +123 -0
- package/lib/templates/admin-header.js.map +1 -0
- package/lib/templates/admin-index.d.ts +9 -0
- package/lib/templates/admin-index.d.ts.map +1 -0
- package/lib/templates/admin-index.js +60 -0
- package/lib/templates/admin-index.js.map +1 -0
- package/lib/templates/admin-layout.d.ts +10 -0
- package/lib/templates/admin-layout.d.ts.map +1 -0
- package/lib/templates/admin-layout.js +46 -0
- package/lib/templates/admin-layout.js.map +1 -0
- package/lib/templates/admin-sidebar.d.ts +13 -0
- package/lib/templates/admin-sidebar.d.ts.map +1 -0
- package/lib/templates/admin-sidebar.js +149 -0
- package/lib/templates/admin-sidebar.js.map +1 -0
- package/lib/templates/content-editor.d.ts +10 -0
- package/lib/templates/content-editor.d.ts.map +1 -0
- package/lib/templates/content-editor.js +354 -0
- package/lib/templates/content-editor.js.map +1 -0
- package/lib/templates/content-schema.d.ts +10 -0
- package/lib/templates/content-schema.d.ts.map +1 -0
- package/lib/templates/content-schema.js +274 -0
- package/lib/templates/content-schema.js.map +1 -0
- package/lib/templates/content-table.d.ts +13 -0
- package/lib/templates/content-table.d.ts.map +1 -0
- package/lib/templates/content-table.js +177 -0
- package/lib/templates/content-table.js.map +1 -0
- package/lib/templates/content-types-examples.d.ts +19 -0
- package/lib/templates/content-types-examples.d.ts.map +1 -0
- package/lib/templates/content-types-examples.js +275 -0
- package/lib/templates/content-types-examples.js.map +1 -0
- package/lib/templates/content-types-registry.d.ts +10 -0
- package/lib/templates/content-types-registry.d.ts.map +1 -0
- package/lib/templates/content-types-registry.js +87 -0
- package/lib/templates/content-types-registry.js.map +1 -0
- package/lib/templates/content-types.d.ts +10 -0
- package/lib/templates/content-types.d.ts.map +1 -0
- package/lib/templates/content-types.js +384 -0
- package/lib/templates/content-types.js.map +1 -0
- package/lib/templates/dashboard-stats.d.ts +13 -0
- package/lib/templates/dashboard-stats.d.ts.map +1 -0
- package/lib/templates/dashboard-stats.js +117 -0
- package/lib/templates/dashboard-stats.js.map +1 -0
- package/lib/templates/editor/index.d.ts +6 -0
- package/lib/templates/editor/index.d.ts.map +1 -0
- package/lib/templates/editor/index.js +21 -0
- package/lib/templates/editor/index.js.map +1 -0
- package/lib/templates/editor/rich-text-editor.d.ts +7 -0
- package/lib/templates/editor/rich-text-editor.d.ts.map +1 -0
- package/lib/templates/editor/rich-text-editor.js +115 -0
- package/lib/templates/editor/rich-text-editor.js.map +1 -0
- package/lib/templates/editor/toolbar.d.ts +7 -0
- package/lib/templates/editor/toolbar.d.ts.map +1 -0
- package/lib/templates/editor/toolbar.js +272 -0
- package/lib/templates/editor/toolbar.js.map +1 -0
- package/lib/templates/form-fields/boolean-field.d.ts +7 -0
- package/lib/templates/form-fields/boolean-field.d.ts.map +1 -0
- package/lib/templates/form-fields/boolean-field.js +76 -0
- package/lib/templates/form-fields/boolean-field.js.map +1 -0
- package/lib/templates/form-fields/date-field.d.ts +7 -0
- package/lib/templates/form-fields/date-field.d.ts.map +1 -0
- package/lib/templates/form-fields/date-field.js +61 -0
- package/lib/templates/form-fields/date-field.js.map +1 -0
- package/lib/templates/form-fields/datetime-field.d.ts +7 -0
- package/lib/templates/form-fields/datetime-field.d.ts.map +1 -0
- package/lib/templates/form-fields/datetime-field.js +87 -0
- package/lib/templates/form-fields/datetime-field.js.map +1 -0
- package/lib/templates/form-fields/index.d.ts +23 -0
- package/lib/templates/form-fields/index.d.ts.map +1 -0
- package/lib/templates/form-fields/index.js +275 -0
- package/lib/templates/form-fields/index.js.map +1 -0
- package/lib/templates/form-fields/media-field.d.ts +10 -0
- package/lib/templates/form-fields/media-field.d.ts.map +1 -0
- package/lib/templates/form-fields/media-field.js +225 -0
- package/lib/templates/form-fields/media-field.js.map +1 -0
- package/lib/templates/form-fields/multiselect-field.d.ts +7 -0
- package/lib/templates/form-fields/multiselect-field.d.ts.map +1 -0
- package/lib/templates/form-fields/multiselect-field.js +121 -0
- package/lib/templates/form-fields/multiselect-field.js.map +1 -0
- package/lib/templates/form-fields/number-field.d.ts +7 -0
- package/lib/templates/form-fields/number-field.d.ts.map +1 -0
- package/lib/templates/form-fields/number-field.js +87 -0
- package/lib/templates/form-fields/number-field.js.map +1 -0
- package/lib/templates/form-fields/reference-field.d.ts +9 -0
- package/lib/templates/form-fields/reference-field.d.ts.map +1 -0
- package/lib/templates/form-fields/reference-field.js +145 -0
- package/lib/templates/form-fields/reference-field.js.map +1 -0
- package/lib/templates/form-fields/richtext-field.d.ts +9 -0
- package/lib/templates/form-fields/richtext-field.d.ts.map +1 -0
- package/lib/templates/form-fields/richtext-field.js +60 -0
- package/lib/templates/form-fields/richtext-field.js.map +1 -0
- package/lib/templates/form-fields/select-field.d.ts +7 -0
- package/lib/templates/form-fields/select-field.d.ts.map +1 -0
- package/lib/templates/form-fields/select-field.js +70 -0
- package/lib/templates/form-fields/select-field.js.map +1 -0
- package/lib/templates/form-fields/slug-field.d.ts +7 -0
- package/lib/templates/form-fields/slug-field.d.ts.map +1 -0
- package/lib/templates/form-fields/slug-field.js +143 -0
- package/lib/templates/form-fields/slug-field.js.map +1 -0
- package/lib/templates/form-fields/tags-field.d.ts +7 -0
- package/lib/templates/form-fields/tags-field.d.ts.map +1 -0
- package/lib/templates/form-fields/tags-field.js +172 -0
- package/lib/templates/form-fields/tags-field.js.map +1 -0
- package/lib/templates/form-fields/text-field.d.ts +7 -0
- package/lib/templates/form-fields/text-field.d.ts.map +1 -0
- package/lib/templates/form-fields/text-field.js +63 -0
- package/lib/templates/form-fields/text-field.js.map +1 -0
- package/lib/templates/form-fields/textarea-field.d.ts +7 -0
- package/lib/templates/form-fields/textarea-field.d.ts.map +1 -0
- package/lib/templates/form-fields/textarea-field.js +64 -0
- package/lib/templates/form-fields/textarea-field.js.map +1 -0
- package/lib/templates/index.d.ts +34 -0
- package/lib/templates/index.d.ts.map +1 -0
- package/lib/templates/index.js +92 -0
- package/lib/templates/index.js.map +1 -0
- package/lib/templates/media/index.d.ts +12 -0
- package/lib/templates/media/index.d.ts.map +1 -0
- package/lib/templates/media/index.js +50 -0
- package/lib/templates/media/index.js.map +1 -0
- package/lib/templates/media/media-api.d.ts +13 -0
- package/lib/templates/media/media-api.d.ts.map +1 -0
- package/lib/templates/media/media-api.js +274 -0
- package/lib/templates/media/media-api.js.map +1 -0
- package/lib/templates/media/media-grid.d.ts +14 -0
- package/lib/templates/media/media-grid.d.ts.map +1 -0
- package/lib/templates/media/media-grid.js +314 -0
- package/lib/templates/media/media-grid.js.map +1 -0
- package/lib/templates/media/media-library-route.d.ts +13 -0
- package/lib/templates/media/media-library-route.d.ts.map +1 -0
- package/lib/templates/media/media-library-route.js +105 -0
- package/lib/templates/media/media-library-route.js.map +1 -0
- package/lib/templates/media/media-picker.d.ts +13 -0
- package/lib/templates/media/media-picker.d.ts.map +1 -0
- package/lib/templates/media/media-picker.js +152 -0
- package/lib/templates/media/media-picker.js.map +1 -0
- package/lib/templates/media/media-uploader.d.ts +14 -0
- package/lib/templates/media/media-uploader.d.ts.map +1 -0
- package/lib/templates/media/media-uploader.js +318 -0
- package/lib/templates/media/media-uploader.js.map +1 -0
- package/lib/templates/recent-content.d.ts +13 -0
- package/lib/templates/recent-content.d.ts.map +1 -0
- package/lib/templates/recent-content.js +138 -0
- package/lib/templates/recent-content.js.map +1 -0
- package/lib/templates/slug-utils.d.ts +10 -0
- package/lib/templates/slug-utils.d.ts.map +1 -0
- package/lib/templates/slug-utils.js +194 -0
- package/lib/templates/slug-utils.js.map +1 -0
- package/lib/templates/ui-avatar.d.ts +8 -0
- package/lib/templates/ui-avatar.d.ts.map +1 -0
- package/lib/templates/ui-avatar.js +60 -0
- package/lib/templates/ui-avatar.js.map +1 -0
- package/lib/templates/ui-badge.d.ts +8 -0
- package/lib/templates/ui-badge.d.ts.map +1 -0
- package/lib/templates/ui-badge.js +52 -0
- package/lib/templates/ui-badge.js.map +1 -0
- package/lib/templates/ui-dialog.d.ts +10 -0
- package/lib/templates/ui-dialog.d.ts.map +1 -0
- package/lib/templates/ui-dialog.js +134 -0
- package/lib/templates/ui-dialog.js.map +1 -0
- package/lib/templates/ui-dropdown-menu.d.ts +8 -0
- package/lib/templates/ui-dropdown-menu.d.ts.map +1 -0
- package/lib/templates/ui-dropdown-menu.js +210 -0
- package/lib/templates/ui-dropdown-menu.js.map +1 -0
- package/lib/templates/ui-popover.d.ts +8 -0
- package/lib/templates/ui-popover.d.ts.map +1 -0
- package/lib/templates/ui-popover.js +43 -0
- package/lib/templates/ui-popover.js.map +1 -0
- package/lib/templates/ui-progress.d.ts +10 -0
- package/lib/templates/ui-progress.d.ts.map +1 -0
- package/lib/templates/ui-progress.js +40 -0
- package/lib/templates/ui-progress.js.map +1 -0
- package/lib/templates/ui-table.d.ts +8 -0
- package/lib/templates/ui-table.d.ts.map +1 -0
- package/lib/templates/ui-table.js +129 -0
- package/lib/templates/ui-table.js.map +1 -0
- package/lib/templates/ui-tabs.d.ts +10 -0
- package/lib/templates/ui-tabs.d.ts.map +1 -0
- package/lib/templates/ui-tabs.js +67 -0
- package/lib/templates/ui-tabs.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* Form field template exports and DynamicField renderer.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
6
|
+
exports.getReferenceFieldTemplate =
|
|
7
|
+
exports.getTagsFieldTemplate =
|
|
8
|
+
exports.getNumberFieldTemplate =
|
|
9
|
+
exports.getBooleanFieldTemplate =
|
|
10
|
+
exports.getDatetimeFieldTemplate =
|
|
11
|
+
exports.getDateFieldTemplate =
|
|
12
|
+
exports.getMultiselectFieldTemplate =
|
|
13
|
+
exports.getSelectFieldTemplate =
|
|
14
|
+
exports.getMediaFieldTemplate =
|
|
15
|
+
exports.getSlugFieldTemplate =
|
|
16
|
+
exports.getRichtextFieldTemplate =
|
|
17
|
+
exports.getTextareaFieldTemplate =
|
|
18
|
+
exports.getTextFieldTemplate =
|
|
19
|
+
void 0;
|
|
20
|
+
exports.getFormFieldsIndexTemplate = getFormFieldsIndexTemplate;
|
|
21
|
+
var text_field_1 = require('./text-field');
|
|
22
|
+
Object.defineProperty(exports, 'getTextFieldTemplate', {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function () {
|
|
25
|
+
return text_field_1.getTextFieldTemplate;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
var textarea_field_1 = require('./textarea-field');
|
|
29
|
+
Object.defineProperty(exports, 'getTextareaFieldTemplate', {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function () {
|
|
32
|
+
return textarea_field_1.getTextareaFieldTemplate;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
var richtext_field_1 = require('./richtext-field');
|
|
36
|
+
Object.defineProperty(exports, 'getRichtextFieldTemplate', {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return richtext_field_1.getRichtextFieldTemplate;
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
var slug_field_1 = require('./slug-field');
|
|
43
|
+
Object.defineProperty(exports, 'getSlugFieldTemplate', {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return slug_field_1.getSlugFieldTemplate;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
var media_field_1 = require('./media-field');
|
|
50
|
+
Object.defineProperty(exports, 'getMediaFieldTemplate', {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function () {
|
|
53
|
+
return media_field_1.getMediaFieldTemplate;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
var select_field_1 = require('./select-field');
|
|
57
|
+
Object.defineProperty(exports, 'getSelectFieldTemplate', {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get: function () {
|
|
60
|
+
return select_field_1.getSelectFieldTemplate;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
var multiselect_field_1 = require('./multiselect-field');
|
|
64
|
+
Object.defineProperty(exports, 'getMultiselectFieldTemplate', {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
get: function () {
|
|
67
|
+
return multiselect_field_1.getMultiselectFieldTemplate;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
var date_field_1 = require('./date-field');
|
|
71
|
+
Object.defineProperty(exports, 'getDateFieldTemplate', {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
get: function () {
|
|
74
|
+
return date_field_1.getDateFieldTemplate;
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
var datetime_field_1 = require('./datetime-field');
|
|
78
|
+
Object.defineProperty(exports, 'getDatetimeFieldTemplate', {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function () {
|
|
81
|
+
return datetime_field_1.getDatetimeFieldTemplate;
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
var boolean_field_1 = require('./boolean-field');
|
|
85
|
+
Object.defineProperty(exports, 'getBooleanFieldTemplate', {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
get: function () {
|
|
88
|
+
return boolean_field_1.getBooleanFieldTemplate;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
var number_field_1 = require('./number-field');
|
|
92
|
+
Object.defineProperty(exports, 'getNumberFieldTemplate', {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
get: function () {
|
|
95
|
+
return number_field_1.getNumberFieldTemplate;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
var tags_field_1 = require('./tags-field');
|
|
99
|
+
Object.defineProperty(exports, 'getTagsFieldTemplate', {
|
|
100
|
+
enumerable: true,
|
|
101
|
+
get: function () {
|
|
102
|
+
return tags_field_1.getTagsFieldTemplate;
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
var reference_field_1 = require('./reference-field');
|
|
106
|
+
Object.defineProperty(exports, 'getReferenceFieldTemplate', {
|
|
107
|
+
enumerable: true,
|
|
108
|
+
get: function () {
|
|
109
|
+
return reference_field_1.getReferenceFieldTemplate;
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* Generates the form fields index with DynamicField component.
|
|
114
|
+
*
|
|
115
|
+
* @returns Template string for app/components/form-fields/index.ts
|
|
116
|
+
*/
|
|
117
|
+
function getFormFieldsIndexTemplate() {
|
|
118
|
+
return `/**
|
|
119
|
+
* Form Field Components
|
|
120
|
+
*
|
|
121
|
+
* This module exports all form field components and provides
|
|
122
|
+
* the DynamicField component for rendering fields based on type.
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
export { TextField } from './text-field';
|
|
126
|
+
export { TextareaField } from './textarea-field';
|
|
127
|
+
export { RichtextField } from './richtext-field';
|
|
128
|
+
export { SlugField } from './slug-field';
|
|
129
|
+
export { MediaField } from './media-field';
|
|
130
|
+
export { SelectField } from './select-field';
|
|
131
|
+
export { MultiselectField } from './multiselect-field';
|
|
132
|
+
export { DateField } from './date-field';
|
|
133
|
+
export { DatetimeField } from './datetime-field';
|
|
134
|
+
export { BooleanField } from './boolean-field';
|
|
135
|
+
export { NumberField } from './number-field';
|
|
136
|
+
export { TagsField } from './tags-field';
|
|
137
|
+
export { ReferenceField } from './reference-field';
|
|
138
|
+
|
|
139
|
+
import type { FieldDefinition } from '~/lib/content-types';
|
|
140
|
+
import { TextField } from './text-field';
|
|
141
|
+
import { TextareaField } from './textarea-field';
|
|
142
|
+
import { RichtextField } from './richtext-field';
|
|
143
|
+
import { SlugField } from './slug-field';
|
|
144
|
+
import { MediaField } from './media-field';
|
|
145
|
+
import { SelectField } from './select-field';
|
|
146
|
+
import { MultiselectField } from './multiselect-field';
|
|
147
|
+
import { DateField } from './date-field';
|
|
148
|
+
import { DatetimeField } from './datetime-field';
|
|
149
|
+
import { BooleanField } from './boolean-field';
|
|
150
|
+
import { NumberField } from './number-field';
|
|
151
|
+
import { TagsField } from './tags-field';
|
|
152
|
+
import { ReferenceField } from './reference-field';
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Props for field components.
|
|
156
|
+
*/
|
|
157
|
+
export interface FieldProps<T extends FieldDefinition = FieldDefinition> {
|
|
158
|
+
/** Field definition */
|
|
159
|
+
field: T;
|
|
160
|
+
/** Current field value */
|
|
161
|
+
value: unknown;
|
|
162
|
+
/** Value change handler */
|
|
163
|
+
onChange: (value: unknown) => void;
|
|
164
|
+
/** Error message */
|
|
165
|
+
error?: string;
|
|
166
|
+
/** Whether the field is disabled */
|
|
167
|
+
disabled?: boolean;
|
|
168
|
+
/** Additional form data (for slug sourceField) */
|
|
169
|
+
formData?: Record<string, unknown>;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Props for DynamicField component.
|
|
174
|
+
*/
|
|
175
|
+
export interface DynamicFieldProps {
|
|
176
|
+
/** Field definition */
|
|
177
|
+
field: FieldDefinition;
|
|
178
|
+
/** Current field value */
|
|
179
|
+
value: unknown;
|
|
180
|
+
/** Value change handler */
|
|
181
|
+
onChange: (value: unknown) => void;
|
|
182
|
+
/** Error message */
|
|
183
|
+
error?: string;
|
|
184
|
+
/** Whether the field is disabled */
|
|
185
|
+
disabled?: boolean;
|
|
186
|
+
/** Additional form data (for slug sourceField) */
|
|
187
|
+
formData?: Record<string, unknown>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Renders a form field based on its type definition.
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* \`\`\`tsx
|
|
195
|
+
* <DynamicField
|
|
196
|
+
* field={{ type: 'text', name: 'title', label: 'Title', required: true }}
|
|
197
|
+
* value={title}
|
|
198
|
+
* onChange={setTitle}
|
|
199
|
+
* error={errors?.title}
|
|
200
|
+
* />
|
|
201
|
+
* \`\`\`
|
|
202
|
+
*/
|
|
203
|
+
export function DynamicField({
|
|
204
|
+
field,
|
|
205
|
+
value,
|
|
206
|
+
onChange,
|
|
207
|
+
error,
|
|
208
|
+
disabled,
|
|
209
|
+
formData,
|
|
210
|
+
}: DynamicFieldProps) {
|
|
211
|
+
// Skip hidden fields
|
|
212
|
+
if (field.hidden) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const commonProps = {
|
|
217
|
+
field,
|
|
218
|
+
value,
|
|
219
|
+
onChange,
|
|
220
|
+
error,
|
|
221
|
+
disabled,
|
|
222
|
+
formData,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
switch (field.type) {
|
|
226
|
+
case 'text':
|
|
227
|
+
return <TextField {...commonProps} field={field} />;
|
|
228
|
+
|
|
229
|
+
case 'textarea':
|
|
230
|
+
return <TextareaField {...commonProps} field={field} />;
|
|
231
|
+
|
|
232
|
+
case 'richtext':
|
|
233
|
+
return <RichtextField {...commonProps} field={field} />;
|
|
234
|
+
|
|
235
|
+
case 'slug':
|
|
236
|
+
return <SlugField {...commonProps} field={field} />;
|
|
237
|
+
|
|
238
|
+
case 'media':
|
|
239
|
+
return <MediaField {...commonProps} field={field} />;
|
|
240
|
+
|
|
241
|
+
case 'select':
|
|
242
|
+
return <SelectField {...commonProps} field={field} />;
|
|
243
|
+
|
|
244
|
+
case 'multiselect':
|
|
245
|
+
return <MultiselectField {...commonProps} field={field} />;
|
|
246
|
+
|
|
247
|
+
case 'date':
|
|
248
|
+
return <DateField {...commonProps} field={field} />;
|
|
249
|
+
|
|
250
|
+
case 'datetime':
|
|
251
|
+
return <DatetimeField {...commonProps} field={field} />;
|
|
252
|
+
|
|
253
|
+
case 'boolean':
|
|
254
|
+
return <BooleanField {...commonProps} field={field} />;
|
|
255
|
+
|
|
256
|
+
case 'number':
|
|
257
|
+
return <NumberField {...commonProps} field={field} />;
|
|
258
|
+
|
|
259
|
+
case 'tags':
|
|
260
|
+
return <TagsField {...commonProps} field={field} />;
|
|
261
|
+
|
|
262
|
+
case 'reference':
|
|
263
|
+
return <ReferenceField {...commonProps} field={field} />;
|
|
264
|
+
|
|
265
|
+
default:
|
|
266
|
+
return (
|
|
267
|
+
<div className="text-sm text-muted-foreground">
|
|
268
|
+
Unknown field type: {(field as FieldDefinition).type}
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
`;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/form-fields/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAqBH,gEA6JC;AAhLD,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAC7B,mDAA4D;AAAnD,0HAAA,wBAAwB,OAAA;AACjC,mDAA4D;AAAnD,0HAAA,wBAAwB,OAAA;AACjC,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAC7B,6CAAsD;AAA7C,oHAAA,qBAAqB,OAAA;AAC9B,+CAAwD;AAA/C,sHAAA,sBAAsB,OAAA;AAC/B,yDAAkE;AAAzD,gIAAA,2BAA2B,OAAA;AACpC,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAC7B,mDAA4D;AAAnD,0HAAA,wBAAwB,OAAA;AACjC,iDAA0D;AAAjD,wHAAA,uBAAuB,OAAA;AAChC,+CAAwD;AAA/C,sHAAA,sBAAsB,OAAA;AAC/B,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAC7B,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;AAElC;;;;GAIG;AACH,SAAgB,0BAA0B;IACxC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2JR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates the media field component template.
|
|
3
|
+
*
|
|
4
|
+
* This component integrates with the media picker dialog to allow
|
|
5
|
+
* selecting media from the library or uploading new files.
|
|
6
|
+
*
|
|
7
|
+
* @returns Template string for app/components/form-fields/media-field.tsx
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMediaFieldTemplate(): string;
|
|
10
|
+
//# sourceMappingURL=media-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-field.d.ts","sourceRoot":"","sources":["../../../src/templates/form-fields/media-field.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAoN9C"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
|
+
exports.getMediaFieldTemplate = getMediaFieldTemplate;
|
|
4
|
+
/**
|
|
5
|
+
* Generates the media field component template.
|
|
6
|
+
*
|
|
7
|
+
* This component integrates with the media picker dialog to allow
|
|
8
|
+
* selecting media from the library or uploading new files.
|
|
9
|
+
*
|
|
10
|
+
* @returns Template string for app/components/form-fields/media-field.tsx
|
|
11
|
+
*/
|
|
12
|
+
function getMediaFieldTemplate() {
|
|
13
|
+
return `import { useState } from 'react';
|
|
14
|
+
import { Upload, X, Image as ImageIcon, FileVideo, FileAudio, File } from 'lucide-react';
|
|
15
|
+
import type { MediaFieldDefinition } from '~/lib/content-types';
|
|
16
|
+
import { Label } from '~/components/ui/label';
|
|
17
|
+
import { Button } from '~/components/ui/button';
|
|
18
|
+
import { cn } from '~/lib/utils';
|
|
19
|
+
import type { FieldProps } from './index';
|
|
20
|
+
import { MediaPicker } from '~/components/media/media-picker';
|
|
21
|
+
import { getMediaType, formatFileSize, type MediaItem } from '~/lib/media-api';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get icon for file type.
|
|
25
|
+
*/
|
|
26
|
+
function getMediaIcon(mimeType: string) {
|
|
27
|
+
const type = getMediaType(mimeType);
|
|
28
|
+
switch (type) {
|
|
29
|
+
case 'image':
|
|
30
|
+
return <ImageIcon className="h-6 w-6 text-muted-foreground" />;
|
|
31
|
+
case 'video':
|
|
32
|
+
return <FileVideo className="h-6 w-6 text-muted-foreground" />;
|
|
33
|
+
case 'audio':
|
|
34
|
+
return <FileAudio className="h-6 w-6 text-muted-foreground" />;
|
|
35
|
+
default:
|
|
36
|
+
return <File className="h-6 w-6 text-muted-foreground" />;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check if URL is an image.
|
|
42
|
+
*/
|
|
43
|
+
function isImage(url: string): boolean {
|
|
44
|
+
const ext = url.split('.').pop()?.toLowerCase();
|
|
45
|
+
return ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(ext || '');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Media upload field with media picker integration.
|
|
50
|
+
*/
|
|
51
|
+
export function MediaField({
|
|
52
|
+
field,
|
|
53
|
+
value,
|
|
54
|
+
onChange,
|
|
55
|
+
error,
|
|
56
|
+
disabled,
|
|
57
|
+
}: FieldProps<MediaFieldDefinition>) {
|
|
58
|
+
const [pickerOpen, setPickerOpen] = useState(false);
|
|
59
|
+
const id = \`field-\${field.name}\`;
|
|
60
|
+
const currentValue = field.multiple
|
|
61
|
+
? (Array.isArray(value) ? value : [])
|
|
62
|
+
: (value as string | undefined);
|
|
63
|
+
|
|
64
|
+
const handleClear = () => {
|
|
65
|
+
onChange(field.multiple ? [] : '');
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const handleRemove = (index: number) => {
|
|
69
|
+
if (field.multiple && Array.isArray(currentValue)) {
|
|
70
|
+
const newValue = [...currentValue];
|
|
71
|
+
newValue.splice(index, 1);
|
|
72
|
+
onChange(newValue);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const handleSelect = (media: MediaItem | MediaItem[]) => {
|
|
77
|
+
if (field.multiple) {
|
|
78
|
+
const mediaArray = Array.isArray(media) ? media : [media];
|
|
79
|
+
const urls = mediaArray.map((m) => m.url);
|
|
80
|
+
onChange([...(currentValue as string[]), ...urls]);
|
|
81
|
+
} else {
|
|
82
|
+
const singleMedia = Array.isArray(media) ? media[0] : media;
|
|
83
|
+
onChange(singleMedia.url);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div className="space-y-2">
|
|
89
|
+
<Label className={cn(field.required && "after:content-['*'] after:ml-0.5 after:text-destructive")}>
|
|
90
|
+
{field.label}
|
|
91
|
+
</Label>
|
|
92
|
+
<div
|
|
93
|
+
className={cn(
|
|
94
|
+
'border-2 border-dashed rounded-lg p-6 text-center',
|
|
95
|
+
error ? 'border-destructive' : 'border-muted-foreground/25',
|
|
96
|
+
disabled && 'opacity-50 cursor-not-allowed'
|
|
97
|
+
)}
|
|
98
|
+
>
|
|
99
|
+
{currentValue && (typeof currentValue === 'string' ? currentValue : currentValue.length > 0) ? (
|
|
100
|
+
<div className="space-y-4">
|
|
101
|
+
{field.multiple ? (
|
|
102
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
|
103
|
+
{(currentValue as string[]).map((url, index) => (
|
|
104
|
+
<div key={index} className="relative aspect-square bg-muted rounded-md overflow-hidden">
|
|
105
|
+
{isImage(url) ? (
|
|
106
|
+
<img src={url} alt="" className="w-full h-full object-cover" />
|
|
107
|
+
) : (
|
|
108
|
+
<div className="w-full h-full flex items-center justify-center">
|
|
109
|
+
{getMediaIcon(url)}
|
|
110
|
+
</div>
|
|
111
|
+
)}
|
|
112
|
+
<Button
|
|
113
|
+
type="button"
|
|
114
|
+
variant="destructive"
|
|
115
|
+
size="icon"
|
|
116
|
+
className="absolute top-1 right-1 h-6 w-6"
|
|
117
|
+
onClick={() => handleRemove(index)}
|
|
118
|
+
disabled={disabled}
|
|
119
|
+
>
|
|
120
|
+
<X className="h-3 w-3" />
|
|
121
|
+
</Button>
|
|
122
|
+
</div>
|
|
123
|
+
))}
|
|
124
|
+
{/* Add more button */}
|
|
125
|
+
<button
|
|
126
|
+
type="button"
|
|
127
|
+
onClick={() => !disabled && setPickerOpen(true)}
|
|
128
|
+
disabled={disabled}
|
|
129
|
+
className="aspect-square rounded-md border-2 border-dashed border-muted-foreground/25 flex items-center justify-center hover:border-primary/50 hover:bg-muted/50 transition-colors"
|
|
130
|
+
>
|
|
131
|
+
<Upload className="h-6 w-6 text-muted-foreground" />
|
|
132
|
+
</button>
|
|
133
|
+
</div>
|
|
134
|
+
) : (
|
|
135
|
+
<div className="relative inline-block">
|
|
136
|
+
{isImage(currentValue as string) ? (
|
|
137
|
+
<img
|
|
138
|
+
src={currentValue as string}
|
|
139
|
+
alt=""
|
|
140
|
+
className="max-h-48 rounded-md"
|
|
141
|
+
/>
|
|
142
|
+
) : (
|
|
143
|
+
<div className="h-24 w-24 rounded-md bg-muted flex items-center justify-center">
|
|
144
|
+
{getMediaIcon(currentValue as string)}
|
|
145
|
+
</div>
|
|
146
|
+
)}
|
|
147
|
+
<Button
|
|
148
|
+
type="button"
|
|
149
|
+
variant="destructive"
|
|
150
|
+
size="icon"
|
|
151
|
+
className="absolute -top-2 -right-2 h-6 w-6"
|
|
152
|
+
onClick={handleClear}
|
|
153
|
+
disabled={disabled}
|
|
154
|
+
>
|
|
155
|
+
<X className="h-3 w-3" />
|
|
156
|
+
</Button>
|
|
157
|
+
</div>
|
|
158
|
+
)}
|
|
159
|
+
{!field.multiple && (
|
|
160
|
+
<Button
|
|
161
|
+
type="button"
|
|
162
|
+
variant="outline"
|
|
163
|
+
size="sm"
|
|
164
|
+
onClick={() => setPickerOpen(true)}
|
|
165
|
+
disabled={disabled}
|
|
166
|
+
>
|
|
167
|
+
Change
|
|
168
|
+
</Button>
|
|
169
|
+
)}
|
|
170
|
+
</div>
|
|
171
|
+
) : (
|
|
172
|
+
<div className="space-y-2">
|
|
173
|
+
<div className="mx-auto w-12 h-12 rounded-full bg-muted flex items-center justify-center">
|
|
174
|
+
<ImageIcon className="h-6 w-6 text-muted-foreground" />
|
|
175
|
+
</div>
|
|
176
|
+
<div>
|
|
177
|
+
<p className="text-sm font-medium">Select Media</p>
|
|
178
|
+
<p className="text-xs text-muted-foreground">
|
|
179
|
+
{field.multiple ? 'Choose files from the media library' : 'Choose a file from the media library'}
|
|
180
|
+
</p>
|
|
181
|
+
</div>
|
|
182
|
+
<Button
|
|
183
|
+
type="button"
|
|
184
|
+
variant="outline"
|
|
185
|
+
size="sm"
|
|
186
|
+
onClick={() => setPickerOpen(true)}
|
|
187
|
+
disabled={disabled}
|
|
188
|
+
>
|
|
189
|
+
<Upload className="h-4 w-4 mr-2" />
|
|
190
|
+
Choose File{field.multiple ? 's' : ''}
|
|
191
|
+
</Button>
|
|
192
|
+
</div>
|
|
193
|
+
)}
|
|
194
|
+
</div>
|
|
195
|
+
{field.description && !error && (
|
|
196
|
+
<p id={\`\${id}-description\`} className="text-sm text-muted-foreground">
|
|
197
|
+
{field.description}
|
|
198
|
+
</p>
|
|
199
|
+
)}
|
|
200
|
+
{field.accept && !error && (
|
|
201
|
+
<p className="text-sm text-muted-foreground">
|
|
202
|
+
Accepted: {field.accept.join(', ')}
|
|
203
|
+
{field.maxSize && \` (max \${Math.round(field.maxSize / 1024 / 1024)}MB)\`}
|
|
204
|
+
</p>
|
|
205
|
+
)}
|
|
206
|
+
{error && (
|
|
207
|
+
<p id={\`\${id}-error\`} className="text-sm text-destructive">
|
|
208
|
+
{error}
|
|
209
|
+
</p>
|
|
210
|
+
)}
|
|
211
|
+
|
|
212
|
+
{/* Media Picker Dialog */}
|
|
213
|
+
<MediaPicker
|
|
214
|
+
open={pickerOpen}
|
|
215
|
+
onOpenChange={setPickerOpen}
|
|
216
|
+
onSelect={handleSelect}
|
|
217
|
+
multiple={field.multiple}
|
|
218
|
+
accept={field.accept}
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=media-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-field.js","sourceRoot":"","sources":["../../../src/templates/form-fields/media-field.ts"],"names":[],"mappings":";;AAQA,sDAoNC;AA5ND;;;;;;;GAOG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkNR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiselect-field.d.ts","sourceRoot":"","sources":["../../../src/templates/form-fields/multiselect-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CA+GpD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
|
+
exports.getMultiselectFieldTemplate = getMultiselectFieldTemplate;
|
|
4
|
+
/**
|
|
5
|
+
* Generates the multi-select field component template.
|
|
6
|
+
*
|
|
7
|
+
* @returns Template string for app/components/form-fields/multiselect-field.tsx
|
|
8
|
+
*/
|
|
9
|
+
function getMultiselectFieldTemplate() {
|
|
10
|
+
return `import { Check } from 'lucide-react';
|
|
11
|
+
import type { MultiselectFieldDefinition } from '~/lib/content-types';
|
|
12
|
+
import { Label } from '~/components/ui/label';
|
|
13
|
+
import { cn } from '~/lib/utils';
|
|
14
|
+
import type { FieldProps } from './index';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Multi-select field with checkboxes.
|
|
18
|
+
*/
|
|
19
|
+
export function MultiselectField({
|
|
20
|
+
field,
|
|
21
|
+
value,
|
|
22
|
+
onChange,
|
|
23
|
+
error,
|
|
24
|
+
disabled,
|
|
25
|
+
}: FieldProps<MultiselectFieldDefinition>) {
|
|
26
|
+
const id = \`field-\${field.name}\`;
|
|
27
|
+
const selectedValues = Array.isArray(value) ? value : [];
|
|
28
|
+
|
|
29
|
+
const toggleOption = (optionValue: string) => {
|
|
30
|
+
if (disabled) return;
|
|
31
|
+
|
|
32
|
+
const newValues = selectedValues.includes(optionValue)
|
|
33
|
+
? selectedValues.filter((v) => v !== optionValue)
|
|
34
|
+
: [...selectedValues, optionValue];
|
|
35
|
+
|
|
36
|
+
// Enforce max limit
|
|
37
|
+
if (field.max !== undefined && newValues.length > field.max) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
onChange(newValues);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<div className="space-y-2">
|
|
46
|
+
<Label className={cn(field.required && "after:content-['*'] after:ml-0.5 after:text-destructive")}>
|
|
47
|
+
{field.label}
|
|
48
|
+
</Label>
|
|
49
|
+
<div
|
|
50
|
+
className={cn(
|
|
51
|
+
'border rounded-md p-3 space-y-2',
|
|
52
|
+
error && 'border-destructive'
|
|
53
|
+
)}
|
|
54
|
+
role="group"
|
|
55
|
+
aria-labelledby={\`\${id}-label\`}
|
|
56
|
+
aria-describedby={error ? \`\${id}-error\` : field.description ? \`\${id}-description\` : undefined}
|
|
57
|
+
>
|
|
58
|
+
{field.options.map((option) => {
|
|
59
|
+
const isSelected = selectedValues.includes(option.value);
|
|
60
|
+
const optionId = \`\${id}-\${option.value}\`;
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<label
|
|
64
|
+
key={option.value}
|
|
65
|
+
htmlFor={optionId}
|
|
66
|
+
className={cn(
|
|
67
|
+
'flex items-center gap-3 p-2 rounded-md cursor-pointer hover:bg-accent',
|
|
68
|
+
disabled && 'cursor-not-allowed opacity-50'
|
|
69
|
+
)}
|
|
70
|
+
>
|
|
71
|
+
<div
|
|
72
|
+
className={cn(
|
|
73
|
+
'h-5 w-5 rounded border flex items-center justify-center',
|
|
74
|
+
isSelected
|
|
75
|
+
? 'bg-primary border-primary text-primary-foreground'
|
|
76
|
+
: 'border-input'
|
|
77
|
+
)}
|
|
78
|
+
>
|
|
79
|
+
{isSelected && <Check className="h-3 w-3" />}
|
|
80
|
+
</div>
|
|
81
|
+
<input
|
|
82
|
+
type="checkbox"
|
|
83
|
+
id={optionId}
|
|
84
|
+
name={\`\${field.name}[]\`}
|
|
85
|
+
value={option.value}
|
|
86
|
+
checked={isSelected}
|
|
87
|
+
onChange={() => toggleOption(option.value)}
|
|
88
|
+
disabled={disabled}
|
|
89
|
+
className="sr-only"
|
|
90
|
+
/>
|
|
91
|
+
<span className="text-sm">{option.label}</span>
|
|
92
|
+
</label>
|
|
93
|
+
);
|
|
94
|
+
})}
|
|
95
|
+
</div>
|
|
96
|
+
{(field.min !== undefined || field.max !== undefined) && !error && (
|
|
97
|
+
<p className="text-sm text-muted-foreground">
|
|
98
|
+
{field.min !== undefined && field.max !== undefined
|
|
99
|
+
? \`Select \${field.min} to \${field.max} options\`
|
|
100
|
+
: field.min !== undefined
|
|
101
|
+
? \`Select at least \${field.min} options\`
|
|
102
|
+
: \`Select up to \${field.max} options\`}
|
|
103
|
+
{' '}({selectedValues.length} selected)
|
|
104
|
+
</p>
|
|
105
|
+
)}
|
|
106
|
+
{field.description && !error && !(field.min !== undefined || field.max !== undefined) && (
|
|
107
|
+
<p id={\`\${id}-description\`} className="text-sm text-muted-foreground">
|
|
108
|
+
{field.description}
|
|
109
|
+
</p>
|
|
110
|
+
)}
|
|
111
|
+
{error && (
|
|
112
|
+
<p id={\`\${id}-error\`} className="text-sm text-destructive">
|
|
113
|
+
{error}
|
|
114
|
+
</p>
|
|
115
|
+
)}
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=multiselect-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiselect-field.js","sourceRoot":"","sources":["../../../src/templates/form-fields/multiselect-field.ts"],"names":[],"mappings":";;AAKA,kEA+GC;AApHD;;;;GAIG;AACH,SAAgB,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6GR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number-field.d.ts","sourceRoot":"","sources":["../../../src/templates/form-fields/number-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA6E/C"}
|