platformcommons-web-lib 1.0.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 (208) hide show
  1. package/commons-shared-web-ui-1.0.0.tgz +0 -0
  2. package/documentation/alert.md +123 -0
  3. package/documentation/button-dropdown.md +126 -0
  4. package/documentation/button.md +184 -0
  5. package/documentation/cards-usage-guidelines.md +131 -0
  6. package/documentation/configurable-form.md +605 -0
  7. package/documentation/confirmation-modal.md +250 -0
  8. package/documentation/filter-sidebar.md +178 -0
  9. package/documentation/filter-table-selector.md +228 -0
  10. package/documentation/form-builder.md +597 -0
  11. package/documentation/form-components.md +384 -0
  12. package/documentation/nav.md +427 -0
  13. package/documentation/pagination.md +181 -0
  14. package/documentation/side-nav-documentation.md +169 -0
  15. package/documentation/smart-form.md +2177 -0
  16. package/documentation/smart-table.md +1198 -0
  17. package/documentation/snackbar.md +118 -0
  18. package/documentation/style-externalization.md +88 -0
  19. package/documentation/summary-card.md +279 -0
  20. package/ng-package.json +28 -0
  21. package/package.json +54 -0
  22. package/src/lib/modules/alert/alert.models.ts +6 -0
  23. package/src/lib/modules/alert/alert.module.ts +16 -0
  24. package/src/lib/modules/alert/alert.theme.scss +85 -0
  25. package/src/lib/modules/alert/components/alert/alert.component.html +27 -0
  26. package/src/lib/modules/alert/components/alert/alert.component.scss +92 -0
  27. package/src/lib/modules/alert/components/alert/alert.component.ts +81 -0
  28. package/src/lib/modules/button/button.models.ts +13 -0
  29. package/src/lib/modules/button/button.module.ts +16 -0
  30. package/src/lib/modules/button/button.theme.scss +121 -0
  31. package/src/lib/modules/button/components/button/button.component.html +22 -0
  32. package/src/lib/modules/button/components/button/button.component.scss +88 -0
  33. package/src/lib/modules/button/components/button/button.component.ts +67 -0
  34. package/src/lib/modules/button-dropdown/button-dropdown.models.ts +26 -0
  35. package/src/lib/modules/button-dropdown/button-dropdown.module.ts +22 -0
  36. package/src/lib/modules/button-dropdown/button-dropdown.theme.scss +87 -0
  37. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html +41 -0
  38. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.scss +135 -0
  39. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts +160 -0
  40. package/src/lib/modules/configurable-form/component/configurable-form.component.html +294 -0
  41. package/src/lib/modules/configurable-form/component/configurable-form.component.scss +503 -0
  42. package/src/lib/modules/configurable-form/component/configurable-form.component.ts +628 -0
  43. package/src/lib/modules/configurable-form/configurable-form.examples.ts +154 -0
  44. package/src/lib/modules/configurable-form/configurable-form.model.ts +131 -0
  45. package/src/lib/modules/configurable-form/configurable-form.module.ts +19 -0
  46. package/src/lib/modules/configurable-form/configurable-form.theme.scss +78 -0
  47. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html +77 -0
  48. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.scss +395 -0
  49. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts +266 -0
  50. package/src/lib/modules/confirmation-modal/confirmation-modal.models.ts +71 -0
  51. package/src/lib/modules/confirmation-modal/confirmation-modal.module.ts +20 -0
  52. package/src/lib/modules/confirmation-modal/confirmation-modal.theme.scss +87 -0
  53. package/src/lib/modules/filter/components/filter/filter.component.html +131 -0
  54. package/src/lib/modules/filter/components/filter/filter.component.scss +245 -0
  55. package/src/lib/modules/filter/components/filter/filter.component.ts +216 -0
  56. package/src/lib/modules/filter/filter.models.ts +88 -0
  57. package/src/lib/modules/filter/filter.module.ts +24 -0
  58. package/src/lib/modules/filter/filter.theme.scss +92 -0
  59. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html +112 -0
  60. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.scss +186 -0
  61. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts +163 -0
  62. package/src/lib/modules/filter-sidebar/filter-sidebar.models.ts +95 -0
  63. package/src/lib/modules/filter-sidebar/filter-sidebar.module.ts +24 -0
  64. package/src/lib/modules/filter-sidebar/filter-sidebar.theme.scss +38 -0
  65. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.html +73 -0
  66. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.scss +321 -0
  67. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.ts +361 -0
  68. package/src/lib/modules/filter-table-selector/filter-table-selector.models.ts +91 -0
  69. package/src/lib/modules/filter-table-selector/filter-table-selector.module.ts +22 -0
  70. package/src/lib/modules/filter-table-selector/filter-table-selector.theme.scss +36 -0
  71. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html +63 -0
  72. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.scss +496 -0
  73. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts +445 -0
  74. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html +75 -0
  75. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.scss +210 -0
  76. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts +55 -0
  77. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html +25 -0
  78. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.scss +82 -0
  79. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts +95 -0
  80. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.html +20 -0
  81. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.scss +37 -0
  82. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.ts +94 -0
  83. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html +46 -0
  84. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.scss +102 -0
  85. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts +50 -0
  86. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html +35 -0
  87. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.scss +67 -0
  88. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts +34 -0
  89. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html +68 -0
  90. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.scss +113 -0
  91. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts +74 -0
  92. package/src/lib/modules/form-builder/configs/field-type-schema.map.ts +533 -0
  93. package/src/lib/modules/form-builder/form-builder.module.ts +36 -0
  94. package/src/lib/modules/form-builder/form-builder.theme.scss +212 -0
  95. package/src/lib/modules/form-builder/index.ts +9 -0
  96. package/src/lib/modules/form-builder/models/builder.models.ts +7 -0
  97. package/src/lib/modules/form-builder/models/field-configurator.models.ts +38 -0
  98. package/src/lib/modules/form-builder/models/field-selection.models.ts +51 -0
  99. package/src/lib/modules/form-builder/services/field-configurator.service.ts +258 -0
  100. package/src/lib/modules/form-builder/services/field-selection.service.ts +300 -0
  101. package/src/lib/modules/form-builder/services/form-schema-tree.service.ts +652 -0
  102. package/src/lib/modules/form-builder/tokens/builder.tokens.ts +10 -0
  103. package/src/lib/modules/form-builder/utils/constants.ts +43 -0
  104. package/src/lib/modules/form-components/components/checkbox/_theme.scss +63 -0
  105. package/src/lib/modules/form-components/components/checkbox/checkbox.component.html +29 -0
  106. package/src/lib/modules/form-components/components/checkbox/checkbox.component.scss +111 -0
  107. package/src/lib/modules/form-components/components/checkbox/checkbox.component.ts +207 -0
  108. package/src/lib/modules/form-components/components/checkbox/checkbox.models.ts +35 -0
  109. package/src/lib/modules/form-components/components/datepicker/_theme.scss +82 -0
  110. package/src/lib/modules/form-components/components/datepicker/datepicker.component.html +42 -0
  111. package/src/lib/modules/form-components/components/datepicker/datepicker.component.scss +115 -0
  112. package/src/lib/modules/form-components/components/datepicker/datepicker.component.ts +267 -0
  113. package/src/lib/modules/form-components/components/datepicker/datepicker.models.ts +45 -0
  114. package/src/lib/modules/form-components/components/dropdown/_theme.scss +91 -0
  115. package/src/lib/modules/form-components/components/dropdown/dropdown.component.html +74 -0
  116. package/src/lib/modules/form-components/components/dropdown/dropdown.component.scss +252 -0
  117. package/src/lib/modules/form-components/components/dropdown/dropdown.component.ts +377 -0
  118. package/src/lib/modules/form-components/components/dropdown/dropdown.models.ts +53 -0
  119. package/src/lib/modules/form-components/components/input/_theme.scss +77 -0
  120. package/src/lib/modules/form-components/components/input/input.component.html +51 -0
  121. package/src/lib/modules/form-components/components/input/input.component.scss +128 -0
  122. package/src/lib/modules/form-components/components/input/input.component.ts +250 -0
  123. package/src/lib/modules/form-components/components/input/input.models.ts +55 -0
  124. package/src/lib/modules/form-components/components/radio/_theme.scss +61 -0
  125. package/src/lib/modules/form-components/components/radio/radio.component.html +22 -0
  126. package/src/lib/modules/form-components/components/radio/radio.component.scss +107 -0
  127. package/src/lib/modules/form-components/components/radio/radio.component.ts +181 -0
  128. package/src/lib/modules/form-components/components/radio/radio.models.ts +39 -0
  129. package/src/lib/modules/form-components/components/search/_theme.scss +73 -0
  130. package/src/lib/modules/form-components/components/search/search.component.html +15 -0
  131. package/src/lib/modules/form-components/components/search/search.component.scss +87 -0
  132. package/src/lib/modules/form-components/components/search/search.component.ts +213 -0
  133. package/src/lib/modules/form-components/components/search/search.models.ts +40 -0
  134. package/src/lib/modules/form-components/components/toggle/_theme.scss +45 -0
  135. package/src/lib/modules/form-components/components/toggle/toggle.component.html +15 -0
  136. package/src/lib/modules/form-components/components/toggle/toggle.component.scss +81 -0
  137. package/src/lib/modules/form-components/components/toggle/toggle.component.ts +166 -0
  138. package/src/lib/modules/form-components/components/toggle/toggle.models.ts +27 -0
  139. package/src/lib/modules/form-components/directives/click-outside.directive.ts +22 -0
  140. package/src/lib/modules/form-components/form-components.module.ts +41 -0
  141. package/src/lib/modules/form-components/form-components.theme.scss +25 -0
  142. package/src/lib/modules/material/material.module.ts +94 -0
  143. package/src/lib/modules/nav/components/nav/nav.component.html +34 -0
  144. package/src/lib/modules/nav/components/nav/nav.component.scss +171 -0
  145. package/src/lib/modules/nav/components/nav/nav.component.ts +82 -0
  146. package/src/lib/modules/nav/nav.models.ts +31 -0
  147. package/src/lib/modules/nav/nav.module.ts +17 -0
  148. package/src/lib/modules/nav/nav.theme.scss +86 -0
  149. package/src/lib/modules/pagination/components/pagination/pagination.component.html +52 -0
  150. package/src/lib/modules/pagination/components/pagination/pagination.component.scss +155 -0
  151. package/src/lib/modules/pagination/components/pagination/pagination.component.ts +109 -0
  152. package/src/lib/modules/pagination/pagination.module.ts +17 -0
  153. package/src/lib/modules/pagination/pagination.theme.scss +66 -0
  154. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.html +56 -0
  155. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.scss +342 -0
  156. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.ts +135 -0
  157. package/src/lib/modules/side-nav/side-nav.models.ts +38 -0
  158. package/src/lib/modules/side-nav/side-nav.module.ts +16 -0
  159. package/src/lib/modules/side-nav/side-nav.theme.scss +111 -0
  160. package/src/lib/modules/smart-form/components/form-field/form-field.component.html +1109 -0
  161. package/src/lib/modules/smart-form/components/form-field/form-field.component.scss +1860 -0
  162. package/src/lib/modules/smart-form/components/form-field/form-field.component.ts +2232 -0
  163. package/src/lib/modules/smart-form/components/form-section/form-section.component.html +64 -0
  164. package/src/lib/modules/smart-form/components/form-section/form-section.component.scss +209 -0
  165. package/src/lib/modules/smart-form/components/form-section/form-section.component.ts +119 -0
  166. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.html +253 -0
  167. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.scss +689 -0
  168. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.ts +1087 -0
  169. package/src/lib/modules/smart-form/index.ts +10 -0
  170. package/src/lib/modules/smart-form/models/form-schema.model.ts +700 -0
  171. package/src/lib/modules/smart-form/models/hierarchy-config.model.ts +21 -0
  172. package/src/lib/modules/smart-form/services/expression.service.ts +75 -0
  173. package/src/lib/modules/smart-form/services/smart-form-controller.service.ts +65 -0
  174. package/src/lib/modules/smart-form/smart-form.examples.ts +1324 -0
  175. package/src/lib/modules/smart-form/smart-form.module.ts +36 -0
  176. package/src/lib/modules/smart-form/smart-form.theme.scss +890 -0
  177. package/src/lib/modules/smart-form/utils/translation.utils.ts +82 -0
  178. package/src/lib/modules/smart-form/utils/trusted-url.pipe.ts +25 -0
  179. package/src/lib/modules/smart-form/utils/validation.utils.ts +98 -0
  180. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.html +283 -0
  181. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.scss +685 -0
  182. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.ts +1118 -0
  183. package/src/lib/modules/smart-table/models/table-config.model.ts +202 -0
  184. package/src/lib/modules/smart-table/smart-table.module.ts +30 -0
  185. package/src/lib/modules/smart-table/smart-table.theme.scss +335 -0
  186. package/src/lib/modules/smart-table/utils/safe-html.pipe.ts +22 -0
  187. package/src/lib/modules/smart-table/utils/smart-table.utils.ts +18 -0
  188. package/src/lib/modules/snackbar/components/snackbar.component.html +41 -0
  189. package/src/lib/modules/snackbar/components/snackbar.component.scss +99 -0
  190. package/src/lib/modules/snackbar/components/snackbar.component.ts +18 -0
  191. package/src/lib/modules/snackbar/models/snackbar.models.ts +10 -0
  192. package/src/lib/modules/snackbar/services/snackbar.service.ts +40 -0
  193. package/src/lib/modules/snackbar/snackbar.module.ts +11 -0
  194. package/src/lib/modules/snackbar/snackbar.theme.scss +93 -0
  195. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.html +47 -0
  196. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.scss +199 -0
  197. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.ts +126 -0
  198. package/src/lib/modules/summary-card/summary-card.module.ts +18 -0
  199. package/src/lib/modules/summary-card/summary-card.theme.scss +176 -0
  200. package/src/lib/shared-ui.module.ts +44 -0
  201. package/src/lib/styles/global.scss +152 -0
  202. package/src/lib/styles/utilities.scss +250 -0
  203. package/src/lib/utils/constants.ts +11 -0
  204. package/src/lib/utils/storage.utils.ts +37 -0
  205. package/src/lib/utils/string.utils.ts +23 -0
  206. package/src/lib/utils/translation.utils.ts +87 -0
  207. package/src/public-api.ts +104 -0
  208. package/tsconfig.lib.json +15 -0
@@ -0,0 +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
+ }
890
+ }