@squaredr/fieldcraft-pro 1.7.0 → 1.9.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 (33) hide show
  1. package/LICENSE.txt +51 -51
  2. package/README.md +139 -139
  3. package/dist/{chunk-VEP3DOCQ.mjs → chunk-5QXKDYWY.mjs} +103 -19
  4. package/dist/{chunk-GZIV2XAD.mjs → chunk-7GPX3YIB.mjs} +146 -183
  5. package/dist/{chunk-J5V6OVZO.mjs → chunk-DWRLPGX5.mjs} +690 -211
  6. package/dist/{chunk-4TN6YJDF.mjs → chunk-KTIU7VCP.mjs} +971 -214
  7. package/dist/default-schema-BGxf9Jrg.d.ts +174 -0
  8. package/dist/default-schema-Bwq8FATF.d.mts +174 -0
  9. package/dist/form-builder/index.d.mts +14 -170
  10. package/dist/form-builder/index.d.ts +14 -170
  11. package/dist/form-builder/index.js +827 -326
  12. package/dist/form-builder/index.mjs +1 -1
  13. package/dist/index.d.mts +111 -10
  14. package/dist/index.d.ts +111 -10
  15. package/dist/index.js +3525 -971
  16. package/dist/index.mjs +1424 -124
  17. package/dist/response-viewer/index.d.mts +1 -1
  18. package/dist/response-viewer/index.d.ts +1 -1
  19. package/dist/response-viewer/index.js +146 -183
  20. package/dist/response-viewer/index.mjs +1 -1
  21. package/dist/styles.css +2 -2
  22. package/dist/templates/index.d.mts +1 -1
  23. package/dist/templates/index.d.ts +1 -1
  24. package/dist/templates/index.js +103 -19
  25. package/dist/templates/index.mjs +1 -1
  26. package/dist/theme-editor/index.d.mts +12 -7
  27. package/dist/theme-editor/index.d.ts +12 -7
  28. package/dist/theme-editor/index.js +971 -214
  29. package/dist/theme-editor/index.mjs +1 -1
  30. package/dist/{types-bFHsZT1n.d.mts → types-BQOeI3LX.d.mts} +1 -1
  31. package/dist/{types-bFHsZT1n.d.ts → types-BQOeI3LX.d.ts} +1 -1
  32. package/package.json +29 -18
  33. package/theme-editor/styles.css +497 -466
@@ -1,466 +1,497 @@
1
- /* FieldCraft Pro Theme Editor
2
- Chrome theming uses shadcn variable names (--background, --foreground, etc.)
3
- matching FormBuilder and ResponseViewer for consistent host page inheritance.
4
-
5
- 1. ThemeEditorThemeProvider wraps children in <div data-fcte-root="" style={cssVars}>
6
- 2. --fcte-* variables reference shadcn vars via var(--shadcn-var, fallback)
7
- 3. Host page :root variables naturally cascade through
8
- 4. Provider inline styles override everything when a theme prop is passed
9
- 5. All editor chrome references var(--fcte-*) — fully themeable
10
- */
11
-
12
- /* ─── Provider root ─────────────────────────────────────────────── */
13
- .fcte-provider-root {
14
- width: 100%;
15
- height: 100%;
16
- }
17
-
18
- /* ─── Default theme variables ──────────────────────────────────── */
19
- /* References shadcn variable names so the chrome inherits from any
20
- host page that defines --background, --foreground, --card, etc.
21
- Fallback values are Drafting Teal light defaults. */
22
- [data-fcte-root] {
23
- --fcte-bg: var(--background, #F4F7F8);
24
- --fcte-surface: var(--card, #FFFFFF);
25
- --fcte-surface-hover: var(--accent, #EDF3F2);
26
- --fcte-text: var(--foreground, #12222A);
27
- --fcte-text-muted: var(--muted-foreground, #6A7B85);
28
- --fcte-text-dim: var(--muted-foreground, #96A5AD);
29
- --fcte-border: var(--border, #DCE4E8);
30
- --fcte-border-strong: var(--border, #B9D1CF);
31
- --fcte-input-bg: var(--card, #FAFCFC);
32
- --fcte-accent: var(--primary, #1F6B6E);
33
- --fcte-accent-text: var(--primary-foreground, #FFFFFF);
34
- }
35
-
36
- /* ─── Root element ──────────────────────────────────────────────── */
37
- .fcte-root {
38
- display: flex;
39
- flex-direction: column;
40
- font-family: system-ui, -apple-system, sans-serif;
41
- font-size: 13px;
42
- color: var(--fcte-text);
43
- background: var(--fcte-bg);
44
- overflow: hidden;
45
- }
46
-
47
- /* ─── Toolbar ───────────────────────────────────────────────────── */
48
- .fcte-toolbar {
49
- display: flex;
50
- align-items: center;
51
- justify-content: space-between;
52
- padding: 8px 12px;
53
- border-bottom: 1px solid var(--fcte-border);
54
- background: var(--fcte-surface);
55
- gap: 8px;
56
- flex-shrink: 0;
57
- }
58
-
59
- .fcte-toolbar__left {
60
- display: flex;
61
- align-items: center;
62
- gap: 12px;
63
- }
64
-
65
- .fcte-toolbar__right {
66
- display: flex;
67
- align-items: center;
68
- gap: 8px;
69
- }
70
-
71
- .fcte-toolbar__title {
72
- font-weight: 600;
73
- font-size: 14px;
74
- white-space: nowrap;
75
- }
76
-
77
- .fcte-toolbar__preset {
78
- padding: 4px 8px;
79
- border-radius: 0;
80
- border: 1px solid var(--fcte-border-strong);
81
- background: var(--fcte-input-bg);
82
- color: var(--fcte-text);
83
- font-size: 12px;
84
- cursor: pointer;
85
- }
86
-
87
- /* ─── Buttons ───────────────────────────────────────────────────── */
88
- .fcte-btn {
89
- padding: 5px 12px;
90
- border-radius: 0;
91
- border: none;
92
- font-size: 12px;
93
- font-weight: 500;
94
- cursor: pointer;
95
- white-space: nowrap;
96
- }
97
-
98
- .fcte-btn--primary {
99
- background: var(--fcte-accent);
100
- color: var(--fcte-accent-text);
101
- }
102
-
103
- .fcte-btn--primary:hover {
104
- opacity: 0.9;
105
- }
106
-
107
- .fcte-btn--secondary {
108
- background: var(--fcte-input-bg);
109
- color: var(--fcte-text);
110
- border: 1px solid var(--fcte-border-strong);
111
- }
112
-
113
- .fcte-btn--secondary:hover {
114
- background: var(--fcte-surface-hover);
115
- }
116
-
117
- .fcte-btn--sm {
118
- padding: 3px 8px;
119
- font-size: 11px;
120
- }
121
-
122
- /* ─── Body split ────────────────────────────────────────────────── */
123
- .fcte-body {
124
- display: flex;
125
- flex: 1;
126
- min-height: 0;
127
- overflow: hidden;
128
- }
129
-
130
- /* ─── Editor panel ──────────────────────────────────────────────── */
131
- .fcte-editor {
132
- width: 320px;
133
- min-width: 280px;
134
- display: flex;
135
- flex-direction: column;
136
- border-right: 1px solid var(--fcte-border);
137
- background: var(--fcte-surface);
138
- }
139
-
140
- /* ─── Section selector dropdown ─────────────────────────────────── */
141
- .fcte-section-select {
142
- padding: 8px 12px;
143
- border-bottom: 1px solid var(--fcte-border);
144
- flex-shrink: 0;
145
- }
146
-
147
- .fcte-section-select .fcte-field__select {
148
- font-weight: 600;
149
- font-size: 13px;
150
- }
151
-
152
- /* ─── Fields area ───────────────────────────────────────────────── */
153
- .fcte-fields {
154
- flex: 1;
155
- overflow-y: auto;
156
- padding: 12px;
157
- display: flex;
158
- flex-direction: column;
159
- gap: 10px;
160
- }
161
-
162
- /* ─── Individual field ──────────────────────────────────────────── */
163
- .fcte-field {
164
- display: flex;
165
- flex-direction: column;
166
- gap: 4px;
167
- }
168
-
169
- .fcte-field__label {
170
- font-size: 11px;
171
- font-weight: 500;
172
- color: var(--fcte-text-muted);
173
- text-transform: uppercase;
174
- letter-spacing: 0.03em;
175
- }
176
-
177
- .fcte-field__color-row {
178
- display: flex;
179
- align-items: center;
180
- gap: 6px;
181
- }
182
-
183
- .fcte-field__swatch {
184
- width: 28px;
185
- height: 28px;
186
- border: 1px solid var(--fcte-border-strong);
187
- border-radius: 0;
188
- padding: 0;
189
- cursor: pointer;
190
- background: none;
191
- flex-shrink: 0;
192
- }
193
-
194
- .fcte-field__swatch::-webkit-color-swatch-wrapper {
195
- padding: 2px;
196
- }
197
-
198
- .fcte-field__swatch::-webkit-color-swatch {
199
- border: none;
200
- border-radius: 0;
201
- }
202
-
203
- .fcte-field__text,
204
- .fcte-field__select,
205
- .fcte-field__number {
206
- padding: 5px 8px;
207
- border-radius: 0;
208
- border: 1px solid var(--fcte-border-strong);
209
- background: var(--fcte-input-bg);
210
- color: var(--fcte-text);
211
- font-size: 12px;
212
- font-family: inherit;
213
- width: 100%;
214
- box-sizing: border-box;
215
- }
216
-
217
- .fcte-field__text:focus,
218
- .fcte-field__select:focus,
219
- .fcte-field__number:focus {
220
- outline: none;
221
- border-color: var(--fcte-accent);
222
- }
223
-
224
- .fcte-field__number-row {
225
- display: flex;
226
- align-items: center;
227
- gap: 4px;
228
- }
229
-
230
- .fcte-field__number-row .fcte-field__number {
231
- width: 80px;
232
- flex-shrink: 0;
233
- }
234
-
235
- .fcte-field__suffix {
236
- font-size: 11px;
237
- color: var(--fcte-text-dim);
238
- }
239
-
240
- /* ─── Preview panel ─────────────────────────────────────────────── */
241
- .fcte-preview {
242
- flex: 1;
243
- overflow: auto;
244
- background: var(--fcte-bg);
245
- }
246
-
247
- .fcte-preview__inner {
248
- padding: 24px;
249
- min-height: 100%;
250
- }
251
-
252
- /* ─── Palette Generator ─────────────────────────────────────────── */
253
- .fcte-palette {
254
- border-bottom: 1px solid var(--fcte-border);
255
- background: var(--fcte-surface);
256
- }
257
-
258
- .fcte-palette__header {
259
- display: flex;
260
- align-items: center;
261
- justify-content: space-between;
262
- padding: 8px 12px;
263
- border-bottom: 1px solid var(--fcte-border);
264
- }
265
-
266
- .fcte-palette__title {
267
- font-size: 12px;
268
- font-weight: 600;
269
- }
270
-
271
- .fcte-palette__body {
272
- padding: 12px;
273
- display: flex;
274
- flex-direction: column;
275
- gap: 12px;
276
- }
277
-
278
- .fcte-palette__picker {
279
- display: flex;
280
- flex-direction: column;
281
- gap: 4px;
282
- }
283
-
284
- .fcte-palette__label {
285
- font-size: 11px;
286
- font-weight: 500;
287
- color: var(--fcte-text-muted);
288
- text-transform: uppercase;
289
- letter-spacing: 0.03em;
290
- }
291
-
292
- .fcte-palette__input-row {
293
- display: flex;
294
- align-items: center;
295
- gap: 6px;
296
- }
297
-
298
- .fcte-palette__input-row .fcte-field__text {
299
- width: 120px;
300
- }
301
-
302
- .fcte-palette__swatches {
303
- display: flex;
304
- flex-wrap: wrap;
305
- gap: 8px;
306
- }
307
-
308
- .fcte-palette__swatch {
309
- display: flex;
310
- flex-direction: column;
311
- align-items: center;
312
- gap: 3px;
313
- width: 56px;
314
- }
315
-
316
- .fcte-palette__swatch-color {
317
- width: 40px;
318
- height: 28px;
319
- border-radius: 0;
320
- border: 1px solid var(--fcte-border-strong);
321
- }
322
-
323
- .fcte-palette__swatch-label {
324
- font-size: 10px;
325
- color: var(--fcte-text-muted);
326
- text-align: center;
327
- }
328
-
329
- .fcte-palette__swatch-hex {
330
- font-size: 9px;
331
- color: var(--fcte-text-dim);
332
- font-family: monospace;
333
- }
334
-
335
- /* ─── Theme Comparison ──────────────────────────────────────────── */
336
- .fcte-compare {
337
- flex: 1;
338
- display: flex;
339
- flex-direction: column;
340
- min-height: 0;
341
- overflow: hidden;
342
- }
343
-
344
- .fcte-compare__header {
345
- display: flex;
346
- align-items: center;
347
- justify-content: space-between;
348
- padding: 8px 12px;
349
- border-bottom: 1px solid var(--fcte-border);
350
- background: var(--fcte-surface);
351
- flex-shrink: 0;
352
- }
353
-
354
- .fcte-compare__title {
355
- font-size: 12px;
356
- font-weight: 600;
357
- }
358
-
359
- .fcte-compare__controls {
360
- display: flex;
361
- align-items: center;
362
- gap: 8px;
363
- }
364
-
365
- .fcte-compare__label {
366
- font-size: 11px;
367
- color: var(--fcte-text-muted);
368
- }
369
-
370
- .fcte-compare__diffs {
371
- padding: 8px 12px;
372
- border-bottom: 1px solid var(--fcte-border);
373
- background: var(--fcte-surface);
374
- flex-shrink: 0;
375
- }
376
-
377
- .fcte-compare__diff-count {
378
- font-size: 11px;
379
- font-weight: 600;
380
- color: var(--fcte-text-muted);
381
- display: block;
382
- margin-bottom: 6px;
383
- }
384
-
385
- .fcte-compare__diff-list {
386
- display: flex;
387
- flex-wrap: wrap;
388
- gap: 6px;
389
- }
390
-
391
- .fcte-compare__diff-item {
392
- display: flex;
393
- align-items: center;
394
- gap: 4px;
395
- padding: 2px 6px;
396
- border-radius: 0;
397
- background: var(--fcte-input-bg);
398
- border: 1px solid var(--fcte-border);
399
- font-size: 10px;
400
- }
401
-
402
- .fcte-compare__diff-label {
403
- color: var(--fcte-text-muted);
404
- font-size: 10px;
405
- }
406
-
407
- .fcte-compare__diff-swatches {
408
- display: flex;
409
- align-items: center;
410
- gap: 2px;
411
- }
412
-
413
- .fcte-compare__diff-swatch {
414
- width: 14px;
415
- height: 14px;
416
- border-radius: 0;
417
- border: 1px solid var(--fcte-border-strong);
418
- }
419
-
420
- .fcte-compare__diff-arrow {
421
- font-size: 9px;
422
- color: var(--fcte-text-dim);
423
- }
424
-
425
- .fcte-compare__diff-more {
426
- font-size: 10px;
427
- color: var(--fcte-text-dim);
428
- align-self: center;
429
- }
430
-
431
- .fcte-compare__panels {
432
- display: flex;
433
- flex: 1;
434
- min-height: 0;
435
- overflow: hidden;
436
- }
437
-
438
- .fcte-compare__panel {
439
- flex: 1;
440
- display: flex;
441
- flex-direction: column;
442
- min-width: 0;
443
- overflow: hidden;
444
- }
445
-
446
- .fcte-compare__panel + .fcte-compare__panel {
447
- border-left: 1px solid var(--fcte-border);
448
- }
449
-
450
- .fcte-compare__panel-label {
451
- padding: 6px 12px;
452
- font-size: 11px;
453
- font-weight: 600;
454
- color: var(--fcte-text-muted);
455
- text-transform: uppercase;
456
- letter-spacing: 0.03em;
457
- border-bottom: 1px solid var(--fcte-border);
458
- background: var(--fcte-surface);
459
- flex-shrink: 0;
460
- }
461
-
462
- .fcte-compare__panel-preview {
463
- flex: 1;
464
- overflow: auto;
465
- padding: 16px;
466
- }
1
+ /* FieldCraft Pro Theme Editor
2
+ Chrome theming uses shadcn variable names (--background, --foreground, etc.)
3
+ matching FormBuilder and ResponseViewer for consistent host page inheritance.
4
+
5
+ 1. ThemeEditorThemeProvider wraps children in <div data-fcte-root="" style={cssVars}>
6
+ 2. --fcte-* variables reference shadcn vars via var(--shadcn-var, fallback)
7
+ 3. Host page :root variables naturally cascade through
8
+ 4. Provider inline styles override everything when a theme prop is passed
9
+ 5. All editor chrome references var(--fcte-*) — fully themeable
10
+ */
11
+
12
+ /* ─── Provider root ─────────────────────────────────────────────── */
13
+ .fcte-provider-root {
14
+ width: 100%;
15
+ height: 100%;
16
+ }
17
+
18
+ /* ─── Default theme variables ──────────────────────────────────── */
19
+ /* References shadcn variable names so the chrome inherits from any
20
+ host page that defines --background, --foreground, --card, etc.
21
+ Fallback values are Drafting Teal light defaults. */
22
+ [data-fcte-root] {
23
+ --fcte-bg: var(--background, #F4F7F8);
24
+ --fcte-surface: var(--card, #FFFFFF);
25
+ --fcte-surface-hover: var(--accent, #EDF3F2);
26
+ --fcte-text: var(--foreground, #12222A);
27
+ --fcte-text-muted: var(--muted-foreground, #6A7B85);
28
+ --fcte-text-dim: var(--muted-foreground, #96A5AD);
29
+ --fcte-border: var(--border, #DCE4E8);
30
+ --fcte-border-strong: var(--border, #B9D1CF);
31
+ --fcte-input-bg: var(--card, #FAFCFC);
32
+ --fcte-accent: var(--primary, #1F6B6E);
33
+ --fcte-accent-text: var(--primary-foreground, #FFFFFF);
34
+ }
35
+
36
+ /* ─── Root element ──────────────────────────────────────────────── */
37
+ .fcte-root {
38
+ display: flex;
39
+ flex-direction: column;
40
+ font-family: system-ui, -apple-system, sans-serif;
41
+ font-size: 13px;
42
+ color: var(--fcte-text);
43
+ background: var(--fcte-bg);
44
+ overflow: hidden;
45
+ }
46
+
47
+ /* ─── Toolbar ───────────────────────────────────────────────────── */
48
+ .fcte-toolbar {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ padding: 8px 12px;
53
+ border-bottom: 1px solid var(--fcte-border);
54
+ background: var(--fcte-surface);
55
+ gap: 8px;
56
+ flex-shrink: 0;
57
+ }
58
+
59
+ .fcte-toolbar__left {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 12px;
63
+ }
64
+
65
+ .fcte-toolbar__right {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 8px;
69
+ }
70
+
71
+ .fcte-toolbar__title {
72
+ font-weight: 600;
73
+ font-size: 14px;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ .fcte-toolbar__preset {
78
+ padding: 4px 8px;
79
+ border-radius: 0;
80
+ border: 1px solid var(--fcte-border-strong);
81
+ background: var(--fcte-input-bg);
82
+ color: var(--fcte-text);
83
+ font-size: 12px;
84
+ cursor: pointer;
85
+ }
86
+
87
+ /* ─── Buttons ───────────────────────────────────────────────────── */
88
+ .fcte-btn {
89
+ padding: 5px 12px;
90
+ border-radius: 0;
91
+ border: none;
92
+ font-size: 12px;
93
+ font-weight: 500;
94
+ cursor: pointer;
95
+ white-space: nowrap;
96
+ }
97
+
98
+ .fcte-btn--primary {
99
+ background: var(--fcte-accent);
100
+ color: var(--fcte-accent-text);
101
+ }
102
+
103
+ .fcte-btn--primary:hover {
104
+ opacity: 0.9;
105
+ }
106
+
107
+ .fcte-btn--secondary {
108
+ background: var(--fcte-input-bg);
109
+ color: var(--fcte-text);
110
+ border: 1px solid var(--fcte-border-strong);
111
+ }
112
+
113
+ .fcte-btn--secondary:hover {
114
+ background: var(--fcte-surface-hover);
115
+ }
116
+
117
+ .fcte-btn--sm {
118
+ padding: 3px 8px;
119
+ font-size: 11px;
120
+ }
121
+
122
+ /* ─── Import error banner ──────────────────────────────────────── */
123
+ .fcte-import-error {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ padding: 6px 12px;
128
+ background: #fef2f2;
129
+ border-bottom: 1px solid #fca5a5;
130
+ color: #991b1b;
131
+ font-size: 12px;
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ .fcte-import-error__close {
136
+ background: none;
137
+ border: none;
138
+ color: #991b1b;
139
+ font-size: 16px;
140
+ cursor: pointer;
141
+ padding: 0 4px;
142
+ line-height: 1;
143
+ }
144
+
145
+ /* ─── Invalid color input ──────────────────────────────────────── */
146
+ .fcte-field__text--invalid {
147
+ border-color: #ef4444;
148
+ background: #fef2f2;
149
+ }
150
+
151
+ /* ─── Body split ────────────────────────────────────────────────── */
152
+ .fcte-body {
153
+ display: flex;
154
+ flex: 1;
155
+ min-height: 0;
156
+ overflow: hidden;
157
+ }
158
+
159
+ /* ─── Editor panel ──────────────────────────────────────────────── */
160
+ .fcte-editor {
161
+ width: 320px;
162
+ min-width: 280px;
163
+ flex-shrink: 0;
164
+ display: flex;
165
+ flex-direction: column;
166
+ border-right: 1px solid var(--fcte-border);
167
+ background: var(--fcte-surface);
168
+ overflow: hidden;
169
+ }
170
+
171
+ /* ─── Section selector dropdown ─────────────────────────────────── */
172
+ .fcte-section-select {
173
+ padding: 8px 12px;
174
+ border-bottom: 1px solid var(--fcte-border);
175
+ flex-shrink: 0;
176
+ }
177
+
178
+ .fcte-section-select .fcte-field__select {
179
+ font-weight: 600;
180
+ font-size: 13px;
181
+ }
182
+
183
+ /* ─── Fields area ───────────────────────────────────────────────── */
184
+ .fcte-fields {
185
+ flex: 1;
186
+ overflow-y: auto;
187
+ padding: 12px;
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 10px;
191
+ }
192
+
193
+ /* ─── Individual field ──────────────────────────────────────────── */
194
+ .fcte-field {
195
+ display: flex;
196
+ flex-direction: column;
197
+ gap: 4px;
198
+ }
199
+
200
+ .fcte-field__label {
201
+ font-size: 11px;
202
+ font-weight: 500;
203
+ color: var(--fcte-text-muted);
204
+ text-transform: uppercase;
205
+ letter-spacing: 0.03em;
206
+ }
207
+
208
+ .fcte-field__color-row {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 6px;
212
+ }
213
+
214
+ .fcte-field__swatch {
215
+ width: 28px;
216
+ height: 28px;
217
+ border: 1px solid var(--fcte-border-strong);
218
+ border-radius: 0;
219
+ padding: 0;
220
+ cursor: pointer;
221
+ background: none;
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .fcte-field__swatch::-webkit-color-swatch-wrapper {
226
+ padding: 2px;
227
+ }
228
+
229
+ .fcte-field__swatch::-webkit-color-swatch {
230
+ border: none;
231
+ border-radius: 0;
232
+ }
233
+
234
+ .fcte-field__text,
235
+ .fcte-field__select,
236
+ .fcte-field__number {
237
+ padding: 5px 8px;
238
+ border-radius: 0;
239
+ border: 1px solid var(--fcte-border-strong);
240
+ background: var(--fcte-input-bg);
241
+ color: var(--fcte-text);
242
+ font-size: 12px;
243
+ font-family: inherit;
244
+ width: 100%;
245
+ box-sizing: border-box;
246
+ }
247
+
248
+ .fcte-field__text:focus,
249
+ .fcte-field__select:focus,
250
+ .fcte-field__number:focus {
251
+ outline: none;
252
+ border-color: var(--fcte-accent);
253
+ }
254
+
255
+ .fcte-field__number-row {
256
+ display: flex;
257
+ align-items: center;
258
+ gap: 4px;
259
+ }
260
+
261
+ .fcte-field__number-row .fcte-field__number {
262
+ width: 80px;
263
+ flex-shrink: 0;
264
+ }
265
+
266
+ .fcte-field__suffix {
267
+ font-size: 11px;
268
+ color: var(--fcte-text-dim);
269
+ }
270
+
271
+ /* ─── Preview panel ─────────────────────────────────────────────── */
272
+ .fcte-preview {
273
+ flex: 1;
274
+ overflow: auto;
275
+ background: var(--fcte-bg);
276
+ }
277
+
278
+ .fcte-preview__inner {
279
+ padding: 24px;
280
+ min-height: 100%;
281
+ }
282
+
283
+ /* ─── Palette Generator ─────────────────────────────────────────── */
284
+ .fcte-palette {
285
+ border-bottom: 1px solid var(--fcte-border);
286
+ background: var(--fcte-surface);
287
+ }
288
+
289
+ .fcte-palette__header {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: space-between;
293
+ padding: 8px 12px;
294
+ border-bottom: 1px solid var(--fcte-border);
295
+ }
296
+
297
+ .fcte-palette__title {
298
+ font-size: 12px;
299
+ font-weight: 600;
300
+ }
301
+
302
+ .fcte-palette__body {
303
+ padding: 12px;
304
+ display: flex;
305
+ flex-direction: column;
306
+ gap: 12px;
307
+ }
308
+
309
+ .fcte-palette__picker {
310
+ display: flex;
311
+ flex-direction: column;
312
+ gap: 4px;
313
+ }
314
+
315
+ .fcte-palette__label {
316
+ font-size: 11px;
317
+ font-weight: 500;
318
+ color: var(--fcte-text-muted);
319
+ text-transform: uppercase;
320
+ letter-spacing: 0.03em;
321
+ }
322
+
323
+ .fcte-palette__input-row {
324
+ display: flex;
325
+ align-items: center;
326
+ gap: 6px;
327
+ }
328
+
329
+ .fcte-palette__input-row .fcte-field__text {
330
+ width: 120px;
331
+ }
332
+
333
+ .fcte-palette__swatches {
334
+ display: flex;
335
+ flex-wrap: wrap;
336
+ gap: 8px;
337
+ }
338
+
339
+ .fcte-palette__swatch {
340
+ display: flex;
341
+ flex-direction: column;
342
+ align-items: center;
343
+ gap: 3px;
344
+ width: 56px;
345
+ }
346
+
347
+ .fcte-palette__swatch-color {
348
+ width: 40px;
349
+ height: 28px;
350
+ border-radius: 0;
351
+ border: 1px solid var(--fcte-border-strong);
352
+ }
353
+
354
+ .fcte-palette__swatch-label {
355
+ font-size: 10px;
356
+ color: var(--fcte-text-muted);
357
+ text-align: center;
358
+ }
359
+
360
+ .fcte-palette__swatch-hex {
361
+ font-size: 9px;
362
+ color: var(--fcte-text-dim);
363
+ font-family: monospace;
364
+ }
365
+
366
+ /* ─── Theme Comparison ──────────────────────────────────────────── */
367
+ .fcte-compare {
368
+ flex: 1;
369
+ display: flex;
370
+ flex-direction: column;
371
+ min-height: 0;
372
+ overflow: hidden;
373
+ }
374
+
375
+ .fcte-compare__header {
376
+ display: flex;
377
+ align-items: center;
378
+ justify-content: space-between;
379
+ padding: 8px 12px;
380
+ border-bottom: 1px solid var(--fcte-border);
381
+ background: var(--fcte-surface);
382
+ flex-shrink: 0;
383
+ }
384
+
385
+ .fcte-compare__title {
386
+ font-size: 12px;
387
+ font-weight: 600;
388
+ }
389
+
390
+ .fcte-compare__controls {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 8px;
394
+ }
395
+
396
+ .fcte-compare__label {
397
+ font-size: 11px;
398
+ color: var(--fcte-text-muted);
399
+ }
400
+
401
+ .fcte-compare__diffs {
402
+ padding: 8px 12px;
403
+ border-bottom: 1px solid var(--fcte-border);
404
+ background: var(--fcte-surface);
405
+ flex-shrink: 0;
406
+ }
407
+
408
+ .fcte-compare__diff-count {
409
+ font-size: 11px;
410
+ font-weight: 600;
411
+ color: var(--fcte-text-muted);
412
+ display: block;
413
+ margin-bottom: 6px;
414
+ }
415
+
416
+ .fcte-compare__diff-list {
417
+ display: flex;
418
+ flex-wrap: wrap;
419
+ gap: 6px;
420
+ }
421
+
422
+ .fcte-compare__diff-item {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 4px;
426
+ padding: 2px 6px;
427
+ border-radius: 0;
428
+ background: var(--fcte-input-bg);
429
+ border: 1px solid var(--fcte-border);
430
+ font-size: 10px;
431
+ }
432
+
433
+ .fcte-compare__diff-label {
434
+ color: var(--fcte-text-muted);
435
+ font-size: 10px;
436
+ }
437
+
438
+ .fcte-compare__diff-swatches {
439
+ display: flex;
440
+ align-items: center;
441
+ gap: 2px;
442
+ }
443
+
444
+ .fcte-compare__diff-swatch {
445
+ width: 14px;
446
+ height: 14px;
447
+ border-radius: 0;
448
+ border: 1px solid var(--fcte-border-strong);
449
+ }
450
+
451
+ .fcte-compare__diff-arrow {
452
+ font-size: 9px;
453
+ color: var(--fcte-text-dim);
454
+ }
455
+
456
+ .fcte-compare__diff-more {
457
+ font-size: 10px;
458
+ color: var(--fcte-text-dim);
459
+ align-self: center;
460
+ }
461
+
462
+ .fcte-compare__panels {
463
+ display: flex;
464
+ flex: 1;
465
+ min-height: 0;
466
+ overflow: hidden;
467
+ }
468
+
469
+ .fcte-compare__panel {
470
+ flex: 1;
471
+ display: flex;
472
+ flex-direction: column;
473
+ min-width: 0;
474
+ overflow: hidden;
475
+ }
476
+
477
+ .fcte-compare__panel + .fcte-compare__panel {
478
+ border-left: 1px solid var(--fcte-border);
479
+ }
480
+
481
+ .fcte-compare__panel-label {
482
+ padding: 6px 12px;
483
+ font-size: 11px;
484
+ font-weight: 600;
485
+ color: var(--fcte-text-muted);
486
+ text-transform: uppercase;
487
+ letter-spacing: 0.03em;
488
+ border-bottom: 1px solid var(--fcte-border);
489
+ background: var(--fcte-surface);
490
+ flex-shrink: 0;
491
+ }
492
+
493
+ .fcte-compare__panel-preview {
494
+ flex: 1;
495
+ overflow: auto;
496
+ padding: 16px;
497
+ }