@zentto/studio 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/designer/zs-app-wizard.d.ts +33 -0
  2. package/dist/designer/zs-app-wizard.d.ts.map +1 -0
  3. package/dist/designer/zs-app-wizard.js +493 -0
  4. package/dist/designer/zs-app-wizard.js.map +1 -0
  5. package/dist/designer/zs-page-designer.d.ts +30 -0
  6. package/dist/designer/zs-page-designer.d.ts.map +1 -0
  7. package/dist/designer/zs-page-designer.js +466 -0
  8. package/dist/designer/zs-page-designer.js.map +1 -0
  9. package/dist/fields/zs-field-address.d.ts +28 -0
  10. package/dist/fields/zs-field-address.d.ts.map +1 -0
  11. package/dist/fields/zs-field-address.js +129 -0
  12. package/dist/fields/zs-field-address.js.map +1 -0
  13. package/dist/fields/zs-field-chart.d.ts +27 -0
  14. package/dist/fields/zs-field-chart.d.ts.map +1 -0
  15. package/dist/fields/zs-field-chart.js +192 -0
  16. package/dist/fields/zs-field-chart.js.map +1 -0
  17. package/dist/fields/zs-field-checkbox.d.ts +33 -0
  18. package/dist/fields/zs-field-checkbox.d.ts.map +1 -0
  19. package/dist/fields/zs-field-checkbox.js +172 -0
  20. package/dist/fields/zs-field-checkbox.js.map +1 -0
  21. package/dist/fields/zs-field-chips.d.ts +38 -0
  22. package/dist/fields/zs-field-chips.d.ts.map +1 -0
  23. package/dist/fields/zs-field-chips.js +257 -0
  24. package/dist/fields/zs-field-chips.js.map +1 -0
  25. package/dist/fields/zs-field-date.d.ts +23 -0
  26. package/dist/fields/zs-field-date.d.ts.map +1 -0
  27. package/dist/fields/zs-field-date.js +98 -0
  28. package/dist/fields/zs-field-date.js.map +1 -0
  29. package/dist/fields/zs-field-file.d.ts +26 -0
  30. package/dist/fields/zs-field-file.d.ts.map +1 -0
  31. package/dist/fields/zs-field-file.js +190 -0
  32. package/dist/fields/zs-field-file.js.map +1 -0
  33. package/dist/fields/zs-field-heading.d.ts +14 -0
  34. package/dist/fields/zs-field-heading.d.ts.map +1 -0
  35. package/dist/fields/zs-field-heading.js +54 -0
  36. package/dist/fields/zs-field-heading.js.map +1 -0
  37. package/dist/fields/zs-field-html.d.ts +12 -0
  38. package/dist/fields/zs-field-html.d.ts.map +1 -0
  39. package/dist/fields/zs-field-html.js +38 -0
  40. package/dist/fields/zs-field-html.js.map +1 -0
  41. package/dist/fields/zs-field-lookup.d.ts +37 -0
  42. package/dist/fields/zs-field-lookup.d.ts.map +1 -0
  43. package/dist/fields/zs-field-lookup.js +204 -0
  44. package/dist/fields/zs-field-lookup.js.map +1 -0
  45. package/dist/fields/zs-field-media.d.ts +15 -0
  46. package/dist/fields/zs-field-media.d.ts.map +1 -0
  47. package/dist/fields/zs-field-media.js +59 -0
  48. package/dist/fields/zs-field-media.js.map +1 -0
  49. package/dist/fields/zs-field-number.d.ts +35 -0
  50. package/dist/fields/zs-field-number.d.ts.map +1 -0
  51. package/dist/fields/zs-field-number.js +192 -0
  52. package/dist/fields/zs-field-number.js.map +1 -0
  53. package/dist/fields/zs-field-select.d.ts +34 -0
  54. package/dist/fields/zs-field-select.d.ts.map +1 -0
  55. package/dist/fields/zs-field-select.js +237 -0
  56. package/dist/fields/zs-field-select.js.map +1 -0
  57. package/dist/fields/zs-field-separator.d.ts +12 -0
  58. package/dist/fields/zs-field-separator.d.ts.map +1 -0
  59. package/dist/fields/zs-field-separator.js +37 -0
  60. package/dist/fields/zs-field-separator.js.map +1 -0
  61. package/dist/fields/zs-field-signature.d.ts +34 -0
  62. package/dist/fields/zs-field-signature.d.ts.map +1 -0
  63. package/dist/fields/zs-field-signature.js +191 -0
  64. package/dist/fields/zs-field-signature.js.map +1 -0
  65. package/dist/fields/zs-field-switch.d.ts +19 -0
  66. package/dist/fields/zs-field-switch.d.ts.map +1 -0
  67. package/dist/fields/zs-field-switch.js +100 -0
  68. package/dist/fields/zs-field-switch.js.map +1 -0
  69. package/dist/fields/zs-field-text.d.ts +24 -0
  70. package/dist/fields/zs-field-text.d.ts.map +1 -0
  71. package/dist/fields/zs-field-text.js +115 -0
  72. package/dist/fields/zs-field-text.js.map +1 -0
  73. package/dist/fields/zs-field-treeview.d.ts +37 -0
  74. package/dist/fields/zs-field-treeview.d.ts.map +1 -0
  75. package/dist/fields/zs-field-treeview.js +234 -0
  76. package/dist/fields/zs-field-treeview.js.map +1 -0
  77. package/dist/styles/tokens.d.ts +3 -0
  78. package/dist/styles/tokens.d.ts.map +1 -0
  79. package/dist/styles/tokens.js +159 -0
  80. package/dist/styles/tokens.js.map +1 -0
  81. package/dist/zentto-studio-app.d.ts +55 -0
  82. package/dist/zentto-studio-app.d.ts.map +1 -0
  83. package/dist/zentto-studio-app.js +748 -0
  84. package/dist/zentto-studio-app.js.map +1 -0
  85. package/dist/zentto-studio-designer.d.ts +13 -0
  86. package/dist/zentto-studio-designer.d.ts.map +1 -0
  87. package/dist/zentto-studio-designer.js +75 -0
  88. package/dist/zentto-studio-designer.js.map +1 -0
  89. package/dist/zentto-studio-renderer.d.ts +53 -0
  90. package/dist/zentto-studio-renderer.d.ts.map +1 -0
  91. package/dist/zentto-studio-renderer.js +636 -0
  92. package/dist/zentto-studio-renderer.js.map +1 -0
  93. package/package.json +56 -0
@@ -0,0 +1,466 @@
1
+ // @zentto/studio — Runtime Page Designer
2
+ // Allows users to drag-drop fields, reorder, resize, and edit properties
3
+ // in a live preview. Outputs the modified StudioSchema.
4
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
5
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
6
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
7
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
8
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9
+ };
10
+ import { LitElement, html, css, nothing } from 'lit';
11
+ import { customElement, property, state } from 'lit/decorators.js';
12
+ import { studioTokens, fieldBaseStyles } from '../styles/tokens.js';
13
+ import { getAllFields } from '@zentto/studio-core';
14
+ // Import renderer for live preview
15
+ import '../zentto-studio-renderer.js';
16
+ let ZsPageDesigner = class ZsPageDesigner extends LitElement {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.schema = null;
20
+ this.data = {};
21
+ this.selectedFieldId = null;
22
+ this.viewMode = 'design';
23
+ this.dragType = null;
24
+ this.renderKey = 0;
25
+ }
26
+ static { this.styles = [studioTokens, fieldBaseStyles, css `
27
+ :host { display: block; font-family: var(--zs-font-family); height: 100%; }
28
+
29
+ .designer {
30
+ display: grid; grid-template-columns: 220px 1fr 280px;
31
+ height: 100%; overflow: hidden;
32
+ border: 1px solid var(--zs-border); border-radius: 8px;
33
+ }
34
+
35
+ /* ─── Toolbox (Left) ──────────────────────── */
36
+ .toolbox {
37
+ background: var(--zs-bg-secondary); border-right: 1px solid var(--zs-border);
38
+ overflow-y: auto; padding: 12px;
39
+ }
40
+ .toolbox-title {
41
+ font-size: 11px; font-weight: 600; text-transform: uppercase;
42
+ letter-spacing: 0.5px; color: var(--zs-text-secondary);
43
+ margin: 12px 0 8px; padding: 0 4px;
44
+ }
45
+ .toolbox-title:first-child { margin-top: 0; }
46
+ .toolbox-item {
47
+ display: flex; align-items: center; gap: 8px;
48
+ padding: 8px 10px; border-radius: 6px;
49
+ cursor: grab; font-size: 13px; color: var(--zs-text);
50
+ transition: all 100ms; margin-bottom: 2px;
51
+ border: 1px solid transparent;
52
+ }
53
+ .toolbox-item:hover { background: var(--zs-bg-hover); border-color: var(--zs-border); }
54
+ .toolbox-item:active { cursor: grabbing; background: var(--zs-primary-light); border-color: var(--zs-primary); }
55
+ .toolbox-item-icon { font-size: 16px; width: 24px; text-align: center; }
56
+ .toolbox-item-label { flex: 1; }
57
+
58
+ /* ─── Canvas (Center) ─────────────────────── */
59
+ .canvas {
60
+ overflow-y: auto; padding: 24px;
61
+ background: #f5f5f5; position: relative;
62
+ }
63
+ .canvas-header {
64
+ display: flex; align-items: center; gap: 8px;
65
+ margin-bottom: 16px; padding: 0 4px;
66
+ }
67
+ .canvas-title { font-size: 16px; font-weight: 600; color: var(--zs-text); }
68
+ .canvas-actions { margin-left: auto; display: flex; gap: 6px; }
69
+ .canvas-btn {
70
+ padding: 5px 12px; border: 1px solid var(--zs-border);
71
+ border-radius: 4px; background: var(--zs-bg); cursor: pointer;
72
+ font-size: 12px; color: var(--zs-text-secondary);
73
+ transition: all 100ms;
74
+ }
75
+ .canvas-btn:hover { background: var(--zs-bg-hover); color: var(--zs-text); }
76
+ .canvas-btn--active { background: var(--zs-primary); color: white; border-color: var(--zs-primary); }
77
+
78
+ /* Preview wrapper */
79
+ .preview-frame {
80
+ background: var(--zs-bg); border-radius: 8px;
81
+ border: 1px solid var(--zs-border);
82
+ box-shadow: 0 2px 8px var(--zs-shadow);
83
+ padding: 16px; min-height: 300px;
84
+ }
85
+
86
+ /* Field overlay (clickable areas on preview) */
87
+ .field-overlay {
88
+ position: relative; cursor: pointer;
89
+ border: 2px solid transparent; border-radius: 4px;
90
+ transition: all 100ms; margin: -2px;
91
+ padding: 2px;
92
+ }
93
+ .field-overlay:hover { border-color: var(--zs-accent); background: rgba(52, 152, 219, 0.03); }
94
+ .field-overlay--selected { border-color: var(--zs-primary); background: rgba(230, 126, 34, 0.05); }
95
+ .field-overlay-label {
96
+ position: absolute; top: -10px; left: 8px;
97
+ font-size: 10px; background: var(--zs-primary); color: white;
98
+ padding: 1px 6px; border-radius: 3px;
99
+ opacity: 0; transition: opacity 100ms;
100
+ }
101
+ .field-overlay:hover .field-overlay-label,
102
+ .field-overlay--selected .field-overlay-label { opacity: 1; }
103
+ .field-overlay-actions {
104
+ position: absolute; top: -10px; right: 4px;
105
+ display: flex; gap: 2px;
106
+ opacity: 0; transition: opacity 100ms;
107
+ }
108
+ .field-overlay:hover .field-overlay-actions { opacity: 1; }
109
+ .field-overlay-btn {
110
+ width: 20px; height: 20px; border-radius: 3px;
111
+ border: none; cursor: pointer; font-size: 11px;
112
+ display: flex; align-items: center; justify-content: center;
113
+ transition: all 100ms;
114
+ }
115
+ .field-overlay-btn--move { background: var(--zs-accent); color: white; }
116
+ .field-overlay-btn--delete { background: var(--zs-danger); color: white; }
117
+
118
+ /* Drop zones */
119
+ .drop-zone {
120
+ border: 2px dashed var(--zs-border); border-radius: 6px;
121
+ padding: 20px; text-align: center; margin: 8px 0;
122
+ color: var(--zs-text-muted); font-size: 13px;
123
+ transition: all 150ms;
124
+ }
125
+ .drop-zone--active { border-color: var(--zs-primary); background: var(--zs-primary-light); color: var(--zs-primary); }
126
+
127
+ /* ─── Properties (Right) ──────────────────── */
128
+ .properties {
129
+ background: var(--zs-bg); border-left: 1px solid var(--zs-border);
130
+ overflow-y: auto; padding: 16px;
131
+ }
132
+ .props-title {
133
+ font-size: 11px; font-weight: 600; text-transform: uppercase;
134
+ letter-spacing: 0.5px; color: var(--zs-text-secondary);
135
+ margin: 16px 0 8px; padding-bottom: 4px;
136
+ border-bottom: 1px solid var(--zs-border);
137
+ }
138
+ .props-title:first-child { margin-top: 0; }
139
+ .props-row { margin-bottom: 12px; }
140
+ .props-label {
141
+ font-size: 12px; font-weight: 500; color: var(--zs-text-secondary);
142
+ margin-bottom: 4px; display: block;
143
+ }
144
+ .props-input {
145
+ width: 100%; padding: 6px 10px; border: 1px solid var(--zs-border);
146
+ border-radius: 4px; font-size: 13px; font-family: var(--zs-font-family);
147
+ background: var(--zs-bg); color: var(--zs-text);
148
+ outline: none; box-sizing: border-box;
149
+ }
150
+ .props-input:focus { border-color: var(--zs-primary); }
151
+ .props-select { height: 32px; }
152
+ .props-checkbox {
153
+ display: flex; align-items: center; gap: 6px;
154
+ font-size: 13px; cursor: pointer;
155
+ }
156
+ .props-checkbox input { accent-color: var(--zs-primary); }
157
+ .props-empty {
158
+ text-align: center; padding: 40px 16px;
159
+ color: var(--zs-text-muted); font-size: 13px;
160
+ }
161
+ .props-field-type {
162
+ display: inline-block; padding: 2px 8px;
163
+ background: var(--zs-primary-light); color: var(--zs-primary);
164
+ border-radius: 4px; font-size: 11px; font-weight: 600;
165
+ margin-bottom: 12px;
166
+ }
167
+
168
+ /* JSON panel */
169
+ .json-panel {
170
+ font-family: 'Fira Code', 'Consolas', monospace;
171
+ font-size: 12px; line-height: 1.5;
172
+ background: #1e1e2d; color: #a2a3b7;
173
+ padding: 16px; border-radius: 8px;
174
+ overflow: auto; max-height: 400px;
175
+ white-space: pre; tab-size: 2;
176
+ }
177
+ `]; }
178
+ get selectedField() {
179
+ if (!this.schema || !this.selectedFieldId)
180
+ return null;
181
+ for (const section of this.schema.sections) {
182
+ const f = section.fields.find(f => f.id === this.selectedFieldId);
183
+ if (f)
184
+ return f;
185
+ }
186
+ return null;
187
+ }
188
+ get selectedSectionIndex() {
189
+ if (!this.schema || !this.selectedFieldId)
190
+ return -1;
191
+ return this.schema.sections.findIndex(s => s.fields.some(f => f.id === this.selectedFieldId));
192
+ }
193
+ // ─── Render ───────────────────────────────────────
194
+ render() {
195
+ return html `
196
+ <div class="designer">
197
+ ${this.renderToolbox()}
198
+ ${this.renderCanvas()}
199
+ ${this.renderProperties()}
200
+ </div>
201
+ `;
202
+ }
203
+ // ─── Toolbox ──────────────────────────────────────
204
+ renderToolbox() {
205
+ const fields = getAllFields();
206
+ const categories = ['basic', 'advanced', 'data', 'media', 'layout'];
207
+ const categoryNames = {
208
+ basic: 'Basicos', advanced: 'Avanzados',
209
+ data: 'Datos', media: 'Media', layout: 'Layout',
210
+ };
211
+ return html `
212
+ <div class="toolbox">
213
+ ${categories.map(cat => {
214
+ const items = fields.filter(f => f.category === cat);
215
+ if (items.length === 0)
216
+ return nothing;
217
+ return html `
218
+ <div class="toolbox-title">${categoryNames[cat] ?? cat}</div>
219
+ ${items.map(f => html `
220
+ <div class="toolbox-item"
221
+ draggable="true"
222
+ @dragstart="${(e) => { this.dragType = f.type; e.dataTransfer?.setData('text/plain', f.type); }}"
223
+ @dragend="${() => { this.dragType = null; }}"
224
+ @dblclick="${() => this.addField(f.type)}"
225
+ >
226
+ <span class="toolbox-item-icon">${f.icon}</span>
227
+ <span class="toolbox-item-label">${f.label}</span>
228
+ </div>
229
+ `)}
230
+ `;
231
+ })}
232
+ </div>
233
+ `;
234
+ }
235
+ // ─── Canvas ───────────────────────────────────────
236
+ renderCanvas() {
237
+ return html `
238
+ <div class="canvas">
239
+ <div class="canvas-header">
240
+ <span class="canvas-title">${this.schema?.title || 'Sin titulo'}</span>
241
+ <div class="canvas-actions">
242
+ <button class="canvas-btn ${this.viewMode === 'design' ? 'canvas-btn--active' : ''}" @click="${() => { this.viewMode = 'design'; }}">Diseño</button>
243
+ <button class="canvas-btn ${this.viewMode === 'preview' ? 'canvas-btn--active' : ''}" @click="${() => { this.viewMode = 'preview'; }}">Preview</button>
244
+ <button class="canvas-btn ${this.viewMode === 'json' ? 'canvas-btn--active' : ''}" @click="${() => { this.viewMode = 'json'; }}">JSON</button>
245
+ </div>
246
+ </div>
247
+
248
+ ${this.viewMode === 'json'
249
+ ? html `<div class="json-panel">${JSON.stringify(this.schema, null, 2)}</div>`
250
+ : this.viewMode === 'preview'
251
+ ? html `<div class="preview-frame"><zentto-studio-renderer .schema="${this.schema}" .data="${this.data}"></zentto-studio-renderer></div>`
252
+ : this.renderDesignView()}
253
+ </div>
254
+ `;
255
+ }
256
+ renderDesignView() {
257
+ if (!this.schema)
258
+ return html `<div class="drop-zone">Arrastra campos del toolbox aqui</div>`;
259
+ return html `
260
+ <div class="preview-frame">
261
+ ${this.schema.sections.map((section, si) => html `
262
+ <div style="margin-bottom:24px;">
263
+ ${section.title ? html `<h3 style="font-size:16px;font-weight:600;margin:0 0 12px;color:var(--zs-text);border-bottom:2px solid var(--zs-primary-light);padding-bottom:6px;">${section.title}</h3>` : ''}
264
+ <div style="display:grid;grid-template-columns:repeat(${section.columns ?? this.schema?.layout.columns ?? 1}, 1fr);gap:12px;">
265
+ ${section.fields.map((field, fi) => html `
266
+ <div class="field-overlay ${this.selectedFieldId === field.id ? 'field-overlay--selected' : ''}"
267
+ style="${field.colSpan ? `grid-column: span ${field.colSpan}` : ''}"
268
+ @click="${(e) => { e.stopPropagation(); this.selectedFieldId = field.id; }}"
269
+ >
270
+ <span class="field-overlay-label">${field.type}: ${field.id}</span>
271
+ <div class="field-overlay-actions">
272
+ ${fi > 0 ? html `<button class="field-overlay-btn field-overlay-btn--move" @click="${(e) => { e.stopPropagation(); this.moveField(si, fi, -1); }}">↑</button>` : ''}
273
+ ${fi < section.fields.length - 1 ? html `<button class="field-overlay-btn field-overlay-btn--move" @click="${(e) => { e.stopPropagation(); this.moveField(si, fi, 1); }}">↓</button>` : ''}
274
+ <button class="field-overlay-btn field-overlay-btn--delete" @click="${(e) => { e.stopPropagation(); this.removeField(si, fi); }}">✕</button>
275
+ </div>
276
+ <!-- Render actual field preview -->
277
+ <div style="pointer-events:none;opacity:0.9;">
278
+ <div style="font-size:12px;font-weight:500;color:var(--zs-text-secondary);margin-bottom:4px;">${field.label ?? field.id}${field.required ? ' *' : ''}</div>
279
+ <div style="height:36px;border:1px solid var(--zs-border);border-radius:4px;background:var(--zs-bg-secondary);display:flex;align-items:center;padding:0 10px;font-size:13px;color:var(--zs-text-muted);">${field.placeholder ?? field.type}</div>
280
+ </div>
281
+ </div>
282
+ `)}
283
+ </div>
284
+ <!-- Drop zone at end of section -->
285
+ <div class="drop-zone ${this.dragType ? 'drop-zone--active' : ''}"
286
+ @dragover="${(e) => e.preventDefault()}"
287
+ @drop="${(e) => { e.preventDefault(); if (this.dragType) {
288
+ this.addFieldToSection(si, this.dragType);
289
+ this.dragType = null;
290
+ } }}"
291
+ >
292
+ ${this.dragType ? 'Soltar aqui' : 'Arrastra un campo aqui'}
293
+ </div>
294
+ </div>
295
+ `)}
296
+ </div>
297
+ `;
298
+ }
299
+ // ─── Properties Panel ─────────────────────────────
300
+ renderProperties() {
301
+ const field = this.selectedField;
302
+ if (!field) {
303
+ return html `
304
+ <div class="properties">
305
+ <div class="props-empty">
306
+ <div style="font-size:32px;margin-bottom:8px;">👆</div>
307
+ Selecciona un campo para editar sus propiedades
308
+ </div>
309
+ ${this.schema ? html `
310
+ <div class="props-title">FORMULARIO</div>
311
+ <div class="props-row">
312
+ <label class="props-label">Titulo</label>
313
+ <input class="props-input" .value="${this.schema.title}" @input="${(e) => { this.schema.title = e.target.value; this.emitChange(); }}" />
314
+ </div>
315
+ <div class="props-row">
316
+ <label class="props-label">Columnas</label>
317
+ <input class="props-input" type="number" min="1" max="6" .value="${String(this.schema.layout.columns ?? 1)}" @input="${(e) => { this.schema.layout.columns = parseInt(e.target.value) || 1; this.emitChange(); }}" />
318
+ </div>
319
+ ` : ''}
320
+ </div>
321
+ `;
322
+ }
323
+ return html `
324
+ <div class="properties">
325
+ <span class="props-field-type">${field.type}</span>
326
+
327
+ <div class="props-title">GENERAL</div>
328
+ <div class="props-row">
329
+ <label class="props-label">ID</label>
330
+ <input class="props-input" .value="${field.id}" @input="${(e) => { field.id = e.target.value; this.emitChange(); }}" />
331
+ </div>
332
+ <div class="props-row">
333
+ <label class="props-label">Label</label>
334
+ <input class="props-input" .value="${field.label ?? ''}" @input="${(e) => { field.label = e.target.value; this.emitChange(); }}" />
335
+ </div>
336
+ <div class="props-row">
337
+ <label class="props-label">Field (binding)</label>
338
+ <input class="props-input" .value="${field.field}" @input="${(e) => { field.field = e.target.value; this.emitChange(); }}" />
339
+ </div>
340
+ <div class="props-row">
341
+ <label class="props-label">Placeholder</label>
342
+ <input class="props-input" .value="${field.placeholder ?? ''}" @input="${(e) => { field.placeholder = e.target.value; this.emitChange(); }}" />
343
+ </div>
344
+ <div class="props-row">
345
+ <label class="props-label">Help Text</label>
346
+ <input class="props-input" .value="${field.helpText ?? ''}" @input="${(e) => { field.helpText = e.target.value; this.emitChange(); }}" />
347
+ </div>
348
+
349
+ <div class="props-title">LAYOUT</div>
350
+ <div class="props-row">
351
+ <label class="props-label">Col Span</label>
352
+ <input class="props-input" type="number" min="1" max="6" .value="${String(field.colSpan ?? 1)}" @input="${(e) => { field.colSpan = parseInt(e.target.value) || 1; this.emitChange(); }}" />
353
+ </div>
354
+ <div class="props-row">
355
+ <label class="props-label">CSS Class</label>
356
+ <input class="props-input" .value="${field.cssClass ?? ''}" @input="${(e) => { field.cssClass = e.target.value; this.emitChange(); }}" />
357
+ </div>
358
+
359
+ <div class="props-title">COMPORTAMIENTO</div>
360
+ <div class="props-row">
361
+ <label class="props-checkbox"><input type="checkbox" .checked="${field.required ?? false}" @change="${(e) => { field.required = e.target.checked; this.emitChange(); }}" /> Requerido</label>
362
+ </div>
363
+ <div class="props-row">
364
+ <label class="props-checkbox"><input type="checkbox" .checked="${field.readOnly ?? false}" @change="${(e) => { field.readOnly = e.target.checked; this.emitChange(); }}" /> Solo lectura</label>
365
+ </div>
366
+ <div class="props-row">
367
+ <label class="props-checkbox"><input type="checkbox" .checked="${field.disabled ?? false}" @change="${(e) => { field.disabled = e.target.checked; this.emitChange(); }}" /> Deshabilitado</label>
368
+ </div>
369
+ <div class="props-row">
370
+ <label class="props-checkbox"><input type="checkbox" .checked="${field.hidden ?? false}" @change="${(e) => { field.hidden = e.target.checked; this.emitChange(); }}" /> Oculto</label>
371
+ </div>
372
+
373
+ <div class="props-title">REGLAS</div>
374
+ <div class="props-row">
375
+ <label class="props-label">Visibilidad (expresion)</label>
376
+ <input class="props-input" .value="${field.visibilityRule ?? ''}" placeholder='{role} == "admin"' @input="${(e) => { field.visibilityRule = e.target.value || undefined; this.emitChange(); }}" />
377
+ </div>
378
+ <div class="props-row">
379
+ <label class="props-label">Valor Computado</label>
380
+ <input class="props-input" .value="${field.computedValue ?? ''}" placeholder='{precio} * {cantidad}' @input="${(e) => { field.computedValue = e.target.value || undefined; this.emitChange(); }}" />
381
+ </div>
382
+ <div class="props-row">
383
+ <label class="props-label">Default Value</label>
384
+ <input class="props-input" .value="${String(field.defaultValue ?? '')}" @input="${(e) => { field.defaultValue = e.target.value || undefined; this.emitChange(); }}" />
385
+ </div>
386
+ </div>
387
+ `;
388
+ }
389
+ // ─── Actions ──────────────────────────────────────
390
+ addField(type) {
391
+ if (!this.schema) {
392
+ this.schema = {
393
+ id: 'new-form', version: '1.0', title: 'Nuevo Formulario',
394
+ layout: { type: 'grid', columns: 2 },
395
+ sections: [{ id: 'main', title: 'Datos', fields: [] }],
396
+ };
397
+ }
398
+ this.addFieldToSection(0, type);
399
+ }
400
+ addFieldToSection(sectionIndex, type) {
401
+ if (!this.schema)
402
+ return;
403
+ const id = `${type}_${Date.now()}`;
404
+ const meta = getAllFields().find(f => f.type === type);
405
+ const field = {
406
+ id,
407
+ type,
408
+ field: id,
409
+ label: meta?.label ?? type,
410
+ props: meta?.defaultProps ? { ...meta.defaultProps } : undefined,
411
+ };
412
+ this.schema.sections[sectionIndex].fields.push(field);
413
+ this.selectedFieldId = id;
414
+ this.emitChange();
415
+ }
416
+ removeField(sectionIndex, fieldIndex) {
417
+ if (!this.schema)
418
+ return;
419
+ const field = this.schema.sections[sectionIndex].fields[fieldIndex];
420
+ if (this.selectedFieldId === field.id)
421
+ this.selectedFieldId = null;
422
+ this.schema.sections[sectionIndex].fields.splice(fieldIndex, 1);
423
+ this.emitChange();
424
+ }
425
+ moveField(sectionIndex, fieldIndex, dir) {
426
+ if (!this.schema)
427
+ return;
428
+ const fields = this.schema.sections[sectionIndex].fields;
429
+ const newIndex = fieldIndex + dir;
430
+ if (newIndex < 0 || newIndex >= fields.length)
431
+ return;
432
+ [fields[fieldIndex], fields[newIndex]] = [fields[newIndex], fields[fieldIndex]];
433
+ this.emitChange();
434
+ }
435
+ emitChange() {
436
+ this.renderKey++;
437
+ this.requestUpdate();
438
+ this.dispatchEvent(new CustomEvent('schema-change', {
439
+ detail: { schema: structuredClone(this.schema) },
440
+ bubbles: true, composed: true,
441
+ }));
442
+ }
443
+ };
444
+ __decorate([
445
+ property({ type: Object })
446
+ ], ZsPageDesigner.prototype, "schema", void 0);
447
+ __decorate([
448
+ property({ type: Object })
449
+ ], ZsPageDesigner.prototype, "data", void 0);
450
+ __decorate([
451
+ state()
452
+ ], ZsPageDesigner.prototype, "selectedFieldId", void 0);
453
+ __decorate([
454
+ state()
455
+ ], ZsPageDesigner.prototype, "viewMode", void 0);
456
+ __decorate([
457
+ state()
458
+ ], ZsPageDesigner.prototype, "dragType", void 0);
459
+ __decorate([
460
+ state()
461
+ ], ZsPageDesigner.prototype, "renderKey", void 0);
462
+ ZsPageDesigner = __decorate([
463
+ customElement('zs-page-designer')
464
+ ], ZsPageDesigner);
465
+ export { ZsPageDesigner };
466
+ //# sourceMappingURL=zs-page-designer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zs-page-designer.js","sourceRoot":"","sources":["../../src/designer/zs-page-designer.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,yEAAyE;AACzE,wDAAwD;;;;;;;AAExD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,mCAAmC;AACnC,OAAO,8BAA8B,CAAC;AAG/B,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,UAAU;IAAvC;;QA0JuB,WAAM,GAAwB,IAAI,CAAC;QACnC,SAAI,GAA4B,EAAE,CAAC;QAE9C,oBAAe,GAAkB,IAAI,CAAC;QACtC,aAAQ,GAAkC,QAAQ,CAAC;QACnD,aAAQ,GAAqB,IAAI,CAAC;QAClC,cAAS,GAAG,CAAC,CAAC;IAoRjC,CAAC;aAnbQ,WAAM,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuJlD,CAAC,AAvJW,CAuJV;IAUH,IAAY,aAAa;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QACvD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;YAClE,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAY,oBAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,qDAAqD;IAErD,MAAM;QACJ,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,aAAa,EAAE;UACpB,IAAI,CAAC,YAAY,EAAE;UACnB,IAAI,CAAC,gBAAgB,EAAE;;KAE5B,CAAC;IACJ,CAAC;IAED,qDAAqD;IAE7C,aAAa;QACnB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEpE,MAAM,aAAa,GAA2B;YAC5C,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW;YACvC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ;SAChD,CAAC;QAEF,OAAO,IAAI,CAAA;;UAEL,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;YACvC,OAAO,IAAI,CAAA;yCACoB,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG;cACpD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAA;;;8BAGH,CAAC,CAAY,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAC9F,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;6BAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;;kDAEN,CAAC,CAAC,IAAI;mDACL,CAAC,CAAC,KAAK;;aAE7C,CAAC;WACH,CAAC;QACJ,CAAC,CAAC;;KAEL,CAAC;IACJ,CAAC;IAED,qDAAqD;IAE7C,YAAY;QAClB,OAAO,IAAI,CAAA;;;uCAGwB,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,YAAY;;wCAEjC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;wCACtG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;wCACxG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;;;;UAIhI,IAAI,CAAC,QAAQ,KAAK,MAAM;YACxB,CAAC,CAAC,IAAI,CAAA,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ;YAC7E,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAC3B,CAAC,CAAC,IAAI,CAAA,+DAA+D,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,mCAAmC;gBACxI,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAC3B;;KAEH,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA,+DAA+D,CAAC;QAE7F,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;;cAE1C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,uJAAuJ,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE;oEAC9I,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;gBACvG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;4CACV,IAAI,CAAC,eAAe,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE;2BACnF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;4BACxD,CAAC,CAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;;sDAE7C,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;;sBAEvD,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,qEAAqE,CAAC,CAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;sBACvK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,qEAAqE,CAAC,CAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;0FAC1H,CAAC,CAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;;;;oHAItC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;+NACuD,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI;;;eAG/O,CAAC;;;oCAGoB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;2BACjD,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE;uBACxC,CAAC,CAAY,EAAE,EAAE,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,CAAC,CAAC,CAAC;;gBAExI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB;;;SAG/D,CAAC;;KAEL,CAAC;IACJ,CAAC;IAED,qDAAqD;IAE7C,gBAAgB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAA;;;;;;YAML,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;;;;mDAIqB,IAAI,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,MAAO,CAAC,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;iFAI/F,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAE,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;WAEjP,CAAC,CAAC,CAAC,EAAE;;OAET,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;;yCAE0B,KAAK,CAAC,IAAI;;;;;+CAKJ,KAAK,CAAC,EAAE,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAI1G,KAAK,CAAC,KAAK,IAAI,EAAE,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAItH,KAAK,CAAC,KAAK,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAIhH,KAAK,CAAC,WAAW,IAAI,EAAE,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAIlI,KAAK,CAAC,QAAQ,IAAI,EAAE,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;;;6EAM9F,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAE,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAI9K,KAAK,CAAC,QAAQ,IAAI,EAAE,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;;2EAKhG,KAAK,CAAC,QAAQ,IAAI,KAAK,cAAc,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;2EAGlI,KAAK,CAAC,QAAQ,IAAI,KAAK,cAAc,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;2EAGlI,KAAK,CAAC,QAAQ,IAAI,KAAK,cAAc,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;2EAGlI,KAAK,CAAC,MAAM,IAAI,KAAK,cAAc,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;;;+CAM1J,KAAK,CAAC,cAAc,IAAI,EAAE,6CAA6C,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,cAAc,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAIrL,KAAK,CAAC,aAAa,IAAI,EAAE,iDAAiD,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,aAAa,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;;+CAIvL,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,aAAa,CAAC,CAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;;KAGnM,CAAC;IACJ,CAAC;IAED,qDAAqD;IAE7C,QAAQ,CAAC,IAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG;gBACZ,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB;gBACzD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE;gBACpC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACvD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAEO,iBAAiB,CAAC,YAAoB,EAAE,IAAe;QAC7D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAgB;YACzB,EAAE;YACF,IAAI;YACJ,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;YAC1B,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS;SACjE,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,YAAoB,EAAE,UAAkB;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,SAAS,CAAC,YAAoB,EAAE,UAAkB,EAAE,GAAW;QACrE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC;QAClC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO;QACtD,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,eAAe,EAAE;YAClD,MAAM,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;;AAzR2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAoC;AACnC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAoC;AAE9C;IAAhB,KAAK,EAAE;uDAA+C;AACtC;IAAhB,KAAK,EAAE;gDAA4D;AACnD;IAAhB,KAAK,EAAE;gDAA2C;AAClC;IAAhB,KAAK,EAAE;iDAAuB;AAhKpB,cAAc;IAD1B,aAAa,CAAC,kBAAkB,CAAC;GACrB,cAAc,CAob1B"}
@@ -0,0 +1,28 @@
1
+ import { LitElement } from 'lit';
2
+ interface AddressValue {
3
+ street?: string;
4
+ city?: string;
5
+ state?: string;
6
+ zip?: string;
7
+ country?: string;
8
+ }
9
+ export declare class ZsFieldAddress extends LitElement {
10
+ static styles: import("lit").CSSResult[];
11
+ fieldId: string;
12
+ label: string;
13
+ helpText: string;
14
+ value: AddressValue;
15
+ required: boolean;
16
+ disabled: boolean;
17
+ readOnly: boolean;
18
+ errors: string[];
19
+ private handleChange;
20
+ render(): import("lit-html").TemplateResult<1>;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ 'zs-field-address': ZsFieldAddress;
25
+ }
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=zs-field-address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zs-field-address.d.ts","sourceRoot":"","sources":["../../src/fields/zs-field-address.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBACa,cAAe,SAAQ,UAAU;IAC5C,MAAM,CAAC,MAAM,4BAiBV;IAES,OAAO,SAAM;IACb,KAAK,SAAM;IACX,QAAQ,SAAM;IACE,KAAK,EAAE,YAAY,CAAM;IACxB,QAAQ,UAAS;IACjB,QAAQ,UAAS;IACjB,QAAQ,UAAS;IACnB,MAAM,EAAE,MAAM,EAAE,CAAM;IAEjD,OAAO,CAAC,YAAY;IASpB,MAAM;CAoDP;AAED,OAAO,CAAC,MAAM,CAAC;IAAE,UAAU,qBAAqB;QAAG,kBAAkB,EAAE,cAAc,CAAC;KAAE;CAAE"}
@@ -0,0 +1,129 @@
1
+ // @zentto/studio — Composite address field
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ import { LitElement, html, css } from 'lit';
9
+ import { customElement, property } from 'lit/decorators.js';
10
+ import { fieldBaseStyles } from '../styles/tokens.js';
11
+ let ZsFieldAddress = class ZsFieldAddress extends LitElement {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.fieldId = '';
15
+ this.label = '';
16
+ this.helpText = '';
17
+ this.value = {};
18
+ this.required = false;
19
+ this.disabled = false;
20
+ this.readOnly = false;
21
+ this.errors = [];
22
+ }
23
+ static { this.styles = [fieldBaseStyles, css `
24
+ :host { display: block; }
25
+ .zs-address-grid {
26
+ display: grid;
27
+ grid-template-columns: 1fr;
28
+ gap: 8px;
29
+ }
30
+ .zs-address-row {
31
+ display: grid;
32
+ gap: 8px;
33
+ }
34
+ .zs-address-row--2 { grid-template-columns: 1fr 1fr; }
35
+ .zs-address-row--3 { grid-template-columns: 2fr 1fr 1fr; }
36
+ .zs-address-mini-label {
37
+ font-size: 11px; color: var(--zs-text-muted);
38
+ margin-bottom: 2px; text-transform: uppercase; letter-spacing: 0.3px;
39
+ }
40
+ `]; }
41
+ handleChange(subfield, e) {
42
+ const input = e.target;
43
+ const newValue = { ...this.value, [subfield]: input.value };
44
+ this.dispatchEvent(new CustomEvent('field-change', {
45
+ detail: { fieldId: this.fieldId, value: newValue },
46
+ bubbles: true, composed: true,
47
+ }));
48
+ }
49
+ render() {
50
+ const hasError = this.errors.length > 0;
51
+ const labelClass = `zs-label ${this.required ? 'zs-label--required' : ''}`;
52
+ const inputClass = `zs-input ${hasError ? 'zs-input--error' : ''}`;
53
+ return html `
54
+ <div class="zs-field">
55
+ ${this.label ? html `<label class="${labelClass}">${this.label}</label>` : ''}
56
+ <div class="zs-address-grid">
57
+ <div>
58
+ <div class="zs-address-mini-label">Direccion</div>
59
+ <input class="${inputClass}" .value="${this.value.street ?? ''}"
60
+ placeholder="Calle, numero, piso"
61
+ ?disabled="${this.disabled}" ?readonly="${this.readOnly}"
62
+ @input="${(e) => this.handleChange('street', e)}" />
63
+ </div>
64
+ <div class="zs-address-row zs-address-row--3">
65
+ <div>
66
+ <div class="zs-address-mini-label">Ciudad</div>
67
+ <input class="${inputClass}" .value="${this.value.city ?? ''}"
68
+ placeholder="Ciudad"
69
+ ?disabled="${this.disabled}" ?readonly="${this.readOnly}"
70
+ @input="${(e) => this.handleChange('city', e)}" />
71
+ </div>
72
+ <div>
73
+ <div class="zs-address-mini-label">Estado/Provincia</div>
74
+ <input class="${inputClass}" .value="${this.value.state ?? ''}"
75
+ placeholder="Estado"
76
+ ?disabled="${this.disabled}" ?readonly="${this.readOnly}"
77
+ @input="${(e) => this.handleChange('state', e)}" />
78
+ </div>
79
+ <div>
80
+ <div class="zs-address-mini-label">C.P.</div>
81
+ <input class="${inputClass}" .value="${this.value.zip ?? ''}"
82
+ placeholder="Codigo postal"
83
+ ?disabled="${this.disabled}" ?readonly="${this.readOnly}"
84
+ @input="${(e) => this.handleChange('zip', e)}" />
85
+ </div>
86
+ </div>
87
+ <div>
88
+ <div class="zs-address-mini-label">Pais</div>
89
+ <input class="${inputClass}" .value="${this.value.country ?? ''}"
90
+ placeholder="Pais"
91
+ ?disabled="${this.disabled}" ?readonly="${this.readOnly}"
92
+ @input="${(e) => this.handleChange('country', e)}" />
93
+ </div>
94
+ </div>
95
+ ${hasError ? html `<span class="zs-error">${this.errors[0]}</span>` : ''}
96
+ ${this.helpText && !hasError ? html `<span class="zs-help">${this.helpText}</span>` : ''}
97
+ </div>
98
+ `;
99
+ }
100
+ };
101
+ __decorate([
102
+ property()
103
+ ], ZsFieldAddress.prototype, "fieldId", void 0);
104
+ __decorate([
105
+ property()
106
+ ], ZsFieldAddress.prototype, "label", void 0);
107
+ __decorate([
108
+ property()
109
+ ], ZsFieldAddress.prototype, "helpText", void 0);
110
+ __decorate([
111
+ property({ type: Object })
112
+ ], ZsFieldAddress.prototype, "value", void 0);
113
+ __decorate([
114
+ property({ type: Boolean })
115
+ ], ZsFieldAddress.prototype, "required", void 0);
116
+ __decorate([
117
+ property({ type: Boolean })
118
+ ], ZsFieldAddress.prototype, "disabled", void 0);
119
+ __decorate([
120
+ property({ type: Boolean })
121
+ ], ZsFieldAddress.prototype, "readOnly", void 0);
122
+ __decorate([
123
+ property({ type: Array })
124
+ ], ZsFieldAddress.prototype, "errors", void 0);
125
+ ZsFieldAddress = __decorate([
126
+ customElement('zs-field-address')
127
+ ], ZsFieldAddress);
128
+ export { ZsFieldAddress };
129
+ //# sourceMappingURL=zs-field-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zs-field-address.js","sourceRoot":"","sources":["../../src/fields/zs-field-address.ts"],"names":[],"mappings":"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"}