@sellmate/design-system 0.0.48 → 0.0.50

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 (235) hide show
  1. package/dist/cjs/design-system.cjs.js +2 -2
  2. package/dist/cjs/{index-DXo1Fhkn.js → index-Bxead0A0.js} +4 -2
  3. package/dist/cjs/{index-DXo1Fhkn.js.map → index-Bxead0A0.js.map} +1 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/{esm/color-CgyTlXBV.js → cjs/resolveColor-DxvExwgo.js} +17 -4
  6. package/dist/{esm/resolveColor-CswQ9y2Q.js.map → cjs/resolveColor-DxvExwgo.js.map} +1 -1
  7. package/dist/cjs/sd-badge.cjs.entry.js +3 -4
  8. package/dist/cjs/sd-badge.entry.cjs.js.map +1 -1
  9. package/dist/cjs/sd-button.sd-checkbox.sd-guide.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-radio-group.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.cjs.js.map +1 -0
  10. package/dist/cjs/{sd-button_12.cjs.entry.js → sd-button_14.cjs.entry.js} +356 -105
  11. package/dist/cjs/sd-card.cjs.entry.js +2 -2
  12. package/dist/cjs/sd-date-box.cjs.entry.js +1 -1
  13. package/dist/cjs/sd-date-picker.cjs.entry.js +2 -2
  14. package/dist/cjs/sd-date-range-picker.cjs.entry.js +3 -3
  15. package/dist/cjs/sd-modal-card.cjs.entry.js +2 -3
  16. package/dist/cjs/sd-modal-card.entry.cjs.js.map +1 -1
  17. package/dist/cjs/sd-popover.cjs.entry.js +4 -4
  18. package/dist/cjs/sd-progress.cjs.entry.js +3 -3
  19. package/dist/cjs/sd-select-multiple-group.cjs.entry.js +1 -1
  20. package/dist/cjs/sd-select-multiple.cjs.entry.js +3 -3
  21. package/dist/cjs/sd-select-option-group.cjs.entry.js +4 -4
  22. package/dist/cjs/sd-table.cjs.entry.js +1 -1
  23. package/dist/cjs/sd-tag.cjs.entry.js +2 -2
  24. package/dist/cjs/sd-tbody_3.cjs.entry.js +4 -4
  25. package/dist/cjs/sd-td.cjs.entry.js +3 -3
  26. package/dist/cjs/{tooltipArrow-DNiGFQNW.js → tooltipArrow-C7cIAuTo.js} +3 -3
  27. package/dist/cjs/{tooltipArrow-DNiGFQNW.js.map → tooltipArrow-C7cIAuTo.js.map} +1 -1
  28. package/dist/collection/collection-manifest.json +1 -0
  29. package/dist/collection/components/sd-badge/sd-badge.js +1 -1
  30. package/dist/collection/components/sd-card/sd-card.js +1 -1
  31. package/dist/collection/components/sd-date-picker/sd-date-picker.js +1 -1
  32. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker.js +2 -2
  33. package/dist/collection/components/sd-guide/sd-guide.js +3 -3
  34. package/dist/collection/components/sd-icon/sd-icon.js +1 -1
  35. package/dist/collection/components/sd-input/sd-input.js +2 -2
  36. package/dist/collection/components/sd-loading-spinner/sd-loading-spinner.js +1 -1
  37. package/dist/collection/components/sd-pagination/sd-pagination.js +2 -2
  38. package/dist/collection/components/sd-popover/sd-popover.js +2 -2
  39. package/dist/collection/components/sd-portal/sd-portal.js +1 -1
  40. package/dist/collection/components/sd-progress/sd-progress.js +2 -2
  41. package/dist/collection/components/sd-radio-group/sd-radio-group.css +76 -0
  42. package/dist/collection/components/sd-radio-group/sd-radio-group.js +214 -0
  43. package/dist/collection/components/sd-radio-group/sd-radio-group.js.map +1 -0
  44. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js +1 -1
  45. package/dist/collection/components/sd-select-multiple/sd-select-multiple.js +2 -2
  46. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js +3 -3
  47. package/dist/collection/components/sd-table/sd-tbody/sd-tbody.js +1 -1
  48. package/dist/collection/components/sd-table/sd-td/sd-td.js +2 -2
  49. package/dist/collection/components/sd-table/sd-th/sd-th.js +1 -1
  50. package/dist/collection/components/sd-table/sd-tr/sd-tr.js +1 -1
  51. package/dist/collection/components/sd-table-backup/sd-table-backup.css +17 -15
  52. package/dist/collection/components/sd-table-backup/sd-table-backup.js +194 -87
  53. package/dist/collection/components/sd-table-backup/sd-table-backup.js.map +1 -1
  54. package/dist/collection/components/sd-tag/sd-tag.js +1 -1
  55. package/dist/collection/components/sd-tooltip/sd-tooltip.js +4 -4
  56. package/dist/collection/components/sd-tooltip-portal/sd-tooltip-portal.js +1 -1
  57. package/dist/components/index.js +1 -1
  58. package/dist/components/{p-lS2AF6uZ.js → p-BIw-hGVo.js} +6 -6
  59. package/dist/components/{p-lS2AF6uZ.js.map → p-BIw-hGVo.js.map} +1 -1
  60. package/dist/components/{p-DsXAGqf9.js → p-BSUHSOXX.js} +4 -4
  61. package/dist/components/{p-DsXAGqf9.js.map → p-BSUHSOXX.js.map} +1 -1
  62. package/dist/components/{p-C9qV_qzP.js → p-BozMKCTh.js} +6 -6
  63. package/dist/components/{p-C9qV_qzP.js.map → p-BozMKCTh.js.map} +1 -1
  64. package/dist/components/{p-BvuTaRpn.js → p-BpNH68jy.js} +3 -3
  65. package/dist/components/{p-BvuTaRpn.js.map → p-BpNH68jy.js.map} +1 -1
  66. package/dist/components/{p-Cb33bhDR.js → p-C0CLTo3o.js} +4 -4
  67. package/dist/components/{p-Cb33bhDR.js.map → p-C0CLTo3o.js.map} +1 -1
  68. package/dist/components/{p-BlDZogGu.js → p-C171iavd.js} +4 -4
  69. package/dist/components/{p-BlDZogGu.js.map → p-C171iavd.js.map} +1 -1
  70. package/dist/components/{p-CIkSynaQ.js → p-C930Kn80.js} +4 -4
  71. package/dist/components/{p-CIkSynaQ.js.map → p-C930Kn80.js.map} +1 -1
  72. package/dist/components/{p-DWfls6IE.js → p-Cq-Qitdj.js} +11 -11
  73. package/dist/components/{p-DWfls6IE.js.map → p-Cq-Qitdj.js.map} +1 -1
  74. package/dist/components/{p-D2rvzY8X.js → p-D2YMmHfl.js} +4 -4
  75. package/dist/components/{p-D2rvzY8X.js.map → p-D2YMmHfl.js.map} +1 -1
  76. package/dist/components/{p-B6GiEilD.js → p-D2aGA3BX.js} +4 -4
  77. package/dist/components/{p-B6GiEilD.js.map → p-D2aGA3BX.js.map} +1 -1
  78. package/dist/components/{p-t7JZlmXM.js → p-D8f0ASS6.js} +4 -4
  79. package/dist/components/{p-t7JZlmXM.js.map → p-D8f0ASS6.js.map} +1 -1
  80. package/dist/components/{p-CMcI4ZlP.js → p-DC5fpNnQ.js} +4 -4
  81. package/dist/components/{p-CMcI4ZlP.js.map → p-DC5fpNnQ.js.map} +1 -1
  82. package/dist/components/{p-Cafw-qR4.js → p-DY6t0qQj.js} +3 -3
  83. package/dist/components/{p-Cafw-qR4.js.map → p-DY6t0qQj.js.map} +1 -1
  84. package/dist/components/{p-DCDoqfn8.js → p-LziGti_p.js} +4 -4
  85. package/dist/components/{p-DCDoqfn8.js.map → p-LziGti_p.js.map} +1 -1
  86. package/dist/components/{p-WhZES_rm.js → p-RZm_wGW3.js} +6 -6
  87. package/dist/components/{p-WhZES_rm.js.map → p-RZm_wGW3.js.map} +1 -1
  88. package/dist/components/{p-CbnL1UUF.js → p-TFWJruz2.js} +4 -3
  89. package/dist/components/p-TFWJruz2.js.map +1 -0
  90. package/dist/components/{p-Bn_wuPsh.js → p-X8rQBuZk.js} +8 -8
  91. package/dist/components/{p-Bn_wuPsh.js.map → p-X8rQBuZk.js.map} +1 -1
  92. package/dist/components/{p-BBhUxTuK.js → p-_spt_8fG.js} +9 -9
  93. package/dist/components/{p-BBhUxTuK.js.map → p-_spt_8fG.js.map} +1 -1
  94. package/dist/components/{p-wA4KCOG0.js → p-gnOKrd57.js} +3 -3
  95. package/dist/components/{p-wA4KCOG0.js.map → p-gnOKrd57.js.map} +1 -1
  96. package/dist/components/sd-badge.js +2 -2
  97. package/dist/components/sd-button.js +1 -1
  98. package/dist/components/sd-card.js +2 -2
  99. package/dist/components/sd-checkbox.js +1 -1
  100. package/dist/components/sd-date-box.js +1 -1
  101. package/dist/components/sd-date-picker.js +6 -6
  102. package/dist/components/sd-date-range-picker.js +7 -7
  103. package/dist/components/sd-guide.js +7 -7
  104. package/dist/components/sd-icon.js +1 -1
  105. package/dist/components/sd-input.js +1 -1
  106. package/dist/components/sd-loading-spinner.js +1 -1
  107. package/dist/components/sd-modal-card.js +3 -3
  108. package/dist/components/sd-pagination.js +1 -1
  109. package/dist/components/sd-popover.js +7 -7
  110. package/dist/components/sd-portal.js +1 -1
  111. package/dist/components/sd-progress.js +3 -3
  112. package/dist/components/sd-radio-group.d.ts +11 -0
  113. package/dist/components/sd-radio-group.js +99 -0
  114. package/dist/components/sd-radio-group.js.map +1 -0
  115. package/dist/components/sd-select-multiple-group.js +7 -7
  116. package/dist/components/sd-select-multiple.js +9 -9
  117. package/dist/components/sd-select-option-group.js +1 -1
  118. package/dist/components/sd-select-option.js +1 -1
  119. package/dist/components/sd-select.js +1 -1
  120. package/dist/components/sd-table-backup.js +206 -99
  121. package/dist/components/sd-table-backup.js.map +1 -1
  122. package/dist/components/sd-table.js +14 -14
  123. package/dist/components/sd-tag.js +2 -2
  124. package/dist/components/sd-tbody.js +1 -1
  125. package/dist/components/sd-td.js +3 -3
  126. package/dist/components/sd-th.js +1 -1
  127. package/dist/components/sd-tooltip-portal.js +1 -1
  128. package/dist/components/sd-tooltip.js +1 -1
  129. package/dist/components/sd-tr.js +1 -1
  130. package/dist/design-system/design-system.esm.js +1 -1
  131. package/dist/design-system/{p-390283f7.entry.js → p-037de6ce.entry.js} +2 -2
  132. package/dist/design-system/p-154958ba.entry.js +2 -0
  133. package/dist/design-system/p-1b6aec43.entry.js +2 -0
  134. package/dist/design-system/{p-ce8fe1fd.entry.js → p-1e175d35.entry.js} +2 -2
  135. package/dist/design-system/{p-826c6517.entry.js → p-2285c061.entry.js} +2 -2
  136. package/dist/design-system/p-24ef1055.entry.js +2 -0
  137. package/dist/design-system/p-24ef1055.entry.js.map +1 -0
  138. package/dist/design-system/{p-d4b5575e.entry.js → p-267985b3.entry.js} +2 -2
  139. package/dist/design-system/p-328d7e6c.entry.js +2 -0
  140. package/dist/design-system/p-4828e65b.entry.js +2 -0
  141. package/dist/design-system/{p-871c8d66.entry.js → p-6d81e6f8.entry.js} +2 -2
  142. package/dist/design-system/p-6f16399e.entry.js +2 -0
  143. package/dist/design-system/{p-6320b9c6.entry.js.map → p-6f16399e.entry.js.map} +1 -1
  144. package/dist/design-system/{p-3574f319.entry.js → p-8d1a2a13.entry.js} +2 -2
  145. package/dist/design-system/{p-CgyTlXBV.js → p-BYf-ybt2.js} +2 -2
  146. package/dist/design-system/{p-BoLmB6pG.js.map → p-BYf-ybt2.js.map} +1 -1
  147. package/dist/design-system/p-ClyGLKUd.js +3 -0
  148. package/dist/design-system/{p-B2T3tS5r.js.map → p-ClyGLKUd.js.map} +1 -1
  149. package/dist/design-system/p-DXZjHQmQ.js +2 -0
  150. package/dist/design-system/{p-BE6EMCXm.js.map → p-DXZjHQmQ.js.map} +1 -1
  151. package/dist/design-system/p-a73bb448.entry.js +2 -0
  152. package/dist/design-system/p-a73bb448.entry.js.map +1 -0
  153. package/dist/design-system/p-b892a722.entry.js +2 -0
  154. package/dist/design-system/p-b892a722.entry.js.map +1 -0
  155. package/dist/design-system/{p-8734ded6.entry.js → p-c7e8a2c0.entry.js} +2 -2
  156. package/dist/design-system/p-ecb38b6a.entry.js +2 -0
  157. package/dist/design-system/{p-db0f705b.entry.js.map → p-ecb38b6a.entry.js.map} +1 -1
  158. package/dist/design-system/sd-badge.entry.esm.js.map +1 -1
  159. package/dist/design-system/sd-button.sd-checkbox.sd-guide.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-radio-group.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.esm.js.map +1 -0
  160. package/dist/design-system/sd-modal-card.entry.esm.js.map +1 -1
  161. package/dist/esm/design-system.js +3 -3
  162. package/dist/esm/{index-B2T3tS5r.js → index-ClyGLKUd.js} +4 -3
  163. package/dist/esm/{index-B2T3tS5r.js.map → index-ClyGLKUd.js.map} +1 -1
  164. package/dist/esm/loader.js +3 -3
  165. package/dist/{cjs/color-Oz29vj7L.js → esm/resolveColor-BYf-ybt2.js} +14 -6
  166. package/dist/{cjs/resolveColor-CauSLF0s.js.map → esm/resolveColor-BYf-ybt2.js.map} +1 -1
  167. package/dist/esm/sd-badge.entry.js +3 -4
  168. package/dist/esm/sd-badge.entry.js.map +1 -1
  169. package/dist/esm/sd-button.sd-checkbox.sd-guide.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-radio-group.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.js.map +1 -0
  170. package/dist/esm/{sd-button_12.entry.js → sd-button_14.entry.js} +355 -106
  171. package/dist/esm/sd-card.entry.js +2 -2
  172. package/dist/esm/sd-date-box.entry.js +1 -1
  173. package/dist/esm/sd-date-picker.entry.js +2 -2
  174. package/dist/esm/sd-date-range-picker.entry.js +3 -3
  175. package/dist/esm/sd-modal-card.entry.js +2 -3
  176. package/dist/esm/sd-modal-card.entry.js.map +1 -1
  177. package/dist/esm/sd-popover.entry.js +4 -4
  178. package/dist/esm/sd-progress.entry.js +3 -3
  179. package/dist/esm/sd-select-multiple-group.entry.js +1 -1
  180. package/dist/esm/sd-select-multiple.entry.js +3 -3
  181. package/dist/esm/sd-select-option-group.entry.js +4 -4
  182. package/dist/esm/sd-table.entry.js +1 -1
  183. package/dist/esm/sd-tag.entry.js +2 -2
  184. package/dist/esm/sd-tbody_3.entry.js +4 -4
  185. package/dist/esm/sd-td.entry.js +3 -3
  186. package/dist/esm/{tooltipArrow-Pa2XQhpp.js → tooltipArrow-BwO7_hdW.js} +3 -3
  187. package/dist/esm/{tooltipArrow-Pa2XQhpp.js.map → tooltipArrow-BwO7_hdW.js.map} +1 -1
  188. package/dist/types/components/sd-radio-group/sd-radio-group.d.ts +24 -0
  189. package/dist/types/components/sd-table-backup/sd-table-backup.d.ts +15 -0
  190. package/dist/types/components.d.ts +59 -0
  191. package/hydrate/index.js +320 -123
  192. package/hydrate/index.mjs +320 -123
  193. package/package.json +95 -95
  194. package/dist/cjs/color-Oz29vj7L.js.map +0 -1
  195. package/dist/cjs/resolveColor-CauSLF0s.js +0 -18
  196. package/dist/cjs/sd-button.sd-checkbox.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.cjs.js.map +0 -1
  197. package/dist/cjs/sd-guide.cjs.entry.js +0 -85
  198. package/dist/cjs/sd-guide.entry.cjs.js.map +0 -1
  199. package/dist/components/p-CbnL1UUF.js.map +0 -1
  200. package/dist/design-system/p-043b7fd1.entry.js +0 -2
  201. package/dist/design-system/p-043b7fd1.entry.js.map +0 -1
  202. package/dist/design-system/p-059ca6cb.entry.js +0 -2
  203. package/dist/design-system/p-0d776157.entry.js +0 -2
  204. package/dist/design-system/p-0d776157.entry.js.map +0 -1
  205. package/dist/design-system/p-4386db36.entry.js +0 -2
  206. package/dist/design-system/p-4386db36.entry.js.map +0 -1
  207. package/dist/design-system/p-6320b9c6.entry.js +0 -2
  208. package/dist/design-system/p-7b4fe5bf.entry.js +0 -2
  209. package/dist/design-system/p-7e8db11c.entry.js +0 -2
  210. package/dist/design-system/p-B2T3tS5r.js +0 -3
  211. package/dist/design-system/p-BE6EMCXm.js +0 -2
  212. package/dist/design-system/p-BoLmB6pG.js +0 -2
  213. package/dist/design-system/p-CgyTlXBV.js.map +0 -1
  214. package/dist/design-system/p-d4e043c5.entry.js +0 -2
  215. package/dist/design-system/p-db0f705b.entry.js +0 -2
  216. package/dist/design-system/p-f9d01bdb.entry.js +0 -2
  217. package/dist/design-system/p-f9d01bdb.entry.js.map +0 -1
  218. package/dist/design-system/sd-button.sd-checkbox.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.esm.js.map +0 -1
  219. package/dist/design-system/sd-guide.entry.esm.js.map +0 -1
  220. package/dist/esm/color-CgyTlXBV.js.map +0 -1
  221. package/dist/esm/resolveColor-CswQ9y2Q.js +0 -16
  222. package/dist/esm/sd-button.sd-checkbox.sd-icon.sd-input.sd-loading-spinner.sd-pagination.sd-portal.sd-select.sd-select-option.sd-table-backup.sd-tooltip.sd-tooltip-portal.entry.js.map +0 -1
  223. package/dist/esm/sd-guide.entry.js +0 -83
  224. package/dist/esm/sd-guide.entry.js.map +0 -1
  225. /package/dist/design-system/{p-390283f7.entry.js.map → p-037de6ce.entry.js.map} +0 -0
  226. /package/dist/design-system/{p-059ca6cb.entry.js.map → p-154958ba.entry.js.map} +0 -0
  227. /package/dist/design-system/{p-7b4fe5bf.entry.js.map → p-1b6aec43.entry.js.map} +0 -0
  228. /package/dist/design-system/{p-ce8fe1fd.entry.js.map → p-1e175d35.entry.js.map} +0 -0
  229. /package/dist/design-system/{p-826c6517.entry.js.map → p-2285c061.entry.js.map} +0 -0
  230. /package/dist/design-system/{p-d4b5575e.entry.js.map → p-267985b3.entry.js.map} +0 -0
  231. /package/dist/design-system/{p-7e8db11c.entry.js.map → p-328d7e6c.entry.js.map} +0 -0
  232. /package/dist/design-system/{p-d4e043c5.entry.js.map → p-4828e65b.entry.js.map} +0 -0
  233. /package/dist/design-system/{p-871c8d66.entry.js.map → p-6d81e6f8.entry.js.map} +0 -0
  234. /package/dist/design-system/{p-3574f319.entry.js.map → p-8d1a2a13.entry.js.map} +0 -0
  235. /package/dist/design-system/{p-8734ded6.entry.js.map → p-c7e8a2c0.entry.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { h, Host, } from "@stencil/core";
1
+ import { h, Host, readTask, } from "@stencil/core";
2
2
  export class SdTable {
3
3
  el;
4
4
  columns;
@@ -50,6 +50,7 @@ export class SdTable {
50
50
  virtualStartColIdx = 0;
51
51
  virtualEndColIdx = 0;
52
52
  scrollLeftPosition = 0;
53
+ // 가상 스크롤 Raf(Request Animation Frame) 관리
53
54
  scrollRequestAnimationFrame = null;
54
55
  scrollContainer = null;
55
56
  rafScheduled = false;
@@ -57,19 +58,39 @@ export class SdTable {
57
58
  vertical: false,
58
59
  horizontal: false,
59
60
  };
61
+ // 상태 캐시값
62
+ cachedVisibleColumns = null;
63
+ lastColumnsRef = null;
64
+ cachedVirtualRows = null;
65
+ cachedVirtualIndexKey = '';
66
+ cachedColumnOrder = null;
67
+ lastColumnOrderKey = '';
68
+ // DOM 측정 캐시값
69
+ cachedContainerHeight = 0;
70
+ cachedContainerWidth = 0;
71
+ // 스타일 캐시
72
+ stickyStyleCache = new Map();
73
+ // isAllChecked 캐시
74
+ cachedIsAllChecked;
75
+ lastSelectionKey = '';
76
+ onScroll;
60
77
  handleColumnsChange(newCols) {
61
78
  this.columnWidths = newCols.map(c => parseInt(c.width || '120', 10));
79
+ this.cleanUpVirtualCache();
80
+ this.stickyStyleCache.clear();
62
81
  if (this.useVirtualScroll.horizontal) {
63
82
  this.scheduleUpdate('horizontal');
64
83
  }
65
84
  }
66
85
  handleColumnWidthsChange() {
86
+ this.stickyStyleCache.clear();
67
87
  if (this.useVirtualScroll.horizontal) {
68
88
  this.scheduleUpdate('horizontal');
69
89
  }
70
90
  }
71
91
  handleRowsChange(newRows) {
72
92
  this.innerRows = [...newRows];
93
+ this.cleanUpVirtualCache();
73
94
  if (this.useVirtualScroll.vertical) {
74
95
  this.scheduleUpdate('vertical');
75
96
  }
@@ -77,11 +98,19 @@ export class SdTable {
77
98
  handleSelectedChange(newSelected) {
78
99
  this.innerSelected = new Set(newSelected);
79
100
  }
101
+ cleanUpVirtualCache() {
102
+ this.cachedVisibleColumns = null;
103
+ this.lastColumnsRef = null;
104
+ this.cachedVirtualRows = null;
105
+ this.cachedVirtualIndexKey = '';
106
+ this.cachedColumnOrder = null;
107
+ this.lastColumnOrderKey = '';
108
+ }
80
109
  handlePaginationChange(newVal) {
81
110
  if (newVal?.page && newVal.page !== this.currentPage) {
82
111
  this.currentPage = newVal.page;
83
112
  if (this.useVirtualScroll.vertical && this.scrollContainer) {
84
- this.scrollContainer.scrollTop = 0;
113
+ this.scrollContainer.scrollTo({ top: 0, behavior: 'instant' });
85
114
  this.scrollTopPosition = 0;
86
115
  this.calculateVisibleRange();
87
116
  }
@@ -96,66 +125,126 @@ export class SdTable {
96
125
  }
97
126
  }
98
127
  componentDidLoad() {
99
- // SSR 환경 체크
100
- if (typeof window === 'undefined')
101
- return;
102
- const middle = this.el.querySelector('.sd-table__middle');
103
- if (!middle)
104
- return;
105
- this.scrollContainer = middle;
106
- const onScroll = () => {
107
- const { scrollLeft, scrollWidth, clientWidth, scrollTop } = middle;
108
- this.scrolledLeft = scrollLeft > 0;
109
- this.scrolledRight = scrollLeft + clientWidth < scrollWidth;
110
- // 실제 변경사항이 있을 때만 RAF 스케줄
111
- const verticalChanged = this.useVirtualScroll.vertical && this.scrollTopPosition !== scrollTop;
112
- const horizontalChanged = this.useVirtualScroll.horizontal && this.scrollLeftPosition !== scrollLeft;
113
- if (verticalChanged || horizontalChanged) {
114
- if (this.scrollRequestAnimationFrame !== null) {
115
- cancelAnimationFrame(this.scrollRequestAnimationFrame);
128
+ readTask(() => {
129
+ const middle = this.el.querySelector('.sd-table__middle');
130
+ if (!middle)
131
+ return;
132
+ this.onScroll = () => {
133
+ const scrollLeft = middle.scrollLeft;
134
+ const scrollWidth = middle.scrollWidth;
135
+ const clientWidth = middle.clientWidth;
136
+ const scrollTop = middle.scrollTop;
137
+ const verticalChanged = this.useVirtualScroll.vertical && this.scrollTopPosition !== scrollTop;
138
+ const horizontalChanged = this.useVirtualScroll.horizontal && this.scrollLeftPosition !== scrollLeft;
139
+ const newScrolledLeft = scrollLeft > 0;
140
+ const newScrolledRight = scrollLeft + clientWidth < scrollWidth;
141
+ if (this.scrolledLeft !== newScrolledLeft || this.scrolledRight !== newScrolledRight) {
142
+ this.scrolledLeft = newScrolledLeft;
143
+ this.scrolledRight = newScrolledRight;
144
+ }
145
+ if (verticalChanged || horizontalChanged) {
146
+ if (this.scrollRequestAnimationFrame !== null) {
147
+ cancelAnimationFrame(this.scrollRequestAnimationFrame);
148
+ }
149
+ this.scrollRequestAnimationFrame = requestAnimationFrame(() => {
150
+ if (verticalChanged) {
151
+ this.scrollTopPosition = scrollTop;
152
+ this.calculateVisibleRange();
153
+ }
154
+ if (horizontalChanged) {
155
+ this.scrollLeftPosition = scrollLeft;
156
+ this.calculateVisibleColumnRange();
157
+ }
158
+ this.scrollRequestAnimationFrame = null;
159
+ });
116
160
  }
117
- this.scrollRequestAnimationFrame = requestAnimationFrame(() => {
118
- if (verticalChanged) {
119
- this.scrollTopPosition = scrollTop;
161
+ };
162
+ this.scrollContainer = middle;
163
+ requestAnimationFrame(() => {
164
+ if (this.scrollContainer && this.onScroll) {
165
+ this.cachedContainerHeight = this.scrollContainer.clientHeight;
166
+ this.cachedContainerWidth = this.scrollContainer.clientWidth;
167
+ middle.addEventListener('scroll', this.onScroll, { passive: true });
168
+ if (this.useVirtualScroll.vertical) {
120
169
  this.calculateVisibleRange();
121
170
  }
122
- if (horizontalChanged) {
123
- this.scrollLeftPosition = scrollLeft;
171
+ if (this.useVirtualScroll.horizontal) {
124
172
  this.calculateVisibleColumnRange();
125
173
  }
126
- this.scrollRequestAnimationFrame = null;
127
- });
128
- }
174
+ this.onScroll();
175
+ }
176
+ });
177
+ });
178
+ }
179
+ changePage(page) {
180
+ if (!this.useInternalPagination) {
181
+ this.sdPageChange.emit(page);
182
+ return;
183
+ }
184
+ this.currentPage = page;
185
+ this.sdPageChange.emit(this.currentPage);
186
+ }
187
+ changeRowsPerPage(perPage) {
188
+ const changedRowsPerPage = perPage ? Number(perPage) : 0;
189
+ if (!this.useInternalPagination) {
190
+ this.sdRowsPerPageChange.emit(changedRowsPerPage);
191
+ return;
192
+ }
193
+ const newRowsPerPage = Number(perPage || 0);
194
+ let newLastPage = Math.max(1, Math.ceil(this.innerRows.length / newRowsPerPage));
195
+ let newCurrentPage = this.currentPage;
196
+ if (newCurrentPage > newLastPage) {
197
+ newCurrentPage = newLastPage;
198
+ }
199
+ this.pagination = {
200
+ page: newCurrentPage,
201
+ rowsPerPage: newRowsPerPage,
202
+ lastPage: newLastPage,
129
203
  };
130
- middle.addEventListener('scroll', onScroll, { passive: true });
131
- onScroll();
204
+ this.currentPage = newCurrentPage;
205
+ this.sdRowsPerPageChange.emit(changedRowsPerPage);
132
206
  }
133
207
  disconnectedCallback() {
208
+ if (this.scrollContainer && this.onScroll) {
209
+ this.scrollContainer.removeEventListener('scroll', this.onScroll);
210
+ }
134
211
  if (this.scrollRequestAnimationFrame !== null) {
135
212
  cancelAnimationFrame(this.scrollRequestAnimationFrame);
136
213
  }
137
214
  }
138
215
  // ----- Derived getters -----
139
216
  get visibleColumns() {
140
- return this.columns.filter(col => col.visible !== false);
217
+ if (this.cachedVisibleColumns && this.lastColumnsRef === this.columns) {
218
+ return this.cachedVisibleColumns;
219
+ }
220
+ this.lastColumnsRef = this.columns;
221
+ this.cachedVisibleColumns = this.columns.filter(col => col.visible !== false);
222
+ return this.cachedVisibleColumns;
141
223
  }
142
224
  get paginatedRows() {
143
225
  if (!this.pagination || !this.useInternalPagination)
144
226
  return this.innerRows;
145
227
  const { rowsPerPage = this.rows.length } = this.pagination || {};
146
- const result = this.innerRows.slice((this.currentPage - 1) * rowsPerPage, this.currentPage * rowsPerPage);
147
- return result;
228
+ return this.innerRows.slice((this.currentPage - 1) * rowsPerPage, this.currentPage * rowsPerPage);
148
229
  }
149
230
  get virtualRows() {
231
+ const newVirtualIndexKey = `${this.virtualStartIndex}-${this.virtualEndIndex}`;
232
+ if (this.cachedVirtualRows && this.cachedVirtualIndexKey === newVirtualIndexKey) {
233
+ return this.cachedVirtualRows;
234
+ }
235
+ this.cachedVirtualIndexKey = newVirtualIndexKey;
150
236
  if (!this.useVirtualScroll.vertical) {
151
- return this.paginatedRows.map((row, idx) => ({ row, actualIndex: idx }));
237
+ this.cachedVirtualRows = this.paginatedRows.map((row, idx) => ({ row, actualIndex: idx }));
152
238
  }
153
- return this.paginatedRows
154
- .slice(this.virtualStartIndex, this.virtualEndIndex + 1)
155
- .map((row, relativeIdx) => ({
156
- row,
157
- actualIndex: this.virtualStartIndex + relativeIdx,
158
- }));
239
+ else {
240
+ this.cachedVirtualRows = this.paginatedRows
241
+ .slice(this.virtualStartIndex, this.virtualEndIndex + 1)
242
+ .map((row, relativeIdx) => ({
243
+ row,
244
+ actualIndex: this.virtualStartIndex + relativeIdx,
245
+ }));
246
+ }
247
+ return this.cachedVirtualRows;
159
248
  }
160
249
  get topSpacerHeight() {
161
250
  if (!this.useVirtualScroll.vertical || this.virtualStartIndex === 0)
@@ -228,6 +317,7 @@ export class SdTable {
228
317
  if (newSelected.length === selectedArray.length)
229
318
  return;
230
319
  this.innerSelected = new Set(newSelected);
320
+ this.cachedIsAllChecked = undefined;
231
321
  this.sdSelectChange.emit(Array.from(this.innerSelected));
232
322
  }
233
323
  toggleSelectAll(checked) {
@@ -239,16 +329,29 @@ export class SdTable {
239
329
  const currentPageKeys = this.paginatedRows.map(r => r[this.rowKey]);
240
330
  this.innerSelected = new Set([...this.innerSelected].filter(r => !currentPageKeys.includes(r[this.rowKey])));
241
331
  }
332
+ this.cachedIsAllChecked = undefined;
242
333
  this.sdSelectChange.emit(Array.from(this.innerSelected));
243
334
  }
244
335
  get isAllChecked() {
336
+ const selectionKey = `${this.paginatedRows.length}-${this.innerSelected.size}`;
337
+ if (this.cachedIsAllChecked !== undefined && this.lastSelectionKey === selectionKey) {
338
+ return this.cachedIsAllChecked;
339
+ }
245
340
  const total = this.paginatedRows.length;
246
341
  const selectedCount = this.paginatedRows.filter(row => Array.from(this.innerSelected).some(selectedRow => selectedRow[this.rowKey] === row[this.rowKey])).length;
247
- if (selectedCount === 0)
248
- return false; // 아무것도 안 선택됨
249
- if (selectedCount === total)
250
- return true; // 전부 선택됨
251
- return null; // 일부만 선택됨
342
+ let result;
343
+ if (selectedCount === 0) {
344
+ result = false; // 아무것도 안 선택됨
345
+ }
346
+ else if (selectedCount === total) {
347
+ result = true; // 전부 선택됨
348
+ }
349
+ else {
350
+ result = null; // 일부만 선택됨
351
+ }
352
+ this.cachedIsAllChecked = result;
353
+ this.lastSelectionKey = selectionKey;
354
+ return result;
252
355
  }
253
356
  // RAF 통합 관리
254
357
  scheduleUpdate(type) {
@@ -274,13 +377,22 @@ export class SdTable {
274
377
  return;
275
378
  }
276
379
  const scrollTop = this.scrollTopPosition;
277
- const containerHeight = this.scrollContainer?.clientHeight || 0;
380
+ let containerHeight = this.cachedContainerHeight;
381
+ if (containerHeight === 0 && this.scrollContainer) {
382
+ containerHeight = this.scrollContainer.clientHeight;
383
+ this.cachedContainerHeight = containerHeight;
384
+ }
385
+ const bufferSize = this.virtualBufferSize.vertical || 5;
278
386
  const startIndex = Math.floor(scrollTop / this.virtualRowHeight);
279
387
  const visibleCount = Math.ceil(containerHeight / this.virtualRowHeight);
280
- const endIndex = startIndex + visibleCount;
281
- const bufferSize = this.virtualBufferSize.vertical || 5;
282
- this.virtualStartIndex = Math.max(0, startIndex - bufferSize);
283
- this.virtualEndIndex = Math.min(this.paginatedRows.length - 1, endIndex + bufferSize);
388
+ const endIndex = startIndex + visibleCount - 1;
389
+ const newStartIndex = Math.max(0, startIndex - bufferSize);
390
+ const newEndIndex = Math.min(this.paginatedRows.length - 1, endIndex + bufferSize);
391
+ // 실제로 변경된 경우에만 상태 업데이트
392
+ if (this.virtualStartIndex !== newStartIndex || this.virtualEndIndex !== newEndIndex) {
393
+ this.virtualStartIndex = newStartIndex;
394
+ this.virtualEndIndex = newEndIndex;
395
+ }
284
396
  }
285
397
  // 가로 가상 스크롤 렌더링 계산
286
398
  calculateVisibleColumnRange() {
@@ -290,7 +402,12 @@ export class SdTable {
290
402
  return;
291
403
  }
292
404
  const scrollLeft = this.scrollLeftPosition;
293
- const containerWidth = this.scrollContainer?.clientWidth || 0;
405
+ // 캐시된 사용, 없으면 측정 후 캐시
406
+ let containerWidth = this.cachedContainerWidth;
407
+ if (containerWidth === 0 && this.scrollContainer) {
408
+ containerWidth = this.scrollContainer.clientWidth;
409
+ this.cachedContainerWidth = containerWidth;
410
+ }
294
411
  const stickyLeftCount = this.stickyColumn.left || 0;
295
412
  const stickyRightCount = this.stickyColumn.right || 0;
296
413
  // 가상 스크롤 컬럼 - sticky column 제외
@@ -330,22 +447,34 @@ export class SdTable {
330
447
  }
331
448
  }
332
449
  const bufferSize = this.virtualBufferSize.horizontal || 5;
333
- this.virtualStartColIdx = Math.max(0, startIdx - bufferSize);
334
- this.virtualEndColIdx = Math.min(virtualColumns.length - 1, endIdx + bufferSize);
450
+ const newStartColIdx = Math.max(0, startIdx - bufferSize);
451
+ const newEndColIdx = Math.min(virtualColumns.length - 1, endIdx + bufferSize);
452
+ // 실제로 변경된 경우에만 상태 업데이트
453
+ if (this.virtualStartColIdx !== newStartColIdx || this.virtualEndColIdx !== newEndColIdx) {
454
+ this.virtualStartColIdx = newStartColIdx;
455
+ this.virtualEndColIdx = newEndColIdx;
456
+ }
335
457
  }
336
458
  // ----- Helpers -----
337
459
  getStickyStyle(colIdx) {
460
+ // 캐시된 스타일이 있으면 반환
461
+ if (this.stickyStyleCache.has(colIdx)) {
462
+ return this.stickyStyleCache.get(colIdx);
463
+ }
338
464
  const leftOffset = this.columnWidths.slice(0, colIdx).reduce((a, b) => a + b, 0) + (this.selectable ? 52 : 0);
339
465
  const rightOffset = this.columnWidths
340
466
  .filter((_, i) => i >= this.visibleColumns.length - (this.stickyColumn.right || 0) && i > colIdx)
341
467
  .reduce((a, b) => a + b, 0);
342
- return {
468
+ const style = {
343
469
  '--sticky-left-offset': `${leftOffset}px`,
344
470
  '--sticky-right-offset': `${rightOffset}px`,
345
471
  'width': `${this.columnWidths[colIdx]}px`,
346
472
  'minWidth': `${this.columnWidths[colIdx]}px`,
347
473
  'maxWidth': `${this.columnWidths[colIdx]}px`,
348
474
  };
475
+ // 스타일 캐시에 저장
476
+ this.stickyStyleCache.set(colIdx, style);
477
+ return style;
349
478
  }
350
479
  handleResize(index, event) {
351
480
  // SSR 환경 체크
@@ -375,6 +504,10 @@ export class SdTable {
375
504
  return format ? format(value, row) : value;
376
505
  }
377
506
  getColumnRenderedInOrder() {
507
+ const orderKey = `${this.visibleColumns.length}-${this.virtualStartColIdx}-${this.virtualEndColIdx}`;
508
+ if (this.cachedColumnOrder && this.lastColumnOrderKey === orderKey) {
509
+ return this.cachedColumnOrder;
510
+ }
378
511
  const stickyLeftCount = this.stickyColumn.left || 0;
379
512
  const stickyRightCount = this.stickyColumn.right || 0;
380
513
  // Sticky left 컬럼들
@@ -385,13 +518,15 @@ export class SdTable {
385
518
  .slice(stickyLeftCount, this.visibleColumns.length - stickyRightCount)
386
519
  .slice(this.virtualStartColIdx, this.virtualEndColIdx + 1)
387
520
  : this.visibleColumns.slice(stickyLeftCount, this.visibleColumns.length - stickyRightCount);
388
- return {
521
+ this.cachedColumnOrder = {
389
522
  stickyLeftCount,
390
523
  stickyRightCount,
391
524
  stickyLeftCols,
392
525
  middleCols,
393
526
  stickyRightCols,
394
527
  };
528
+ this.lastColumnOrderKey = orderKey;
529
+ return this.cachedColumnOrder;
395
530
  }
396
531
  // ----- Render -----
397
532
  renderHead() {
@@ -429,7 +564,7 @@ export class SdTable {
429
564
  }))));
430
565
  }
431
566
  renderBody() {
432
- return (h("tbody", { ...(!this.paginatedRows.length && { part: 'tbody-empty' }), class: `sd-table-tbody ${this.useVirtualScroll.vertical ? 'sd-table-tbody--virtual-scroll' : ''}`, style: { '--total-virtual-height': `${this.totalVirtualHeight}px` } }, this.isLoading && (h("div", { class: "sd-table__loading" }, h("sd-loading-spinner", null))), this.useVirtualScroll.vertical && this.topSpacerHeight > 0 && this.renderSpacerRow('top'), this.paginatedRows.length > 0 &&
567
+ return (h("tbody", { ...(!this.paginatedRows.length && { part: 'tbody-empty' }), class: `sd-table-tbody ${this.useVirtualScroll.vertical ? 'sd-table-tbody--virtual-scroll' : ''}`, style: { '--total-virtual-height': `${this.totalVirtualHeight}px` } }, this.useVirtualScroll.vertical && this.topSpacerHeight > 0 && this.renderSpacerRow('top'), this.paginatedRows.length > 0 &&
433
568
  this.virtualRows.map(({ row, actualIndex }) => this.renderRow(row, actualIndex)), this.useVirtualScroll.vertical &&
434
569
  this.bottomSpacerHeight > 0 &&
435
570
  this.renderSpacerRow('bottom')));
@@ -499,44 +634,16 @@ export class SdTable {
499
634
  }, "aria-hidden": "true" }, h("div", { class: "sd-table__skeleton-cell" })));
500
635
  }
501
636
  render() {
502
- return (h(Host, { key: '658ead41c51d9f031c0334d91cad9a06811721b9' }, h("div", { key: 'c98a48d31b16cbd934e4ae47b55bcfeaa5db2520', class: "sd-table__wrapper", style: {
637
+ return (h(Host, { key: '85b4655b2ee298d535add2e43c2ef73b8c816716' }, h("div", { key: '9fc71a34045a725db9fa19fec9954d1edb90f1e4', class: "sd-table__wrapper", style: {
503
638
  '--table-width': this.width,
504
639
  '--table-height': this.height,
505
- } }, h("div", { key: '080fc2b81b016c4876cf90502952e49a5e468534', class: "sd-table__container", style: {
640
+ } }, h("div", { key: 'dcb78c1bac32c68bc5ac81beece5ee8ca74025ba', class: "sd-table__container", style: {
506
641
  '--table-container-height': `calc(${this.height} - ${this.pagination && this.innerRows.length > 0 ? 48 : 0}px)`,
507
- } }, h("div", { key: 'd56754a7cd4acc0505bb36d2d8a116a20d19c0e4', class: {
642
+ } }, h("div", { key: 'e0bb087930f0cf07c06c6f5684a5b26fa5e25a02', class: {
508
643
  'sd-table__middle': true,
509
644
  'sd-table__middle--scrollable': this.paginatedRows.length > 0,
510
645
  'sd-table__middle--loading': this.isLoading,
511
- } }, h("table", { key: '39d620db8e2f9ea585f8c73222687f59aaa830e6', part: "table", class: this.sdTableClasses }, this.renderHead(), this.renderBody())), h("div", { key: 'dcd87252620d5fb95deda064e2a7b4e6871c9dc1', class: "sd-table__bottom" }, !this.paginatedRows.length && (h("div", { key: 'd31ea2dbc747385fb7f7a733725e0e34f24f4489', class: "sd-table__no-data" }, h("slot", { key: '8375b5f42dafa7d430ad33226500d2a84b099990', name: "no-data" }, this.noDataLabel))))), this.pagination && this.innerRows.length > 0 && (h("div", { key: '2b231be27d05c5bb52ff1c0ced255f10be449068', class: "sd-table__pagination" }, h("sd-pagination", { key: '45676f7c4c931896c6414fa8beb6a6c23e203e92', currentPage: !this.useInternalPagination ? this.pagination.page : this.currentPage, lastPage: !this.useInternalPagination ? this.pagination.lastPage : this.lastPageNumber, onPageChange: (e) => {
512
- if (!this.useInternalPagination) {
513
- this.sdPageChange.emit(e.detail);
514
- }
515
- else {
516
- this.currentPage = e.detail;
517
- this.sdPageChange.emit(this.currentPage);
518
- }
519
- } }), this.useRowsPerPageSelect && (h("sd-select", { key: '3f65639b064a27993dc62a8e4a5dc86b16aec4f8', value: this.pagination.rowsPerPage, options: this.rowsPerPageOption, width: "128px", onSdChange: (e) => {
520
- const changedRowsPerPage = e.detail.value ? Number(e.detail.value) : 0;
521
- if (!this.useInternalPagination) {
522
- this.sdRowsPerPageChange.emit(changedRowsPerPage);
523
- }
524
- else {
525
- const newRowsPerPage = Number(e.detail.value || 0);
526
- let newLastPage = Math.max(1, Math.ceil(this.innerRows.length / newRowsPerPage));
527
- let newCurrentPage = this.currentPage;
528
- if (newCurrentPage > newLastPage) {
529
- newCurrentPage = newLastPage;
530
- }
531
- this.pagination = {
532
- page: newCurrentPage,
533
- rowsPerPage: newRowsPerPage,
534
- lastPage: newLastPage,
535
- };
536
- this.currentPage = newCurrentPage;
537
- this.sdRowsPerPageChange.emit(changedRowsPerPage);
538
- }
539
- } })))))));
646
+ } }, this.isLoading && (h("div", { key: '4f36b5fc670aa98774e565b000cc1623a6cae0af', class: "sd-table__middle--loading__spinner" }, h("sd-loading-spinner", { key: '2e794ac56824bfad1f9f42482b75498e7f2ca70c' }))), h("table", { key: 'a4017ae90c8f932c22b26d7f81c9fc13785e52d0', part: "table", class: this.sdTableClasses }, this.renderHead(), this.renderBody())), h("div", { key: 'c7b008d66c47442d25a977d76b7b6dd266d7f008', class: "sd-table__bottom" }, !this.paginatedRows.length && (h("div", { key: '20235f4747c2396710b44d46ea1da659156bb9ca', class: "sd-table__no-data" }, h("slot", { key: '432a8669c4942eb92c4bce7f0b08cb9cb1f9f6e3', name: "no-data" }, this.noDataLabel))))), this.pagination && this.innerRows.length > 0 && (h("div", { key: 'f9f6dc05c1004b03e10ece4c091d67ca564b1633', class: "sd-table__pagination" }, h("sd-pagination", { key: 'd7efd361091fe9725e8c79289501506a779e1111', currentPage: !this.useInternalPagination ? this.pagination.page : this.currentPage, lastPage: !this.useInternalPagination ? this.pagination.lastPage : this.lastPageNumber, onPageChange: (e) => this.changePage(e.detail) }), this.useRowsPerPageSelect && (h("sd-select", { key: '401d35d85c2fc78094c267f27d74055108179f9e', value: this.pagination.rowsPerPage, options: this.rowsPerPageOption, width: "128px", onSdChange: (e) => this.changeRowsPerPage(e.detail.value) })))))));
540
647
  }
541
648
  static get is() { return "sd-table-backup"; }
542
649
  static get originalStyleUrls() {