commons-shared-web-ui 0.0.61 → 0.0.62

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 (223) hide show
  1. package/.claude/settings.local.json +10 -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 +599 -0
  11. package/documentation/form-components.md +384 -0
  12. package/documentation/form-field-configuration.md +250 -0
  13. package/documentation/nav.md +427 -0
  14. package/documentation/pagination.md +181 -0
  15. package/documentation/side-nav-documentation.md +169 -0
  16. package/documentation/smart-form.md +2819 -0
  17. package/documentation/smart-table.md +1297 -0
  18. package/documentation/snackbar.md +118 -0
  19. package/documentation/style-externalization.md +88 -0
  20. package/documentation/summary-card.md +279 -0
  21. package/documentation/table-column-configuration.md +221 -0
  22. package/documentation/time-picker.md +274 -0
  23. package/ng-package.json +30 -0
  24. package/package.json +53 -34
  25. package/src/lib/modules/alert/alert.models.ts +6 -0
  26. package/src/lib/modules/alert/alert.module.ts +16 -0
  27. package/src/lib/modules/alert/components/alert/alert.component.html +27 -0
  28. package/src/lib/modules/alert/components/alert/alert.component.scss +92 -0
  29. package/src/lib/modules/alert/components/alert/alert.component.ts +81 -0
  30. package/src/lib/modules/button/button.models.ts +13 -0
  31. package/src/lib/modules/button/button.module.ts +16 -0
  32. package/src/lib/modules/button/components/button/button.component.html +22 -0
  33. package/src/lib/modules/button/components/button/button.component.scss +92 -0
  34. package/src/lib/modules/button/components/button/button.component.ts +67 -0
  35. package/src/lib/modules/button-dropdown/button-dropdown.models.ts +26 -0
  36. package/src/lib/modules/button-dropdown/button-dropdown.module.ts +22 -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/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html +77 -0
  47. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.scss +395 -0
  48. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts +266 -0
  49. package/src/lib/modules/confirmation-modal/confirmation-modal.models.ts +71 -0
  50. package/src/lib/modules/confirmation-modal/confirmation-modal.module.ts +20 -0
  51. package/src/lib/modules/filter/components/filter/filter.component.html +131 -0
  52. package/src/lib/modules/filter/components/filter/filter.component.scss +245 -0
  53. package/src/lib/modules/filter/components/filter/filter.component.ts +216 -0
  54. package/src/lib/modules/filter/filter.models.ts +88 -0
  55. package/src/lib/modules/filter/filter.module.ts +24 -0
  56. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html +112 -0
  57. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.scss +186 -0
  58. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts +163 -0
  59. package/src/lib/modules/filter-sidebar/filter-sidebar.models.ts +95 -0
  60. package/src/lib/modules/filter-sidebar/filter-sidebar.module.ts +24 -0
  61. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.html +73 -0
  62. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.scss +321 -0
  63. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.ts +361 -0
  64. package/src/lib/modules/filter-table-selector/filter-table-selector.models.ts +91 -0
  65. package/src/lib/modules/filter-table-selector/filter-table-selector.module.ts +22 -0
  66. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html +63 -0
  67. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.scss +496 -0
  68. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts +445 -0
  69. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html +75 -0
  70. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.scss +210 -0
  71. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts +55 -0
  72. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html +25 -0
  73. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.scss +82 -0
  74. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts +95 -0
  75. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.html +20 -0
  76. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.scss +37 -0
  77. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.ts +94 -0
  78. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html +46 -0
  79. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.scss +102 -0
  80. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts +50 -0
  81. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html +35 -0
  82. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.scss +67 -0
  83. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts +34 -0
  84. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html +68 -0
  85. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.scss +113 -0
  86. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts +74 -0
  87. package/src/lib/modules/form-builder/configs/field-type-schema.map.ts +533 -0
  88. package/src/lib/modules/form-builder/form-builder.module.ts +36 -0
  89. package/src/lib/modules/form-builder/index.ts +9 -0
  90. package/src/lib/modules/form-builder/models/builder.models.ts +7 -0
  91. package/src/lib/modules/form-builder/models/field-configurator.models.ts +38 -0
  92. package/src/lib/modules/form-builder/models/field-selection.models.ts +51 -0
  93. package/src/lib/modules/form-builder/services/field-configurator.service.ts +258 -0
  94. package/src/lib/modules/form-builder/services/field-selection.service.ts +299 -0
  95. package/src/lib/modules/form-builder/services/form-schema-tree.service.ts +670 -0
  96. package/src/lib/modules/form-builder/tokens/builder.tokens.ts +10 -0
  97. package/src/lib/modules/form-builder/utils/constants.ts +43 -0
  98. package/src/lib/modules/form-components/components/checkbox/checkbox.component.html +29 -0
  99. package/src/lib/modules/form-components/components/checkbox/checkbox.component.scss +111 -0
  100. package/src/lib/modules/form-components/components/checkbox/checkbox.component.ts +207 -0
  101. package/src/lib/modules/form-components/components/checkbox/checkbox.models.ts +35 -0
  102. package/src/lib/modules/form-components/components/datepicker/datepicker.component.html +42 -0
  103. package/src/lib/modules/form-components/components/datepicker/datepicker.component.scss +115 -0
  104. package/src/lib/modules/form-components/components/datepicker/datepicker.component.ts +267 -0
  105. package/src/lib/modules/form-components/components/datepicker/datepicker.models.ts +45 -0
  106. package/src/lib/modules/form-components/components/dropdown/dropdown.component.html +74 -0
  107. package/src/lib/modules/form-components/components/dropdown/dropdown.component.scss +252 -0
  108. package/src/lib/modules/form-components/components/dropdown/dropdown.component.ts +377 -0
  109. package/src/lib/modules/form-components/components/dropdown/dropdown.models.ts +53 -0
  110. package/src/lib/modules/form-components/components/input/input.component.html +51 -0
  111. package/src/lib/modules/form-components/components/input/input.component.scss +128 -0
  112. package/src/lib/modules/form-components/components/input/input.component.ts +250 -0
  113. package/src/lib/modules/form-components/components/input/input.models.ts +55 -0
  114. package/src/lib/modules/form-components/components/radio/radio.component.html +22 -0
  115. package/src/lib/modules/form-components/components/radio/radio.component.scss +107 -0
  116. package/src/lib/modules/form-components/components/radio/radio.component.ts +181 -0
  117. package/src/lib/modules/form-components/components/radio/radio.models.ts +39 -0
  118. package/src/lib/modules/form-components/components/search/search.component.html +15 -0
  119. package/src/lib/modules/form-components/components/search/search.component.scss +87 -0
  120. package/src/lib/modules/form-components/components/search/search.component.ts +213 -0
  121. package/src/lib/modules/form-components/components/search/search.models.ts +40 -0
  122. package/src/lib/modules/form-components/components/toggle/toggle.component.html +15 -0
  123. package/src/lib/modules/form-components/components/toggle/toggle.component.scss +81 -0
  124. package/src/lib/modules/form-components/components/toggle/toggle.component.ts +166 -0
  125. package/src/lib/modules/form-components/components/toggle/toggle.models.ts +27 -0
  126. package/src/lib/modules/form-components/directives/click-outside.directive.ts +22 -0
  127. package/src/lib/modules/form-components/form-components.module.ts +42 -0
  128. package/src/lib/modules/form-field-configuration/components/_ffc-controls.scss +89 -0
  129. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.html +68 -0
  130. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.scss +73 -0
  131. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.ts +34 -0
  132. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.html +78 -0
  133. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.scss +83 -0
  134. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.ts +94 -0
  135. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.html +38 -0
  136. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.scss +42 -0
  137. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.ts +92 -0
  138. package/src/lib/modules/form-field-configuration/form-field-configuration.module.ts +23 -0
  139. package/src/lib/modules/form-field-configuration/index.ts +7 -0
  140. package/src/lib/modules/form-field-configuration/models/field-configuration.models.ts +62 -0
  141. package/src/lib/modules/form-field-configuration/services/config-schema-tree.service.ts +159 -0
  142. package/src/lib/modules/form-field-configuration/services/field-configuration.service.ts +228 -0
  143. package/src/lib/modules/material/material.module.ts +94 -0
  144. package/src/lib/modules/nav/components/nav/nav.component.html +34 -0
  145. package/src/lib/modules/nav/components/nav/nav.component.scss +171 -0
  146. package/src/lib/modules/nav/components/nav/nav.component.ts +82 -0
  147. package/src/lib/modules/nav/nav.models.ts +31 -0
  148. package/src/lib/modules/nav/nav.module.ts +17 -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/side-nav/components/side-nav/side-nav.component.html +56 -0
  154. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.scss +342 -0
  155. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.ts +135 -0
  156. package/src/lib/modules/side-nav/side-nav.models.ts +38 -0
  157. package/src/lib/modules/side-nav/side-nav.module.ts +16 -0
  158. package/src/lib/modules/smart-form/components/form-field/form-field.component.html +1379 -0
  159. package/src/lib/modules/smart-form/components/form-field/form-field.component.scss +2255 -0
  160. package/src/lib/modules/smart-form/components/form-field/form-field.component.ts +3174 -0
  161. package/src/lib/modules/smart-form/components/form-section/form-section.component.html +67 -0
  162. package/src/lib/modules/smart-form/components/form-section/form-section.component.scss +209 -0
  163. package/src/lib/modules/smart-form/components/form-section/form-section.component.ts +142 -0
  164. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.html +253 -0
  165. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.scss +689 -0
  166. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.ts +1134 -0
  167. package/src/lib/modules/smart-form/index.ts +10 -0
  168. package/src/lib/modules/smart-form/models/form-schema.model.ts +803 -0
  169. package/src/lib/modules/smart-form/models/hierarchy-config.model.ts +22 -0
  170. package/src/lib/modules/smart-form/services/expression.service.ts +75 -0
  171. package/src/lib/modules/smart-form/services/smart-form-controller.service.ts +67 -0
  172. package/src/lib/modules/smart-form/smart-form.examples.ts +1324 -0
  173. package/src/lib/modules/smart-form/smart-form.module.ts +40 -0
  174. package/src/lib/modules/smart-form/smart-form.theme.scss +1 -0
  175. package/src/lib/modules/smart-form/utils/translation.utils.ts +82 -0
  176. package/src/lib/modules/smart-form/utils/trusted-url.pipe.ts +25 -0
  177. package/src/lib/modules/smart-form/utils/validation.utils.ts +98 -0
  178. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.html +283 -0
  179. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.scss +685 -0
  180. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.ts +1219 -0
  181. package/src/lib/modules/smart-table/models/table-config.model.ts +247 -0
  182. package/src/lib/modules/smart-table/smart-table.module.ts +30 -0
  183. package/src/lib/modules/smart-table/utils/safe-html.pipe.ts +28 -0
  184. package/src/lib/modules/smart-table/utils/smart-table.utils.ts +18 -0
  185. package/src/lib/modules/snackbar/components/snackbar.component.html +41 -0
  186. package/src/lib/modules/snackbar/components/snackbar.component.scss +99 -0
  187. package/src/lib/modules/snackbar/components/snackbar.component.ts +18 -0
  188. package/src/lib/modules/snackbar/models/snackbar.models.ts +10 -0
  189. package/src/lib/modules/snackbar/services/snackbar.service.ts +40 -0
  190. package/src/lib/modules/snackbar/snackbar.module.ts +11 -0
  191. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.html +47 -0
  192. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.scss +199 -0
  193. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.ts +126 -0
  194. package/src/lib/modules/summary-card/summary-card.module.ts +18 -0
  195. package/src/lib/modules/table-column-configuration/components/_tcc-controls.scss +53 -0
  196. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.html +47 -0
  197. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.scss +50 -0
  198. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.ts +33 -0
  199. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.html +30 -0
  200. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.scss +36 -0
  201. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.ts +78 -0
  202. package/src/lib/modules/table-column-configuration/index.ts +5 -0
  203. package/src/lib/modules/table-column-configuration/models/table-column-configuration.models.ts +20 -0
  204. package/src/lib/modules/table-column-configuration/services/table-column-configuration.service.ts +77 -0
  205. package/src/lib/modules/table-column-configuration/table-column-configuration.module.ts +21 -0
  206. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.html +37 -0
  207. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.scss +102 -0
  208. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.ts +178 -0
  209. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.html +78 -0
  210. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.scss +226 -0
  211. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.ts +595 -0
  212. package/src/lib/modules/time-picker/models/time-picker.models.ts +49 -0
  213. package/src/lib/modules/time-picker/time-picker.module.ts +23 -0
  214. package/src/lib/shared-ui.module.ts +55 -0
  215. package/src/lib/utils/constants.ts +11 -0
  216. package/src/lib/utils/storage.utils.ts +37 -0
  217. package/src/lib/utils/string.utils.ts +23 -0
  218. package/src/lib/utils/translation.utils.ts +87 -0
  219. package/src/public-api.ts +127 -0
  220. package/tsconfig.lib.json +15 -0
  221. package/fesm2022/commons-shared-web-ui.mjs +0 -16097
  222. package/fesm2022/commons-shared-web-ui.mjs.map +0 -1
  223. package/index.d.ts +0 -5022
@@ -0,0 +1,2255 @@
1
+ @import '../../../../styles/utilities.scss';
2
+
3
+ .form-field {
4
+ font-family: var(--cc-sf-font-family, 'Poppins', sans-serif) !important;
5
+ }
6
+
7
+ // Generated (formula) values such as the donor short code can be a single long
8
+ // token with no spaces (e.g. SAI_VENKATESH_...), which overflows the box. Force
9
+ // it to wrap within the container.
10
+ .generated-value {
11
+ word-break: break-all;
12
+ }
13
+
14
+ /* Base Variable Fallbacks (mapping to global.scss tokens) */
15
+ :host {
16
+ --cc-sf-input-border: #D1D5DB;
17
+ --cc-sf-input-bg: #ffffff;
18
+ --cc-sf-input-radius: 9px;
19
+ --cc-sf-input-height: 44px;
20
+ --cc-sf-label-color: #111827;
21
+ --cc-sf-hint-color: #9CA3AF;
22
+ --cc-sf-error-border: #EF4444;
23
+ --cc-sf-error-bg: #FFF5F5;
24
+ /* Indigo accent for focus rings */
25
+ --cc-sf-accent-color: #6366F1;
26
+ --cc-sf-input-focus-border: #6366F1;
27
+ --cc-sf-input-hover-border: #A5B4FC;
28
+ --cc-sf-input-placeholder: #C4C9D4;
29
+ --cc-sf-input-disabled-bg: #F8F9FB;
30
+ --cc-sf-input-disabled-border: #E5E7EB;
31
+ --cc-sf-switch-track-on: #6366F1;
32
+ --cc-sf-switch-track-off: #D1D5DB;
33
+ --cc-sf-switch-thumb: #ffffff;
34
+ --cc-sf-selected-color: #6366F1;
35
+ }
36
+
37
+ .form-row {
38
+ gap: var(--cc-sf-grid-gap, 16px);
39
+
40
+ &.horizontal {
41
+ display: flex;
42
+ flex-direction: row;
43
+
44
+ >* {
45
+ flex: 1;
46
+ }
47
+ }
48
+
49
+ &:not(.horizontal) {
50
+ flex-direction: column;
51
+ }
52
+
53
+ &.grid-row {
54
+ display: grid;
55
+ grid-template-columns: repeat(12, 1fr);
56
+ gap: var(--cc-sf-grid-gap, 16px);
57
+ align-items: start;
58
+
59
+ @media (max-width: 640px) {
60
+ grid-template-columns: 1fr;
61
+
62
+ .row-field {
63
+ grid-column: span 12 !important;
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ .field-label {
70
+ font-size: 0.8rem !important;
71
+ font-weight: 600 !important;
72
+ line-height: 1.2;
73
+ letter-spacing: .04em;
74
+ text-transform: uppercase !important;
75
+ color: #202124 !important;
76
+ margin-bottom: var(--cc-sf-label-mb, 0px) !important;
77
+ }
78
+
79
+ .field-input,
80
+ input.matInput,
81
+ .mat-mdc-input-element {
82
+ display: block;
83
+ width: 100%;
84
+ height: var(--cc-sf-input-height) !important;
85
+ padding: 0 14px !important;
86
+ font-family: inherit;
87
+ font-size: 0.9rem;
88
+ color: var(--cc-sf-label-color);
89
+ background-color: var(--cc-sf-input-bg) !important;
90
+ border: 1.5px solid var(--cc-sf-input-border) !important;
91
+ border-radius: var(--cc-sf-input-radius) !important;
92
+ box-sizing: border-box;
93
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .04) !important;
94
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
95
+
96
+ &::placeholder {
97
+ font-weight: 400;
98
+ font-size: 14px;
99
+ color: var(--cc-sf-input-placeholder);
100
+ }
101
+ }
102
+
103
+ .field-input {
104
+ opacity: var(--cc-sf-input-opacity, 1);
105
+ line-height: var(--cc-sf-input-line-height, 1.5);
106
+ transition: var(--cc-sf-input-transition, all 0.2s ease);
107
+
108
+ &::placeholder {
109
+ font-weight: var(--cc-sf-placeholder-weight, 400);
110
+ font-size: var(--cc-sf-placeholder-size, 14px);
111
+ line-height: var(--cc-sf-placeholder-line-height, 100%);
112
+ color: var(--cc-sf-input-placeholder);
113
+ }
114
+
115
+ &:hover:not(:disabled):not([readonly]) {
116
+ border-color: var(--cc-sf-input-hover-border) !important;
117
+ box-shadow: 0 1px 4px rgba(99, 102, 241, .08) !important;
118
+ }
119
+
120
+ &:focus {
121
+ outline: none;
122
+ border-color: var(--cc-sf-input-focus-border) !important;
123
+ box-shadow:
124
+ 0 0 0 3px rgba(99, 102, 241, .14),
125
+ 0 1px 4px rgba(99, 102, 241, .1) !important;
126
+ background-color: #FEFEFF !important;
127
+ }
128
+
129
+ &:disabled,
130
+ &[readonly] {
131
+ background-color: var(--cc-sf-input-disabled-bg) !important;
132
+ color: #9CA3AF !important;
133
+ cursor: not-allowed;
134
+ border-color: var(--cc-sf-input-disabled-border) !important;
135
+ box-shadow: none !important;
136
+ }
137
+
138
+ &.is-invalid {
139
+ border-color: var(--cc-sf-error-border) !important;
140
+ background-color: var(--cc-sf-error-bg) !important;
141
+
142
+ &:focus {
143
+ box-shadow:
144
+ 0 0 0 3px rgba(239, 68, 68, .12),
145
+ 0 1px 4px rgba(239, 68, 68, .1) !important;
146
+ }
147
+ }
148
+
149
+ &.textarea {
150
+ resize: vertical;
151
+ min-height: 100px;
152
+ height: auto;
153
+ padding: 12px 16px !important;
154
+ }
155
+ }
156
+
157
+ input[type="time"].time-input {
158
+ cursor: pointer;
159
+
160
+ &::-webkit-calendar-picker-indicator {
161
+ cursor: pointer;
162
+ opacity: 0.7;
163
+ filter: invert(30%);
164
+
165
+ &:hover {
166
+ opacity: 1;
167
+ }
168
+ }
169
+ }
170
+
171
+ select.field-input {
172
+ appearance: none;
173
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");
174
+ background-position: right 0.5rem center;
175
+ background-repeat: no-repeat;
176
+ background-size: 1.5em 1.5em;
177
+ padding-right: 2.5rem;
178
+ cursor: pointer;
179
+
180
+ &:disabled {
181
+ cursor: not-allowed;
182
+ }
183
+ }
184
+
185
+ // ── Shared dropdown search input ────────────────────────────────────────────
186
+ .dropdown-search-wrapper {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: 8px;
190
+ padding: 8px 12px;
191
+ border-bottom: 1px solid var(--cc-sf-input-border, #E5E7EB);
192
+ background: var(--cc-sf-input-bg, #ffffff);
193
+
194
+ .dropdown-search-icon {
195
+ font-size: 18px;
196
+ width: 18px;
197
+ height: 18px;
198
+ color: var(--cc-sf-input-placeholder, #9CA3AF);
199
+ flex-shrink: 0;
200
+ }
201
+
202
+ .dropdown-search-input {
203
+ flex: 1;
204
+ border: none;
205
+ outline: none;
206
+ background: transparent;
207
+ font-size: 0.875rem;
208
+ color: var(--cc-sf-label-color, #111827);
209
+ font-family: inherit;
210
+
211
+ &::placeholder {
212
+ color: var(--cc-sf-input-placeholder, #C4C9D4);
213
+ }
214
+ }
215
+
216
+ .dropdown-search-clear {
217
+ font-size: 18px;
218
+ width: 18px;
219
+ height: 18px;
220
+ color: var(--cc-sf-input-placeholder, #9CA3AF);
221
+ flex-shrink: 0;
222
+ transition: color 0.15s;
223
+
224
+ &:hover {
225
+ color: var(--cc-sf-label-color, #111827);
226
+ }
227
+ }
228
+ }
229
+
230
+ // ── Multiple-select custom dropdown ─────────────────────────────────────────
231
+ .multi-select-wrapper {
232
+ position: relative;
233
+
234
+ .multi-select-trigger {
235
+ min-height: var(--cc-sf-input-height, 44px);
236
+ height: auto;
237
+ user-select: none;
238
+
239
+ &.ms-open {
240
+ border-color: var(--cc-sf-input-focus-border, #6366F1) !important;
241
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, .14), 0 1px 4px rgba(99, 102, 241, .1) !important;
242
+ }
243
+
244
+ .multi-select-value {
245
+ flex: 1;
246
+ color: var(--cc-sf-label-color, #111827);
247
+ white-space: nowrap;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ .multi-select-placeholder {
253
+ flex: 1;
254
+ font-weight: 400;
255
+ font-size: 14px;
256
+ color: var(--cc-sf-input-placeholder, #C4C9D4);
257
+ }
258
+
259
+ .multi-select-arrow {
260
+ font-size: 20px;
261
+ width: 20px;
262
+ height: 20px;
263
+ line-height: 20px;
264
+ color: var(--cc-sf-label-color, #6B7280);
265
+ flex-shrink: 0;
266
+ }
267
+ }
268
+
269
+ .multi-select-panel {
270
+ position: absolute;
271
+ top: calc(100% + 4px);
272
+ left: 0;
273
+ right: 0;
274
+ background: var(--cc-sf-input-bg, #ffffff);
275
+ border: 1.5px solid var(--cc-sf-input-border, #D1D5DB);
276
+ border-radius: var(--cc-sf-input-radius, 9px);
277
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10), 0 2px 6px rgba(0, 0, 0, 0.06);
278
+ z-index: 1050;
279
+ display: flex;
280
+ flex-direction: column;
281
+ overflow: hidden;
282
+ max-height: 320px;
283
+ }
284
+
285
+ .multi-select-options-list {
286
+ flex: 1;
287
+ overflow-y: auto;
288
+ max-height: 240px;
289
+
290
+ &::-webkit-scrollbar { width: 4px; }
291
+ &::-webkit-scrollbar-thumb {
292
+ background: var(--cc-sf-input-border, #D1D5DB);
293
+ border-radius: 2px;
294
+ }
295
+ }
296
+
297
+ .multi-select-option {
298
+ padding: 8px 12px;
299
+ border-bottom: 1px solid var(--cc-sf-input-border, #F3F4F6);
300
+ transition: background 0.1s;
301
+
302
+ &:last-of-type { border-bottom: none; }
303
+
304
+ &:hover { background: var(--cc-sf-input-hover-bg, #F9FAFB); }
305
+
306
+ input[type='checkbox'] {
307
+ flex-shrink: 0;
308
+ cursor: pointer;
309
+ accent-color: var(--cc-sf-selected-color, #6366F1);
310
+ width: 15px;
311
+ height: 15px;
312
+ }
313
+
314
+ &.multi-select-all {
315
+ border-bottom: 1px solid var(--cc-sf-input-border, #E5E7EB);
316
+ background: var(--cc-sf-input-bg, #FAFBFC);
317
+ }
318
+ }
319
+
320
+ .multi-select-empty {
321
+ padding: 12px;
322
+ text-align: center;
323
+ }
324
+
325
+ &.is-invalid .multi-select-trigger {
326
+ border-color: var(--cc-sf-error-border, #EF4444) !important;
327
+ background-color: var(--cc-sf-error-bg, #FFF5F5) !important;
328
+ }
329
+ }
330
+
331
+ // ── Single-select searchable custom dropdown ────────────────────────────────
332
+ .single-select-wrapper {
333
+ position: relative;
334
+
335
+ .single-select-trigger {
336
+ min-height: var(--cc-sf-input-height, 44px);
337
+ height: auto;
338
+ user-select: none;
339
+
340
+ &.ss-open {
341
+ border-color: var(--cc-sf-input-focus-border, #6366F1) !important;
342
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, .14), 0 1px 4px rgba(99, 102, 241, .1) !important;
343
+ }
344
+
345
+ .single-select-value {
346
+ flex: 1;
347
+ color: var(--cc-sf-label-color, #111827);
348
+ white-space: nowrap;
349
+ overflow: hidden;
350
+ text-overflow: ellipsis;
351
+ }
352
+
353
+ .single-select-placeholder {
354
+ flex: 1;
355
+ font-weight: 400;
356
+ font-size: 14px;
357
+ color: var(--cc-sf-input-placeholder, #C4C9D4);
358
+ }
359
+
360
+ .single-select-arrow {
361
+ font-size: 20px;
362
+ width: 20px;
363
+ height: 20px;
364
+ line-height: 20px;
365
+ color: var(--cc-sf-label-color, #6B7280);
366
+ flex-shrink: 0;
367
+ }
368
+ }
369
+
370
+ .single-select-panel {
371
+ position: absolute;
372
+ top: calc(100% + 4px);
373
+ left: 0;
374
+ right: 0;
375
+ background: var(--cc-sf-input-bg, #ffffff);
376
+ border: 1.5px solid var(--cc-sf-input-border, #D1D5DB);
377
+ border-radius: var(--cc-sf-input-radius, 9px);
378
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10), 0 2px 6px rgba(0, 0, 0, 0.06);
379
+ z-index: 1050;
380
+ display: flex;
381
+ flex-direction: column;
382
+ overflow: hidden;
383
+ max-height: 320px;
384
+ }
385
+
386
+ .single-select-options-list {
387
+ flex: 1;
388
+ overflow-y: auto;
389
+ max-height: 240px;
390
+
391
+ &::-webkit-scrollbar { width: 4px; }
392
+ &::-webkit-scrollbar-thumb {
393
+ background: var(--cc-sf-input-border, #D1D5DB);
394
+ border-radius: 2px;
395
+ }
396
+ }
397
+
398
+ .single-select-option {
399
+ padding: 8px 12px;
400
+ border-bottom: 1px solid var(--cc-sf-input-border, #F3F4F6);
401
+ transition: background 0.1s;
402
+ justify-content: space-between;
403
+
404
+ &:last-of-type { border-bottom: none; }
405
+
406
+ &:hover { background: var(--cc-sf-input-hover-bg, #F9FAFB); }
407
+
408
+ &.selected {
409
+ background: var(--cc-sf-input-hover-bg, #F0F5FF);
410
+ color: var(--cc-sf-selected-color, #6366F1);
411
+ }
412
+
413
+ .single-select-check {
414
+ font-size: 18px;
415
+ width: 18px;
416
+ height: 18px;
417
+ color: var(--cc-sf-selected-color, #6366F1);
418
+ }
419
+ }
420
+
421
+ &.is-invalid .single-select-trigger {
422
+ border-color: var(--cc-sf-error-border, #EF4444) !important;
423
+ background-color: var(--cc-sf-error-bg, #FFF5F5) !important;
424
+ }
425
+ }
426
+
427
+ // ── Custom dropdown panels (rendered in a CDK connected overlay) ─────────────
428
+ // The multi/single select panels are projected into a body-level CDK overlay so
429
+ // they are never clipped by a scrollable modal body (cc-confirmation-modal) and
430
+ // close on outside click. Because they no longer sit inside their *-wrapper in
431
+ // the DOM, these styles live at the top level (still component-scoped via view
432
+ // encapsulation). The CDK overlay pane handles positioning and width.
433
+ .multi-select-panel,
434
+ .single-select-panel {
435
+ width: 100%;
436
+ background: var(--cc-sf-input-bg, #ffffff);
437
+ border: 1.5px solid var(--cc-sf-input-border, #D1D5DB);
438
+ border-radius: var(--cc-sf-input-radius, 9px);
439
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10), 0 2px 6px rgba(0, 0, 0, 0.06);
440
+ display: flex;
441
+ flex-direction: column;
442
+ overflow: hidden;
443
+ max-height: 320px;
444
+ }
445
+
446
+ .multi-select-options-list,
447
+ .single-select-options-list {
448
+ flex: 1;
449
+ overflow-y: auto;
450
+ max-height: 240px;
451
+
452
+ &::-webkit-scrollbar { width: 4px; }
453
+ &::-webkit-scrollbar-thumb {
454
+ background: var(--cc-sf-input-border, #D1D5DB);
455
+ border-radius: 2px;
456
+ }
457
+ }
458
+
459
+ .multi-select-option,
460
+ .single-select-option {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 8px;
464
+ cursor: pointer;
465
+ padding: 8px 12px;
466
+ border-bottom: 1px solid var(--cc-sf-input-border, #F3F4F6);
467
+ transition: background 0.1s;
468
+
469
+ &:last-of-type { border-bottom: none; }
470
+ &:hover { background: var(--cc-sf-input-hover-bg, #F9FAFB); }
471
+
472
+ input[type='checkbox'] {
473
+ flex-shrink: 0;
474
+ cursor: pointer;
475
+ accent-color: var(--cc-sf-selected-color, #6366F1);
476
+ width: 15px;
477
+ height: 15px;
478
+ }
479
+ }
480
+
481
+ .multi-select-option.multi-select-all {
482
+ border-bottom: 1px solid var(--cc-sf-input-border, #E5E7EB);
483
+ background: var(--cc-sf-input-bg, #FAFBFC);
484
+ }
485
+
486
+ .single-select-option {
487
+ justify-content: space-between;
488
+
489
+ &.selected {
490
+ background: var(--cc-sf-input-hover-bg, #F0F5FF);
491
+ color: var(--cc-sf-selected-color, #6366F1);
492
+ }
493
+
494
+ .single-select-check {
495
+ font-size: 18px;
496
+ width: 18px;
497
+ height: 18px;
498
+ color: var(--cc-sf-selected-color, #6366F1);
499
+ }
500
+ }
501
+
502
+ .multi-select-empty {
503
+ padding: 12px;
504
+ text-align: center;
505
+ }
506
+
507
+ // CDK overlays (our dropdown panels) must render above cc-confirmation-modal,
508
+ // whose backdrop/container sit at z-index 1000/1001.
509
+ ::ng-deep .cdk-overlay-container {
510
+ z-index: 1100;
511
+ }
512
+
513
+ .char-count-hint {
514
+ font-style: normal;
515
+ line-height: 100%;
516
+ letter-spacing: 0.02em;
517
+ margin-top: 0.4rem;
518
+ }
519
+
520
+ .radio-group,
521
+ .checkbox-group {
522
+ &.layout-column {
523
+ display: grid !important;
524
+ grid-template-columns: repeat(12, 1fr);
525
+ gap: 16px;
526
+ width: 100%;
527
+ }
528
+
529
+ &.layout-row {
530
+ flex-direction: column !important;
531
+ gap: 12px;
532
+ width: 100%;
533
+ }
534
+ }
535
+
536
+ .radio-label,
537
+ .checkbox-label {
538
+ input {
539
+ cursor: pointer;
540
+ accent-color: var(--cc-sf-chip-selected-bg, #F05A28);
541
+ }
542
+
543
+ &.card-item {
544
+ display: flex !important;
545
+ flex-direction: row-reverse !important;
546
+ justify-content: space-between !important;
547
+ align-items: center !important;
548
+ border: 1px solid var(--cc-sf-input-disabled-border, #E5E7EB);
549
+ border-radius: 12px;
550
+ padding: 16px 20px;
551
+ box-sizing: border-box;
552
+ transition: all 0.2s ease;
553
+ background: var(--cc-sf-input-bg, #ffffff);
554
+ margin-bottom: 0px;
555
+
556
+ input {
557
+ margin-left: 16px;
558
+ }
559
+
560
+ &.selected {
561
+ border-color: var(--cc-sf-selected-color);
562
+ background-color: rgba(240, 90, 40, 0.05); // Keep light tint
563
+ }
564
+
565
+ .option-content {
566
+ .label-text {
567
+ font-weight: var(--cc-sf-label-weight, 500);
568
+ }
569
+ }
570
+ }
571
+ }
572
+
573
+ .checkbox-single {
574
+ .checkbox-label {
575
+ font-weight: var(--cc-sf-label-weight, 500);
576
+ }
577
+ }
578
+
579
+ .chip-label {
580
+ transition: var(--cc-sf-input-transition, all 0.2s ease);
581
+
582
+ &:hover {
583
+ background: var(--cc-sf-chip-hover-bg, #F3F4F6);
584
+ }
585
+
586
+ &.selected {
587
+ background: var(--cc-sf-selected-color);
588
+ color: var(--cc-sf-chip-selected-color, #ffffff);
589
+ border-color: var(--cc-sf-selected-color);
590
+ }
591
+ }
592
+
593
+ .switch {
594
+ width: 50px;
595
+ height: 24px;
596
+ display: inline-block;
597
+
598
+ input {
599
+ opacity: 0;
600
+ width: 0;
601
+ height: 0;
602
+ position: absolute;
603
+
604
+ &:checked+.slider {
605
+ background-color: var(--cc-sf-switch-track-on) !important;
606
+
607
+ &::before {
608
+ transform: translateX(26px);
609
+ }
610
+ }
611
+ }
612
+
613
+ .slider {
614
+ top: 0;
615
+ left: 0;
616
+ right: 0;
617
+ bottom: 0;
618
+ transition: 0.4s;
619
+ background-color: var(--cc-sf-switch-track-off);
620
+ border-radius: 24px;
621
+
622
+ &::before {
623
+ position: absolute;
624
+ content: "";
625
+ height: 18px;
626
+ width: 18px;
627
+ left: 3px;
628
+ bottom: 3px;
629
+ background-color: var(--cc-sf-switch-thumb);
630
+ transition: 0.4s;
631
+ border-radius: 50%;
632
+ }
633
+ }
634
+ }
635
+
636
+ .rating-group {
637
+ .star {
638
+ transition: var(--cc-sf-input-transition, all 0.2s ease);
639
+
640
+ mat-icon {
641
+ font-size: var(--cc-sf-star-size, 28px);
642
+ width: var(--cc-sf-star-size, 28px);
643
+ height: var(--cc-sf-star-size, 28px);
644
+ line-height: var(--cc-sf-star-size, 28px);
645
+ color: var(--cc-sf-star-empty, #D1D5DB);
646
+ transition: var(--cc-sf-input-transition, all 0.2s ease);
647
+ }
648
+
649
+ &.filled mat-icon,
650
+ &.half mat-icon {
651
+ color: var(--cc-sf-star-filled, #F59E0B);
652
+ }
653
+
654
+ &:hover mat-icon {
655
+ color: var(--cc-sf-star-filled, #F59E0B);
656
+ }
657
+ }
658
+ }
659
+
660
+ .password-wrapper {
661
+ .password-toggle {
662
+ right: 0.625rem;
663
+ top: 50%;
664
+ transform: translateY(-50%);
665
+ line-height: 1;
666
+ transition: color var(--cc-sf-input-transition, 0.2s ease);
667
+
668
+ mat-icon.eye-icon {
669
+ font-size: 1.125rem;
670
+ width: 1.125rem;
671
+ height: 1.125rem;
672
+ line-height: 1.125rem;
673
+ }
674
+
675
+ &:hover {
676
+ color: var(--cc-sf-label-color, #374151);
677
+ }
678
+
679
+ &:focus {
680
+ outline: none;
681
+ }
682
+ }
683
+ }
684
+
685
+ .group-section-wrapper {
686
+ // Flat — no card shell; card border/shadow removed
687
+
688
+ // ── Section heading: left accent bar ────────────────────────────────────────
689
+ .group-label {
690
+ font-size: var(--cc-sf-section-label-size, 1rem);
691
+ font-weight: var(--cc-sf-section-label-weight, 600);
692
+ color: var(--cc-sf-section-label-color, #1F2937);
693
+ margin: 0 0 16px 0;
694
+ padding-left: 12px;
695
+ padding-top: 2px;
696
+ padding-bottom: 2px;
697
+ border-left: var(--cc-sf-section-header-accent-width, 4px) solid var(--cc-sf-section-header-accent-color, #3B82F6);
698
+ line-height: 1.4;
699
+ }
700
+
701
+ .group-fields {
702
+ &.sf-grid {
703
+ display: grid;
704
+ grid-template-columns: repeat(12, 1fr);
705
+ gap: var(--cc-sf-grid-gap, 16px);
706
+ align-items: start;
707
+
708
+ @media (max-width: 640px) {
709
+ grid-template-columns: 1fr;
710
+
711
+ .sf-col {
712
+ grid-column: span 12 !important;
713
+ }
714
+ }
715
+ }
716
+ }
717
+
718
+ // ── Standard GROUP accordion instance ────────────────────────────────────────
719
+ .group-accordion-instance {
720
+ border: var(--cc-sf-instance-border, 1px solid #E5E7EB);
721
+ border-radius: var(--cc-sf-section-border-radius-inner, 8px);
722
+ margin-bottom: 8px;
723
+ overflow: hidden;
724
+ transition: border-color 0.2s ease;
725
+
726
+ &:last-of-type {
727
+ margin-bottom: 0;
728
+ }
729
+
730
+ .group-accordion-header {
731
+ display: flex;
732
+ justify-content: space-between;
733
+ align-items: center;
734
+ padding: 10px 14px;
735
+ background: var(--cc-sf-repeater-accordion-header-bg, #F9FAFB);
736
+ cursor: pointer;
737
+ user-select: none;
738
+ transition: background 0.15s ease;
739
+
740
+ &:hover {
741
+ background: var(--cc-sf-repeater-accordion-active-bg, #EFF6FF);
742
+ }
743
+
744
+ .instance-badge {
745
+ width: 22px;
746
+ height: 22px;
747
+ border-radius: 50%;
748
+ background: var(--cc-sf-repeater-badge-bg, #E5E7EB);
749
+ color: var(--cc-sf-repeater-badge-color, #374151);
750
+ font-size: 0.75rem;
751
+ font-weight: 600;
752
+ display: flex;
753
+ align-items: center;
754
+ justify-content: center;
755
+ flex-shrink: 0;
756
+ }
757
+
758
+ .instance-title {
759
+ font-size: var(--cc-sf-instance-num-size, 0.8125rem);
760
+ font-weight: 600;
761
+ color: var(--cc-sf-repeater-accordion-header-color, #1F2937);
762
+ }
763
+
764
+ .accordion-remove-btn {
765
+ background: none;
766
+ border: none;
767
+ cursor: pointer;
768
+ color: var(--cc-sf-btn-remove-color, #E53E3E);
769
+ padding: 4px;
770
+ border-radius: 4px;
771
+ line-height: 1;
772
+ display: flex;
773
+ align-items: center;
774
+ transition: background 0.15s ease;
775
+
776
+ mat-icon {
777
+ font-size: 1.1rem;
778
+ width: 1.1rem;
779
+ height: 1.1rem;
780
+ line-height: 1.1rem;
781
+ }
782
+
783
+ &:hover {
784
+ background: var(--cc-sf-btn-remove-hover-bg, #FED7D7);
785
+ }
786
+ }
787
+
788
+ .accordion-chevron {
789
+ font-size: 1.25rem;
790
+ width: 1.25rem;
791
+ height: 1.25rem;
792
+ line-height: 1.25rem;
793
+ color: var(--cc-sf-instance-num-color, #4B5563);
794
+ }
795
+ }
796
+
797
+ .group-accordion-body {
798
+ padding: var(--cc-sf-instance-padding, 16px);
799
+ background: var(--cc-sf-instance-bg, #F9FAFB);
800
+ border-top: var(--cc-sf-instance-divider, 1px dashed #D1D5DB);
801
+ }
802
+ }
803
+
804
+ // ── Full-width dashed Add button ─────────────────────────────────────────────
805
+ .btn-add-group {
806
+ display: flex;
807
+ align-items: center;
808
+ justify-content: center;
809
+ gap: 6px;
810
+ width: 100%;
811
+ padding: 10px 20px;
812
+ margin-top: 12px;
813
+ background: var(--cc-sf-btn-add-bg, transparent);
814
+ color: var(--cc-sf-btn-add-color, #3B82F6);
815
+ border: var(--cc-sf-btn-add-border, 1px dashed #CBD5E1);
816
+ border-radius: var(--cc-sf-btn-add-radius, 6px);
817
+ cursor: pointer;
818
+ font-family: inherit;
819
+ font-size: var(--cc-sf-btn-font-size, 0.875rem);
820
+ font-weight: var(--cc-sf-btn-font-weight, 600);
821
+ transition: var(--cc-sf-btn-transition, all 0.2s ease);
822
+
823
+ mat-icon {
824
+ font-size: 1.1rem;
825
+ width: 1.1rem;
826
+ height: 1.1rem;
827
+ line-height: 1.1rem;
828
+ }
829
+
830
+ &:hover {
831
+ background: var(--cc-sf-btn-add-hover-bg, #EFF6FF);
832
+ border-color: var(--cc-sf-btn-add-hover-border, #BFDBFE);
833
+ }
834
+ }
835
+
836
+ .group-instance {
837
+ &:last-child {
838
+ margin-bottom: 0;
839
+ }
840
+ }
841
+
842
+ &.multi-save-active {
843
+ border: none;
844
+ box-shadow: none;
845
+ padding: 0;
846
+ background: transparent;
847
+
848
+ .multi-save-header {
849
+ .btn-add-multi {
850
+ ::ng-deep button {
851
+ color: var(--ms-btn-add-color, #3B82F6);
852
+ font-weight: 600;
853
+ font-size: 0.875rem;
854
+ padding: 8px 12px;
855
+
856
+ &:hover {
857
+ color: var(--ms-btn-add-hover, #2563EB);
858
+ background-color: var(--cc-sf-btn-add-hover-bg, #EFF6FF);
859
+ }
860
+ }
861
+ }
862
+ }
863
+
864
+ .group-instance {
865
+ // box-shadow: var(--ms-card-shadow, 0 1px 4px rgba(0, 0, 0, 0.05));
866
+
867
+ // &.is-editing {
868
+ // padding: 24px;
869
+ // }
870
+
871
+ &.is-card {
872
+ cursor: pointer;
873
+ transition: all 0.2s ease-in-out;
874
+
875
+ &:hover {
876
+ box-shadow: var(--ms-card-shadow-hover, 0 8px 24px rgba(0, 0, 0, 0.08));
877
+ border-color: var(--cc-sf-input-focus-border, #3B82F6);
878
+ }
879
+
880
+ .card-view {
881
+ .card-content {
882
+ .card-title {
883
+ white-space: nowrap;
884
+ text-overflow: ellipsis;
885
+ }
886
+
887
+ .card-desc {
888
+ line-height: 1.4;
889
+ display: -webkit-box;
890
+ -webkit-line-clamp: 1;
891
+ line-clamp: 1;
892
+ -webkit-box-orient: vertical;
893
+ }
894
+ }
895
+
896
+ &.is-expanded {
897
+ .card-content .card-desc {
898
+ -webkit-line-clamp: unset;
899
+ line-clamp: unset;
900
+ }
901
+ }
902
+
903
+ .card-actions {
904
+ mat-icon {
905
+ font-size: 22px;
906
+ width: 22px;
907
+ height: 22px;
908
+ color: var(--cc-sf-hint-color, #9CA3AF);
909
+ transition: color 0.2s;
910
+
911
+ &.icon-delete:hover {
912
+ color: var(--cc-sf-error-border, #DC2626);
913
+ }
914
+
915
+ &.icon-edit:hover {
916
+ color: var(--cc-sf-input-focus-border, #3B82F6);
917
+ }
918
+
919
+ &.icon-expand {
920
+ color: var(--cc-sf-input-disabled-border, #E5E7EB);
921
+ }
922
+ }
923
+ }
924
+ }
925
+ }
926
+ }
927
+ }
928
+ }
929
+
930
+ .btn-remove {
931
+ transition: var(--cc-sf-btn-transition, all 0.2s ease);
932
+
933
+ mat-icon {
934
+ font-size: 1rem;
935
+ width: 1rem;
936
+ height: 1rem;
937
+ line-height: 1rem;
938
+ }
939
+
940
+ &:hover {
941
+ background: var(--cc-sf-btn-remove-hover-bg, #FED7D7);
942
+ }
943
+ }
944
+
945
+ .btn-add-group {
946
+ font-weight: var(--cc-sf-btn-font-weight, 600);
947
+ transition: var(--cc-sf-btn-transition, all 0.2s ease);
948
+
949
+ mat-icon {
950
+ font-size: 1.1rem;
951
+ width: 1.1rem;
952
+ height: 1.1rem;
953
+ line-height: 1.1rem;
954
+ }
955
+
956
+ &:hover {
957
+ background: var(--cc-sf-btn-add-hover-bg, #EFF6FF);
958
+ border-color: var(--cc-sf-btn-add-hover-border, #BFDBFE);
959
+ }
960
+ }
961
+
962
+ .upload-drop-zone {
963
+ background-color: var(--cc-sf-dropzone-bg, #F8FAFC);
964
+ border: var(--cc-sf-dropzone-border, 1.5px dashed #CBD5E1);
965
+ border-radius: var(--cc-sf-dropzone-radius, 12px);
966
+ transition: background-color 0.2s ease, border-color 0.2s ease;
967
+
968
+ &:hover {
969
+ background-color: var(--cc-sf-dropzone-hover-bg, #EFF6FF);
970
+ border-color: var(--cc-sf-dropzone-hover-border, #93C5FD);
971
+ }
972
+
973
+ &.drag-over {
974
+ background-color: var(--cc-sf-dropzone-hover-bg, #EFF6FF);
975
+ border-color: var(--cc-sf-dropzone-over-border, #3B82F6);
976
+ box-shadow: var(--cc-sf-dropzone-over-shadow, 0 0 0 4px rgba(59, 130, 246, 0.12));
977
+ }
978
+
979
+ &.is-invalid {
980
+ border-color: var(--cc-sf-error-border, #DC2626);
981
+ background-color: var(--cc-sf-error-bg, #FEF2F2);
982
+ }
983
+ }
984
+
985
+ .upload-icon-wrap {
986
+ .dropzone-icon-pill {
987
+ width: 52px;
988
+ height: 52px;
989
+ border-radius: 50%;
990
+ background: var(--cc-sf-dropzone-icon-bg, rgba(59, 130, 246, 0.10));
991
+ }
992
+
993
+ mat-icon.upload-cloud-icon {
994
+ font-size: 28px;
995
+ width: 28px;
996
+ height: 28px;
997
+ line-height: 28px;
998
+ color: var(--cc-sf-accent-color, #3B82F6);
999
+ }
1000
+ }
1001
+
1002
+ .upload-main-text {
1003
+ color: var(--cc-sf-label-color, #1E293B);
1004
+ }
1005
+
1006
+ .upload-sub-text {
1007
+ color: var(--cc-sf-hint-color, #64748B);
1008
+ }
1009
+
1010
+ .upload-link {
1011
+ color: var(--cc-sf-dropzone-link-color, #3B82F6);
1012
+ font-weight: 500;
1013
+ }
1014
+
1015
+ .upload-formats {
1016
+ color: var(--cc-sf-dropzone-link-color, #3B82F6);
1017
+ }
1018
+
1019
+ .upload-size-badge {
1020
+ display: inline-block;
1021
+ padding: 2px 8px;
1022
+ border-radius: 20px;
1023
+ background: var(--cc-sf-input-disabled-bg, #F3F4F6);
1024
+ color: var(--cc-sf-hint-color, #6B7280);
1025
+ font-weight: 500;
1026
+ }
1027
+
1028
+ .uploaded-item {
1029
+ background: var(--cc-sf-uploaded-item-bg, #ffffff);
1030
+ border: var(--cc-sf-uploaded-item-border, 1px solid #E2E8F0);
1031
+ border-radius: var(--cc-sf-uploaded-item-radius, 8px);
1032
+ transition: box-shadow 0.15s ease;
1033
+
1034
+ &:hover {
1035
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
1036
+ }
1037
+
1038
+ mat-icon.file-type-icon {
1039
+ font-size: 20px;
1040
+ width: 20px;
1041
+ height: 20px;
1042
+ line-height: 20px;
1043
+ flex-shrink: 0;
1044
+ color: var(--cc-sf-hint-color, #64748B);
1045
+ }
1046
+
1047
+ .file-thumb {
1048
+ width: 36px;
1049
+ height: 36px;
1050
+ object-fit: cover;
1051
+ flex-shrink: 0;
1052
+ }
1053
+
1054
+ .file-info {
1055
+ min-width: 0;
1056
+ gap: 2px;
1057
+
1058
+ .file-name {
1059
+ white-space: nowrap;
1060
+ text-overflow: ellipsis;
1061
+ }
1062
+ }
1063
+
1064
+ .file-remove-btn {
1065
+ flex-shrink: 0;
1066
+ width: 32px;
1067
+ height: 32px;
1068
+ background: none;
1069
+ border: none;
1070
+ cursor: pointer;
1071
+ color: var(--cc-sf-uploaded-remove-color, #94A3B8);
1072
+ padding: 0;
1073
+ display: flex;
1074
+ align-items: center;
1075
+ justify-content: center;
1076
+ transition: color 0.15s ease, background 0.15s ease;
1077
+
1078
+ mat-icon {
1079
+ font-size: 1.1rem;
1080
+ width: 1.1rem;
1081
+ height: 1.1rem;
1082
+ line-height: 1.1rem;
1083
+ }
1084
+
1085
+ &:hover:not(:disabled) {
1086
+ color: var(--cc-sf-uploaded-remove-hover-color, #DC2626);
1087
+ background: var(--cc-sf-uploaded-remove-hover-bg, #FEF2F2);
1088
+ }
1089
+
1090
+ &:disabled {
1091
+ opacity: 0.4;
1092
+ cursor: not-allowed;
1093
+ }
1094
+ }
1095
+
1096
+ &.uploading {
1097
+ background: var(--cc-sf-uploaded-uploading-bg, #F8FAFC);
1098
+ border-color: var(--cc-sf-uploaded-uploading-border, #CBD5E1);
1099
+ opacity: 0.85;
1100
+ }
1101
+ }
1102
+
1103
+ .upload-spinner {
1104
+ width: 20px;
1105
+ height: 20px;
1106
+ flex-shrink: 0;
1107
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
1108
+ animation: cc-spin 0.7s linear infinite;
1109
+ }
1110
+
1111
+ @keyframes cc-spin {
1112
+ to {
1113
+ transform: rotate(360deg);
1114
+ }
1115
+ }
1116
+
1117
+ .uploading-label {
1118
+ font-style: italic;
1119
+ }
1120
+
1121
+ .input-group {
1122
+ align-items: stretch;
1123
+
1124
+ .field-input {
1125
+ flex: 1;
1126
+ width: auto; // Allow flex to control width
1127
+
1128
+ .input-prefix+& {
1129
+ border-top-left-radius: 0;
1130
+ border-bottom-left-radius: 0;
1131
+ }
1132
+ }
1133
+
1134
+ .field-input:has(+ .input-suffix) {
1135
+ border-top-right-radius: 0;
1136
+ border-bottom-right-radius: 0;
1137
+ }
1138
+
1139
+ .field-input.has-icon-right {
1140
+ padding-right: 3rem;
1141
+ }
1142
+
1143
+ &.readonly {
1144
+ .field-input {
1145
+ cursor: default;
1146
+ }
1147
+ }
1148
+ }
1149
+
1150
+ .input-prefix,
1151
+ .input-suffix {
1152
+ display: flex !important;
1153
+ align-items: center;
1154
+ white-space: nowrap;
1155
+ padding: 0 14px;
1156
+ background-color: var(--cc-sf-input-disabled-bg);
1157
+ border: 1px solid var(--cc-sf-input-border);
1158
+ font-size: 0.875rem;
1159
+ color: var(--cc-sf-hint-color);
1160
+ user-select: none;
1161
+ }
1162
+
1163
+ .input-prefix {
1164
+ border-right: none;
1165
+ border-top-left-radius: var(--cc-sf-input-radius, 8px);
1166
+ border-bottom-left-radius: var(--cc-sf-input-radius, 8px);
1167
+ }
1168
+
1169
+ .input-suffix {
1170
+ border-left: none;
1171
+ border-top-right-radius: var(--cc-sf-input-radius, 8px);
1172
+ border-bottom-right-radius: var(--cc-sf-input-radius, 8px);
1173
+ }
1174
+
1175
+ .readonly-icons {
1176
+ right: 0.875rem;
1177
+ top: 50%;
1178
+ transform: translateY(-50%);
1179
+
1180
+ mat-icon.lock-icon {
1181
+ font-size: 1rem;
1182
+ width: 1rem;
1183
+ height: 1rem;
1184
+ line-height: 1rem;
1185
+ opacity: 0.5;
1186
+ color: var(--cc-sf-hint-color, #6B7280);
1187
+ }
1188
+ }
1189
+
1190
+ .suffix-action-icons {
1191
+ right: 0.875rem;
1192
+ top: 50%;
1193
+ transform: translateY(-50%);
1194
+ z-index: 1;
1195
+ pointer-events: auto;
1196
+
1197
+ mat-icon.suffix-action-icon {
1198
+ font-size: 1.125rem;
1199
+ width: 1.125rem;
1200
+ height: 1.125rem;
1201
+ line-height: 1.125rem;
1202
+ color: var(--cc-sf-hint-color, #6B7280);
1203
+ cursor: pointer;
1204
+ transition: color 0.2s ease, transform 0.15s ease;
1205
+
1206
+ &:hover {
1207
+ color: var(--cc-sf-text-color, #202124);
1208
+ transform: scale(1.15);
1209
+ }
1210
+ }
1211
+ }
1212
+
1213
+ .date-icon-wrapper {
1214
+ right: 0.5rem;
1215
+ top: 50%;
1216
+ transform: translateY(-50%);
1217
+ pointer-events: auto;
1218
+
1219
+ .mat-icon-button {
1220
+ width: 32px;
1221
+ height: 32px;
1222
+ line-height: 32px;
1223
+ }
1224
+ }
1225
+
1226
+ .subfields-group-wrapper {
1227
+ .subfields-row {
1228
+ transition: all 0.2s ease;
1229
+
1230
+ &.is-invalid {
1231
+ .subfield-item ::ng-deep .field-input {
1232
+ border-color: var(--cc-sf-error-border, #DC2626);
1233
+ background-color: var(--cc-sf-error-bg, #FEF2F2);
1234
+ }
1235
+ }
1236
+
1237
+ .subfield-item {
1238
+ min-width: 0;
1239
+
1240
+ ::ng-deep .field-label {
1241
+ font-size: 0.75rem !important;
1242
+ margin-bottom: 4px !important;
1243
+ font-weight: 500 !important;
1244
+ color: var(--cc-sf-hint-color, #6B7280) !important;
1245
+ }
1246
+ }
1247
+
1248
+ .subfield-separator {
1249
+ font-weight: bold;
1250
+ }
1251
+ }
1252
+ }
1253
+
1254
+ .autocomplete-wrapper {
1255
+ .ac-input {
1256
+ padding-left: 40px !important;
1257
+ }
1258
+
1259
+ .ac-search-icon {
1260
+ left: 0.75rem;
1261
+ width: 1.1rem;
1262
+ height: 1.1rem;
1263
+ line-height: 1.1rem;
1264
+ z-index: 1;
1265
+ transition: color var(--cc-sf-input-transition, 0.2s ease);
1266
+ }
1267
+
1268
+ .ac-clear-btn {
1269
+ right: 0.6rem;
1270
+ transition: color 0.15s ease, background 0.15s ease;
1271
+
1272
+ mat-icon {
1273
+ font-size: 1rem;
1274
+ width: 1rem;
1275
+ height: 1rem;
1276
+ line-height: 1rem;
1277
+ }
1278
+
1279
+ &:hover {
1280
+ color: var(--cc-sf-label-color, #374151);
1281
+ background: var(--cc-sf-input-disabled-bg, #F3F4F6);
1282
+ }
1283
+
1284
+ &:focus {
1285
+ outline: none;
1286
+ }
1287
+ }
1288
+
1289
+ &:focus-within .ac-search-icon {
1290
+ color: var(--cc-sf-accent-color, #3B82F6);
1291
+ }
1292
+
1293
+ &.is-invalid .ac-input {
1294
+ border-color: var(--cc-sf-error-border) !important;
1295
+ background-color: var(--cc-sf-error-bg);
1296
+ }
1297
+
1298
+ &.readonly .ac-input {
1299
+ background-color: var(--cc-sf-input-disabled-bg);
1300
+ color: var(--cc-sf-input-disabled-color, #6B7280);
1301
+ cursor: not-allowed;
1302
+ border-color: var(--cc-sf-input-disabled-border) !important;
1303
+ }
1304
+ }
1305
+
1306
+ .ac-no-results {
1307
+ font-style: italic;
1308
+ }
1309
+
1310
+ // ── mat-autocomplete panel global fix ───────────────────────────────────────
1311
+ // The CDK overlay is appended to <body> so it is outside component scope.
1312
+ // ::ng-deep is required to pierce view encapsulation for the panel.
1313
+ ::ng-deep {
1314
+
1315
+ .mat-mdc-autocomplete-panel,
1316
+ .mat-autocomplete-panel {
1317
+ background: var(--cc-sf-input-bg, #ffffff) !important;
1318
+ border-radius: var(--cc-sf-input-radius, 9px) !important;
1319
+ border: 1px solid var(--cc-sf-input-disabled-border, #E5E7EB) !important;
1320
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10), 0 2px 6px rgba(0, 0, 0, 0.06) !important;
1321
+ padding: 4px 0 !important;
1322
+ min-width: 200px;
1323
+
1324
+ mat-option,
1325
+ .mat-mdc-option,
1326
+ .mat-option {
1327
+ background: var(--cc-sf-input-bg, #ffffff) !important;
1328
+ color: var(--cc-sf-label-color, #111827) !important;
1329
+ font-size: 0.875rem !important;
1330
+ padding: 10px 16px !important;
1331
+ min-height: 40px !important;
1332
+ line-height: 1.4 !important;
1333
+ // Column direction so displayMeta fields stack below the label
1334
+ display: flex !important;
1335
+ flex-direction: column !important;
1336
+ align-items: flex-start !important;
1337
+ transition: background var(--cc-sf-input-transition, 0.2s ease) !important;
1338
+
1339
+ &:hover:not(.mat-option-disabled):not([disabled]) {
1340
+ background: var(--cc-sf-input-disabled-bg, #F3F4F6) !important;
1341
+ }
1342
+
1343
+ &.mat-selected:not(.mat-option-multiple),
1344
+ &.mdc-list-item--selected {
1345
+ background: var(--cc-sf-dropzone-hover-bg, #EFF6FF) !important;
1346
+ color: var(--cc-sf-selected-color, #6366F1) !important;
1347
+ font-weight: 600 !important;
1348
+ }
1349
+
1350
+ // ── Dynamic display fields rendered below the option label ────────────
1351
+ .ac-option-label {
1352
+ font-weight: 500;
1353
+ color: var(--cc-sf-label-color, #111827);
1354
+ font-size: 0.875rem;
1355
+ display: block;
1356
+ }
1357
+
1358
+ .ac-display-fields {
1359
+ align-items: center;
1360
+ line-height: 1;
1361
+ }
1362
+
1363
+ .ac-df-item {
1364
+ display: inline-flex;
1365
+ align-items: center;
1366
+ font-size: 0.72rem;
1367
+ color: var(--cc-sf-hint-color, #6B7280);
1368
+ gap: 3px;
1369
+ }
1370
+
1371
+ // Chip style: used for email and phone entries
1372
+ .ac-df-chip {
1373
+ background: var(--cc-sf-input-disabled-bg, #F3F4F6);
1374
+ border-radius: 4px;
1375
+ padding: 2px 6px;
1376
+ }
1377
+
1378
+ // Plain text style
1379
+ .ac-df-text {
1380
+ color: var(--cc-sf-hint-color, #6B7280);
1381
+ }
1382
+
1383
+ // Avatar image
1384
+ .ac-df-image {
1385
+ // No background chip for images
1386
+ }
1387
+
1388
+ .ac-df-avatar {
1389
+ width: 24px;
1390
+ height: 24px;
1391
+ border-radius: 50%;
1392
+ object-fit: cover;
1393
+ border: 1px solid var(--cc-sf-input-border, #D1D5DB);
1394
+ vertical-align: middle;
1395
+ }
1396
+
1397
+ .ac-df-label {
1398
+ font-weight: 600;
1399
+ color: var(--cc-sf-hint-color, #9CA3AF);
1400
+ margin-right: 2px;
1401
+ }
1402
+
1403
+ .ac-df-icon {
1404
+ font-size: 11px;
1405
+ width: 11px;
1406
+ height: 11px;
1407
+ line-height: 11px;
1408
+ color: var(--cc-sf-hint-color, #9CA3AF);
1409
+ flex-shrink: 0;
1410
+ }
1411
+ }
1412
+ }
1413
+ }
1414
+
1415
+ .mu-layout {
1416
+ grid-template-columns: 1fr 1fr;
1417
+ gap: 32px;
1418
+
1419
+ @media (max-width: 768px) {
1420
+ grid-template-columns: 1fr;
1421
+ }
1422
+ }
1423
+
1424
+ .mu-title {
1425
+ font-weight: 700;
1426
+ line-height: 1.3;
1427
+ }
1428
+
1429
+ .mu-badge {
1430
+ white-space: nowrap;
1431
+ flex-shrink: 0;
1432
+ }
1433
+
1434
+ .mu-description {
1435
+ line-height: 1.6;
1436
+ }
1437
+
1438
+ .mu-feature-item {
1439
+ .mu-check {
1440
+ width: 16px;
1441
+ height: 16px;
1442
+ line-height: 16px;
1443
+ flex-shrink: 0;
1444
+ }
1445
+ }
1446
+
1447
+ .mu-right {
1448
+ min-height: 260px;
1449
+ }
1450
+
1451
+ .mu-right-empty {
1452
+ min-height: 250px;
1453
+ max-width: 400px;
1454
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
1455
+ transition: box-shadow 0.2s ease;
1456
+
1457
+ &:hover {
1458
+ cursor: pointer;
1459
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
1460
+ }
1461
+
1462
+ .mu-right-empty-icon {
1463
+ width: 52px;
1464
+ height: 52px;
1465
+ line-height: 52px;
1466
+ opacity: 0.3;
1467
+ }
1468
+
1469
+ p {
1470
+ margin: 0;
1471
+ font-size: 0.85rem;
1472
+ }
1473
+ }
1474
+
1475
+ .media-add-container {
1476
+ display: inline-block;
1477
+
1478
+ ::ng-deep button {
1479
+ display: flex;
1480
+ align-items: center;
1481
+ gap: 6px;
1482
+
1483
+ .menu-chevron {
1484
+ width: 18px;
1485
+ height: 18px;
1486
+ line-height: 18px;
1487
+ transition: transform 0.2s ease;
1488
+ }
1489
+ }
1490
+ }
1491
+
1492
+ .media-dropdown {
1493
+ top: calc(100% + 6px);
1494
+ left: 0;
1495
+ z-index: 200;
1496
+ min-width: 240px;
1497
+ box-shadow: var(--mu-dropdown-shadow, 0 8px 32px rgba(0, 0, 0, 0.12));
1498
+ animation: mu-fade-in 0.15s ease;
1499
+ }
1500
+
1501
+ @keyframes mu-fade-in {
1502
+ from {
1503
+ opacity: 0;
1504
+ transform: translateY(-6px);
1505
+ }
1506
+
1507
+ to {
1508
+ opacity: 1;
1509
+ transform: translateY(0);
1510
+ }
1511
+ }
1512
+
1513
+ .media-dropdown-item {
1514
+ transition: background 0.15s ease;
1515
+
1516
+ &:last-child {
1517
+ border-bottom: none;
1518
+ }
1519
+
1520
+ &:hover {
1521
+ background: var(--cc-sf-dropzone-hover-bg, #F0F9FF);
1522
+ }
1523
+ }
1524
+
1525
+ .media-drop-icon {
1526
+ width: 36px;
1527
+ height: 36px;
1528
+ flex-shrink: 0;
1529
+
1530
+ mat-icon {
1531
+ font-size: 20px;
1532
+ width: 20px;
1533
+ height: 20px;
1534
+ line-height: 20px;
1535
+ }
1536
+
1537
+ &--video {
1538
+ background: var(--mu-icon-video-bg, #FFF0F0);
1539
+ color: var(--mu-icon-video-color, #EF4444);
1540
+ }
1541
+
1542
+ &--device {
1543
+ background: var(--mu-icon-device-bg, #EFF6FF);
1544
+ color: var(--mu-icon-device-color, #3B82F6);
1545
+ }
1546
+
1547
+ &--library {
1548
+ background: var(--mu-icon-library-bg, #F0FDF4);
1549
+ color: var(--mu-icon-library-color, #22C55E);
1550
+ }
1551
+ }
1552
+
1553
+ .media-drop-text {
1554
+ gap: 2px;
1555
+ }
1556
+
1557
+ .youtube-input-panel {
1558
+ animation: mu-fade-in 0.18s ease;
1559
+ }
1560
+
1561
+ .youtube-panel-label {
1562
+ mat-icon {
1563
+ font-size: 18px;
1564
+ width: 18px;
1565
+ height: 18px;
1566
+ line-height: 18px;
1567
+ color: var(--mu-icon-video-color, #EF4444);
1568
+ }
1569
+ }
1570
+
1571
+ .youtube-input-row {
1572
+ align-items: stretch;
1573
+ }
1574
+
1575
+ .media-menu-backdrop {
1576
+ position: fixed;
1577
+ inset: 0;
1578
+ z-index: 100;
1579
+ }
1580
+
1581
+ .media-upload-status {
1582
+ animation: mu-fade-in 0.2s ease;
1583
+
1584
+ .status-icon {
1585
+ width: 18px;
1586
+ height: 18px;
1587
+ line-height: 18px;
1588
+ }
1589
+ }
1590
+
1591
+ .media-carousel-main {
1592
+ max-width: 400px;
1593
+ height: var(--mu-carousel-height, 250px);
1594
+ }
1595
+
1596
+ .carousel-viewer {
1597
+ inset: 0;
1598
+
1599
+ .carousel-image {
1600
+ object-fit: cover;
1601
+ }
1602
+
1603
+ .carousel-spinner {
1604
+ width: 36px;
1605
+ height: 36px;
1606
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
1607
+ animation: cc-spin 0.7s linear infinite;
1608
+ }
1609
+ }
1610
+
1611
+ .carousel-nav {
1612
+ top: 50%;
1613
+ transform: translateY(-50%);
1614
+ z-index: 10;
1615
+ width: 40px;
1616
+ height: 40px;
1617
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
1618
+ transition: background 0.2s ease, opacity 0.2s ease;
1619
+ backdrop-filter: blur(4px);
1620
+
1621
+ mat-icon {
1622
+ font-size: 22px;
1623
+ width: 22px;
1624
+ height: 22px;
1625
+ line-height: 22px;
1626
+ color: #1E293B;
1627
+ }
1628
+
1629
+ &:hover:not(:disabled) {
1630
+ background: rgba(255, 255, 255, 1);
1631
+ }
1632
+
1633
+ &:disabled {
1634
+ opacity: 0.3;
1635
+ cursor: not-allowed;
1636
+ }
1637
+
1638
+ &--prev {
1639
+ left: 12px;
1640
+ }
1641
+
1642
+ &--next {
1643
+ right: 12px;
1644
+ }
1645
+ }
1646
+
1647
+ .carousel-remove-btn {
1648
+ top: 10px;
1649
+ right: 10px;
1650
+ z-index: 10;
1651
+ width: 32px;
1652
+ height: 32px;
1653
+ transition: background 0.2s ease;
1654
+
1655
+ mat-icon {
1656
+ font-size: 18px;
1657
+ width: 18px;
1658
+ height: 18px;
1659
+ line-height: 18px;
1660
+ color: #ffffff;
1661
+ }
1662
+
1663
+ &:hover:not(:disabled) {
1664
+ background: rgba(220, 38, 38, 0.85);
1665
+ }
1666
+
1667
+ &:disabled {
1668
+ opacity: 0.4;
1669
+ cursor: not-allowed;
1670
+ }
1671
+ }
1672
+
1673
+ .carousel-dots {
1674
+ bottom: 10px;
1675
+ left: 50%;
1676
+ transform: translateX(-50%);
1677
+ z-index: 10;
1678
+ }
1679
+
1680
+ .carousel-dot {
1681
+ width: 8px;
1682
+ height: 8px;
1683
+ transition: background 0.2s ease, transform 0.2s ease;
1684
+
1685
+ &.active {
1686
+ background: #ffffff;
1687
+ transform: scale(1.3);
1688
+ }
1689
+ }
1690
+
1691
+ .media-thumbnail-strip {
1692
+ max-width: 400px;
1693
+ overflow-x: auto;
1694
+
1695
+ &::-webkit-scrollbar {
1696
+ height: 4px;
1697
+ }
1698
+
1699
+ &::-webkit-scrollbar-thumb {
1700
+ background: var(--cc-sf-input-disabled-border, #D1D5DB);
1701
+ border-radius: 2px;
1702
+ }
1703
+ }
1704
+
1705
+ .media-thumb {
1706
+ flex-shrink: 0;
1707
+ width: 72px;
1708
+ height: 52px;
1709
+ transition: border-color 0.2s ease, transform 0.15s ease;
1710
+
1711
+ &.active {
1712
+ border-color: var(--mu-thumb-active-border, var(--cc-sf-accent-color, #3B82F6));
1713
+ transform: scale(1.04);
1714
+ }
1715
+
1716
+ &:hover:not(.active) {
1717
+ border-color: var(--cc-sf-input-hover-border, #9CA3AF);
1718
+ }
1719
+
1720
+ .thumb-img {
1721
+ object-fit: cover;
1722
+ }
1723
+
1724
+ .thumb-yt-placeholder {
1725
+ mat-icon {
1726
+ font-size: 28px;
1727
+ width: 28px;
1728
+ height: 28px;
1729
+ line-height: 28px;
1730
+ }
1731
+ }
1732
+
1733
+ .thumb-uploading {
1734
+ .thumb-spinner {
1735
+ width: 20px;
1736
+ height: 20px;
1737
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
1738
+ animation: cc-spin 0.7s linear infinite;
1739
+ }
1740
+ }
1741
+ }
1742
+
1743
+ // ── Portal Modal Styles (rendered in document.body) ───────────────
1744
+
1745
+ .media-library-portal-host {
1746
+ position: fixed;
1747
+ inset: 0;
1748
+ z-index: 9999;
1749
+ display: flex;
1750
+ align-items: center;
1751
+ justify-content: center;
1752
+ visibility: hidden;
1753
+ opacity: 0;
1754
+ pointer-events: none;
1755
+ transition: opacity 0.2s ease, visibility 0.2s ease;
1756
+
1757
+ &.is-open {
1758
+ visibility: visible;
1759
+ opacity: 1;
1760
+ pointer-events: auto;
1761
+
1762
+ .media-library-modal {
1763
+ transform: scale(1) translateY(0);
1764
+ }
1765
+ }
1766
+ }
1767
+
1768
+ .media-library-overlay {
1769
+ position: absolute;
1770
+ inset: 0;
1771
+ background: rgba(0, 0, 0, 0.5);
1772
+ backdrop-filter: blur(2px);
1773
+ }
1774
+
1775
+ .media-library-modal {
1776
+ position: relative;
1777
+ z-index: 10000;
1778
+ width: 90vw;
1779
+ max-width: 900px;
1780
+ max-height: 90vh;
1781
+ background: #ffffff;
1782
+ border-radius: 16px;
1783
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
1784
+ transform: scale(0.95) translateY(10px);
1785
+ transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
1786
+ }
1787
+
1788
+
1789
+ .library-modal-header {
1790
+ flex-shrink: 0;
1791
+ }
1792
+
1793
+ .library-modal-title {
1794
+ font-weight: 700;
1795
+ }
1796
+
1797
+ .library-modal-subtitle {
1798
+ line-height: 1.5;
1799
+ max-width: 600px;
1800
+ }
1801
+
1802
+ .library-close-btn {
1803
+ width: 32px;
1804
+ height: 32px;
1805
+ transition: background 0.15s ease, color 0.15s ease;
1806
+
1807
+ mat-icon {
1808
+ font-size: 20px;
1809
+ width: 20px;
1810
+ height: 20px;
1811
+ line-height: 20px;
1812
+ }
1813
+
1814
+ &:hover {
1815
+ background: var(--cc-sf-input-disabled-bg, #F3F4F6);
1816
+ color: var(--cc-sf-label-color, #374151);
1817
+ }
1818
+ }
1819
+
1820
+ .library-loading,
1821
+ .library-empty {
1822
+ mat-icon {
1823
+ font-size: 40px;
1824
+ width: 40px;
1825
+ height: 40px;
1826
+ line-height: 40px;
1827
+ opacity: 0.5;
1828
+ }
1829
+ }
1830
+
1831
+ .lib-spinner {
1832
+ width: 36px;
1833
+ height: 36px;
1834
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
1835
+ animation: cc-spin 0.7s linear infinite;
1836
+ }
1837
+
1838
+ .library-error {
1839
+ flex-shrink: 0;
1840
+
1841
+ mat-icon {
1842
+ font-size: 20px;
1843
+ width: 20px;
1844
+ height: 20px;
1845
+ line-height: 20px;
1846
+ }
1847
+ }
1848
+
1849
+ .library-grid {
1850
+ grid-template-columns: repeat(5, 1fr);
1851
+ max-height: 50vh;
1852
+ overflow-y: auto;
1853
+
1854
+ &::-webkit-scrollbar {
1855
+ width: 8px;
1856
+ }
1857
+
1858
+ &::-webkit-scrollbar-track {
1859
+ background: #F1F1F1;
1860
+ }
1861
+
1862
+ &::-webkit-scrollbar-thumb {
1863
+ background: #C1C1C1;
1864
+ border-radius: 10px;
1865
+ border: 2px solid #F1F1F1;
1866
+ }
1867
+ }
1868
+
1869
+ .library-grid-item {
1870
+ aspect-ratio: 1 / 1;
1871
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1872
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
1873
+
1874
+ &:hover {
1875
+ transform: translateY(-4px) scale(1.02);
1876
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
1877
+ }
1878
+
1879
+ &.selected {
1880
+ border-color: var(--cc-sf-accent-color, #3B82F6);
1881
+
1882
+ .library-grid-img {
1883
+ opacity: 0.7;
1884
+ }
1885
+ }
1886
+
1887
+ &:hover .library-overlay-hover {
1888
+ opacity: 1;
1889
+ }
1890
+ }
1891
+
1892
+ .library-grid-img {
1893
+ object-fit: cover;
1894
+ }
1895
+
1896
+ .library-overlay-hover {
1897
+ inset: 0;
1898
+ opacity: 0;
1899
+ transition: opacity 0.15s ease;
1900
+ }
1901
+
1902
+ .library-check {
1903
+ top: 6px;
1904
+ right: 6px;
1905
+ width: 22px;
1906
+ height: 22px;
1907
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
1908
+
1909
+ mat-icon {
1910
+ font-size: 18px;
1911
+ width: 18px;
1912
+ height: 18px;
1913
+ line-height: 18px;
1914
+ }
1915
+ }
1916
+
1917
+ .library-modal-footer {
1918
+ flex-shrink: 0;
1919
+
1920
+ .library-footer-actions {
1921
+ ::ng-deep .cc-btn-primary {
1922
+ background-color: var(--cc-sf-accent-color, #3B82F6) !important;
1923
+ border-color: var(--cc-sf-accent-color, #3B82F6) !important;
1924
+ color: #ffffff !important;
1925
+ font-weight: 600;
1926
+ padding-left: 32px;
1927
+ padding-right: 32px;
1928
+
1929
+ &:hover {
1930
+ background-color: var(--cc-sf-btn-primary-hover-bg, #2563EB) !important;
1931
+ }
1932
+
1933
+ &:disabled {
1934
+ background-color: #93C5FD !important;
1935
+ cursor: not-allowed;
1936
+ }
1937
+ }
1938
+
1939
+ ::ng-deep .cc-btn-outline {
1940
+ font-weight: 600;
1941
+ padding-left: 24px;
1942
+ padding-right: 24px;
1943
+ border-color: #D1D5DB;
1944
+ color: #374151;
1945
+
1946
+ &:hover {
1947
+ background-color: #F9FAFB;
1948
+ }
1949
+ }
1950
+ }
1951
+ }
1952
+
1953
+ .location-subtitle {
1954
+ line-height: 1.5;
1955
+ }
1956
+
1957
+ .loc-tab-btn {
1958
+ ::ng-deep button {
1959
+ width: 100%;
1960
+
1961
+ &:not(.cc-btn-warning) {
1962
+ background-color: var(--cc-sf-input-bg, #ffffff) !important;
1963
+ color: var(--cc-sf-label-color, #000000) !important;
1964
+ border: 1px solid var(--cc-sf-input-disabled-border, #E5E7EB);
1965
+
1966
+ &:hover {
1967
+ background-color: var(--cc-sf-input-disabled-bg, #F3F4F6) !important;
1968
+ }
1969
+ }
1970
+ }
1971
+ }
1972
+
1973
+ .loc-venue-item {
1974
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
1975
+
1976
+ &:hover {
1977
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
1978
+ border-color: var(--cc-sf-input-hover-border, #9CA3AF);
1979
+ }
1980
+ }
1981
+
1982
+ .loc-venue-search-icon {
1983
+ width: 18px;
1984
+ height: 18px;
1985
+ line-height: 18px;
1986
+ flex-shrink: 0;
1987
+ }
1988
+
1989
+ .loc-venue-text {
1990
+ white-space: nowrap;
1991
+ text-overflow: ellipsis;
1992
+ }
1993
+
1994
+ .loc-action-btn {
1995
+ transition: background 0.15s ease, color 0.15s ease;
1996
+ flex-shrink: 0;
1997
+
1998
+ mat-icon {
1999
+ font-size: 18px;
2000
+ width: 18px;
2001
+ height: 18px;
2002
+ line-height: 18px;
2003
+ }
2004
+
2005
+ &.loc-delete-btn {
2006
+ color: var(--loc-delete-color, #E53E3E);
2007
+
2008
+ &:hover {
2009
+ background: var(--cc-sf-error-bg, #FEF2F2);
2010
+ }
2011
+ }
2012
+
2013
+ &.loc-edit-btn {
2014
+ color: var(--cc-sf-hint-color, #9CA3AF);
2015
+
2016
+ &:hover {
2017
+ color: var(--cc-sf-input-focus-border, #3B82F6);
2018
+ background: var(--cc-sf-dropzone-hover-bg, #EFF6FF);
2019
+ }
2020
+ }
2021
+ }
2022
+
2023
+ .loc-search-icon {
2024
+ left: 0.75rem;
2025
+ width: 1.1rem;
2026
+ height: 1.1rem;
2027
+ line-height: 1.1rem;
2028
+ z-index: 1;
2029
+ }
2030
+
2031
+ .loc-suggestions-panel {
2032
+ top: calc(100% + 4px);
2033
+ left: 0;
2034
+ right: 0;
2035
+ z-index: 300;
2036
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10);
2037
+ animation: mu-fade-in 0.15s ease;
2038
+ max-height: 260px;
2039
+ overflow-y: auto;
2040
+ }
2041
+
2042
+ .loc-suggestion-item {
2043
+ transition: background 0.12s ease;
2044
+
2045
+ &:hover,
2046
+ &:focus {
2047
+ background: var(--loc-suggestion-hover-bg, #F0F9FF);
2048
+ }
2049
+
2050
+ &:not(:last-child) {
2051
+ border-bottom: 1px solid var(--cc-sf-input-disabled-border, #F3F4F6);
2052
+ }
2053
+ }
2054
+
2055
+ .loc-suggestion-icon {
2056
+ width: 18px;
2057
+ height: 18px;
2058
+ line-height: 18px;
2059
+ flex-shrink: 0;
2060
+ }
2061
+
2062
+ .loc-suggestion-text {
2063
+ white-space: nowrap;
2064
+ text-overflow: ellipsis;
2065
+ }
2066
+
2067
+ .loc-add-btn {
2068
+ transition: opacity 0.15s ease;
2069
+
2070
+ mat-icon {
2071
+ font-size: 20px;
2072
+ width: 20px;
2073
+ height: 20px;
2074
+ line-height: 20px;
2075
+ }
2076
+
2077
+ &:hover {
2078
+ opacity: 0.8;
2079
+ }
2080
+ }
2081
+
2082
+ .loc-map-container {
2083
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
2084
+ }
2085
+
2086
+ .loc-tba-panel {
2087
+ min-height: 120px;
2088
+ }
2089
+
2090
+ .loc-tba-icon {
2091
+ width: 40px;
2092
+ height: 40px;
2093
+ line-height: 40px;
2094
+ opacity: 0.6;
2095
+ }
2096
+
2097
+ .loc-tba-text {
2098
+ line-height: 1.6;
2099
+ max-width: 360px;
2100
+ }
2101
+
2102
+ .radio-label {
2103
+ display: flex !important;
2104
+
2105
+ .option-content {
2106
+ padding-left: 10px;
2107
+ }
2108
+ }
2109
+
2110
+ /* ==========================================================================
2111
+ LINK_LIST Field Styling
2112
+ ========================================================================== */
2113
+ .link-list-container {
2114
+ border: none !important;
2115
+ background-color: transparent !important;
2116
+ padding: 0 !important;
2117
+ box-shadow: none !important;
2118
+ overflow: visible !important;
2119
+ }
2120
+
2121
+ .link-items-list {
2122
+ list-style: none;
2123
+
2124
+ @media (max-width: 640px) {
2125
+ grid-template-columns: 1fr !important;
2126
+
2127
+ .link-list-item {
2128
+ grid-column: span 12 !important;
2129
+ }
2130
+ }
2131
+ }
2132
+
2133
+ .link-list-item {
2134
+ display: flex;
2135
+ align-items: center;
2136
+ justify-content: space-between;
2137
+ padding: 10px 16px;
2138
+ background-color: var(--cc-sf-link-item-bg, #f9fafb) !important;
2139
+ border: 1px solid var(--cc-sf-link-item-border, #E5E7EB) !important;
2140
+ border-radius: var(--cc-sf-input-radius, 9px) !important;
2141
+ gap: 12px;
2142
+ min-height: 48px;
2143
+
2144
+ .link-url-text {
2145
+ font-size: 0.875rem;
2146
+ color: var(--cc-sf-link-item-text, #111827);
2147
+ word-break: break-all;
2148
+ }
2149
+ }
2150
+
2151
+ .link-list-item .action-btn {
2152
+ border: none;
2153
+ background: transparent;
2154
+ cursor: pointer;
2155
+ display: inline-flex;
2156
+ align-items: center;
2157
+ justify-content: center;
2158
+ width: 34px;
2159
+ height: 34px;
2160
+ padding: 0;
2161
+ border-radius: 6px;
2162
+ transition: background 0.15s ease, color 0.15s ease;
2163
+
2164
+ mat-icon {
2165
+ font-size: 22px;
2166
+ width: 22px;
2167
+ height: 22px;
2168
+ line-height: 22px;
2169
+ display: flex;
2170
+ align-items: center;
2171
+ justify-content: center;
2172
+ }
2173
+
2174
+ &.edit-btn {
2175
+ color: var(--cc-sf-link-edit-color, #4b5563);
2176
+ &:hover {
2177
+ color: var(--cc-sf-accent-color, #6366F1);
2178
+ background-color: #F3F4F6;
2179
+ }
2180
+ }
2181
+
2182
+ &.delete-btn {
2183
+ color: var(--cc-sf-link-delete-color, #ef4444);
2184
+ &:hover {
2185
+ background-color: var(--cc-sf-error-bg, #FFF5F5);
2186
+ }
2187
+ }
2188
+
2189
+ &.save-btn {
2190
+ color: var(--cc-sf-link-save-color, #16a34a) !important;
2191
+ &:hover {
2192
+ background-color: #ECFDF5;
2193
+ }
2194
+ }
2195
+
2196
+ &.cancel-btn {
2197
+ color: #ef4444 !important; // Red cancel icon color
2198
+ &:hover {
2199
+ background-color: var(--cc-sf-error-bg, #FFF5F5);
2200
+ }
2201
+ }
2202
+ }
2203
+
2204
+ .pe-40px {
2205
+ padding-right: 40px !important;
2206
+ }
2207
+
2208
+ .dropdown-loading-state {
2209
+ display: flex;
2210
+ align-items: center;
2211
+ justify-content: center;
2212
+ padding: 16px;
2213
+ gap: 8px;
2214
+ }
2215
+
2216
+ .dropdown-spinner {
2217
+ width: 20px;
2218
+ height: 20px;
2219
+ border: 2px solid #E2E8F0;
2220
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
2221
+ border-radius: 50%;
2222
+ animation: cc-spin 0.7s linear infinite;
2223
+ }
2224
+
2225
+ .mini-spinner {
2226
+ width: 16px;
2227
+ height: 16px;
2228
+ border: 2px solid #E2E8F0;
2229
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
2230
+ border-radius: 50%;
2231
+ animation: cc-spin 0.7s linear infinite;
2232
+ }
2233
+
2234
+ .native-select-wrapper {
2235
+ display: block;
2236
+ width: 100%;
2237
+ position: relative;
2238
+
2239
+ select {
2240
+ width: 100%;
2241
+ }
2242
+
2243
+ .native-select-spinner {
2244
+ position: absolute;
2245
+ right: 2.5rem;
2246
+ top: calc(50% - 7px);
2247
+ width: 14px;
2248
+ height: 14px;
2249
+ border: 2px solid #CBD5E1;
2250
+ border-top-color: var(--cc-sf-accent-color, #3B82F6);
2251
+ border-radius: 50%;
2252
+ animation: cc-spin 0.7s linear infinite;
2253
+ pointer-events: none;
2254
+ }
2255
+ }