@nuralyui/table 0.0.6 → 0.0.8

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.
package/table.style.js CHANGED
@@ -57,6 +57,33 @@ export default css `
57
57
  color: var(--nuraly-table-background, #ffffff);
58
58
  }
59
59
 
60
+ /* Fixed Header Styles */
61
+ .table-content-wrapper.fixed-header {
62
+ overflow-y: auto;
63
+ overflow-x: auto;
64
+ }
65
+
66
+ .table-content-wrapper.fixed-header table {
67
+ border-collapse: separate;
68
+ border-spacing: 0;
69
+ }
70
+
71
+ .table-content-wrapper.fixed-header thead {
72
+ background-color: var(--nuraly-table-header-background, #fafafa);
73
+ }
74
+
75
+ .table-content-wrapper.fixed-header thead th {
76
+ position: sticky;
77
+ top: 0;
78
+ z-index: 10;
79
+ background-color: var(--nuraly-table-header-background, #fafafa);
80
+ border-bottom: var(--nuraly-table-border-width, 1px) solid var(--nuraly-table-row-border-color, #f0f0f0);
81
+ }
82
+
83
+ .table-content-wrapper.fixed-header thead tr {
84
+ box-shadow: 0 1px 0 0 var(--nuraly-table-row-border-color, #f0f0f0);
85
+ }
86
+
60
87
  .actions-container button {
61
88
  cursor: pointer;
62
89
  border: none;
@@ -120,19 +147,19 @@ export default css `
120
147
  --nuraly-icon-color: var(--nuraly-table-text-color);
121
148
  }
122
149
 
123
- tr {
150
+ tbody tr {
124
151
  background-color: var(--nuraly-table-row-background, #ffffff);
125
152
  }
126
153
 
127
- tr:hover {
154
+ tbody tr:hover {
128
155
  background-color: var(--nuraly-table-row-hover-background, #f5f5f5);
129
156
  }
130
157
 
131
- tr:first-child {
158
+ thead tr {
132
159
  background-color: var(--nuraly-table-header-background, #fafafa);
133
160
  }
134
161
 
135
- tr:has(:not(th) > input:checked) {
162
+ tbody tr:has(input:checked) {
136
163
  background-color: var(--nuraly-table-row-selected-background, #e6f7ff);
137
164
  }
138
165
 
@@ -157,13 +184,14 @@ export default css `
157
184
  .pagination-container {
158
185
  display: flex;
159
186
  justify-content: space-between;
187
+ align-items: center;
160
188
  background-color: var(--nuraly-pagination-background-color);
161
189
  color: var(--nuraly-pagination-text-color);
162
190
  }
163
191
 
164
192
  .pagination-container .left-content {
165
193
  display: flex;
166
- justify-content: space-between;
194
+ align-items: center;
167
195
  }
168
196
 
169
197
  .pagination-container .left-content .items-details {
@@ -184,8 +212,9 @@ export default css `
184
212
  white-space: nowrap;
185
213
  }
186
214
 
187
- .pagination-container .left-content .select-details hy-select {
188
- min-width: 80px;
215
+ .pagination-container .left-content .select-details nr-select {
216
+ min-width: 60px;
217
+ max-width: 80px;
189
218
  --select-border-color: var(--nuraly-table-border-color, #d9d9d9);
190
219
  --select-background: var(--nuraly-table-pagination-background, #fafafa);
191
220
  --select-text-color: var(--nuraly-table-pagination-text, #000000);
@@ -193,13 +222,13 @@ export default css `
193
222
 
194
223
  .pagination-container .right-content {
195
224
  display: flex;
196
- justify-content: space-between;
225
+ align-items: center;
197
226
  border-left: var(--nuraly-pagination-borders);
198
227
  }
199
228
 
200
229
  .pagination-container .right-content .icon-container {
201
230
  display: flex;
202
- justify-content: space-between;
231
+ align-items: center;
203
232
  border-left: var(--nuraly-pagination-borders);
204
233
  }
205
234
 
@@ -261,5 +290,399 @@ export default css `
261
290
  .pagination-container[data-size='large'] .icon-container .right-arrow {
262
291
  padding: 15px;
263
292
  }
293
+
294
+ /* Column Filter Styles */
295
+ th .th-content {
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: space-between;
299
+ gap: 8px;
300
+ position: relative;
301
+ }
302
+
303
+ th .th-text {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 10px;
307
+ flex: 1;
308
+ }
309
+
310
+ th .filter-wrapper {
311
+ position: relative;
312
+ display: flex;
313
+ align-items: center;
314
+ }
315
+
316
+ .filter-trigger {
317
+ background: transparent;
318
+ border: none;
319
+ cursor: pointer;
320
+ padding: 4px;
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ border-radius: 4px;
325
+ transition: background-color 0.2s;
326
+ }
327
+
328
+ .filter-trigger:hover {
329
+ background-color: var(--nuraly-table-filter-hover, rgba(0, 0, 0, 0.04));
330
+ }
331
+
332
+ .filter-icon {
333
+ position: relative;
334
+ display: flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ }
338
+
339
+ .filter-icon.has-filter {
340
+ color: var(--nuraly-table-filter-active, #1890ff);
341
+ }
342
+
343
+ .filter-indicator {
344
+ position: absolute;
345
+ top: -2px;
346
+ right: -2px;
347
+ width: 6px;
348
+ height: 6px;
349
+ border-radius: 50%;
350
+ background-color: var(--nuraly-table-filter-active, #1890ff);
351
+ }
352
+
353
+ .column-filter-dropdown {
354
+ position: absolute;
355
+ top: calc(100% + 4px);
356
+ right: 0;
357
+ background: var(--nuraly-table-background, #ffffff);
358
+ border: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);
359
+ border-radius: 4px;
360
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
361
+ z-index: 100;
362
+ min-width: 200px;
363
+ padding: 8px;
364
+ }
365
+
366
+ .column-filter-content {
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: 8px;
370
+ }
371
+
372
+ .column-filter-input {
373
+ padding: 8px;
374
+ border: 1px solid var(--nuraly-table-row-border-color, #d9d9d9);
375
+ border-radius: 4px;
376
+ font-size: 14px;
377
+ width: 100%;
378
+ box-sizing: border-box;
379
+ }
380
+
381
+ .column-filter-input:focus {
382
+ outline: none;
383
+ border-color: var(--nuraly-table-filter-active, #1890ff);
384
+ box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
385
+ }
386
+
387
+ .column-filter-clear {
388
+ background: transparent;
389
+ border: none;
390
+ cursor: pointer;
391
+ padding: 4px;
392
+ display: flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ color: var(--nuraly-table-text-color, #000);
396
+ align-self: flex-end;
397
+ }
398
+
399
+ .column-filter-clear:hover {
400
+ color: var(--nuraly-table-filter-active, #1890ff);
401
+ }
402
+
403
+ /* Fixed Columns Styles */
404
+ th.fixed-column,
405
+ td.fixed-column {
406
+ position: sticky;
407
+ background-color: var(--nuraly-table-row-background, #ffffff);
408
+ }
409
+
410
+ /* Fixed columns in header - highest priority */
411
+ thead th.fixed-column {
412
+ z-index: 20;
413
+ background-color: var(--nuraly-table-header-background, #fafafa);
414
+ }
415
+
416
+ /* When table has fixed header, fixed columns in header need even higher z-index */
417
+ .table-content-wrapper.fixed-header thead th.fixed-column {
418
+ z-index: 25;
419
+ background-color: var(--nuraly-table-header-background, #fafafa);
420
+ }
421
+
422
+ /* Fixed columns in body */
423
+ tbody td.fixed-column {
424
+ z-index: 8;
425
+ background-color: var(--nuraly-table-row-background, #ffffff);
426
+ }
427
+
428
+ /* Ensure fixed columns in tbody have proper background */
429
+ tbody tr td.fixed-column {
430
+ background-color: var(--nuraly-table-row-background, #ffffff);
431
+ }
432
+
433
+ tbody tr:hover td.fixed-column {
434
+ background-color: var(--nuraly-table-row-hover-background, #f5f5f5);
435
+ }
436
+
437
+ th.fixed-column-left,
438
+ td.fixed-column-left {
439
+ left: 0;
440
+ border-right: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);
441
+ }
442
+
443
+ th.fixed-column-right,
444
+ td.fixed-column-right {
445
+ right: 0;
446
+ border-left: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);
447
+ }
448
+
449
+ /* Shadow effect for fixed columns */
450
+ th.fixed-column-left::after,
451
+ td.fixed-column-left::after {
452
+ content: '';
453
+ position: absolute;
454
+ top: 0;
455
+ right: -10px;
456
+ bottom: 0;
457
+ width: 10px;
458
+ pointer-events: none;
459
+ transition: box-shadow 0.3s;
460
+ box-shadow: none;
461
+ }
462
+
463
+ .table-content-wrapper.has-scroll th.fixed-column-left::after,
464
+ .table-content-wrapper.has-scroll td.fixed-column-left::after {
465
+ box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15);
466
+ }
467
+
468
+ th.fixed-column-right::before,
469
+ td.fixed-column-right::before {
470
+ content: '';
471
+ position: absolute;
472
+ top: 0;
473
+ left: -10px;
474
+ bottom: 0;
475
+ width: 10px;
476
+ pointer-events: none;
477
+ transition: box-shadow 0.3s;
478
+ box-shadow: none;
479
+ }
480
+
481
+ .table-content-wrapper.has-scroll th.fixed-column-right::before,
482
+ .table-content-wrapper.has-scroll td.fixed-column-right::before {
483
+ box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15);
484
+ }
485
+
486
+ /* ============================================ */
487
+ /* Loading State Styles */
488
+ /* ============================================ */
489
+
490
+ /* Skeleton Loading Rows */
491
+ .skeleton-row {
492
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
493
+ }
494
+
495
+ .skeleton-cell {
496
+ padding: var(--nuraly-spacing-3, 0.75rem) var(--nuraly-spacing-4, 1rem);
497
+ border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);
498
+ }
499
+
500
+ .skeleton-cell.selection-skeleton {
501
+ width: 48px;
502
+ text-align: center;
503
+ }
504
+
505
+ .skeleton-checkbox {
506
+ width: 16px;
507
+ height: 16px;
508
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
509
+ background-size: 200% 100%;
510
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
511
+ border-radius: 2px;
512
+ margin: 0 auto;
513
+ }
514
+
515
+ .skeleton-content {
516
+ height: 16px;
517
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
518
+ background-size: 200% 100%;
519
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
520
+ border-radius: 4px;
521
+ width: 80%;
522
+ }
523
+
524
+ @keyframes skeleton-shimmer {
525
+ 0% {
526
+ background-position: 200% 0;
527
+ }
528
+ 100% {
529
+ background-position: -200% 0;
530
+ }
531
+ }
532
+
533
+ @keyframes skeleton-pulse {
534
+ 0%, 100% {
535
+ opacity: 1;
536
+ }
537
+ 50% {
538
+ opacity: 0.6;
539
+ }
540
+ }
541
+
542
+ /* Spinner Loading */
543
+ .loading-row {
544
+ background-color: var(--nuraly-table-row-background, #ffffff);
545
+ }
546
+
547
+ .loading-cell {
548
+ padding: var(--nuraly-spacing-8, 2rem) var(--nuraly-spacing-4, 1rem);
549
+ text-align: center;
550
+ border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);
551
+ }
552
+
553
+ .loading-spinner-container {
554
+ display: flex;
555
+ flex-direction: column;
556
+ align-items: center;
557
+ gap: var(--nuraly-spacing-4, 1rem);
558
+ }
559
+
560
+ .loading-spinner {
561
+ width: 40px;
562
+ height: 40px;
563
+ border: 4px solid var(--nuraly-table-border-color, #f0f0f0);
564
+ border-top-color: var(--nuraly-color-primary, #1890ff);
565
+ border-radius: 50%;
566
+ animation: spinner-rotate 0.8s linear infinite;
567
+ }
568
+
569
+ @keyframes spinner-rotate {
570
+ 0% {
571
+ transform: rotate(0deg);
572
+ }
573
+ 100% {
574
+ transform: rotate(360deg);
575
+ }
576
+ }
577
+
578
+ .loading-text {
579
+ margin: 0;
580
+ color: var(--nuraly-color-text-secondary, #666666);
581
+ font-size: 14px;
582
+ }
583
+
584
+ /* Empty State Styles */
585
+ .empty-row {
586
+ background: var(--nuraly-table-row-bg-color, #ffffff);
587
+ }
588
+
589
+ .empty-row:hover {
590
+ background: var(--nuraly-table-row-bg-color, #ffffff);
591
+ }
592
+
593
+ .empty-cell {
594
+ padding: 64px 24px;
595
+ text-align: center;
596
+ border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);
597
+ }
598
+
599
+ .empty-state {
600
+ display: flex;
601
+ flex-direction: column;
602
+ align-items: center;
603
+ gap: 16px;
604
+ }
605
+
606
+ .empty-icon {
607
+ width: 64px;
608
+ height: 64px;
609
+ color: var(--nuraly-color-text-quaternary, #bfbfbf);
610
+ display: flex;
611
+ align-items: center;
612
+ justify-content: center;
613
+ }
614
+
615
+ .empty-icon svg {
616
+ width: 100%;
617
+ height: 100%;
618
+ }
619
+
620
+ .empty-icon nr-icon {
621
+ font-size: 64px;
622
+ }
623
+
624
+ .empty-text {
625
+ margin: 0;
626
+ color: var(--nuraly-color-text-secondary, #666666);
627
+ font-size: 14px;
628
+ line-height: 1.5;
629
+ }
630
+
631
+ /* Expansion Row Styles */
632
+ .expand-icon {
633
+ text-align: center;
634
+ vertical-align: middle;
635
+ transition: transform 0.3s ease;
636
+ outline: none;
637
+ }
638
+
639
+ .expand-icon:hover {
640
+ background-color: var(--nuraly-color-fill-tertiary, #f5f5f5);
641
+ }
642
+
643
+ .expand-icon:focus {
644
+ background-color: var(--nuraly-color-fill-tertiary, #f5f5f5);
645
+ box-shadow: inset 0 0 0 2px var(--nuraly-color-primary, #1890ff);
646
+ }
647
+
648
+ .expand-icon nr-icon {
649
+ transition: transform 0.3s ease;
650
+ }
651
+
652
+ .expand-icon.expanded nr-icon {
653
+ transform: rotate(180deg);
654
+ }
655
+
656
+ .expansion-row {
657
+ transition: all 0.3s ease;
658
+ }
659
+
660
+ .expansion-row.collapsed {
661
+ opacity: 0;
662
+ height: 0;
663
+ overflow: hidden;
664
+ }
665
+
666
+ .expansion-row.expanded {
667
+ opacity: 1;
668
+ animation: slideDown 0.3s ease;
669
+ }
670
+
671
+ .expansion-content {
672
+ padding: 16px;
673
+ background-color: var(--nuraly-color-fill-quaternary, #fafafa);
674
+ border-top: 1px solid var(--nuraly-color-border, #d9d9d9);
675
+ }
676
+
677
+ @keyframes slideDown {
678
+ from {
679
+ opacity: 0;
680
+ transform: translateY(-10px);
681
+ }
682
+ to {
683
+ opacity: 1;
684
+ transform: translateY(0);
685
+ }
686
+ }
264
687
  `;
265
688
  //# sourceMappingURL=table.style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.style.js","sourceRoot":"","sources":["../../../src/components/table/table.style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsQjB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n width: 100%;\n font-family: var(--nuraly-font-family, Arial, sans-serif);\n color: var(--nuraly-color-text);\n background-color: var(--nuraly-color-background);\n }\n\n /* Filter Container Styles */\n .filter-container {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: var(--nuraly-spacing-2, 0.5rem) 0;\n position: relative;\n margin-bottom: 5px;\n }\n\n .filter-container input {\n padding: 5px;\n padding-left: 30px;\n width: 100%;\n box-sizing: border-box;\n background-color: var(--nuraly-table-filter-background, #ffffff);\n color: var(--nuraly-table-filter-text, #000000);\n }\n\n .filter-container input:focus {\n outline-style: none;\n border: 1px solid var(--nuraly-table-filter-border, #1890ff);\n }\n\n .filter-container .icon-container {\n height: 25px;\n width: 35px;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .filter-container .search-icon {\n position: absolute;\n left: 10px;\n top: 25%;\n }\n\n /* Actions Bar Styles */\n .actions-container {\n background-color: var(--nuraly-table-action-color, #0f62fe);\n padding: 10px;\n box-sizing: border-box;\n display: flex;\n justify-content: space-between;\n color: var(--nuraly-table-background, #ffffff);\n }\n\n .actions-container button {\n cursor: pointer;\n border: none;\n color: var(--nuraly-table-background, #ffffff);\n background-color: var(--nuraly-table-action-color, #0f62fe);\n }\n\n .actions-container[data-size='small'] {\n padding: 5px;\n }\n\n .actions-container[data-size='large'] {\n padding: 15px;\n }\n\n /* Table Content Wrapper Styles */\n .table-content-wrapper {\n display: block;\n overflow: auto;\n }\n\n input[type='checkbox'][data-indeterminate='true']::after {\n width: 13px;\n height: 13px;\n background-color: var(--nuraly-table-checkbox-checked, #161616);\n color: var(--nuraly-table-background, #ffffff);\n display: flex;\n justify-content: center;\n align-items: center;\n content: '-';\n }\n\n /* Table Styles */\n table {\n width: 100%;\n border-spacing: 0px;\n color: var(--nuraly-table-text-color);\n }\n\n td {\n text-align: center;\n border-bottom: var(--nuraly-table-border-width, 1px) solid var(--nuraly-table-row-border-color, #f0f0f0);\n padding: 10px;\n }\n\n th {\n cursor: pointer;\n padding: 10px;\n }\n\n th span {\n display: flex;\n justify-content: center;\n gap: 10px;\n }\n\n nr-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n --nuraly-icon-color: var(--nuraly-table-text-color);\n }\n\n tr {\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n tr:hover {\n background-color: var(--nuraly-table-row-hover-background, #f5f5f5);\n }\n\n tr:first-child {\n background-color: var(--nuraly-table-header-background, #fafafa);\n }\n\n tr:has(:not(th) > input:checked) {\n background-color: var(--nuraly-table-row-selected-background, #e6f7ff);\n }\n\n input,\n .expand-icon {\n cursor: pointer;\n accent-color: var(--nuraly-table-checkbox-checked, #1890ff);\n }\n\n /* Size Variants for Table Content */\n :host([size='small']) td,\n :host([size='small']) th {\n padding: 5px;\n }\n\n :host([size='large']) td,\n :host([size='large']) th {\n padding: 15px;\n }\n\n /* Pagination Styles */\n .pagination-container {\n display: flex;\n justify-content: space-between;\n background-color: var(--nuraly-pagination-background-color);\n color: var(--nuraly-pagination-text-color);\n }\n\n .pagination-container .left-content {\n display: flex;\n justify-content: space-between;\n }\n\n .pagination-container .left-content .items-details {\n border-left: var(--nuraly-pagination-borders);\n padding: 10px;\n }\n\n .pagination-container .left-content .select-details {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n }\n\n .pagination-container .left-content .select-details label {\n font-size: var(--nuraly-font-size-input, 14px);\n color: var(--nuraly-table-pagination-text, #000000);\n white-space: nowrap;\n }\n\n .pagination-container .left-content .select-details hy-select {\n min-width: 80px;\n --select-border-color: var(--nuraly-table-border-color, #d9d9d9);\n --select-background: var(--nuraly-table-pagination-background, #fafafa);\n --select-text-color: var(--nuraly-table-pagination-text, #000000);\n }\n\n .pagination-container .right-content {\n display: flex;\n justify-content: space-between;\n border-left: var(--nuraly-pagination-borders);\n }\n\n .pagination-container .right-content .icon-container {\n display: flex;\n justify-content: space-between;\n border-left: var(--nuraly-pagination-borders);\n }\n\n .pagination-container .right-content .page-details {\n padding: 10px;\n }\n\n .pagination-container .icon-container .left-arrow,\n .pagination-container .icon-container .right-arrow {\n padding: 10px;\n --nuraly-icon-color: var(--nuraly-pagination-text-color);\n }\n\n .pagination-container .icon-container .left-arrow {\n border-right: var(--nuraly-pagination-borders);\n }\n\n .pagination-container nr-icon[data-enabled='false'] {\n cursor: not-allowed;\n }\n\n .pagination-container nr-icon[data-enabled='true'] {\n cursor: pointer;\n }\n\n /* Size Variants for Pagination */\n .pagination-container[data-size='small'] .left-content .items-details {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .left-content .items-details {\n padding: 15px;\n }\n\n .pagination-container[data-size='small'] .left-content .select-details {\n padding: 5px;\n gap: 6px;\n }\n\n .pagination-container[data-size='large'] .left-content .select-details {\n padding: 15px;\n gap: 10px;\n }\n\n .pagination-container[data-size='small'] .right-content .page-details {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .right-content .page-details {\n padding: 15px;\n }\n\n .pagination-container[data-size='small'] .icon-container .left-arrow,\n .pagination-container[data-size='small'] .icon-container .right-arrow {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .icon-container .left-arrow,\n .pagination-container[data-size='large'] .icon-container .right-arrow {\n padding: 15px;\n }\n`;\n"]}
1
+ {"version":3,"file":"table.style.js","sourceRoot":"","sources":["../../../src/components/table/table.style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6qBjB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n width: 100%;\n font-family: var(--nuraly-font-family, Arial, sans-serif);\n color: var(--nuraly-color-text);\n background-color: var(--nuraly-color-background);\n }\n\n /* Filter Container Styles */\n .filter-container {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: var(--nuraly-spacing-2, 0.5rem) 0;\n position: relative;\n margin-bottom: 5px;\n }\n\n .filter-container input {\n padding: 5px;\n padding-left: 30px;\n width: 100%;\n box-sizing: border-box;\n background-color: var(--nuraly-table-filter-background, #ffffff);\n color: var(--nuraly-table-filter-text, #000000);\n }\n\n .filter-container input:focus {\n outline-style: none;\n border: 1px solid var(--nuraly-table-filter-border, #1890ff);\n }\n\n .filter-container .icon-container {\n height: 25px;\n width: 35px;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .filter-container .search-icon {\n position: absolute;\n left: 10px;\n top: 25%;\n }\n\n /* Actions Bar Styles */\n .actions-container {\n background-color: var(--nuraly-table-action-color, #0f62fe);\n padding: 10px;\n box-sizing: border-box;\n display: flex;\n justify-content: space-between;\n color: var(--nuraly-table-background, #ffffff);\n }\n\n /* Fixed Header Styles */\n .table-content-wrapper.fixed-header {\n overflow-y: auto;\n overflow-x: auto;\n }\n\n .table-content-wrapper.fixed-header table {\n border-collapse: separate;\n border-spacing: 0;\n }\n\n .table-content-wrapper.fixed-header thead {\n background-color: var(--nuraly-table-header-background, #fafafa);\n }\n\n .table-content-wrapper.fixed-header thead th {\n position: sticky;\n top: 0;\n z-index: 10;\n background-color: var(--nuraly-table-header-background, #fafafa);\n border-bottom: var(--nuraly-table-border-width, 1px) solid var(--nuraly-table-row-border-color, #f0f0f0);\n }\n\n .table-content-wrapper.fixed-header thead tr {\n box-shadow: 0 1px 0 0 var(--nuraly-table-row-border-color, #f0f0f0);\n }\n\n .actions-container button {\n cursor: pointer;\n border: none;\n color: var(--nuraly-table-background, #ffffff);\n background-color: var(--nuraly-table-action-color, #0f62fe);\n }\n\n .actions-container[data-size='small'] {\n padding: 5px;\n }\n\n .actions-container[data-size='large'] {\n padding: 15px;\n }\n\n /* Table Content Wrapper Styles */\n .table-content-wrapper {\n display: block;\n overflow: auto;\n }\n\n input[type='checkbox'][data-indeterminate='true']::after {\n width: 13px;\n height: 13px;\n background-color: var(--nuraly-table-checkbox-checked, #161616);\n color: var(--nuraly-table-background, #ffffff);\n display: flex;\n justify-content: center;\n align-items: center;\n content: '-';\n }\n\n /* Table Styles */\n table {\n width: 100%;\n border-spacing: 0px;\n color: var(--nuraly-table-text-color);\n }\n\n td {\n text-align: center;\n border-bottom: var(--nuraly-table-border-width, 1px) solid var(--nuraly-table-row-border-color, #f0f0f0);\n padding: 10px;\n }\n\n th {\n cursor: pointer;\n padding: 10px;\n }\n\n th span {\n display: flex;\n justify-content: center;\n gap: 10px;\n }\n\n nr-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n --nuraly-icon-color: var(--nuraly-table-text-color);\n }\n\n tbody tr {\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n tbody tr:hover {\n background-color: var(--nuraly-table-row-hover-background, #f5f5f5);\n }\n\n thead tr {\n background-color: var(--nuraly-table-header-background, #fafafa);\n }\n\n tbody tr:has(input:checked) {\n background-color: var(--nuraly-table-row-selected-background, #e6f7ff);\n }\n\n input,\n .expand-icon {\n cursor: pointer;\n accent-color: var(--nuraly-table-checkbox-checked, #1890ff);\n }\n\n /* Size Variants for Table Content */\n :host([size='small']) td,\n :host([size='small']) th {\n padding: 5px;\n }\n\n :host([size='large']) td,\n :host([size='large']) th {\n padding: 15px;\n }\n\n /* Pagination Styles */\n .pagination-container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background-color: var(--nuraly-pagination-background-color);\n color: var(--nuraly-pagination-text-color);\n }\n\n .pagination-container .left-content {\n display: flex;\n align-items: center;\n }\n\n .pagination-container .left-content .items-details {\n border-left: var(--nuraly-pagination-borders);\n padding: 10px;\n }\n\n .pagination-container .left-content .select-details {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n }\n\n .pagination-container .left-content .select-details label {\n font-size: var(--nuraly-font-size-input, 14px);\n color: var(--nuraly-table-pagination-text, #000000);\n white-space: nowrap;\n }\n\n .pagination-container .left-content .select-details nr-select {\n min-width: 60px;\n max-width: 80px;\n --select-border-color: var(--nuraly-table-border-color, #d9d9d9);\n --select-background: var(--nuraly-table-pagination-background, #fafafa);\n --select-text-color: var(--nuraly-table-pagination-text, #000000);\n }\n\n .pagination-container .right-content {\n display: flex;\n align-items: center;\n border-left: var(--nuraly-pagination-borders);\n }\n\n .pagination-container .right-content .icon-container {\n display: flex;\n align-items: center;\n border-left: var(--nuraly-pagination-borders);\n }\n\n .pagination-container .right-content .page-details {\n padding: 10px;\n }\n\n .pagination-container .icon-container .left-arrow,\n .pagination-container .icon-container .right-arrow {\n padding: 10px;\n --nuraly-icon-color: var(--nuraly-pagination-text-color);\n }\n\n .pagination-container .icon-container .left-arrow {\n border-right: var(--nuraly-pagination-borders);\n }\n\n .pagination-container nr-icon[data-enabled='false'] {\n cursor: not-allowed;\n }\n\n .pagination-container nr-icon[data-enabled='true'] {\n cursor: pointer;\n }\n\n /* Size Variants for Pagination */\n .pagination-container[data-size='small'] .left-content .items-details {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .left-content .items-details {\n padding: 15px;\n }\n\n .pagination-container[data-size='small'] .left-content .select-details {\n padding: 5px;\n gap: 6px;\n }\n\n .pagination-container[data-size='large'] .left-content .select-details {\n padding: 15px;\n gap: 10px;\n }\n\n .pagination-container[data-size='small'] .right-content .page-details {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .right-content .page-details {\n padding: 15px;\n }\n\n .pagination-container[data-size='small'] .icon-container .left-arrow,\n .pagination-container[data-size='small'] .icon-container .right-arrow {\n padding: 5px;\n }\n\n .pagination-container[data-size='large'] .icon-container .left-arrow,\n .pagination-container[data-size='large'] .icon-container .right-arrow {\n padding: 15px;\n }\n\n /* Column Filter Styles */\n th .th-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n position: relative;\n }\n\n th .th-text {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n }\n\n th .filter-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .filter-trigger {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .filter-trigger:hover {\n background-color: var(--nuraly-table-filter-hover, rgba(0, 0, 0, 0.04));\n }\n\n .filter-icon {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .filter-icon.has-filter {\n color: var(--nuraly-table-filter-active, #1890ff);\n }\n\n .filter-indicator {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--nuraly-table-filter-active, #1890ff);\n }\n\n .column-filter-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n background: var(--nuraly-table-background, #ffffff);\n border: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 100;\n min-width: 200px;\n padding: 8px;\n }\n\n .column-filter-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .column-filter-input {\n padding: 8px;\n border: 1px solid var(--nuraly-table-row-border-color, #d9d9d9);\n border-radius: 4px;\n font-size: 14px;\n width: 100%;\n box-sizing: border-box;\n }\n\n .column-filter-input:focus {\n outline: none;\n border-color: var(--nuraly-table-filter-active, #1890ff);\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n }\n\n .column-filter-clear {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--nuraly-table-text-color, #000);\n align-self: flex-end;\n }\n\n .column-filter-clear:hover {\n color: var(--nuraly-table-filter-active, #1890ff);\n }\n\n /* Fixed Columns Styles */\n th.fixed-column,\n td.fixed-column {\n position: sticky;\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n /* Fixed columns in header - highest priority */\n thead th.fixed-column {\n z-index: 20;\n background-color: var(--nuraly-table-header-background, #fafafa);\n }\n\n /* When table has fixed header, fixed columns in header need even higher z-index */\n .table-content-wrapper.fixed-header thead th.fixed-column {\n z-index: 25;\n background-color: var(--nuraly-table-header-background, #fafafa);\n }\n\n /* Fixed columns in body */\n tbody td.fixed-column {\n z-index: 8;\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n /* Ensure fixed columns in tbody have proper background */\n tbody tr td.fixed-column {\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n tbody tr:hover td.fixed-column {\n background-color: var(--nuraly-table-row-hover-background, #f5f5f5);\n }\n\n th.fixed-column-left,\n td.fixed-column-left {\n left: 0;\n border-right: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);\n }\n\n th.fixed-column-right,\n td.fixed-column-right {\n right: 0;\n border-left: 1px solid var(--nuraly-table-row-border-color, #f0f0f0);\n }\n\n /* Shadow effect for fixed columns */\n th.fixed-column-left::after,\n td.fixed-column-left::after {\n content: '';\n position: absolute;\n top: 0;\n right: -10px;\n bottom: 0;\n width: 10px;\n pointer-events: none;\n transition: box-shadow 0.3s;\n box-shadow: none;\n }\n\n .table-content-wrapper.has-scroll th.fixed-column-left::after,\n .table-content-wrapper.has-scroll td.fixed-column-left::after {\n box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15);\n }\n\n th.fixed-column-right::before,\n td.fixed-column-right::before {\n content: '';\n position: absolute;\n top: 0;\n left: -10px;\n bottom: 0;\n width: 10px;\n pointer-events: none;\n transition: box-shadow 0.3s;\n box-shadow: none;\n }\n\n .table-content-wrapper.has-scroll th.fixed-column-right::before,\n .table-content-wrapper.has-scroll td.fixed-column-right::before {\n box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15);\n }\n\n /* ============================================ */\n /* Loading State Styles */\n /* ============================================ */\n \n /* Skeleton Loading Rows */\n .skeleton-row {\n animation: skeleton-pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-cell {\n padding: var(--nuraly-spacing-3, 0.75rem) var(--nuraly-spacing-4, 1rem);\n border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);\n }\n\n .skeleton-cell.selection-skeleton {\n width: 48px;\n text-align: center;\n }\n\n .skeleton-checkbox {\n width: 16px;\n height: 16px;\n background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\n background-size: 200% 100%;\n animation: skeleton-shimmer 1.5s ease-in-out infinite;\n border-radius: 2px;\n margin: 0 auto;\n }\n\n .skeleton-content {\n height: 16px;\n background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\n background-size: 200% 100%;\n animation: skeleton-shimmer 1.5s ease-in-out infinite;\n border-radius: 4px;\n width: 80%;\n }\n\n @keyframes skeleton-shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n\n @keyframes skeleton-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.6;\n }\n }\n\n /* Spinner Loading */\n .loading-row {\n background-color: var(--nuraly-table-row-background, #ffffff);\n }\n\n .loading-cell {\n padding: var(--nuraly-spacing-8, 2rem) var(--nuraly-spacing-4, 1rem);\n text-align: center;\n border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);\n }\n\n .loading-spinner-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--nuraly-spacing-4, 1rem);\n }\n\n .loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid var(--nuraly-table-border-color, #f0f0f0);\n border-top-color: var(--nuraly-color-primary, #1890ff);\n border-radius: 50%;\n animation: spinner-rotate 0.8s linear infinite;\n }\n\n @keyframes spinner-rotate {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n\n .loading-text {\n margin: 0;\n color: var(--nuraly-color-text-secondary, #666666);\n font-size: 14px;\n }\n\n /* Empty State Styles */\n .empty-row {\n background: var(--nuraly-table-row-bg-color, #ffffff);\n }\n\n .empty-row:hover {\n background: var(--nuraly-table-row-bg-color, #ffffff);\n }\n\n .empty-cell {\n padding: 64px 24px;\n text-align: center;\n border-bottom: 1px solid var(--nuraly-table-border-color, #f0f0f0);\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n }\n\n .empty-icon {\n width: 64px;\n height: 64px;\n color: var(--nuraly-color-text-quaternary, #bfbfbf);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .empty-icon svg {\n width: 100%;\n height: 100%;\n }\n\n .empty-icon nr-icon {\n font-size: 64px;\n }\n\n .empty-text {\n margin: 0;\n color: var(--nuraly-color-text-secondary, #666666);\n font-size: 14px;\n line-height: 1.5;\n }\n\n /* Expansion Row Styles */\n .expand-icon {\n text-align: center;\n vertical-align: middle;\n transition: transform 0.3s ease;\n outline: none;\n }\n\n .expand-icon:hover {\n background-color: var(--nuraly-color-fill-tertiary, #f5f5f5);\n }\n\n .expand-icon:focus {\n background-color: var(--nuraly-color-fill-tertiary, #f5f5f5);\n box-shadow: inset 0 0 0 2px var(--nuraly-color-primary, #1890ff);\n }\n\n .expand-icon nr-icon {\n transition: transform 0.3s ease;\n }\n\n .expand-icon.expanded nr-icon {\n transform: rotate(180deg);\n }\n\n .expansion-row {\n transition: all 0.3s ease;\n }\n\n .expansion-row.collapsed {\n opacity: 0;\n height: 0;\n overflow: hidden;\n }\n\n .expansion-row.expanded {\n opacity: 1;\n animation: slideDown 0.3s ease;\n }\n\n .expansion-content {\n padding: 16px;\n background-color: var(--nuraly-color-fill-quaternary, #fafafa);\n border-top: 1px solid var(--nuraly-color-border, #d9d9d9);\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\n"]}
package/table.types.d.ts CHANGED
@@ -1,9 +1,40 @@
1
+ /**
2
+ * Column filter types
3
+ */
4
+ export declare const enum FilterType {
5
+ Text = "text",
6
+ Select = "select",
7
+ Number = "number",
8
+ Date = "date"
9
+ }
10
+ /**
11
+ * Column filter configuration
12
+ */
13
+ export interface ColumnFilter {
14
+ type: FilterType;
15
+ placeholder?: string;
16
+ options?: Array<{
17
+ label: string;
18
+ value: string | number;
19
+ }>;
20
+ }
21
+ /**
22
+ * Active filter state for a column
23
+ */
24
+ export interface ActiveColumnFilter {
25
+ columnKey: string;
26
+ value: string | number | null;
27
+ }
1
28
  /**
2
29
  * Table header configuration
3
30
  */
4
31
  export interface IHeader {
5
32
  name: string;
6
33
  key: string;
34
+ filterable?: boolean;
35
+ filterConfig?: ColumnFilter;
36
+ fixed?: 'left' | 'right';
37
+ width?: number | string;
7
38
  }
8
39
  /**
9
40
  * Selection mode for table rows
@@ -43,5 +74,12 @@ export interface SortAttribute {
43
74
  index: number;
44
75
  order: SortOrder;
45
76
  }
77
+ /**
78
+ * Expansion content render function
79
+ * @param row - The row data
80
+ * @param index - The row index
81
+ * @returns Template result for the expanded content
82
+ */
83
+ export declare type ExpansionContentRenderer = (row: any, index: number) => any;
46
84
  export declare const EMPTY_STRING = "";
47
85
  //# sourceMappingURL=table.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.types.js","sourceRoot":"","sources":["../../../src/components/table/table.types.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC","sourcesContent":["/**\n * Table header configuration\n */\nexport interface IHeader {\n name: string;\n key: string;\n}\n\n/**\n * Selection mode for table rows\n */\nexport const enum SelectionMode {\n Single = 'single',\n Multiple = 'multiple',\n}\n\n/**\n * Table size variants\n */\nexport const enum Sizes {\n Small = 'small',\n Normal = 'normal',\n Large = 'large',\n}\n\n/**\n * Sort order states\n */\nexport const enum SortOrder {\n Default = 'default',\n Ascending = 'ascending',\n Descending = 'descending',\n}\n\n/**\n * Sort direction values\n */\nexport const enum SortValue {\n Default = 0,\n Ascending = 1,\n Descending = -1,\n}\n\n/**\n * Sort attribute configuration\n */\nexport interface SortAttribute {\n index: number;\n order: SortOrder;\n}\n\nexport const EMPTY_STRING = '';\n"]}
1
+ {"version":3,"file":"table.types.js","sourceRoot":"","sources":["../../../src/components/table/table.types.ts"],"names":[],"mappings":"AA0FA,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC","sourcesContent":["/**\n * Column filter types\n */\nexport const enum FilterType {\n Text = 'text',\n Select = 'select',\n Number = 'number',\n Date = 'date',\n}\n\n/**\n * Column filter configuration\n */\nexport interface ColumnFilter {\n type: FilterType;\n placeholder?: string;\n options?: Array<{ label: string; value: string | number }>;\n}\n\n/**\n * Active filter state for a column\n */\nexport interface ActiveColumnFilter {\n columnKey: string;\n value: string | number | null;\n}\n\n/**\n * Table header configuration\n */\nexport interface IHeader {\n name: string;\n key: string;\n filterable?: boolean;\n filterConfig?: ColumnFilter;\n fixed?: 'left' | 'right';\n width?: number | string;\n}\n\n/**\n * Selection mode for table rows\n */\nexport const enum SelectionMode {\n Single = 'single',\n Multiple = 'multiple',\n}\n\n/**\n * Table size variants\n */\nexport const enum Sizes {\n Small = 'small',\n Normal = 'normal',\n Large = 'large',\n}\n\n/**\n * Sort order states\n */\nexport const enum SortOrder {\n Default = 'default',\n Ascending = 'ascending',\n Descending = 'descending',\n}\n\n/**\n * Sort direction values\n */\nexport const enum SortValue {\n Default = 0,\n Ascending = 1,\n Descending = -1,\n}\n\n/**\n * Sort attribute configuration\n */\nexport interface SortAttribute {\n index: number;\n order: SortOrder;\n}\n\n/**\n * Expansion content render function\n * @param row - The row data\n * @param index - The row index\n * @returns Template result for the expanded content\n */\nexport type ExpansionContentRenderer = (row: any, index: number) => any;\n\nexport const EMPTY_STRING = '';\n"]}