@sonicjs-cms/core 2.0.0-beta.3 → 2.0.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/dist/{chunk-4MZPFGLT.cjs → chunk-5FDDDD4J.cjs} +4385 -352
- package/dist/chunk-5FDDDD4J.cjs.map +1 -0
- package/dist/chunk-5XTB4FE5.js +1030 -0
- package/dist/chunk-5XTB4FE5.js.map +1 -0
- package/dist/{chunk-ET5I4GBD.cjs → chunk-ALOS2CBJ.cjs} +194 -4
- package/dist/chunk-ALOS2CBJ.cjs.map +1 -0
- package/dist/{chunk-7N3HK7ZK.js → chunk-CDBVZEWR.js} +7 -904
- package/dist/chunk-CDBVZEWR.js.map +1 -0
- package/dist/chunk-EGFHFM4N.cjs +76 -0
- package/dist/chunk-EGFHFM4N.cjs.map +1 -0
- package/dist/chunk-KM4AJFXI.cjs +101 -0
- package/dist/chunk-KM4AJFXI.cjs.map +1 -0
- package/dist/{chunk-RNR4HA23.cjs → chunk-LEG4KNFP.cjs} +6 -945
- package/dist/chunk-LEG4KNFP.cjs.map +1 -0
- package/dist/{chunk-P3VS4DV3.js → chunk-O46XKBFM.js} +193 -5
- package/dist/chunk-O46XKBFM.js.map +1 -0
- package/dist/chunk-P2PTTBO5.js +74 -0
- package/dist/chunk-P2PTTBO5.js.map +1 -0
- package/dist/{chunk-Q3KCKPHE.js → chunk-QSF34IYQ.js} +4244 -214
- package/dist/chunk-QSF34IYQ.js.map +1 -0
- package/dist/chunk-SRCY43RN.cjs +1076 -0
- package/dist/chunk-SRCY43RN.cjs.map +1 -0
- package/dist/chunk-TY3NHEBN.js +80 -0
- package/dist/chunk-TY3NHEBN.js.map +1 -0
- package/dist/index.cjs +196 -196
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +22 -22
- package/dist/middleware.js +2 -2
- package/dist/routes.cjs +34 -22
- package/dist/routes.js +5 -5
- package/dist/services.cjs +28 -28
- package/dist/services.js +2 -2
- package/dist/templates.cjs +24 -24
- package/dist/templates.js +2 -2
- package/package.json +2 -16
- package/dist/chunk-3MNMOLSA.js +0 -133
- package/dist/chunk-3MNMOLSA.js.map +0 -1
- package/dist/chunk-4MZPFGLT.cjs.map +0 -1
- package/dist/chunk-4XI3YBKU.cjs +0 -266
- package/dist/chunk-4XI3YBKU.cjs.map +0 -1
- package/dist/chunk-7N3HK7ZK.js.map +0 -1
- package/dist/chunk-AGOE25LF.cjs +0 -137
- package/dist/chunk-AGOE25LF.cjs.map +0 -1
- package/dist/chunk-BUKT6HP5.cjs +0 -776
- package/dist/chunk-BUKT6HP5.cjs.map +0 -1
- package/dist/chunk-ET5I4GBD.cjs.map +0 -1
- package/dist/chunk-LU6J53IX.js +0 -262
- package/dist/chunk-LU6J53IX.js.map +0 -1
- package/dist/chunk-P3VS4DV3.js.map +0 -1
- package/dist/chunk-Q3KCKPHE.js.map +0 -1
- package/dist/chunk-RNR4HA23.cjs.map +0 -1
- package/dist/chunk-WESS2U3K.js +0 -755
- package/dist/chunk-WESS2U3K.js.map +0 -1
package/dist/chunk-4XI3YBKU.cjs
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkET5I4GBD_cjs = require('./chunk-ET5I4GBD.cjs');
|
|
4
|
-
|
|
5
|
-
// src/templates/form.template.ts
|
|
6
|
-
function renderForm(data) {
|
|
7
|
-
return `
|
|
8
|
-
<form
|
|
9
|
-
${data.id ? `id="${data.id}"` : ""}
|
|
10
|
-
${data.hxPost ? `hx-post="${data.hxPost}"` : data.hxPut ? `hx-put="${data.hxPut}"` : data.action ? `action="${data.action}"` : ""}
|
|
11
|
-
${data.hxTarget ? `hx-target="${data.hxTarget}"` : ""}
|
|
12
|
-
method="${data.method || "POST"}"
|
|
13
|
-
class="${data.className || "space-y-6"}"
|
|
14
|
-
${data.fields.some((f) => f.type === "file") ? 'enctype="multipart/form-data"' : ""}
|
|
15
|
-
>
|
|
16
|
-
${data.title ? `
|
|
17
|
-
<div class="mb-6">
|
|
18
|
-
<h2 class="text-lg font-medium text-gray-1">${data.title}</h2>
|
|
19
|
-
${data.description ? `<p class="mt-1 text-sm text-gray-4">${data.description}</p>` : ""}
|
|
20
|
-
</div>
|
|
21
|
-
` : ""}
|
|
22
|
-
|
|
23
|
-
<div id="form-messages"></div>
|
|
24
|
-
|
|
25
|
-
${data.fields.map((field) => renderFormField(field)).join("")}
|
|
26
|
-
|
|
27
|
-
<div class="flex justify-between items-center pt-6 border-t border-gray-7">
|
|
28
|
-
<div class="flex space-x-4">
|
|
29
|
-
${data.submitButtons.map((button) => `
|
|
30
|
-
<button
|
|
31
|
-
type="${button.type || "submit"}"
|
|
32
|
-
${button.name ? `name="${button.name}"` : ""}
|
|
33
|
-
${button.value ? `value="${button.value}"` : ""}
|
|
34
|
-
${button.onclick ? `onclick="${button.onclick}"` : ""}
|
|
35
|
-
class="btn ${button.className || "btn-primary"}"
|
|
36
|
-
>
|
|
37
|
-
${button.label}
|
|
38
|
-
</button>
|
|
39
|
-
`).join("")}
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</form>
|
|
43
|
-
`;
|
|
44
|
-
}
|
|
45
|
-
function renderFormField(field) {
|
|
46
|
-
const fieldId = `field-${field.name}`;
|
|
47
|
-
const required = field.required ? "required" : "";
|
|
48
|
-
const readonly = field.readonly ? "readonly" : "";
|
|
49
|
-
const placeholder = field.placeholder ? `placeholder="${field.placeholder}"` : "";
|
|
50
|
-
let fieldHTML = "";
|
|
51
|
-
switch (field.type) {
|
|
52
|
-
case "text":
|
|
53
|
-
case "email":
|
|
54
|
-
case "number":
|
|
55
|
-
case "date":
|
|
56
|
-
fieldHTML = `
|
|
57
|
-
<input
|
|
58
|
-
type="${field.type === "date" ? "datetime-local" : field.type}"
|
|
59
|
-
id="${fieldId}"
|
|
60
|
-
name="${field.name}"
|
|
61
|
-
value="${field.value || ""}"
|
|
62
|
-
class="form-input ${field.className || ""}"
|
|
63
|
-
${placeholder}
|
|
64
|
-
${required}
|
|
65
|
-
${readonly}
|
|
66
|
-
${field.validation?.min !== void 0 ? `min="${field.validation.min}"` : ""}
|
|
67
|
-
${field.validation?.max !== void 0 ? `max="${field.validation.max}"` : ""}
|
|
68
|
-
${field.validation?.pattern ? `pattern="${field.validation.pattern}"` : ""}
|
|
69
|
-
>
|
|
70
|
-
`;
|
|
71
|
-
break;
|
|
72
|
-
case "textarea":
|
|
73
|
-
fieldHTML = `
|
|
74
|
-
<textarea
|
|
75
|
-
id="${fieldId}"
|
|
76
|
-
name="${field.name}"
|
|
77
|
-
class="form-textarea ${field.className || ""}"
|
|
78
|
-
rows="${field.rows || 4}"
|
|
79
|
-
${placeholder}
|
|
80
|
-
${required}
|
|
81
|
-
>${field.value || ""}</textarea>
|
|
82
|
-
`;
|
|
83
|
-
break;
|
|
84
|
-
case "rich_text":
|
|
85
|
-
const uniqueId = `${field.name}-${Date.now()}`;
|
|
86
|
-
fieldHTML = `
|
|
87
|
-
<div class="markdown-field">
|
|
88
|
-
<textarea id="${uniqueId}" name="${field.name}" class="form-textarea" rows="8">${field.value || ""}</textarea>
|
|
89
|
-
<script>
|
|
90
|
-
if (typeof EasyMDE !== 'undefined') {
|
|
91
|
-
new EasyMDE({
|
|
92
|
-
element: document.getElementById('${uniqueId}'),
|
|
93
|
-
minHeight: '300px',
|
|
94
|
-
spellChecker: false,
|
|
95
|
-
status: ['autosave', 'lines', 'words', 'cursor'],
|
|
96
|
-
autosave: {
|
|
97
|
-
enabled: true,
|
|
98
|
-
uniqueId: '${uniqueId}',
|
|
99
|
-
delay: 1000
|
|
100
|
-
},
|
|
101
|
-
renderingConfig: {
|
|
102
|
-
singleLineBreaks: false,
|
|
103
|
-
codeSyntaxHighlighting: true
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
</script>
|
|
108
|
-
</div>
|
|
109
|
-
`;
|
|
110
|
-
break;
|
|
111
|
-
case "select":
|
|
112
|
-
fieldHTML = `
|
|
113
|
-
<select
|
|
114
|
-
id="${fieldId}"
|
|
115
|
-
name="${field.name}"
|
|
116
|
-
class="form-input ${field.className || ""}"
|
|
117
|
-
${required}
|
|
118
|
-
>
|
|
119
|
-
${field.options ? field.options.map((option) => `
|
|
120
|
-
<option value="${option.value}" ${option.selected || field.value === option.value ? "selected" : ""}>
|
|
121
|
-
${option.label}
|
|
122
|
-
</option>
|
|
123
|
-
`).join("") : ""}
|
|
124
|
-
</select>
|
|
125
|
-
`;
|
|
126
|
-
break;
|
|
127
|
-
case "multi_select":
|
|
128
|
-
fieldHTML = `
|
|
129
|
-
<select
|
|
130
|
-
id="${fieldId}"
|
|
131
|
-
name="${field.name}"
|
|
132
|
-
class="form-input ${field.className || ""}"
|
|
133
|
-
multiple
|
|
134
|
-
${required}
|
|
135
|
-
>
|
|
136
|
-
${field.options ? field.options.map((option) => `
|
|
137
|
-
<option value="${option.value}" ${option.selected ? "selected" : ""}>
|
|
138
|
-
${option.label}
|
|
139
|
-
</option>
|
|
140
|
-
`).join("") : ""}
|
|
141
|
-
</select>
|
|
142
|
-
`;
|
|
143
|
-
break;
|
|
144
|
-
case "checkbox":
|
|
145
|
-
fieldHTML = `
|
|
146
|
-
<input
|
|
147
|
-
type="checkbox"
|
|
148
|
-
id="${fieldId}"
|
|
149
|
-
name="${field.name}"
|
|
150
|
-
value="1"
|
|
151
|
-
class="size-4 rounded border border-white/15 bg-white/5 checked:border-transparent checked:bg-white disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-white/20 focus:ring-offset-2 ${field.className || ""}"
|
|
152
|
-
${field.value ? "checked" : ""}
|
|
153
|
-
${required}
|
|
154
|
-
>
|
|
155
|
-
<label for="${fieldId}" class="ml-2 text-sm text-white">${field.label}</label>
|
|
156
|
-
`;
|
|
157
|
-
break;
|
|
158
|
-
default:
|
|
159
|
-
fieldHTML = `
|
|
160
|
-
<input
|
|
161
|
-
type="text"
|
|
162
|
-
id="${fieldId}"
|
|
163
|
-
name="${field.name}"
|
|
164
|
-
value="${field.value || ""}"
|
|
165
|
-
class="form-input ${field.className || ""}"
|
|
166
|
-
${placeholder}
|
|
167
|
-
${required}
|
|
168
|
-
>
|
|
169
|
-
`;
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
if (field.type === "checkbox") {
|
|
173
|
-
return `
|
|
174
|
-
<div class="form-group">
|
|
175
|
-
<div class="flex items-center">
|
|
176
|
-
${fieldHTML}
|
|
177
|
-
</div>
|
|
178
|
-
${field.helpText ? `<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1 ml-6">${field.helpText}</p>` : ""}
|
|
179
|
-
</div>
|
|
180
|
-
`;
|
|
181
|
-
}
|
|
182
|
-
return `
|
|
183
|
-
<div class="form-group">
|
|
184
|
-
<label for="${fieldId}" class="form-label">
|
|
185
|
-
${field.label}${field.required ? " *" : ""}
|
|
186
|
-
</label>
|
|
187
|
-
${fieldHTML}
|
|
188
|
-
${field.helpText ? `<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">${field.helpText}</p>` : ""}
|
|
189
|
-
</div>
|
|
190
|
-
`;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// src/templates/filter-bar.template.ts
|
|
194
|
-
function renderFilterBar(data) {
|
|
195
|
-
return `
|
|
196
|
-
<div class="rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-6 mb-6">
|
|
197
|
-
<form id="filter-form" class="flex flex-wrap gap-4 items-center">
|
|
198
|
-
${data.filters.map((filter) => `
|
|
199
|
-
<div class="flex items-center space-x-2">
|
|
200
|
-
<label class="text-sm font-medium text-zinc-500 dark:text-zinc-400">${filter.label}:</label>
|
|
201
|
-
<select
|
|
202
|
-
name="${filter.name}"
|
|
203
|
-
class="rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 focus:ring-2 focus:ring-blue-600 dark:focus:ring-blue-500 focus:outline-none transition-colors"
|
|
204
|
-
onchange="updateFilters()"
|
|
205
|
-
>
|
|
206
|
-
${filter.options.map((option) => `
|
|
207
|
-
<option value="${option.value}" ${option.selected ? "selected" : ""}>
|
|
208
|
-
${option.label}
|
|
209
|
-
</option>
|
|
210
|
-
`).join("")}
|
|
211
|
-
</select>
|
|
212
|
-
</div>
|
|
213
|
-
`).join("")}
|
|
214
|
-
|
|
215
|
-
${data.actions && data.actions.length > 0 ? `
|
|
216
|
-
<div class="flex items-center space-x-2 ml-auto">
|
|
217
|
-
${data.actions.map((action) => `
|
|
218
|
-
<button
|
|
219
|
-
type="button"
|
|
220
|
-
class="inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors"
|
|
221
|
-
${action.onclick ? `onclick="${action.onclick}"` : ""}
|
|
222
|
-
${action.hxGet ? `hx-get="${action.hxGet}"` : ""}
|
|
223
|
-
${action.hxTarget ? `hx-target="${action.hxTarget}"` : ""}
|
|
224
|
-
>
|
|
225
|
-
${action.label}
|
|
226
|
-
</button>
|
|
227
|
-
`).join("")}
|
|
228
|
-
</div>
|
|
229
|
-
` : ""}
|
|
230
|
-
</form>
|
|
231
|
-
|
|
232
|
-
<script>
|
|
233
|
-
function updateFilters() {
|
|
234
|
-
const form = document.getElementById('filter-form');
|
|
235
|
-
const formData = new FormData(form);
|
|
236
|
-
const params = new URLSearchParams(window.location.search);
|
|
237
|
-
|
|
238
|
-
// Update params with form values
|
|
239
|
-
for (const [key, value] of formData.entries()) {
|
|
240
|
-
if (value) {
|
|
241
|
-
params.set(key, value);
|
|
242
|
-
} else {
|
|
243
|
-
params.delete(key);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Reset to page 1 when filters change
|
|
248
|
-
params.set('page', '1');
|
|
249
|
-
|
|
250
|
-
// Update URL and reload
|
|
251
|
-
window.location.href = window.location.pathname + '?' + params.toString();
|
|
252
|
-
}
|
|
253
|
-
</script>
|
|
254
|
-
</div>
|
|
255
|
-
`;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// src/templates/index.ts
|
|
259
|
-
chunkET5I4GBD_cjs.init_admin_layout_catalyst_template();
|
|
260
|
-
chunkET5I4GBD_cjs.init_logo_template();
|
|
261
|
-
|
|
262
|
-
exports.renderFilterBar = renderFilterBar;
|
|
263
|
-
exports.renderForm = renderForm;
|
|
264
|
-
exports.renderFormField = renderFormField;
|
|
265
|
-
//# sourceMappingURL=chunk-4XI3YBKU.cjs.map
|
|
266
|
-
//# sourceMappingURL=chunk-4XI3YBKU.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/templates/form.template.ts","../src/templates/filter-bar.template.ts","../src/templates/index.ts"],"names":["init_admin_layout_catalyst_template","init_logo_template"],"mappings":"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","file":"chunk-4XI3YBKU.cjs","sourcesContent":["export interface FormField {\n name: string\n label: string\n type: 'text' | 'email' | 'textarea' | 'select' | 'checkbox' | 'rich_text' | 'number' | 'date' | 'multi_select' | 'file'\n value?: any\n placeholder?: string\n required?: boolean\n readonly?: boolean\n helpText?: string\n options?: Array<{ value: string; label: string; selected?: boolean }>\n rows?: number\n className?: string\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface FormData {\n id?: string\n action?: string\n method?: string\n hxPost?: string\n hxPut?: string\n hxTarget?: string\n fields: FormField[]\n submitButtons: Array<{\n label: string\n type?: 'submit' | 'button'\n value?: string\n name?: string\n className?: string\n onclick?: string\n }>\n title?: string\n description?: string\n className?: string\n}\n\nexport function renderForm(data: FormData): string {\n return `\n <form \n ${data.id ? `id=\"${data.id}\"` : ''}\n ${data.hxPost ? `hx-post=\"${data.hxPost}\"` : data.hxPut ? `hx-put=\"${data.hxPut}\"` : data.action ? `action=\"${data.action}\"` : ''}\n ${data.hxTarget ? `hx-target=\"${data.hxTarget}\"` : ''}\n method=\"${data.method || 'POST'}\"\n class=\"${data.className || 'space-y-6'}\"\n ${data.fields.some(f => f.type === 'file') ? 'enctype=\"multipart/form-data\"' : ''}\n >\n ${data.title ? `\n <div class=\"mb-6\">\n <h2 class=\"text-lg font-medium text-gray-1\">${data.title}</h2>\n ${data.description ? `<p class=\"mt-1 text-sm text-gray-4\">${data.description}</p>` : ''}\n </div>\n ` : ''}\n \n <div id=\"form-messages\"></div>\n \n ${data.fields.map(field => renderFormField(field)).join('')}\n \n <div class=\"flex justify-between items-center pt-6 border-t border-gray-7\">\n <div class=\"flex space-x-4\">\n ${data.submitButtons.map(button => `\n <button \n type=\"${button.type || 'submit'}\"\n ${button.name ? `name=\"${button.name}\"` : ''}\n ${button.value ? `value=\"${button.value}\"` : ''}\n ${button.onclick ? `onclick=\"${button.onclick}\"` : ''}\n class=\"btn ${button.className || 'btn-primary'}\"\n >\n ${button.label}\n </button>\n `).join('')}\n </div>\n </div>\n </form>\n `\n}\n\nexport function renderFormField(field: FormField): string {\n const fieldId = `field-${field.name}`\n const required = field.required ? 'required' : ''\n const readonly = field.readonly ? 'readonly' : ''\n const placeholder = field.placeholder ? `placeholder=\"${field.placeholder}\"` : ''\n\n let fieldHTML = ''\n\n switch (field.type) {\n case 'text':\n case 'email':\n case 'number':\n case 'date':\n fieldHTML = `\n <input\n type=\"${field.type === 'date' ? 'datetime-local' : field.type}\"\n id=\"${fieldId}\"\n name=\"${field.name}\"\n value=\"${field.value || ''}\"\n class=\"form-input ${field.className || ''}\"\n ${placeholder}\n ${required}\n ${readonly}\n ${field.validation?.min !== undefined ? `min=\"${field.validation.min}\"` : ''}\n ${field.validation?.max !== undefined ? `max=\"${field.validation.max}\"` : ''}\n ${field.validation?.pattern ? `pattern=\"${field.validation.pattern}\"` : ''}\n >\n `\n break\n \n case 'textarea':\n fieldHTML = `\n <textarea \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-textarea ${field.className || ''}\" \n rows=\"${field.rows || 4}\"\n ${placeholder}\n ${required}\n >${field.value || ''}</textarea>\n `\n break\n \n case 'rich_text':\n const uniqueId = `${field.name}-${Date.now()}`\n fieldHTML = `\n <div class=\"markdown-field\">\n <textarea id=\"${uniqueId}\" name=\"${field.name}\" class=\"form-textarea\" rows=\"8\">${field.value || ''}</textarea>\n <script>\n if (typeof EasyMDE !== 'undefined') {\n new EasyMDE({\n element: document.getElementById('${uniqueId}'),\n minHeight: '300px',\n spellChecker: false,\n status: ['autosave', 'lines', 'words', 'cursor'],\n autosave: {\n enabled: true,\n uniqueId: '${uniqueId}',\n delay: 1000\n },\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n }\n </script>\n </div>\n `\n break\n \n case 'select':\n fieldHTML = `\n <select \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-input ${field.className || ''}\" \n ${required}\n >\n ${field.options ? field.options.map(option => `\n <option value=\"${option.value}\" ${option.selected || field.value === option.value ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('') : ''}\n </select>\n `\n break\n \n case 'multi_select':\n fieldHTML = `\n <select \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-input ${field.className || ''}\" \n multiple \n ${required}\n >\n ${field.options ? field.options.map(option => `\n <option value=\"${option.value}\" ${option.selected ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('') : ''}\n </select>\n `\n break\n \n case 'checkbox':\n fieldHTML = `\n <input\n type=\"checkbox\"\n id=\"${fieldId}\"\n name=\"${field.name}\"\n value=\"1\"\n class=\"size-4 rounded border border-white/15 bg-white/5 checked:border-transparent checked:bg-white disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-white/20 focus:ring-offset-2 ${field.className || ''}\"\n ${field.value ? 'checked' : ''}\n ${required}\n >\n <label for=\"${fieldId}\" class=\"ml-2 text-sm text-white\">${field.label}</label>\n `\n break\n \n default:\n fieldHTML = `\n <input \n type=\"text\" \n id=\"${fieldId}\"\n name=\"${field.name}\" \n value=\"${field.value || ''}\"\n class=\"form-input ${field.className || ''}\" \n ${placeholder} \n ${required}\n >\n `\n break\n }\n \n // For checkbox, we handle the label differently\n if (field.type === 'checkbox') {\n return `\n <div class=\"form-group\">\n <div class=\"flex items-center\">\n ${fieldHTML}\n </div>\n ${field.helpText ? `<p class=\"text-sm text-zinc-500 dark:text-zinc-400 mt-1 ml-6\">${field.helpText}</p>` : ''}\n </div>\n `\n }\n\n return `\n <div class=\"form-group\">\n <label for=\"${fieldId}\" class=\"form-label\">\n ${field.label}${field.required ? ' *' : ''}\n </label>\n ${fieldHTML}\n ${field.helpText ? `<p class=\"text-sm text-zinc-500 dark:text-zinc-400 mt-1\">${field.helpText}</p>` : ''}\n </div>\n `\n}","export interface FilterOption {\n value: string\n label: string\n selected?: boolean\n color?: string\n}\n\nexport interface Filter {\n name: string\n label: string\n options: FilterOption[]\n}\n\nexport interface FilterBarData {\n filters: Filter[]\n actions?: Array<{\n label: string\n className?: string\n onclick?: string\n hxGet?: string\n hxTarget?: string\n }>\n bulkActions?: Array<{\n label: string\n value: string\n icon?: string\n className?: string\n }>\n}\n\nexport function renderFilterBar(data: FilterBarData): string {\n return `\n <div class=\"rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-6 mb-6\">\n <form id=\"filter-form\" class=\"flex flex-wrap gap-4 items-center\">\n ${data.filters.map(filter => `\n <div class=\"flex items-center space-x-2\">\n <label class=\"text-sm font-medium text-zinc-500 dark:text-zinc-400\">${filter.label}:</label>\n <select\n name=\"${filter.name}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 focus:ring-2 focus:ring-blue-600 dark:focus:ring-blue-500 focus:outline-none transition-colors\"\n onchange=\"updateFilters()\"\n >\n ${filter.options.map(option => `\n <option value=\"${option.value}\" ${option.selected ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('')}\n </select>\n </div>\n `).join('')}\n\n ${data.actions && data.actions.length > 0 ? `\n <div class=\"flex items-center space-x-2 ml-auto\">\n ${data.actions.map(action => `\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\"\n ${action.onclick ? `onclick=\"${action.onclick}\"` : ''}\n ${action.hxGet ? `hx-get=\"${action.hxGet}\"` : ''}\n ${action.hxTarget ? `hx-target=\"${action.hxTarget}\"` : ''}\n >\n ${action.label}\n </button>\n `).join('')}\n </div>\n ` : ''}\n </form>\n\n <script>\n function updateFilters() {\n const form = document.getElementById('filter-form');\n const formData = new FormData(form);\n const params = new URLSearchParams(window.location.search);\n\n // Update params with form values\n for (const [key, value] of formData.entries()) {\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n }\n\n // Reset to page 1 when filters change\n params.set('page', '1');\n\n // Update URL and reload\n window.location.href = window.location.pathname + '?' + params.toString();\n }\n </script>\n </div>\n `\n}","/**\n * Templates Module Exports\n *\n * Reusable HTML template components for SonicJS\n */\n\n// Form templates\nexport { renderForm, renderFormField } from './form.template'\nexport type { FormField, FormData } from './form.template'\n\n// Table templates\nexport { renderTable } from './table.template'\nexport type { TableColumn, TableData } from './table.template'\n\n// Pagination templates\nexport { renderPagination } from './pagination.template'\nexport type { PaginationData } from './pagination.template'\n\n// Alert templates\nexport { renderAlert } from './alert.template'\nexport type { AlertData } from './alert.template'\n\n// Confirmation dialog templates\nexport { renderConfirmationDialog, getConfirmationDialogScript } from './confirmation-dialog.template'\nexport type { ConfirmationDialogOptions } from './confirmation-dialog.template'\n\n// Filter bar templates\nexport { renderFilterBar } from './filter-bar.template'\nexport type { FilterBarData, Filter, FilterOption } from './filter-bar.template'\n\n// Layout templates\nexport { renderAdminLayout } from './layouts/admin-layout-v2.template'\nexport { renderAdminLayoutCatalyst } from './layouts/admin-layout-catalyst.template'\nexport type { AdminLayoutData } from './layouts/admin-layout-v2.template'\nexport type { AdminLayoutCatalystData } from './layouts/admin-layout-catalyst.template'\n\n// Component templates\nexport { renderLogo } from './components/logo.template'\n\n// Page templates - Admin\nexport { renderDesignPage } from './pages/admin-design.template'\nexport type { DesignPageData } from './pages/admin-design.template'\nexport { renderCheckboxPage } from './pages/admin-checkboxes.template'\nexport type { CheckboxPageData } from './pages/admin-checkboxes.template'\nexport { renderFAQList } from './pages/admin-faq-list.template'\nexport { renderTestimonialsList } from './pages/admin-testimonials-list.template'\nexport { renderCodeExamplesList } from './pages/admin-code-examples-list.template'\n"]}
|