@ninebone/table 0.1.41 → 0.1.43

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,540 +0,0 @@
1
- nine-table-sheet {
2
- display: none;
3
- grid-template-columns: 1fr 0px;
4
- grid-template-rows: 1fr 0px;
5
- width: 100%;
6
- height: 100%;
7
- position: relative;
8
- box-sizing: border-box;
9
- background: #ffffff;
10
- overflow: hidden;
11
-
12
- .ng-sheet-body {
13
- display: block;
14
- flex: 1 1 auto;
15
- width: 100%;
16
- height: 100%;
17
- overflow-y: auto;
18
- overflow-x: hidden;
19
- position: relative;
20
- scrollbar-width: none;
21
- &::-webkit-scrollbar { display: none; height: 0px; width: 0px; }
22
- }
23
-
24
- .ng-sheet-body-content {
25
- display: flex;
26
- flex-direction: row;
27
- width: 100%;
28
- height: 100%;
29
- left: 0;
30
- top: 0;
31
- position: sticky;
32
- }
33
-
34
-
35
-
36
- .ng-container-left, .ng-container-body, .ng-container-right {
37
- flex-direction: column;
38
- position: relative;
39
- background: #ffffff;
40
- }
41
- .ng-container-body {
42
- display: flex;
43
- }
44
-
45
- .ng-container-left, .ng-container-right {
46
- border: none;
47
- }
48
-
49
- .ng-scroll-edge {
50
- display: none; /* 평소에는 기본 숨김 */
51
- }
52
- }
53
-
54
- nine-table-sheet.active {
55
- display: grid;
56
- }
57
-
58
- /* --- 세로 스크롤바가 활성화되었을 때만 CSS로 2열 너비 확장 및 요소 표시 --- */
59
- nine-table-sheet.vscroll-visible {
60
- grid-template-columns: 1fr var(--scrollbar-size);
61
-
62
- nine-table-vscrollbar {
63
- display: flex;
64
- }
65
- }
66
-
67
- /* --- 가로 스크롤바가 활성화되었을 때만 CSS로 행 높이 확장 및 요소 표시 --- */
68
- nine-table-sheet.hscroll-visible {
69
- grid-template-rows: 1fr var(--scrollbar-size);
70
-
71
- nine-table-hscrollbar, ng-scroll-edge {
72
- display: flex;
73
- }
74
- }
75
-
76
-
77
-
78
-
79
- nine-table-sheet .ng-container-left {
80
- --border-right: 1px solid #e5e7eb;
81
- flex-shrink: 0;
82
- overflow: hidden !important;
83
- }
84
-
85
- nine-table-sheet .ng-container-body {
86
- flex: 1;
87
- overflow-x: auto;
88
- overflow-y: hidden;
89
- scrollbar-width: none;
90
- &::-webkit-scrollbar { display: none; height: 0px; width: 0px; }
91
- }
92
-
93
- nine-table-sheet .ng-container-right {
94
- flex-shrink: 0;
95
- overflow: hidden;
96
- }
97
- nine-table-sheet .ng-container-left, nine-table-sheet .ng-container-right {
98
- filter: brightness(99%);
99
- }
100
-
101
-
102
-
103
- /* --- 세로 스크롤바 (Grid Row 1, Col 2) --- */
104
- nine-table-vscrollbar {
105
- grid-row: 1;
106
- grid-column: 2;
107
- width: var(--scrollbar-size);
108
- height: 100%;
109
- z-index: 50;
110
- }
111
-
112
- /* --- 가로 스크롤바 (Grid Row 2, Col 1 직속 안착) --- */
113
- nine-table-hscrollbar {
114
- grid-row: 2;
115
- grid-column: 1;
116
- flex-direction: row;
117
- height: var(--scrollbar-size);
118
- min-height: var(--scrollbar-size);
119
- background: #f9fafb;
120
- border-top: 1px solid #e5e7eb;
121
- z-index: 10;
122
- overflow: hidden;
123
- width: 100%;
124
- }
125
-
126
- /* --- 우하단 엣지 (Grid Row 2, Col 2) --- */
127
- nine-table-sheet .ng-scroll-edge {
128
- grid-row: 2;
129
- grid-column: 2;
130
- width: var(--scrollbar-size);
131
- height: var(--scrollbar-size);
132
- background: #f3f4f6;
133
- border-top: 1px solid #e5e7eb;
134
- z-index: 10;
135
- }
136
-
137
- nine-table-sheet col {
138
- width: attr(width px); /* 브라우저가 지원하는 경우 또는 아래 처럼 고정 셀렉터 활용 */
139
- }
140
-
141
- nine-table-sheet table {
142
- border-collapse: separate;
143
- border-spacing: 0;
144
- width: auto;
145
- min-width: 100%;
146
- table-layout: fixed;
147
- box-sizing: border-box;
148
- }
149
- nine-table-sheet[auto-fit-col="true"] table {
150
- width: 100%;
151
- min-width: 100%;
152
- }
153
-
154
- nine-table-sheet th, nine-table-sheet td {
155
- box-sizing: border-box;
156
- overflow: hidden;
157
- white-space: nowrap;
158
- text-overflow: ellipsis;
159
- padding: 0px 4px;
160
- /* 💡 상하좌우 테두리 공간을 1px 고정으로 4방향 모두 잡아줍니다 */
161
- border-top: 1px solid transparent;
162
- border-left: 1px solid transparent;
163
- border-right: 1px solid #e5e7eb;
164
- border-bottom: 1px solid #e5e7eb;
165
- font-size: 12px;
166
- color: #111827;
167
- position: relative;
168
- outline: none;
169
- }
170
-
171
- nine-table-sheet th {
172
- background-color: #f9fafb;
173
- font-weight: 600;
174
- text-align: left;
175
- user-select: none;
176
- }
177
-
178
-
179
-
180
- /* 🎯 셀 선택 영역 스타일 (selected 및 테두리선들) */
181
- /* --- 🎯 셀 선택 및 포커스(시작점) 관련 스타일 (필수 추가) --- */
182
- nine-table-sheet td.selected,
183
- nine-table-sheet th.selected {
184
- background-color: rgba(37, 99, 235, 0.08);
185
- }
186
-
187
- nine-table-sheet td.selected-start,
188
- nine-table-sheet th.selected-start {
189
- background-color: transparent;
190
- }
191
-
192
- nine-table-sheet tr td.selected-top { border-top: 2px solid #2563eb; }
193
- nine-table-sheet tr td.selected-bottom { border-bottom: 2px solid #2563eb; }
194
- nine-table-sheet tr td.selected-left { border-left: 2px solid #2563eb; }
195
- nine-table-sheet tr td.selected-right { border-right: 2px solid #2563eb; }
196
-
197
- /* 🎯 [복원] 컬럼 접기/펼치기 아이콘 컴포넌트 스타일 */
198
- nine-table-col-expand {
199
- position: absolute;
200
- --top: 50%;
201
- right: 2px;
202
- top: 2px;
203
- --transform: translateY(-50%);
204
- width: 12px;
205
- height: 12px;
206
- cursor: pointer;
207
- background-repeat: no-repeat;
208
- background-position: center;
209
- background-size: contain;
210
- z-index: 2;
211
- pointer-events: auto;
212
- 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>');
213
- }
214
-
215
- nine-table-col-expand.expand {
216
- right: 2px;
217
- 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>');
218
- }
219
-
220
- nine-table-col-expand.collapsed {
221
- left: 50%;
222
- right: auto;
223
- transform: translate(-50%, 0);
224
- }
225
-
226
- nine-table-sheet th:has(nine-table-col-expand),
227
- nine-table-sheet td:has(nine-table-col-expand) {
228
- position: relative;
229
- }
230
-
231
- /* 정렬 아이콘 여백 */
232
- nine-table-sheet thead th.asc::after,
233
- nine-table-sheet thead td.asc::after,
234
- nine-table-sheet thead th.desc::after,
235
- nine-table-sheet thead td.desc::after {
236
- content: "";
237
- display: inline-block;
238
- width: 0;
239
- height: 0;
240
- flex-shrink: 0;
241
- margin-left: 4px;
242
- vertical-align: middle;
243
- }
244
-
245
- nine-table-sheet thead th.asc::after,
246
- nine-table-sheet thead td.asc::after {
247
- border-left: 4px solid transparent;
248
- border-right: 4px solid transparent;
249
- border-bottom: 6px solid #2563eb;
250
- }
251
-
252
- nine-table-sheet thead th.desc::after,
253
- nine-table-sheet thead td.desc::after {
254
- border-left: 4px solid transparent;
255
- border-right: 4px solid transparent;
256
- border-top: 6px solid #dc2626;
257
- }
258
-
259
- nine-table-sheet[filtering="true"] .ng-sheet-header th,
260
- nine-table-sheet[filtering="true"] .ng-sheet-header td {
261
- padding-right: 22px !important;
262
- }
263
-
264
- /* 필터 버튼 아이콘 */
265
- nine-table-filter-button {
266
- position: absolute;
267
- bottom: 2px;
268
- right: 2px;
269
- width: 12px;
270
- height: 12px;
271
- cursor: pointer;
272
- z-index: 2;
273
- background-repeat: no-repeat;
274
- background-position: center;
275
- background-size: contain;
276
- display: inline-block;
277
- 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>');
278
- }
279
-
280
- nine-table-filter-button.filtered {
281
- 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>');
282
- }
283
-
284
- nine-table-sheet .ng-nodata-overlay {
285
- display: none;
286
- position: absolute;
287
- top: 0; /* 👈 상단부터 */
288
- left: 0; /* 👈 좌측부터 */
289
- right: 0; /* 👈 우측까지 꽉 채움 */
290
- bottom: 0; /* 👈 하단까지 꽉 채움 (absolute로 전체 영역 커버) */
291
- background: #ffffff;
292
- z-index: 20;
293
- align-items: center;
294
- justify-content: center;
295
- font-size: 12px;
296
- color: #9ca3af;
297
- }
298
-
299
-
300
-
301
- nine-table-sheet .ng-col-mover-indi {
302
- position: absolute;
303
- width: 2px;
304
- background-color: #2563eb;
305
- display: none;
306
- pointer-events: none;
307
- z-index: 10020;
308
- box-sizing: border-box;
309
- }
310
-
311
- nine-table-sheet .ng-col-mover-indi::before {
312
- content: '';
313
- position: absolute;
314
- top: -6px;
315
- left: -4px;
316
- width: 0;
317
- height: 0;
318
- border-top: 6px solid #2563eb;
319
- border-left: 5px solid transparent;
320
- border-right: 5px solid transparent;
321
- }
322
-
323
- nine-table-sheet .ng-col-mover-indi::after {
324
- content: '';
325
- position: absolute;
326
- bottom: -6px;
327
- left: -4px;
328
- width: 0;
329
- height: 0;
330
- border-bottom: 6px solid #2563eb;
331
- border-left: 5px solid transparent;
332
- border-right: 5px solid transparent;
333
- }
334
-
335
- nine-table-sheet .ng-col-mover-grip {
336
- position: absolute;
337
- box-sizing: border-box;
338
- display: none;
339
- pointer-events: none;
340
- z-index: 10010;
341
- background-color: rgba(37, 99, 235, 0.12);
342
- border: none;
343
- box-shadow: 0 4px 12px rgba(37, 99, 235, 0.15);
344
- overflow: hidden;
345
- backdrop-filter: blur(1px);
346
- transition: background-color 0.15s ease, border-color 0.15s ease;
347
- }
348
-
349
- nine-table-sheet .ng-col-mover-grip .grip-header-content {
350
- position: absolute;
351
- top: 0;
352
- left: 0;
353
- width: 100%;
354
- box-sizing: border-box;
355
- z-index: 2;
356
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
357
- }
358
-
359
- nine-table-sheet .ng-col-mover-grip.invalid {
360
- background-color: rgba(239, 68, 68, 0.12);
361
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);
362
- }
363
-
364
- nine-table-sheet .ng-col-mover-grip.invalid .grip-header-content {
365
- border-bottom: 2px solid #ef4444;
366
- }
367
-
368
- nine-table-sheet .ng-col-mover-grip th,
369
- nine-table-sheet .ng-col-mover-grip td {
370
- box-sizing: border-box;
371
- user-select: none;
372
- pointer-events: none;
373
- }
374
-
375
- /* 🎯 정렬 아이콘 공통 (가상 요소 - 헤더 및 드래그 그립 패널 공통 적용) */
376
- nine-table-sheet .ng-sheet-header th.asc::after,
377
- nine-table-sheet .ng-sheet-header td.asc::after,
378
- nine-table-sheet .ng-sheet-header th.desc::after,
379
- nine-table-sheet .ng-sheet-header td.desc::after,
380
- nine-table-sheet .ng-col-mover-grip th.asc::after, /* 👈 그립 패널 타겟 추가 */
381
- nine-table-sheet .ng-col-mover-grip td.asc::after,
382
- nine-table-sheet .ng-col-mover-grip th.desc::after, /* 👈 그립 패널 타겟 추가 */
383
- nine-table-sheet .ng-col-mover-grip td.desc::after {
384
- content: "";
385
- display: inline-block;
386
- width: 0;
387
- height: 0;
388
- flex-shrink: 0;
389
- margin-left: 4px;
390
- vertical-align: middle;
391
- }
392
-
393
- /* 오름차순 (▲): 위쪽을 가리키는 삼각형 */
394
- nine-table-sheet .ng-sheet-header th.asc::after,
395
- nine-table-sheet .ng-sheet-header td.asc::after,
396
- nine-table-sheet .ng-col-mover-grip th.asc::after, /* 👈 추가 */
397
- nine-table-sheet .ng-col-mover-grip td.asc::after {
398
- border-left: 4px solid transparent;
399
- border-right: 4px solid transparent;
400
- border-bottom: 6px solid #2563eb; /* 블루 포인트 */
401
- }
402
-
403
- /* 내림차순 (▼): 아래쪽을 가리키는 삼각형 */
404
- nine-table-sheet .ng-sheet-header th.desc::after,
405
- nine-table-sheet .ng-sheet-header td.desc::after,
406
- nine-table-sheet .ng-col-mover-grip th.desc::after, /* 👈 추가 */
407
- nine-table-sheet .ng-col-mover-grip td.desc::after {
408
- border-left: 4px solid transparent;
409
- border-right: 4px solid transparent;
410
- border-top: 6px solid #dc2626; /* 레드 포인트 */
411
- }
412
-
413
- nine-table-sheet th.resizable-edge,
414
- nine-table-sheet td.resizable-edge {
415
- cursor: col-resize;
416
- }
417
-
418
- nine-table-sheet .ng-col-resizer-panel {
419
- position: absolute;
420
- top: 0;
421
- left: 0;
422
- width: 100%;
423
- height: 100%;
424
- pointer-events: none;
425
- display: none;
426
- z-index: 9999;
427
- }
428
-
429
- nine-table-sheet .ng-col-resizer-panel.active {
430
- display: block;
431
- }
432
-
433
- nine-table-sheet .ng-col-resizer-panel .grip {
434
- position: absolute;
435
- top: 0;
436
- width: 1px;
437
- height: 100%;
438
- background-color: #2563eb;
439
- left: var(--resizer-left, 0px);
440
- }
441
-
442
- nine-table-sheet .ng-col-resizer-panel .tooltip {
443
- position: absolute;
444
- top: 0px;
445
- left: var(--tooltip-left, 0px);
446
- width: var(--tooltip-width, 0px);
447
- height: 24px;
448
- display: flex;
449
- flex-direction: column;
450
- align-items: center;
451
- pointer-events: none;
452
- z-index: 10000;
453
- }
454
-
455
- nine-table-sheet .ng-col-resizer-panel .tooltip .line-wrapper {
456
- width: 100%;
457
- height: 1px;
458
- background-color: #2563eb;
459
- position: relative;
460
- display: flex;
461
- align-items: center;
462
- justify-content: space-between;
463
- }
464
-
465
- nine-table-sheet .ng-col-resizer-panel .resizer-overlay {
466
- position: absolute;
467
- top: 0;
468
- left: var(--tooltip-left, 0px);
469
- width: var(--tooltip-width, 0px);
470
- height: 100%;
471
- background-color: rgba(37, 99, 235, 0.12);
472
- border-left: 1px dashed #2563eb;
473
- border-right: 2px solid #2563eb;
474
- box-sizing: border-box;
475
- display: flex;
476
- align-items: flex-start;
477
- justify-content: center;
478
- padding-top: 8px;
479
- pointer-events: none;
480
- opacity: 1;
481
- transition: opacity 0.15s ease-out;
482
- }
483
-
484
- nine-table-sheet .ng-col-resizer-panel .resizer-overlay.fade-out {
485
- opacity: 0;
486
- }
487
-
488
- nine-table-sheet th.resize-flash {
489
- transition: background-color 0.3s ease;
490
- background-color: rgba(37, 99, 235, 0.15);
491
- }
492
-
493
- nine-table-sheet .ng-col-resizer-panel .resizer-overlay .size-badge {
494
- padding: 2px 8px;
495
- font-size: 11px;
496
- font-weight: 700;
497
- color: #ffffff;
498
- background-color: #1e40af;
499
- border-radius: 4px;
500
- line-height: 14px;
501
- white-space: nowrap;
502
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
503
- }
504
-
505
- nine-table-sheet tr.ng-sticky-header {
506
- background-color: #f3f4f6 !important; /* 일반 행보다 살짝 진한 배경색 */
507
- font-weight: 600;
508
- z-index: 5; /* 다른 행들보다 위에 보이도록 설정 */
509
- position: relative;
510
- }
511
-
512
- /* 스크롤되면서 밀려 내려갈 때 입체감을 주는 하단 그림자 효과 */
513
- nine-table-sheet tr.ng-sticky-header td {
514
- border-bottom: 2px solid #d1d5db !important;
515
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
516
- }
517
-
518
-
519
- td.invalid::after {
520
- content: "";
521
- position: absolute;
522
- top: 0;
523
- right: 0;
524
- width: 0;
525
- height: 0;
526
- border-top: 2px solid red;
527
- border-right: 2px solid red;
528
- border-bottom: 2px solid transparent; /* 아래쪽은 투명하게 하여 삼각형 완성 */
529
- border-left: 2px solid transparent; /* 왼쪽은 투명하게 하여 삼각형 완성 */
530
- z-index: 1;
531
- pointer-events: none;
532
- }
533
-
534
- nine-table-sheet td[disabled="true"] {
535
- input,button {
536
- background: #f0f0f0;
537
- opacity: 0.5;
538
- pointer-events: none;
539
- }
540
- }
@@ -1,4 +0,0 @@
1
- nine-table-vscrollbar {
2
- display: none; /* 평소에는 기본 숨김 */
3
- border-top: 2px solid #333;
4
- }
@@ -1,22 +0,0 @@
1
- thead {
2
- display: table-header-group;
3
- position: sticky;
4
- top: 0;
5
- z-index: 10;
6
- }
7
-
8
- tfoot {
9
- display: table-footer-group;
10
- position: sticky;
11
- bottom: 0;
12
- z-index: 10;
13
- background: red;
14
- }
15
-
16
- tbody {
17
- position: relative;
18
- }
19
-
20
- tbody.foot {
21
- height: 100vh;
22
- }