commons-shared-web-ui 0.0.39 → 0.0.40

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 (29) hide show
  1. package/fesm2022/commons-shared-web-ui.mjs +1522 -1332
  2. package/fesm2022/commons-shared-web-ui.mjs.map +1 -1
  3. package/index.d.ts +56 -4
  4. package/package.json +1 -1
  5. package/src/lib/modules/alert/alert.theme.scss +84 -84
  6. package/src/lib/modules/button/button.theme.scss +120 -120
  7. package/src/lib/modules/configurable-form/configurable-form.theme.scss +77 -77
  8. package/src/lib/modules/confirmation-modal/confirmation-modal.theme.scss +86 -86
  9. package/src/lib/modules/filter/filter.theme.scss +91 -91
  10. package/src/lib/modules/filter-sidebar/filter-sidebar.theme.scss +37 -37
  11. package/src/lib/modules/filter-table-selector/filter-table-selector.theme.scss +36 -36
  12. package/src/lib/modules/form-builder/form-builder.theme.scss +212 -212
  13. package/src/lib/modules/form-components/components/checkbox/_theme.scss +62 -62
  14. package/src/lib/modules/form-components/components/datepicker/_theme.scss +81 -81
  15. package/src/lib/modules/form-components/components/dropdown/_theme.scss +90 -90
  16. package/src/lib/modules/form-components/components/input/_theme.scss +76 -76
  17. package/src/lib/modules/form-components/components/radio/_theme.scss +60 -60
  18. package/src/lib/modules/form-components/components/search/_theme.scss +72 -72
  19. package/src/lib/modules/form-components/components/toggle/_theme.scss +44 -44
  20. package/src/lib/modules/form-components/form-components.theme.scss +24 -24
  21. package/src/lib/modules/nav/nav.theme.scss +86 -86
  22. package/src/lib/modules/pagination/pagination.theme.scss +66 -66
  23. package/src/lib/modules/side-nav/side-nav.theme.scss +111 -111
  24. package/src/lib/modules/smart-form/smart-form.theme.scss +889 -889
  25. package/src/lib/modules/smart-table/smart-table.theme.scss +335 -323
  26. package/src/lib/modules/snackbar/snackbar.theme.scss +93 -93
  27. package/src/lib/modules/summary-card/summary-card.theme.scss +175 -175
  28. package/src/lib/styles/global.scss +151 -134
  29. package/src/lib/styles/utilities.scss +250 -250
@@ -1,890 +1,890 @@
1
- @use 'sass:map';
2
-
3
- // ─────────────────────────────────────────────────────────────────────────────
4
- // Smart Form Theme
5
- // Prefix: --cc-sf-
6
- // Two built-in configs supplied:
7
- // $default-smart-form-config → Theme 1 · Clean & Professional (light)
8
- // $theme-2-smart-form-config → Theme 2 · Vibrant & Modern (dark)
9
- // ─────────────────────────────────────────────────────────────────────────────
10
-
11
- // ── Theme 1 — Clean & Professional (default) ─────────────────────────────────
12
- $default-smart-form-config: (
13
- // Typography
14
- font-family: ('Inter', 'Segoe UI', sans-serif),
15
- font-size-base: 0.875rem,
16
-
17
- // ── Accent colour (flows from app primary; replaces hard-coded blue) ────────
18
- accent-color: #3B82F6,
19
- selected-color: #3B82F6,
20
-
21
- // ── Form container ──────────────────────────────────────────────────────────
22
- form-bg: #ffffff,
23
- form-padding: 24px,
24
- form-border-radius: 12px,
25
- form-border: none,
26
- form-shadow: 0 1px 3px rgba(0, 0, 0, 0.06),
27
- form-max-width: 1200px,
28
- form-section-gap: 24px,
29
-
30
- // ── Form header (title + description) ──────────────────────────────────────
31
- form-title-size: 1.5rem,
32
- form-title-weight: 700,
33
- form-title-color: #111827,
34
- form-desc-size: 0.875rem,
35
- form-desc-color: #6B7280,
36
-
37
- // ── Section / GROUP — flat layout (no card shell) ───────────────────────────
38
- section-bg: #ffffff,
39
- section-border: 1px solid #E5E7EB,
40
- section-radius: 10px,
41
- section-padding: 20px,
42
- section-shadow: 0 1px 4px rgba(0, 0, 0, 0.05),
43
- section-gap: 20px,
44
-
45
- section-label-size: 1rem,
46
- section-label-weight: 600,
47
- section-label-color: #1F2937,
48
- section-label-border: 2px solid #E5E7EB,
49
-
50
- // ── Section heading left-accent bar ─────────────────────────────────────────
51
- section-header-accent-width: 4px,
52
- section-header-accent-color: #3B82F6,
53
- section-header-bg: #F9FAFB,
54
-
55
- // ── Repeater accordion ──────────────────────────────────────────────────────
56
- repeater-accordion-header-bg: #F9FAFB,
57
- repeater-accordion-header-color: #1F2937,
58
- repeater-accordion-active-bg: #EFF6FF,
59
- repeater-badge-bg: #E5E7EB,
60
- repeater-badge-color: #374151,
61
- section-border-radius-inner: 8px,
62
-
63
- // ── GROUP repeater instance card ────────────────────────────────────────────
64
- instance-bg: #F9FAFB,
65
- instance-border: 1px solid #E5E7EB,
66
- instance-radius: 8px,
67
- instance-padding: 16px,
68
- instance-divider: 1px dashed #D1D5DB,
69
- instance-num-color: #4B5563,
70
- instance-num-size: 0.8125rem,
71
-
72
- // ── Grid gap + field gap ─────────────────────────────────────────────────────
73
- grid-gap: 16px,
74
- field-gap: 6px,
75
-
76
- // ── Focus ring ──────────────────────────────────────────────────────────────
77
- focus-ring-width: 3px,
78
- focus-ring-offset: 0,
79
-
80
- // ── Field label ─────────────────────────────────────────────────────────────
81
- label-size: 0.875rem,
82
- label-weight: 500,
83
- label-color: #111827,
84
- label-required-color: #DC2626,
85
-
86
- // ── Input ───────────────────────────────────────────────────────────────────
87
- input-bg: #ffffff,
88
- input-color: #111827,
89
- input-placeholder: #9CA3AF,
90
- input-border: 1.5px solid #D1D5DB,
91
- input-radius: 8px,
92
- input-padding: 0.625rem 0.875rem,
93
- input-font-size: 0.875rem,
94
- input-shadow: none,
95
-
96
- input-hover-border: #9CA3AF,
97
- input-focus-border: #3B82F6,
98
- input-focus-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12),
99
- input-transition: all 0.2s ease,
100
-
101
- input-disabled-bg: #F3F4F6,
102
- input-disabled-color: #6B7280,
103
- input-disabled-border:#E5E7EB,
104
-
105
- // ── Error state ─────────────────────────────────────────────────────────────
106
- error-border: #DC2626,
107
- error-bg: #FEF2F2,
108
- error-focus-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1),
109
- error-text-color: #DC2626,
110
- error-text-size: 0.75rem,
111
-
112
- // ── Hint / helper text ──────────────────────────────────────────────────────
113
- hint-color: #6B7280,
114
- hint-size: 0.75rem,
115
-
116
- // ── Chip ────────────────────────────────────────────────────────────────────
117
- chip-border: 1px solid #D1D5DB,
118
- chip-radius: 20px,
119
- chip-padding: 6px 14px,
120
- chip-bg: #ffffff,
121
- chip-color: #374151,
122
- chip-hover-bg: #F3F4F6,
123
- chip-selected-bg: #3B82F6,
124
- chip-selected-color: #ffffff,
125
- chip-selected-border: #3B82F6,
126
-
127
- // ── Switch ──────────────────────────────────────────────────────────────────
128
- switch-track-off: #D1D5DB,
129
- switch-track-on: #3B82F6,
130
- switch-thumb: #ffffff,
131
-
132
- // ── Rating stars ────────────────────────────────────────────────────────────
133
- star-empty: #D1D5DB,
134
- star-filled: #F59E0B,
135
- star-size: 28px,
136
-
137
- // ── Generated (read-only) field ─────────────────────────────────────────────
138
- generated-bg: #F3F4F6,
139
- generated-border: 1px solid #E5E7EB,
140
- generated-color: #6B7280,
141
- generated-radius: 8px,
142
- generated-padding: 0.625rem 0.875rem,
143
-
144
- // ── File upload drop-zone ───────────────────────────────────────────────────
145
- dropzone-bg: #F8FAFC,
146
- dropzone-border: 1.5px dashed #CBD5E1,
147
- dropzone-radius: 12px,
148
- dropzone-hover-bg: #EFF6FF,
149
- dropzone-hover-border:#93C5FD,
150
- dropzone-over-border: #3B82F6,
151
- dropzone-over-shadow: 0 0 0 4px rgba(59, 130, 246, 0.12),
152
- dropzone-icon-color: #94A3B8,
153
- dropzone-icon-bg: rgba(59, 130, 246, 0.10),
154
- dropzone-link-color: #3B82F6,
155
- dropzone-hint-color: #64748B,
156
-
157
- uploaded-item-bg: #ffffff,
158
- uploaded-item-border: 1px solid #E2E8F0,
159
- uploaded-item-radius: 8px,
160
- uploaded-remove-color: #94A3B8,
161
- uploaded-remove-hover-bg: #FEF2F2,
162
- uploaded-remove-hover-color: #DC2626,
163
-
164
- // ── Repeater add/remove buttons ─────────────────────────────────────────────
165
- btn-add-bg: transparent,
166
- btn-add-color: #3B82F6,
167
- btn-add-border: 1px dashed #CBD5E1,
168
- btn-add-radius: 6px,
169
- btn-add-hover-bg: #EFF6FF,
170
- btn-add-hover-border: #BFDBFE,
171
-
172
- btn-remove-bg: #FFF5F5,
173
- btn-remove-color: #E53E3E,
174
- btn-remove-border: 1px solid #FED7D7,
175
- btn-remove-radius: 4px,
176
- btn-remove-hover-bg: #FED7D7,
177
-
178
- // ── Stepper navigation ──────────────────────────────────────────────────────
179
- step-connector-color: #E5E7EB,
180
- step-connector-done: #22C55E,
181
-
182
- step-number-bg: #E5E7EB,
183
- step-number-color: #6B7280,
184
- step-number-size: 40px,
185
- step-number-font-size: 0.875rem,
186
- step-number-weight: 600,
187
-
188
- step-label-size: 0.875rem,
189
- step-label-color: #6B7280,
190
- step-label-weight: 500,
191
-
192
- step-active-bg: #3B82F6,
193
- step-active-color: #ffffff,
194
- step-active-label: #1D4ED8,
195
- step-active-label-weight: 700,
196
-
197
- step-done-bg: #22C55E,
198
- step-done-color: #ffffff,
199
-
200
- // ── Form action bar (submit / previous) ─────────────────────────────────────
201
- actions-border: 1px solid #E5E7EB,
202
- actions-padding: 20px 10px 0,
203
- actions-gap: 12px,
204
-
205
- btn-primary-bg: #3B82F6,
206
- btn-primary-color: #ffffff,
207
- btn-primary-radius: 8px,
208
- btn-primary-padding: 0.625rem 1.5rem,
209
- btn-primary-hover-bg: #2563EB,
210
-
211
- btn-secondary-bg: #F3F4F6,
212
- btn-secondary-color: #374151,
213
- btn-secondary-radius: 8px,
214
- btn-secondary-padding: 0.625rem 1.5rem,
215
- btn-secondary-hover-bg: #E5E7EB,
216
-
217
- btn-font-size: 0.875rem,
218
- btn-font-weight: 600,
219
- btn-transition: all 0.2s ease,
220
- btn-disabled-opacity: 0.55,
221
-
222
- // ── Repeater button sizing ──────────────────────────────────────────────────
223
- btn-remove-padding: 0.375rem 0.75rem,
224
- btn-remove-font-size: 0.875rem,
225
- btn-remove-font-weight: 500,
226
-
227
- btn-add-padding: 0.625rem 1.5rem,
228
- btn-add-font-size: 0.875rem,
229
- btn-add-font-weight: 600,
230
-
231
- // ── Instance card polish ────────────────────────────────────────────────────
232
- stepper-connector-display: block,
233
- instance-shadow: none,
234
- instance-hover-shadow: none,
235
- instance-transition: none,
236
- instance-header-divider: none,
237
- instance-header-pb: 0px,
238
- instance-header-mb: 0px,
239
- instance-num-weight: 600,
240
-
241
- // ── Section stepper accent (top stripe + active badge) ──────────────────────
242
- section-stepper-accent: #6366F1,
243
- section-stepper-accent-end: #8B5CF6,
244
- section-stepper-active-label: #4F46E5,
245
- section-stepper-active-glow: rgba(99, 102, 241, 0.25),
246
- );
247
-
248
- // ── Theme 2 — Vibrant & Modern (dark) ────────────────────────────────────────
249
- $theme-2-smart-form-config: (
250
- // Typography
251
- font-family: ('Poppins', 'Segoe UI', sans-serif),
252
- font-size-base: 0.875rem,
253
-
254
- // ── Accent colour ───────────────────────────────────────────────────────────
255
- accent-color: #818CF8,
256
- selected-color: #818CF8,
257
-
258
- // ── Form container ──────────────────────────────────────────────────────────
259
- form-bg: #0F172A,
260
- form-padding: 28px,
261
- form-border-radius: 16px,
262
- form-border: 1px solid rgba(255, 255, 255, 0.06),
263
- form-shadow: 0 8px 32px rgba(0, 0, 0, 0.4),
264
- form-max-width: 1200px,
265
- form-section-gap: 24px,
266
-
267
- // ── Form header ─────────────────────────────────────────────────────────────
268
- form-title-size: 1.75rem,
269
- form-title-weight: 700,
270
- form-title-color: #F1F5F9,
271
- form-desc-size: 0.9rem,
272
- form-desc-color: #94A3B8,
273
-
274
- // ── Section / GROUP — flat layout ───────────────────────────────────────────
275
- section-bg: #1E293B,
276
- section-border: 1px solid rgba(255, 255, 255, 0.08),
277
- section-radius: 12px,
278
- section-padding: 22px,
279
- section-shadow: 0 4px 16px rgba(0, 0, 0, 0.3),
280
- section-gap: 20px,
281
-
282
- section-label-size: 1rem,
283
- section-label-weight: 600,
284
- section-label-color: #E2E8F0,
285
- section-label-border: 2px solid #334155,
286
-
287
- // ── Section heading left-accent bar ─────────────────────────────────────────
288
- section-header-accent-width: 4px,
289
- section-header-accent-color: #818CF8,
290
- section-header-bg: #162032,
291
-
292
- // ── Repeater accordion ──────────────────────────────────────────────────────
293
- repeater-accordion-header-bg: #162032,
294
- repeater-accordion-header-color: #E2E8F0,
295
- repeater-accordion-active-bg: rgba(129, 140, 248, 0.10),
296
- repeater-badge-bg: #334155,
297
- repeater-badge-color: #CBD5E1,
298
- section-border-radius-inner: 8px,
299
-
300
- // ── GROUP repeater instance card ────────────────────────────────────────────
301
- instance-bg: #162032,
302
- instance-border: 1px solid rgba(255, 255, 255, 0.07),
303
- instance-radius: 8px,
304
- instance-padding: 16px,
305
- instance-divider: 1px dashed #334155,
306
- instance-num-color: #94A3B8,
307
- instance-num-size: 0.8125rem,
308
-
309
- // ── Grid gap + field gap ─────────────────────────────────────────────────────
310
- grid-gap: 16px,
311
- field-gap: 6px,
312
-
313
- // ── Focus ring ──────────────────────────────────────────────────────────────
314
- focus-ring-width: 3px,
315
- focus-ring-offset: 0,
316
-
317
- // ── Field label ─────────────────────────────────────────────────────────────
318
- label-size: 0.875rem,
319
- label-weight: 500,
320
- label-color: #CBD5E1,
321
- label-required-color: #F87171,
322
-
323
- // ── Input ───────────────────────────────────────────────────────────────────
324
- input-bg: #ffffff,
325
- input-color: #0D0D0D,
326
- input-placeholder: #9CA3AF,
327
- input-border: 1.5px solid #334155,
328
- input-radius: 8px,
329
- input-padding: 0.625rem 0.875rem,
330
- input-font-size: 0.875rem,
331
- input-shadow: none,
332
-
333
- input-hover-border: #9CA3AF,
334
- input-focus-border: #39FF14,
335
- input-focus-shadow: 0 0 0 3px rgba(57, 255, 20, 0.25),
336
- input-transition: all 0.2s ease,
337
-
338
- input-disabled-bg: #1E293B,
339
- input-disabled-color: #475569,
340
- input-disabled-border:#1E293B,
341
-
342
- // ── Error state ─────────────────────────────────────────────────────────────
343
- error-border: #F87171,
344
- error-bg: rgba(248, 113, 113, 0.08),
345
- error-focus-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2),
346
- error-text-color: #F87171,
347
- error-text-size: 0.75rem,
348
-
349
- // ── Hint ────────────────────────────────────────────────────────────────────
350
- hint-color: #64748B,
351
- hint-size: 0.75rem,
352
-
353
- // ── Chip ────────────────────────────────────────────────────────────────────
354
- chip-border: 1px solid #334155,
355
- chip-radius: 20px,
356
- chip-padding: 6px 14px,
357
- chip-bg: #1E293B,
358
- chip-color: #CBD5E1,
359
- chip-hover-bg: #263548,
360
- chip-selected-bg: #818CF8,
361
- chip-selected-color: #ffffff,
362
- chip-selected-border: #818CF8,
363
-
364
- // ── Switch ──────────────────────────────────────────────────────────────────
365
- switch-track-off: #334155,
366
- switch-track-on: #818CF8,
367
- switch-thumb: #ffffff,
368
-
369
- // ── Rating stars ────────────────────────────────────────────────────────────
370
- star-empty: #334155,
371
- star-filled: #F59E0B,
372
- star-size: 28px,
373
-
374
- // ── Generated field ─────────────────────────────────────────────────────────
375
- generated-bg: #162032,
376
- generated-border: 1px solid #334155,
377
- generated-color: #64748B,
378
- generated-radius: 8px,
379
- generated-padding: 0.625rem 0.875rem,
380
-
381
- // ── File upload ─────────────────────────────────────────────────────────────
382
- dropzone-bg: #162032,
383
- dropzone-border: 1.5px dashed #334155,
384
- dropzone-radius: 12px,
385
- dropzone-hover-bg: #1a253a,
386
- dropzone-hover-border:#818CF8,
387
- dropzone-over-border: #818CF8,
388
- dropzone-over-shadow: 0 0 0 4px rgba(129, 140, 248, 0.2),
389
- dropzone-icon-color: #475569,
390
- dropzone-icon-bg: rgba(129, 140, 248, 0.12),
391
- dropzone-link-color: #818CF8,
392
- dropzone-hint-color: #64748B,
393
-
394
- uploaded-item-bg: #1E293B,
395
- uploaded-item-border: 1px solid #334155,
396
- uploaded-item-radius: 8px,
397
- uploaded-remove-color: #475569,
398
- uploaded-remove-hover-bg: rgba(248, 113, 113, 0.12),
399
- uploaded-remove-hover-color: #F87171,
400
-
401
- // ── Repeater buttons ────────────────────────────────────────────────────────
402
- btn-add-bg: transparent,
403
- btn-add-color: #818CF8,
404
- btn-add-border: 1px dashed #334155,
405
- btn-add-radius: 6px,
406
- btn-add-hover-bg: rgba(129, 140, 248, 0.08),
407
- btn-add-hover-border: #818CF8,
408
-
409
- btn-remove-bg: rgba(248, 113, 113, 0.08),
410
- btn-remove-color: #F87171,
411
- btn-remove-border: 1px solid rgba(248, 113, 113, 0.3),
412
- btn-remove-radius: 4px,
413
- btn-remove-hover-bg: rgba(248, 113, 113, 0.18),
414
-
415
- // ── Stepper ─────────────────────────────────────────────────────────────────
416
- step-connector-color: #334155,
417
- step-connector-done: #34D399,
418
-
419
- step-number-bg: #1E293B,
420
- step-number-color: #64748B,
421
- step-number-size: 40px,
422
- step-number-font-size: 0.875rem,
423
- step-number-weight: 600,
424
-
425
- step-label-size: 0.875rem,
426
- step-label-color: #64748B,
427
- step-label-weight: 500,
428
-
429
- step-active-bg: #818CF8,
430
- step-active-color: #ffffff,
431
- step-active-label: #A5B4FC,
432
- step-active-label-weight: 700,
433
-
434
- step-done-bg: #34D399,
435
- step-done-color: #0F172A,
436
-
437
- // ── Actions bar ─────────────────────────────────────────────────────────────
438
- actions-border: 1px solid #1E293B,
439
- actions-padding: 20px 10px 0,
440
- actions-gap: 12px,
441
-
442
- btn-primary-bg: #818CF8,
443
- btn-primary-color: #ffffff,
444
- btn-primary-radius: 8px,
445
- btn-primary-padding: 0.625rem 1.5rem,
446
- btn-primary-hover-bg: #6366F1,
447
-
448
- btn-secondary-bg: #1E293B,
449
- btn-secondary-color: #CBD5E1,
450
- btn-secondary-radius: 8px,
451
- btn-secondary-padding: 0.625rem 1.5rem,
452
- btn-secondary-hover-bg: #263548,
453
-
454
- btn-font-size: 0.875rem,
455
- btn-font-weight: 600,
456
- btn-transition: all 0.2s ease,
457
- btn-disabled-opacity: 0.45,
458
-
459
- // ── Repeater button sizing ──────────────────────────────────────────────────
460
- btn-remove-padding: 0.375rem 0.75rem,
461
- btn-remove-font-size: 0.875rem,
462
- btn-remove-font-weight: 600,
463
-
464
- btn-add-padding: 0.625rem 1.5rem,
465
- btn-add-font-size: 0.875rem,
466
- btn-add-font-weight: 600,
467
-
468
- // ── Instance card polish ────────────────────────────────────────────────────
469
- stepper-connector-display: block,
470
- instance-shadow: 0 2px 8px rgba(0, 0, 0, 0.3),
471
- instance-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.4),
472
- instance-transition: box-shadow 0.15s ease,
473
- instance-header-divider: 1px solid #1a253a,
474
- instance-header-pb: 12px,
475
- instance-header-mb: 16px,
476
- instance-num-weight: 600,
477
-
478
- // ── Section stepper accent ──────────────────────────────────────────────────
479
- section-stepper-accent: #818CF8,
480
- section-stepper-accent-end: #A5B4FC,
481
- section-stepper-active-label: #A5B4FC,
482
- section-stepper-active-glow: rgba(129, 140, 248, 0.25),
483
- );
484
-
485
- // ── Theme 3 — Campus Students (campus red accent) ─────────────────────────────
486
- $type1-config: map.merge($default-smart-form-config, (
487
- accent-color: #E63E30,
488
- selected-color: #E63E30,
489
-
490
- input-focus-border: #E63E30,
491
- input-focus-shadow: 0 0 0 3px rgba(230, 62, 48, 0.08),
492
- chip-selected-bg: #E63E30,
493
- chip-selected-border: #E63E30,
494
- switch-track-on: #E63E30,
495
-
496
- section-bg: transparent,
497
- section-border: none,
498
- section-shadow: none,
499
- section-header-accent-color: #E63E30,
500
-
501
- step-active-bg: #E63E30,
502
- step-active-label: #C13320,
503
- stepper-connector-display: none,
504
-
505
- btn-add-color: #E63E30,
506
- btn-add-border: 1.5px dashed rgba(230, 62, 48, 0.3),
507
- btn-add-hover-bg: rgba(230, 62, 48, 0.04),
508
- btn-add-hover-border: rgba(230, 62, 48, 0.6),
509
-
510
- btn-remove-bg: transparent,
511
- btn-remove-color: #EF4444,
512
- btn-remove-border: 1px solid #FECACA,
513
- btn-remove-hover-bg: #FEF2F2,
514
- btn-remove-radius: 6px,
515
- btn-remove-padding: 5px 12px,
516
- btn-remove-font-size: 0.75rem,
517
- btn-remove-font-weight: 600,
518
-
519
- btn-add-padding: 10px 20px,
520
- btn-add-font-size: 0.875rem,
521
- btn-add-font-weight: 600,
522
-
523
- btn-primary-bg: #E63E30,
524
- btn-primary-hover-bg: #C13320,
525
- btn-primary-color: #ffffff,
526
-
527
- instance-bg: #ffffff,
528
- instance-border: 1px solid #E5E7EB,
529
- instance-radius: 12px,
530
- instance-shadow: 0 1px 4px rgba(0, 0, 0, 0.04),
531
- instance-hover-shadow: 0 2px 8px rgba(0, 0, 0, 0.07),
532
- instance-transition: box-shadow 0.15s ease,
533
- instance-header-divider: 1px solid #F5F5F5,
534
- instance-header-pb: 12px,
535
- instance-header-mb: 16px,
536
- instance-num-color: #9CA3AF,
537
- instance-num-weight: 600,
538
-
539
- section-stepper-accent: #E63E30,
540
- section-stepper-accent-end: #C13320,
541
- section-stepper-active-label: #C13320,
542
- section-stepper-active-glow: rgba(230, 62, 48, 0.2),
543
- ));
544
-
545
- // ─────────────────────────────────────────────────────────────────────────────
546
- // Mixin — apply theme by emitting CSS custom properties
547
- // Usage:
548
- // .my-wrapper { @include smart-form-theme(); } ← default (theme 1)
549
- // .dark-wrapper { @include smart-form-theme($theme-2-smart-form-config); }
550
- // .custom { @include smart-form-theme((btn-primary-bg: #e91e63)); }
551
- // ─────────────────────────────────────────────────────────────────────────────
552
- @mixin smart-form-theme($user-config: ()) {
553
- $config: map.merge($default-smart-form-config, $user-config);
554
-
555
- // Typography
556
- --cc-sf-font-family: #{map.get($config, font-family)};
557
- --cc-sf-font-size-base: #{map.get($config, font-size-base)};
558
-
559
- // Accent colour
560
- --cc-sf-accent-color: #{map.get($config, accent-color)};
561
- --cc-sf-selected-color: #{map.get($config, selected-color)};
562
-
563
- // Form container
564
- --cc-sf-form-bg: #{map.get($config, form-bg)};
565
- --cc-sf-form-padding: #{map.get($config, form-padding)};
566
- --cc-sf-form-border-radius: #{map.get($config, form-border-radius)};
567
- --cc-sf-form-border: #{map.get($config, form-border)};
568
- --cc-sf-form-shadow: #{map.get($config, form-shadow)};
569
- --cc-sf-form-max-width: #{map.get($config, form-max-width)};
570
- --cc-sf-form-section-gap: #{map.get($config, form-section-gap)};
571
-
572
- // Header
573
- --cc-sf-form-title-size: #{map.get($config, form-title-size)};
574
- --cc-sf-form-title-weight: #{map.get($config, form-title-weight)};
575
- --cc-sf-form-title-color: #{map.get($config, form-title-color)};
576
- --cc-sf-form-desc-size: #{map.get($config, form-desc-size)};
577
- --cc-sf-form-desc-color: #{map.get($config, form-desc-color)};
578
-
579
- // Section — flat layout tokens
580
- --cc-sf-section-bg: #{map.get($config, section-bg)};
581
- --cc-sf-section-border: #{map.get($config, section-border)};
582
- --cc-sf-section-radius: #{map.get($config, section-radius)};
583
- --cc-sf-section-padding: #{map.get($config, section-padding)};
584
- --cc-sf-section-shadow: #{map.get($config, section-shadow)};
585
- --cc-sf-section-gap: #{map.get($config, section-gap)};
586
- --cc-sf-section-label-size: #{map.get($config, section-label-size)};
587
- --cc-sf-section-label-weight: #{map.get($config, section-label-weight)};
588
- --cc-sf-section-label-color: #{map.get($config, section-label-color)};
589
- --cc-sf-section-label-border: #{map.get($config, section-label-border)};
590
-
591
- // Section heading accent bar
592
- --cc-sf-section-header-accent-width: #{map.get($config, section-header-accent-width)};
593
- --cc-sf-section-header-accent-color: #{map.get($config, section-header-accent-color)};
594
- --cc-sf-section-header-bg: #{map.get($config, section-header-bg)};
595
-
596
- // Repeater accordion
597
- --cc-sf-repeater-accordion-header-bg: #{map.get($config, repeater-accordion-header-bg)};
598
- --cc-sf-repeater-accordion-header-color: #{map.get($config, repeater-accordion-header-color)};
599
- --cc-sf-repeater-accordion-active-bg: #{map.get($config, repeater-accordion-active-bg)};
600
- --cc-sf-repeater-badge-bg: #{map.get($config, repeater-badge-bg)};
601
- --cc-sf-repeater-badge-color: #{map.get($config, repeater-badge-color)};
602
- --cc-sf-section-border-radius-inner: #{map.get($config, section-border-radius-inner)};
603
-
604
- // Repeater instance
605
- --cc-sf-instance-bg: #{map.get($config, instance-bg)};
606
- --cc-sf-instance-border: #{map.get($config, instance-border)};
607
- --cc-sf-instance-radius: #{map.get($config, instance-radius)};
608
- --cc-sf-instance-padding: #{map.get($config, instance-padding)};
609
- --cc-sf-instance-divider: #{map.get($config, instance-divider)};
610
- --cc-sf-instance-num-color:#{map.get($config, instance-num-color)};
611
- --cc-sf-instance-num-size: #{map.get($config, instance-num-size)};
612
-
613
- // Grid + field gap
614
- --cc-sf-grid-gap: #{map.get($config, grid-gap)};
615
- --cc-sf-field-gap: #{map.get($config, field-gap)};
616
-
617
- // Focus ring
618
- --cc-sf-focus-ring-width: #{map.get($config, focus-ring-width)};
619
- --cc-sf-focus-ring-offset: #{map.get($config, focus-ring-offset)};
620
-
621
- // Label
622
- --cc-sf-label-size: #{map.get($config, label-size)};
623
- --cc-sf-label-weight: #{map.get($config, label-weight)};
624
- --cc-sf-label-color: #{map.get($config, label-color)};
625
- --cc-sf-label-required-color: #{map.get($config, label-required-color)};
626
-
627
- // Input
628
- --cc-sf-input-bg: #{map.get($config, input-bg)};
629
- --cc-sf-input-color: #{map.get($config, input-color)};
630
- --cc-sf-input-placeholder: #{map.get($config, input-placeholder)};
631
- --cc-sf-input-border: #{map.get($config, input-border)};
632
- --cc-sf-input-radius: #{map.get($config, input-radius)};
633
- --cc-sf-input-padding: #{map.get($config, input-padding)};
634
- --cc-sf-input-font-size: #{map.get($config, input-font-size)};
635
- --cc-sf-input-shadow: #{map.get($config, input-shadow)};
636
- --cc-sf-input-hover-border:#{map.get($config, input-hover-border)};
637
- --cc-sf-input-focus-border:#{map.get($config, input-focus-border)};
638
- --cc-sf-input-focus-shadow:#{map.get($config, input-focus-shadow)};
639
- --cc-sf-input-transition: #{map.get($config, input-transition)};
640
- --cc-sf-input-disabled-bg: #{map.get($config, input-disabled-bg)};
641
- --cc-sf-input-disabled-color: #{map.get($config, input-disabled-color)};
642
- --cc-sf-input-disabled-border:#{map.get($config, input-disabled-border)};
643
-
644
- // Error
645
- --cc-sf-error-border: #{map.get($config, error-border)};
646
- --cc-sf-error-bg: #{map.get($config, error-bg)};
647
- --cc-sf-error-focus-shadow: #{map.get($config, error-focus-shadow)};
648
- --cc-sf-error-text-color: #{map.get($config, error-text-color)};
649
- --cc-sf-error-text-size: #{map.get($config, error-text-size)};
650
-
651
- // Hint
652
- --cc-sf-hint-color: #{map.get($config, hint-color)};
653
- --cc-sf-hint-size: #{map.get($config, hint-size)};
654
-
655
- // Chip
656
- --cc-sf-chip-border: #{map.get($config, chip-border)};
657
- --cc-sf-chip-radius: #{map.get($config, chip-radius)};
658
- --cc-sf-chip-padding: #{map.get($config, chip-padding)};
659
- --cc-sf-chip-bg: #{map.get($config, chip-bg)};
660
- --cc-sf-chip-color: #{map.get($config, chip-color)};
661
- --cc-sf-chip-hover-bg: #{map.get($config, chip-hover-bg)};
662
- --cc-sf-chip-selected-bg: #{map.get($config, chip-selected-bg)};
663
- --cc-sf-chip-selected-color: #{map.get($config, chip-selected-color)};
664
- --cc-sf-chip-selected-border:#{map.get($config, chip-selected-border)};
665
-
666
- // Switch
667
- --cc-sf-switch-track-off: #{map.get($config, switch-track-off)};
668
- --cc-sf-switch-track-on: #{map.get($config, switch-track-on)};
669
- --cc-sf-switch-thumb: #{map.get($config, switch-thumb)};
670
-
671
- // Rating
672
- --cc-sf-star-empty: #{map.get($config, star-empty)};
673
- --cc-sf-star-filled: #{map.get($config, star-filled)};
674
- --cc-sf-star-size: #{map.get($config, star-size)};
675
-
676
- // Generated
677
- --cc-sf-generated-bg: #{map.get($config, generated-bg)};
678
- --cc-sf-generated-border: #{map.get($config, generated-border)};
679
- --cc-sf-generated-color: #{map.get($config, generated-color)};
680
- --cc-sf-generated-radius: #{map.get($config, generated-radius)};
681
- --cc-sf-generated-padding: #{map.get($config, generated-padding)};
682
-
683
- // File upload
684
- --cc-sf-dropzone-bg: #{map.get($config, dropzone-bg)};
685
- --cc-sf-dropzone-border: #{map.get($config, dropzone-border)};
686
- --cc-sf-dropzone-radius: #{map.get($config, dropzone-radius)};
687
- --cc-sf-dropzone-hover-bg: #{map.get($config, dropzone-hover-bg)};
688
- --cc-sf-dropzone-hover-border: #{map.get($config, dropzone-hover-border)};
689
- --cc-sf-dropzone-over-border: #{map.get($config, dropzone-over-border)};
690
- --cc-sf-dropzone-over-shadow: #{map.get($config, dropzone-over-shadow)};
691
- --cc-sf-dropzone-icon-color: #{map.get($config, dropzone-icon-color)};
692
- --cc-sf-dropzone-icon-bg: #{map.get($config, dropzone-icon-bg)};
693
- --cc-sf-dropzone-link-color: #{map.get($config, dropzone-link-color)};
694
- --cc-sf-dropzone-hint-color: #{map.get($config, dropzone-hint-color)};
695
-
696
- --cc-sf-uploaded-item-bg: #{map.get($config, uploaded-item-bg)};
697
- --cc-sf-uploaded-item-border: #{map.get($config, uploaded-item-border)};
698
- --cc-sf-uploaded-item-radius: #{map.get($config, uploaded-item-radius)};
699
- --cc-sf-uploaded-remove-color: #{map.get($config, uploaded-remove-color)};
700
- --cc-sf-uploaded-remove-hover-bg: #{map.get($config, uploaded-remove-hover-bg)};
701
- --cc-sf-uploaded-remove-hover-color: #{map.get($config, uploaded-remove-hover-color)};
702
-
703
- // Repeater buttons
704
- --cc-sf-btn-add-bg: #{map.get($config, btn-add-bg)};
705
- --cc-sf-btn-add-color: #{map.get($config, btn-add-color)};
706
- --cc-sf-btn-add-border: #{map.get($config, btn-add-border)};
707
- --cc-sf-btn-add-radius: #{map.get($config, btn-add-radius)};
708
- --cc-sf-btn-add-hover-bg: #{map.get($config, btn-add-hover-bg)};
709
- --cc-sf-btn-add-hover-border: #{map.get($config, btn-add-hover-border)};
710
-
711
- --cc-sf-btn-remove-bg: #{map.get($config, btn-remove-bg)};
712
- --cc-sf-btn-remove-color: #{map.get($config, btn-remove-color)};
713
- --cc-sf-btn-remove-border: #{map.get($config, btn-remove-border)};
714
- --cc-sf-btn-remove-radius: #{map.get($config, btn-remove-radius)};
715
- --cc-sf-btn-remove-hover-bg: #{map.get($config, btn-remove-hover-bg)};
716
- --cc-sf-btn-remove-padding: #{map.get($config, btn-remove-padding)};
717
- --cc-sf-btn-remove-font-size: #{map.get($config, btn-remove-font-size)};
718
- --cc-sf-btn-remove-font-weight: #{map.get($config, btn-remove-font-weight)};
719
- --cc-sf-btn-add-padding: #{map.get($config, btn-add-padding)};
720
- --cc-sf-btn-add-font-size: #{map.get($config, btn-add-font-size)};
721
- --cc-sf-btn-add-font-weight: #{map.get($config, btn-add-font-weight)};
722
- --cc-sf-stepper-connector-display: #{map.get($config, stepper-connector-display)};
723
- --cc-sf-instance-shadow: #{map.get($config, instance-shadow)};
724
- --cc-sf-instance-hover-shadow: #{map.get($config, instance-hover-shadow)};
725
- --cc-sf-instance-transition: #{map.get($config, instance-transition)};
726
- --cc-sf-instance-header-divider: #{map.get($config, instance-header-divider)};
727
- --cc-sf-instance-header-pb: #{map.get($config, instance-header-pb)};
728
- --cc-sf-instance-header-mb: #{map.get($config, instance-header-mb)};
729
- --cc-sf-instance-num-weight: #{map.get($config, instance-num-weight)};
730
- --cc-sf-section-stepper-accent: #{map.get($config, section-stepper-accent)};
731
- --cc-sf-section-stepper-accent-end: #{map.get($config, section-stepper-accent-end)};
732
- --cc-sf-section-stepper-active-label: #{map.get($config, section-stepper-active-label)};
733
- --cc-sf-section-stepper-active-glow: #{map.get($config, section-stepper-active-glow)};
734
-
735
- // Stepper
736
- --cc-sf-step-connector-color: #{map.get($config, step-connector-color)};
737
- --cc-sf-step-connector-done: #{map.get($config, step-connector-done)};
738
- --cc-sf-step-number-bg: #{map.get($config, step-number-bg)};
739
- --cc-sf-step-number-color: #{map.get($config, step-number-color)};
740
- --cc-sf-step-number-size: #{map.get($config, step-number-size)};
741
- --cc-sf-step-number-font-size: #{map.get($config, step-number-font-size)};
742
- --cc-sf-step-number-weight: #{map.get($config, step-number-weight)};
743
- --cc-sf-step-label-size: #{map.get($config, step-label-size)};
744
- --cc-sf-step-label-color: #{map.get($config, step-label-color)};
745
- --cc-sf-step-label-weight: #{map.get($config, step-label-weight)};
746
- --cc-sf-step-active-bg: #{map.get($config, step-active-bg)};
747
- --cc-sf-step-active-color: #{map.get($config, step-active-color)};
748
- --cc-sf-step-active-label: #{map.get($config, step-active-label)};
749
- --cc-sf-step-active-label-weight: #{map.get($config, step-active-label-weight)};
750
- --cc-sf-step-done-bg: #{map.get($config, step-done-bg)};
751
- --cc-sf-step-done-color: #{map.get($config, step-done-color)};
752
-
753
- // Action bar / submit buttons
754
- --cc-sf-actions-border: #{map.get($config, actions-border)};
755
- --cc-sf-actions-padding: #{map.get($config, actions-padding)};
756
- --cc-sf-actions-gap: #{map.get($config, actions-gap)};
757
-
758
- --cc-sf-btn-primary-bg: #{map.get($config, btn-primary-bg)};
759
- --cc-sf-btn-primary-color: #{map.get($config, btn-primary-color)};
760
- --cc-sf-btn-primary-radius: #{map.get($config, btn-primary-radius)};
761
- --cc-sf-btn-primary-padding: #{map.get($config, btn-primary-padding)};
762
- --cc-sf-btn-primary-hover-bg: #{map.get($config, btn-primary-hover-bg)};
763
-
764
- --cc-sf-btn-secondary-bg: #{map.get($config, btn-secondary-bg)};
765
- --cc-sf-btn-secondary-color: #{map.get($config, btn-secondary-color)};
766
- --cc-sf-btn-secondary-radius: #{map.get($config, btn-secondary-radius)};
767
- --cc-sf-btn-secondary-padding: #{map.get($config, btn-secondary-padding)};
768
- --cc-sf-btn-secondary-hover-bg: #{map.get($config, btn-secondary-hover-bg)};
769
-
770
- --cc-sf-btn-font-size: #{map.get($config, btn-font-size)};
771
- --cc-sf-btn-font-weight: #{map.get($config, btn-font-weight)};
772
- --cc-sf-btn-transition: #{map.get($config, btn-transition)};
773
- --cc-sf-btn-disabled-opacity: #{map.get($config, btn-disabled-opacity)};
774
-
775
- // ── Structural rules using the emitted tokens ─────────────────────────────
776
- ::ng-deep {
777
- .stepper-nav .stepper-step:not(:last-child)::after {
778
- display: var(--cc-sf-stepper-connector-display) !important;
779
- }
780
-
781
- .section-instance {
782
- background: var(--cc-sf-instance-bg) !important;
783
- border: var(--cc-sf-instance-border) !important;
784
- border-radius: var(--cc-sf-instance-radius) !important;
785
- box-shadow: var(--cc-sf-instance-shadow);
786
- transition: var(--cc-sf-instance-transition);
787
-
788
- &:hover {
789
- box-shadow: var(--cc-sf-instance-hover-shadow);
790
- }
791
- }
792
-
793
- .section-instance-header {
794
- display: flex;
795
- align-items: center;
796
- justify-content: space-between;
797
- padding-bottom: var(--cc-sf-instance-header-pb);
798
- margin-bottom: var(--cc-sf-instance-header-mb);
799
- border-bottom: var(--cc-sf-instance-header-divider);
800
- }
801
-
802
- .section-instance-num {
803
- font-size: var(--cc-sf-instance-num-size);
804
- font-weight: var(--cc-sf-instance-num-weight);
805
- color: var(--cc-sf-instance-num-color);
806
- }
807
-
808
- .btn-instance-remove {
809
- display: inline-flex;
810
- align-items: center;
811
- gap: 6px;
812
- padding: var(--cc-sf-btn-remove-padding);
813
- border-radius: var(--cc-sf-btn-remove-radius);
814
- border: var(--cc-sf-btn-remove-border) !important;
815
- background: var(--cc-sf-btn-remove-bg);
816
- color: var(--cc-sf-btn-remove-color) !important;
817
- font-size: var(--cc-sf-btn-remove-font-size);
818
- font-weight: var(--cc-sf-btn-remove-font-weight);
819
- cursor: pointer;
820
- transition: all 0.15s ease;
821
-
822
- &:hover {
823
- background: var(--cc-sf-btn-remove-hover-bg);
824
- }
825
- }
826
-
827
- .btn-add-section {
828
- display: inline-flex;
829
- align-items: center;
830
- gap: 8px;
831
- padding: var(--cc-sf-btn-add-padding);
832
- border-radius: var(--cc-sf-btn-add-radius);
833
- border: var(--cc-sf-btn-add-border) !important;
834
- background: var(--cc-sf-btn-add-bg);
835
- color: var(--cc-sf-btn-add-color);
836
- font-size: var(--cc-sf-btn-add-font-size);
837
- font-weight: var(--cc-sf-btn-add-font-weight);
838
- cursor: pointer;
839
- transition: all 0.18s ease;
840
-
841
- &:hover {
842
- background: var(--cc-sf-btn-add-hover-bg);
843
- border-color: var(--cc-sf-btn-add-hover-border) !important;
844
- }
845
- }
846
-
847
- // ── Section stepper — accent colour override ──────────────────────────
848
- .section-stepper-nav::before {
849
- background: linear-gradient(
850
- 90deg,
851
- var(--cc-sf-section-stepper-accent) 0%,
852
- var(--cc-sf-section-stepper-accent-end) 100%
853
- ) !important;
854
- }
855
-
856
- .section-stepper-step {
857
- &.ss-active {
858
- .ss-badge {
859
- background: linear-gradient(
860
- 135deg,
861
- var(--cc-sf-section-stepper-accent) 0%,
862
- var(--cc-sf-section-stepper-accent-end) 100%
863
- ) !important;
864
- box-shadow:
865
- 0 0 0 4px var(--cc-sf-section-stepper-active-glow),
866
- 0 4px 12px var(--cc-sf-section-stepper-active-glow) !important;
867
- }
868
-
869
- .ss-label {
870
- color: var(--cc-sf-section-stepper-active-label) !important;
871
- }
872
- }
873
-
874
- &:not(.ss-active):not(.ss-completed):not(.ss-warning):hover {
875
- .ss-badge {
876
- color: var(--cc-sf-section-stepper-accent) !important;
877
- border-color: var(--cc-sf-section-stepper-accent-end) !important;
878
- }
879
- }
880
-
881
- .ss-connector::after {
882
- background: linear-gradient(
883
- 90deg,
884
- var(--cc-sf-section-stepper-accent),
885
- var(--cc-sf-section-stepper-accent-end)
886
- ) !important;
887
- }
888
- }
889
- }
1
+ @use 'sass:map';
2
+
3
+ // ─────────────────────────────────────────────────────────────────────────────
4
+ // Smart Form Theme
5
+ // Prefix: --cc-sf-
6
+ // Two built-in configs supplied:
7
+ // $default-smart-form-config → Theme 1 · Clean & Professional (light)
8
+ // $theme-2-smart-form-config → Theme 2 · Vibrant & Modern (dark)
9
+ // ─────────────────────────────────────────────────────────────────────────────
10
+
11
+ // ── Theme 1 — Clean & Professional (default) ─────────────────────────────────
12
+ $default-smart-form-config: (
13
+ // Typography
14
+ font-family: ('Inter', 'Segoe UI', sans-serif),
15
+ font-size-base: 0.875rem,
16
+
17
+ // ── Accent colour (flows from app primary; replaces hard-coded blue) ────────
18
+ accent-color: #3B82F6,
19
+ selected-color: #3B82F6,
20
+
21
+ // ── Form container ──────────────────────────────────────────────────────────
22
+ form-bg: #ffffff,
23
+ form-padding: 24px,
24
+ form-border-radius: 12px,
25
+ form-border: none,
26
+ form-shadow: 0 1px 3px rgba(0, 0, 0, 0.06),
27
+ form-max-width: 1200px,
28
+ form-section-gap: 24px,
29
+
30
+ // ── Form header (title + description) ──────────────────────────────────────
31
+ form-title-size: 1.5rem,
32
+ form-title-weight: 700,
33
+ form-title-color: #111827,
34
+ form-desc-size: 0.875rem,
35
+ form-desc-color: #6B7280,
36
+
37
+ // ── Section / GROUP — flat layout (no card shell) ───────────────────────────
38
+ section-bg: #ffffff,
39
+ section-border: 1px solid #E5E7EB,
40
+ section-radius: 10px,
41
+ section-padding: 20px,
42
+ section-shadow: 0 1px 4px rgba(0, 0, 0, 0.05),
43
+ section-gap: 20px,
44
+
45
+ section-label-size: 1rem,
46
+ section-label-weight: 600,
47
+ section-label-color: #1F2937,
48
+ section-label-border: 2px solid #E5E7EB,
49
+
50
+ // ── Section heading left-accent bar ─────────────────────────────────────────
51
+ section-header-accent-width: 4px,
52
+ section-header-accent-color: #3B82F6,
53
+ section-header-bg: #F9FAFB,
54
+
55
+ // ── Repeater accordion ──────────────────────────────────────────────────────
56
+ repeater-accordion-header-bg: #F9FAFB,
57
+ repeater-accordion-header-color: #1F2937,
58
+ repeater-accordion-active-bg: #EFF6FF,
59
+ repeater-badge-bg: #E5E7EB,
60
+ repeater-badge-color: #374151,
61
+ section-border-radius-inner: 8px,
62
+
63
+ // ── GROUP repeater instance card ────────────────────────────────────────────
64
+ instance-bg: #F9FAFB,
65
+ instance-border: 1px solid #E5E7EB,
66
+ instance-radius: 8px,
67
+ instance-padding: 16px,
68
+ instance-divider: 1px dashed #D1D5DB,
69
+ instance-num-color: #4B5563,
70
+ instance-num-size: 0.8125rem,
71
+
72
+ // ── Grid gap + field gap ─────────────────────────────────────────────────────
73
+ grid-gap: 16px,
74
+ field-gap: 6px,
75
+
76
+ // ── Focus ring ──────────────────────────────────────────────────────────────
77
+ focus-ring-width: 3px,
78
+ focus-ring-offset: 0,
79
+
80
+ // ── Field label ─────────────────────────────────────────────────────────────
81
+ label-size: 0.875rem,
82
+ label-weight: 500,
83
+ label-color: #111827,
84
+ label-required-color: #DC2626,
85
+
86
+ // ── Input ───────────────────────────────────────────────────────────────────
87
+ input-bg: #ffffff,
88
+ input-color: #111827,
89
+ input-placeholder: #9CA3AF,
90
+ input-border: 1.5px solid #D1D5DB,
91
+ input-radius: 8px,
92
+ input-padding: 0.625rem 0.875rem,
93
+ input-font-size: 0.875rem,
94
+ input-shadow: none,
95
+
96
+ input-hover-border: #9CA3AF,
97
+ input-focus-border: #3B82F6,
98
+ input-focus-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12),
99
+ input-transition: all 0.2s ease,
100
+
101
+ input-disabled-bg: #F3F4F6,
102
+ input-disabled-color: #6B7280,
103
+ input-disabled-border:#E5E7EB,
104
+
105
+ // ── Error state ─────────────────────────────────────────────────────────────
106
+ error-border: #DC2626,
107
+ error-bg: #FEF2F2,
108
+ error-focus-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1),
109
+ error-text-color: #DC2626,
110
+ error-text-size: 0.75rem,
111
+
112
+ // ── Hint / helper text ──────────────────────────────────────────────────────
113
+ hint-color: #6B7280,
114
+ hint-size: 0.75rem,
115
+
116
+ // ── Chip ────────────────────────────────────────────────────────────────────
117
+ chip-border: 1px solid #D1D5DB,
118
+ chip-radius: 20px,
119
+ chip-padding: 6px 14px,
120
+ chip-bg: #ffffff,
121
+ chip-color: #374151,
122
+ chip-hover-bg: #F3F4F6,
123
+ chip-selected-bg: #3B82F6,
124
+ chip-selected-color: #ffffff,
125
+ chip-selected-border: #3B82F6,
126
+
127
+ // ── Switch ──────────────────────────────────────────────────────────────────
128
+ switch-track-off: #D1D5DB,
129
+ switch-track-on: #3B82F6,
130
+ switch-thumb: #ffffff,
131
+
132
+ // ── Rating stars ────────────────────────────────────────────────────────────
133
+ star-empty: #D1D5DB,
134
+ star-filled: #F59E0B,
135
+ star-size: 28px,
136
+
137
+ // ── Generated (read-only) field ─────────────────────────────────────────────
138
+ generated-bg: #F3F4F6,
139
+ generated-border: 1px solid #E5E7EB,
140
+ generated-color: #6B7280,
141
+ generated-radius: 8px,
142
+ generated-padding: 0.625rem 0.875rem,
143
+
144
+ // ── File upload drop-zone ───────────────────────────────────────────────────
145
+ dropzone-bg: #F8FAFC,
146
+ dropzone-border: 1.5px dashed #CBD5E1,
147
+ dropzone-radius: 12px,
148
+ dropzone-hover-bg: #EFF6FF,
149
+ dropzone-hover-border:#93C5FD,
150
+ dropzone-over-border: #3B82F6,
151
+ dropzone-over-shadow: 0 0 0 4px rgba(59, 130, 246, 0.12),
152
+ dropzone-icon-color: #94A3B8,
153
+ dropzone-icon-bg: rgba(59, 130, 246, 0.10),
154
+ dropzone-link-color: #3B82F6,
155
+ dropzone-hint-color: #64748B,
156
+
157
+ uploaded-item-bg: #ffffff,
158
+ uploaded-item-border: 1px solid #E2E8F0,
159
+ uploaded-item-radius: 8px,
160
+ uploaded-remove-color: #94A3B8,
161
+ uploaded-remove-hover-bg: #FEF2F2,
162
+ uploaded-remove-hover-color: #DC2626,
163
+
164
+ // ── Repeater add/remove buttons ─────────────────────────────────────────────
165
+ btn-add-bg: transparent,
166
+ btn-add-color: #3B82F6,
167
+ btn-add-border: 1px dashed #CBD5E1,
168
+ btn-add-radius: 6px,
169
+ btn-add-hover-bg: #EFF6FF,
170
+ btn-add-hover-border: #BFDBFE,
171
+
172
+ btn-remove-bg: #FFF5F5,
173
+ btn-remove-color: #E53E3E,
174
+ btn-remove-border: 1px solid #FED7D7,
175
+ btn-remove-radius: 4px,
176
+ btn-remove-hover-bg: #FED7D7,
177
+
178
+ // ── Stepper navigation ──────────────────────────────────────────────────────
179
+ step-connector-color: #E5E7EB,
180
+ step-connector-done: #22C55E,
181
+
182
+ step-number-bg: #E5E7EB,
183
+ step-number-color: #6B7280,
184
+ step-number-size: 40px,
185
+ step-number-font-size: 0.875rem,
186
+ step-number-weight: 600,
187
+
188
+ step-label-size: 0.875rem,
189
+ step-label-color: #6B7280,
190
+ step-label-weight: 500,
191
+
192
+ step-active-bg: #3B82F6,
193
+ step-active-color: #ffffff,
194
+ step-active-label: #1D4ED8,
195
+ step-active-label-weight: 700,
196
+
197
+ step-done-bg: #22C55E,
198
+ step-done-color: #ffffff,
199
+
200
+ // ── Form action bar (submit / previous) ─────────────────────────────────────
201
+ actions-border: 1px solid #E5E7EB,
202
+ actions-padding: 20px 10px 0,
203
+ actions-gap: 12px,
204
+
205
+ btn-primary-bg: #3B82F6,
206
+ btn-primary-color: #ffffff,
207
+ btn-primary-radius: 8px,
208
+ btn-primary-padding: 0.625rem 1.5rem,
209
+ btn-primary-hover-bg: #2563EB,
210
+
211
+ btn-secondary-bg: #F3F4F6,
212
+ btn-secondary-color: #374151,
213
+ btn-secondary-radius: 8px,
214
+ btn-secondary-padding: 0.625rem 1.5rem,
215
+ btn-secondary-hover-bg: #E5E7EB,
216
+
217
+ btn-font-size: 0.875rem,
218
+ btn-font-weight: 600,
219
+ btn-transition: all 0.2s ease,
220
+ btn-disabled-opacity: 0.55,
221
+
222
+ // ── Repeater button sizing ──────────────────────────────────────────────────
223
+ btn-remove-padding: 0.375rem 0.75rem,
224
+ btn-remove-font-size: 0.875rem,
225
+ btn-remove-font-weight: 500,
226
+
227
+ btn-add-padding: 0.625rem 1.5rem,
228
+ btn-add-font-size: 0.875rem,
229
+ btn-add-font-weight: 600,
230
+
231
+ // ── Instance card polish ────────────────────────────────────────────────────
232
+ stepper-connector-display: block,
233
+ instance-shadow: none,
234
+ instance-hover-shadow: none,
235
+ instance-transition: none,
236
+ instance-header-divider: none,
237
+ instance-header-pb: 0px,
238
+ instance-header-mb: 0px,
239
+ instance-num-weight: 600,
240
+
241
+ // ── Section stepper accent (top stripe + active badge) ──────────────────────
242
+ section-stepper-accent: #6366F1,
243
+ section-stepper-accent-end: #8B5CF6,
244
+ section-stepper-active-label: #4F46E5,
245
+ section-stepper-active-glow: rgba(99, 102, 241, 0.25),
246
+ );
247
+
248
+ // ── Theme 2 — Vibrant & Modern (dark) ────────────────────────────────────────
249
+ $theme-2-smart-form-config: (
250
+ // Typography
251
+ font-family: ('Poppins', 'Segoe UI', sans-serif),
252
+ font-size-base: 0.875rem,
253
+
254
+ // ── Accent colour ───────────────────────────────────────────────────────────
255
+ accent-color: #818CF8,
256
+ selected-color: #818CF8,
257
+
258
+ // ── Form container ──────────────────────────────────────────────────────────
259
+ form-bg: #0F172A,
260
+ form-padding: 28px,
261
+ form-border-radius: 16px,
262
+ form-border: 1px solid rgba(255, 255, 255, 0.06),
263
+ form-shadow: 0 8px 32px rgba(0, 0, 0, 0.4),
264
+ form-max-width: 1200px,
265
+ form-section-gap: 24px,
266
+
267
+ // ── Form header ─────────────────────────────────────────────────────────────
268
+ form-title-size: 1.75rem,
269
+ form-title-weight: 700,
270
+ form-title-color: #F1F5F9,
271
+ form-desc-size: 0.9rem,
272
+ form-desc-color: #94A3B8,
273
+
274
+ // ── Section / GROUP — flat layout ───────────────────────────────────────────
275
+ section-bg: #1E293B,
276
+ section-border: 1px solid rgba(255, 255, 255, 0.08),
277
+ section-radius: 12px,
278
+ section-padding: 22px,
279
+ section-shadow: 0 4px 16px rgba(0, 0, 0, 0.3),
280
+ section-gap: 20px,
281
+
282
+ section-label-size: 1rem,
283
+ section-label-weight: 600,
284
+ section-label-color: #E2E8F0,
285
+ section-label-border: 2px solid #334155,
286
+
287
+ // ── Section heading left-accent bar ─────────────────────────────────────────
288
+ section-header-accent-width: 4px,
289
+ section-header-accent-color: #818CF8,
290
+ section-header-bg: #162032,
291
+
292
+ // ── Repeater accordion ──────────────────────────────────────────────────────
293
+ repeater-accordion-header-bg: #162032,
294
+ repeater-accordion-header-color: #E2E8F0,
295
+ repeater-accordion-active-bg: rgba(129, 140, 248, 0.10),
296
+ repeater-badge-bg: #334155,
297
+ repeater-badge-color: #CBD5E1,
298
+ section-border-radius-inner: 8px,
299
+
300
+ // ── GROUP repeater instance card ────────────────────────────────────────────
301
+ instance-bg: #162032,
302
+ instance-border: 1px solid rgba(255, 255, 255, 0.07),
303
+ instance-radius: 8px,
304
+ instance-padding: 16px,
305
+ instance-divider: 1px dashed #334155,
306
+ instance-num-color: #94A3B8,
307
+ instance-num-size: 0.8125rem,
308
+
309
+ // ── Grid gap + field gap ─────────────────────────────────────────────────────
310
+ grid-gap: 16px,
311
+ field-gap: 6px,
312
+
313
+ // ── Focus ring ──────────────────────────────────────────────────────────────
314
+ focus-ring-width: 3px,
315
+ focus-ring-offset: 0,
316
+
317
+ // ── Field label ─────────────────────────────────────────────────────────────
318
+ label-size: 0.875rem,
319
+ label-weight: 500,
320
+ label-color: #CBD5E1,
321
+ label-required-color: #F87171,
322
+
323
+ // ── Input ───────────────────────────────────────────────────────────────────
324
+ input-bg: #ffffff,
325
+ input-color: #0D0D0D,
326
+ input-placeholder: #9CA3AF,
327
+ input-border: 1.5px solid #334155,
328
+ input-radius: 8px,
329
+ input-padding: 0.625rem 0.875rem,
330
+ input-font-size: 0.875rem,
331
+ input-shadow: none,
332
+
333
+ input-hover-border: #9CA3AF,
334
+ input-focus-border: #39FF14,
335
+ input-focus-shadow: 0 0 0 3px rgba(57, 255, 20, 0.25),
336
+ input-transition: all 0.2s ease,
337
+
338
+ input-disabled-bg: #1E293B,
339
+ input-disabled-color: #475569,
340
+ input-disabled-border:#1E293B,
341
+
342
+ // ── Error state ─────────────────────────────────────────────────────────────
343
+ error-border: #F87171,
344
+ error-bg: rgba(248, 113, 113, 0.08),
345
+ error-focus-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2),
346
+ error-text-color: #F87171,
347
+ error-text-size: 0.75rem,
348
+
349
+ // ── Hint ────────────────────────────────────────────────────────────────────
350
+ hint-color: #64748B,
351
+ hint-size: 0.75rem,
352
+
353
+ // ── Chip ────────────────────────────────────────────────────────────────────
354
+ chip-border: 1px solid #334155,
355
+ chip-radius: 20px,
356
+ chip-padding: 6px 14px,
357
+ chip-bg: #1E293B,
358
+ chip-color: #CBD5E1,
359
+ chip-hover-bg: #263548,
360
+ chip-selected-bg: #818CF8,
361
+ chip-selected-color: #ffffff,
362
+ chip-selected-border: #818CF8,
363
+
364
+ // ── Switch ──────────────────────────────────────────────────────────────────
365
+ switch-track-off: #334155,
366
+ switch-track-on: #818CF8,
367
+ switch-thumb: #ffffff,
368
+
369
+ // ── Rating stars ────────────────────────────────────────────────────────────
370
+ star-empty: #334155,
371
+ star-filled: #F59E0B,
372
+ star-size: 28px,
373
+
374
+ // ── Generated field ─────────────────────────────────────────────────────────
375
+ generated-bg: #162032,
376
+ generated-border: 1px solid #334155,
377
+ generated-color: #64748B,
378
+ generated-radius: 8px,
379
+ generated-padding: 0.625rem 0.875rem,
380
+
381
+ // ── File upload ─────────────────────────────────────────────────────────────
382
+ dropzone-bg: #162032,
383
+ dropzone-border: 1.5px dashed #334155,
384
+ dropzone-radius: 12px,
385
+ dropzone-hover-bg: #1a253a,
386
+ dropzone-hover-border:#818CF8,
387
+ dropzone-over-border: #818CF8,
388
+ dropzone-over-shadow: 0 0 0 4px rgba(129, 140, 248, 0.2),
389
+ dropzone-icon-color: #475569,
390
+ dropzone-icon-bg: rgba(129, 140, 248, 0.12),
391
+ dropzone-link-color: #818CF8,
392
+ dropzone-hint-color: #64748B,
393
+
394
+ uploaded-item-bg: #1E293B,
395
+ uploaded-item-border: 1px solid #334155,
396
+ uploaded-item-radius: 8px,
397
+ uploaded-remove-color: #475569,
398
+ uploaded-remove-hover-bg: rgba(248, 113, 113, 0.12),
399
+ uploaded-remove-hover-color: #F87171,
400
+
401
+ // ── Repeater buttons ────────────────────────────────────────────────────────
402
+ btn-add-bg: transparent,
403
+ btn-add-color: #818CF8,
404
+ btn-add-border: 1px dashed #334155,
405
+ btn-add-radius: 6px,
406
+ btn-add-hover-bg: rgba(129, 140, 248, 0.08),
407
+ btn-add-hover-border: #818CF8,
408
+
409
+ btn-remove-bg: rgba(248, 113, 113, 0.08),
410
+ btn-remove-color: #F87171,
411
+ btn-remove-border: 1px solid rgba(248, 113, 113, 0.3),
412
+ btn-remove-radius: 4px,
413
+ btn-remove-hover-bg: rgba(248, 113, 113, 0.18),
414
+
415
+ // ── Stepper ─────────────────────────────────────────────────────────────────
416
+ step-connector-color: #334155,
417
+ step-connector-done: #34D399,
418
+
419
+ step-number-bg: #1E293B,
420
+ step-number-color: #64748B,
421
+ step-number-size: 40px,
422
+ step-number-font-size: 0.875rem,
423
+ step-number-weight: 600,
424
+
425
+ step-label-size: 0.875rem,
426
+ step-label-color: #64748B,
427
+ step-label-weight: 500,
428
+
429
+ step-active-bg: #818CF8,
430
+ step-active-color: #ffffff,
431
+ step-active-label: #A5B4FC,
432
+ step-active-label-weight: 700,
433
+
434
+ step-done-bg: #34D399,
435
+ step-done-color: #0F172A,
436
+
437
+ // ── Actions bar ─────────────────────────────────────────────────────────────
438
+ actions-border: 1px solid #1E293B,
439
+ actions-padding: 20px 10px 0,
440
+ actions-gap: 12px,
441
+
442
+ btn-primary-bg: #818CF8,
443
+ btn-primary-color: #ffffff,
444
+ btn-primary-radius: 8px,
445
+ btn-primary-padding: 0.625rem 1.5rem,
446
+ btn-primary-hover-bg: #6366F1,
447
+
448
+ btn-secondary-bg: #1E293B,
449
+ btn-secondary-color: #CBD5E1,
450
+ btn-secondary-radius: 8px,
451
+ btn-secondary-padding: 0.625rem 1.5rem,
452
+ btn-secondary-hover-bg: #263548,
453
+
454
+ btn-font-size: 0.875rem,
455
+ btn-font-weight: 600,
456
+ btn-transition: all 0.2s ease,
457
+ btn-disabled-opacity: 0.45,
458
+
459
+ // ── Repeater button sizing ──────────────────────────────────────────────────
460
+ btn-remove-padding: 0.375rem 0.75rem,
461
+ btn-remove-font-size: 0.875rem,
462
+ btn-remove-font-weight: 600,
463
+
464
+ btn-add-padding: 0.625rem 1.5rem,
465
+ btn-add-font-size: 0.875rem,
466
+ btn-add-font-weight: 600,
467
+
468
+ // ── Instance card polish ────────────────────────────────────────────────────
469
+ stepper-connector-display: block,
470
+ instance-shadow: 0 2px 8px rgba(0, 0, 0, 0.3),
471
+ instance-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.4),
472
+ instance-transition: box-shadow 0.15s ease,
473
+ instance-header-divider: 1px solid #1a253a,
474
+ instance-header-pb: 12px,
475
+ instance-header-mb: 16px,
476
+ instance-num-weight: 600,
477
+
478
+ // ── Section stepper accent ──────────────────────────────────────────────────
479
+ section-stepper-accent: #818CF8,
480
+ section-stepper-accent-end: #A5B4FC,
481
+ section-stepper-active-label: #A5B4FC,
482
+ section-stepper-active-glow: rgba(129, 140, 248, 0.25),
483
+ );
484
+
485
+ // ── Theme 3 — Campus Students (campus red accent) ─────────────────────────────
486
+ $type1-config: map.merge($default-smart-form-config, (
487
+ accent-color: #E63E30,
488
+ selected-color: #E63E30,
489
+
490
+ input-focus-border: #E63E30,
491
+ input-focus-shadow: 0 0 0 3px rgba(230, 62, 48, 0.08),
492
+ chip-selected-bg: #E63E30,
493
+ chip-selected-border: #E63E30,
494
+ switch-track-on: #E63E30,
495
+
496
+ section-bg: transparent,
497
+ section-border: none,
498
+ section-shadow: none,
499
+ section-header-accent-color: #E63E30,
500
+
501
+ step-active-bg: #E63E30,
502
+ step-active-label: #C13320,
503
+ stepper-connector-display: none,
504
+
505
+ btn-add-color: #E63E30,
506
+ btn-add-border: 1.5px dashed rgba(230, 62, 48, 0.3),
507
+ btn-add-hover-bg: rgba(230, 62, 48, 0.04),
508
+ btn-add-hover-border: rgba(230, 62, 48, 0.6),
509
+
510
+ btn-remove-bg: transparent,
511
+ btn-remove-color: #EF4444,
512
+ btn-remove-border: 1px solid #FECACA,
513
+ btn-remove-hover-bg: #FEF2F2,
514
+ btn-remove-radius: 6px,
515
+ btn-remove-padding: 5px 12px,
516
+ btn-remove-font-size: 0.75rem,
517
+ btn-remove-font-weight: 600,
518
+
519
+ btn-add-padding: 10px 20px,
520
+ btn-add-font-size: 0.875rem,
521
+ btn-add-font-weight: 600,
522
+
523
+ btn-primary-bg: #E63E30,
524
+ btn-primary-hover-bg: #C13320,
525
+ btn-primary-color: #ffffff,
526
+
527
+ instance-bg: #ffffff,
528
+ instance-border: 1px solid #E5E7EB,
529
+ instance-radius: 12px,
530
+ instance-shadow: 0 1px 4px rgba(0, 0, 0, 0.04),
531
+ instance-hover-shadow: 0 2px 8px rgba(0, 0, 0, 0.07),
532
+ instance-transition: box-shadow 0.15s ease,
533
+ instance-header-divider: 1px solid #F5F5F5,
534
+ instance-header-pb: 12px,
535
+ instance-header-mb: 16px,
536
+ instance-num-color: #9CA3AF,
537
+ instance-num-weight: 600,
538
+
539
+ section-stepper-accent: #E63E30,
540
+ section-stepper-accent-end: #C13320,
541
+ section-stepper-active-label: #C13320,
542
+ section-stepper-active-glow: rgba(230, 62, 48, 0.2),
543
+ ));
544
+
545
+ // ─────────────────────────────────────────────────────────────────────────────
546
+ // Mixin — apply theme by emitting CSS custom properties
547
+ // Usage:
548
+ // .my-wrapper { @include smart-form-theme(); } ← default (theme 1)
549
+ // .dark-wrapper { @include smart-form-theme($theme-2-smart-form-config); }
550
+ // .custom { @include smart-form-theme((btn-primary-bg: #e91e63)); }
551
+ // ─────────────────────────────────────────────────────────────────────────────
552
+ @mixin smart-form-theme($user-config: ()) {
553
+ $config: map.merge($default-smart-form-config, $user-config);
554
+
555
+ // Typography
556
+ --cc-sf-font-family: #{map.get($config, font-family)};
557
+ --cc-sf-font-size-base: #{map.get($config, font-size-base)};
558
+
559
+ // Accent colour
560
+ --cc-sf-accent-color: #{map.get($config, accent-color)};
561
+ --cc-sf-selected-color: #{map.get($config, selected-color)};
562
+
563
+ // Form container
564
+ --cc-sf-form-bg: #{map.get($config, form-bg)};
565
+ --cc-sf-form-padding: #{map.get($config, form-padding)};
566
+ --cc-sf-form-border-radius: #{map.get($config, form-border-radius)};
567
+ --cc-sf-form-border: #{map.get($config, form-border)};
568
+ --cc-sf-form-shadow: #{map.get($config, form-shadow)};
569
+ --cc-sf-form-max-width: #{map.get($config, form-max-width)};
570
+ --cc-sf-form-section-gap: #{map.get($config, form-section-gap)};
571
+
572
+ // Header
573
+ --cc-sf-form-title-size: #{map.get($config, form-title-size)};
574
+ --cc-sf-form-title-weight: #{map.get($config, form-title-weight)};
575
+ --cc-sf-form-title-color: #{map.get($config, form-title-color)};
576
+ --cc-sf-form-desc-size: #{map.get($config, form-desc-size)};
577
+ --cc-sf-form-desc-color: #{map.get($config, form-desc-color)};
578
+
579
+ // Section — flat layout tokens
580
+ --cc-sf-section-bg: #{map.get($config, section-bg)};
581
+ --cc-sf-section-border: #{map.get($config, section-border)};
582
+ --cc-sf-section-radius: #{map.get($config, section-radius)};
583
+ --cc-sf-section-padding: #{map.get($config, section-padding)};
584
+ --cc-sf-section-shadow: #{map.get($config, section-shadow)};
585
+ --cc-sf-section-gap: #{map.get($config, section-gap)};
586
+ --cc-sf-section-label-size: #{map.get($config, section-label-size)};
587
+ --cc-sf-section-label-weight: #{map.get($config, section-label-weight)};
588
+ --cc-sf-section-label-color: #{map.get($config, section-label-color)};
589
+ --cc-sf-section-label-border: #{map.get($config, section-label-border)};
590
+
591
+ // Section heading accent bar
592
+ --cc-sf-section-header-accent-width: #{map.get($config, section-header-accent-width)};
593
+ --cc-sf-section-header-accent-color: #{map.get($config, section-header-accent-color)};
594
+ --cc-sf-section-header-bg: #{map.get($config, section-header-bg)};
595
+
596
+ // Repeater accordion
597
+ --cc-sf-repeater-accordion-header-bg: #{map.get($config, repeater-accordion-header-bg)};
598
+ --cc-sf-repeater-accordion-header-color: #{map.get($config, repeater-accordion-header-color)};
599
+ --cc-sf-repeater-accordion-active-bg: #{map.get($config, repeater-accordion-active-bg)};
600
+ --cc-sf-repeater-badge-bg: #{map.get($config, repeater-badge-bg)};
601
+ --cc-sf-repeater-badge-color: #{map.get($config, repeater-badge-color)};
602
+ --cc-sf-section-border-radius-inner: #{map.get($config, section-border-radius-inner)};
603
+
604
+ // Repeater instance
605
+ --cc-sf-instance-bg: #{map.get($config, instance-bg)};
606
+ --cc-sf-instance-border: #{map.get($config, instance-border)};
607
+ --cc-sf-instance-radius: #{map.get($config, instance-radius)};
608
+ --cc-sf-instance-padding: #{map.get($config, instance-padding)};
609
+ --cc-sf-instance-divider: #{map.get($config, instance-divider)};
610
+ --cc-sf-instance-num-color:#{map.get($config, instance-num-color)};
611
+ --cc-sf-instance-num-size: #{map.get($config, instance-num-size)};
612
+
613
+ // Grid + field gap
614
+ --cc-sf-grid-gap: #{map.get($config, grid-gap)};
615
+ --cc-sf-field-gap: #{map.get($config, field-gap)};
616
+
617
+ // Focus ring
618
+ --cc-sf-focus-ring-width: #{map.get($config, focus-ring-width)};
619
+ --cc-sf-focus-ring-offset: #{map.get($config, focus-ring-offset)};
620
+
621
+ // Label
622
+ --cc-sf-label-size: #{map.get($config, label-size)};
623
+ --cc-sf-label-weight: #{map.get($config, label-weight)};
624
+ --cc-sf-label-color: #{map.get($config, label-color)};
625
+ --cc-sf-label-required-color: #{map.get($config, label-required-color)};
626
+
627
+ // Input
628
+ --cc-sf-input-bg: #{map.get($config, input-bg)};
629
+ --cc-sf-input-color: #{map.get($config, input-color)};
630
+ --cc-sf-input-placeholder: #{map.get($config, input-placeholder)};
631
+ --cc-sf-input-border: #{map.get($config, input-border)};
632
+ --cc-sf-input-radius: #{map.get($config, input-radius)};
633
+ --cc-sf-input-padding: #{map.get($config, input-padding)};
634
+ --cc-sf-input-font-size: #{map.get($config, input-font-size)};
635
+ --cc-sf-input-shadow: #{map.get($config, input-shadow)};
636
+ --cc-sf-input-hover-border:#{map.get($config, input-hover-border)};
637
+ --cc-sf-input-focus-border:#{map.get($config, input-focus-border)};
638
+ --cc-sf-input-focus-shadow:#{map.get($config, input-focus-shadow)};
639
+ --cc-sf-input-transition: #{map.get($config, input-transition)};
640
+ --cc-sf-input-disabled-bg: #{map.get($config, input-disabled-bg)};
641
+ --cc-sf-input-disabled-color: #{map.get($config, input-disabled-color)};
642
+ --cc-sf-input-disabled-border:#{map.get($config, input-disabled-border)};
643
+
644
+ // Error
645
+ --cc-sf-error-border: #{map.get($config, error-border)};
646
+ --cc-sf-error-bg: #{map.get($config, error-bg)};
647
+ --cc-sf-error-focus-shadow: #{map.get($config, error-focus-shadow)};
648
+ --cc-sf-error-text-color: #{map.get($config, error-text-color)};
649
+ --cc-sf-error-text-size: #{map.get($config, error-text-size)};
650
+
651
+ // Hint
652
+ --cc-sf-hint-color: #{map.get($config, hint-color)};
653
+ --cc-sf-hint-size: #{map.get($config, hint-size)};
654
+
655
+ // Chip
656
+ --cc-sf-chip-border: #{map.get($config, chip-border)};
657
+ --cc-sf-chip-radius: #{map.get($config, chip-radius)};
658
+ --cc-sf-chip-padding: #{map.get($config, chip-padding)};
659
+ --cc-sf-chip-bg: #{map.get($config, chip-bg)};
660
+ --cc-sf-chip-color: #{map.get($config, chip-color)};
661
+ --cc-sf-chip-hover-bg: #{map.get($config, chip-hover-bg)};
662
+ --cc-sf-chip-selected-bg: #{map.get($config, chip-selected-bg)};
663
+ --cc-sf-chip-selected-color: #{map.get($config, chip-selected-color)};
664
+ --cc-sf-chip-selected-border:#{map.get($config, chip-selected-border)};
665
+
666
+ // Switch
667
+ --cc-sf-switch-track-off: #{map.get($config, switch-track-off)};
668
+ --cc-sf-switch-track-on: #{map.get($config, switch-track-on)};
669
+ --cc-sf-switch-thumb: #{map.get($config, switch-thumb)};
670
+
671
+ // Rating
672
+ --cc-sf-star-empty: #{map.get($config, star-empty)};
673
+ --cc-sf-star-filled: #{map.get($config, star-filled)};
674
+ --cc-sf-star-size: #{map.get($config, star-size)};
675
+
676
+ // Generated
677
+ --cc-sf-generated-bg: #{map.get($config, generated-bg)};
678
+ --cc-sf-generated-border: #{map.get($config, generated-border)};
679
+ --cc-sf-generated-color: #{map.get($config, generated-color)};
680
+ --cc-sf-generated-radius: #{map.get($config, generated-radius)};
681
+ --cc-sf-generated-padding: #{map.get($config, generated-padding)};
682
+
683
+ // File upload
684
+ --cc-sf-dropzone-bg: #{map.get($config, dropzone-bg)};
685
+ --cc-sf-dropzone-border: #{map.get($config, dropzone-border)};
686
+ --cc-sf-dropzone-radius: #{map.get($config, dropzone-radius)};
687
+ --cc-sf-dropzone-hover-bg: #{map.get($config, dropzone-hover-bg)};
688
+ --cc-sf-dropzone-hover-border: #{map.get($config, dropzone-hover-border)};
689
+ --cc-sf-dropzone-over-border: #{map.get($config, dropzone-over-border)};
690
+ --cc-sf-dropzone-over-shadow: #{map.get($config, dropzone-over-shadow)};
691
+ --cc-sf-dropzone-icon-color: #{map.get($config, dropzone-icon-color)};
692
+ --cc-sf-dropzone-icon-bg: #{map.get($config, dropzone-icon-bg)};
693
+ --cc-sf-dropzone-link-color: #{map.get($config, dropzone-link-color)};
694
+ --cc-sf-dropzone-hint-color: #{map.get($config, dropzone-hint-color)};
695
+
696
+ --cc-sf-uploaded-item-bg: #{map.get($config, uploaded-item-bg)};
697
+ --cc-sf-uploaded-item-border: #{map.get($config, uploaded-item-border)};
698
+ --cc-sf-uploaded-item-radius: #{map.get($config, uploaded-item-radius)};
699
+ --cc-sf-uploaded-remove-color: #{map.get($config, uploaded-remove-color)};
700
+ --cc-sf-uploaded-remove-hover-bg: #{map.get($config, uploaded-remove-hover-bg)};
701
+ --cc-sf-uploaded-remove-hover-color: #{map.get($config, uploaded-remove-hover-color)};
702
+
703
+ // Repeater buttons
704
+ --cc-sf-btn-add-bg: #{map.get($config, btn-add-bg)};
705
+ --cc-sf-btn-add-color: #{map.get($config, btn-add-color)};
706
+ --cc-sf-btn-add-border: #{map.get($config, btn-add-border)};
707
+ --cc-sf-btn-add-radius: #{map.get($config, btn-add-radius)};
708
+ --cc-sf-btn-add-hover-bg: #{map.get($config, btn-add-hover-bg)};
709
+ --cc-sf-btn-add-hover-border: #{map.get($config, btn-add-hover-border)};
710
+
711
+ --cc-sf-btn-remove-bg: #{map.get($config, btn-remove-bg)};
712
+ --cc-sf-btn-remove-color: #{map.get($config, btn-remove-color)};
713
+ --cc-sf-btn-remove-border: #{map.get($config, btn-remove-border)};
714
+ --cc-sf-btn-remove-radius: #{map.get($config, btn-remove-radius)};
715
+ --cc-sf-btn-remove-hover-bg: #{map.get($config, btn-remove-hover-bg)};
716
+ --cc-sf-btn-remove-padding: #{map.get($config, btn-remove-padding)};
717
+ --cc-sf-btn-remove-font-size: #{map.get($config, btn-remove-font-size)};
718
+ --cc-sf-btn-remove-font-weight: #{map.get($config, btn-remove-font-weight)};
719
+ --cc-sf-btn-add-padding: #{map.get($config, btn-add-padding)};
720
+ --cc-sf-btn-add-font-size: #{map.get($config, btn-add-font-size)};
721
+ --cc-sf-btn-add-font-weight: #{map.get($config, btn-add-font-weight)};
722
+ --cc-sf-stepper-connector-display: #{map.get($config, stepper-connector-display)};
723
+ --cc-sf-instance-shadow: #{map.get($config, instance-shadow)};
724
+ --cc-sf-instance-hover-shadow: #{map.get($config, instance-hover-shadow)};
725
+ --cc-sf-instance-transition: #{map.get($config, instance-transition)};
726
+ --cc-sf-instance-header-divider: #{map.get($config, instance-header-divider)};
727
+ --cc-sf-instance-header-pb: #{map.get($config, instance-header-pb)};
728
+ --cc-sf-instance-header-mb: #{map.get($config, instance-header-mb)};
729
+ --cc-sf-instance-num-weight: #{map.get($config, instance-num-weight)};
730
+ --cc-sf-section-stepper-accent: #{map.get($config, section-stepper-accent)};
731
+ --cc-sf-section-stepper-accent-end: #{map.get($config, section-stepper-accent-end)};
732
+ --cc-sf-section-stepper-active-label: #{map.get($config, section-stepper-active-label)};
733
+ --cc-sf-section-stepper-active-glow: #{map.get($config, section-stepper-active-glow)};
734
+
735
+ // Stepper
736
+ --cc-sf-step-connector-color: #{map.get($config, step-connector-color)};
737
+ --cc-sf-step-connector-done: #{map.get($config, step-connector-done)};
738
+ --cc-sf-step-number-bg: #{map.get($config, step-number-bg)};
739
+ --cc-sf-step-number-color: #{map.get($config, step-number-color)};
740
+ --cc-sf-step-number-size: #{map.get($config, step-number-size)};
741
+ --cc-sf-step-number-font-size: #{map.get($config, step-number-font-size)};
742
+ --cc-sf-step-number-weight: #{map.get($config, step-number-weight)};
743
+ --cc-sf-step-label-size: #{map.get($config, step-label-size)};
744
+ --cc-sf-step-label-color: #{map.get($config, step-label-color)};
745
+ --cc-sf-step-label-weight: #{map.get($config, step-label-weight)};
746
+ --cc-sf-step-active-bg: #{map.get($config, step-active-bg)};
747
+ --cc-sf-step-active-color: #{map.get($config, step-active-color)};
748
+ --cc-sf-step-active-label: #{map.get($config, step-active-label)};
749
+ --cc-sf-step-active-label-weight: #{map.get($config, step-active-label-weight)};
750
+ --cc-sf-step-done-bg: #{map.get($config, step-done-bg)};
751
+ --cc-sf-step-done-color: #{map.get($config, step-done-color)};
752
+
753
+ // Action bar / submit buttons
754
+ --cc-sf-actions-border: #{map.get($config, actions-border)};
755
+ --cc-sf-actions-padding: #{map.get($config, actions-padding)};
756
+ --cc-sf-actions-gap: #{map.get($config, actions-gap)};
757
+
758
+ --cc-sf-btn-primary-bg: #{map.get($config, btn-primary-bg)};
759
+ --cc-sf-btn-primary-color: #{map.get($config, btn-primary-color)};
760
+ --cc-sf-btn-primary-radius: #{map.get($config, btn-primary-radius)};
761
+ --cc-sf-btn-primary-padding: #{map.get($config, btn-primary-padding)};
762
+ --cc-sf-btn-primary-hover-bg: #{map.get($config, btn-primary-hover-bg)};
763
+
764
+ --cc-sf-btn-secondary-bg: #{map.get($config, btn-secondary-bg)};
765
+ --cc-sf-btn-secondary-color: #{map.get($config, btn-secondary-color)};
766
+ --cc-sf-btn-secondary-radius: #{map.get($config, btn-secondary-radius)};
767
+ --cc-sf-btn-secondary-padding: #{map.get($config, btn-secondary-padding)};
768
+ --cc-sf-btn-secondary-hover-bg: #{map.get($config, btn-secondary-hover-bg)};
769
+
770
+ --cc-sf-btn-font-size: #{map.get($config, btn-font-size)};
771
+ --cc-sf-btn-font-weight: #{map.get($config, btn-font-weight)};
772
+ --cc-sf-btn-transition: #{map.get($config, btn-transition)};
773
+ --cc-sf-btn-disabled-opacity: #{map.get($config, btn-disabled-opacity)};
774
+
775
+ // ── Structural rules using the emitted tokens ─────────────────────────────
776
+ ::ng-deep {
777
+ .stepper-nav .stepper-step:not(:last-child)::after {
778
+ display: var(--cc-sf-stepper-connector-display) !important;
779
+ }
780
+
781
+ .section-instance {
782
+ background: var(--cc-sf-instance-bg) !important;
783
+ border: var(--cc-sf-instance-border) !important;
784
+ border-radius: var(--cc-sf-instance-radius) !important;
785
+ box-shadow: var(--cc-sf-instance-shadow);
786
+ transition: var(--cc-sf-instance-transition);
787
+
788
+ &:hover {
789
+ box-shadow: var(--cc-sf-instance-hover-shadow);
790
+ }
791
+ }
792
+
793
+ .section-instance-header {
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: space-between;
797
+ padding-bottom: var(--cc-sf-instance-header-pb);
798
+ margin-bottom: var(--cc-sf-instance-header-mb);
799
+ border-bottom: var(--cc-sf-instance-header-divider);
800
+ }
801
+
802
+ .section-instance-num {
803
+ font-size: var(--cc-sf-instance-num-size);
804
+ font-weight: var(--cc-sf-instance-num-weight);
805
+ color: var(--cc-sf-instance-num-color);
806
+ }
807
+
808
+ .btn-instance-remove {
809
+ display: inline-flex;
810
+ align-items: center;
811
+ gap: 6px;
812
+ padding: var(--cc-sf-btn-remove-padding);
813
+ border-radius: var(--cc-sf-btn-remove-radius);
814
+ border: var(--cc-sf-btn-remove-border) !important;
815
+ background: var(--cc-sf-btn-remove-bg);
816
+ color: var(--cc-sf-btn-remove-color) !important;
817
+ font-size: var(--cc-sf-btn-remove-font-size);
818
+ font-weight: var(--cc-sf-btn-remove-font-weight);
819
+ cursor: pointer;
820
+ transition: all 0.15s ease;
821
+
822
+ &:hover {
823
+ background: var(--cc-sf-btn-remove-hover-bg);
824
+ }
825
+ }
826
+
827
+ .btn-add-section {
828
+ display: inline-flex;
829
+ align-items: center;
830
+ gap: 8px;
831
+ padding: var(--cc-sf-btn-add-padding);
832
+ border-radius: var(--cc-sf-btn-add-radius);
833
+ border: var(--cc-sf-btn-add-border) !important;
834
+ background: var(--cc-sf-btn-add-bg);
835
+ color: var(--cc-sf-btn-add-color);
836
+ font-size: var(--cc-sf-btn-add-font-size);
837
+ font-weight: var(--cc-sf-btn-add-font-weight);
838
+ cursor: pointer;
839
+ transition: all 0.18s ease;
840
+
841
+ &:hover {
842
+ background: var(--cc-sf-btn-add-hover-bg);
843
+ border-color: var(--cc-sf-btn-add-hover-border) !important;
844
+ }
845
+ }
846
+
847
+ // ── Section stepper — accent colour override ──────────────────────────
848
+ .section-stepper-nav::before {
849
+ background: linear-gradient(
850
+ 90deg,
851
+ var(--cc-sf-section-stepper-accent) 0%,
852
+ var(--cc-sf-section-stepper-accent-end) 100%
853
+ ) !important;
854
+ }
855
+
856
+ .section-stepper-step {
857
+ &.ss-active {
858
+ .ss-badge {
859
+ background: linear-gradient(
860
+ 135deg,
861
+ var(--cc-sf-section-stepper-accent) 0%,
862
+ var(--cc-sf-section-stepper-accent-end) 100%
863
+ ) !important;
864
+ box-shadow:
865
+ 0 0 0 4px var(--cc-sf-section-stepper-active-glow),
866
+ 0 4px 12px var(--cc-sf-section-stepper-active-glow) !important;
867
+ }
868
+
869
+ .ss-label {
870
+ color: var(--cc-sf-section-stepper-active-label) !important;
871
+ }
872
+ }
873
+
874
+ &:not(.ss-active):not(.ss-completed):not(.ss-warning):hover {
875
+ .ss-badge {
876
+ color: var(--cc-sf-section-stepper-accent) !important;
877
+ border-color: var(--cc-sf-section-stepper-accent-end) !important;
878
+ }
879
+ }
880
+
881
+ .ss-connector::after {
882
+ background: linear-gradient(
883
+ 90deg,
884
+ var(--cc-sf-section-stepper-accent),
885
+ var(--cc-sf-section-stepper-accent-end)
886
+ ) !important;
887
+ }
888
+ }
889
+ }
890
890
  }