angular-data-mapper 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/LICENSE +190 -0
  3. package/PUBLISHING.md +75 -0
  4. package/README.md +214 -0
  5. package/angular.json +121 -0
  6. package/package.json +67 -0
  7. package/projects/demo-app/public/favicon.ico +0 -0
  8. package/projects/demo-app/src/app/app.config.ts +12 -0
  9. package/projects/demo-app/src/app/app.html +36 -0
  10. package/projects/demo-app/src/app/app.routes.ts +62 -0
  11. package/projects/demo-app/src/app/app.scss +65 -0
  12. package/projects/demo-app/src/app/app.ts +11 -0
  13. package/projects/demo-app/src/app/layout/app-layout.component.ts +294 -0
  14. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.html +87 -0
  15. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.scss +202 -0
  16. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.ts +192 -0
  17. package/projects/demo-app/src/app/pages/mappings-page/add-mapping-dialog.component.ts +163 -0
  18. package/projects/demo-app/src/app/pages/mappings-page/mappings-page.component.ts +306 -0
  19. package/projects/demo-app/src/app/pages/schema-creator-page/schema-creator-page.component.ts +88 -0
  20. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.html +108 -0
  21. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.scss +317 -0
  22. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.ts +129 -0
  23. package/projects/demo-app/src/app/services/app-state.service.ts +233 -0
  24. package/projects/demo-app/src/app/services/sample-data.service.ts +228 -0
  25. package/projects/demo-app/src/index.html +15 -0
  26. package/projects/demo-app/src/main.ts +6 -0
  27. package/projects/demo-app/src/styles.scss +54 -0
  28. package/projects/demo-app/tsconfig.app.json +13 -0
  29. package/projects/ngx-data-mapper/ng-package.json +7 -0
  30. package/projects/ngx-data-mapper/package.json +40 -0
  31. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.html +183 -0
  32. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.scss +352 -0
  33. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.ts +277 -0
  34. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.html +174 -0
  35. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.scss +357 -0
  36. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.ts +258 -0
  37. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.html +139 -0
  38. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.scss +213 -0
  39. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.ts +261 -0
  40. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.html +199 -0
  41. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.scss +321 -0
  42. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.ts +618 -0
  43. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.html +67 -0
  44. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.scss +97 -0
  45. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.ts +105 -0
  46. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.html +552 -0
  47. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.scss +824 -0
  48. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.ts +730 -0
  49. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.html +82 -0
  50. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.scss +352 -0
  51. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.ts +225 -0
  52. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.html +346 -0
  53. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.scss +511 -0
  54. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.ts +368 -0
  55. package/projects/ngx-data-mapper/src/lib/models/json-schema.model.ts +164 -0
  56. package/projects/ngx-data-mapper/src/lib/models/schema.model.ts +173 -0
  57. package/projects/ngx-data-mapper/src/lib/services/mapping.service.ts +615 -0
  58. package/projects/ngx-data-mapper/src/lib/services/schema-parser.service.ts +270 -0
  59. package/projects/ngx-data-mapper/src/lib/services/svg-connector.service.ts +135 -0
  60. package/projects/ngx-data-mapper/src/lib/services/transformation.service.ts +453 -0
  61. package/projects/ngx-data-mapper/src/public-api.ts +22 -0
  62. package/projects/ngx-data-mapper/tsconfig.lib.json +13 -0
  63. package/projects/ngx-data-mapper/tsconfig.lib.prod.json +9 -0
  64. package/tsconfig.json +28 -0
@@ -0,0 +1,824 @@
1
+ // CSS Custom Properties for theming
2
+ :host {
3
+ // Colors
4
+ --schema-editor-bg: white;
5
+ --schema-editor-border-radius: 12px;
6
+ --schema-editor-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
7
+ --schema-editor-border-color: #e2e8f0;
8
+
9
+ // Header
10
+ --schema-editor-header-bg: white;
11
+ --schema-editor-header-border: #e2e8f0;
12
+
13
+ // Field item
14
+ --schema-editor-field-bg: #f8fafc;
15
+ --schema-editor-field-bg-hover: #f1f5f9;
16
+ --schema-editor-field-bg-editing: #eff6ff;
17
+ --schema-editor-field-bg-complex: #fefce8;
18
+ --schema-editor-field-border-radius: 8px;
19
+
20
+ // Text colors
21
+ --schema-editor-text-primary: #1e293b;
22
+ --schema-editor-text-secondary: #64748b;
23
+ --schema-editor-text-muted: #94a3b8;
24
+
25
+ // Accent colors
26
+ --schema-editor-accent-primary: #3b82f6;
27
+ --schema-editor-accent-success: #22c55e;
28
+ --schema-editor-accent-warning: #f59e0b;
29
+ --schema-editor-accent-danger: #ef4444;
30
+
31
+ // Spacing
32
+ --schema-editor-spacing-sm: 8px;
33
+ --schema-editor-spacing-md: 16px;
34
+ --schema-editor-spacing-lg: 24px;
35
+
36
+ // Font sizes
37
+ --schema-editor-font-size-sm: 12px;
38
+ --schema-editor-font-size-md: 14px;
39
+ --schema-editor-font-size-lg: 16px;
40
+ }
41
+
42
+ .schema-editor {
43
+ background: var(--schema-editor-bg);
44
+ border-radius: var(--schema-editor-border-radius);
45
+ box-shadow: var(--schema-editor-shadow);
46
+ height: 100%;
47
+ display: flex;
48
+ flex-direction: column;
49
+ overflow: hidden;
50
+ }
51
+
52
+ .editor-header {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ padding: var(--schema-editor-spacing-md) var(--schema-editor-spacing-lg);
57
+ border-bottom: 1px solid var(--schema-editor-border-color);
58
+ gap: var(--schema-editor-spacing-md);
59
+ flex-shrink: 0;
60
+ background: var(--schema-editor-bg);
61
+
62
+ .schema-name-section {
63
+ flex: 1;
64
+ max-width: 400px;
65
+ }
66
+
67
+ .schema-name-field {
68
+ width: 100%;
69
+
70
+ ::ng-deep {
71
+ .mat-mdc-form-field-subscript-wrapper {
72
+ display: none;
73
+ }
74
+
75
+ .mat-mdc-text-field-wrapper {
76
+ padding: 0 12px;
77
+ }
78
+
79
+ .mat-mdc-form-field-infix {
80
+ padding-top: 8px;
81
+ padding-bottom: 8px;
82
+ min-height: 36px;
83
+ }
84
+
85
+ .mdc-notched-outline__leading,
86
+ .mdc-notched-outline__notch,
87
+ .mdc-notched-outline__trailing {
88
+ border-color: var(--schema-editor-border-color) !important;
89
+ }
90
+
91
+ .mdc-notched-outline__notch {
92
+ border-right: none;
93
+ }
94
+
95
+ input.mat-mdc-input-element {
96
+ font-size: 14px;
97
+ }
98
+
99
+ .mat-mdc-floating-label {
100
+ font-size: 13px;
101
+ }
102
+ }
103
+ }
104
+
105
+ .header-actions {
106
+ display: flex;
107
+ gap: 12px;
108
+
109
+ button {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: 6px;
113
+ }
114
+ }
115
+
116
+ .view-toggle {
117
+ border: 1px solid var(--schema-editor-border-color);
118
+ border-radius: 8px;
119
+ overflow: hidden;
120
+
121
+ ::ng-deep {
122
+ .mat-button-toggle {
123
+ background: white;
124
+
125
+ &.mat-button-toggle-checked {
126
+ background: var(--schema-editor-accent-primary);
127
+ color: white;
128
+ }
129
+
130
+ .mat-button-toggle-label-content {
131
+ padding: 0 16px;
132
+ font-size: 13px;
133
+ font-weight: 500;
134
+ line-height: 32px;
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ // JSON View
142
+ .json-view {
143
+ flex: 1;
144
+ display: flex;
145
+ flex-direction: column;
146
+ min-height: 0;
147
+ overflow: hidden;
148
+ }
149
+
150
+ .json-error {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 8px;
154
+ padding: 10px 16px;
155
+ background: #fef2f2;
156
+ border-bottom: 1px solid #fecaca;
157
+ color: #dc2626;
158
+ font-size: 12px;
159
+ flex-shrink: 0;
160
+
161
+ mat-icon {
162
+ font-size: 16px;
163
+ width: 16px;
164
+ height: 16px;
165
+ }
166
+ }
167
+
168
+ .json-textarea {
169
+ flex: 1;
170
+ width: 100%;
171
+ padding: 16px;
172
+ border: none;
173
+ outline: none;
174
+ resize: none;
175
+ font-family: 'SF Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
176
+ font-size: 13px;
177
+ line-height: 1.6;
178
+ color: var(--schema-editor-text-primary);
179
+ background: var(--schema-editor-bg);
180
+ tab-size: 2;
181
+ box-sizing: border-box;
182
+
183
+ &:focus {
184
+ outline: none;
185
+ }
186
+ }
187
+
188
+ .hidden {
189
+ display: none !important;
190
+ }
191
+
192
+ .fields-container {
193
+ flex: 1;
194
+ overflow-y: auto;
195
+ padding: 16px;
196
+ min-height: 0;
197
+ }
198
+
199
+ .empty-state {
200
+ display: flex;
201
+ flex-direction: column;
202
+ align-items: center;
203
+ justify-content: center;
204
+ padding: 60px 24px;
205
+ color: #94a3b8;
206
+ text-align: center;
207
+
208
+ mat-icon {
209
+ font-size: 64px;
210
+ width: 64px;
211
+ height: 64px;
212
+ margin-bottom: 16px;
213
+ opacity: 0.5;
214
+ }
215
+
216
+ p {
217
+ font-size: 16px;
218
+ margin: 0;
219
+ }
220
+ }
221
+
222
+ .fields-list {
223
+ display: block;
224
+ width: 100%;
225
+ min-height: 50px;
226
+
227
+ .field-wrapper {
228
+ margin-bottom: 4px;
229
+ }
230
+ }
231
+
232
+ .field-item {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: var(--schema-editor-spacing-sm);
236
+ padding: var(--schema-editor-spacing-sm) 12px;
237
+ background: var(--schema-editor-field-bg);
238
+ border-radius: var(--schema-editor-field-border-radius);
239
+ border: 1px solid transparent;
240
+ transition: all 0.15s ease;
241
+ box-sizing: border-box;
242
+
243
+ &:hover {
244
+ background: var(--schema-editor-field-bg-hover);
245
+ border-color: var(--schema-editor-border-color);
246
+ }
247
+
248
+ &.is-editing {
249
+ background: var(--schema-editor-field-bg-editing);
250
+ border-color: var(--schema-editor-accent-primary);
251
+ }
252
+
253
+ &.is-complex {
254
+ background: var(--schema-editor-field-bg-complex);
255
+
256
+ &:hover {
257
+ background: #fef9c3;
258
+ }
259
+ }
260
+ }
261
+
262
+ // Left section of field item
263
+ .field-left {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: var(--schema-editor-spacing-sm);
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ // Right section of field item
271
+ .field-right {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: var(--schema-editor-spacing-sm);
275
+ flex-shrink: 0;
276
+ margin-left: auto;
277
+ }
278
+
279
+ // Drag handle for reordering
280
+ .drag-handle {
281
+ display: flex;
282
+ align-items: center;
283
+ justify-content: center;
284
+ cursor: grab;
285
+ color: #94a3b8;
286
+ padding: 4px;
287
+ border-radius: 4px;
288
+ transition: all 0.15s ease;
289
+
290
+ &:hover {
291
+ background: #e2e8f0;
292
+ color: #64748b;
293
+ }
294
+
295
+ &:active {
296
+ cursor: grabbing;
297
+ }
298
+
299
+ mat-icon {
300
+ font-size: 20px;
301
+ width: 20px;
302
+ height: 20px;
303
+ }
304
+ }
305
+
306
+ // Field wrapper for drag-drop
307
+ .field-wrapper {
308
+ display: block;
309
+ width: 100%;
310
+ box-sizing: border-box;
311
+ }
312
+
313
+ // Custom drag preview - use ::ng-deep because CDK renders it outside component scope
314
+ ::ng-deep .drag-preview {
315
+ display: flex !important;
316
+ align-items: center !important;
317
+ gap: 8px !important;
318
+ padding: 12px 16px !important;
319
+ background: white !important;
320
+ border: 2px solid #3b82f6 !important;
321
+ border-radius: 8px !important;
322
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2) !important;
323
+ font-size: 14px !important;
324
+ font-weight: 500 !important;
325
+ color: #1e293b !important;
326
+ overflow: hidden !important;
327
+ white-space: nowrap !important;
328
+ box-sizing: border-box !important;
329
+
330
+ mat-icon {
331
+ color: #3b82f6 !important;
332
+ font-size: 20px !important;
333
+ width: 20px !important;
334
+ height: 20px !important;
335
+ flex-shrink: 0 !important;
336
+ overflow: hidden !important;
337
+ }
338
+ }
339
+
340
+ // Explicit drag placeholder
341
+ .drag-placeholder {
342
+ background: #e2e8f0;
343
+ border: 2px dashed var(--schema-editor-accent-primary);
344
+ border-radius: var(--schema-editor-field-border-radius);
345
+ min-height: 48px;
346
+ margin-bottom: 4px;
347
+
348
+ .placeholder-content {
349
+ height: 100%;
350
+ min-height: 48px;
351
+ }
352
+ }
353
+
354
+ // CDK Drag and Drop styles
355
+ .cdk-drag-animating {
356
+ transition: transform 200ms cubic-bezier(0, 0, 0.2, 1);
357
+ }
358
+
359
+ .cdk-drop-list-dragging .field-wrapper:not(.cdk-drag-placeholder) {
360
+ transition: transform 200ms cubic-bezier(0, 0, 0.2, 1);
361
+ }
362
+
363
+ .indent-buttons {
364
+ display: flex;
365
+ flex-direction: row;
366
+ gap: 2px;
367
+
368
+ .indent-btn {
369
+ background: none;
370
+ border: none;
371
+ padding: 2px;
372
+ cursor: pointer;
373
+ color: #94a3b8;
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+ width: 20px;
378
+ height: 20px;
379
+ border-radius: 3px;
380
+ transition: all 0.15s ease;
381
+
382
+ &:hover:not(:disabled) {
383
+ background: #dbeafe;
384
+ color: #2563eb;
385
+ }
386
+
387
+ &:disabled {
388
+ opacity: 0.3;
389
+ cursor: default;
390
+ }
391
+
392
+ mat-icon {
393
+ font-size: 16px;
394
+ width: 16px;
395
+ height: 16px;
396
+ }
397
+ }
398
+ }
399
+
400
+ .expand-btn {
401
+ background: none;
402
+ border: none;
403
+ padding: 4px;
404
+ cursor: pointer;
405
+ color: #64748b;
406
+ border-radius: 4px;
407
+ display: flex;
408
+ align-items: center;
409
+ transition: all 0.15s ease;
410
+
411
+ &:hover {
412
+ background: #e2e8f0;
413
+ color: #1e293b;
414
+ }
415
+
416
+ mat-icon {
417
+ font-size: 20px;
418
+ width: 20px;
419
+ height: 20px;
420
+ }
421
+ }
422
+
423
+ .expand-placeholder {
424
+ width: 28px;
425
+ flex-shrink: 0;
426
+ }
427
+
428
+ .type-icon {
429
+ font-size: 18px;
430
+ width: 18px;
431
+ height: 18px;
432
+ color: #64748b;
433
+ flex-shrink: 0;
434
+ }
435
+
436
+ .field-name {
437
+ flex: 0 0 auto;
438
+ width: 150px;
439
+ font-size: 14px;
440
+ font-weight: 500;
441
+ color: #1e293b;
442
+ cursor: pointer;
443
+ padding: 4px 8px;
444
+ border-radius: 4px;
445
+ overflow: hidden;
446
+ text-overflow: ellipsis;
447
+ white-space: nowrap;
448
+
449
+ &:hover {
450
+ background: #e2e8f0;
451
+ }
452
+
453
+ .array-indicator {
454
+ color: #f59e0b;
455
+ font-weight: 600;
456
+ margin-left: 2px;
457
+ }
458
+ }
459
+
460
+ .field-name-input {
461
+ flex: 0 0 auto;
462
+ width: 150px;
463
+ font-size: 14px;
464
+ font-weight: 500;
465
+ color: #1e293b;
466
+ padding: 6px 10px;
467
+ border: 2px solid #3b82f6;
468
+ border-radius: 6px;
469
+ outline: none;
470
+ background: white;
471
+
472
+ &::placeholder {
473
+ color: #94a3b8;
474
+ font-weight: 400;
475
+ }
476
+ }
477
+
478
+ .required-btn {
479
+ background: none;
480
+ border: none;
481
+ padding: 4px;
482
+ cursor: pointer;
483
+ color: #cbd5e1;
484
+ display: flex;
485
+ align-items: center;
486
+ justify-content: center;
487
+ border-radius: 4px;
488
+ transition: all 0.15s ease;
489
+ flex-shrink: 0;
490
+
491
+ &:hover {
492
+ color: #f59e0b;
493
+ background: #fef3c7;
494
+ }
495
+
496
+ &.is-required {
497
+ color: #f59e0b;
498
+ }
499
+
500
+ mat-icon {
501
+ font-size: 18px;
502
+ width: 18px;
503
+ height: 18px;
504
+ }
505
+ }
506
+
507
+ .description-input {
508
+ flex: 1;
509
+ font-size: 13px;
510
+ color: #64748b;
511
+ padding: 6px 10px;
512
+ border: 1px solid #e2e8f0;
513
+ border-radius: 6px;
514
+ outline: none;
515
+ background: #f8fafc;
516
+ min-width: 80px;
517
+ max-width: 100%;
518
+ transition: all 0.15s ease;
519
+
520
+ &:focus {
521
+ border-color: #3b82f6;
522
+ background: white;
523
+ }
524
+
525
+ &::placeholder {
526
+ color: #94a3b8;
527
+ font-style: italic;
528
+ }
529
+ }
530
+
531
+ .type-selector {
532
+ width: 140px;
533
+ flex-shrink: 0;
534
+
535
+ ::ng-deep {
536
+ .mat-mdc-form-field-subscript-wrapper {
537
+ display: none;
538
+ }
539
+
540
+ .mat-mdc-text-field-wrapper {
541
+ padding: 0 8px !important;
542
+ }
543
+
544
+ .mat-mdc-form-field-infix {
545
+ padding-top: 4px !important;
546
+ padding-bottom: 4px !important;
547
+ min-height: 28px !important;
548
+ }
549
+
550
+ .mat-mdc-select {
551
+ font-size: 12px !important;
552
+ }
553
+
554
+ .mat-mdc-select-value-text {
555
+ font-size: 12px !important;
556
+ }
557
+
558
+ .mat-mdc-select-arrow-wrapper {
559
+ transform: scale(0.8);
560
+ }
561
+ }
562
+ }
563
+
564
+ .field-actions {
565
+ display: flex;
566
+ align-items: center;
567
+ justify-content: flex-end;
568
+ gap: 4px;
569
+ width: 128px;
570
+ flex-shrink: 0;
571
+ opacity: 0;
572
+ transition: opacity 0.15s ease;
573
+
574
+ .field-item:hover &,
575
+ .field-right:hover & {
576
+ opacity: 1;
577
+ }
578
+
579
+ button {
580
+ color: #64748b;
581
+
582
+ &:hover {
583
+ color: #1e293b;
584
+ }
585
+ }
586
+ }
587
+
588
+ .delete-action {
589
+ color: #ef4444 !important;
590
+
591
+ mat-icon {
592
+ color: #ef4444;
593
+ }
594
+ }
595
+
596
+ .nested-fields {
597
+ display: block;
598
+ min-height: 30px;
599
+ margin-top: 4px;
600
+ margin-bottom: 8px;
601
+ padding-left: 32px;
602
+
603
+ .field-wrapper {
604
+ margin-bottom: 4px;
605
+ }
606
+
607
+ // Reduce margin for editors inside nested fields (container already has 32px padding)
608
+ .allowed-values-editor,
609
+ .default-value-editor {
610
+ margin-left: 16px;
611
+ }
612
+ }
613
+
614
+ .empty-nested {
615
+ display: flex;
616
+ align-items: center;
617
+ gap: 12px;
618
+ padding: 12px 16px;
619
+ color: #94a3b8;
620
+ font-size: 13px;
621
+ font-style: italic;
622
+ background: #f8fafc;
623
+ border-radius: 6px;
624
+ border: 1px dashed #e2e8f0;
625
+ }
626
+
627
+ // Allowed Values Editor
628
+ .allowed-values-editor {
629
+ margin-left: 48px;
630
+ margin-top: 4px;
631
+ margin-bottom: 8px;
632
+ padding: 12px;
633
+ background: #f0fdf4;
634
+ border: 1px solid #bbf7d0;
635
+ border-radius: 8px;
636
+
637
+ .values-header {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 8px;
641
+ margin-bottom: 8px;
642
+ }
643
+
644
+ .values-label {
645
+ font-size: 12px;
646
+ font-weight: 500;
647
+ color: #166534;
648
+ }
649
+
650
+ .value-input {
651
+ flex: 1;
652
+ padding: 6px 10px;
653
+ font-size: 13px;
654
+ border: 1px solid #86efac;
655
+ border-radius: 4px;
656
+ outline: none;
657
+ background: white;
658
+
659
+ &:focus {
660
+ border-color: #22c55e;
661
+ }
662
+
663
+ &::placeholder {
664
+ color: #94a3b8;
665
+ }
666
+ }
667
+
668
+ .add-value-btn {
669
+ background: #22c55e;
670
+ border: none;
671
+ color: white;
672
+ width: 28px;
673
+ height: 28px;
674
+ border-radius: 4px;
675
+ cursor: pointer;
676
+ display: flex;
677
+ align-items: center;
678
+ justify-content: center;
679
+ transition: background 0.15s ease;
680
+
681
+ &:hover {
682
+ background: #16a34a;
683
+ }
684
+
685
+ mat-icon {
686
+ font-size: 18px;
687
+ width: 18px;
688
+ height: 18px;
689
+ }
690
+ }
691
+
692
+ .values-list {
693
+ display: flex;
694
+ flex-wrap: wrap;
695
+ gap: 6px;
696
+ }
697
+
698
+ .value-chip {
699
+ display: inline-flex;
700
+ align-items: center;
701
+ gap: 4px;
702
+ padding: 4px 8px;
703
+ background: white;
704
+ border: 1px solid #86efac;
705
+ border-radius: 4px;
706
+ font-size: 12px;
707
+ color: #166534;
708
+
709
+ .remove-value-btn {
710
+ background: none;
711
+ border: none;
712
+ padding: 0;
713
+ cursor: pointer;
714
+ color: #94a3b8;
715
+ display: flex;
716
+ align-items: center;
717
+ transition: color 0.15s ease;
718
+
719
+ &:hover {
720
+ color: #ef4444;
721
+ }
722
+
723
+ mat-icon {
724
+ font-size: 14px;
725
+ width: 14px;
726
+ height: 14px;
727
+ }
728
+ }
729
+ }
730
+
731
+ .no-values {
732
+ font-size: 12px;
733
+ color: #94a3b8;
734
+ font-style: italic;
735
+ }
736
+ }
737
+
738
+ .field-actions {
739
+ .has-values {
740
+ color: #22c55e !important;
741
+ }
742
+
743
+ .has-default {
744
+ color: #8b5cf6 !important;
745
+ }
746
+ }
747
+
748
+ // Default Value Editor
749
+ .default-value-editor {
750
+ margin-left: 48px;
751
+ margin-top: 4px;
752
+ margin-bottom: 8px;
753
+ padding: 12px;
754
+ background: #f5f3ff;
755
+ border: 1px solid #c4b5fd;
756
+ border-radius: 8px;
757
+
758
+ .default-header {
759
+ display: flex;
760
+ align-items: center;
761
+ gap: 8px;
762
+ }
763
+
764
+ .default-label {
765
+ font-size: 12px;
766
+ font-weight: 500;
767
+ color: #6d28d9;
768
+ }
769
+
770
+ .default-input {
771
+ flex: 1;
772
+ padding: 6px 10px;
773
+ font-size: 13px;
774
+ border: 1px solid #a78bfa;
775
+ border-radius: 4px;
776
+ outline: none;
777
+ background: white;
778
+ max-width: 200px;
779
+
780
+ &:focus {
781
+ border-color: #8b5cf6;
782
+ }
783
+
784
+ &::placeholder {
785
+ color: #94a3b8;
786
+ }
787
+ }
788
+
789
+ .default-select {
790
+ padding: 6px 10px;
791
+ font-size: 13px;
792
+ border: 1px solid #a78bfa;
793
+ border-radius: 4px;
794
+ outline: none;
795
+ background: white;
796
+ cursor: pointer;
797
+
798
+ &:focus {
799
+ border-color: #8b5cf6;
800
+ }
801
+ }
802
+
803
+ .clear-default-btn {
804
+ background: none;
805
+ border: none;
806
+ padding: 4px;
807
+ cursor: pointer;
808
+ color: #94a3b8;
809
+ display: flex;
810
+ align-items: center;
811
+ transition: color 0.15s ease;
812
+
813
+ &:hover {
814
+ color: #ef4444;
815
+ }
816
+
817
+ mat-icon {
818
+ font-size: 16px;
819
+ width: 16px;
820
+ height: 16px;
821
+ }
822
+ }
823
+ }
824
+