sp-component 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +209 -144
  2. package/dist/components/accordion/sp-accordion-item.css.js +1 -1
  3. package/dist/components/accordion/sp-accordion.css.js +1 -1
  4. package/dist/components/alert/sp-alert.css.js +1 -1
  5. package/dist/components/autocomplete/sp-autocomplete.css.js +1 -1
  6. package/dist/components/autocomplete/sp-autocomplete.template.d.ts.map +1 -1
  7. package/dist/components/autocomplete/sp-autocomplete.template.js +14 -13
  8. package/dist/components/avatar/sp-avatar.css.js +1 -1
  9. package/dist/components/badge/sp-badge.css.js +1 -1
  10. package/dist/components/badge/sp-badge.d.ts +2 -0
  11. package/dist/components/badge/sp-badge.d.ts.map +1 -1
  12. package/dist/components/badge/sp-badge.js +34 -31
  13. package/dist/components/breadcrumb/sp-breadcrumb-item.css.js +1 -1
  14. package/dist/components/breadcrumb/sp-breadcrumb.css.js +1 -1
  15. package/dist/components/button/sp-button.css.js +1 -1
  16. package/dist/components/calendar/sp-calendar-date-picker.css.js +1 -1
  17. package/dist/components/calendar/sp-calendar.css.js +1 -1
  18. package/dist/components/calendar/sp-calendar.d.ts +1 -0
  19. package/dist/components/calendar/sp-calendar.d.ts.map +1 -1
  20. package/dist/components/calendar/sp-calendar.js +29 -29
  21. package/dist/components/card/sp-card.css.js +1 -1
  22. package/dist/components/card/sp-card.template.d.ts.map +1 -1
  23. package/dist/components/card/sp-card.template.js +25 -16
  24. package/dist/components/carousel/sp-carousel-slide.css.js +2 -2
  25. package/dist/components/carousel/sp-carousel.css.js +1 -1
  26. package/dist/components/checkbox/sp-checkbox.css.js +1 -1
  27. package/dist/components/checkbox-group/sp-checkbox-group.css.js +1 -1
  28. package/dist/components/color-picker/sp-color-picker.css.js +1 -1
  29. package/dist/components/color-picker/sp-color-picker.template.d.ts.map +1 -1
  30. package/dist/components/color-picker/sp-color-picker.template.js +15 -14
  31. package/dist/components/combobox/sp-combobox.css.js +1 -1
  32. package/dist/components/combobox/sp-combobox.d.ts.map +1 -1
  33. package/dist/components/combobox/sp-combobox.js +26 -20
  34. package/dist/components/command-palette/sp-command-palette.css.js +1 -1
  35. package/dist/components/confirm-dialog/sp-confirm-dialog.css.js +1 -1
  36. package/dist/components/copy-button/sp-copy-button.css.js +1 -1
  37. package/dist/components/divider/sp-divider.css.js +1 -1
  38. package/dist/components/drawer/sp-drawer.css.js +1 -1
  39. package/dist/components/drawer/sp-drawer.d.ts +4 -0
  40. package/dist/components/drawer/sp-drawer.d.ts.map +1 -1
  41. package/dist/components/drawer/sp-drawer.js +78 -69
  42. package/dist/components/empty-state/sp-empty-state.css.js +1 -1
  43. package/dist/components/file-upload/sp-file-upload.css.js +1 -1
  44. package/dist/components/form-field/sp-form-field.css.js +1 -1
  45. package/dist/components/gallery/sp-gallery.css.js +1 -1
  46. package/dist/components/icon/sp-icon.css.js +2 -2
  47. package/dist/components/input/sp-input.css.js +1 -1
  48. package/dist/components/kbd/sp-kbd.css.js +1 -1
  49. package/dist/components/menu/sp-menu-item.css.js +1 -1
  50. package/dist/components/menu/sp-menu.css.js +1 -1
  51. package/dist/components/menu/sp-menu.d.ts +1 -0
  52. package/dist/components/menu/sp-menu.d.ts.map +1 -1
  53. package/dist/components/menu/sp-menu.js +33 -33
  54. package/dist/components/modal/sp-modal.css.js +1 -1
  55. package/dist/components/modal/sp-modal.d.ts +2 -0
  56. package/dist/components/modal/sp-modal.d.ts.map +1 -1
  57. package/dist/components/modal/sp-modal.js +60 -51
  58. package/dist/components/navbar/sp-navbar.css.js +2 -2
  59. package/dist/components/number-input/sp-number-input.css.js +1 -1
  60. package/dist/components/number-input/sp-number-input.d.ts.map +1 -1
  61. package/dist/components/number-input/sp-number-input.js +55 -52
  62. package/dist/components/otp-input/sp-otp-input.css.js +1 -1
  63. package/dist/components/pagination/sp-pagination.css.js +1 -1
  64. package/dist/components/popover/sp-popover.css.js +1 -1
  65. package/dist/components/progress-bar/sp-progress-bar.css.js +1 -1
  66. package/dist/components/radio/sp-radio-group.css.js +1 -1
  67. package/dist/components/radio/sp-radio.css.js +1 -1
  68. package/dist/components/radio/sp-radio.d.ts +1 -0
  69. package/dist/components/radio/sp-radio.d.ts.map +1 -1
  70. package/dist/components/radio/sp-radio.js +19 -16
  71. package/dist/components/rating/sp-rating.css.js +2 -2
  72. package/dist/components/scroll-area/sp-scroll-area.css.js +1 -1
  73. package/dist/components/scroll-area/sp-scroll-area.d.ts +1 -0
  74. package/dist/components/scroll-area/sp-scroll-area.d.ts.map +1 -1
  75. package/dist/components/scroll-area/sp-scroll-area.js +43 -44
  76. package/dist/components/select/sp-select.css.js +1 -1
  77. package/dist/components/sidebar/sp-sidebar.css.js +1 -1
  78. package/dist/components/skeleton/sp-skeleton.css.js +1 -1
  79. package/dist/components/slider/sp-slider.css.js +1 -1
  80. package/dist/components/spinner/sp-spinner.css.js +1 -1
  81. package/dist/components/split-panel/sp-split-panel.css.js +1 -1
  82. package/dist/components/stat/sp-stat.css.js +1 -1
  83. package/dist/components/stepper/sp-stepper.css.js +1 -1
  84. package/dist/components/switch/sp-switch.css.js +1 -1
  85. package/dist/components/table/sp-table.css.js +1 -1
  86. package/dist/components/table/sp-table.d.ts +80 -17
  87. package/dist/components/table/sp-table.d.ts.map +1 -1
  88. package/dist/components/table/sp-table.js +237 -82
  89. package/dist/components/table/sp-table.template.d.ts.map +1 -1
  90. package/dist/components/table/sp-table.template.js +337 -67
  91. package/dist/components/table/sp-table.types.d.ts +22 -0
  92. package/dist/components/table/sp-table.types.d.ts.map +1 -1
  93. package/dist/components/tabs/sp-tab.css.js +2 -2
  94. package/dist/components/tabs/sp-tabs.css.js +1 -1
  95. package/dist/components/tag/sp-tag.css.js +1 -1
  96. package/dist/components/tag-input/sp-tag-input.css.js +2 -2
  97. package/dist/components/textarea/sp-textarea.css.js +1 -1
  98. package/dist/components/time-picker/sp-time-picker.css.js +1 -1
  99. package/dist/components/timeline/sp-timeline.css.js +1 -1
  100. package/dist/components/toast/sp-toast.css.js +1 -1
  101. package/dist/components/toast/sp-toast.d.ts +1 -0
  102. package/dist/components/toast/sp-toast.d.ts.map +1 -1
  103. package/dist/components/toast/sp-toast.js +32 -33
  104. package/dist/components/toast-stack/sp-toast-stack.css.js +1 -1
  105. package/dist/components/tooltip/sp-tooltip.css.js +2 -2
  106. package/dist/components/tree/sp-tree-item.css.js +1 -1
  107. package/dist/components/tree/sp-tree.css.js +2 -2
  108. package/dist/components/visually-hidden/sp-visually-hidden.css.js +2 -2
  109. package/dist/config.d.ts +28 -0
  110. package/dist/config.d.ts.map +1 -0
  111. package/dist/config.js +44 -0
  112. package/dist/index.d.ts +2 -0
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +2 -0
  115. package/package.json +13 -9
@@ -1,4 +1,4 @@
1
- const e = ':host{display:block}.sp-stepper{display:flex;align-items:flex-start}:host([orientation="vertical"]) .sp-stepper{flex-direction:column}.sp-step{display:flex;align-items:center;flex:1;position:relative}:host([orientation="vertical"]) .sp-step{flex-direction:column;align-items:flex-start;flex:none;width:100%;padding-bottom:24px}.sp-step-indicator{width:32px;height:32px;border-radius:50%;border:2px solid var(--sp-border, #d1d5db);background:var(--sp-bg, white);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:var(--sp-text-muted, #6b7280);flex-shrink:0;z-index:1;transition:all .2s}.sp-step--complete .sp-step-indicator{background:var(--sp-primary, #3b82f6);border-color:var(--sp-primary, #3b82f6);color:var(--sp-bg, white)}.sp-step--current .sp-step-indicator{border-color:var(--sp-primary, #3b82f6);color:var(--sp-primary, #3b82f6);box-shadow:0 0 0 3px var(--sp-primary-focus, rgba(59, 130, 246, .2))}.sp-step--error .sp-step-indicator{border-color:var(--sp-error, #FF4D4F);color:var(--sp-error, #FF4D4F)}.sp-step-connector{flex:1;height:2px;background:var(--sp-border-subtle, #e5e7eb);margin:0 8px}:host([orientation="vertical"]) .sp-step-connector{width:2px;height:24px;margin:4px 0;position:absolute;left:15px;top:32px}.sp-step--complete+.sp-step .sp-step-connector,.sp-step--complete .sp-step-connector{background:var(--sp-primary, #3b82f6)}.sp-step-content{display:flex;flex-direction:column;gap:2px;padding:0 8px}:host([orientation="vertical"]) .sp-step-content{position:absolute;left:44px;top:4px}.sp-step-label{font-size:14px;font-weight:500;color:var(--sp-text-secondary, #374151);white-space:nowrap}.sp-step--current .sp-step-label{color:var(--sp-primary, #3b82f6)}.sp-step--upcoming .sp-step-label{color:var(--sp-text-placeholder, #9ca3af)}.sp-step--error .sp-step-label{color:var(--sp-error, #FF4D4F)}.sp-step-description{font-size:12px;color:var(--sp-text-placeholder, #9ca3af);white-space:nowrap}.sp-step-indicator:focus-visible{outline:2px solid var(--sp-primary, #3b82f6);outline-offset:2px}@media(prefers-reduced-motion:reduce){:host{transition:none!important}button,a,[role=button],.sp-step-indicator{transition:none!important}}';
1
+ const e = '*,*:before,*:after{box-sizing:border-box}:host{display:block}.sp-stepper{display:flex;align-items:flex-start}:host([orientation="vertical"]) .sp-stepper{flex-direction:column}.sp-step{display:flex;align-items:center;flex:1;position:relative}:host([orientation="vertical"]) .sp-step{flex-direction:column;align-items:flex-start;flex:none;width:100%;padding-bottom:24px}.sp-step-indicator{width:32px;height:32px;border-radius:50%;border:2px solid var(--sp-border, #d1d5db);background:var(--sp-bg, white);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:var(--sp-text-muted, #6b7280);flex-shrink:0;z-index:1;transition:all .2s}.sp-step--complete .sp-step-indicator{background:var(--sp-primary, #3b82f6);border-color:var(--sp-primary, #3b82f6);color:var(--sp-bg, white)}.sp-step--current .sp-step-indicator{border-color:var(--sp-primary, #3b82f6);color:var(--sp-primary, #3b82f6);box-shadow:0 0 0 3px var(--sp-primary-focus, rgba(59, 130, 246, .2))}.sp-step--error .sp-step-indicator{border-color:var(--sp-error, #FF4D4F);color:var(--sp-error, #FF4D4F)}.sp-step-connector{flex:1;height:2px;background:var(--sp-border-subtle, #e5e7eb);margin:0 8px}:host([orientation="vertical"]) .sp-step-connector{width:2px;height:24px;margin:4px 0;position:absolute;left:15px;top:32px}.sp-step--complete+.sp-step .sp-step-connector,.sp-step--complete .sp-step-connector{background:var(--sp-primary, #3b82f6)}.sp-step-content{display:flex;flex-direction:column;gap:2px;padding:0 8px}:host([orientation="vertical"]) .sp-step-content{position:absolute;left:44px;top:4px}.sp-step-label{font-size:14px;font-weight:500;color:var(--sp-text-secondary, #374151);white-space:nowrap}.sp-step--current .sp-step-label{color:var(--sp-primary, #3b82f6)}.sp-step--upcoming .sp-step-label{color:var(--sp-text-placeholder, #9ca3af)}.sp-step--error .sp-step-label{color:var(--sp-error, #FF4D4F)}.sp-step-description{font-size:12px;color:var(--sp-text-placeholder, #9ca3af);white-space:nowrap}.sp-step-indicator:focus-visible{outline:2px solid var(--sp-primary, #3b82f6);outline-offset:2px}@media(prefers-reduced-motion:reduce){:host{transition:none!important}button,a,[role=button],.sp-step-indicator{transition:none!important}}';
2
2
  export {
3
3
  e as default
4
4
  };
@@ -1,4 +1,4 @@
1
- const t = ':host{display:inline-block}.sp-switch-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;-webkit-user-select:none;user-select:none}.sp-switch-label--disabled{opacity:.5;cursor:not-allowed}.sp-switch-track{position:relative;display:inline-flex;align-items:center;width:44px;height:24px;border-radius:12px;background:var(--sp-border, #d1d5db);transition:background .2s;flex-shrink:0}.sp-switch-track input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:inherit;border-radius:inherit}.sp-switch-track--checked{background:var(--sp-primary, #3b82f6)}.sp-switch-thumb{position:absolute;left:2px;width:20px;height:20px;border-radius:50%;background:var(--sp-bg, white);box-shadow:0 1px 3px #0003;transition:transform .2s;pointer-events:none}.sp-switch-track--checked .sp-switch-thumb{transform:translate(20px)}.sp-switch-track:has(input:focus-visible){outline:2px solid var(--sp-primary, #3b82f6);outline-offset:2px}:host([size="sm"]) .sp-switch-track{width:34px;height:18px;border-radius:9px}:host([size="sm"]) .sp-switch-thumb{width:14px;height:14px}:host([size="sm"]) .sp-switch-track--checked .sp-switch-thumb{transform:translate(16px)}:host([size="lg"]) .sp-switch-track{width:54px;height:30px;border-radius:15px}:host([size="lg"]) .sp-switch-thumb{width:26px;height:26px}:host([size="lg"]) .sp-switch-track--checked .sp-switch-thumb{transform:translate(24px)}.sp-switch-text{font-size:14px;color:var(--sp-text-secondary, #374151)}.sp-switch-hint{display:block;font-size:12px;color:var(--sp-text-muted, #6b7280);margin-top:4px}@media(prefers-reduced-motion:reduce){.sp-switch-track,.sp-switch-thumb{transition:none}}';
1
+ const t = '*,*:before,*:after{box-sizing:border-box}:host{display:inline-block}.sp-switch-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;-webkit-user-select:none;user-select:none}.sp-switch-label--disabled{opacity:.5;cursor:not-allowed}.sp-switch-track{position:relative;display:inline-flex;align-items:center;width:44px;height:24px;border-radius:12px;background:var(--sp-border, #d1d5db);transition:background .2s;flex-shrink:0}.sp-switch-track input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:inherit;border-radius:inherit}.sp-switch-track--checked{background:var(--sp-primary, #3b82f6)}.sp-switch-thumb{position:absolute;left:2px;width:20px;height:20px;border-radius:50%;background:var(--sp-bg, white);box-shadow:0 1px 3px #0003;transition:transform .2s;pointer-events:none}.sp-switch-track--checked .sp-switch-thumb{transform:translate(20px)}.sp-switch-track:has(input:focus-visible){outline:2px solid var(--sp-primary, #3b82f6);outline-offset:2px}:host([size="sm"]) .sp-switch-track{width:34px;height:18px;border-radius:9px}:host([size="sm"]) .sp-switch-thumb{width:14px;height:14px}:host([size="sm"]) .sp-switch-track--checked .sp-switch-thumb{transform:translate(16px)}:host([size="lg"]) .sp-switch-track{width:54px;height:30px;border-radius:15px}:host([size="lg"]) .sp-switch-thumb{width:26px;height:26px}:host([size="lg"]) .sp-switch-track--checked .sp-switch-thumb{transform:translate(24px)}.sp-switch-text{font-size:14px;color:var(--sp-text-secondary, #374151)}.sp-switch-hint{display:block;font-size:12px;color:var(--sp-text-muted, #6b7280);margin-top:4px}@media(prefers-reduced-motion:reduce){.sp-switch-track,.sp-switch-thumb{transition:none}}';
2
2
  export {
3
3
  t as default
4
4
  };
@@ -1,4 +1,4 @@
1
- const e = ":host{display:block}.sp-table-wrapper{width:100%;overflow-x:auto;border-radius:8px}.sp-table{width:100%;border-collapse:collapse;font-size:14px}:host([bordered]) .sp-table-wrapper{border:1px solid var(--sp-border-subtle, #e5e7eb)}.sp-table-th{padding:12px 16px;text-align:left;font-size:12px;font-weight:600;color:var(--sp-text-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em;background:var(--sp-bg-subtle, #f9fafb);border-bottom:1px solid var(--sp-border-subtle, #e5e7eb);white-space:nowrap}:host([compact]) .sp-table-th{padding:8px 12px}.sp-table-th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sp-table-th--sortable:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-th-content{display:flex;align-items:center;gap:6px}.sp-table-sort-icon{color:var(--sp-text-placeholder, #9ca3af);font-size:12px}.sp-table-th--sorted .sp-table-sort-icon{color:var(--sp-primary, #3b82f6)}.sp-table-td{padding:12px 16px;color:var(--sp-text-secondary, #374151);border-bottom:1px solid var(--sp-bg-muted, #f3f4f6)}:host([compact]) .sp-table-td{padding:8px 12px}:host([bordered]) .sp-table-th,:host([bordered]) .sp-table-td{border:1px solid var(--sp-border-subtle, #e5e7eb)}.sp-table-row--striped{background:var(--sp-bg-subtle, #f9fafb)}:host([hoverable]) .sp-table-row:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-empty{text-align:center;padding:32px;color:var(--sp-text-placeholder, #9ca3af);font-size:14px}.sp-table-loading{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--sp-text-muted, #6b7280)}.sp-table-th--sortable:focus-visible{outline:2px solid var(--sp-primary, #3b82f6);outline-offset:-2px}.sp-table-th--sticky{position:sticky;top:0;z-index:1;background:var(--sp-table-header-bg, var(--sp-bg-subtle, #f9fafb))}.sp-table-caption{caption-side:top;padding:8px 16px;text-align:left;font-size:14px;font-weight:600;color:var(--sp-text-secondary, #374151)}.sp-table-th--checkbox,.sp-table-td--checkbox{width:40px;padding:12px 8px;text-align:center}.sp-table-row--selected{background:var(--sp-primary-bg, #eff6ff)}:host([hoverable]) .sp-table-row--selected:hover{background:var(--sp-primary-bg-hover, #dbeafe)}@media(prefers-reduced-motion:reduce){:host{transition:none!important}button,a,[role=button]{transition:none!important}}";
1
+ const e = `*,*:before,*:after{box-sizing:border-box}:host{display:block}.sp-table-toolbar{display:flex;align-items:center;gap:10px;padding:10px 0 12px;flex-wrap:wrap}.sp-table-search{position:relative;display:flex;align-items:center;flex:1;min-width:180px;max-width:360px}.sp-table-search-icon{position:absolute;left:10px;color:var(--sp-text-muted, #9ca3af);display:flex;align-items:center;pointer-events:none}.sp-table-search-input{width:100%;padding:7px 32px;font-size:13px;font-family:inherit;background:var(--sp-bg, #fff);color:var(--sp-text, #111827);border:1px solid var(--sp-border, #d1d5db);border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.sp-table-search-input::placeholder{color:var(--sp-text-muted, #9ca3af)}.sp-table-search-input:focus{border-color:var(--sp-primary, #3b82f6);box-shadow:0 0 0 3px var(--sp-primary-focus, rgba(59,130,246,.2))}.sp-table-search-clear{position:absolute;right:8px;background:none;border:none;cursor:pointer;color:var(--sp-text-muted, #9ca3af);font-size:12px;padding:2px;border-radius:3px;line-height:1}.sp-table-search-clear:hover{color:var(--sp-text, #111827)}.sp-table-toolbar-end{display:flex;align-items:center;gap:8px;margin-left:auto;flex-wrap:wrap}.sp-table-count{font-size:12px;color:var(--sp-text-muted, #6b7280);white-space:nowrap}.sp-table-chip-clear{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;font-size:12px;font-family:inherit;background:var(--sp-error-bg, #fff2f0);color:var(--sp-error, #ef4444);border:1px solid var(--sp-error, #ef4444);border-radius:99px;cursor:pointer;white-space:nowrap;transition:background .15s}.sp-table-chip-clear:hover{background:var(--sp-error-bg-hover, #ffccc7)}.sp-table-icon-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;font-size:12px;font-family:inherit;background:var(--sp-bg, #fff);color:var(--sp-text-secondary, #374151);border:1px solid var(--sp-border, #d1d5db);border-radius:7px;cursor:pointer;white-space:nowrap;transition:background .15s}.sp-table-icon-btn:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-col-picker-wrap{position:relative}.sp-table-col-picker{position:absolute;right:0;top:calc(100% + 6px);background:var(--sp-bg, #fff);border:1px solid var(--sp-border, #d1d5db);border-radius:10px;box-shadow:var(--sp-shadow-lg, 0 10px 15px -3px rgba(0,0,0,.1));padding:8px 4px;min-width:180px;z-index:100}.sp-table-col-picker-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sp-text-muted, #6b7280);padding:4px 12px 8px;border-bottom:1px solid var(--sp-border-subtle, #e5e7eb);margin-bottom:4px}.sp-table-col-picker-item{display:flex;align-items:center;gap:8px;padding:6px 12px;font-size:13px;color:var(--sp-text-secondary, #374151);cursor:pointer;border-radius:6px;margin:0 4px;transition:background .1s}.sp-table-col-picker-item:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-col-picker-item input{cursor:pointer;accent-color:var(--sp-primary, #3b82f6)}.sp-table-page-size{display:flex;align-items:center;gap:6px;white-space:nowrap}.sp-table-page-size-label{font-size:12px;color:var(--sp-text-muted, #6b7280)}.sp-table-page-size-select{padding:4px 24px 4px 8px;font-size:12px;font-family:inherit;background:var(--sp-bg, #fff);color:var(--sp-text-secondary, #374151);border:1px solid var(--sp-border, #d1d5db);border-radius:6px;cursor:pointer;outline:none;-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 6px center;transition:border-color .15s}.sp-table-page-size-select:focus{border-color:var(--sp-primary, #3b82f6);box-shadow:0 0 0 3px var(--sp-primary-focus, rgba(59,130,246,.2))}.sp-table-wrapper{width:100%;overflow-x:auto;border-radius:10px;border:1px solid var(--sp-border-subtle, #e5e7eb)}:host([bordered]) .sp-table-wrapper{border:1px solid var(--sp-border, #d1d5db)}.sp-table{width:100%;border-collapse:collapse;font-size:14px}.sp-table-th{padding:11px 16px;text-align:left;font-size:12px;font-weight:600;color:var(--sp-text-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em;background:var(--sp-bg-subtle, #f9fafb);border-bottom:1px solid var(--sp-border-subtle, #e5e7eb);white-space:nowrap;position:relative;transition:background .12s}:host([compact]) .sp-table-th{padding:7px 12px}.sp-table-th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sp-table-th--sortable:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-th--sortable:focus-visible{outline:2px solid var(--sp-primary, #3b82f6);outline-offset:-2px}.sp-table-th--reorderable,.sp-table-th--reorderable.sp-table-th--sortable{cursor:grab}.sp-table-th--dragging{opacity:.5}.sp-table-th--dragover{background:var(--sp-primary-bg, #eff6ff)!important;border-left:2px solid var(--sp-primary, #3b82f6)}.sp-table-th--sticky{position:sticky;top:0;z-index:2;background:var(--sp-bg-subtle, #f9fafb)}.sp-table-th-content{display:flex;align-items:center;gap:6px}.sp-table-drag-handle{color:var(--sp-border-strong, #9ca3af);font-size:12px;cursor:grab;line-height:1;flex-shrink:0;letter-spacing:-2px}.sp-table-sort-icon{color:var(--sp-text-placeholder, #9ca3af);font-size:12px;flex-shrink:0}.sp-table-th--sorted .sp-table-sort-icon{color:var(--sp-primary, #3b82f6)}.sp-table-filter-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;background:none;border:none;border-radius:4px;cursor:pointer;color:var(--sp-text-placeholder, #9ca3af);padding:0;transition:color .12s,background .12s}.sp-table-filter-icon-btn:hover{color:var(--sp-text-secondary, #374151);background:var(--sp-bg-muted, #f3f4f6)}.sp-table-filter-icon-btn--active{color:var(--sp-primary, #3b82f6)}.sp-table-filter-icon-btn--active:hover{background:var(--sp-primary-bg, #eff6ff)}.sp-table-col-filter-pop{position:absolute;top:calc(100% + 4px);left:0;min-width:200px;background:var(--sp-bg, #fff);border:1px solid var(--sp-border, #d1d5db);border-radius:10px;box-shadow:var(--sp-shadow-lg, 0 10px 15px -3px rgba(0,0,0,.12), 0 4px 6px -2px rgba(0,0,0,.06));padding:10px;z-index:60}.sp-table-col-filter-pop-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sp-text-muted, #6b7280);margin-bottom:8px}.sp-table-col-filter-pop-row{display:flex;align-items:center;gap:6px}.sp-table-col-filter-pop-input{flex:1;padding:6px 10px;font-size:13px;font-family:inherit;background:var(--sp-bg-subtle, #f9fafb);color:var(--sp-text, #111827);border:1px solid var(--sp-border, #d1d5db);border-radius:7px;outline:none;transition:border-color .15s,box-shadow .15s}.sp-table-col-filter-pop-input::placeholder{color:var(--sp-text-muted, #9ca3af)}.sp-table-col-filter-pop-input:focus{border-color:var(--sp-primary, #3b82f6);box-shadow:0 0 0 3px var(--sp-primary-focus, rgba(59,130,246,.2));background:var(--sp-bg, #fff)}.sp-table-col-filter-pop-clear{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex-shrink:0;background:none;border:1px solid var(--sp-border, #d1d5db);border-radius:6px;cursor:pointer;color:var(--sp-text-muted, #9ca3af);font-size:11px;transition:color .12s,background .12s,border-color .12s}.sp-table-col-filter-pop-clear:hover{color:var(--sp-error, #ef4444);border-color:var(--sp-error, #ef4444);background:var(--sp-error-bg, #fff2f0)}.sp-table-td{padding:12px 16px;color:var(--sp-text-secondary, #374151);border-bottom:1px solid var(--sp-bg-muted, #f3f4f6);vertical-align:middle}:host([compact]) .sp-table-td{padding:8px 12px}:host([bordered]) .sp-table-th,:host([bordered]) .sp-table-td{border:1px solid var(--sp-border-subtle, #e5e7eb)}.sp-table-row--striped{background:var(--sp-bg-subtle, #f9fafb)}:host([hoverable]) .sp-table-row:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-row--selected{background:var(--sp-primary-bg, #eff6ff)!important}:host([hoverable]) .sp-table-row--selected:hover{background:var(--sp-primary-bg-hover, #dbeafe)!important}.sp-table-th--checkbox,.sp-table-td--checkbox{width:40px;padding:12px 8px;text-align:center}.sp-table-th--actions{width:1%;white-space:nowrap}.sp-table-td--actions{white-space:nowrap}.sp-table-actions{display:flex;align-items:center;gap:4px}.sp-table-action-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:12px;font-family:inherit;border-radius:6px;border:none;cursor:pointer;white-space:nowrap;transition:background .12s,color .12s;font-weight:500}.sp-table-action-btn--ghost{background:transparent;color:var(--sp-text-secondary, #374151)}.sp-table-action-btn--ghost:hover{background:var(--sp-bg-muted, #f3f4f6)}.sp-table-action-btn--primary{background:var(--sp-primary-bg, #eff6ff);color:var(--sp-primary, #3b82f6)}.sp-table-action-btn--primary:hover{background:var(--sp-primary-bg-hover, #dbeafe)}.sp-table-action-btn--secondary{background:var(--sp-bg-muted, #f3f4f6);color:var(--sp-text-secondary, #374151);border:1px solid var(--sp-border, #d1d5db)}.sp-table-action-btn--secondary:hover{background:var(--sp-bg, #fff)}.sp-table-action-btn--destructive{background:var(--sp-error-bg, #fff2f0);color:var(--sp-error, #ef4444)}.sp-table-action-btn--destructive:hover{background:var(--sp-error-bg-hover, #ffccc7)}.sp-table-empty{text-align:center;padding:40px 20px;color:var(--sp-text-placeholder, #9ca3af);font-size:14px}.sp-table-empty-inner{display:flex;flex-direction:column;align-items:center;gap:10px}.sp-table-empty-inner .sp-table-chip-clear{margin-top:4px}.sp-table-loading{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--sp-text-muted, #6b7280)}.sp-table-caption{caption-side:top;padding:8px 16px;text-align:left;font-size:14px;font-weight:600;color:var(--sp-text-secondary, #374151)}.sp-table-pagination{display:flex;align-items:center;justify-content:space-between;padding:12px 2px 2px;flex-wrap:wrap;gap:10px}.sp-table-page-info{font-size:13px;color:var(--sp-text-muted, #6b7280)}.sp-table-page-btns{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.sp-table-page-btn{display:flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 8px;font-size:13px;font-family:inherit;background:var(--sp-bg, #fff);color:var(--sp-text-secondary, #374151);border:1px solid var(--sp-border, #d1d5db);border-radius:7px;cursor:pointer;transition:background .12s,border-color .12s,color .12s}.sp-table-page-btn:hover:not(:disabled){background:var(--sp-bg-muted, #f3f4f6);border-color:var(--sp-border-strong, #9ca3af)}.sp-table-page-btn:disabled{opacity:.4;cursor:not-allowed}.sp-table-page-btn--active{background:var(--sp-primary, #3b82f6)!important;color:#fff!important;border-color:var(--sp-primary, #3b82f6)!important;font-weight:700}.sp-table-page-ellipsis{padding:0 4px;font-size:13px;color:var(--sp-text-muted, #6b7280)}@keyframes sp-table-spin{to{transform:rotate(360deg)}}.sp-table-spin{animation:sp-table-spin .8s linear infinite;transform-origin:center}@media(prefers-reduced-motion:reduce){.sp-table-spin{animation:none}*{transition:none!important}}@media(max-width:600px){.sp-table-toolbar{gap:6px}.sp-table-search{max-width:100%}.sp-table-toolbar-end{margin-left:0}}`;
2
2
  export {
3
3
  e as default
4
4
  };
@@ -1,26 +1,38 @@
1
1
  import { LitElement } from 'lit';
2
- import { SpTableColumn, SpTableSortDirection } from './sp-table.types.js';
2
+ import { SpTableAction, SpTableColumn, SpTableSortDirection } from './sp-table.types.js';
3
3
  /**
4
- * Data table component with column definitions and row data array.
4
+ * Data table component with sorting, filtering, column reordering,
5
+ * column visibility, pagination, and row actions.
5
6
  *
6
7
  * @element sp-table
7
8
  *
8
- * @prop {SpTableColumn[]} columns - Column definitions
9
- * @prop {Record<string, unknown>[]} data - Row data
10
- * @prop {boolean} loading - Shows loading state
11
- * @prop {boolean} bordered - Adds borders to cells
12
- * @prop {boolean} striped - Alternates row background
13
- * @prop {boolean} hoverable - Highlights rows on hover
14
- * @prop {boolean} compact - Reduces cell padding
15
- * @prop {string} emptyText - Text shown when no data
16
- * @prop {string} sortKey - Currently sorted column key
17
- * @prop {SpTableSortDirection} sortDirection - Current sort direction
18
- * @prop {boolean} stickyHeader - Makes the header sticky
19
- * @prop {boolean} selectable - Enables row selection with checkboxes
20
- * @prop {string} caption - Table caption text
9
+ * @prop {SpTableColumn[]} columns - Column definitions
10
+ * @prop {Record<string, unknown>[]} data - Row data
11
+ * @prop {boolean} loading - Shows loading state
12
+ * @prop {boolean} bordered - Adds borders to cells
13
+ * @prop {boolean} striped - Alternates row background
14
+ * @prop {boolean} hoverable - Highlights rows on hover
15
+ * @prop {boolean} compact - Reduces cell padding
16
+ * @prop {string} emptyText - Text shown when no data
17
+ * @prop {string} sortKey - Currently sorted column key
18
+ * @prop {SpTableSortDirection} sortDirection - Current sort direction
19
+ * @prop {boolean} stickyHeader - Makes the header sticky
20
+ * @prop {boolean} selectable - Enables row selection with checkboxes
21
+ * @prop {string} caption - Table caption text
22
+ * @prop {boolean} reorderable - Allows drag-and-drop column reordering
23
+ * @prop {boolean} searchable - Shows a global search toolbar
24
+ * @prop {number} pageSize - Rows per page (0 = no pagination)
25
+ * @prop {number[]} pageSizeOptions - Page size options for the selector
26
+ * @prop {SpTableAction[]} actions - Per-row action buttons
27
+ * @prop {boolean} virtual - Enables virtual scrolling (replaces pagination)
28
+ * @prop {number} rowHeight - Row height in px for virtual scroll calculations
29
+ * @prop {string} maxHeight - Container height for virtual scroll
21
30
  *
22
- * @fires {CustomEvent<{ key: string, direction: SpTableSortDirection }>} sp-sort - Emitted when a sortable column header is clicked
23
- * @fires {CustomEvent<{ indices: number[] }>} sp-selection-change - Emitted when row selection changes
31
+ * @fires {CustomEvent<{ key, direction }>} sp-sort - Sort column clicked
32
+ * @fires {CustomEvent<{ indices }>} sp-selection-change - Row selection changed
33
+ * @fires {CustomEvent<{ order }>} sp-column-reorder - Columns were reordered
34
+ * @fires {CustomEvent<{ row, index }>} sp-row-action - Row action clicked
35
+ * @fires {CustomEvent<{ pageSize }>} sp-page-size-change - Fires when page size selector changes
24
36
  */
25
37
  export declare class SpTableComponent extends LitElement {
26
38
  static styles: import('lit').CSSResult;
@@ -37,10 +49,61 @@ export declare class SpTableComponent extends LitElement {
37
49
  stickyHeader: boolean;
38
50
  selectable: boolean;
39
51
  caption: string;
52
+ reorderable: boolean;
53
+ searchable: boolean;
54
+ pageSize: number;
55
+ pageSizeOptions: number[];
56
+ actions: SpTableAction[];
57
+ virtual: boolean;
58
+ rowHeight: number;
59
+ maxHeight: string;
40
60
  selectedRows: Set<number>;
61
+ _columnOrder: string[];
62
+ _hiddenCols: Set<string>;
63
+ _filters: Record<string, string>;
64
+ _globalSearch: string;
65
+ _page: number;
66
+ _showColPicker: boolean;
67
+ _dragOverIndex: number;
68
+ _dragFromIndex: number;
69
+ _openFilterCol: string | null;
70
+ _scrollTop: number;
71
+ _containerH: number;
72
+ private _resizeObs?;
73
+ firstUpdated(): void;
74
+ updated(changed: Map<string, unknown>): void;
75
+ disconnectedCallback(): void;
76
+ private _setupVirtualScroll;
77
+ get _orderedColumns(): SpTableColumn[];
78
+ get _visibleColumns(): SpTableColumn[];
79
+ get _filteredData(): Record<string, unknown>[];
80
+ get _pagedData(): Record<string, unknown>[];
81
+ get _totalPages(): number;
82
+ get _virtualSlice(): {
83
+ rows: Record<string, unknown>[];
84
+ startIndex: number;
85
+ topPad: number;
86
+ bottomPad: number;
87
+ };
88
+ readonly _onVirtualScroll: (e: Event) => void;
89
+ readonly _handlePageSizeChange: (size: number) => void;
41
90
  readonly _handleRowSelect: (rowIndex: number, checked: boolean) => void;
42
91
  readonly _handleSelectAll: (checked: boolean) => void;
43
92
  readonly _handleSort: (column: SpTableColumn) => void;
93
+ readonly _handleDragStart: (e: DragEvent, index: number) => void;
94
+ readonly _handleDragOver: (e: DragEvent, index: number) => void;
95
+ readonly _handleDragLeave: () => void;
96
+ readonly _handleDrop: (e: DragEvent, toIndex: number) => void;
97
+ readonly _handleDragEnd: () => void;
98
+ readonly _toggleFilterCol: (key: string) => void;
99
+ readonly _handleFilter: (key: string, value: string) => void;
100
+ readonly _handleGlobalSearch: (value: string) => void;
101
+ readonly _clearFilters: () => void;
102
+ get _hasActiveFilters(): boolean;
103
+ readonly _toggleColumn: (key: string) => void;
104
+ readonly _goToPage: (page: number) => void;
105
+ readonly _handleAction: (action: SpTableAction, row: Record<string, unknown>, index: number) => void;
106
+ private _emit;
44
107
  render(): import('lit-html').TemplateResult;
45
108
  }
46
109
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"sp-table.d.ts","sourceRoot":"","sources":["../../../src/components/table/sp-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,OAAgB,MAAM,0BAAqB;IAG3C,OAAO,EAAE,aAAa,EAAE,CAAM;IAG9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAM;IAGrC,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAGjB,OAAO,UAAS;IAGhB,SAAS,UAAQ;IAGjB,OAAO,UAAS;IAGhB,SAAS,SAAuB;IAGhC,OAAO,SAAM;IAGb,aAAa,EAAE,oBAAoB,CAAU;IAG7C,YAAY,UAAS;IAGrB,UAAU,UAAS;IAGnB,OAAO,SAAM;IAGb,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAEtC,QAAQ,CAAC,gBAAgB,GAAI,UAAU,MAAM,EAAE,SAAS,OAAO,UAe7D;IAEF,QAAQ,CAAC,gBAAgB,GAAI,SAAS,OAAO,UAY3C;IAEF,QAAQ,CAAC,WAAW,GAAI,QAAQ,aAAa,UAiB3C;IAEO,MAAM;CAGhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,gBAAgB,CAAC;KAC9B;CACF"}
1
+ {"version":3,"file":"sp-table.d.ts","sourceRoot":"","sources":["../../../src/components/table/sp-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,OAAgB,MAAM,0BAAqB;IAI3C,OAAO,EAAE,aAAa,EAAE,CAAM;IAG9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAM;IAGrC,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAGjB,OAAO,UAAS;IAGhB,SAAS,UAAQ;IAGjB,OAAO,UAAS;IAGhB,SAAS,SAAuB;IAGhC,OAAO,SAAM;IAGb,aAAa,EAAE,oBAAoB,CAAU;IAG7C,YAAY,UAAS;IAGrB,UAAU,UAAS;IAGnB,OAAO,SAAM;IAGb,WAAW,UAAS;IAGpB,UAAU,UAAS;IAGnB,QAAQ,SAAK;IAGb,eAAe,EAAE,MAAM,EAAE,CAAqB;IAG9C,OAAO,EAAE,aAAa,EAAE,CAAM;IAG9B,OAAO,UAAS;IAGhB,SAAS,SAAM;IAGf,SAAS,SAAW;IAGX,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACtC,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IACtC,aAAa,SAAM;IACnB,KAAK,SAAK;IACV,cAAc,UAAS;IACvB,cAAc,SAAM;IACpB,cAAc,SAAM;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,UAAU,SAAK;IACf,WAAW,SAAO;IAE3B,OAAO,CAAC,UAAU,CAAC,CAAiB;IAG3B,YAAY;IAIZ,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IA0BrC,oBAAoB;IAK7B,OAAO,CAAC,mBAAmB;IAY3B,IAAI,eAAe,IAAI,aAAa,EAAE,CAIrC;IAED,IAAI,eAAe,IAAI,aAAa,EAAE,CAErC;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA+B7C;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAK1C;IAED,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED,IAAI,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAc9G;IAGD,QAAQ,CAAC,gBAAgB,GAAI,GAAG,KAAK,UAEnC;IAGF,QAAQ,CAAC,qBAAqB,GAAI,MAAM,MAAM,UAK5C;IAGF,QAAQ,CAAC,gBAAgB,GAAI,UAAU,MAAM,EAAE,SAAS,OAAO,UAK7D;IAEF,QAAQ,CAAC,gBAAgB,GAAI,SAAS,OAAO,UAI3C;IAGF,QAAQ,CAAC,WAAW,GAAI,QAAQ,aAAa,UAY3C;IAGF,QAAQ,CAAC,gBAAgB,GAAI,GAAG,SAAS,EAAE,OAAO,MAAM,UAMtD;IAEF,QAAQ,CAAC,eAAe,GAAI,GAAG,SAAS,EAAE,OAAO,MAAM,UAIrD;IAEF,QAAQ,CAAC,gBAAgB,aAEvB;IAEF,QAAQ,CAAC,WAAW,GAAI,GAAG,SAAS,EAAE,SAAS,MAAM,UAkBnD;IAEF,QAAQ,CAAC,cAAc,aAGrB;IAGF,QAAQ,CAAC,gBAAgB,GAAI,KAAK,MAAM,UAEtC;IAEF,QAAQ,CAAC,aAAa,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,UAIlD;IAEF,QAAQ,CAAC,mBAAmB,GAAI,OAAO,MAAM,UAI3C;IAEF,QAAQ,CAAC,aAAa,aAKpB;IAEF,IAAI,iBAAiB,IAAI,OAAO,CAK/B;IAGD,QAAQ,CAAC,aAAa,GAAI,KAAK,MAAM,UAInC;IAGF,QAAQ,CAAC,SAAS,GAAI,MAAM,MAAM,UAGhC;IAGF,QAAQ,CAAC,aAAa,GAAI,QAAQ,aAAa,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,UAG1F;IAGF,OAAO,CAAC,KAAK;IAIJ,MAAM;CAGhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,gBAAgB,CAAC;KAC9B;CACF"}
@@ -1,92 +1,247 @@
1
- import { unsafeCSS as c, LitElement as y } from "lit";
2
- import { property as s, state as h, customElement as d } from "lit/decorators.js";
3
- import u from "./sp-table.css.js";
4
- import { tableTemplate as f } from "./sp-table.template.js";
5
- var m = Object.defineProperty, b = Object.getOwnPropertyDescriptor, t = (o, r, i, a) => {
6
- for (var p = a > 1 ? void 0 : a ? b(r, i) : r, l = o.length - 1, n; l >= 0; l--)
7
- (n = o[l]) && (p = (a ? n(r, i, p) : n(p)) || p);
8
- return a && p && m(r, i, p), p;
1
+ import { unsafeCSS as u, LitElement as g } from "lit";
2
+ import { property as l, state as p, customElement as f } from "lit/decorators.js";
3
+ import y from "./sp-table.css.js";
4
+ import { tableTemplate as m } from "./sp-table.template.js";
5
+ var S = Object.defineProperty, b = Object.getOwnPropertyDescriptor, i = (t, e, s, o) => {
6
+ for (var a = o > 1 ? void 0 : o ? b(e, s) : e, h = t.length - 1, n; h >= 0; h--)
7
+ (n = t[h]) && (a = (o ? n(e, s, a) : n(a)) || a);
8
+ return o && a && S(e, s, a), a;
9
9
  };
10
- let e = class extends y {
10
+ let r = class extends g {
11
11
  constructor() {
12
- super(...arguments), this.columns = [], this.data = [], this.loading = !1, this.bordered = !1, this.striped = !1, this.hoverable = !0, this.compact = !1, this.emptyText = "No data available", this.sortKey = "", this.sortDirection = "none", this.stickyHeader = !1, this.selectable = !1, this.caption = "", this.selectedRows = /* @__PURE__ */ new Set(), this._handleRowSelect = (o, r) => {
13
- const i = new Set(this.selectedRows);
14
- r ? i.add(o) : i.delete(o), this.selectedRows = i, this.dispatchEvent(
15
- new CustomEvent("sp-selection-change", {
16
- detail: { indices: Array.from(i) },
17
- bubbles: !0,
18
- composed: !0
19
- })
20
- );
21
- }, this._handleSelectAll = (o) => {
22
- const r = o ? new Set(this.data.map((i, a) => a)) : /* @__PURE__ */ new Set();
23
- this.selectedRows = r, this.dispatchEvent(
24
- new CustomEvent("sp-selection-change", {
25
- detail: { indices: Array.from(r) },
26
- bubbles: !0,
27
- composed: !0
28
- })
29
- );
30
- }, this._handleSort = (o) => {
31
- o.sortable && (this.sortKey === o.key ? (this.sortDirection = this.sortDirection === "asc" ? "desc" : this.sortDirection === "desc" ? "none" : "asc", this.sortDirection === "none" && (this.sortKey = "")) : (this.sortKey = o.key, this.sortDirection = "asc"), this.dispatchEvent(
32
- new CustomEvent("sp-sort", {
33
- detail: { key: this.sortKey, direction: this.sortDirection },
34
- bubbles: !0,
35
- composed: !0
36
- })
12
+ super(...arguments), this.columns = [], this.data = [], this.loading = !1, this.bordered = !1, this.striped = !1, this.hoverable = !0, this.compact = !1, this.emptyText = "No data available", this.sortKey = "", this.sortDirection = "none", this.stickyHeader = !1, this.selectable = !1, this.caption = "", this.reorderable = !1, this.searchable = !1, this.pageSize = 0, this.pageSizeOptions = [10, 25, 50, 100], this.actions = [], this.virtual = !1, this.rowHeight = 48, this.maxHeight = "400px", this.selectedRows = /* @__PURE__ */ new Set(), this._columnOrder = [], this._hiddenCols = /* @__PURE__ */ new Set(), this._filters = {}, this._globalSearch = "", this._page = 1, this._showColPicker = !1, this._dragOverIndex = -1, this._dragFromIndex = -1, this._openFilterCol = null, this._scrollTop = 0, this._containerH = 400, this._onVirtualScroll = (t) => {
13
+ this._scrollTop = t.target.scrollTop;
14
+ }, this._handlePageSizeChange = (t) => {
15
+ this.pageSize = t, this._page = 1, this.selectedRows = /* @__PURE__ */ new Set(), this._emit("sp-page-size-change", { pageSize: t });
16
+ }, this._handleRowSelect = (t, e) => {
17
+ const s = new Set(this.selectedRows);
18
+ e ? s.add(t) : s.delete(t), this.selectedRows = s, this._emit("sp-selection-change", { indices: Array.from(s) });
19
+ }, this._handleSelectAll = (t) => {
20
+ const e = t ? this._pagedData.map((s, o) => o) : [];
21
+ this.selectedRows = new Set(e), this._emit("sp-selection-change", { indices: e });
22
+ }, this._handleSort = (t) => {
23
+ t.sortable && (this.sortKey === t.key ? (this.sortDirection = this.sortDirection === "asc" ? "desc" : this.sortDirection === "desc" ? "none" : "asc", this.sortDirection === "none" && (this.sortKey = "")) : (this.sortKey = t.key, this.sortDirection = "asc"), this._page = 1, this._emit("sp-sort", { key: this.sortKey, direction: this.sortDirection }));
24
+ }, this._handleDragStart = (t, e) => {
25
+ this._dragFromIndex = e, t.dataTransfer && (t.dataTransfer.effectAllowed = "move", t.dataTransfer.setData("text/plain", String(e)));
26
+ }, this._handleDragOver = (t, e) => {
27
+ t.preventDefault(), t.dataTransfer && (t.dataTransfer.dropEffect = "move"), this._dragOverIndex = e;
28
+ }, this._handleDragLeave = () => {
29
+ this._dragOverIndex = -1;
30
+ }, this._handleDrop = (t, e) => {
31
+ var d, _;
32
+ if (t.preventDefault(), this._dragOverIndex = -1, this._dragFromIndex === -1 || this._dragFromIndex === e) return;
33
+ const s = [...this._columnOrder], o = this._orderedColumns, a = (d = o[this._dragFromIndex]) == null ? void 0 : d.key, h = (_ = o[e]) == null ? void 0 : _.key;
34
+ if (!a || !h) return;
35
+ const n = s.indexOf(a), c = s.indexOf(h);
36
+ n === -1 || c === -1 || (s.splice(n, 1), s.splice(c, 0, a), this._columnOrder = s, this._dragFromIndex = -1, this._emit("sp-column-reorder", { order: s }));
37
+ }, this._handleDragEnd = () => {
38
+ this._dragFromIndex = -1, this._dragOverIndex = -1;
39
+ }, this._toggleFilterCol = (t) => {
40
+ this._openFilterCol = this._openFilterCol === t ? null : t;
41
+ }, this._handleFilter = (t, e) => {
42
+ this._filters = { ...this._filters, [t]: e }, this._page = 1, this.selectedRows = /* @__PURE__ */ new Set();
43
+ }, this._handleGlobalSearch = (t) => {
44
+ this._globalSearch = t, this._page = 1, this.selectedRows = /* @__PURE__ */ new Set();
45
+ }, this._clearFilters = () => {
46
+ this._filters = {}, this._globalSearch = "", this._page = 1, this.selectedRows = /* @__PURE__ */ new Set();
47
+ }, this._toggleColumn = (t) => {
48
+ const e = new Set(this._hiddenCols);
49
+ e.has(t) ? e.delete(t) : e.add(t), this._hiddenCols = e;
50
+ }, this._goToPage = (t) => {
51
+ this._page = Math.max(1, Math.min(t, this._totalPages)), this.selectedRows = /* @__PURE__ */ new Set();
52
+ }, this._handleAction = (t, e, s) => {
53
+ t.onClick(e, s), this._emit("sp-row-action", { action: t.label, row: e, index: s });
54
+ };
55
+ }
56
+ // ── Lifecycle ─────────────────────────────────────────────
57
+ firstUpdated() {
58
+ this.virtual && this._setupVirtualScroll();
59
+ }
60
+ updated(t) {
61
+ if (t.has("columns")) {
62
+ const e = this._columnOrder, s = this.columns.map((n) => n.key), o = e.filter((n) => s.includes(n)), a = s.filter((n) => !o.includes(n));
63
+ this._columnOrder = [...o, ...a];
64
+ const h = new Set(this._hiddenCols);
65
+ this.columns.forEach((n) => {
66
+ n.hidden && h.add(n.key);
67
+ }), this._hiddenCols = h, this._page = 1;
68
+ }
69
+ t.has("data") && (this._page = 1, this.selectedRows = /* @__PURE__ */ new Set()), t.has("virtual") && this.virtual && this._setupVirtualScroll();
70
+ }
71
+ disconnectedCallback() {
72
+ var t;
73
+ super.disconnectedCallback(), (t = this._resizeObs) == null || t.disconnect();
74
+ }
75
+ _setupVirtualScroll() {
76
+ const t = this.renderRoot.querySelector(".sp-table-wrapper");
77
+ t && (this._containerH = t.clientHeight || 400, this._resizeObs = new ResizeObserver((e) => {
78
+ var o;
79
+ const s = (o = e[0]) == null ? void 0 : o.contentRect.height;
80
+ s && s > 0 && (this._containerH = s);
81
+ }), this._resizeObs.observe(t));
82
+ }
83
+ // ── Derived getters ───────────────────────────────────────
84
+ get _orderedColumns() {
85
+ if (!this._columnOrder.length) return this.columns;
86
+ const t = new Map(this.columns.map((e) => [e.key, e]));
87
+ return this._columnOrder.map((e) => t.get(e)).filter(Boolean);
88
+ }
89
+ get _visibleColumns() {
90
+ return this._orderedColumns.filter((t) => !this._hiddenCols.has(t.key));
91
+ }
92
+ get _filteredData() {
93
+ let t = this.data;
94
+ const e = this._globalSearch.trim().toLowerCase();
95
+ e && (t = t.filter(
96
+ (s) => Object.values(s).some((o) => String(o ?? "").toLowerCase().includes(e))
97
+ ));
98
+ for (const [s, o] of Object.entries(this._filters)) {
99
+ const a = o.trim().toLowerCase();
100
+ a && (t = t.filter(
101
+ (h) => String(h[s] ?? "").toLowerCase().includes(a)
37
102
  ));
103
+ }
104
+ if (this.sortKey && this.sortDirection !== "none") {
105
+ const s = this.sortDirection === "asc" ? 1 : -1;
106
+ t = [...t].sort((o, a) => {
107
+ const h = String(o[this.sortKey] ?? ""), n = String(a[this.sortKey] ?? "");
108
+ return h.localeCompare(n, void 0, { numeric: !0, sensitivity: "base" }) * s;
109
+ });
110
+ }
111
+ return t;
112
+ }
113
+ get _pagedData() {
114
+ if (this.virtual) return this._filteredData;
115
+ if (!this.pageSize) return this._filteredData;
116
+ const t = (this._page - 1) * this.pageSize;
117
+ return this._filteredData.slice(t, t + this.pageSize);
118
+ }
119
+ get _totalPages() {
120
+ return this.pageSize ? Math.max(1, Math.ceil(this._filteredData.length / this.pageSize)) : 1;
121
+ }
122
+ get _virtualSlice() {
123
+ const t = this._filteredData, e = t.length, s = this.rowHeight, o = 3, a = Math.max(0, Math.floor(this._scrollTop / s) - o), h = Math.ceil((this._containerH || 400) / s) + o * 2, n = Math.min(e, a + h);
124
+ return {
125
+ rows: t.slice(a, n),
126
+ startIndex: a,
127
+ topPad: a * s,
128
+ bottomPad: Math.max(0, (e - n) * s)
38
129
  };
39
130
  }
131
+ get _hasActiveFilters() {
132
+ return !!this._globalSearch.trim() || Object.values(this._filters).some((t) => !!t.trim());
133
+ }
134
+ // ── Helpers ───────────────────────────────────────────────
135
+ _emit(t, e) {
136
+ this.dispatchEvent(new CustomEvent(t, { detail: e, bubbles: !0, composed: !0 }));
137
+ }
40
138
  render() {
41
- return f.call(this);
139
+ return m.call(this);
42
140
  }
43
141
  };
44
- e.styles = c(u);
45
- t([
46
- s({ type: Array })
47
- ], e.prototype, "columns", 2);
48
- t([
49
- s({ type: Array })
50
- ], e.prototype, "data", 2);
51
- t([
52
- s({ type: Boolean, reflect: !0 })
53
- ], e.prototype, "loading", 2);
54
- t([
55
- s({ type: Boolean, reflect: !0 })
56
- ], e.prototype, "bordered", 2);
57
- t([
58
- s({ type: Boolean, reflect: !0 })
59
- ], e.prototype, "striped", 2);
60
- t([
61
- s({ type: Boolean, reflect: !0 })
62
- ], e.prototype, "hoverable", 2);
63
- t([
64
- s({ type: Boolean, reflect: !0 })
65
- ], e.prototype, "compact", 2);
66
- t([
67
- s({ type: String })
68
- ], e.prototype, "emptyText", 2);
69
- t([
70
- s({ type: String })
71
- ], e.prototype, "sortKey", 2);
72
- t([
73
- s({ type: String })
74
- ], e.prototype, "sortDirection", 2);
75
- t([
76
- s({ type: Boolean, reflect: !0, attribute: "sticky-header" })
77
- ], e.prototype, "stickyHeader", 2);
78
- t([
79
- s({ type: Boolean, reflect: !0 })
80
- ], e.prototype, "selectable", 2);
81
- t([
82
- s({ type: String })
83
- ], e.prototype, "caption", 2);
84
- t([
85
- h()
86
- ], e.prototype, "selectedRows", 2);
87
- e = t([
88
- d("sp-table")
89
- ], e);
142
+ r.styles = u(y);
143
+ i([
144
+ l({ type: Array })
145
+ ], r.prototype, "columns", 2);
146
+ i([
147
+ l({ type: Array })
148
+ ], r.prototype, "data", 2);
149
+ i([
150
+ l({ type: Boolean, reflect: !0 })
151
+ ], r.prototype, "loading", 2);
152
+ i([
153
+ l({ type: Boolean, reflect: !0 })
154
+ ], r.prototype, "bordered", 2);
155
+ i([
156
+ l({ type: Boolean, reflect: !0 })
157
+ ], r.prototype, "striped", 2);
158
+ i([
159
+ l({ type: Boolean, reflect: !0 })
160
+ ], r.prototype, "hoverable", 2);
161
+ i([
162
+ l({ type: Boolean, reflect: !0 })
163
+ ], r.prototype, "compact", 2);
164
+ i([
165
+ l({ type: String })
166
+ ], r.prototype, "emptyText", 2);
167
+ i([
168
+ l({ type: String })
169
+ ], r.prototype, "sortKey", 2);
170
+ i([
171
+ l({ type: String })
172
+ ], r.prototype, "sortDirection", 2);
173
+ i([
174
+ l({ type: Boolean, reflect: !0, attribute: "sticky-header" })
175
+ ], r.prototype, "stickyHeader", 2);
176
+ i([
177
+ l({ type: Boolean, reflect: !0 })
178
+ ], r.prototype, "selectable", 2);
179
+ i([
180
+ l({ type: String })
181
+ ], r.prototype, "caption", 2);
182
+ i([
183
+ l({ type: Boolean, reflect: !0 })
184
+ ], r.prototype, "reorderable", 2);
185
+ i([
186
+ l({ type: Boolean, reflect: !0 })
187
+ ], r.prototype, "searchable", 2);
188
+ i([
189
+ l({ type: Number, attribute: "page-size" })
190
+ ], r.prototype, "pageSize", 2);
191
+ i([
192
+ l({ type: Array, attribute: "page-size-options" })
193
+ ], r.prototype, "pageSizeOptions", 2);
194
+ i([
195
+ l({ type: Array })
196
+ ], r.prototype, "actions", 2);
197
+ i([
198
+ l({ type: Boolean, reflect: !0 })
199
+ ], r.prototype, "virtual", 2);
200
+ i([
201
+ l({ type: Number, attribute: "row-height" })
202
+ ], r.prototype, "rowHeight", 2);
203
+ i([
204
+ l({ type: String, attribute: "max-height" })
205
+ ], r.prototype, "maxHeight", 2);
206
+ i([
207
+ p()
208
+ ], r.prototype, "selectedRows", 2);
209
+ i([
210
+ p()
211
+ ], r.prototype, "_columnOrder", 2);
212
+ i([
213
+ p()
214
+ ], r.prototype, "_hiddenCols", 2);
215
+ i([
216
+ p()
217
+ ], r.prototype, "_filters", 2);
218
+ i([
219
+ p()
220
+ ], r.prototype, "_globalSearch", 2);
221
+ i([
222
+ p()
223
+ ], r.prototype, "_page", 2);
224
+ i([
225
+ p()
226
+ ], r.prototype, "_showColPicker", 2);
227
+ i([
228
+ p()
229
+ ], r.prototype, "_dragOverIndex", 2);
230
+ i([
231
+ p()
232
+ ], r.prototype, "_dragFromIndex", 2);
233
+ i([
234
+ p()
235
+ ], r.prototype, "_openFilterCol", 2);
236
+ i([
237
+ p()
238
+ ], r.prototype, "_scrollTop", 2);
239
+ i([
240
+ p()
241
+ ], r.prototype, "_containerH", 2);
242
+ r = i([
243
+ f("sp-table")
244
+ ], r);
90
245
  export {
91
- e as SpTableComponent
246
+ r as SpTableComponent
92
247
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sp-table.template.d.ts","sourceRoot":"","sources":["../../../src/components/table/sp-table.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CA4HpE"}
1
+ {"version":3,"file":"sp-table.template.d.ts","sourceRoot":"","sources":["../../../src/components/table/sp-table.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CA8apE"}