commons-shared-web-ui 0.0.48 → 0.0.50

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