@ninebone/datagrid 0.0.14 → 0.0.18

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.
@@ -1,1795 +0,0 @@
1
-
2
- cell-button {
3
- --cell-button-border: 1px solid #d1d5db;
4
- --cell-button-color: #1f2937;
5
- --cell-button-background: #f3f4f6;
6
-
7
- --cell-button-hover-border: 1px solid #d1d5db;
8
- --cell-button-hover-color: #1f2937;
9
- --cell-button-hover-background: #f3f4f6;
10
- --cell-button-active-border: 1px solid #d1d5db;
11
- --cell-button-active-color: #1f2937;
12
- --cell-button-active-background: #f3f4f6;
13
-
14
- display: block;
15
- position: absolute;
16
- inset: 0; /* top: 0, right: 0, bottom: 0, left: 0 */
17
- padding: 3px 4px;
18
-
19
- button {
20
- width: 100%;
21
- display: inline-flex;
22
- align-items: center;
23
- justify-content: center;
24
- border-radius: 4px;
25
- border: var(--cell-button-border);
26
- color: var(--cell-button-color);
27
- background: var(--cell-button-background);
28
- text-overflow: ellipsis;
29
- white-space: nowrap;
30
- overflow: hidden;
31
- }
32
- button:hover {
33
- border: var(--cell-button-hover-border);
34
- color: var(--cell-button-hover-color);
35
- background: var(--cell-button-hover-background);
36
- }
37
- button:active {
38
- border: var(--cell-button-active-border);
39
- color: var(--cell-button-active-color);
40
- background: var(--cell-button-active-background);
41
- }
42
- }
43
-
44
- cell-checkbox {
45
- display: flex;
46
- align-items: center;
47
- width: 100%;
48
- height: 100%;
49
-
50
- label {
51
- display: inline-flex;
52
- align-items: center;
53
- user-select: none;
54
- }
55
- input[type="checkbox"] {
56
- margin-left: 4px;
57
- margin-right: 4px;
58
- }
59
- }
60
-
61
-
62
- .CELL-CHECKBOX {
63
- cell-checkbox {
64
- justify-content: center;
65
- }
66
- label {
67
- display: flex;
68
- }
69
- input {
70
- background-color: #ffffff;
71
- }
72
- }
73
- .CELL-CHECKBOX[text-align='left'] {
74
- cell-checkbox {
75
- justify-content: flex-start;
76
- }
77
- }
78
- .CELL-CHECKBOX[text-align='center'] {
79
- cell-checkbox {
80
- justify-content: center;
81
- }
82
- }
83
- .CELL-CHECKBOX[text-align='right'] {
84
- cell-checkbox {
85
- justify-content: flex-end;
86
- }
87
- label {
88
- flex-direction: row-reverse;
89
- }
90
- }
91
-
92
-
93
- cell-combo {
94
- --cell-combo-button-border-color: #eee;
95
- --cell-combo-button-bg-color: #f9f9f9;
96
-
97
- button.btn1 {
98
- width: calc(100% - 24px);
99
- border: 1px solid var(--cell-combo-button-border-color);
100
- border-right: none;
101
- border-top-left-radius: 3px;
102
- border-bottom-left-radius: 3px;
103
- text-align: left;
104
- background-color: white;
105
- overflow: hidden;
106
- text-overflow: ellipsis;
107
- white-space: nowrap;
108
- padding: 0 4px;
109
- color: #000;
110
- }
111
- button.btn2 {
112
- padding: 3px;
113
- width: 24px;
114
- border: 1px solid var(--cell-combo-button-border-color);
115
- border-top-right-radius: 3px;
116
- border-bottom-right-radius: 3px;
117
- background-color: var(--cell-combo-button-bg-color);
118
- display: flex;
119
- align-items: center;
120
- justify-content: center;
121
- color: #333;
122
- }
123
- button.btn2:after {
124
- content: "";
125
- border-top: 0.3em solid;
126
- border-right: 0.3em solid transparent;
127
- border-bottom: 0;
128
- border-left: 0.3em solid transparent;
129
- }
130
- }
131
-
132
-
133
-
134
- cell-combo-panel {
135
- z-index: 2;
136
- position: absolute;
137
- width: 250px;
138
- height: 250px;
139
- border: 1px solid #999;
140
- background-color: white;
141
- overflow: hidden;
142
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
143
- display: none;
144
- flex-direction: column;
145
- padding: 0;
146
- margin: 0;
147
- resize: both;
148
-
149
- .head {
150
- display: none;
151
- padding: 6px;
152
- background: #f8f9fa;
153
- border-bottom: 1px solid #e5e7eb;
154
-
155
- input[type="text"] {
156
- width: 100%;
157
- height: 26px;
158
- padding: 0 6px;
159
- border: 1px solid #d1d5db;
160
- border-radius: 3px;
161
- }
162
- }
163
-
164
- .footer {
165
- display: none;
166
- height: 32px;
167
- background: #f3f4f6;
168
- border-top: 1px solid #e5e7eb;
169
- align-items: center;
170
- padding: 0 8px;
171
-
172
- label {
173
- user-select: none;
174
- }
175
-
176
- button {
177
- height: 22px;
178
- padding: 0 12px;
179
- background: #2563eb;
180
- color: white;
181
- border: none;
182
- border-radius: 3px;
183
- }
184
-
185
- button:hover {
186
- background: #1d4ed8;
187
- }
188
- }
189
-
190
- nine-table-simple {
191
- width: 100%;
192
- flex: 1;
193
- border: none;
194
- }
195
- }
196
-
197
-
198
-
199
- cell-combo-panel.active {
200
- display: flex;
201
- }
202
-
203
- cell-combo-panel.expand {
204
- .head {
205
- display: flex;
206
- }
207
- }
208
-
209
- cell-combo-panel.multi {
210
- .footer {
211
- display: flex;
212
- justify-content: space-between;
213
- }
214
- }
215
-
216
-
217
-
218
- cell-combo-panel.loading {
219
- nine-table-simple {
220
- visibility: hidden;
221
- }
222
- }
223
- cell-combo-panel.loading::after {
224
- content: "";
225
- position: absolute;
226
- inset: 0;
227
- background: rgba(255, 255, 255, 0.3);
228
- z-index: 10;
229
- display: flex;
230
- align-items: center;
231
- justify-content: center;
232
- }
233
- cell-combo-panel.loading::before {
234
- content: "";
235
- position: absolute;
236
- top: 50%;
237
- left: 50%;
238
- width: 24px;
239
- height: 24px;
240
- margin: -12px 0 0 -12px;
241
- border: 3px solid #e5e7eb;
242
- border-top-color: #2563eb;
243
- border-radius: 50%;
244
- animation: combo-loading-spin 0.6s linear infinite;
245
- z-index: 999999911;
246
- }
247
- @keyframes combo-loading-spin {
248
- to {
249
- transform: rotate(360deg);
250
- }
251
- }
252
-
253
- :host {
254
- --cell-input-border-color: #eee;
255
- --cell-input-bg: #fff;
256
- --cell-input-color: #333;
257
- --cell-input-readonly-bg: #fdfdfd;
258
- --cell-input-btn-bg: #f9f9f9;
259
- }
260
-
261
- cell-input {
262
- input {
263
- position: relative;
264
- user-select: auto;
265
- width: 100%;
266
- border: 1px solid var(--cell-input-border-color);
267
- padding-left: 4px;
268
- background: var(--cell-input-bg);
269
- color: var(--cell-input-color);
270
- }
271
-
272
- input:read-only {
273
- border-color: var(--cell-input-readonly-bg);
274
- filter: brightness(97%);
275
- }
276
- }
277
-
278
- cell-input-color {
279
-
280
- input[type=color] {
281
- width: 100%;
282
- padding: 0px;
283
- margin-left: unset;
284
- border: 1px solid var(--cell-input-border-color);
285
- border-right: none;
286
- -webkit-appearance: none;
287
- -moz-appearance: none;
288
- appearance: none;
289
- background-color: transparent;
290
- }
291
-
292
- input[type=color]::-webkit-color-swatch {
293
- border: 0;
294
- }
295
-
296
- input[type=color]::-webkit-color-swatch-wrapper {
297
- padding: 1px;
298
- }
299
-
300
- button {
301
- display: inline-flex;
302
- width: 24px;
303
- margin-right: unset;
304
- border: 1px solid var(--cell-input-border-color);
305
- background-color: var(--cell-input-btn-bg);
306
- justify-content: center;
307
- align-items: center;
308
- }
309
-
310
- button:after {
311
- content: "";
312
- border-top: 0.3em solid var(--cell-input-color);
313
- border-right: 0.3em solid transparent;
314
- border-bottom: 0;
315
- border-left: 0.3em solid transparent;
316
- }
317
-
318
- input[type=color]:hover, button:hover {
319
- filter: brightness(95%);
320
- }
321
- }
322
-
323
- cell-input-date {
324
-
325
- input {
326
- position: relative;
327
- margin: 0;
328
- width: 100%;
329
- padding: 0 4px;
330
- border: 1px solid var(--cell-input-border-color);
331
- background: var(--cell-input-bg);
332
- -webkit-appearance: none;
333
- -moz-appearance: none;
334
- appearance: none;
335
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="black" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5z"/></svg>');
336
- background-repeat: no-repeat;
337
- background-position: right 4px center;
338
- background-size: 14px 16px;
339
- color: var(--cell-input-color);
340
- }
341
-
342
- input:hover {
343
- filter: brightness(95%);
344
- }
345
-
346
- input::before {
347
- content: attr(data-placeholder);
348
- position: absolute;
349
- display: flex;
350
- align-items: center;
351
- width: calc(100% - 22px);
352
- height: 100%;
353
- left: 1px;
354
- top: 1px;
355
- pointer-events: none;
356
- }
357
-
358
- input.has-value::before, input:focus::before {
359
- display: none;
360
- }
361
-
362
- input:focus {
363
-
364
- }
365
- }
366
-
367
- cell-input-number {
368
- input.border-left-none {
369
- border-left: 0;
370
- border-top-left-radius: 0;
371
- border-bottom-left-radius: 0;
372
- }
373
- input.border-right-none {
374
- border-right: 0;
375
- border-top-right-radius: 0;
376
- border-bottom-right-radius: 0;
377
- }
378
-
379
- input {
380
- position: relative;
381
- user-select: auto;
382
- width: 100%;
383
- border: 1px solid var(--cell-input-border-color);
384
- background: var(--cell-input-bg);
385
- color: var(--cell-input-color);
386
- text-align: right;
387
- }
388
-
389
- input:read-only {
390
- border-color: var(--cell-input-readonly-bg);
391
- filter: brightness(97%);
392
- }
393
- }
394
- cell-radio {
395
- height: 100%;
396
- width: calc(100% - 8px);
397
- display: flex;
398
- align-items: center;
399
- margin-left: 4px;
400
- margin-right: 4px;
401
-
402
- div {
403
- display: flex;
404
- flex-direction: row;
405
- }
406
-
407
- label {
408
- display: flex;
409
- align-items: center;
410
- margin-right: 8px;
411
- user-select: none;
412
- }
413
-
414
- label.disabled {
415
- pointer-events: none;
416
- opacity: 0.5;
417
- }
418
-
419
- span {
420
- margin-left: 4px;
421
- }
422
- }
423
-
424
- .CELL-RADIO[text-align='left'] {
425
- cell-radio {
426
- justify-content: flex-start;
427
- }
428
- }
429
- .CELL-RADIO[text-align='center'] {
430
- cell-radio {
431
- justify-content: center;
432
- }
433
- }
434
- .CELL-RADIO[text-align='right'] {
435
- cell-radio {
436
- justify-content: flex-end;
437
- }
438
- }
439
-
440
-
441
-
442
-
443
-
444
- cell-renderer { /* Custom element host layout */
445
- display: block;
446
- span.wrapper {
447
- display: block;
448
- width: 100%;
449
- overflow: hidden;
450
- text-overflow: ellipsis;
451
- white-space: nowrap; /* 줄바꿈 방지 */
452
- }
453
- }
454
-
455
- .CELL-RENDERER { /* Parent cell hook */
456
- text-align: left;
457
- }
458
- .CELL-RENDERER[text-align="center"] {
459
- text-align: center;
460
- }
461
- .CELL-RENDERER[text-align="right"] {
462
- text-align: right;
463
- }
464
- cell-row-indicator {
465
- --row-indicator-prefix-size: 0.40rem;
466
- --row-indicator-suffix-size: 0.55rem;
467
- --row-indicator-sub-size: 0.40rem;
468
- --row-indicator-sub-opacity: 0.2;
469
- --row-indicator-status-size: 0.55rem;
470
-
471
- display: block;
472
- position: absolute; /* 💡 셀 전체를 강제로 꽉 채움 */
473
- top: 0;
474
- left: 0;
475
- right: 0;
476
- bottom: 0;
477
- user-select: none;
478
-
479
- .ng-row-main {
480
- display: flex;
481
- align-items: center;
482
- justify-content: center;
483
- width: 100%;
484
- height: 100%;
485
- text-align: center;
486
- overflow: hidden;
487
- font-size: 10px;
488
- }
489
-
490
- .ng-row-prefix {
491
- font-weight: normal;
492
- font-size: var(--row-indicator-prefix-size);
493
- }
494
-
495
- .ng-row-suffix {
496
- font-size: var(--row-indicator-suffix-size);
497
- }
498
-
499
- .ng-row-sub {
500
- position: absolute;
501
- right: 2px;
502
- bottom: 1px;
503
- font-size: var(--row-indicator-sub-size);
504
- line-height: 1;
505
- opacity: var(--row-indicator-sub-opacity);
506
- pointer-events: none;
507
- }
508
-
509
- .row-status {
510
- display: inline-block;
511
- position: absolute;
512
- right: 0;
513
- top: 1px;
514
- width: 4px;
515
- height: 4px;
516
- border-radius: 50%;
517
- }
518
- }
519
-
520
-
521
- cell-row-indicator.is-insert .row-status {
522
- background-color: #333;
523
- }
524
-
525
- cell-row-indicator.is-update .row-status {
526
- background-color: darkgoldenrod;
527
- }
528
-
529
- cell-row-indicator.is-delete .row-status {
530
- background-color: red;
531
- }
532
- :host {
533
- --cell-selection-bg: rgba(37, 99, 235, 0.08);
534
- --cell-selection-border-color: #2563eb;
535
- }
536
-
537
- tbody {
538
-
539
- tr.selected {
540
- cell-row-indicator {
541
- border-left: 2px solid darkgoldenrod;
542
- }
543
-
544
- cell-row-indicator {
545
- border-left: 2px solid darkgoldenrod;
546
- }
547
- }
548
-
549
- .selected {
550
- background-color: var(--cell-selection-bg);
551
- }
552
-
553
- .selected-start {
554
- background-color: transparent;
555
- }
556
-
557
- .selected-top { border-top: 2px solid var(--cell-selection-border-color); }
558
- .selected-bottom { border-bottom: 2px solid var(--cell-selection-border-color); }
559
- .selected-left { border-left: 2px solid var(--cell-selection-border-color); }
560
- .selected-right { border-right: 2px solid var(--cell-selection-border-color); }
561
- }
562
-
563
- nine-table-col-expand {
564
- position: absolute;
565
- right: 2px;
566
- top: 2px;
567
- width: 12px;
568
- height: 12px;
569
- background-repeat: no-repeat;
570
- background-position: center;
571
- background-size: contain;
572
- z-index: 2;
573
- pointer-events: auto;
574
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="%234b5563" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M6 8a.5.5 0 0 0 .5.5h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708.708L12.293 7.5H6.5A.5.5 0 0 0 6 8m-2.5 7a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5"/></svg>');
575
- }
576
-
577
- nine-table-col-expand.expand {
578
- right: 2px;
579
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="%234b5563" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5M10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5"/></svg>');
580
- }
581
-
582
- nine-table-col-expand.collapsed {
583
- left: 50%;
584
- right: auto;
585
- transform: translate(-50%, 0);
586
- }
587
-
588
-
589
- tr.col-indicator-rowgroup {
590
- th,td {
591
- padding: 0;
592
- }
593
- }
594
-
595
- .col-indicator-rowgroup.expand {
596
- height: 20px;
597
- }
598
- .col-indicator-rowgroup.collapse {
599
- height: 2px;
600
- }
601
- .col-indicator-rowgroup.expand th {
602
- background-color: #eee;
603
- border-right-color: #ccc;
604
- border-top: 2px solid #666;
605
- }
606
- .col-indicator-rowgroup.collapse th {
607
- background-color: #666;
608
- border: none;
609
- }
610
- .col-indicator-rowgroup.collapse div {
611
- display: unset;
612
- }
613
- .col-indicator-rowgroup.collapse div {
614
- display: none;
615
- }
616
- .ng-col-mover-indi {
617
- position: absolute;
618
- width: 2px;
619
- background-color: #2563eb;
620
- display: none;
621
- pointer-events: none;
622
- z-index: 10020;
623
- }
624
-
625
- .ng-col-mover-indi::before {
626
- content: '';
627
- position: absolute;
628
- top: -6px;
629
- left: -4px;
630
- width: 0;
631
- height: 0;
632
- border-top: 6px solid #2563eb;
633
- border-left: 5px solid transparent;
634
- border-right: 5px solid transparent;
635
- }
636
-
637
- .ng-col-mover-indi::after {
638
- content: '';
639
- position: absolute;
640
- bottom: -6px;
641
- left: -4px;
642
- width: 0;
643
- height: 0;
644
- border-bottom: 6px solid #2563eb;
645
- border-left: 5px solid transparent;
646
- border-right: 5px solid transparent;
647
- }
648
-
649
- .ng-col-mover-grip {
650
- position: absolute;
651
- display: none;
652
- pointer-events: none;
653
- z-index: 10010;
654
- background-color: rgba(37, 99, 235, 0.12);
655
- border: none;
656
- box-shadow: 0 4px 12px rgba(37, 99, 235, 0.15);
657
- overflow: hidden;
658
- backdrop-filter: blur(1px);
659
- transition: background-color 0.15s ease, border-color 0.15s ease;
660
-
661
- .grip-header-content {
662
- position: absolute;
663
- top: 0;
664
- left: 0;
665
- width: 100%;
666
- z-index: 2;
667
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
668
- }
669
-
670
- th, td {
671
- user-select: none;
672
- pointer-events: none;
673
- }
674
- }
675
-
676
-
677
- .ng-col-mover-grip.invalid {
678
- background-color: rgba(239, 68, 68, 0.12);
679
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);
680
-
681
- .grip-header-content {
682
- border-bottom: 2px solid #ef4444;
683
- }
684
- }
685
-
686
-
687
- thead {
688
- .resizable-edge {
689
- cursor: col-resize;
690
- }
691
- }
692
-
693
- nine-table-col-resizer-panel {
694
- --col-resizer-color: #2563eb;
695
- --col-resizer-bg: rgba(37, 99, 235, 0.12);
696
- --col-resizer-badge-bg: #1e40af;
697
- --col-resizer-badge-color: #ffffff;
698
-
699
- --col-resizer-tooltip-left: 0px;
700
- --col-resizer-tooltip-width: 0px;
701
-
702
- display: none;
703
- position: absolute;
704
- top: 0;
705
- left: 0;
706
- width: 100%;
707
- height: 100%;
708
- pointer-events: none;
709
- z-index: 9999;
710
-
711
- .resizer-overlay {
712
- position: absolute;
713
- top: 0;
714
- left: var(--col-resizer-tooltip-left, 0px);
715
- width: var(--col-resizer-tooltip-width, 0px);
716
- height: 100%;
717
- background-color: var(--col-resizer-bg);
718
- border-left: 1px dashed var(--col-resizer-color);
719
- border-right: 2px solid var(--col-resizer-color);
720
- display: flex;
721
- align-items: flex-start;
722
- justify-content: center;
723
- padding-top: 8px;
724
- pointer-events: none;
725
- opacity: 1;
726
- transition: opacity 0.15s ease-out;
727
-
728
- .size-badge {
729
- padding: 2px 8px;
730
- font-size: 11px;
731
- font-weight: 700;
732
- color: var(--col-resizer-badge-color);
733
- background-color: var(--col-resizer-badge-bg);
734
- border-radius: 4px;
735
- line-height: 14px;
736
- white-space: nowrap;
737
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
738
- }
739
- }
740
-
741
- .resizer-overlay.fade-out {
742
- opacity: 0;
743
- }
744
- }
745
-
746
- nine-table-col-resizer-panel.active {
747
- display: block;
748
- }
749
-
750
-
751
- nine-table-filter-button {
752
- position: absolute;
753
- bottom: 2px;
754
- right: 2px;
755
- width: 12px;
756
- height: 12px;
757
- z-index: 2;
758
- cursor: pointer;
759
- background-repeat: no-repeat;
760
- background-position: center;
761
- background-size: contain;
762
- display: inline-block;
763
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16"><path fill="%239ca3af" d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2z"/></svg>');
764
- }
765
-
766
- nine-table-filter-button.filtered {
767
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16"><path fill="%232563eb" d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5z"/></svg>');
768
- }
769
-
770
-
771
- nine-table-filter-panel {
772
- z-index: 2;
773
- position: absolute;
774
- width: 250px;
775
- height: 250px;
776
- border: 1px solid #999;
777
- background-color: white;
778
- overflow: hidden;
779
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
780
- display: none;
781
- flex-direction: column;
782
- padding: 0;
783
- margin: 0;
784
- font-size: 12px;
785
- resize: both;
786
-
787
- nine-table-simple {
788
- width: 100%;
789
- flex: 1;
790
- border: none;
791
- }
792
-
793
- .search-box {
794
- width: 100%;
795
- height: 28px;
796
- box-sizing: border-box;
797
- padding: 0px 8px;
798
- border: none;
799
- border-bottom: 1px solid #e5e7eb;
800
- border-radius: 0px;
801
- outline: none;
802
- font-size: 12px;
803
- background: #fafafa;
804
- color: #333;
805
- }
806
- .search-box:focus {
807
- background: #ffffff;
808
- }
809
- .footer-section {
810
- display: flex;
811
- flex-direction: column;
812
- padding: 4px 6px;
813
- gap: 8px;
814
- border-top: 1px solid #e5e7eb;
815
- background: #f9fafb;
816
- flex-shrink: 0;
817
- }
818
- .footer-btns {
819
- display: flex;
820
- align-items: center;
821
- justify-content: space-between;
822
- gap: 6px;
823
- }
824
- .footer-btns label {
825
- display: flex;
826
- align-items: center;
827
- gap: 4px;
828
- cursor: pointer;
829
- user-select: none;
830
- }
831
- .btn-group {
832
- display: flex;
833
- gap: 4px;
834
- }
835
- button {
836
- padding: 4px 14px;
837
- border-radius: 4px;
838
- border: 1px solid #d1d5db;
839
- background: #ffffff;
840
- cursor: pointer;
841
- font-size: 11px;
842
- }
843
- button:hover {
844
- background: #f3f4f6;
845
- }
846
- button#btnOk {
847
- background: #2563eb;
848
- color: white;
849
- border: none;
850
- }
851
- }
852
- nine-table-filter-panel.active {
853
- display: flex;
854
- }
855
-
856
- nine-table-filter-panel.loading {
857
- nine-table-simple {
858
- visibility: hidden;
859
- }
860
- }
861
- nine-table-filter-panel.loading::after {
862
- content: "";
863
- position: absolute;
864
- inset: 0;
865
- background: rgba(255, 255, 255, 0.3);
866
- z-index: 10;
867
- display: flex;
868
- align-items: center;
869
- justify-content: center;
870
- }
871
- nine-table-filter-panel.loading::before {
872
- content: "";
873
- position: absolute;
874
- top: 50%;
875
- left: 50%;
876
- width: 24px;
877
- height: 24px;
878
- margin: -12px 0 0 -12px;
879
- border: 3px solid #e5e7eb;
880
- border-top-color: #2563eb;
881
- border-radius: 50%;
882
- animation: filter-loading-spin 0.6s linear infinite;
883
- z-index: 999999911;
884
- }
885
-
886
- @keyframes filter-loading-spin {
887
- to {
888
- transform: rotate(360deg);
889
- }
890
- }
891
- :host {
892
- width: 100%;
893
- height: 100%;
894
- }
895
-
896
-
897
- :host {
898
- display: flex;
899
- flex-direction: column;
900
- position: relative;
901
- overflow: hidden;
902
-
903
- background: #fff;
904
- }
905
-
906
- :host([theme="simple"]) {
907
- /* 1. 불필요한 패널 및 컴포넌트 숨기기 */
908
- .ng-part-header, .ng-part-footer,
909
- nine-table-toolbar,
910
- nine-table-sheets-footer,
911
- nine-table-vscrollbar,
912
- nine-table-hscrollbar,
913
- nine-table-sheet .ng-scroll-edge {
914
- display: none;
915
- }
916
-
917
- .col-indicator-rowgroup {
918
- display: none;
919
- }
920
-
921
- tr {
922
- height: 32px;
923
- }
924
-
925
- /* 2. 💡 [핵심] 스크롤바용 우측 16px 빈 공간을 제거하고 1열(1fr)로 꽉 채우기 */
926
- nine-table-sheet {
927
- border: none;
928
- overflow: hidden;
929
- grid-template-columns: 1fr;
930
- grid-template-rows: 1fr;
931
- }
932
-
933
- nine-table-sheet tr th,
934
- nine-table-sheet tr td {
935
- border: none;
936
- padding: 0 8px;
937
- }
938
-
939
- /**
940
- nine-table-sheet tr td {
941
- text-align: left;
942
- } */
943
-
944
- /* 4. 브라우저 기본 네이티브 스크롤바를 콘텐츠 위에 자연스럽게 오버레이(Overlay) */
945
- nine-table-sheet .ng-sheet-body {
946
- overflow-y: auto;
947
- overflow-x: hidden;
948
- scrollbar-width: thin;
949
- scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
950
- }
951
-
952
- nine-table-sheet .ng-sheet-body::-webkit-scrollbar {
953
- display: block;
954
- width: 6px;
955
- height: 6px;
956
- }
957
-
958
- nine-table-sheet .ng-sheet-body::-webkit-scrollbar-track {
959
- background: transparent;
960
- }
961
-
962
- nine-table-sheet .ng-sheet-body::-webkit-scrollbar-thumb {
963
- background: rgba(0, 0, 0, 0.15);
964
- border-radius: 3px;
965
- }
966
-
967
- nine-table-sheet .ng-sheet-body::-webkit-scrollbar-thumb:hover {
968
- background: rgba(0, 0, 0, 0.3);
969
- }
970
- }
971
-
972
- /* 🎯 Toolbar 숨김 제어 */
973
- :host([theme="simple"]) nine-table-toolbar,
974
- :host([show-header="false"]) nine-table-toolbar {
975
- display: none;
976
- }
977
-
978
- /* 🎯 Footer(StatusBar) 숨김 제어 (show-statusbar="false") */
979
- :host([theme="simple"]) nine-table-sheets-footer,
980
- :host([show-statusbar="false"]) nine-table-sheets-footer {
981
- display: none;
982
- }
983
-
984
- :host([theme="simple"]) {
985
- col[data-col="0"], th[data-col="0"], td[data-col="0"] {
986
- display: none;
987
- }
988
- .ng-container-right {
989
- display: none;
990
- }
991
- tr {
992
- height: 26px;
993
- }
994
- }
995
-
996
- :host(.loading) {
997
- .ng-loading-bar {
998
- display: block;
999
- }
1000
- }
1001
-
1002
-
1003
- .ng-loading-bar {
1004
- position: absolute;
1005
- top: 0;
1006
- left: 0;
1007
- right: 0;
1008
- height: 2px;
1009
- background: rgba(255, 255, 255, 0.08); /* 은은한 화이트 트랙 배경 */
1010
- z-index: 10000;
1011
- display: none;
1012
- overflow: hidden;
1013
- }
1014
-
1015
- /* 🎯 아주 좁고 쨍한 빛 조각 형태로 압축 */
1016
- .ng-loading-bar::after {
1017
- content: '';
1018
- position: absolute;
1019
- top: 0;
1020
- left: 0;
1021
- bottom: 0;
1022
- width: 12%; /* 바의 전체 길이를 12%로 대폭 축소 */
1023
- background: linear-gradient(
1024
- 90deg,
1025
- transparent 0%,
1026
- rgba(255, 255, 255, 0.4) 20%,
1027
- #ffffff 50%,
1028
- rgba(255, 255, 255, 0.4) 80%,
1029
- transparent 100%
1030
- );
1031
- box-shadow: 0 0 10px rgba(255, 255, 255, 0.9);
1032
- animation: ng-loading-slide 0.9s ease-in-out infinite;
1033
- }
1034
-
1035
- @keyframes ng-loading-slide {
1036
- 0% {
1037
- transform: translateX(-150%);
1038
- }
1039
- 100% {
1040
- transform: translateX(850%); /* 폭이 좁아진 만큼 이동 거리 확장 */
1041
- }
1042
- }
1043
-
1044
- input[type="checkbox"] {
1045
- appearance: none;
1046
- -webkit-appearance: none;
1047
- width: 14px;
1048
- height: 14px;
1049
- background-color: #ffffff; /* 미체크 시 배경 */
1050
- border: 1px solid #9ca3af;
1051
- border-radius: 3px;
1052
- margin: 0;
1053
- display: inline-flex;
1054
- align-items: center;
1055
- justify-content: center;
1056
- transition: background-color 0.15s ease, border-color 0.15s ease;
1057
- }
1058
- input[type="checkbox"]:checked {
1059
- background-color: #2563eb; /* 체크 시 파란색 배경 */
1060
- border-color: #2563eb;
1061
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>');
1062
- background-repeat: no-repeat;
1063
- background-position: center;
1064
- }
1065
-
1066
- input[type="radio"] {
1067
- appearance: none;
1068
- -webkit-appearance: none;
1069
- width: 14px;
1070
- height: 14px;
1071
- background-color: #ffffff;
1072
- border: 1px solid #9ca3af;
1073
- border-radius: 50%;
1074
- margin: 0;
1075
- display: inline-flex;
1076
- align-items: center;
1077
- justify-content: center;
1078
- }
1079
-
1080
- input[type="radio"]:checked {
1081
- background-image: url('data:image/svg+xml;utf8,<svg height="14" width="14" xmlns="http://www.w3.org/2000/svg"><circle r="3.5" cx="50%" cy="50%" fill="%232563eb" /></svg>');
1082
- background-repeat: no-repeat;
1083
- background-position: center;
1084
- }
1085
- * {
1086
- outline: none;
1087
- box-sizing: border-box;
1088
- cursor: default;
1089
- font-size: 12px;
1090
- }
1091
-
1092
- nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }
1093
- nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }
1094
- nine-table-analysis { display: none; }
1095
- nine-table-footer { display: none; }
1096
-
1097
- nine-table-sheets {
1098
- flex: 1;
1099
- display: flex;
1100
- flex-direction: column;
1101
- overflow: hidden;
1102
- position: relative;
1103
- background: #fff;
1104
-
1105
- nine-table-sheets-body {
1106
- flex: 1;
1107
- overflow: hidden;
1108
- position: relative;
1109
- display: flex;
1110
- flex-direction: row;
1111
- }
1112
- }
1113
-
1114
- cell-input, cell-input-number, cell-button, cell-input-color, cell-input-date, cell-combo {
1115
- position: absolute;
1116
- inset: 0;
1117
- padding: 2px 4px;
1118
- display: flex;
1119
-
1120
- input, button {
1121
- height: 100%;
1122
- }
1123
- }
1124
-
1125
-
1126
- .empty-value {
1127
- color: #999;
1128
- }
1129
-
1130
-
1131
- nine-table-menu-panel {
1132
- .menu-wrapper {
1133
- background: #ffffff;
1134
- border: 1px solid #d1d5db;
1135
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1136
- border-radius: 4px;
1137
- padding: 4px 0;
1138
- min-width: 150px;
1139
- }
1140
-
1141
- ul {
1142
- list-style: none;
1143
- margin: 0;
1144
- padding: 0;
1145
- }
1146
-
1147
- li {
1148
- position: relative;
1149
- padding: 6px 16px;
1150
- color: #374151;
1151
- display: flex;
1152
- align-items: center;
1153
- justify-content: space-between;
1154
- }
1155
-
1156
- li:hover {
1157
- background-color: #f3f4f6;
1158
- color: #111827;
1159
- }
1160
-
1161
- li.on::before {
1162
- content: '✓';
1163
- position: absolute;
1164
- left: 4px;
1165
- font-weight: bold;
1166
- }
1167
-
1168
- li.disabled {
1169
- opacity: 0.5;
1170
- cursor: not-allowed;
1171
- background: transparent !important;
1172
- }
1173
-
1174
- li.ng-menu-separator {
1175
- height: 1px;
1176
- background: #e5e7eb;
1177
- margin: 4px 0;
1178
- padding: 0;
1179
- }
1180
-
1181
- li.submenu::after {
1182
- content: '▶';
1183
- font-size: 9px;
1184
- margin-left: 8px;
1185
- color: #9ca3af;
1186
- }
1187
-
1188
- .ng-menu-sublist {
1189
- display: none;
1190
- position: absolute;
1191
- top: -4px;
1192
- left: 100%;
1193
- background: #ffffff;
1194
- border: 1px solid #d1d5db;
1195
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1196
- border-radius: 4px;
1197
- padding: 4px 0;
1198
- min-width: 140px;
1199
- }
1200
-
1201
- li.submenu:hover > .ng-menu-sublist {
1202
- display: block;
1203
- }
1204
- }
1205
- :host {
1206
- --hscrollbar-height: 16px;
1207
- --vscrollbar-width: 16px;
1208
- }
1209
-
1210
- .scroll-edge {
1211
- display: none; /* 평소에는 기본 숨김 */
1212
- grid-row: 2;
1213
- grid-column: 2;
1214
- width: var(--vscrollbar-width);
1215
- height: var(--hscrollbar-height);
1216
- background: #f3f4f6;
1217
- border-top: 1px solid #e5e7eb;
1218
- z-index: 10;
1219
- }
1220
-
1221
- nine-table-hscrollbar {
1222
-
1223
- --hscrollbar-background: #f9fafb;
1224
- --hscrollbar-border-top: 1px solid #e5e7eb;
1225
- --hscrollbar-button-background: #f3f4f6;
1226
- --hscrollbar-track-background: #f3f4f6;
1227
- --hscrollbar-thumb-background: #9ca3af;
1228
- --hscrollbar-thumb-hover-background: #6b7280;
1229
-
1230
- display: none;
1231
- grid-row: 2;
1232
- grid-column: 1;
1233
- flex-direction: row;
1234
- height: var(--hscrollbar-height);
1235
- min-height: var(--hscrollbar-height);
1236
- background: var(--hscrollbar-background);
1237
- border-top: var(--hscrollbar-border-top);
1238
- z-index: 10;
1239
- overflow: hidden;
1240
- width: 100%;
1241
- user-select: none;
1242
- position: relative;
1243
-
1244
- button {
1245
- width: var(--hscrollbar-height);
1246
- height: 100%;
1247
- background: var(--hscrollbar-button-background);
1248
- border: none;
1249
- display: flex;
1250
- align-items: center;
1251
- justify-content: center;
1252
- padding: 0;
1253
- flex-shrink: 0;
1254
- z-index: 2;
1255
- }
1256
- button:disabled {
1257
- opacity: 0.4;
1258
- }
1259
-
1260
- .scroll-icon {
1261
- width: 100%;
1262
- height: 100%;
1263
- background-repeat: no-repeat;
1264
- background-position: center;
1265
- }
1266
-
1267
- .scroll-left .scroll-icon {
1268
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="none" stroke="%236b7280" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M10 12L6 8l4-4"/></svg>');
1269
- }
1270
-
1271
- .scroll-right .scroll-icon {
1272
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="none" stroke="%236b7280" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 4l4 4-4 4"/></svg>');
1273
- }
1274
-
1275
- .scroll-track {
1276
- flex: 1;
1277
- height: 100%;
1278
- position: relative;
1279
- background: var(--hscrollbar-track-background);
1280
- overflow: hidden;
1281
- }
1282
- .scroll-thumb {
1283
- position: absolute;
1284
- top: 2px;
1285
- bottom: 2px;
1286
- left: 0px;
1287
- background: var(--hscrollbar-thumb-background);
1288
- border-radius: 4px;
1289
- z-index: 1;
1290
- }
1291
- .scroll-thumb:hover {
1292
- background: var(--hscrollbar-thumb-hover-background);
1293
- }
1294
- }
1295
-
1296
- nine-table-vscrollbar {
1297
-
1298
- --vscrollbar-background: #f9fafb;
1299
- --vscrollbar-border-top: 2px solid #333;
1300
- --vscrollbar-button-background: #f3f4f6;
1301
- --vscrollbar-track-background: #f3f4f6;
1302
- --vscrollbar-thumb-background: #9ca3af;
1303
- --vscrollbar-thumb-hover-background: #6b7280;
1304
-
1305
- display: none;
1306
- border-top: var(--vscrollbar-border-top);
1307
- grid-row: 1;
1308
- grid-column: 2;
1309
- width: var(--vscrollbar-width);
1310
- height: 100%;
1311
- z-index: 50;
1312
- flex-direction: column;
1313
- background: var(--vscrollbar-background);
1314
- user-select: none;
1315
- position: relative;
1316
-
1317
- button {
1318
- height: var(--vscrollbar-width);
1319
- width: 100%;
1320
- background: var(--vscrollbar-button-background);
1321
- border: none;
1322
- display: flex;
1323
- align-items: center;
1324
- justify-content: center;
1325
- padding: 0;
1326
- flex-shrink: 0;
1327
- z-index: 2;
1328
- }
1329
- button:disabled {
1330
- opacity: 0.4;
1331
- }
1332
-
1333
- .scroll-icon {
1334
- width: 100%;
1335
- height: 100%;
1336
- background-repeat: no-repeat;
1337
- background-position: center;
1338
- }
1339
-
1340
- .scroll-top .scroll-icon {
1341
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="none" stroke="%236b7280" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M4 10l4-4 4 4"/></svg>');
1342
- }
1343
-
1344
- .scroll-bottom .scroll-icon {
1345
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="none" stroke="%236b7280" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M4 6l4 4 4-4"/></svg>');
1346
- }
1347
-
1348
- .scroll-track {
1349
- flex: 1;
1350
- width: 100%;
1351
- position: relative;
1352
- background: var(--vscrollbar-track-background);
1353
- overflow: hidden;
1354
- }
1355
- .scroll-thumb {
1356
- position: absolute;
1357
- left: 2px;
1358
- right: 2px;
1359
- top: 0px;
1360
- height: 30px;
1361
- background: var(--vscrollbar-thumb-background);
1362
- border-radius: 4px;
1363
- z-index: 1;
1364
- }
1365
- .scroll-thumb:hover {
1366
- background: var(--vscrollbar-thumb-hover-background);
1367
- }
1368
- }
1369
-
1370
-
1371
- /* --- 세로 스크롤바가 활성화되었을 때만 CSS로 2열 너비 확장 및 요소 표시 --- */
1372
- nine-table-sheet.vscroll-visible {
1373
- grid-template-columns: 1fr var(--vscrollbar-width);
1374
-
1375
- nine-table-vscrollbar {
1376
- display: flex;
1377
- }
1378
- }
1379
-
1380
- /* --- 가로 스크롤바가 활성화되었을 때만 CSS로 행 높이 확장 및 요소 표시 --- */
1381
- nine-table-sheet.hscroll-visible {
1382
- grid-template-rows: 1fr var(--hscrollbar-height);
1383
-
1384
- nine-table-hscrollbar, .scroll-edge {
1385
- display: flex;
1386
- }
1387
- }
1388
-
1389
- @media (hover: none) and (pointer: coarse) {
1390
-
1391
- nine-table-sheet.vscroll-visible {
1392
- grid-template-columns: 1fr;
1393
- nine-table-vscrollbar {
1394
- display: none;
1395
- }
1396
- }
1397
- nine-table-sheet.hscroll-visible {
1398
- grid-template-rows: 1fr;
1399
-
1400
- nine-table-hscrollbar, .scroll-edge {
1401
- display: none;
1402
- }
1403
- }
1404
-
1405
- /* Hide custom scrollbar elements on touch-based mobile devices */
1406
- nine-table-vscrollbar,
1407
- nine-table-hscrollbar,
1408
- .scroll-edge {
1409
- display: none;
1410
- }
1411
-
1412
- /* Optional: Hide native scrollbars visually while maintaining smooth touch/momentum scrolling */
1413
- .ng-sheet-body {
1414
- scrollbar-width: none; /* Firefox */
1415
- -ms-overflow-style: none; /* IE/Edge */
1416
- }
1417
- .ng-sheet-body::-webkit-scrollbar {
1418
- display: none; /* Chrome/Safari/Opera */
1419
- }
1420
- }
1421
-
1422
-
1423
- nine-table-sheet {
1424
- --sheet-bg: #ffffff;
1425
- --sheet-nodata-color: #9ca3af;
1426
- --sheet-fixed-brightness: 99%;
1427
-
1428
- display: none;
1429
- grid-template-columns: 1fr 0;
1430
- grid-template-rows: 1fr 0;
1431
- width: 100%;
1432
- height: 100%;
1433
- position: relative;
1434
- background: var(--sheet-bg);
1435
- overflow: hidden;
1436
-
1437
- .ng-sheet-body {
1438
- display: block;
1439
- flex: 1 1 auto;
1440
- width: 100%;
1441
- height: 100%;
1442
- overflow-y: auto;
1443
- overflow-x: hidden;
1444
- position: relative;
1445
- scrollbar-width: none;
1446
- &::-webkit-scrollbar { display: none; height: 0px; width: 0px; }
1447
- }
1448
-
1449
- .ng-sheet-body-content {
1450
- display: flex;
1451
- flex-direction: row;
1452
- width: 100%;
1453
- height: 100%;
1454
- left: 0;
1455
- top: 0;
1456
- position: sticky;
1457
- }
1458
-
1459
- .ng-container-left, .ng-container-body, .ng-container-right {
1460
- flex-direction: column;
1461
- position: relative;
1462
- background: var(--sheet-bg);
1463
- }
1464
- .ng-container-body {
1465
- display: flex;
1466
- }
1467
- .ng-container-left, .ng-container-right {
1468
- border: none;
1469
- flex-shrink: 0;
1470
- overflow: hidden;
1471
- filter: brightness(var(--sheet-fixed-brightness));
1472
- }
1473
- .ng-container-body {
1474
- flex: 1;
1475
- overflow-x: auto;
1476
- overflow-y: hidden;
1477
- scrollbar-width: none;
1478
- &::-webkit-scrollbar { display: none; height: 0px; width: 0px; }
1479
- }
1480
-
1481
- .nodata-overlay {
1482
- display: none;
1483
- position: absolute;
1484
- top: 0;
1485
- left: 0;
1486
- right: 0;
1487
- bottom: 0;
1488
- background: var(--sheet-bg);
1489
- z-index: 20;
1490
- align-items: center;
1491
- justify-content: center;
1492
- color: var(--sheet-nodata-color);
1493
- }
1494
- }
1495
-
1496
- nine-table-sheet.active {
1497
- display: grid;
1498
- }
1499
-
1500
-
1501
-
1502
-
1503
- nine-table-sheets-footer {
1504
- display: flex;
1505
- height: 26px;
1506
- --background: #f3f4f6;
1507
- border-top: 1px solid #e5e7eb;
1508
- align-items: center;
1509
- justify-content: space-between;
1510
- padding: 0 8px;
1511
- flex-shrink: 0;
1512
-
1513
- .sheets-counter {
1514
- color: #6b7280;
1515
- padding-left: 12px;
1516
- flex-shrink: 0;
1517
-
1518
- span#row-count {
1519
- font-weight: 700;
1520
- }
1521
- }
1522
-
1523
-
1524
-
1525
- .nine-tab-bar {
1526
- display: flex;
1527
- align-items: flex-start;
1528
- gap: 2px;
1529
- overflow-x: auto;
1530
- flex: 1;
1531
- height: 100%;
1532
-
1533
-
1534
-
1535
- nt-sheets-tab-item {
1536
- padding: 4px 12px;
1537
- color: #4b5563;
1538
- background: #f9fafb;
1539
- border: 1px solid #e5e7eb;
1540
- border-top: none;
1541
- border-radius: 0 0 3px 3px;
1542
- user-select: none;
1543
- height: 100%;
1544
- display: flex;
1545
- align-items: center;
1546
- }
1547
-
1548
- nt-sheets-tab-item.active {
1549
- background: white;
1550
- color: #111827;
1551
- font-weight: 600;
1552
- border-bottom: 2px solid green;
1553
- }
1554
- }
1555
- }
1556
-
1557
-
1558
-
1559
- .asc::after,
1560
- .desc::after {
1561
- z-index: 1;
1562
- content: "";
1563
- display: inline-block;
1564
- width: 10px;
1565
- height: 10px;
1566
- position: absolute;
1567
- left: 50%;
1568
- top: -2px;
1569
- transform: translateX(-50%);
1570
- background-repeat: no-repeat;
1571
- background-position: center;
1572
- background-size: contain;
1573
- }
1574
-
1575
- .asc::after {
1576
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="%232563eb" d="M8 3L3 11h10L8 3z"/></svg>');
1577
- }
1578
-
1579
- .desc::after {
1580
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="%23dc2626" d="M8 13L3 5h10l-5 8z"/></svg>');
1581
- }
1582
-
1583
-
1584
- tbody.body td *:first-child, tbody.body th *:first-child {
1585
- transform: translate(0, 0);
1586
- transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1.35), opacity 0.4s ease-out;
1587
- }
1588
-
1589
- tbody.body .sorting-anim-asc *:first-child {
1590
- transform: translate(0px, 20px);
1591
- opacity: 0.2;
1592
- transition: none;
1593
- }
1594
-
1595
- tbody.body .sorting-anim-desc *:first-child {
1596
- transform: translate(0px, -30px);
1597
- opacity: 0.2;
1598
- transition: none;
1599
- }
1600
-
1601
- tbody.body .sorting-anim-none *:first-child {
1602
- transform: translate(0px, 0px);
1603
- opacity: 0.2;
1604
- transition: none;
1605
- }
1606
- table {
1607
- --table-th-bg: #f9fafb;
1608
- --table-th-color: #111827;
1609
- --table-td-bg: #fff;
1610
- --table-td-color: #111827;
1611
- --table-disabled-bg: #f0f0f0;
1612
- --th-border-left: none;
1613
- --th-border-top: none;
1614
- --th-border-right: 1px solid #e5e7eb;
1615
- --th-border-bottom: 1px solid #e5e7eb;
1616
- --td-border-left: none;
1617
- --tD-border-top: none;
1618
- --td-border-right: 1px solid #e5e7eb;
1619
- --td-border-bottom: 1px solid #e5e7eb;
1620
-
1621
-
1622
- border-collapse: separate;
1623
- border-spacing: 0;
1624
- width: auto;
1625
- min-width: 100%;
1626
- table-layout: fixed;
1627
- }
1628
-
1629
- nine-table-sheet[auto-fit-col="true"] table {
1630
- width: 100%;
1631
- min-width: 100%;
1632
- }
1633
-
1634
- col {
1635
- width: attr(width px);
1636
- }
1637
-
1638
- thead {
1639
- display: table-header-group;
1640
- position: sticky;
1641
- top: 0;
1642
- z-index: 10;
1643
- }
1644
-
1645
- tfoot {
1646
- display: table-footer-group;
1647
- position: sticky;
1648
- bottom: 0;
1649
- z-index: 10;
1650
- }
1651
-
1652
- tbody {
1653
- position: relative;
1654
- }
1655
-
1656
- tbody.foot {
1657
- height: 100vh;
1658
- }
1659
-
1660
- thead tr {
1661
- height: 48px;
1662
- }
1663
- tbody tr {
1664
- height: 32px;
1665
- }
1666
- tfoot tr {
1667
- height: 32px;
1668
- }
1669
-
1670
- tr.hover th, tr.hover td {
1671
- background-color: rgba(37, 99, 235, 0.06);
1672
- }
1673
-
1674
- th, td {
1675
- overflow: hidden;
1676
- white-space: nowrap;
1677
- text-overflow: ellipsis;
1678
- padding: 0px 4px;
1679
- border-top: 1px solid transparent;
1680
- border-left: 1px solid transparent;
1681
- color: var(--table-td-color);
1682
- position: relative;
1683
- }
1684
-
1685
- th {
1686
- border-left: var(--th-border-left);
1687
- border-top: var(--th-border-top);
1688
- border-right: var(--th-border-right);
1689
- border-bottom: var(--th-border-bottom);
1690
- background: var(--table-th-bg);
1691
- color: var(--table-th-color);
1692
- font-weight: 600;
1693
- user-select: none;
1694
- }
1695
-
1696
- td {
1697
- border-left: var(--td-border-left);
1698
- border-top: var(--td-border-top);
1699
- border-right: var(--td-border-right);
1700
- border-bottom: var(--td-border-bottom);
1701
- background: var(--table-td-bg);
1702
- color: var(--table-td-color);
1703
- }
1704
-
1705
- td.invalid::after {
1706
- content: "";
1707
- position: absolute;
1708
- top: 0;
1709
- right: 0;
1710
- width: 0;
1711
- height: 0;
1712
- border-top: 2px solid red;
1713
- border-right: 2px solid red;
1714
- border-bottom: 2px solid transparent;
1715
- border-left: 2px solid transparent;
1716
- z-index: 1;
1717
- pointer-events: none;
1718
- }
1719
-
1720
- td[disabled="true"] {
1721
- input, button {
1722
- background: var(--table-disabled-bg);
1723
- opacity: 0.5;
1724
- pointer-events: none;
1725
- }
1726
- }
1727
-
1728
- td[text-align="left"] {
1729
- input {
1730
- text-align: left;
1731
- }
1732
- }
1733
- td[text-align="right"] {
1734
- input {
1735
- text-align: right;
1736
- }
1737
- }
1738
- td[text-align="center"] {
1739
- input {
1740
- text-align: center;
1741
- }
1742
- }
1743
-
1744
- nine-table-toolbar {
1745
- --display: flex;
1746
- display: none;
1747
- align-items: center;
1748
- justify-content: space-between;
1749
- height: 40px;
1750
- padding: 0 12px;
1751
- --border-bottom: 1px solid #e5e7eb;
1752
- background: #ffffff;
1753
- user-select: none;
1754
- flex-shrink: 0;
1755
-
1756
-
1757
- .ng-toolbar-left {
1758
- display: flex;
1759
- align-items: center;
1760
- gap: 8px;
1761
- }
1762
- .ng-toolbar-title {
1763
- font-size: 13px;
1764
- font-weight: 600;
1765
- color: #111827;
1766
- }
1767
- .ng-toolbar-menu-btn {
1768
- display: inline-flex;
1769
- align-items: center;
1770
- justify-content: center;
1771
- background: none;
1772
- border: none;
1773
- padding: 4px;
1774
- border-radius: 4px;
1775
- }
1776
- .ng-toolbar-menu-btn:hover {
1777
- background-color: #f3f4f6;
1778
- }
1779
- .ng-toolbar-custom {
1780
- display: flex;
1781
- align-items: center;
1782
- gap: 6px;
1783
- }
1784
- }
1785
-
1786
- :host([theme="simple"]) nine-table-toolbar,
1787
- :host([show-header="false"]) nine-table-toolbar {
1788
- display: none;
1789
-
1790
- .ng-toolbar-menu-btn {
1791
- display: none;
1792
- }
1793
- }
1794
-
1795
-