atomicuilibrary 0.0.1

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 (1108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/cjs/category-section.cjs.entry.js +30 -0
  4. package/dist/cjs/component-size-DsYFUZcz.js +29 -0
  5. package/dist/cjs/dom-oP1E4Rd3.js +267 -0
  6. package/dist/cjs/event-bus-B6M2f8CQ.js +23 -0
  7. package/dist/cjs/exploration-project-tailwind.cjs.js +24 -0
  8. package/dist/cjs/focus-trap-i9T6oXLc.js +139 -0
  9. package/dist/cjs/index-ClkOYpT8.js +2275 -0
  10. package/dist/cjs/index.cjs.js +260 -0
  11. package/dist/cjs/layout-manager.cjs.entry.js +616 -0
  12. package/dist/cjs/library-card.cjs.entry.js +63 -0
  13. package/dist/cjs/lm-container_2.cjs.entry.js +79 -0
  14. package/dist/cjs/lm-panel_3.cjs.entry.js +108 -0
  15. package/dist/cjs/loader.cjs.js +12 -0
  16. package/dist/cjs/my-component.cjs.entry.js +33 -0
  17. package/dist/cjs/my-step.cjs.entry.js +29 -0
  18. package/dist/cjs/nav-bar.cjs.entry.js +247 -0
  19. package/dist/cjs/security-E1JcwxGc.js +1547 -0
  20. package/dist/cjs/smart-step.cjs.entry.js +47 -0
  21. package/dist/cjs/timeline-item.cjs.entry.js +29 -0
  22. package/dist/cjs/ui-accordion_10.cjs.entry.js +5733 -0
  23. package/dist/cjs/ui-advanced-data-table.cjs.entry.js +2684 -0
  24. package/dist/cjs/ui-anchor.cjs.entry.js +558 -0
  25. package/dist/cjs/ui-animate-on-scroll.cjs.entry.js +285 -0
  26. package/dist/cjs/ui-aside-panel.cjs.entry.js +638 -0
  27. package/dist/cjs/ui-avatar-group_3.cjs.entry.js +634 -0
  28. package/dist/cjs/ui-breadcrumb-item.cjs.entry.js +56 -0
  29. package/dist/cjs/ui-breadcrumb.cjs.entry.js +201 -0
  30. package/dist/cjs/ui-callout-banner.cjs.entry.js +291 -0
  31. package/dist/cjs/ui-card.cjs.entry.js +411 -0
  32. package/dist/cjs/ui-carousel.cjs.entry.js +547 -0
  33. package/dist/cjs/ui-checkbox-group.cjs.entry.js +330 -0
  34. package/dist/cjs/ui-checkbox.cjs.entry.js +260 -0
  35. package/dist/cjs/ui-code-editor.cjs.entry.js +961 -0
  36. package/dist/cjs/ui-code-preview.cjs.entry.js +315 -0
  37. package/dist/cjs/ui-color-controller.cjs.entry.js +150 -0
  38. package/dist/cjs/ui-color-picker.cjs.entry.js +658 -0
  39. package/dist/cjs/ui-command-palette.cjs.entry.js +178 -0
  40. package/dist/cjs/ui-dialog-box.cjs.entry.js +1808 -0
  41. package/dist/cjs/ui-dialog-content.cjs.entry.js +31 -0
  42. package/dist/cjs/ui-dialog-footer_2.cjs.entry.js +193 -0
  43. package/dist/cjs/ui-divider.cjs.entry.js +481 -0
  44. package/dist/cjs/ui-dock-host.cjs.entry.js +128 -0
  45. package/dist/cjs/ui-dock.cjs.entry.js +221 -0
  46. package/dist/cjs/ui-drag-drop.cjs.entry.js +172 -0
  47. package/dist/cjs/ui-dropdown_2.cjs.entry.js +1552 -0
  48. package/dist/cjs/ui-empty-state.cjs.entry.js +398 -0
  49. package/dist/cjs/ui-fab-item.cjs.entry.js +39 -0
  50. package/dist/cjs/ui-fab.cjs.entry.js +277 -0
  51. package/dist/cjs/ui-file-upload.cjs.entry.js +418 -0
  52. package/dist/cjs/ui-horizontal-nav.cjs.entry.js +135 -0
  53. package/dist/cjs/ui-image-button.cjs.entry.js +67 -0
  54. package/dist/cjs/ui-input-pair.cjs.entry.js +44 -0
  55. package/dist/cjs/ui-knob.cjs.entry.js +447 -0
  56. package/dist/cjs/ui-library.cjs.entry.js +134 -0
  57. package/dist/cjs/ui-list-group_2.cjs.entry.js +586 -0
  58. package/dist/cjs/ui-list.cjs.entry.js +732 -0
  59. package/dist/cjs/ui-masonry.cjs.entry.js +478 -0
  60. package/dist/cjs/ui-meter-group.cjs.entry.js +173 -0
  61. package/dist/cjs/ui-navigation-item.cjs.entry.js +104 -0
  62. package/dist/cjs/ui-number-input.cjs.entry.js +191 -0
  63. package/dist/cjs/ui-otp-input.cjs.entry.js +246 -0
  64. package/dist/cjs/ui-pagination_3.cjs.entry.js +1621 -0
  65. package/dist/cjs/ui-panel.cjs.entry.js +614 -0
  66. package/dist/cjs/ui-pattern-input.cjs.entry.js +278 -0
  67. package/dist/cjs/ui-popover.cjs.entry.js +517 -0
  68. package/dist/cjs/ui-progress.cjs.entry.js +516 -0
  69. package/dist/cjs/ui-radio-group.cjs.entry.js +205 -0
  70. package/dist/cjs/ui-radio.cjs.entry.js +206 -0
  71. package/dist/cjs/ui-range-slider.cjs.entry.js +637 -0
  72. package/dist/cjs/ui-resizable-panel.cjs.entry.js +484 -0
  73. package/dist/cjs/ui-scroll-top.cjs.entry.js +459 -0
  74. package/dist/cjs/ui-smart-context-menu.cjs.entry.js +376 -0
  75. package/dist/cjs/ui-smart-location-dropdown.cjs.entry.js +565 -0
  76. package/dist/cjs/ui-smart-stepper.cjs.entry.js +137 -0
  77. package/dist/cjs/ui-snackbar.cjs.entry.js +863 -0
  78. package/dist/cjs/ui-speed-dial.cjs.entry.js +520 -0
  79. package/dist/cjs/ui-speedometer.cjs.entry.js +428 -0
  80. package/dist/cjs/ui-splitter.cjs.entry.js +282 -0
  81. package/dist/cjs/ui-step.cjs.entry.js +30 -0
  82. package/dist/cjs/ui-stepper.cjs.entry.js +640 -0
  83. package/dist/cjs/ui-switch.cjs.entry.js +405 -0
  84. package/dist/cjs/ui-tabs.cjs.entry.js +703 -0
  85. package/dist/cjs/ui-tag.cjs.entry.js +299 -0
  86. package/dist/cjs/ui-timeline.cjs.entry.js +267 -0
  87. package/dist/cjs/ui-timer.cjs.entry.js +502 -0
  88. package/dist/cjs/ui-toolbar.cjs.entry.js +619 -0
  89. package/dist/cjs/ui-tooltip.cjs.entry.js +697 -0
  90. package/dist/cjs/ui-top-bar.cjs.entry.js +121 -0
  91. package/dist/cjs/ui-transfer-list.cjs.entry.js +592 -0
  92. package/dist/cjs/ui-tree.cjs.entry.js +874 -0
  93. package/dist/cjs/ui-workspace-manager.cjs.entry.js +1201 -0
  94. package/dist/cjs/utils-DVZ6gul6.js +26 -0
  95. package/dist/collection/assets/js/component-config.js +41 -0
  96. package/dist/collection/assets/js/demo-loader.js +147 -0
  97. package/dist/collection/assets/js/demo-nav.js +273 -0
  98. package/dist/collection/assets/js/demos/about-demo.js +60 -0
  99. package/dist/collection/assets/js/demos/accordion-demo.js +1954 -0
  100. package/dist/collection/assets/js/demos/advanced-data-table-demo.js +2952 -0
  101. package/dist/collection/assets/js/demos/anchor-demo.js +527 -0
  102. package/dist/collection/assets/js/demos/animate-on-scroll-demo.js +174 -0
  103. package/dist/collection/assets/js/demos/aside-panel-demo.js +1109 -0
  104. package/dist/collection/assets/js/demos/avatar-demo.js +508 -0
  105. package/dist/collection/assets/js/demos/badge-demo.js +620 -0
  106. package/dist/collection/assets/js/demos/breadcrumb-demo.js +365 -0
  107. package/dist/collection/assets/js/demos/button-demo.js +1223 -0
  108. package/dist/collection/assets/js/demos/button-toggle-demo.js +978 -0
  109. package/dist/collection/assets/js/demos/callout-banner-demo.js +366 -0
  110. package/dist/collection/assets/js/demos/card-demo.js +427 -0
  111. package/dist/collection/assets/js/demos/carousel-demo.js +360 -0
  112. package/dist/collection/assets/js/demos/checkbox-demo.js +489 -0
  113. package/dist/collection/assets/js/demos/code-preview-demo.js +216 -0
  114. package/dist/collection/assets/js/demos/color-picker-demo.js +117 -0
  115. package/dist/collection/assets/js/demos/command-palette-demo.js +105 -0
  116. package/dist/collection/assets/js/demos/complex-form-demo.js +45 -0
  117. package/dist/collection/assets/js/demos/context-menu-data.js +436 -0
  118. package/dist/collection/assets/js/demos/context-menu-demo.js +829 -0
  119. package/dist/collection/assets/js/demos/dashboard-demo.js +5 -0
  120. package/dist/collection/assets/js/demos/dialog-demo-temp.js +411 -0
  121. package/dist/collection/assets/js/demos/dialog-demo.js +2567 -0
  122. package/dist/collection/assets/js/demos/divider-demo.js +853 -0
  123. package/dist/collection/assets/js/demos/dock-demo.js +422 -0
  124. package/dist/collection/assets/js/demos/dock-host-init.js +117 -0
  125. package/dist/collection/assets/js/demos/dock-host-playground.js +59 -0
  126. package/dist/collection/assets/js/demos/documentation-demo.js +34 -0
  127. package/dist/collection/assets/js/demos/drag-drop-demo.js +132 -0
  128. package/dist/collection/assets/js/demos/dropdown-demo.js +1410 -0
  129. package/dist/collection/assets/js/demos/dropdown-subtitle-demo.js +18 -0
  130. package/dist/collection/assets/js/demos/empty-state-demo.js +580 -0
  131. package/dist/collection/assets/js/demos/fab-demo.js +374 -0
  132. package/dist/collection/assets/js/demos/file-upload-demo.js +171 -0
  133. package/dist/collection/assets/js/demos/home-components.js +750 -0
  134. package/dist/collection/assets/js/demos/home-demo.js +441 -0
  135. package/dist/collection/assets/js/demos/horizontal-nav-demo.js +277 -0
  136. package/dist/collection/assets/js/demos/icon-demo.js +380 -0
  137. package/dist/collection/assets/js/demos/input-demo.js +1932 -0
  138. package/dist/collection/assets/js/demos/knob-demo.js +570 -0
  139. package/dist/collection/assets/js/demos/layout-manager-demo.js +918 -0
  140. package/dist/collection/assets/js/demos/list-demo.js +1402 -0
  141. package/dist/collection/assets/js/demos/loader-demo.js +453 -0
  142. package/dist/collection/assets/js/demos/meter-group-demo.js +499 -0
  143. package/dist/collection/assets/js/demos/multi-level-context-menu-demo.js +924 -0
  144. package/dist/collection/assets/js/demos/my-profile-demo.js +237 -0
  145. package/dist/collection/assets/js/demos/nav-bar-demo.js +187 -0
  146. package/dist/collection/assets/js/demos/number-input-demo.js +242 -0
  147. package/dist/collection/assets/js/demos/overview-demo.js +11 -0
  148. package/dist/collection/assets/js/demos/pagination-demo.js +1042 -0
  149. package/dist/collection/assets/js/demos/panel-demo.js +789 -0
  150. package/dist/collection/assets/js/demos/pattern-input-demo.js +241 -0
  151. package/dist/collection/assets/js/demos/popover-demo.js +882 -0
  152. package/dist/collection/assets/js/demos/progress-demo.js +462 -0
  153. package/dist/collection/assets/js/demos/radio-demo.js +413 -0
  154. package/dist/collection/assets/js/demos/range-slider-demo.js +1217 -0
  155. package/dist/collection/assets/js/demos/rating-demo.js +383 -0
  156. package/dist/collection/assets/js/demos/scroll-top-demo.js +353 -0
  157. package/dist/collection/assets/js/demos/skeleton-demo.js +490 -0
  158. package/dist/collection/assets/js/demos/skeleton-performance-demo.js +26 -0
  159. package/dist/collection/assets/js/demos/smart-dialog-demo.js +552 -0
  160. package/dist/collection/assets/js/demos/smart-menu-demo.js +375 -0
  161. package/dist/collection/assets/js/demos/smart-stepper-demo.js +50 -0
  162. package/dist/collection/assets/js/demos/snackbar-demo.js +1040 -0
  163. package/dist/collection/assets/js/demos/speed-dial-demo.js +764 -0
  164. package/dist/collection/assets/js/demos/speedometer-demo.js +425 -0
  165. package/dist/collection/assets/js/demos/split-button-demo.js +201 -0
  166. package/dist/collection/assets/js/demos/stack-demo.js +228 -0
  167. package/dist/collection/assets/js/demos/stepper-demo.js +798 -0
  168. package/dist/collection/assets/js/demos/switch-demo.js +849 -0
  169. package/dist/collection/assets/js/demos/tabs-demo.js +1032 -0
  170. package/dist/collection/assets/js/demos/tag-demo.js +842 -0
  171. package/dist/collection/assets/js/demos/theme-selector-demo.js +466 -0
  172. package/dist/collection/assets/js/demos/timeline-demo.js +365 -0
  173. package/dist/collection/assets/js/demos/timeline-playground.js +59 -0
  174. package/dist/collection/assets/js/demos/timer-demo.js +313 -0
  175. package/dist/collection/assets/js/demos/toolbar-demo.js +643 -0
  176. package/dist/collection/assets/js/demos/tooltip-demo.js +730 -0
  177. package/dist/collection/assets/js/demos/top-bar-demo.js +417 -0
  178. package/dist/collection/assets/js/demos/transfer-list-demo.js +555 -0
  179. package/dist/collection/assets/js/demos/tree-demo.js +693 -0
  180. package/dist/collection/assets/js/demos/workspace-manager-demo.js +241 -0
  181. package/dist/collection/assets/js/index-boot.js +104 -0
  182. package/dist/collection/assets/js/nav-bar-demo.js +20 -0
  183. package/dist/collection/assets/js/nav-bar-init.js +119 -0
  184. package/dist/collection/assets/js/utils/layout-loader.js +80 -0
  185. package/dist/collection/collection-manifest.json +113 -0
  186. package/dist/collection/components/accordion/accordion.css +2090 -0
  187. package/dist/collection/components/accordion/accordion.js +2955 -0
  188. package/dist/collection/components/accordion/types.js +1 -0
  189. package/dist/collection/components/advanced-data-table/advanced-data-table.css +2606 -0
  190. package/dist/collection/components/advanced-data-table/advanced-data-table.js +5394 -0
  191. package/dist/collection/components/advanced-data-table/types.js +1 -0
  192. package/dist/collection/components/anchor/anchor.css +395 -0
  193. package/dist/collection/components/anchor/anchor.js +1404 -0
  194. package/dist/collection/components/anchor/types.js +1 -0
  195. package/dist/collection/components/animate-on-scroll/animate-on-scroll.css +804 -0
  196. package/dist/collection/components/animate-on-scroll/animate-on-scroll.js +696 -0
  197. package/dist/collection/components/aside-panel/aside-panel.css +472 -0
  198. package/dist/collection/components/aside-panel/aside-panel.js +1697 -0
  199. package/dist/collection/components/avatar/avatar.css +696 -0
  200. package/dist/collection/components/avatar/avatar.js +2007 -0
  201. package/dist/collection/components/avatar/types.js +1 -0
  202. package/dist/collection/components/avatar-group/avatar-group.css +253 -0
  203. package/dist/collection/components/avatar-group/avatar-group.js +405 -0
  204. package/dist/collection/components/avatar-group/types.js +1 -0
  205. package/dist/collection/components/badge/badge.css +580 -0
  206. package/dist/collection/components/badge/badge.js +723 -0
  207. package/dist/collection/components/badge/types.js +1 -0
  208. package/dist/collection/components/breadcrumb/breadcrumb-item.js +231 -0
  209. package/dist/collection/components/breadcrumb/breadcrumb.css +313 -0
  210. package/dist/collection/components/breadcrumb/breadcrumb.js +510 -0
  211. package/dist/collection/components/breadcrumb/types.js +1 -0
  212. package/dist/collection/components/button/button.css +1862 -0
  213. package/dist/collection/components/button/button.js +1380 -0
  214. package/dist/collection/components/button/types.js +1 -0
  215. package/dist/collection/components/button-toggle/button-toggle.css +97 -0
  216. package/dist/collection/components/button-toggle/button-toggle.js +620 -0
  217. package/dist/collection/components/button-toggle-group/button-toggle-group.css +401 -0
  218. package/dist/collection/components/button-toggle-group/button-toggle-group.js +1572 -0
  219. package/dist/collection/components/button-toggle-group/types.js +1 -0
  220. package/dist/collection/components/callout-banner/callout-banner.css +684 -0
  221. package/dist/collection/components/callout-banner/callout-banner.js +1076 -0
  222. package/dist/collection/components/callout-banner/types.js +1 -0
  223. package/dist/collection/components/card/card.css +663 -0
  224. package/dist/collection/components/card/card.js +1697 -0
  225. package/dist/collection/components/card/types.js +1 -0
  226. package/dist/collection/components/carousel/carousel.css +549 -0
  227. package/dist/collection/components/carousel/carousel.js +1512 -0
  228. package/dist/collection/components/carousel/types.js +1 -0
  229. package/dist/collection/components/checkbox/checkbox.css +863 -0
  230. package/dist/collection/components/checkbox/checkbox.js +1201 -0
  231. package/dist/collection/components/checkbox/types.js +1 -0
  232. package/dist/collection/components/checkbox-group/checkbox-group.css +223 -0
  233. package/dist/collection/components/checkbox-group/checkbox-group.js +1001 -0
  234. package/dist/collection/components/checkbox-group/types.js +1 -0
  235. package/dist/collection/components/code-editor/code-editor.css +1081 -0
  236. package/dist/collection/components/code-editor/code-editor.js +1211 -0
  237. package/dist/collection/components/code-editor/types.js +1 -0
  238. package/dist/collection/components/code-preview/types.js +1 -0
  239. package/dist/collection/components/code-preview/ui-code-preview.css +209 -0
  240. package/dist/collection/components/code-preview/ui-code-preview.js +548 -0
  241. package/dist/collection/components/color-controller/color-controller.css +108 -0
  242. package/dist/collection/components/color-controller/color-controller.js +224 -0
  243. package/dist/collection/components/color-picker/color-picker.css +323 -0
  244. package/dist/collection/components/color-picker/color-picker.js +1139 -0
  245. package/dist/collection/components/color-picker/types.js +1 -0
  246. package/dist/collection/components/command-palette/command-palette.css +260 -0
  247. package/dist/collection/components/command-palette/command-palette.js +429 -0
  248. package/dist/collection/components/command-palette/types.js +1 -0
  249. package/dist/collection/components/context-menu/context-menu.css +388 -0
  250. package/dist/collection/components/context-menu/context-menu.js +1412 -0
  251. package/dist/collection/components/context-menu/types.js +1 -0
  252. package/dist/collection/components/dialog-box/dialog-box.css +1261 -0
  253. package/dist/collection/components/dialog-box/dialog-box.js +4314 -0
  254. package/dist/collection/components/dialog-box/dialog-tray.css +268 -0
  255. package/dist/collection/components/dialog-box/types.js +1 -0
  256. package/dist/collection/components/dialog-content/dialog-content.css +83 -0
  257. package/dist/collection/components/dialog-content/dialog-content.js +96 -0
  258. package/dist/collection/components/dialog-footer/dialog-footer.css +89 -0
  259. package/dist/collection/components/dialog-footer/dialog-footer.js +94 -0
  260. package/dist/collection/components/dialog-footer/types.js +1 -0
  261. package/dist/collection/components/dialog-header/dialog-header.css +203 -0
  262. package/dist/collection/components/dialog-header/dialog-header.js +630 -0
  263. package/dist/collection/components/dialog-header/types.js +1 -0
  264. package/dist/collection/components/divider/divider.css +948 -0
  265. package/dist/collection/components/divider/divider.js +1612 -0
  266. package/dist/collection/components/divider/types.js +1 -0
  267. package/dist/collection/components/dock/dock.css +348 -0
  268. package/dist/collection/components/dock/dock.js +464 -0
  269. package/dist/collection/components/dock/types.js +1 -0
  270. package/dist/collection/components/dock-host/index.js +1 -0
  271. package/dist/collection/components/dock-host/types.js +1 -0
  272. package/dist/collection/components/dock-host/ui-dock-host.css +155 -0
  273. package/dist/collection/components/dock-host/ui-dock-host.js +226 -0
  274. package/dist/collection/components/drag-drop/drag-drop.css +103 -0
  275. package/dist/collection/components/drag-drop/drag-drop.js +385 -0
  276. package/dist/collection/components/drag-drop/types.js +1 -0
  277. package/dist/collection/components/dropdown/dropdown.css +1142 -0
  278. package/dist/collection/components/dropdown/dropdown.js +2033 -0
  279. package/dist/collection/components/dropdown/types.js +1 -0
  280. package/dist/collection/components/empty-state/empty-state.css +712 -0
  281. package/dist/collection/components/empty-state/empty-state.js +1256 -0
  282. package/dist/collection/components/empty-state/types.js +1 -0
  283. package/dist/collection/components/fab/fab.css +601 -0
  284. package/dist/collection/components/fab/fab.js +1124 -0
  285. package/dist/collection/components/fab-item/fab-item.css +107 -0
  286. package/dist/collection/components/fab-item/fab-item.js +177 -0
  287. package/dist/collection/components/fab-item/types.js +1 -0
  288. package/dist/collection/components/file-upload/file-upload.css +243 -0
  289. package/dist/collection/components/file-upload/file-upload.js +1022 -0
  290. package/dist/collection/components/file-upload/types.js +1 -0
  291. package/dist/collection/components/horizontal-nav/horizontal-nav.css +394 -0
  292. package/dist/collection/components/horizontal-nav/horizontal-nav.js +375 -0
  293. package/dist/collection/components/icon/icon.css +113 -0
  294. package/dist/collection/components/icon/icon.js +583 -0
  295. package/dist/collection/components/image-button/image-button.css +154 -0
  296. package/dist/collection/components/image-button/image-button.js +310 -0
  297. package/dist/collection/components/image-button/types.js +1 -0
  298. package/dist/collection/components/input/input.css +1544 -0
  299. package/dist/collection/components/input/input.js +3690 -0
  300. package/dist/collection/components/input/types.js +1 -0
  301. package/dist/collection/components/input-pair/input-pair.css +72 -0
  302. package/dist/collection/components/input-pair/input-pair.js +309 -0
  303. package/dist/collection/components/knob/knob.css +162 -0
  304. package/dist/collection/components/knob/knob.js +986 -0
  305. package/dist/collection/components/knob/types.js +1 -0
  306. package/dist/collection/components/layout-manager/layout-manager.css +41 -0
  307. package/dist/collection/components/layout-manager/layout-manager.js +525 -0
  308. package/dist/collection/components/layout-manager/lm-container/lm-container.css +117 -0
  309. package/dist/collection/components/layout-manager/lm-container/lm-container.js +110 -0
  310. package/dist/collection/components/layout-manager/lm-floating-window/lm-floating-window.css +0 -0
  311. package/dist/collection/components/layout-manager/lm-floating-window/lm-floating-window.js +49 -0
  312. package/dist/collection/components/layout-manager/lm-panel/lm-panel.css +97 -0
  313. package/dist/collection/components/layout-manager/lm-panel/lm-panel.js +58 -0
  314. package/dist/collection/components/layout-manager/lm-splitter/lm-splitter.css +57 -0
  315. package/dist/collection/components/layout-manager/lm-splitter/lm-splitter.js +120 -0
  316. package/dist/collection/components/layout-manager/lm-tabs/lm-tabs.css +149 -0
  317. package/dist/collection/components/layout-manager/lm-tabs/lm-tabs.js +130 -0
  318. package/dist/collection/components/layout-manager/types.js +1 -0
  319. package/dist/collection/components/library/category-section.css +147 -0
  320. package/dist/collection/components/library/category-section.js +139 -0
  321. package/dist/collection/components/library/data.js +74 -0
  322. package/dist/collection/components/library/library-card.css +181 -0
  323. package/dist/collection/components/library/library-card.js +203 -0
  324. package/dist/collection/components/library/library.css +358 -0
  325. package/dist/collection/components/library/library.js +91 -0
  326. package/dist/collection/components/list/list.css +1029 -0
  327. package/dist/collection/components/list/list.js +2167 -0
  328. package/dist/collection/components/list-group/list-group.css +275 -0
  329. package/dist/collection/components/list-group/list-group.js +356 -0
  330. package/dist/collection/components/list-item/list-item.css +1491 -0
  331. package/dist/collection/components/list-item/list-item.js +2184 -0
  332. package/dist/collection/components/masonry/masonry.css +414 -0
  333. package/dist/collection/components/masonry/masonry.js +1104 -0
  334. package/dist/collection/components/masonry/types.js +1 -0
  335. package/dist/collection/components/meter-group/meter-group.css +184 -0
  336. package/dist/collection/components/meter-group/meter-group.js +471 -0
  337. package/dist/collection/components/meter-group/types.js +1 -0
  338. package/dist/collection/components/my-component/my-component.css +27 -0
  339. package/dist/collection/components/my-component/my-component.js +95 -0
  340. package/dist/collection/components/my-step/my-step.css +25 -0
  341. package/dist/collection/components/my-step/my-step.js +237 -0
  342. package/dist/collection/components/nav-bar/nav-bar.css +448 -0
  343. package/dist/collection/components/nav-bar/nav-bar.js +608 -0
  344. package/dist/collection/components/number-input/number-input.css +200 -0
  345. package/dist/collection/components/number-input/number-input.js +695 -0
  346. package/dist/collection/components/otp-input/otp-input.css +243 -0
  347. package/dist/collection/components/otp-input/otp-input.js +761 -0
  348. package/dist/collection/components/otp-input/types.js +1 -0
  349. package/dist/collection/components/pagination/pagination.css +1399 -0
  350. package/dist/collection/components/pagination/pagination.js +2033 -0
  351. package/dist/collection/components/pagination/types.js +1 -0
  352. package/dist/collection/components/panel/panel.css +837 -0
  353. package/dist/collection/components/panel/panel.js +1842 -0
  354. package/dist/collection/components/panel/types.js +1 -0
  355. package/dist/collection/components/pattern-input/pattern-input.css +252 -0
  356. package/dist/collection/components/pattern-input/pattern-input.js +788 -0
  357. package/dist/collection/components/popover/popover.css +399 -0
  358. package/dist/collection/components/popover/popover.js +1449 -0
  359. package/dist/collection/components/popover/types.js +1 -0
  360. package/dist/collection/components/progress/progress.css +588 -0
  361. package/dist/collection/components/progress/progress.js +1414 -0
  362. package/dist/collection/components/progress/types.js +1 -0
  363. package/dist/collection/components/radio/radio.css +773 -0
  364. package/dist/collection/components/radio/radio.js +1059 -0
  365. package/dist/collection/components/radio/types.js +1 -0
  366. package/dist/collection/components/radio-group/radio-group.css +202 -0
  367. package/dist/collection/components/radio-group/radio-group.js +903 -0
  368. package/dist/collection/components/radio-group/types.js +1 -0
  369. package/dist/collection/components/range-slider/range-slider.css +602 -0
  370. package/dist/collection/components/range-slider/range-slider.js +1369 -0
  371. package/dist/collection/components/range-slider/types.js +1 -0
  372. package/dist/collection/components/rating/rating.css +768 -0
  373. package/dist/collection/components/rating/rating.js +1062 -0
  374. package/dist/collection/components/rating/types.js +1 -0
  375. package/dist/collection/components/resizable-panel/resizable-panel.css +247 -0
  376. package/dist/collection/components/resizable-panel/resizable-panel.js +874 -0
  377. package/dist/collection/components/resizable-panel/types.js +1 -0
  378. package/dist/collection/components/scroll-top/scroll-top.css +397 -0
  379. package/dist/collection/components/scroll-top/scroll-top.js +1178 -0
  380. package/dist/collection/components/scroll-top/types.js +1 -0
  381. package/dist/collection/components/skeleton/skeleton-loader.css +429 -0
  382. package/dist/collection/components/skeleton/skeleton-loader.js +1193 -0
  383. package/dist/collection/components/skeleton/types.js +1 -0
  384. package/dist/collection/components/smart-location-dropdown/smart-location-dropdown.css +357 -0
  385. package/dist/collection/components/smart-location-dropdown/smart-location-dropdown.js +1190 -0
  386. package/dist/collection/components/smart-location-dropdown/types.js +1 -0
  387. package/dist/collection/components/smart-menu/menu-item.interface.js +1 -0
  388. package/dist/collection/components/smart-menu/smart-menu.css +119 -0
  389. package/dist/collection/components/smart-menu/smart-menu.js +544 -0
  390. package/dist/collection/components/smart-stepper/smart-step.css +213 -0
  391. package/dist/collection/components/smart-stepper/smart-step.js +170 -0
  392. package/dist/collection/components/smart-stepper/smart-stepper.css +146 -0
  393. package/dist/collection/components/smart-stepper/smart-stepper.js +338 -0
  394. package/dist/collection/components/snackbar/snackbar.css +1480 -0
  395. package/dist/collection/components/snackbar/snackbar.js +1759 -0
  396. package/dist/collection/components/snackbar/types.js +1 -0
  397. package/dist/collection/components/speed-dial/speed-dial.css +478 -0
  398. package/dist/collection/components/speed-dial/speed-dial.js +1183 -0
  399. package/dist/collection/components/speed-dial/types.js +1 -0
  400. package/dist/collection/components/speedometer/speedometer.css +95 -0
  401. package/dist/collection/components/speedometer/speedometer.js +868 -0
  402. package/dist/collection/components/speedometer/types.js +1 -0
  403. package/dist/collection/components/splitter/splitter.css +269 -0
  404. package/dist/collection/components/splitter/splitter.js +713 -0
  405. package/dist/collection/components/splitter/types.js +1 -0
  406. package/dist/collection/components/stack/stack.css +269 -0
  407. package/dist/collection/components/stack/stack.js +297 -0
  408. package/dist/collection/components/stack/types.js +1 -0
  409. package/dist/collection/components/step/step.css +77 -0
  410. package/dist/collection/components/step/step.js +214 -0
  411. package/dist/collection/components/step/types.js +1 -0
  412. package/dist/collection/components/stepper/stepper.css +1079 -0
  413. package/dist/collection/components/stepper/stepper.js +1850 -0
  414. package/dist/collection/components/stepper/types.js +1 -0
  415. package/dist/collection/components/switch/switch.css +1099 -0
  416. package/dist/collection/components/switch/switch.js +1578 -0
  417. package/dist/collection/components/tabs/tabs.css +1355 -0
  418. package/dist/collection/components/tabs/tabs.js +1474 -0
  419. package/dist/collection/components/tabs/types.js +1 -0
  420. package/dist/collection/components/tag/tag.css +893 -0
  421. package/dist/collection/components/tag/tag.js +1119 -0
  422. package/dist/collection/components/tag/types.js +1 -0
  423. package/dist/collection/components/tag-group/tag-group.css +144 -0
  424. package/dist/collection/components/tag-group/tag-group.js +887 -0
  425. package/dist/collection/components/tag-group/types.js +1 -0
  426. package/dist/collection/components/timeline/timeline.css +1850 -0
  427. package/dist/collection/components/timeline/timeline.js +889 -0
  428. package/dist/collection/components/timeline/types.js +1 -0
  429. package/dist/collection/components/timeline/ui-timeline.stories.js +19 -0
  430. package/dist/collection/components/timeline-item/timeline-item.css +75 -0
  431. package/dist/collection/components/timeline-item/timeline-item.js +91 -0
  432. package/dist/collection/components/timer/timer.css +367 -0
  433. package/dist/collection/components/timer/timer.js +1292 -0
  434. package/dist/collection/components/timer/types.js +1 -0
  435. package/dist/collection/components/timer/ui-timer.stories.js +19 -0
  436. package/dist/collection/components/toggle-group/toggle-group.css +361 -0
  437. package/dist/collection/components/toggle-group/toggle-group.js +1212 -0
  438. package/dist/collection/components/toggle-group/types.js +1 -0
  439. package/dist/collection/components/toolbar/toolbar-types.js +1 -0
  440. package/dist/collection/components/toolbar/toolbar.css +1186 -0
  441. package/dist/collection/components/toolbar/toolbar.js +1635 -0
  442. package/dist/collection/components/tooltip/tooltip.css +609 -0
  443. package/dist/collection/components/tooltip/tooltip.js +1882 -0
  444. package/dist/collection/components/tooltip/types.js +1 -0
  445. package/dist/collection/components/top-bar/top-bar.css +274 -0
  446. package/dist/collection/components/top-bar/top-bar.js +383 -0
  447. package/dist/collection/components/transfer-list/transfer-list.css +520 -0
  448. package/dist/collection/components/transfer-list/transfer-list.js +1225 -0
  449. package/dist/collection/components/transfer-list/types.js +1 -0
  450. package/dist/collection/components/tree/tree.css +1197 -0
  451. package/dist/collection/components/tree/tree.js +2509 -0
  452. package/dist/collection/components/tree/types.js +1 -0
  453. package/dist/collection/components/ui-navigation-bar/navigation-bar/navigation-bar.css +830 -0
  454. package/dist/collection/components/ui-navigation-bar/navigation-bar/navigation-bar.js +1231 -0
  455. package/dist/collection/components/ui-navigation-bar/navigation-bar/navigation-types.js +1 -0
  456. package/dist/collection/components/ui-navigation-bar/navigation-item.css +679 -0
  457. package/dist/collection/components/ui-navigation-bar/navigation-item.js +385 -0
  458. package/dist/collection/components/ui-navigation-bar/navigation-types.js +1 -0
  459. package/dist/collection/components/workspace-manager/types.js +1 -0
  460. package/dist/collection/components/workspace-manager/workspace-manager.css +1094 -0
  461. package/dist/collection/components/workspace-manager/workspace-manager.js +1914 -0
  462. package/dist/collection/components.js +51 -0
  463. package/dist/collection/index.js +108 -0
  464. package/dist/collection/service/drag-manager.js +23 -0
  465. package/dist/collection/service/event-bus.js +19 -0
  466. package/dist/collection/service/serialization.js +8 -0
  467. package/dist/collection/service/state-engine.js +247 -0
  468. package/dist/collection/service/theme-switcher.js +146 -0
  469. package/dist/collection/stories/Button.stories.js +15 -0
  470. package/dist/collection/types/common.js +1 -0
  471. package/dist/collection/types/index.js +4 -0
  472. package/dist/collection/utils/aria-live.js +60 -0
  473. package/dist/collection/utils/component-size.js +25 -0
  474. package/dist/collection/utils/dom.js +260 -0
  475. package/dist/collection/utils/focus-trap.js +135 -0
  476. package/dist/collection/utils/security.js +10 -0
  477. package/dist/collection/utils/test/setup-component-test-env.js +92 -0
  478. package/dist/collection/utils/utils.js +21 -0
  479. package/dist/collection/utils/validation.js +74 -0
  480. package/dist/components/avatar-group.js +1 -0
  481. package/dist/components/avatar.js +1 -0
  482. package/dist/components/badge.js +1 -0
  483. package/dist/components/button-toggle.js +1 -0
  484. package/dist/components/category-section.d.ts +11 -0
  485. package/dist/components/category-section.js +1 -0
  486. package/dist/components/category-section2.js +1 -0
  487. package/dist/components/checkbox.js +1 -0
  488. package/dist/components/context-menu.js +1 -0
  489. package/dist/components/dialog-footer.js +1 -0
  490. package/dist/components/dialog-header.js +1 -0
  491. package/dist/components/dom.js +1 -0
  492. package/dist/components/dropdown.js +1 -0
  493. package/dist/components/event-bus.js +1 -0
  494. package/dist/components/focus-trap.js +1 -0
  495. package/dist/components/icon.js +2 -0
  496. package/dist/components/index.d.ts +35 -0
  497. package/dist/components/index.js +1 -0
  498. package/dist/components/input.js +1 -0
  499. package/dist/components/layout-manager.d.ts +11 -0
  500. package/dist/components/layout-manager.js +1 -0
  501. package/dist/components/library-card.d.ts +11 -0
  502. package/dist/components/library-card.js +1 -0
  503. package/dist/components/library-card2.js +1 -0
  504. package/dist/components/list-group.js +1 -0
  505. package/dist/components/list-item.js +1 -0
  506. package/dist/components/lm-container.d.ts +11 -0
  507. package/dist/components/lm-container.js +1 -0
  508. package/dist/components/lm-container2.js +1 -0
  509. package/dist/components/lm-floating-window.d.ts +11 -0
  510. package/dist/components/lm-floating-window.js +1 -0
  511. package/dist/components/lm-floating-window2.js +1 -0
  512. package/dist/components/lm-panel.d.ts +11 -0
  513. package/dist/components/lm-panel.js +1 -0
  514. package/dist/components/lm-panel2.js +1 -0
  515. package/dist/components/lm-splitter.d.ts +11 -0
  516. package/dist/components/lm-splitter.js +1 -0
  517. package/dist/components/lm-splitter2.js +1 -0
  518. package/dist/components/lm-tabs.d.ts +11 -0
  519. package/dist/components/lm-tabs.js +1 -0
  520. package/dist/components/lm-tabs2.js +1 -0
  521. package/dist/components/my-component.d.ts +11 -0
  522. package/dist/components/my-component.js +1 -0
  523. package/dist/components/my-step.d.ts +11 -0
  524. package/dist/components/my-step.js +1 -0
  525. package/dist/components/nav-bar.d.ts +11 -0
  526. package/dist/components/nav-bar.js +1 -0
  527. package/dist/components/pagination.js +1 -0
  528. package/dist/components/radio.js +1 -0
  529. package/dist/components/range-slider.js +1 -0
  530. package/dist/components/rating.js +1 -0
  531. package/dist/components/resizable-panel.js +1 -0
  532. package/dist/components/skeleton-loader.js +1 -0
  533. package/dist/components/smart-step.d.ts +11 -0
  534. package/dist/components/smart-step.js +1 -0
  535. package/dist/components/stack.js +1 -0
  536. package/dist/components/switch.js +1 -0
  537. package/dist/components/tag-group.js +1 -0
  538. package/dist/components/tag.js +1 -0
  539. package/dist/components/timeline-item.d.ts +11 -0
  540. package/dist/components/timeline-item.js +1 -0
  541. package/dist/components/toggle-group.js +1 -0
  542. package/dist/components/tooltip.js +1 -0
  543. package/dist/components/ui-accordion.d.ts +11 -0
  544. package/dist/components/ui-accordion.js +1 -0
  545. package/dist/components/ui-advanced-data-table.d.ts +11 -0
  546. package/dist/components/ui-advanced-data-table.js +1 -0
  547. package/dist/components/ui-anchor.d.ts +11 -0
  548. package/dist/components/ui-anchor.js +1 -0
  549. package/dist/components/ui-animate-on-scroll.d.ts +11 -0
  550. package/dist/components/ui-animate-on-scroll.js +1 -0
  551. package/dist/components/ui-aside-panel.d.ts +11 -0
  552. package/dist/components/ui-aside-panel.js +1 -0
  553. package/dist/components/ui-avatar-group.d.ts +11 -0
  554. package/dist/components/ui-avatar-group.js +1 -0
  555. package/dist/components/ui-avatar.d.ts +11 -0
  556. package/dist/components/ui-avatar.js +1 -0
  557. package/dist/components/ui-badge.d.ts +11 -0
  558. package/dist/components/ui-badge.js +1 -0
  559. package/dist/components/ui-breadcrumb-item.d.ts +11 -0
  560. package/dist/components/ui-breadcrumb-item.js +1 -0
  561. package/dist/components/ui-breadcrumb.d.ts +11 -0
  562. package/dist/components/ui-breadcrumb.js +1 -0
  563. package/dist/components/ui-button-toggle-group.d.ts +11 -0
  564. package/dist/components/ui-button-toggle-group.js +1 -0
  565. package/dist/components/ui-button-toggle.d.ts +11 -0
  566. package/dist/components/ui-button-toggle.js +1 -0
  567. package/dist/components/ui-button.d.ts +11 -0
  568. package/dist/components/ui-button.js +1 -0
  569. package/dist/components/ui-callout-banner.d.ts +11 -0
  570. package/dist/components/ui-callout-banner.js +1 -0
  571. package/dist/components/ui-card.d.ts +11 -0
  572. package/dist/components/ui-card.js +1 -0
  573. package/dist/components/ui-carousel.d.ts +11 -0
  574. package/dist/components/ui-carousel.js +1 -0
  575. package/dist/components/ui-checkbox-group.d.ts +11 -0
  576. package/dist/components/ui-checkbox-group.js +1 -0
  577. package/dist/components/ui-checkbox.d.ts +11 -0
  578. package/dist/components/ui-checkbox.js +1 -0
  579. package/dist/components/ui-code-editor.d.ts +11 -0
  580. package/dist/components/ui-code-editor.js +1 -0
  581. package/dist/components/ui-code-preview.d.ts +11 -0
  582. package/dist/components/ui-code-preview.js +1 -0
  583. package/dist/components/ui-color-controller.d.ts +11 -0
  584. package/dist/components/ui-color-controller.js +1 -0
  585. package/dist/components/ui-color-picker.d.ts +11 -0
  586. package/dist/components/ui-color-picker.js +1 -0
  587. package/dist/components/ui-command-palette.d.ts +11 -0
  588. package/dist/components/ui-command-palette.js +1 -0
  589. package/dist/components/ui-context-menu.d.ts +11 -0
  590. package/dist/components/ui-context-menu.js +1 -0
  591. package/dist/components/ui-dialog-box.d.ts +11 -0
  592. package/dist/components/ui-dialog-box.js +1 -0
  593. package/dist/components/ui-dialog-content.d.ts +11 -0
  594. package/dist/components/ui-dialog-content.js +1 -0
  595. package/dist/components/ui-dialog-footer.d.ts +11 -0
  596. package/dist/components/ui-dialog-footer.js +1 -0
  597. package/dist/components/ui-dialog-header.d.ts +11 -0
  598. package/dist/components/ui-dialog-header.js +1 -0
  599. package/dist/components/ui-divider.d.ts +11 -0
  600. package/dist/components/ui-divider.js +1 -0
  601. package/dist/components/ui-dock-host.d.ts +11 -0
  602. package/dist/components/ui-dock-host.js +1 -0
  603. package/dist/components/ui-dock.d.ts +11 -0
  604. package/dist/components/ui-dock.js +1 -0
  605. package/dist/components/ui-drag-drop.d.ts +11 -0
  606. package/dist/components/ui-drag-drop.js +1 -0
  607. package/dist/components/ui-dropdown.d.ts +11 -0
  608. package/dist/components/ui-dropdown.js +1 -0
  609. package/dist/components/ui-empty-state.d.ts +11 -0
  610. package/dist/components/ui-empty-state.js +1 -0
  611. package/dist/components/ui-fab-item.d.ts +11 -0
  612. package/dist/components/ui-fab-item.js +1 -0
  613. package/dist/components/ui-fab.d.ts +11 -0
  614. package/dist/components/ui-fab.js +1 -0
  615. package/dist/components/ui-file-upload.d.ts +11 -0
  616. package/dist/components/ui-file-upload.js +1 -0
  617. package/dist/components/ui-horizontal-nav.d.ts +11 -0
  618. package/dist/components/ui-horizontal-nav.js +1 -0
  619. package/dist/components/ui-icon.d.ts +11 -0
  620. package/dist/components/ui-icon.js +1 -0
  621. package/dist/components/ui-image-button.d.ts +11 -0
  622. package/dist/components/ui-image-button.js +1 -0
  623. package/dist/components/ui-input-pair.d.ts +11 -0
  624. package/dist/components/ui-input-pair.js +1 -0
  625. package/dist/components/ui-input.d.ts +11 -0
  626. package/dist/components/ui-input.js +1 -0
  627. package/dist/components/ui-knob.d.ts +11 -0
  628. package/dist/components/ui-knob.js +1 -0
  629. package/dist/components/ui-library.d.ts +11 -0
  630. package/dist/components/ui-library.js +1 -0
  631. package/dist/components/ui-list-group.d.ts +11 -0
  632. package/dist/components/ui-list-group.js +1 -0
  633. package/dist/components/ui-list-item.d.ts +11 -0
  634. package/dist/components/ui-list-item.js +1 -0
  635. package/dist/components/ui-list.d.ts +11 -0
  636. package/dist/components/ui-list.js +1 -0
  637. package/dist/components/ui-masonry.d.ts +11 -0
  638. package/dist/components/ui-masonry.js +1 -0
  639. package/dist/components/ui-meter-group.d.ts +11 -0
  640. package/dist/components/ui-meter-group.js +1 -0
  641. package/dist/components/ui-navigation-bar.d.ts +11 -0
  642. package/dist/components/ui-navigation-bar.js +1 -0
  643. package/dist/components/ui-navigation-item.d.ts +11 -0
  644. package/dist/components/ui-navigation-item.js +1 -0
  645. package/dist/components/ui-number-input.d.ts +11 -0
  646. package/dist/components/ui-number-input.js +1 -0
  647. package/dist/components/ui-otp-input.d.ts +11 -0
  648. package/dist/components/ui-otp-input.js +1 -0
  649. package/dist/components/ui-pagination.d.ts +11 -0
  650. package/dist/components/ui-pagination.js +1 -0
  651. package/dist/components/ui-panel.d.ts +11 -0
  652. package/dist/components/ui-panel.js +1 -0
  653. package/dist/components/ui-pattern-input.d.ts +11 -0
  654. package/dist/components/ui-pattern-input.js +1 -0
  655. package/dist/components/ui-popover.d.ts +11 -0
  656. package/dist/components/ui-popover.js +1 -0
  657. package/dist/components/ui-progress.d.ts +11 -0
  658. package/dist/components/ui-progress.js +1 -0
  659. package/dist/components/ui-radio-group.d.ts +11 -0
  660. package/dist/components/ui-radio-group.js +1 -0
  661. package/dist/components/ui-radio.d.ts +11 -0
  662. package/dist/components/ui-radio.js +1 -0
  663. package/dist/components/ui-range-slider.d.ts +11 -0
  664. package/dist/components/ui-range-slider.js +1 -0
  665. package/dist/components/ui-rating.d.ts +11 -0
  666. package/dist/components/ui-rating.js +1 -0
  667. package/dist/components/ui-resizable-panel.d.ts +11 -0
  668. package/dist/components/ui-resizable-panel.js +1 -0
  669. package/dist/components/ui-scroll-top.d.ts +11 -0
  670. package/dist/components/ui-scroll-top.js +1 -0
  671. package/dist/components/ui-skeleton.d.ts +11 -0
  672. package/dist/components/ui-skeleton.js +1 -0
  673. package/dist/components/ui-smart-context-menu.d.ts +11 -0
  674. package/dist/components/ui-smart-context-menu.js +1 -0
  675. package/dist/components/ui-smart-location-dropdown.d.ts +11 -0
  676. package/dist/components/ui-smart-location-dropdown.js +1 -0
  677. package/dist/components/ui-smart-stepper.d.ts +11 -0
  678. package/dist/components/ui-smart-stepper.js +1 -0
  679. package/dist/components/ui-snackbar.d.ts +11 -0
  680. package/dist/components/ui-snackbar.js +1 -0
  681. package/dist/components/ui-speed-dial.d.ts +11 -0
  682. package/dist/components/ui-speed-dial.js +1 -0
  683. package/dist/components/ui-speedometer.d.ts +11 -0
  684. package/dist/components/ui-speedometer.js +1 -0
  685. package/dist/components/ui-splitter.d.ts +11 -0
  686. package/dist/components/ui-splitter.js +1 -0
  687. package/dist/components/ui-stack.d.ts +11 -0
  688. package/dist/components/ui-stack.js +1 -0
  689. package/dist/components/ui-step.d.ts +11 -0
  690. package/dist/components/ui-step.js +1 -0
  691. package/dist/components/ui-stepper.d.ts +11 -0
  692. package/dist/components/ui-stepper.js +1 -0
  693. package/dist/components/ui-switch.d.ts +11 -0
  694. package/dist/components/ui-switch.js +1 -0
  695. package/dist/components/ui-tabs.d.ts +11 -0
  696. package/dist/components/ui-tabs.js +1 -0
  697. package/dist/components/ui-tag-group.d.ts +11 -0
  698. package/dist/components/ui-tag-group.js +1 -0
  699. package/dist/components/ui-tag.d.ts +11 -0
  700. package/dist/components/ui-tag.js +1 -0
  701. package/dist/components/ui-timeline.d.ts +11 -0
  702. package/dist/components/ui-timeline.js +1 -0
  703. package/dist/components/ui-timer.d.ts +11 -0
  704. package/dist/components/ui-timer.js +1 -0
  705. package/dist/components/ui-toggle-group.d.ts +11 -0
  706. package/dist/components/ui-toggle-group.js +1 -0
  707. package/dist/components/ui-toolbar.d.ts +11 -0
  708. package/dist/components/ui-toolbar.js +1 -0
  709. package/dist/components/ui-tooltip.d.ts +11 -0
  710. package/dist/components/ui-tooltip.js +1 -0
  711. package/dist/components/ui-top-bar.d.ts +11 -0
  712. package/dist/components/ui-top-bar.js +1 -0
  713. package/dist/components/ui-transfer-list.d.ts +11 -0
  714. package/dist/components/ui-transfer-list.js +1 -0
  715. package/dist/components/ui-tree.d.ts +11 -0
  716. package/dist/components/ui-tree.js +1 -0
  717. package/dist/components/ui-workspace-manager.d.ts +11 -0
  718. package/dist/components/ui-workspace-manager.js +1 -0
  719. package/dist/components/utils.js +1 -0
  720. package/dist/esm/category-section.entry.js +28 -0
  721. package/dist/esm/component-size-C7gf39HE.js +27 -0
  722. package/dist/esm/dom-BMFah5q3.js +262 -0
  723. package/dist/esm/event-bus-vwwmWKs9.js +21 -0
  724. package/dist/esm/exploration-project-tailwind.js +20 -0
  725. package/dist/esm/focus-trap-BSQ8klD4.js +137 -0
  726. package/dist/esm/index-DUsoYu9r.js +2264 -0
  727. package/dist/esm/index.js +256 -0
  728. package/dist/esm/layout-manager.entry.js +614 -0
  729. package/dist/esm/library-card.entry.js +61 -0
  730. package/dist/esm/lm-container_2.entry.js +76 -0
  731. package/dist/esm/lm-panel_3.entry.js +104 -0
  732. package/dist/esm/loader.js +10 -0
  733. package/dist/esm/my-component.entry.js +31 -0
  734. package/dist/esm/my-step.entry.js +27 -0
  735. package/dist/esm/nav-bar.entry.js +245 -0
  736. package/dist/esm/security-D2WzX6vR.js +1545 -0
  737. package/dist/esm/smart-step.entry.js +45 -0
  738. package/dist/esm/timeline-item.entry.js +27 -0
  739. package/dist/esm/ui-accordion_10.entry.js +5722 -0
  740. package/dist/esm/ui-advanced-data-table.entry.js +2682 -0
  741. package/dist/esm/ui-anchor.entry.js +556 -0
  742. package/dist/esm/ui-animate-on-scroll.entry.js +283 -0
  743. package/dist/esm/ui-aside-panel.entry.js +636 -0
  744. package/dist/esm/ui-avatar-group_3.entry.js +630 -0
  745. package/dist/esm/ui-breadcrumb-item.entry.js +54 -0
  746. package/dist/esm/ui-breadcrumb.entry.js +199 -0
  747. package/dist/esm/ui-callout-banner.entry.js +289 -0
  748. package/dist/esm/ui-card.entry.js +409 -0
  749. package/dist/esm/ui-carousel.entry.js +545 -0
  750. package/dist/esm/ui-checkbox-group.entry.js +328 -0
  751. package/dist/esm/ui-checkbox.entry.js +258 -0
  752. package/dist/esm/ui-code-editor.entry.js +959 -0
  753. package/dist/esm/ui-code-preview.entry.js +313 -0
  754. package/dist/esm/ui-color-controller.entry.js +148 -0
  755. package/dist/esm/ui-color-picker.entry.js +656 -0
  756. package/dist/esm/ui-command-palette.entry.js +176 -0
  757. package/dist/esm/ui-dialog-box.entry.js +1806 -0
  758. package/dist/esm/ui-dialog-content.entry.js +29 -0
  759. package/dist/esm/ui-dialog-footer_2.entry.js +190 -0
  760. package/dist/esm/ui-divider.entry.js +479 -0
  761. package/dist/esm/ui-dock-host.entry.js +126 -0
  762. package/dist/esm/ui-dock.entry.js +219 -0
  763. package/dist/esm/ui-drag-drop.entry.js +170 -0
  764. package/dist/esm/ui-dropdown_2.entry.js +1549 -0
  765. package/dist/esm/ui-empty-state.entry.js +396 -0
  766. package/dist/esm/ui-fab-item.entry.js +37 -0
  767. package/dist/esm/ui-fab.entry.js +275 -0
  768. package/dist/esm/ui-file-upload.entry.js +416 -0
  769. package/dist/esm/ui-horizontal-nav.entry.js +133 -0
  770. package/dist/esm/ui-image-button.entry.js +65 -0
  771. package/dist/esm/ui-input-pair.entry.js +42 -0
  772. package/dist/esm/ui-knob.entry.js +445 -0
  773. package/dist/esm/ui-library.entry.js +132 -0
  774. package/dist/esm/ui-list-group_2.entry.js +583 -0
  775. package/dist/esm/ui-list.entry.js +730 -0
  776. package/dist/esm/ui-masonry.entry.js +476 -0
  777. package/dist/esm/ui-meter-group.entry.js +171 -0
  778. package/dist/esm/ui-navigation-item.entry.js +102 -0
  779. package/dist/esm/ui-number-input.entry.js +189 -0
  780. package/dist/esm/ui-otp-input.entry.js +244 -0
  781. package/dist/esm/ui-pagination_3.entry.js +1617 -0
  782. package/dist/esm/ui-panel.entry.js +612 -0
  783. package/dist/esm/ui-pattern-input.entry.js +276 -0
  784. package/dist/esm/ui-popover.entry.js +515 -0
  785. package/dist/esm/ui-progress.entry.js +514 -0
  786. package/dist/esm/ui-radio-group.entry.js +203 -0
  787. package/dist/esm/ui-radio.entry.js +204 -0
  788. package/dist/esm/ui-range-slider.entry.js +635 -0
  789. package/dist/esm/ui-resizable-panel.entry.js +482 -0
  790. package/dist/esm/ui-scroll-top.entry.js +457 -0
  791. package/dist/esm/ui-smart-context-menu.entry.js +374 -0
  792. package/dist/esm/ui-smart-location-dropdown.entry.js +563 -0
  793. package/dist/esm/ui-smart-stepper.entry.js +135 -0
  794. package/dist/esm/ui-snackbar.entry.js +861 -0
  795. package/dist/esm/ui-speed-dial.entry.js +518 -0
  796. package/dist/esm/ui-speedometer.entry.js +426 -0
  797. package/dist/esm/ui-splitter.entry.js +280 -0
  798. package/dist/esm/ui-step.entry.js +28 -0
  799. package/dist/esm/ui-stepper.entry.js +638 -0
  800. package/dist/esm/ui-switch.entry.js +403 -0
  801. package/dist/esm/ui-tabs.entry.js +701 -0
  802. package/dist/esm/ui-tag.entry.js +297 -0
  803. package/dist/esm/ui-timeline.entry.js +265 -0
  804. package/dist/esm/ui-timer.entry.js +500 -0
  805. package/dist/esm/ui-toolbar.entry.js +617 -0
  806. package/dist/esm/ui-tooltip.entry.js +695 -0
  807. package/dist/esm/ui-top-bar.entry.js +119 -0
  808. package/dist/esm/ui-transfer-list.entry.js +590 -0
  809. package/dist/esm/ui-tree.entry.js +872 -0
  810. package/dist/esm/ui-workspace-manager.entry.js +1199 -0
  811. package/dist/esm/utils-Ck6jDuhz.js +23 -0
  812. package/dist/exploration-project-tailwind/exploration-project-tailwind.css +1 -0
  813. package/dist/exploration-project-tailwind/exploration-project-tailwind.esm.js +1 -0
  814. package/dist/exploration-project-tailwind/index.esm.js +1 -0
  815. package/dist/exploration-project-tailwind/p-01c7db7a.entry.js +1 -0
  816. package/dist/exploration-project-tailwind/p-049744f9.entry.js +1 -0
  817. package/dist/exploration-project-tailwind/p-06f0c679.entry.js +1 -0
  818. package/dist/exploration-project-tailwind/p-0b004861.entry.js +1 -0
  819. package/dist/exploration-project-tailwind/p-0d31c9e9.entry.js +1 -0
  820. package/dist/exploration-project-tailwind/p-148e81df.entry.js +1 -0
  821. package/dist/exploration-project-tailwind/p-200241f8.entry.js +1 -0
  822. package/dist/exploration-project-tailwind/p-287dbf09.entry.js +1 -0
  823. package/dist/exploration-project-tailwind/p-2d273118.entry.js +1 -0
  824. package/dist/exploration-project-tailwind/p-2f1aebb3.entry.js +1 -0
  825. package/dist/exploration-project-tailwind/p-2f961934.entry.js +1 -0
  826. package/dist/exploration-project-tailwind/p-35296877.entry.js +1 -0
  827. package/dist/exploration-project-tailwind/p-36861546.entry.js +1 -0
  828. package/dist/exploration-project-tailwind/p-3d3d48fd.entry.js +1 -0
  829. package/dist/exploration-project-tailwind/p-41cd6bf0.entry.js +1 -0
  830. package/dist/exploration-project-tailwind/p-45482d86.entry.js +1 -0
  831. package/dist/exploration-project-tailwind/p-46596a28.entry.js +1 -0
  832. package/dist/exploration-project-tailwind/p-46efdea3.entry.js +1 -0
  833. package/dist/exploration-project-tailwind/p-47e2a7ee.entry.js +1 -0
  834. package/dist/exploration-project-tailwind/p-4d73c143.entry.js +1 -0
  835. package/dist/exploration-project-tailwind/p-4de419d5.entry.js +1 -0
  836. package/dist/exploration-project-tailwind/p-4f6bba75.entry.js +1 -0
  837. package/dist/exploration-project-tailwind/p-5508874f.entry.js +1 -0
  838. package/dist/exploration-project-tailwind/p-5ce0dbd8.entry.js +1 -0
  839. package/dist/exploration-project-tailwind/p-5e3e80ae.entry.js +1 -0
  840. package/dist/exploration-project-tailwind/p-61717490.entry.js +1 -0
  841. package/dist/exploration-project-tailwind/p-62352ef2.entry.js +1 -0
  842. package/dist/exploration-project-tailwind/p-64e3a484.entry.js +1 -0
  843. package/dist/exploration-project-tailwind/p-6ab80ead.entry.js +1 -0
  844. package/dist/exploration-project-tailwind/p-6e9694f2.entry.js +1 -0
  845. package/dist/exploration-project-tailwind/p-6fa9dc15.entry.js +1 -0
  846. package/dist/exploration-project-tailwind/p-70d82d79.entry.js +1 -0
  847. package/dist/exploration-project-tailwind/p-717dad1f.entry.js +1 -0
  848. package/dist/exploration-project-tailwind/p-7376ac95.entry.js +1 -0
  849. package/dist/exploration-project-tailwind/p-73d29a4a.entry.js +1 -0
  850. package/dist/exploration-project-tailwind/p-7515b1e3.entry.js +1 -0
  851. package/dist/exploration-project-tailwind/p-77124686.entry.js +1 -0
  852. package/dist/exploration-project-tailwind/p-77a21491.entry.js +1 -0
  853. package/dist/exploration-project-tailwind/p-77cc333a.entry.js +1 -0
  854. package/dist/exploration-project-tailwind/p-7f91d949.entry.js +1 -0
  855. package/dist/exploration-project-tailwind/p-807c6555.entry.js +1 -0
  856. package/dist/exploration-project-tailwind/p-81961fb1.entry.js +1 -0
  857. package/dist/exploration-project-tailwind/p-85bf89fd.entry.js +1 -0
  858. package/dist/exploration-project-tailwind/p-85e36111.entry.js +1 -0
  859. package/dist/exploration-project-tailwind/p-875be805.entry.js +1 -0
  860. package/dist/exploration-project-tailwind/p-898dd0fa.entry.js +1 -0
  861. package/dist/exploration-project-tailwind/p-8d951aef.entry.js +1 -0
  862. package/dist/exploration-project-tailwind/p-9d0c8760.entry.js +1 -0
  863. package/dist/exploration-project-tailwind/p-9fa70359.entry.js +1 -0
  864. package/dist/exploration-project-tailwind/p-9fc06ff0.entry.js +1 -0
  865. package/dist/exploration-project-tailwind/p-BMFah5q3.js +1 -0
  866. package/dist/exploration-project-tailwind/p-BSQ8klD4.js +1 -0
  867. package/dist/exploration-project-tailwind/p-C7gf39HE.js +1 -0
  868. package/dist/exploration-project-tailwind/p-Ck6jDuhz.js +1 -0
  869. package/dist/exploration-project-tailwind/p-D2WzX6vR.js +2 -0
  870. package/dist/exploration-project-tailwind/p-DUsoYu9r.js +2 -0
  871. package/dist/exploration-project-tailwind/p-a1ad32a2.entry.js +1 -0
  872. package/dist/exploration-project-tailwind/p-a3f465d9.entry.js +1 -0
  873. package/dist/exploration-project-tailwind/p-a42fdc33.entry.js +1 -0
  874. package/dist/exploration-project-tailwind/p-a4f52a76.entry.js +1 -0
  875. package/dist/exploration-project-tailwind/p-aa85ff78.entry.js +1 -0
  876. package/dist/exploration-project-tailwind/p-ab752761.entry.js +1 -0
  877. package/dist/exploration-project-tailwind/p-ba21fed3.entry.js +1 -0
  878. package/dist/exploration-project-tailwind/p-c174a372.entry.js +1 -0
  879. package/dist/exploration-project-tailwind/p-c2ca71ac.entry.js +1 -0
  880. package/dist/exploration-project-tailwind/p-c4ba7e52.entry.js +1 -0
  881. package/dist/exploration-project-tailwind/p-c5ddc817.entry.js +1 -0
  882. package/dist/exploration-project-tailwind/p-c69dd43e.entry.js +1 -0
  883. package/dist/exploration-project-tailwind/p-c6fd72e1.entry.js +1 -0
  884. package/dist/exploration-project-tailwind/p-c7e87fbb.entry.js +1 -0
  885. package/dist/exploration-project-tailwind/p-c87aeab6.entry.js +1 -0
  886. package/dist/exploration-project-tailwind/p-c90722ec.entry.js +1 -0
  887. package/dist/exploration-project-tailwind/p-ccb5c737.entry.js +1 -0
  888. package/dist/exploration-project-tailwind/p-ce1222a1.entry.js +1 -0
  889. package/dist/exploration-project-tailwind/p-d16c9635.entry.js +1 -0
  890. package/dist/exploration-project-tailwind/p-d2308a00.entry.js +1 -0
  891. package/dist/exploration-project-tailwind/p-d30e24bd.entry.js +1 -0
  892. package/dist/exploration-project-tailwind/p-d419eaf0.entry.js +1 -0
  893. package/dist/exploration-project-tailwind/p-debede45.entry.js +1 -0
  894. package/dist/exploration-project-tailwind/p-e5322e59.entry.js +1 -0
  895. package/dist/exploration-project-tailwind/p-e8ba0c95.entry.js +1 -0
  896. package/dist/exploration-project-tailwind/p-e90d5307.entry.js +1 -0
  897. package/dist/exploration-project-tailwind/p-ea51c5d8.entry.js +1 -0
  898. package/dist/exploration-project-tailwind/p-ecda1cc3.entry.js +1 -0
  899. package/dist/exploration-project-tailwind/p-f0830120.entry.js +1 -0
  900. package/dist/exploration-project-tailwind/p-f11e5cae.entry.js +1 -0
  901. package/dist/exploration-project-tailwind/p-f5719913.entry.js +1 -0
  902. package/dist/exploration-project-tailwind/p-ffb1754a.entry.js +1 -0
  903. package/dist/exploration-project-tailwind/p-vwwmWKs9.js +1 -0
  904. package/dist/index.cjs.js +1 -0
  905. package/dist/index.js +1 -0
  906. package/dist/types/components/accordion/accordion.d.ts +352 -0
  907. package/dist/types/components/accordion/types.d.ts +69 -0
  908. package/dist/types/components/advanced-data-table/advanced-data-table.d.ts +697 -0
  909. package/dist/types/components/advanced-data-table/types.d.ts +120 -0
  910. package/dist/types/components/anchor/anchor.d.ts +133 -0
  911. package/dist/types/components/anchor/types.d.ts +17 -0
  912. package/dist/types/components/animate-on-scroll/animate-on-scroll.d.ts +101 -0
  913. package/dist/types/components/aside-panel/aside-panel.d.ts +249 -0
  914. package/dist/types/components/avatar/avatar.d.ts +201 -0
  915. package/dist/types/components/avatar/types.d.ts +132 -0
  916. package/dist/types/components/avatar-group/avatar-group.d.ts +52 -0
  917. package/dist/types/components/avatar-group/types.d.ts +31 -0
  918. package/dist/types/components/badge/badge.d.ts +109 -0
  919. package/dist/types/components/badge/types.d.ts +6 -0
  920. package/dist/types/components/breadcrumb/breadcrumb-item.d.ts +36 -0
  921. package/dist/types/components/breadcrumb/breadcrumb.d.ts +73 -0
  922. package/dist/types/components/breadcrumb/types.d.ts +5 -0
  923. package/dist/types/components/button/button.d.ts +133 -0
  924. package/dist/types/components/button/types.d.ts +1 -0
  925. package/dist/types/components/button-toggle/button-toggle.d.ts +64 -0
  926. package/dist/types/components/button-toggle-group/button-toggle-group.d.ts +141 -0
  927. package/dist/types/components/button-toggle-group/types.d.ts +7 -0
  928. package/dist/types/components/callout-banner/callout-banner.d.ts +115 -0
  929. package/dist/types/components/callout-banner/types.d.ts +7 -0
  930. package/dist/types/components/card/card.d.ts +160 -0
  931. package/dist/types/components/card/types.d.ts +13 -0
  932. package/dist/types/components/carousel/carousel.d.ts +150 -0
  933. package/dist/types/components/carousel/types.d.ts +8 -0
  934. package/dist/types/components/checkbox/checkbox.d.ts +92 -0
  935. package/dist/types/components/checkbox/types.d.ts +5 -0
  936. package/dist/types/components/checkbox-group/checkbox-group.d.ts +87 -0
  937. package/dist/types/components/checkbox-group/types.d.ts +8 -0
  938. package/dist/types/components/code-editor/code-editor.d.ts +147 -0
  939. package/dist/types/components/code-editor/types.d.ts +20 -0
  940. package/dist/types/components/code-preview/types.d.ts +5 -0
  941. package/dist/types/components/code-preview/ui-code-preview.d.ts +69 -0
  942. package/dist/types/components/color-controller/color-controller.d.ts +24 -0
  943. package/dist/types/components/color-picker/color-picker.d.ts +116 -0
  944. package/dist/types/components/color-picker/types.d.ts +24 -0
  945. package/dist/types/components/command-palette/command-palette.d.ts +41 -0
  946. package/dist/types/components/command-palette/types.d.ts +7 -0
  947. package/dist/types/components/context-menu/context-menu.d.ts +135 -0
  948. package/dist/types/components/context-menu/types.d.ts +20 -0
  949. package/dist/types/components/dialog-box/dialog-box.d.ts +648 -0
  950. package/dist/types/components/dialog-box/types.d.ts +1 -0
  951. package/dist/types/components/dialog-content/dialog-content.d.ts +9 -0
  952. package/dist/types/components/dialog-footer/dialog-footer.d.ts +9 -0
  953. package/dist/types/components/dialog-footer/types.d.ts +1 -0
  954. package/dist/types/components/dialog-header/dialog-header.d.ts +102 -0
  955. package/dist/types/components/dialog-header/types.d.ts +2 -0
  956. package/dist/types/components/divider/divider.d.ts +245 -0
  957. package/dist/types/components/divider/types.d.ts +14 -0
  958. package/dist/types/components/dock/dock.d.ts +37 -0
  959. package/dist/types/components/dock/types.d.ts +11 -0
  960. package/dist/types/components/dock-host/index.d.ts +1 -0
  961. package/dist/types/components/dock-host/types.d.ts +1 -0
  962. package/dist/types/components/dock-host/ui-dock-host.d.ts +23 -0
  963. package/dist/types/components/drag-drop/drag-drop.d.ts +52 -0
  964. package/dist/types/components/drag-drop/types.d.ts +9 -0
  965. package/dist/types/components/dropdown/dropdown.d.ts +264 -0
  966. package/dist/types/components/dropdown/types.d.ts +19 -0
  967. package/dist/types/components/empty-state/empty-state.d.ts +74 -0
  968. package/dist/types/components/empty-state/types.d.ts +13 -0
  969. package/dist/types/components/fab/fab.d.ts +73 -0
  970. package/dist/types/components/fab-item/fab-item.d.ts +14 -0
  971. package/dist/types/components/fab-item/types.d.ts +3 -0
  972. package/dist/types/components/file-upload/file-upload.d.ts +91 -0
  973. package/dist/types/components/file-upload/types.d.ts +15 -0
  974. package/dist/types/components/horizontal-nav/horizontal-nav.d.ts +68 -0
  975. package/dist/types/components/icon/icon.d.ts +66 -0
  976. package/dist/types/components/image-button/image-button.d.ts +31 -0
  977. package/dist/types/components/image-button/types.d.ts +1 -0
  978. package/dist/types/components/input/input.d.ts +217 -0
  979. package/dist/types/components/input/types.d.ts +6 -0
  980. package/dist/types/components/input-pair/input-pair.d.ts +28 -0
  981. package/dist/types/components/knob/knob.d.ts +147 -0
  982. package/dist/types/components/knob/types.d.ts +4 -0
  983. package/dist/types/components/layout-manager/layout-manager.d.ts +32 -0
  984. package/dist/types/components/layout-manager/lm-container/lm-container.d.ts +7 -0
  985. package/dist/types/components/layout-manager/lm-floating-window/lm-floating-window.d.ts +6 -0
  986. package/dist/types/components/layout-manager/lm-panel/lm-panel.d.ts +7 -0
  987. package/dist/types/components/layout-manager/lm-splitter/lm-splitter.d.ts +12 -0
  988. package/dist/types/components/layout-manager/lm-tabs/lm-tabs.d.ts +12 -0
  989. package/dist/types/components/layout-manager/types.d.ts +1 -0
  990. package/dist/types/components/library/category-section.d.ts +15 -0
  991. package/dist/types/components/library/data.d.ts +11 -0
  992. package/dist/types/components/library/library-card.d.ts +19 -0
  993. package/dist/types/components/library/library.d.ts +9 -0
  994. package/dist/types/components/list/list.d.ts +183 -0
  995. package/dist/types/components/list-group/list-group.d.ts +28 -0
  996. package/dist/types/components/list-item/list-item.d.ts +200 -0
  997. package/dist/types/components/masonry/masonry.d.ts +105 -0
  998. package/dist/types/components/masonry/types.d.ts +5 -0
  999. package/dist/types/components/meter-group/meter-group.d.ts +66 -0
  1000. package/dist/types/components/meter-group/types.d.ts +12 -0
  1001. package/dist/types/components/my-component/my-component.d.ts +16 -0
  1002. package/dist/types/components/my-step/index.d.ts +12 -0
  1003. package/dist/types/components/my-step/my-step.d.ts +13 -0
  1004. package/dist/types/components/nav-bar/nav-bar.d.ts +119 -0
  1005. package/dist/types/components/number-input/number-input.d.ts +72 -0
  1006. package/dist/types/components/otp-input/otp-input.d.ts +64 -0
  1007. package/dist/types/components/otp-input/types.d.ts +3 -0
  1008. package/dist/types/components/pagination/pagination.d.ts +295 -0
  1009. package/dist/types/components/pagination/types.d.ts +1 -0
  1010. package/dist/types/components/panel/panel.d.ts +275 -0
  1011. package/dist/types/components/panel/types.d.ts +7 -0
  1012. package/dist/types/components/pattern-input/pattern-input.d.ts +88 -0
  1013. package/dist/types/components/popover/popover.d.ts +161 -0
  1014. package/dist/types/components/popover/types.d.ts +3 -0
  1015. package/dist/types/components/progress/progress.d.ts +224 -0
  1016. package/dist/types/components/progress/types.d.ts +6 -0
  1017. package/dist/types/components/radio/radio.d.ts +87 -0
  1018. package/dist/types/components/radio/types.d.ts +7 -0
  1019. package/dist/types/components/radio-group/radio-group.d.ts +74 -0
  1020. package/dist/types/components/radio-group/types.d.ts +2 -0
  1021. package/dist/types/components/range-slider/range-slider.d.ts +201 -0
  1022. package/dist/types/components/range-slider/types.d.ts +4 -0
  1023. package/dist/types/components/rating/rating.d.ts +127 -0
  1024. package/dist/types/components/rating/types.d.ts +1 -0
  1025. package/dist/types/components/resizable-panel/resizable-panel.d.ts +59 -0
  1026. package/dist/types/components/resizable-panel/types.d.ts +11 -0
  1027. package/dist/types/components/scroll-top/scroll-top.d.ts +186 -0
  1028. package/dist/types/components/scroll-top/types.d.ts +1 -0
  1029. package/dist/types/components/skeleton/skeleton-loader.d.ts +149 -0
  1030. package/dist/types/components/skeleton/types.d.ts +1 -0
  1031. package/dist/types/components/smart-location-dropdown/smart-location-dropdown.d.ts +119 -0
  1032. package/dist/types/components/smart-location-dropdown/types.d.ts +37 -0
  1033. package/dist/types/components/smart-menu/menu-item.interface.d.ts +10 -0
  1034. package/dist/types/components/smart-menu/smart-menu.d.ts +64 -0
  1035. package/dist/types/components/smart-stepper/smart-step.d.ts +29 -0
  1036. package/dist/types/components/smart-stepper/smart-stepper.d.ts +53 -0
  1037. package/dist/types/components/snackbar/snackbar.d.ts +223 -0
  1038. package/dist/types/components/snackbar/types.d.ts +104 -0
  1039. package/dist/types/components/speed-dial/speed-dial.d.ts +171 -0
  1040. package/dist/types/components/speed-dial/types.d.ts +11 -0
  1041. package/dist/types/components/speedometer/speedometer.d.ts +125 -0
  1042. package/dist/types/components/speedometer/types.d.ts +8 -0
  1043. package/dist/types/components/splitter/splitter.d.ts +63 -0
  1044. package/dist/types/components/splitter/types.d.ts +9 -0
  1045. package/dist/types/components/stack/stack.d.ts +34 -0
  1046. package/dist/types/components/stack/types.d.ts +3 -0
  1047. package/dist/types/components/step/step.d.ts +16 -0
  1048. package/dist/types/components/step/types.d.ts +1 -0
  1049. package/dist/types/components/stepper/stepper.d.ts +218 -0
  1050. package/dist/types/components/stepper/types.d.ts +39 -0
  1051. package/dist/types/components/switch/switch.d.ts +162 -0
  1052. package/dist/types/components/tabs/tabs.d.ts +182 -0
  1053. package/dist/types/components/tabs/types.d.ts +17 -0
  1054. package/dist/types/components/tag/tag.d.ts +172 -0
  1055. package/dist/types/components/tag/types.d.ts +4 -0
  1056. package/dist/types/components/tag-group/tag-group.d.ts +107 -0
  1057. package/dist/types/components/tag-group/types.d.ts +2 -0
  1058. package/dist/types/components/timeline/timeline.d.ts +73 -0
  1059. package/dist/types/components/timeline/types.d.ts +28 -0
  1060. package/dist/types/components/timeline/ui-timeline.stories.d.ts +9 -0
  1061. package/dist/types/components/timeline-item/timeline-item.d.ts +15 -0
  1062. package/dist/types/components/timer/timer.d.ts +123 -0
  1063. package/dist/types/components/timer/types.d.ts +18 -0
  1064. package/dist/types/components/timer/ui-timer.stories.d.ts +9 -0
  1065. package/dist/types/components/toggle-group/toggle-group.d.ts +136 -0
  1066. package/dist/types/components/toggle-group/types.d.ts +5 -0
  1067. package/dist/types/components/toolbar/toolbar-types.d.ts +189 -0
  1068. package/dist/types/components/toolbar/toolbar.d.ts +150 -0
  1069. package/dist/types/components/tooltip/tooltip.d.ts +166 -0
  1070. package/dist/types/components/tooltip/types.d.ts +3 -0
  1071. package/dist/types/components/top-bar/top-bar.d.ts +76 -0
  1072. package/dist/types/components/transfer-list/transfer-list.d.ts +137 -0
  1073. package/dist/types/components/transfer-list/types.d.ts +13 -0
  1074. package/dist/types/components/tree/tree.d.ts +180 -0
  1075. package/dist/types/components/tree/types.d.ts +76 -0
  1076. package/dist/types/components/ui-navigation-bar/navigation-bar/navigation-bar.d.ts +108 -0
  1077. package/dist/types/components/ui-navigation-bar/navigation-bar/navigation-types.d.ts +17 -0
  1078. package/dist/types/components/ui-navigation-bar/navigation-item.d.ts +26 -0
  1079. package/dist/types/components/ui-navigation-bar/navigation-types.d.ts +19 -0
  1080. package/dist/types/components/workspace-manager/types.d.ts +48 -0
  1081. package/dist/types/components/workspace-manager/workspace-manager.d.ts +211 -0
  1082. package/dist/types/components.d.ts +29634 -0
  1083. package/dist/types/index.d.ts +21 -0
  1084. package/dist/types/service/drag-manager.d.ts +8 -0
  1085. package/dist/types/service/event-bus.d.ts +9 -0
  1086. package/dist/types/service/serialization.d.ts +5 -0
  1087. package/dist/types/service/state-engine.d.ts +25 -0
  1088. package/dist/types/service/theme-switcher.d.ts +46 -0
  1089. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  1090. package/dist/types/types/animation.type.d.ts +96 -0
  1091. package/dist/types/types/common.d.ts +52 -0
  1092. package/dist/types/types/common.type.d.ts +608 -0
  1093. package/dist/types/types/index.d.ts +37 -0
  1094. package/dist/types/types/text.type.d.ts +32 -0
  1095. package/dist/types/utils/aria-live.d.ts +20 -0
  1096. package/dist/types/utils/component-size.d.ts +2 -0
  1097. package/dist/types/utils/dom.d.ts +58 -0
  1098. package/dist/types/utils/focus-trap.d.ts +35 -0
  1099. package/dist/types/utils/security.d.ts +5 -0
  1100. package/dist/types/utils/test/setup-component-test-env.d.ts +14 -0
  1101. package/dist/types/utils/utils.d.ts +7 -0
  1102. package/dist/types/utils/validation.d.ts +43 -0
  1103. package/loader/cdn.js +1 -0
  1104. package/loader/index.cjs.js +1 -0
  1105. package/loader/index.d.ts +24 -0
  1106. package/loader/index.es2017.js +1 -0
  1107. package/loader/index.js +2 -0
  1108. package/package.json +77 -0
@@ -0,0 +1,2684 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-ClkOYpT8.js');
4
+
5
+ const advancedDataTableCss = () => `.sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border-width:0 !important}.a11y-sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border-width:0 !important}:host([color=primary]),.table-color-primary{--table-primary:var(--color-primary-hover, #2563eb);--table-primary-rgb:var(--color-primary-rgb)}:host([color=secondary]),.table-color-secondary{--table-primary:var(--color-primary, #64748b);--table-primary-rgb:var(--color-primary-rgb)}:host([color=success]),.table-color-success{--table-primary:var(--color-success, #10b981);--table-primary-rgb:var(--color-primary-rgb)}:host([color=danger]),.table-color-danger{--table-primary:var(--color-danger, #ef4444);--table-primary-rgb:var(--color-primary-rgb)}:host([color=warning]),.table-color-warning{--table-primary:var(--color-warning, #f59e0b);--table-primary-rgb:var(--color-primary-rgb)}:host([color=info]),.table-color-info{--table-primary:var(--color-primary, #0ea5e9);--table-primary-rgb:var(--color-primary-rgb)}:host{display:block;font-family:"Inter", -apple-system, sans-serif;--table-bg:var(--bg-primary, #ffffff);--table-header-bg:var(--bg-primary, #f8fafc);--table-border:var(--border-subtle, #f1f5f9);--table-text:var(--text-primary, #1e293b);--table-text-secondary:var(--color-primary, #64748b);--table-text-secondary-rgb:100, 116, 139;--table-hover:var(--bg-primary, #f1f5f9);--table-primary:var(--color-primary-hover, #2563eb);--table-primary-rgb:37, 99, 235;--table-selected:rgba(var(--table-primary-rgb), 0.1);--table-shadow:rgba(0, 0, 0, 0.05);--table-striped-bg:rgba(0, 0, 0, 0.02);--table-striped-bg-dark:rgba(255, 255, 255, 0.02)}.data-table-container{background:var(--table-bg);border-radius:8px;box-shadow:0 1px 3px var(--table-shadow);overflow:hidden}.data-table-container.dark-mode{--table-bg:var(--bg-secondary, #0f172a);--table-header-bg:var(--bg-primary, #1e293b);--table-border:rgba(255, 255, 255, 0.05);--table-text:var(--bg-primary, #f8fafc);--table-text-secondary:var(--color-primary, #94a3b8);--table-hover:rgba(255, 255, 255, 0.03);--table-selected:rgba(var(--table-primary-rgb), 0.1);--table-shadow:rgba(0, 0, 0, 0.4)}.advanced-table-glass{background:transparent !important;box-shadow:none !important}.advanced-table-glass .table-toolbar{background:rgba(255, 255, 255, 0.03);backdrop-filter:blur(12px) saturate(160%);border-color:rgba(255, 255, 255, 0.08)}.advanced-table-glass .data-table thead{background:rgba(255, 255, 255, 0.05);backdrop-filter:blur(8px)}.advanced-table-glass .data-table tbody tr{background:transparent}.advanced-table-glass .data-table tbody tr:hover{background:rgba(255, 255, 255, 0.04)}.advanced-table-glass.dark-mode .table-toolbar{background:rgba(0, 0, 0, 0.2)}.advanced-table-glass.dark-mode .data-table thead{background:rgba(0, 0, 0, 0.3)}.advanced-table-raised{box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);border:1px solid rgba(0, 0, 0, 0.05)}.advanced-table-raised .data-table thead{background:linear-gradient(to bottom, var(--bg-primary, #f8fafc), var(--bg-secondary, #f1f5f9))}.table-toolbar{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--table-header-bg);border-bottom:1px solid var(--table-border);gap:16px;flex-wrap:wrap;transition:all cubic-bezier(0.4, 0, 0.2, 1)}.toolbar-left,.toolbar-right{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.search-box{position:relative;min-width:250px}.search-box input{width:100%;padding:8px 36px 8px 12px;border:1px solid var(--table-border);border-radius:6px;font-size:14px;background:var(--table-bg);color:var(--table-text);transition:all 0.2s}.search-box input:focus{outline:none;border-color:var(--table-primary);box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.search-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;opacity:0.5}.toolbar-btn{padding:8px 16px;background:var(--table-bg);color:var(--table-text);border:1px solid var(--table-border);border-radius:6px;font-size:14px;cursor:pointer;transition:all 0.2s;display:flex;align-items:center;gap:6px}.toolbar-btn:hover{background:var(--table-hover);border-color:var(--table-primary)}.toolbar-btn:active{transform:scale(0.98)}.table-wrapper{overflow-x:auto;overflow-y:auto;max-height:70vh;position:relative}.table-wrapper::-webkit-scrollbar{width:8px;height:8px}.table-wrapper::-webkit-scrollbar-track{background:var(--table-header-bg)}.table-wrapper::-webkit-scrollbar-thumb{background:var(--table-border);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--table-text-secondary)}.data-table{width:100%;border-collapse:collapse;color:var(--table-text);font-size:13.5px;letter-spacing:-0.01em}.data-table.bordered{border:1px solid var(--table-border);border-radius:8px}.data-table thead{background:var(--table-header-bg);position:relative;z-index:10}.data-table.sticky-header thead{position:sticky;top:0;z-index:20}.data-table th{padding:14px 20px;text-align:left;font-weight:600;white-space:nowrap;background:var(--table-header-bg);color:var(--table-text-secondary);border-bottom:2px solid var(--table-border);user-select:none;text-transform:uppercase;font-size:11px;letter-spacing:0.05em;transition:background cubic-bezier(0.4, 0, 0.2, 1), color cubic-bezier(0.4, 0, 0.2, 1)}.data-table th.sticky-column{position:sticky;left:0;z-index:30;box-shadow:2px 0 4px var(--table-shadow)}.data-table th.sortable{cursor:pointer;transition:background 0.2s}.data-table th.sortable:hover{background:var(--table-hover)}.column-header-content{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:24px}.drag-handle{cursor:grab;padding:0 4px;margin-right:4px;color:var(--table-text-secondary);font-size:14px;line-height:1;opacity:0.6;transition:all 0.2s;user-select:none;letter-spacing:-2px}.drag-handle:hover{opacity:1;color:var(--table-primary)}.drag-handle:active{cursor:grabbing}.column-label{flex:1;cursor:pointer;user-select:none}.data-table th.sortable .column-label:hover{color:var(--table-primary)}.column-header-content span:first-child{flex:1}.sort-icon{font-size:12px;opacity:0.5;transition:opacity 0.2s}.data-table th.sorted .sort-icon{opacity:1;color:var(--table-primary)}.column-filter{margin-top:8px}.column-filter input{width:100%;padding:4px 8px;border:1px solid var(--table-border);border-radius:4px;font-size:12px;background:var(--table-bg);color:var(--table-text)}.column-filter input:focus{outline:none;border-color:var(--table-primary)}.column-group{border-bottom:1px solid var(--table-border);background:var(--table-header-bg);font-weight:700}.resize-handle{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;user-select:none;background:transparent;transition:background 0.2s;z-index:10}.resize-handle:hover{background:var(--table-primary)}.resize-handle::before{content:"";position:absolute;top:0;bottom:0;left:-2px;right:-2px;}.data-table th.resizing{user-select:none;cursor:col-resize}.data-table th.resizing .resize-handle{background:var(--table-primary)}.data-table tbody tr{transition:background cubic-bezier(0.4, 0, 0.2, 1);border-bottom:1px solid var(--table-border)}.data-table.hoverable tbody tr:hover{background:var(--table-hover);box-shadow:inset 4px 0 0 var(--table-primary)}.data-table.striped tbody tr:nth-child(even){background:var(--table-striped-bg)}.data-table-container.dark-mode .data-table.striped tbody tr:nth-child(even){background:var(--table-striped-bg-dark)}.data-table tbody tr.selected{background:var(--table-selected) !important}.data-table td{padding:14px 20px;color:var(--table-text);transition:color cubic-bezier(0.4, 0, 0.2, 1)}.data-table.compact td,.data-table.compact th{padding:6px 12px}.data-table.comfortable td,.data-table.comfortable th{padding:16px 20px}.data-table td.sticky-column{position:sticky;left:0;background:var(--table-bg);z-index:15;box-shadow:2px 0 4px var(--table-shadow)}.data-table tbody tr:hover td.sticky-column{background:var(--table-hover)}.data-table tbody tr.selected td.sticky-column{background:var(--table-selected)}.select-column{width:48px;text-align:center !important;padding:8px !important}.select-column input[type=checkbox]{width:18px;height:18px;cursor:pointer;accent-color:var(--table-primary)}.actions-column{width:60px;text-align:center !important;padding:8px !important;position:relative}.row-actions-container{position:relative;display:inline-block}.row-actions-trigger{background:transparent;border:none;cursor:pointer;padding:4px 8px;border-radius:4px;color:var(--table-text-secondary);font-size:18px;line-height:1;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center}.row-actions-trigger:hover{background:var(--table-hover);color:var(--table-text)}.row-actions-trigger:active{background:var(--table-border)}.action-dots{font-weight:bold;letter-spacing:-2px}.row-actions-menu{position:absolute;top:100%;right:0;background:var(--table-bg);border:1px solid var(--table-border);border-radius:6px;box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);min-width:140px;z-index:1000;margin-top:4px;overflow:hidden;animation:fadeInMenu 0.15s ease-out}@keyframes fadeInMenu{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.row-action-item{display:flex;align-items:center;gap:8px;width:100%;padding:10px 14px;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--table-text);font-size:14px;transition:background 0.15s ease;border-bottom:1px solid var(--table-border)}.row-action-item:last-child{border-bottom:none}.row-action-item:hover{background:var(--table-hover)}.row-action-item:active{background:var(--table-border)}.action-icon{font-size:16px;width:20px;display:flex;align-items:center;justify-content:center}.action-label{flex:1}.grouping-selector{display:flex;align-items:center;gap:8px;margin-left:16px}.grouping-selector label{font-size:14px;font-weight:500;color:var(--table-text);white-space:nowrap}.grouping-selector select{padding:8px 12px;border:1px solid var(--table-border);border-radius:6px;font-size:14px;background:var(--table-bg);color:var(--table-text);cursor:pointer;min-width:150px;transition:all 0.2s}.grouping-selector select:focus{outline:none;border-color:var(--table-primary);box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.grouping-selector select:hover{border-color:var(--table-primary)}.group-header-row{background:var(--table-header-bg);border-top:2px solid var(--table-border);border-bottom:2px solid var(--table-border);transition:background 0.2s}.group-header-row:hover{background:var(--table-hover)}.group-header-cell{cursor:pointer;user-select:none;font-weight:600;padding:12px 16px !important;outline:none}.group-header-cell:focus{outline:2px solid var(--table-primary);outline-offset:-2px}.group-header-content{display:flex;align-items:center;gap:10px}.group-expand-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:12px;color:var(--table-primary);transition:transform 0.2s ease}.group-header-row[aria-expanded=true] .group-expand-icon{transform:rotate(0deg)}.group-header-row[aria-expanded=false] .group-expand-icon{transform:rotate(-90deg)}.group-label{font-size:15px;color:var(--table-text);font-weight:600}.group-count{font-size:13px;color:var(--table-text-secondary);font-weight:normal;margin-left:4px}.group-data-row{animation:fadeIn 0.2s ease-in-out}@keyframes fadeIn{from{opacity:0}to{opacity:1}}.group-data-row td{padding-left:48px !important;border-left:3px solid transparent;transition:all 0.2s}.group-data-row td:first-child{border-left:3px solid var(--table-border)}.group-data-row.selected{background:var(--table-selected)}.group-data-row.selected td:first-child{border-left-color:var(--table-primary)}.group-data-row:hover{background:var(--table-hover)}.group-data-row:hover td:first-child{border-left-color:var(--table-primary)}.editable-cell{cursor:pointer;padding:4px;border-radius:4px;transition:background 0.15s}.editable-cell:hover{background:rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.data-table td input,.data-table td select{width:100%;padding:6px 8px;border:2px solid var(--table-primary);border-radius:4px;font-size:14px;background:var(--table-bg);color:var(--table-text)}.data-table td input:focus,.data-table td select:focus{outline:none;box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.loading-cell,.empty-cell{text-align:center !important;padding:48px 16px !important;color:var(--table-text-secondary)}.loading-cell{display:flex;flex-direction:column;align-items:center;gap:12px}.loading-spinner{width:48px;height:48px;border:3px solid rgba(var(--table-primary-rgb), 0.1);border-top-color:var(--table-primary);border-radius:50%;animation:spin 0.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;box-shadow:0 0 20px rgba(var(--table-primary-rgb), 0.15)}.skeleton-row td{padding:14px 20px}.skeleton-content,.skeleton-checkbox{height:16px;width:100%;background:linear-gradient(90deg, rgba(var(--table-text-secondary-rgb), 0.05) 25%, rgba(var(--table-text-secondary-rgb), 0.15) 37%, rgba(var(--table-text-secondary-rgb), 0.05) 63%);background-size:400% 100%;animation:skeleton-shimmer 2s cubic-bezier(0.4, 0, 0.2, 1) infinite;border-radius:4px}.skeleton-checkbox{width:18px;height:18px;margin:0 auto}@keyframes skeleton-shimmer{0%{background-position:100% 50%}100%{background-position:0% 50%}}.pagination-container{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--table-header-bg);border-top:1px solid var(--table-border);gap:16px;flex-wrap:wrap}.pagination-info{color:var(--table-text-secondary);font-size:14px}.pagination-controls{display:flex;gap:4px;align-items:center}.page-btn{min-width:36px;height:36px;padding:8px 12px;background:var(--table-bg);color:var(--table-text);border:1px solid var(--table-border);border-radius:6px;font-size:14px;cursor:pointer;transition:all 0.2s;display:flex;align-items:center;justify-content:center}.page-btn:hover:not(:disabled){background:var(--table-hover);border-color:var(--table-primary)}.page-btn:disabled{opacity:0.4;cursor:not-allowed}.page-btn.active{background:var(--table-primary);color:var(--text-standard, #ffffff);border-color:var(--table-primary)}.page-size-selector{display:flex;align-items:center;gap:8px}.page-size-selector label{display:flex;align-items:center;gap:8px;color:var(--table-text-secondary);font-size:14px}.page-size-selector select{padding:6px 32px 6px 12px;border:1px solid var(--table-border);border-radius:6px;background:var(--table-bg);color:var(--table-text);font-size:14px;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 9L1 4h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center}.page-size-selector select:focus{outline:none;border-color:var(--table-primary)}.column-settings-dialog,.export-dialog{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000;display:flex;align-items:center;justify-content:center}.dialog-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0, 0, 0, 0.5);backdrop-filter:blur(4px)}.dialog-content{position:relative;background:var(--table-bg);border-radius:12px;box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);max-width:500px;width:90%;max-height:80vh;display:flex;flex-direction:column;animation:dialogSlideIn 0.2s ease-out}@keyframes dialogSlideIn{from{opacity:0;transform:scale(0.95) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.dialog-header{display:flex;justify-content:space-between;align-items:center;padding:20px;border-bottom:1px solid var(--table-border)}.dialog-header h3{margin:0;font-size:18px;font-weight:600;color:var(--table-text)}.close-btn{width:32px;height:32px;padding:0;background:transparent;border:none;color:var(--table-text-secondary);font-size:24px;cursor:pointer;border-radius:6px;transition:all 0.2s;display:flex;align-items:center;justify-content:center}.close-btn:hover{background:var(--table-hover);color:var(--table-text)}.dialog-body{padding:20px;overflow-y:auto;flex:1}.dialog-footer{padding:16px 20px;border-top:1px solid var(--table-border);display:flex;justify-content:flex-end;gap:12px}.dialog-footer button{padding:10px 20px;background:var(--table-primary);color:var(--text-standard, #ffffff);border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;transition:all 0.2s}.dialog-footer button:hover{background:var(--table-primary-hover)}.column-list{display:flex;flex-direction:column;gap:8px}.column-item{display:flex;align-items:center;gap:12px;padding:12px;background:var(--table-header-bg);border-radius:6px;cursor:pointer;transition:background 0.2s}.column-item:hover{background:var(--table-hover)}.column-item input[type=checkbox]{width:18px;height:18px;cursor:pointer;accent-color:var(--table-primary)}.column-item span{flex:1;color:var(--table-text);font-size:14px}.export-options{display:flex;flex-direction:column;gap:12px}.export-btn{padding:16px;background:var(--table-bg);color:var(--table-text);border:2px solid var(--table-border);border-radius:8px;font-size:15px;font-weight:500;cursor:pointer;transition:all 0.2s;display:flex;align-items:center;gap:12px}.export-btn:hover{background:var(--table-hover);border-color:var(--table-primary);transform:translateX(4px)}@media (max-width: 768px){.table-toolbar{flex-direction:column;align-items:stretch}.toolbar-left,.toolbar-right{width:100%;justify-content:space-between}.search-box{min-width:100%}.pagination-container{flex-direction:column;align-items:stretch;gap:12px}.pagination-info,.pagination-controls,.page-size-selector{justify-content:center}.table-wrapper{max-height:60vh}.data-table{font-size:13px}.data-table th,.data-table td{padding:8px 12px}}@media (max-width: 480px){.data-table{font-size:12px}.data-table th,.data-table td{padding:6px 8px}.toolbar-btn{font-size:13px;padding:6px 12px}.pagination-controls .page-btn{min-width:32px;height:32px;padding:4px 8px;font-size:13px}}.data-table:focus-within{outline:2px solid var(--table-primary);outline-offset:2px}button:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--table-primary);outline-offset:2px}.data-table-container *{box-sizing:border-box}.data-table tbody tr{contain:layout style}.data-table th[draggable=true]{cursor:move}.data-table th[draggable=true]:active{opacity:0.5}.skeleton-row{animation:pulse 1.5s ease-in-out infinite}.skeleton-cell{padding:12px 16px}.skeleton-content{height:16px;background:linear-gradient(90deg, var(--table-border) 25%, var(--table-hover) 50%, var(--table-border) 75%);background-size:200% 100%;animation:shimmer 1.5s infinite;border-radius:4px}.skeleton-checkbox{width:16px;height:16px;background:linear-gradient(90deg, var(--table-border) 25%, var(--table-hover) 50%, var(--table-border) 75%);background-size:200% 100%;animation:shimmer 1.5s infinite;border-radius:3px;margin:0 auto}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.7}}.cell-input{width:100%;padding:6px 8px;border:1px solid var(--table-border);border-radius:4px;background:var(--table-bg);color:var(--table-text);font-size:14px}.cell-input:focus{outline:none;border-color:var(--table-primary);box-shadow:0 0 0 2px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.cell-select{width:100%;padding:6px 8px;border:1px solid var(--table-border);border-radius:4px;background:var(--table-bg);color:var(--table-text);font-size:14px;cursor:pointer}.cell-radio-group{display:flex;flex-direction:column;gap:6px}.radio-label{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:14px}.radio-label input[type=radio]{cursor:pointer}.cell-checkbox{width:18px;height:18px;cursor:pointer}.cell-switch{position:relative;display:inline-block;width:44px;height:24px}.cell-switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:var(--bg-secondary, #ccc);transition:0.3s;border-radius:24px}.switch-slider:before{position:absolute;content:"";height:18px;width:18px;left:3px;bottom:3px;background-color:var(--bg-primary, #ffffff);transition:0.3s;border-radius:50%}.cell-switch input:checked+.switch-slider{background-color:var(--table-primary)}.cell-switch input:checked+.switch-slider:before{transform:translateX(20px)}.cell-rating{display:flex;gap:4px;font-size:18px}.cell-rating .star{cursor:pointer;color:var(--bg-secondary, #d1d5db);transition:color 0.2s}.cell-rating .star.filled{color:var(--color-danger, #fbbf24)}.cell-rating .star:hover{color:var(--color-danger, #fcd34d)}.cell-rating-display{display:flex;gap:2px;font-size:16px}.cell-rating-display .star{color:var(--bg-secondary, #d1d5db)}.cell-rating-display .star.filled{color:var(--color-danger, #fbbf24)}.cell-boolean{font-size:18px;font-weight:bold}.cell-switch-display{display:inline-block}.switch-indicator{display:inline-block;padding:2px 8px;border-radius:12px;font-size:11px;font-weight:600;background:var(--bg-primary, #e5e7eb);color:var(--text-muted, #6b7280);text-transform:uppercase}.switch-indicator.active{background:var(--table-primary);color:var(--text-standard, #ffffff)}.cell-image{display:block;object-fit:cover}.cell-password{letter-spacing:2px;font-family:monospace}.cell-link{color:var(--table-primary);text-decoration:none;transition:color 0.2s}.cell-link:hover{color:var(--table-primary-hover);text-decoration:underline}.column-group{background:var(--table-header-bg);font-weight:600;border-bottom:2px solid var(--table-border)}.data-table thead tr:has(.column-group)+tr th{border-top:1px solid var(--table-border)}.filter-panel{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);background:var(--table-bg);border:1px solid var(--table-border);border-radius:12px;box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.2), 0 10px 10px -5px rgba(0, 0, 0, 0.1);min-width:600px;max-width:90vw;max-height:80vh;z-index:1000;display:flex;flex-direction:column;animation:slideIn 0.2s ease-out}@keyframes slideIn{from{opacity:0;transform:translate(-50%, -45%)}to{opacity:1;transform:translate(-50%, -50%)}}.filter-panel::before{content:"";position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0, 0, 0, 0.5);backdrop-filter:blur(4px);z-index:-1}.filter-panel-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid var(--table-border)}.filter-panel-header h4{margin:0;font-size:18px;font-weight:600;color:var(--table-text);display:flex;align-items:center;gap:8px}.filter-panel-header .close-btn{background:transparent;border:none;font-size:28px;line-height:1;cursor:pointer;color:var(--table-text-secondary);padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:all 0.2s}.filter-panel-header .close-btn:hover{background:var(--table-hover);color:var(--table-text)}.filter-panel-body{padding:24px;overflow-y:auto;flex:1}.filter-builder{margin-bottom:24px}.filter-row{display:grid;grid-template-columns:1fr 1fr 1.5fr auto;gap:12px;align-items:center}.filter-field-select,.filter-operator-select{padding:10px 12px;border:1px solid var(--table-border);border-radius:6px;font-size:14px;background:var(--table-bg);color:var(--table-text);cursor:pointer;transition:all 0.2s}.filter-field-select:focus,.filter-operator-select:focus{outline:none;border-color:var(--table-primary);box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.filter-field-select:hover,.filter-operator-select:hover{border-color:var(--table-primary)}.filter-field-select:disabled,.filter-operator-select:disabled{opacity:0.5;cursor:not-allowed}.filter-value-input{padding:10px 12px;border:1px solid var(--table-border);border-radius:6px;font-size:14px;background:var(--table-bg);color:var(--table-text);transition:all 0.2s}.filter-value-input:focus{outline:none;border-color:var(--table-primary);box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.filter-value-input:disabled{opacity:0.5;cursor:not-allowed;background:var(--table-header-bg)}.add-filter-btn{padding:10px 20px;background:var(--table-primary);color:var(--text-standard, #ffffff);border:none;border-radius:6px;font-size:14px;font-weight:600;cursor:pointer;transition:all 0.2s;white-space:nowrap}.add-filter-btn:hover:not(:disabled){background:var(--table-primary-hover);transform:translateY(-1px);box-shadow:0 4px 6px rgba(var(--color-primary-rgb, 59, 130, 246), 0.2)}.add-filter-btn:active:not(:disabled){transform:translateY(0)}.add-filter-btn:disabled{opacity:0.5;cursor:not-allowed}.active-filters{border-top:1px solid var(--table-border);padding-top:20px}.active-filters-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.active-filters-header span{font-size:14px;font-weight:600;color:var(--table-text)}.clear-all-btn{padding:6px 12px;background:transparent;color:var(--color-danger, #ef4444);border:1px solid var(--color-danger, #ef4444);border-radius:6px;font-size:13px;cursor:pointer;transition:all 0.2s}.clear-all-btn:hover{background:var(--color-danger, #ef4444);color:var(--text-standard, #ffffff)}.filter-chips{display:flex;flex-wrap:wrap;gap:8px}.filter-chip{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;background:var(--table-selected);border:1px solid var(--table-primary);border-radius:20px;font-size:13px;color:var(--table-text);animation:chipSlideIn 0.2s ease-out}@keyframes chipSlideIn{from{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:translateX(0)}}.filter-chip-label{display:flex;align-items:center;gap:4px}.filter-chip-label strong{color:var(--table-primary)}.filter-chip-remove{background:transparent;border:none;color:var(--table-text-secondary);font-size:20px;line-height:1;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all 0.2s}.filter-chip-remove:hover{background:rgba(var(--color-danger-rgb, 239, 68, 68), 0.1);color:var(--color-danger, #ef4444)}.no-filters{text-align:center;padding:32px;color:var(--table-text-secondary);font-size:14px}.pinned-row-top{position:sticky !important;top:0;z-index:25;background:var(--table-bg);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1)}.pinned-row-bottom{position:sticky !important;bottom:0;z-index:25;background:var(--table-bg);box-shadow:0 -2px 4px rgba(0, 0, 0, 0.1)}.pinned-row-top::before,.pinned-row-bottom::before{content:"";position:absolute;left:0;right:0;height:3px;background:linear-gradient(90deg, var(--color-primary, #10b981), var(--color-primary, #8b5cf6));opacity:0.6}.pinned-row-top::before{top:0}.pinned-row-bottom::before{bottom:0}.pinned-row-top:hover,.pinned-row-bottom:hover{background:var(--table-hover)}.sort-icon.multi-sort{position:relative;display:inline-flex;align-items:center;gap:4px}.sort-order-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 4px;background:var(--color-primary, #10b981);color:var(--text-standard, #ffffff);border-radius:50%;font-size:11px;font-weight:600;line-height:1}.aggregation-footer{background:var(--bg-primary, #f9fafb);border-top:2px solid var(--border-default, #e5e7eb);font-weight:600}.aggregation-cell{padding:12px}.aggregation-values{display:flex;gap:16px;flex-wrap:wrap}.agg-item{display:flex;gap:6px;align-items:center}.agg-label{color:var(--text-muted, #6b7280);font-size:12px;text-transform:uppercase}.agg-value{color:var(--text-primary, #111827);font-size:14px;font-weight:700}.row-details-row{background:var(--bg-primary, #f9fafb)}.row-details-panel{padding:20px;border:1px solid var(--border-default, #e5e7eb);border-radius:8px;margin:8px}.details-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid var(--border-default, #e5e7eb)}.details-header h4{margin:0;color:var(--text-primary, #111827);font-size:16px}.close-details-btn{background:none;border:none;font-size:24px;color:var(--text-muted, #6b7280);cursor:pointer;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.close-details-btn:hover{background:var(--bg-primary, #e5e7eb);color:var(--text-primary, #111827)}.details-content{display:grid;grid-template-columns:repeat(auto-fill, minmax(250px, 1fr));gap:12px}.detail-item{display:flex;gap:8px;padding:8px;background:var(--bg-primary, #ffffff);border-radius:4px;border:1px solid var(--border-default, #e5e7eb)}.detail-label{color:var(--text-muted, #6b7280);font-size:13px;min-width:100px}.detail-value{color:var(--text-primary, #111827);font-size:13px;word-break:break-word}.keyboard-shortcuts-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0, 0, 0, 0.5);display:flex;align-items:center;justify-content:center;z-index:10000}.keyboard-shortcuts-modal .modal-content{background:var(--bg-primary, #ffffff);border-radius:12px;box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.1);max-width:500px;width:90%;max-height:80vh;overflow:auto}.keyboard-shortcuts-modal .modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px;border-bottom:1px solid var(--border-default, #e5e7eb)}.keyboard-shortcuts-modal .modal-header h3{margin:0;font-size:18px;color:var(--text-primary, #111827)}.keyboard-shortcuts-modal .modal-header button{background:none;border:none;font-size:24px;color:var(--text-muted, #6b7280);cursor:pointer;padding:0;width:30px;height:30px}.keyboard-shortcuts-modal .modal-body{padding:20px}.shortcuts-table{width:100%;border-collapse:collapse}.shortcuts-table tr{border-bottom:1px solid var(--border-default, #e5e7eb)}.shortcuts-table tr:last-child{border-bottom:none}.shortcuts-table td{padding:12px 8px}.shortcut-key{font-family:"Courier New", monospace;background:var(--bg-secondary, #f3f4f6);padding:4px 8px;border-radius:4px;font-size:13px;font-weight:600;color:var(--text-secondary, #374151);white-space:nowrap}.shortcut-desc{color:var(--text-muted, #6b7280);font-size:14px}.validation-error-tooltip{position:absolute;bottom:100%;left:0;background:var(--color-danger, #ef4444);color:var(--text-standard, #ffffff);padding:6px 10px;border-radius:4px;font-size:12px;white-space:nowrap;z-index:100;margin-bottom:4px;display:flex;align-items:center;gap:6px;box-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1)}.validation-error-tooltip::after{content:"";position:absolute;top:100%;left:10px;border:5px solid transparent;border-top-color:var(--color-danger, #ef4444)}.error-icon{font-size:14px}.error-message{font-weight:500}td.has-validation-error{position:relative;border:2px solid var(--color-danger, #ef4444) !important;background:var(--bg-primary, #fef2f2)}.virtual-scroll-container{overflow-y:auto;position:relative;will-change:transform}.virtual-scroll-content{position:relative}.auto-size-btn{padding:4px 8px;font-size:12px;background:var(--bg-secondary, #f3f4f6);border:1px solid var(--border-strong, #d1d5db);border-radius:4px;cursor:pointer;color:var(--text-secondary, #374151)}.auto-size-btn:hover{background:var(--bg-primary, #e5e7eb)}.premium-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;background:linear-gradient(135deg, var(--color-primary, #667eea) 0%, var(--color-primary, #764ba2) 100%);color:var(--text-standard, #ffffff);border-radius:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px}@media (prefers-color-scheme: dark){.aggregation-footer{background:var(--bg-primary, #1f2937);border-top-color:var(--border-default, #374151)}.row-details-panel{background:var(--bg-primary, #1f2937);border-color:var(--border-default, #374151)}.keyboard-shortcuts-modal .modal-content{background:var(--bg-primary, #1f2937);color:var(--text-standard, #f3f4f6)}.detail-item{background:var(--bg-secondary, #111827);border-color:var(--border-default, #374151)}}.cell-editor{width:100%;padding:6px 8px;border:2px solid var(--color-primary, #10b981);border-radius:4px;font-size:14px;outline:none}.date-editor,.datetime-editor{cursor:pointer}.number-editor{text-align:right}.select-editor{cursor:pointer;background:var(--bg-primary, #ffffff)}.checkbox-editor{width:20px;height:20px;cursor:pointer}.formatted-currency{color:var(--color-success-hover, #059669);font-weight:600}.formatted-percentage{color:var(--color-primary, #7c3aed);font-weight:600}.formatted-date{color:var(--color-primary, #0284c7)}.cell-range-selected{background:var(--bg-primary, #dbeafe) !important;border:2px solid var(--color-primary, #10b981) !important}.range-selection-anchor{background:var(--color-primary, #bfdbfe) !important;border:2px dashed var(--color-primary, #10b981) !important}.copy-indicator{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);background:var(--color-success, #10b981);color:var(--text-standard, #ffffff);padding:8px 16px;border-radius:8px;font-size:14px;font-weight:600;z-index:1000;animation:fadeInOut 1s ease-in-out}@keyframes fadeInOut{0%,100%{opacity:0}50%{opacity:1}}.color-scale-cell{position:relative;color:var(--text-primary, #111827);font-weight:600}.data-bar-cell{position:relative;padding:8px}.data-bar-value{position:relative;z-index:1;font-weight:600}.icon-set{display:inline-flex;align-items:center;gap:6px}.icon-set-icon{font-size:16px}.icon-positive{color:var(--color-success, #10b981)}.icon-neutral{color:var(--color-warning, #f59e0b)}.icon-negative{color:var(--color-danger, #ef4444)}.cell-with-formatting{transition:all 0.2s ease}.cell-with-formatting:hover{transform:scale(1.02);box-shadow:0 2px 8px rgba(0, 0, 0, 0.1)}.cell-progress-bar{width:100%;height:24px;background:var(--bg-primary, #e5e7eb);border-radius:12px;overflow:hidden;position:relative}.cell-progress-fill{height:100%;background:linear-gradient(90deg, var(--color-primary, #10b981) 0%, var(--color-primary, #1d4ed8) 100%);transition:width 0.3s ease;display:flex;align-items:center;justify-content:center;color:var(--text-standard, #ffffff);font-size:12px;font-weight:600}.cell-editor:focus{border-color:var(--color-primary-hover, #2563eb);box-shadow:0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.cell-editor-error{border-color:var(--color-danger, #ef4444)}.cell-editor-error:focus{box-shadow:0 0 0 3px rgba(var(--color-danger-rgb, 239, 68, 68), 0.1)}.bulk-actions-toolbar{position:sticky;top:0;z-index:100;background:var(--bg-secondary, #f3f4f6);border-bottom:2px solid var(--border-default, #e5e7eb);padding:12px 16px;display:flex;align-items:center;gap:12px;animation:slideDown 0.3s ease}@keyframes slideDown{from{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.bulk-actions-count{font-weight:600;color:var(--text-secondary, #374151)}.bulk-action-btn{padding:6px 12px;background:var(--bg-primary, #ffffff);border:1px solid var(--border-strong, #d1d5db);border-radius:6px;font-size:14px;cursor:pointer;transition:all 0.2s}.bulk-action-btn:hover{background:var(--bg-primary, #f9fafb);border-color:var(--color-primary, #9ca3af)}.bulk-action-btn.primary{background:var(--color-primary, #10b981);color:var(--text-standard, #ffffff);border-color:var(--color-primary, #10b981)}.bulk-action-btn.primary:hover{background:var(--color-primary-hover, #2563eb)}.bulk-action-btn.danger{background:var(--color-danger, #ef4444);color:var(--text-standard, #ffffff);border-color:var(--color-danger, #ef4444)}.bulk-action-btn.danger:hover{background:var(--color-danger-hover, #dc2626)}@media print{.data-table-container{box-shadow:none !important;border:none !important;overflow:visible !important;max-height:none !important}.table-wrapper{max-height:none !important;overflow:visible !important}.table-toolbar,.pagination-container,.filter-panel,.column-settings-dialog,.export-dialog,.keyboard-shortcuts-modal,.actions-column,.select-column,.row-details-toggle-cell,.bulk-actions-bar{display:none !important}.data-table{width:100% !important;border-collapse:collapse !important}.data-table th,.data-table td{color:var(--text-primary, #000) !important;border:1px solid var(--border-default, #ccc) !important;padding:8px !important}tr{break-inside:avoid;page-break-inside:avoid}}.context-menu{position:fixed;background:var(--table-bg);border:1px solid var(--table-border);box-shadow:0 10px 15px -3px rgba(0, 0, 0, 0.1);border-radius:6px;padding:4px;min-width:160px;z-index:9999}.context-menu-item{padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;color:var(--table-text);font-size:14px;border-radius:4px}.context-menu-item:hover{background:var(--table-hover)}.mobile-cards-view{display:flex;flex-direction:column;gap:12px;padding:12px}.mobile-card{background:var(--table-bg);border:1px solid var(--table-border);border-radius:8px;padding:12px}.mobile-card .card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--table-border);font-weight:600}.mobile-card .card-field{display:flex;justify-content:space-between;margin-bottom:8px;font-size:14px}.mobile-card .card-field label{color:var(--table-text-secondary);font-weight:500}.data-table td.focused-cell{box-shadow:inset 0 0 0 2px var(--table-primary) !important;background:rgba(var(--color-primary-rgb, 59, 130, 246), 0.05);z-index:10}.data-table td:focus{outline:none}.data-table th.pinned-left,.data-table td.pinned-left{position:sticky;left:0;z-index:25;box-shadow:2px 0 4px var(--table-shadow)}.data-table th.pinned-right,.data-table td.pinned-right{position:sticky;right:0;z-index:25;box-shadow:-2px 0 4px var(--table-shadow)}.header-menu-trigger{background:transparent;border:none;cursor:pointer;padding:4px;border-radius:4px;color:var(--table-text-secondary);opacity:0;transition:all 0.2s;font-size:16px;line-height:1}.data-table th:hover .header-menu-trigger{opacity:1}.header-menu-trigger:hover{background:var(--table-hover);color:var(--table-text)}.context-menu.header-context-menu{min-width:200px}.context-menu-header{padding:8px 12px;font-size:12px;font-weight:700;text-transform:uppercase;color:var(--table-text-secondary);border-bottom:1px solid var(--table-border);margin-bottom:4px}.context-menu ul{list-style:none;padding:0;margin:0}.context-menu li{padding:8px 12px;cursor:pointer;font-size:14px;transition:background 0.2s;position:relative}.context-menu li:hover{background:var(--table-hover)}.context-menu li.divider{height:1px;background:var(--table-border);padding:0;margin:4px 0;cursor:default}.context-menu li.has-submenu::after{content:"";font-size:10px;position:absolute;right:12px;opacity:0.5}.context-menu .submenu{position:absolute;left:100%;top:0;display:none;background:var(--table-bg);border:1px solid var(--table-border);border-radius:6px;box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);min-width:140px;padding:4px}.context-menu li.has-submenu:hover>.submenu{display:block}.sr-announcer{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}.data-table th.pinned-left,.data-table td.pinned-left{background:linear-gradient(to right, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent);border-right:2px solid rgba(var(--color-primary-rgb, 59, 130, 246), 0.3)}.data-table th.pinned-right,.data-table td.pinned-right{background:linear-gradient(to left, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent);border-left:2px solid rgba(var(--color-primary-rgb, 59, 130, 246), 0.3)}.data-table th.pinned-left::before,.data-table th.pinned-right::before{content:"";font-size:10px;opacity:0.6;margin-right:4px}.data-table th.pinned-left:hover,.data-table th.pinned-right:hover{background:rgba(var(--color-primary-rgb, 59, 130, 246), 0.1)}.pin-indicator{font-size:12px;margin-right:4px;opacity:0.8;display:inline-block;animation:pinPulse 2s ease-in-out infinite}@keyframes pinPulse{0%,100%{opacity:0.8}50%{opacity:1}}.data-table th.pinned-left,.data-table td.pinned-left{background:linear-gradient(to right, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-bg) !important;background-blend-mode:normal}.data-table th.pinned-right,.data-table td.pinned-right{background:linear-gradient(to left, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-bg) !important;background-blend-mode:normal}.data-table th.pinned-left{background:linear-gradient(to right, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-header-bg) !important}.data-table td.pinned-left{background:linear-gradient(to right, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-bg) !important}.data-table th.pinned-right{background:linear-gradient(to left, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-header-bg) !important}.data-table td.pinned-right{background:linear-gradient(to left, rgba(var(--color-primary-rgb, 59, 130, 246), 0.05), transparent), var(--table-bg) !important}.data-table-footer{background-color:var(--table-header-bg, #f8fafc);border-top:2px solid var(--border-subtle, #e2e8f0);font-weight:600;z-index:2}.data-table-container tfoot tr{position:sticky;bottom:0;background-color:var(--table-header-bg, #f8fafc);z-index:3;box-shadow:0 -1px 2px rgba(0, 0, 0, 0.05)}.data-table-footer td{padding:12px 16px;border-bottom:1px solid var(--border-subtle, #e2e8f0);background-color:inherit;vertical-align:top}.agg-item{display:flex;flex-direction:column;font-size:0.75rem;margin-bottom:4px}.agg-label{color:var(--text-muted, #64748b);text-transform:uppercase;font-size:0.65rem;margin-bottom:1px}.agg-value{color:var(--text-primary, #0f172a);font-weight:700;font-size:0.85rem}`;
6
+
7
+ const AdvancedDataTable = class {
8
+ constructor(hostRef) {
9
+ index.registerInstance(this, hostRef);
10
+ this.rowSelect = index.createEvent(this, "rowSelect");
11
+ this.rowDeselect = index.createEvent(this, "rowDeselect");
12
+ this.cellEdit = index.createEvent(this, "cellEdit");
13
+ this.cellEditStart = index.createEvent(this, "cellEditStart");
14
+ this.cellEditStop = index.createEvent(this, "cellEditStop");
15
+ this.rowEditStart = index.createEvent(this, "rowEditStart");
16
+ this.rowEditStop = index.createEvent(this, "rowEditStop");
17
+ this.sortChange = index.createEvent(this, "sortChange");
18
+ this.filterChange = index.createEvent(this, "filterChange");
19
+ this.pageChange = index.createEvent(this, "pageChange");
20
+ this.searchChange = index.createEvent(this, "searchChange");
21
+ this.columnOrderChange = index.createEvent(this, "columnOrderChange");
22
+ this.columnVisibilityChange = index.createEvent(this, "columnVisibilityChange");
23
+ this.columnPin = index.createEvent(this, "columnPin");
24
+ this.rowPin = index.createEvent(this, "rowPin");
25
+ this.rowReorderEvent = index.createEvent(this, "rowReorderEvent");
26
+ this.dataExport = index.createEvent(this, "dataExport");
27
+ this.groupToggle = index.createEvent(this, "groupToggle");
28
+ this.groupByChange = index.createEvent(this, "groupByChange");
29
+ this.rowEdit = index.createEvent(this, "rowEdit");
30
+ this.rowDelete = index.createEvent(this, "rowDelete");
31
+ this.rowAction = index.createEvent(this, "rowAction");
32
+ this.lazyLoadMore = index.createEvent(this, "lazyLoadMore");
33
+ }
34
+ get el() { return index.getElement(this); }
35
+ /**
36
+ * Table configuration
37
+ */
38
+ config = {
39
+ columns: [],
40
+ data: [],
41
+ selectable: false,
42
+ pagination: true,
43
+ pageSize: 10,
44
+ };
45
+ /**
46
+ * Columns definition
47
+ */
48
+ columns = [];
49
+ /**
50
+ * Table data
51
+ */
52
+ data = [];
53
+ /**
54
+ * Enable row selection
55
+ */
56
+ selectable = false;
57
+ /**
58
+ * Enable multiple row selection
59
+ */
60
+ multiSelect = true;
61
+ /**
62
+ * Enable inline editing
63
+ */
64
+ editable = false;
65
+ /**
66
+ * Enable sticky header
67
+ */
68
+ stickyHeader = true;
69
+ /**
70
+ * Enable pagination
71
+ */
72
+ pagination = true;
73
+ /**
74
+ * Page size
75
+ */
76
+ pageSize = 10;
77
+ /**
78
+ * Page size options
79
+ */
80
+ pageSizeOptions = [5, 10, 25, 50, 100];
81
+ /**
82
+ * Pagination theme
83
+ */
84
+ paginationTheme = 'default';
85
+ /**
86
+ * Pagination shape
87
+ */
88
+ paginationShape = 'default';
89
+ /**
90
+ * Enable keyboard navigation for pagination
91
+ */
92
+ paginationKeyboardNav = true;
93
+ /**
94
+ * Enable quick jump buttons
95
+ */
96
+ paginationQuickJump = false;
97
+ /**
98
+ * Quick jump step size
99
+ */
100
+ paginationQuickJumpStep = 5;
101
+ /**
102
+ * Show progress indicator
103
+ */
104
+ paginationShowProgress = false;
105
+ /**
106
+ * Sticky pagination
107
+ */
108
+ paginationSticky = false;
109
+ /**
110
+ * Sticky position
111
+ */
112
+ paginationStickyPosition = 'bottom';
113
+ /**
114
+ * Enable page transitions
115
+ */
116
+ paginationTransitions = true;
117
+ /**
118
+ * Sync pagination with URL
119
+ */
120
+ paginationUrlSync = false;
121
+ /**
122
+ * URL parameter name
123
+ */
124
+ paginationUrlParam = 'page';
125
+ /**
126
+ * Persist page to localStorage
127
+ */
128
+ paginationPersistPage = false;
129
+ /**
130
+ * LocalStorage key
131
+ */
132
+ paginationStorageKey = 'table-page';
133
+ /**
134
+ * Enable swipe gestures
135
+ */
136
+ paginationSwipeGestures = true;
137
+ /**
138
+ * Smart compact mode
139
+ */
140
+ paginationSmartCompact = false;
141
+ /**
142
+ * Smart compact threshold
143
+ */
144
+ paginationSmartCompactThreshold = 20;
145
+ /**
146
+ * Auto-hide pagination on single page
147
+ */
148
+ paginationAutoHide = true;
149
+ /**
150
+ * Responsive pagination mode
151
+ */
152
+ paginationResponsive = true;
153
+ /**
154
+ * Mobile breakpoint for pagination
155
+ */
156
+ paginationMobileBreakpoint = 768;
157
+ /**
158
+ * Enable virtual scrolling for performance with lg datasets
159
+ */
160
+ virtualScroll = false;
161
+ /**
162
+ * Row height for virtual scrolling (px)
163
+ */
164
+ virtualRowHeight = 48;
165
+ /**
166
+ * Enable advanced filter operators
167
+ */
168
+ advancedFilters = false;
169
+ /**
170
+ * Enable column aggregation (sum, avg, min, max)
171
+ */
172
+ columnAggregation = false;
173
+ /**
174
+ * Aggregation functions to show
175
+ */
176
+ aggregationFunctions = ['sum', 'avg', 'min', 'max', 'count'];
177
+ /**
178
+ * Persist table state to localStorage
179
+ */
180
+ persistState = false;
181
+ /**
182
+ * LocalStorage key for state persistence
183
+ */
184
+ stateStorageKey = 'table-state';
185
+ /**
186
+ * Enable multi-column sorting
187
+ */
188
+ multiSort = false;
189
+ /**
190
+ * Maximum number of sort columns
191
+ */
192
+ maxSortColumns = 3;
193
+ /**
194
+ * Enable column auto-sizing
195
+ */
196
+ autoSizeColumns = false;
197
+ /**
198
+ * Enable row details panel
199
+ */
200
+ rowDetails = false;
201
+ /**
202
+ * Enable keyboard shortcuts
203
+ */
204
+ keyboardShortcuts = true;
205
+ /**
206
+ * Enable Excel export (.xlsx)
207
+ */
208
+ excelExport = false;
209
+ /**
210
+ * Enable inline validation
211
+ */
212
+ inlineValidation = false;
213
+ /**
214
+ * Validation rules for columns
215
+ */
216
+ validationRules = {};
217
+ // ========== NEW HIGH-VALUE FEATURES ==========
218
+ /**
219
+ * Enable advanced cell editors (date picker, dropdown, etc.)
220
+ */
221
+ advancedCellEditors = true;
222
+ /**
223
+ * Enable column formatting (currency, date, percentage)
224
+ */
225
+ columnFormatting = true;
226
+ /**
227
+ * Enable range selection (Shift+Click)
228
+ */
229
+ rangeSelection = false;
230
+ /**
231
+ * Enable copy/paste functionality
232
+ */
233
+ copyPaste = false;
234
+ /**
235
+ * Enable conditional formatting (color scales, data bars)
236
+ */
237
+ conditionalFormatting = false;
238
+ /**
239
+ * Conditional formatting rules
240
+ */
241
+ formattingRules = {};
242
+ // ========== PHASE 2 ADVANCED FEATURES ==========
243
+ /**
244
+ * Enable context menus on right click
245
+ */
246
+ contextMenu = false;
247
+ /**
248
+ * Enable mobile card view for sm screens
249
+ */
250
+ mobileCardView = true;
251
+ /**
252
+ * Enable lazy loading of data
253
+ */
254
+ lazyLoad = false;
255
+ /**
256
+ * Enable PDF export
257
+ */
258
+ pdfExport = false;
259
+ /**
260
+ * Enable sparklines in cells
261
+ */
262
+ enableSparklines = false;
263
+ /**
264
+ * Enable undo/redo functionality
265
+ */
266
+ undoRedo = false;
267
+ /**
268
+ * Enable print optimization
269
+ */
270
+ printOptimized = false;
271
+ /**
272
+ * Enable enhanced accessibility features
273
+ */
274
+ enhancedAccessibility = true;
275
+ /**
276
+ * Enable advanced validation (ranges, lists)
277
+ */
278
+ advancedValidation = false;
279
+ /**
280
+ * Enable global search
281
+ */
282
+ searchable = true;
283
+ /**
284
+ * Enable sorting
285
+ */
286
+ sortable = true;
287
+ /**
288
+ * Enable filtering
289
+ */
290
+ filterable = true;
291
+ /**
292
+ * Enable column reordering
293
+ */
294
+ columnReorder = true;
295
+ /**
296
+ * Enable column visibility toggle
297
+ */
298
+ columnVisibility = true;
299
+ /**
300
+ * Row height variant
301
+ */
302
+ rowHeight = 'normal';
303
+ /**
304
+ * Enable striped rows
305
+ */
306
+ striped = true;
307
+ /**
308
+ * Custom striped row color for light mode
309
+ */
310
+ stripedColor;
311
+ /**
312
+ * Custom striped row color for dark mode
313
+ */
314
+ stripedColorDark;
315
+ /**
316
+ * Enable hover effect
317
+ */
318
+ hoverable = true;
319
+ /**
320
+ * Enable borders
321
+ */
322
+ bordered = true;
323
+ /**
324
+ * Loading state
325
+ */
326
+ loading = false;
327
+ /**
328
+ * Show skeleton while loading
329
+ */
330
+ showSkeleton = true;
331
+ /**
332
+ * Number of skeleton rows to show
333
+ */
334
+ skeletonRows = 5;
335
+ /**
336
+ * Empty message
337
+ */
338
+ emptyMessage = 'No data available';
339
+ /**
340
+ * Server-side mode
341
+ */
342
+ serverSide = false;
343
+ /**
344
+ * Total rows (for server-side pagination)
345
+ */
346
+ totalRows = 0;
347
+ /**
348
+ * Enable export
349
+ */
350
+ exportable = true;
351
+ /**
352
+ * Theme mode
353
+ */
354
+ theme = 'auto';
355
+ /** High-Fidelity: Table variant */
356
+ variant = 'default';
357
+ /** High-Fidelity: Primary color theme */
358
+ color = 'primary';
359
+ /**
360
+ * Enable data grouping
361
+ */
362
+ grouping = false;
363
+ /**
364
+ * Field to group by (for row grouping)
365
+ */
366
+ groupBy = '';
367
+ /**
368
+ * Expand groups by default
369
+ */
370
+ expandGroupsByDefault = true;
371
+ /**
372
+ * Show group count
373
+ */
374
+ showGroupCount = true;
375
+ /**
376
+ * Enable column grouping (multi-level headers)
377
+ */
378
+ columnGrouping = false;
379
+ /**
380
+ * Enable row grouping controls in toolbar
381
+ */
382
+ showGroupingControls = true;
383
+ /**
384
+ * Enable Tree Data mode (hierarchical)
385
+ */
386
+ treeData = false;
387
+ /**
388
+ * Show actions menu (3-dot menu) for each row
389
+ */
390
+ showActions = false;
391
+ /**
392
+ * Custom actions to show in the row actions menu
393
+ */
394
+ customActions;
395
+ /**
396
+ * Default library for icons
397
+ */
398
+ iconLibrary = 'default';
399
+ /**
400
+ * Enable column pinning
401
+ */
402
+ columnPinning = true;
403
+ /**
404
+ * Enable row pinning
405
+ */
406
+ rowPinning = true;
407
+ /**
408
+ * Enable row spanning
409
+ */
410
+ rowSpanning = false;
411
+ /**
412
+ * Enable row reordering via drag and drop
413
+ */
414
+ rowReorder = false;
415
+ /**
416
+ * Enable multi-column filtering
417
+ */
418
+ multiFilter = true;
419
+ /**
420
+ * Show filter panel
421
+ */
422
+ showFilterPanel = false;
423
+ /**
424
+ * Show column panel
425
+ */
426
+ showColumnPanel = false;
427
+ /**
428
+ * Custom header background (solid color or gradient)
429
+ */
430
+ headerBackground;
431
+ // ========== PRIVATE STATE ==========
432
+ state = {
433
+ selectedRows: new Set(),
434
+ virtualVisibleRange: { start: 0, end: 50 },
435
+ sortConfig: { field: '', direction: null },
436
+ filterConfig: {},
437
+ searchQuery: '',
438
+ pagination: {
439
+ currentPage: 1,
440
+ pageSize: 10,
441
+ totalPages: 1,
442
+ totalRows: 0,
443
+ },
444
+ editingCell: null,
445
+ columnOrder: [],
446
+ visibleColumns: new Set(),
447
+ columnWidths: new Map(),
448
+ expandedGroups: new Set(),
449
+ groupBy: null,
450
+ expandedRows: new Set(),
451
+ focusedCell: null,
452
+ };
453
+ draggedColumn = null;
454
+ draggedRow = null;
455
+ showColumnSettings = false;
456
+ showExportDialog = false;
457
+ resizingColumn = null;
458
+ activeActionMenu = null;
459
+ pinnedColumns = { left: [], right: [] };
460
+ pinnedRows = { top: [], bottom: [] };
461
+ editingRow = null;
462
+ activeFilters = new Map();
463
+ filterPanelField = '';
464
+ filterPanelOperator = 'contains';
465
+ filterPanelValue = '';
466
+ draggedColumnInPanel = null;
467
+ columnSearchQuery = '';
468
+ // Premium features state
469
+ virtualScrollOffset = 0;
470
+ virtualVisibleRange = { start: 0, end: 50 };
471
+ multiSortConfig = [];
472
+ columnAggregations = new Map();
473
+ expandedRowDetails = new Set();
474
+ validationErrors = new Map(); // rowId -> field -> error
475
+ showKeyboardShortcutsHelp = false;
476
+ advancedFilterConfig = new Map();
477
+ // New features state
478
+ rangeSelectionAnchor = null;
479
+ clipboardData = [];
480
+ formattingCache = new Map();
481
+ // Phase 2 State
482
+ contextMenuState = { visible: false, x: 0, y: 0, type: 'cell', target: null };
483
+ undoStack = [];
484
+ redoStack = [];
485
+ lazyLoadedRows = new Set();
486
+ isMobileView = false;
487
+ /**
488
+ * Events
489
+ */
490
+ rowSelect;
491
+ rowDeselect;
492
+ cellEdit;
493
+ cellEditStart;
494
+ cellEditStop;
495
+ rowEditStart;
496
+ rowEditStop;
497
+ sortChange;
498
+ filterChange;
499
+ pageChange;
500
+ searchChange;
501
+ columnOrderChange;
502
+ columnVisibilityChange;
503
+ columnPin;
504
+ rowPin;
505
+ rowReorderEvent;
506
+ dataExport;
507
+ groupToggle;
508
+ groupByChange;
509
+ rowEdit;
510
+ rowDelete;
511
+ rowAction;
512
+ lazyLoadMore;
513
+ resizeObserver;
514
+ lazyLoadObserver;
515
+ editInputRef;
516
+ resizeStartX = 0;
517
+ resizeStartWidth = 0;
518
+ resizingColumnId = '';
519
+ componentWillLoad() {
520
+ this.initializeState();
521
+ }
522
+ componentDidLoad() {
523
+ // Load saved state first
524
+ this.loadTableState();
525
+ this.setupResizeObserver();
526
+ this.applyTheme();
527
+ this.setupClickOutsideListener();
528
+ this.setupGlobalKeyboardShortcuts();
529
+ // Calculate aggregations if enabled
530
+ // if (this.columnAggregation) {
531
+ // this.calculateAggregations();
532
+ // }
533
+ // Add copy/paste listeners if enabled
534
+ if (this.copyPaste) {
535
+ document.addEventListener('copy', this.handleCopy);
536
+ document.addEventListener('paste', this.handlePaste);
537
+ }
538
+ }
539
+ disconnectedCallback() {
540
+ if (this.resizeObserver) {
541
+ this.resizeObserver.disconnect();
542
+ }
543
+ if (this.lazyLoadObserver) {
544
+ this.lazyLoadObserver.disconnect();
545
+ }
546
+ // Clean up resize event listeners
547
+ document.removeEventListener('mousemove', this.handleResizeMove);
548
+ document.removeEventListener('mouseup', this.handleResizeEnd);
549
+ // Clean up copy/paste listeners
550
+ if (this.copyPaste) {
551
+ document.removeEventListener('copy', this.handleCopy);
552
+ document.removeEventListener('paste', this.handlePaste);
553
+ }
554
+ // Clean up click outside listener
555
+ document.removeEventListener('click', this.handleClickOutside);
556
+ }
557
+ onDataOrColumnsChange() {
558
+ this.initializeState();
559
+ }
560
+ onPageSizeChange(newSize) {
561
+ this.state = {
562
+ ...this.state,
563
+ pagination: {
564
+ ...this.state.pagination,
565
+ pageSize: newSize,
566
+ currentPage: 1,
567
+ totalPages: this.calculateTotalPages(newSize),
568
+ },
569
+ };
570
+ }
571
+ onGroupByChange(newGroupBy) {
572
+ this.handleGroupByChange(newGroupBy);
573
+ }
574
+ onThemeChange() {
575
+ this.applyTheme();
576
+ }
577
+ /**
578
+ * Public methods
579
+ */
580
+ async selectRow(rowId) {
581
+ const newSelected = new Set(this.state.selectedRows);
582
+ newSelected.add(rowId);
583
+ this.updateSelectedRows(newSelected);
584
+ }
585
+ async deselectRow(rowId) {
586
+ const newSelected = new Set(this.state.selectedRows);
587
+ newSelected.delete(rowId);
588
+ this.updateSelectedRows(newSelected);
589
+ }
590
+ async selectAllRows() {
591
+ const allIds = this.getProcessedData().map(row => row.id);
592
+ this.updateSelectedRows(new Set(allIds));
593
+ }
594
+ async deselectAllRows() {
595
+ this.updateSelectedRows(new Set());
596
+ }
597
+ async getSelectedRows() {
598
+ return Array.from(this.state.selectedRows);
599
+ }
600
+ async exportData(options = { format: 'csv' }) {
601
+ const data = this.prepareExportData(options);
602
+ this.performExport(data, options);
603
+ }
604
+ async resetFilters() {
605
+ this.state = {
606
+ ...this.state,
607
+ filterConfig: {},
608
+ searchQuery: '',
609
+ pagination: { ...this.state.pagination, currentPage: 1 },
610
+ };
611
+ }
612
+ async resetSort() {
613
+ this.state = {
614
+ ...this.state,
615
+ sortConfig: { field: '', direction: null },
616
+ };
617
+ }
618
+ async goToPage(page) {
619
+ if (page >= 1 && page <= this.state.pagination.totalPages) {
620
+ this.state = {
621
+ ...this.state,
622
+ pagination: { ...this.state.pagination, currentPage: page },
623
+ };
624
+ this.pageChange.emit({ page, pageSize: this.state.pagination.pageSize });
625
+ }
626
+ }
627
+ async refresh() {
628
+ this.initializeState();
629
+ }
630
+ async print() {
631
+ if (this.printOptimized) {
632
+ window.print();
633
+ }
634
+ else {
635
+ // Create a temporary print frame or styling
636
+ const style = document.createElement('style');
637
+ style.textContent = `
638
+ @media print {
639
+ body * { visibility: hidden; }
640
+ .data-table-container, .data-table-container * { visibility: visible; }
641
+ .data-table-container { position: absolute; left: 0; top: 0; width: 100%; }
642
+ .toolbar, .pagination-container, .column-settings-panel, .filter-panel { display: none !important; }
643
+ .data-table { width: 100% !important; border-collapse: collapse !important; }
644
+ .data-table td, .data-table th { border: 1px solid #ddd !important; padding: 8px !important; }
645
+ }
646
+ `;
647
+ document.head.appendChild(style);
648
+ window.print();
649
+ document.head.removeChild(style);
650
+ }
651
+ }
652
+ initializeState() {
653
+ const cols = this.parseColumns();
654
+ const flatColumns = this.flattenColumns(cols);
655
+ // Initialize column widths with smart distribution
656
+ const columnWidths = this.calculateInitialColumnWidths(flatColumns);
657
+ // Initialize grouping
658
+ const initialGroupBy = this.groupBy || null;
659
+ const expandedGroups = new Set();
660
+ if (initialGroupBy && this.expandGroupsByDefault) {
661
+ // We'll populate this after data is available
662
+ const data = this.parseData();
663
+ const groups = this.groupData(data, initialGroupBy);
664
+ groups.forEach((_, key) => expandedGroups.add(key));
665
+ }
666
+ this.state = {
667
+ ...this.state,
668
+ columnOrder: flatColumns.map(col => col.id),
669
+ visibleColumns: new Set(flatColumns.filter(col => col.visible !== false).map(col => col.id)),
670
+ columnWidths: columnWidths,
671
+ groupBy: initialGroupBy,
672
+ expandedGroups: expandedGroups,
673
+ pagination: {
674
+ currentPage: 1,
675
+ pageSize: this.pageSize,
676
+ totalPages: this.calculateTotalPages(this.pageSize),
677
+ totalRows: this.getTotalRows(),
678
+ },
679
+ focusedCell: null,
680
+ };
681
+ }
682
+ parseColumns() {
683
+ if (typeof this.columns === 'string') {
684
+ try {
685
+ return JSON.parse(this.columns);
686
+ }
687
+ catch {
688
+ return [];
689
+ }
690
+ }
691
+ return this.columns || [];
692
+ }
693
+ parseData() {
694
+ if (typeof this.data === 'string') {
695
+ try {
696
+ return JSON.parse(this.data);
697
+ }
698
+ catch {
699
+ return [];
700
+ }
701
+ }
702
+ return this.data || [];
703
+ }
704
+ parsePageSizeOptions() {
705
+ if (typeof this.pageSizeOptions === 'string') {
706
+ try {
707
+ return JSON.parse(this.pageSizeOptions);
708
+ }
709
+ catch {
710
+ return [5, 10, 25, 50, 100];
711
+ }
712
+ }
713
+ return this.pageSizeOptions;
714
+ }
715
+ flattenColumns(columns) {
716
+ const result = [];
717
+ const flatten = (cols) => {
718
+ cols.forEach(col => {
719
+ if (col.children && col.children.length > 0) {
720
+ flatten(col.children);
721
+ }
722
+ else {
723
+ result.push(col);
724
+ }
725
+ });
726
+ };
727
+ flatten(columns);
728
+ return result;
729
+ }
730
+ getVisibleColumns() {
731
+ const cols = this.parseColumns();
732
+ const flatColumns = this.flattenColumns(cols);
733
+ return this.state.columnOrder
734
+ .map(id => flatColumns.find(col => col.id === id))
735
+ .filter((col) => !!col && this.state.visibleColumns.has(col.id));
736
+ }
737
+ getTotalRows() {
738
+ if (this.serverSide) {
739
+ return this.totalRows;
740
+ }
741
+ return this.parseData().length;
742
+ }
743
+ calculateTotalPages(pageSize) {
744
+ const total = this.getTotalRows();
745
+ return Math.ceil(total / pageSize);
746
+ }
747
+ getProcessedData() {
748
+ let data = this.parseData();
749
+ // Handle Tree Data Flattening
750
+ if (this.treeData) {
751
+ if (!this.state.searchQuery && Object.keys(this.state.filterConfig).length === 0 && !this.state.sortConfig.field) {
752
+ data = this.flattenTreeData(data);
753
+ }
754
+ else {
755
+ data = this.flattenTreeData(data);
756
+ }
757
+ }
758
+ // Apply search
759
+ if (this.searchable && this.state.searchQuery) {
760
+ data = this.applySearch(data, this.state.searchQuery);
761
+ }
762
+ // Apply basic filters
763
+ if (this.filterable && Object.keys(this.state.filterConfig).length > 0) {
764
+ data = this.applyFilters(data, this.state.filterConfig);
765
+ }
766
+ // Apply advanced filters (PREMIUM)
767
+ if (this.advancedFilters) {
768
+ data = this.applyAdvancedFilters(data);
769
+ }
770
+ // Apply sort (multi-sort or single sort) (PREMIUM)
771
+ if (this.sortable) {
772
+ if (this.multiSort && this.multiSortConfig.length > 0) {
773
+ data = this.applyMultiSort(data);
774
+ }
775
+ else if (this.state.sortConfig.field && this.state.sortConfig.direction) {
776
+ data = this.applySort(data, this.state.sortConfig);
777
+ }
778
+ }
779
+ // Update total rows after filtering
780
+ if (!this.serverSide) {
781
+ this.state.pagination.totalRows = data.length;
782
+ this.state.pagination.totalPages = this.calculateTotalPages(this.state.pagination.pageSize);
783
+ }
784
+ // Calculate aggregations (PREMIUM)
785
+ // if (this.columnAggregation) {
786
+ // this.calculateAggregations();
787
+ // }
788
+ // Apply pagination (skip if virtual scroll)
789
+ if (this.pagination && !this.serverSide && !this.virtualScroll) {
790
+ data = this.applyPagination(data);
791
+ }
792
+ // Save state if persistence enabled (PREMIUM)
793
+ if (this.persistState) {
794
+ this.saveTableState();
795
+ }
796
+ return data;
797
+ }
798
+ applySearch(data, query) {
799
+ const lowerQuery = query.toLowerCase();
800
+ const columns = this.getVisibleColumns();
801
+ return data.filter(row => {
802
+ return columns.some(col => {
803
+ const value = col.field ? row[col.field] : '';
804
+ return String(value).toLowerCase().includes(lowerQuery);
805
+ });
806
+ });
807
+ }
808
+ applyFilters(data, filters) {
809
+ return data.filter(row => {
810
+ return Object.keys(filters).every(field => {
811
+ const filterValue = filters[field];
812
+ if (filterValue === null || filterValue === '')
813
+ return true;
814
+ const rowValue = row[field];
815
+ if (typeof filterValue === 'string') {
816
+ return String(rowValue).toLowerCase().includes(filterValue.toLowerCase());
817
+ }
818
+ return rowValue === filterValue;
819
+ });
820
+ });
821
+ }
822
+ applySort(data, sort) {
823
+ return [...data].sort((a, b) => {
824
+ const aVal = a[sort.field];
825
+ const bVal = b[sort.field];
826
+ if (aVal === bVal)
827
+ return 0;
828
+ const comparison = aVal < bVal ? -1 : 1;
829
+ return sort.direction === 'asc' ? comparison : -comparison;
830
+ });
831
+ }
832
+ applyPagination(data) {
833
+ const { currentPage, pageSize } = this.state.pagination;
834
+ const start = (currentPage - 1) * pageSize;
835
+ const end = start + pageSize;
836
+ return data.slice(start, end);
837
+ }
838
+ groupData(data, groupByField) {
839
+ const groups = new Map();
840
+ data.forEach(row => {
841
+ const groupValue = row[groupByField] !== undefined && row[groupByField] !== null
842
+ ? String(row[groupByField])
843
+ : '(Empty)';
844
+ if (!groups.has(groupValue)) {
845
+ groups.set(groupValue, []);
846
+ }
847
+ groups.get(groupValue).push(row);
848
+ });
849
+ return groups;
850
+ }
851
+ handleGroupToggle(groupKey) {
852
+ const newExpanded = new Set(this.state.expandedGroups);
853
+ if (newExpanded.has(groupKey)) {
854
+ newExpanded.delete(groupKey);
855
+ }
856
+ else {
857
+ newExpanded.add(groupKey);
858
+ }
859
+ this.state = { ...this.state, expandedGroups: newExpanded };
860
+ this.groupToggle.emit({ groupKey, expanded: newExpanded.has(groupKey) });
861
+ }
862
+ handleGroupByChange(field) {
863
+ const newGroupBy = field === this.state.groupBy ? null : field;
864
+ // Initialize expanded groups based on expandGroupsByDefault prop
865
+ const expandedGroups = new Set();
866
+ if (newGroupBy && this.expandGroupsByDefault) {
867
+ const data = this.getProcessedData();
868
+ const groups = this.groupData(data, newGroupBy);
869
+ groups.forEach((_, key) => expandedGroups.add(key));
870
+ }
871
+ this.state = {
872
+ ...this.state,
873
+ groupBy: newGroupBy,
874
+ expandedGroups: expandedGroups,
875
+ };
876
+ if (newGroupBy) {
877
+ this.groupByChange.emit({ field: newGroupBy });
878
+ }
879
+ }
880
+ handleSort(field) {
881
+ if (!this.sortable)
882
+ return;
883
+ this.pushUndoState();
884
+ const currentSort = this.state.sortConfig;
885
+ let newDirection = 'asc';
886
+ if (currentSort.field === field) {
887
+ if (currentSort.direction === 'asc') {
888
+ newDirection = 'desc';
889
+ }
890
+ else if (currentSort.direction === 'desc') {
891
+ newDirection = null;
892
+ }
893
+ }
894
+ const newSort = {
895
+ field: newDirection ? field : '',
896
+ direction: newDirection,
897
+ };
898
+ this.state = { ...this.state, sortConfig: newSort };
899
+ this.sortChange.emit(newSort);
900
+ // Announce to screen readers
901
+ if (this.enhancedAccessibility && newDirection) {
902
+ this.announceToScreenReader(`Sorted by ${field} ${newDirection === 'asc' ? 'ascending' : 'descending'}`);
903
+ }
904
+ }
905
+ handleSearch(event) {
906
+ this.pushUndoState();
907
+ const input = event.target;
908
+ this.state = {
909
+ ...this.state,
910
+ searchQuery: input.value,
911
+ pagination: { ...this.state.pagination, currentPage: 1 },
912
+ };
913
+ this.searchChange.emit({ query: input.value });
914
+ }
915
+ handleFilter(field, value) {
916
+ this.pushUndoState();
917
+ const newFilters = { ...this.state.filterConfig };
918
+ if (value === '') {
919
+ delete newFilters[field];
920
+ }
921
+ else {
922
+ newFilters[field] = value;
923
+ }
924
+ this.state = {
925
+ ...this.state,
926
+ filterConfig: newFilters,
927
+ pagination: { ...this.state.pagination, currentPage: 1 },
928
+ };
929
+ this.filterChange.emit(newFilters);
930
+ // Announce to screen readers
931
+ if (this.enhancedAccessibility) {
932
+ const filterCount = Object.keys(newFilters).length;
933
+ this.announceToScreenReader(`${filterCount} filter${filterCount !== 1 ? 's' : ''} applied`);
934
+ }
935
+ }
936
+ handleRowSelect(rowId, event) {
937
+ const checkbox = event.target;
938
+ const newSelected = new Set(this.state.selectedRows);
939
+ if (checkbox.checked) {
940
+ if (this.multiSelect) {
941
+ newSelected.add(rowId);
942
+ }
943
+ else {
944
+ newSelected.clear();
945
+ newSelected.add(rowId);
946
+ }
947
+ }
948
+ else {
949
+ newSelected.delete(rowId);
950
+ }
951
+ this.updateSelectedRows(newSelected);
952
+ }
953
+ handleSelectAll(event) {
954
+ const checkbox = event.target;
955
+ if (checkbox.checked) {
956
+ const allIds = this.getProcessedData().map(row => row.id);
957
+ this.updateSelectedRows(new Set(allIds));
958
+ }
959
+ else {
960
+ this.updateSelectedRows(new Set());
961
+ }
962
+ }
963
+ updateSelectedRows(selected) {
964
+ this.pushUndoState();
965
+ this.state = { ...this.state, selectedRows: selected };
966
+ const selectedArray = Array.from(selected);
967
+ if (selected.size > 0) {
968
+ this.rowSelect.emit({ selectedRows: selectedArray });
969
+ // Announce to screen readers
970
+ if (this.enhancedAccessibility) {
971
+ this.announceToScreenReader(`${selected.size} row${selected.size !== 1 ? 's' : ''} selected`);
972
+ }
973
+ }
974
+ else {
975
+ this.rowDeselect.emit({ selectedRows: selectedArray });
976
+ if (this.enhancedAccessibility) {
977
+ this.announceToScreenReader('All rows deselected');
978
+ }
979
+ }
980
+ }
981
+ handleCellEdit(rowId, field, value) {
982
+ // Phase 2: Inline Validation
983
+ if (this.advancedValidation) {
984
+ const error = this.validateCell(rowId, field, value);
985
+ const rowKey = String(rowId);
986
+ if (error) {
987
+ const rowErrors = this.validationErrors.get(rowKey) || new Map();
988
+ rowErrors.set(field, error);
989
+ this.validationErrors = new Map(this.validationErrors).set(rowKey, rowErrors);
990
+ }
991
+ else {
992
+ const rowErrors = this.validationErrors.get(rowKey);
993
+ if (rowErrors && rowErrors.has(field)) {
994
+ rowErrors.delete(field);
995
+ this.validationErrors = new Map(this.validationErrors);
996
+ }
997
+ }
998
+ }
999
+ // Emit stop event before edit
1000
+ this.cellEditStop.emit({ rowId, field, value });
1001
+ // Emit main edit event
1002
+ this.cellEdit.emit({ rowId, field, value });
1003
+ // Clear editing state
1004
+ this.state = { ...this.state, editingCell: null };
1005
+ // Check if row editing should stop
1006
+ if (this.editingRow === rowId && !this.editable) {
1007
+ this.stopRowEdit(rowId);
1008
+ }
1009
+ }
1010
+ startCellEdit(rowId, field) {
1011
+ if (!this.editable)
1012
+ return;
1013
+ const row = Array.isArray(this.data) ? this.data.find(r => r.id === rowId) : null;
1014
+ const currentValue = row ? row[field] : null;
1015
+ // Emit start event
1016
+ this.cellEditStart.emit({ rowId, field, value: currentValue });
1017
+ // Start row editing if not already started
1018
+ if (this.editingRow !== rowId) {
1019
+ this.startRowEdit(rowId);
1020
+ }
1021
+ this.state = { ...this.state, editingCell: { rowId, field } };
1022
+ setTimeout(() => {
1023
+ if (this.editInputRef) {
1024
+ this.editInputRef?.setFocus();
1025
+ if (this.editInputRef && 'select' in this.editInputRef) {
1026
+ this.editInputRef.select();
1027
+ }
1028
+ }
1029
+ }, 0);
1030
+ }
1031
+ startRowEdit(rowId) {
1032
+ const row = Array.isArray(this.data) ? this.data.find(r => r.id === rowId) : null;
1033
+ if (row) {
1034
+ this.editingRow = rowId;
1035
+ this.rowEditStart.emit({ row });
1036
+ }
1037
+ }
1038
+ stopRowEdit(rowId) {
1039
+ const row = Array.isArray(this.data) ? this.data.find(r => r.id === rowId) : null;
1040
+ if (row) {
1041
+ this.editingRow = null;
1042
+ this.rowEditStop.emit({ row });
1043
+ }
1044
+ }
1045
+ toggleRowExpansion(rowId, event) {
1046
+ event.stopPropagation();
1047
+ const newExpanded = new Set(this.state.expandedRows);
1048
+ if (newExpanded.has(rowId)) {
1049
+ newExpanded.delete(rowId);
1050
+ }
1051
+ else {
1052
+ newExpanded.add(rowId);
1053
+ }
1054
+ this.state = { ...this.state, expandedRows: newExpanded };
1055
+ }
1056
+ flattenTreeData(data, depth = 0) {
1057
+ let result = [];
1058
+ data.forEach(row => {
1059
+ // Clone row to avoid mutating original data property,
1060
+ // but simplistic clone might lose methods if any.
1061
+ // Assuming data is POJO.
1062
+ const flatRow = { ...row, _depth: depth, _hasChildren: row.children && row.children.length > 0 };
1063
+ result.push(flatRow);
1064
+ if (row.children && row.children.length > 0 && this.state.expandedRows.has(row.id)) {
1065
+ result = result.concat(this.flattenTreeData(row.children, depth + 1));
1066
+ }
1067
+ });
1068
+ return result;
1069
+ }
1070
+ // New handlers for ui-pagination component
1071
+ handlePaginationChange(event) {
1072
+ const { page, itemsPerPage } = event.detail;
1073
+ this.state = {
1074
+ ...this.state,
1075
+ pagination: {
1076
+ ...this.state.pagination,
1077
+ currentPage: page,
1078
+ pageSize: itemsPerPage,
1079
+ },
1080
+ };
1081
+ this.pageChange.emit({ page, pageSize: itemsPerPage });
1082
+ }
1083
+ handlePageSizeChangeFromPagination(event) {
1084
+ const newPageSize = event.detail;
1085
+ this.state = {
1086
+ ...this.state,
1087
+ pagination: {
1088
+ ...this.state.pagination,
1089
+ pageSize: newPageSize,
1090
+ currentPage: 1,
1091
+ totalPages: this.calculateTotalPages(newPageSize),
1092
+ },
1093
+ };
1094
+ this.pageChange.emit({ page: 1, pageSize: newPageSize });
1095
+ }
1096
+ // ========== PREMIUM FEATURES HELPER METHODS ==========
1097
+ // Virtual Scrolling
1098
+ handleVirtualScroll = (event) => {
1099
+ if (!this.virtualScroll)
1100
+ return;
1101
+ const target = event.target;
1102
+ const scrollTop = target.scrollTop;
1103
+ const start = Math.floor(scrollTop / this.virtualRowHeight);
1104
+ const visibleCount = Math.ceil(target.clientHeight / this.virtualRowHeight);
1105
+ const end = start + visibleCount + 10; // buffer rows
1106
+ this.virtualVisibleRange = { start: Math.max(0, start - 5), end };
1107
+ };
1108
+ // Multi-Column Sort
1109
+ handleMultiSort(field, event) {
1110
+ if (!this.multiSort) {
1111
+ this.handleSort(field);
1112
+ return;
1113
+ }
1114
+ this.pushUndoState();
1115
+ const ctrl = event && (event.ctrlKey || event.metaKey);
1116
+ const existing = this.multiSortConfig.findIndex(s => s.field === field);
1117
+ let newConfig = [...this.multiSortConfig];
1118
+ if (ctrl) {
1119
+ // Add to multi-sort
1120
+ if (existing >= 0) {
1121
+ if (newConfig[existing].direction === 'asc') {
1122
+ newConfig[existing].direction = 'desc';
1123
+ }
1124
+ else {
1125
+ newConfig.splice(existing, 1);
1126
+ }
1127
+ }
1128
+ else {
1129
+ if (newConfig.length < this.maxSortColumns) {
1130
+ newConfig.push({ field, direction: 'asc' });
1131
+ }
1132
+ }
1133
+ }
1134
+ else {
1135
+ // Single sort
1136
+ newConfig = existing >= 0 && newConfig[existing].direction === 'asc'
1137
+ ? [{ field, direction: 'desc' }]
1138
+ : [{ field, direction: 'asc' }];
1139
+ }
1140
+ this.multiSortConfig = newConfig;
1141
+ }
1142
+ applyMultiSort(data) {
1143
+ if (!this.multiSort || this.multiSortConfig.length === 0) {
1144
+ return this.applySort(data, this.state.sortConfig);
1145
+ }
1146
+ return [...data].sort((a, b) => {
1147
+ for (const sort of this.multiSortConfig) {
1148
+ const aVal = a[sort.field];
1149
+ const bVal = b[sort.field];
1150
+ if (aVal !== bVal) {
1151
+ const comparison = aVal < bVal ? -1 : 1;
1152
+ return sort.direction === 'asc' ? comparison : -comparison;
1153
+ }
1154
+ }
1155
+ return 0;
1156
+ });
1157
+ }
1158
+ // Advanced Filters
1159
+ filterOperators = {
1160
+ equals: (value, filterValue) => value === filterValue,
1161
+ notEquals: (value, filterValue) => value !== filterValue,
1162
+ contains: (value, filterValue) => String(value).toLowerCase().includes(String(filterValue).toLowerCase()),
1163
+ startsWith: (value, filterValue) => String(value).toLowerCase().startsWith(String(filterValue).toLowerCase()),
1164
+ endsWith: (value, filterValue) => String(value).toLowerCase().endsWith(String(filterValue).toLowerCase()),
1165
+ greaterThan: (value, filterValue) => Number(value) > Number(filterValue),
1166
+ lessThan: (value, filterValue) => Number(value) < Number(filterValue),
1167
+ isEmpty: (value) => value === null || value === undefined || value === '',
1168
+ isNotEmpty: (value) => value !== null && value !== undefined && value !== '',
1169
+ };
1170
+ applyAdvancedFilters(data) {
1171
+ if (!this.advancedFilters || this.advancedFilterConfig.size === 0)
1172
+ return data;
1173
+ return data.filter(row => {
1174
+ return Array.from(this.advancedFilterConfig.entries()).every(([field, config]) => {
1175
+ const operator = this.filterOperators[config.operator];
1176
+ return operator ? operator(row[field], config.value) : true;
1177
+ });
1178
+ });
1179
+ }
1180
+ // State Persistence
1181
+ saveTableState() {
1182
+ if (!this.persistState || typeof window === 'undefined')
1183
+ return;
1184
+ try {
1185
+ const state = {
1186
+ sortConfig: this.multiSort ? this.multiSortConfig : this.state.sortConfig,
1187
+ filterConfig: this.state.filterConfig,
1188
+ columnOrder: this.state.columnOrder,
1189
+ visibleColumns: Array.from(this.state.visibleColumns),
1190
+ columnWidths: Array.from(this.state.columnWidths.entries()),
1191
+ pagination: this.state.pagination,
1192
+ groupBy: this.state.groupBy,
1193
+ };
1194
+ localStorage.setItem(this.stateStorageKey, JSON.stringify(state));
1195
+ }
1196
+ catch (e) {
1197
+ console.error('Failed to save table state:', e);
1198
+ }
1199
+ }
1200
+ loadTableState() {
1201
+ if (!this.persistState || typeof window === 'undefined')
1202
+ return;
1203
+ try {
1204
+ const saved = localStorage.getItem(this.stateStorageKey);
1205
+ if (saved) {
1206
+ const state = JSON.parse(saved);
1207
+ if (this.multiSort && state.multiSortConfig) {
1208
+ this.multiSortConfig = state.multiSortConfig;
1209
+ }
1210
+ this.state = {
1211
+ ...this.state,
1212
+ sortConfig: state.sortConfig || this.state.sortConfig,
1213
+ filterConfig: state.filterConfig || {},
1214
+ columnOrder: state.columnOrder || this.state.columnOrder,
1215
+ visibleColumns: new Set(state.visibleColumns || this.state.visibleColumns),
1216
+ columnWidths: new Map(state.columnWidths || []),
1217
+ groupBy: state.groupBy || null,
1218
+ };
1219
+ }
1220
+ }
1221
+ catch (e) {
1222
+ console.error('Failed to load table state:', e);
1223
+ }
1224
+ }
1225
+ // Row Details
1226
+ toggleRowDetails(rowId) {
1227
+ const newExpanded = new Set(this.expandedRowDetails);
1228
+ if (newExpanded.has(rowId)) {
1229
+ newExpanded.delete(rowId);
1230
+ }
1231
+ else {
1232
+ newExpanded.add(rowId);
1233
+ }
1234
+ this.expandedRowDetails = newExpanded;
1235
+ }
1236
+ // Column Auto-sizing
1237
+ // Inline Validation
1238
+ validateCell(_rowId, field, value) {
1239
+ if (!this.inlineValidation && !this.advancedValidation)
1240
+ return null;
1241
+ // Check column-level validator first
1242
+ const column = this.getVisibleColumns().find(c => c.field === field);
1243
+ if (column && column.validator) {
1244
+ const row = Array.isArray(this.data) ? this.data.find(r => r.id === _rowId) : null;
1245
+ const result = column.validator(value, row);
1246
+ if (result !== true && result !== null) {
1247
+ return typeof result === 'string' ? result : 'Invalid value';
1248
+ }
1249
+ }
1250
+ if (!this.validationRules[field])
1251
+ return null;
1252
+ const rules = this.validationRules[field];
1253
+ if (rules.required && (value === null || value === undefined || value === '')) {
1254
+ return 'This field is required';
1255
+ }
1256
+ if (rules.minLength && String(value).length < rules.minLength) {
1257
+ return `Minimum length is ${rules.minLength}`;
1258
+ }
1259
+ if (rules.maxLength && String(value).length > rules.maxLength) {
1260
+ return `Maximum length is ${rules.maxLength}`;
1261
+ }
1262
+ if (rules.min !== undefined && Number(value) < rules.min) {
1263
+ return `Minimum value is ${rules.min}`;
1264
+ }
1265
+ if (rules.max !== undefined && Number(value) > rules.max) {
1266
+ return `Maximum value is ${rules.max}`;
1267
+ }
1268
+ if (rules.pattern && !new RegExp(rules.pattern).test(String(value))) {
1269
+ return rules.patternMessage || 'Invalid format';
1270
+ }
1271
+ // Advanced validation: Custom sync function
1272
+ if (this.advancedValidation && rules.custom && typeof rules.custom === 'function') {
1273
+ try {
1274
+ const result = rules.custom(value);
1275
+ if (result !== true) {
1276
+ return typeof result === 'string' ? result : 'Validation failed';
1277
+ }
1278
+ }
1279
+ catch (error) {
1280
+ return 'Validation error';
1281
+ }
1282
+ }
1283
+ // Advanced validation: Async custom function (handled separately)
1284
+ if (this.advancedValidation && rules.asyncCustom && typeof rules.asyncCustom === 'function') {
1285
+ this.validateCellAsync(_rowId, field, value, rules.asyncCustom);
1286
+ }
1287
+ return null;
1288
+ }
1289
+ async validateCellAsync(rowId, field, value, asyncValidator) {
1290
+ try {
1291
+ const result = await asyncValidator(value);
1292
+ const rowKey = String(rowId);
1293
+ if (result !== true) {
1294
+ const error = typeof result === 'string' ? result : 'Async validation failed';
1295
+ const rowErrors = this.validationErrors.get(rowKey) || new Map();
1296
+ rowErrors.set(field, error);
1297
+ this.validationErrors = new Map(this.validationErrors).set(rowKey, rowErrors);
1298
+ }
1299
+ else {
1300
+ const rowErrors = this.validationErrors.get(rowKey);
1301
+ if (rowErrors && rowErrors.has(field)) {
1302
+ rowErrors.delete(field);
1303
+ this.validationErrors = new Map(this.validationErrors);
1304
+ }
1305
+ }
1306
+ }
1307
+ catch (error) {
1308
+ const rowKey = String(rowId);
1309
+ const rowErrors = this.validationErrors.get(rowKey) || new Map();
1310
+ rowErrors.set(field, 'Async validation error');
1311
+ this.validationErrors = new Map(this.validationErrors).set(rowKey, rowErrors);
1312
+ }
1313
+ }
1314
+ // ========== NEW HIGH-VALUE FEATURES IMPLEMENTATION ==========
1315
+ // Feature 1: Advanced Cell Editors
1316
+ renderAdvancedCellEditor(row, column, value) {
1317
+ if (!this.advancedCellEditors) {
1318
+ return this.renderEditableCell(row, column, value);
1319
+ }
1320
+ const handleChange = (newValue) => {
1321
+ this.handleCellEdit(row.id, column.field, newValue);
1322
+ this.state = { ...this.state, editingCell: null };
1323
+ };
1324
+ switch (column.type) {
1325
+ case 'date':
1326
+ case 'datetime':
1327
+ case 'number':
1328
+ return (index.h("ui-input", { type: column.type === 'datetime' ? 'datetime-local' : column.type, value: value || '', onInputChange: (v) => handleChange(column.type === 'number' ? Number(v.detail) : v.detail), onInputBlur: () => this.state = { ...this.state, editingCell: null }, customClass: `cell-editor ${column.type}-editor`, size: "sm" }));
1329
+ case 'boolean':
1330
+ return (index.h("ui-checkbox", { checked: !!value, onCheckboxChange: (e) => handleChange(e.detail.checked), size: "sm" }));
1331
+ default:
1332
+ return this.renderEditableCell(row, column, value);
1333
+ }
1334
+ }
1335
+ // Feature 2: Column Formatting
1336
+ formatCellValue(value, column) {
1337
+ if (!this.columnFormatting || value === null || value === undefined) {
1338
+ return String(value || '');
1339
+ }
1340
+ // Use custom formatter if provided
1341
+ if (column.format) {
1342
+ return column.format(value);
1343
+ }
1344
+ // Auto-format based on column type
1345
+ switch (column.type) {
1346
+ case 'number':
1347
+ return new Intl.NumberFormat().format(Number(value));
1348
+ case 'date':
1349
+ return new Intl.DateTimeFormat().format(new Date(value));
1350
+ case 'datetime':
1351
+ return new Intl.DateTimeFormat(undefined, {
1352
+ dateStyle: 'short',
1353
+ timeStyle: 'short'
1354
+ }).format(new Date(value));
1355
+ default:
1356
+ // Check for currency pattern in field name
1357
+ if (column.field?.toLowerCase().includes('price') ||
1358
+ column.field?.toLowerCase().includes('cost') ||
1359
+ column.field?.toLowerCase().includes('amount')) {
1360
+ return new Intl.NumberFormat(undefined, {
1361
+ style: 'currency',
1362
+ currency: 'USD'
1363
+ }).format(Number(value));
1364
+ }
1365
+ // Check for percentage pattern
1366
+ if (column.field?.toLowerCase().includes('percent') ||
1367
+ column.field?.toLowerCase().includes('rate')) {
1368
+ return new Intl.NumberFormat(undefined, {
1369
+ style: 'percent',
1370
+ minimumFractionDigits: 2
1371
+ }).format(Number(value) / 100);
1372
+ }
1373
+ return String(value);
1374
+ }
1375
+ }
1376
+ // Feature 3: Range Selection
1377
+ handleCellClick(rowId, field, event) {
1378
+ if (!this.rangeSelection || !event.shiftKey) {
1379
+ return;
1380
+ }
1381
+ if (!this.rangeSelectionAnchor) {
1382
+ this.rangeSelectionAnchor = { rowId, field };
1383
+ return;
1384
+ }
1385
+ // Select range of cells
1386
+ const data = this.getProcessedData();
1387
+ const startRowIndex = data.findIndex(r => r.id === this.rangeSelectionAnchor.rowId);
1388
+ const endRowIndex = data.findIndex(r => r.id === rowId);
1389
+ const minRow = Math.min(startRowIndex, endRowIndex);
1390
+ const maxRow = Math.max(startRowIndex, endRowIndex);
1391
+ // Select all rows in range
1392
+ const selectedRows = new Set(this.state.selectedRows);
1393
+ for (let i = minRow; i <= maxRow; i++) {
1394
+ selectedRows.add(data[i].id);
1395
+ }
1396
+ this.state = { ...this.state, selectedRows };
1397
+ }
1398
+ // Feature 4: Copy/Paste
1399
+ handleCopy = (event) => {
1400
+ if (!this.copyPaste || this.state.selectedRows.size === 0) {
1401
+ return;
1402
+ }
1403
+ event.preventDefault();
1404
+ const data = this.getProcessedData();
1405
+ const columns = this.getVisibleColumns();
1406
+ const selectedData = data.filter(row => this.state.selectedRows.has(row.id));
1407
+ // Create tab-separated values
1408
+ const headers = columns.map(col => col.label).join('\t');
1409
+ const rows = selectedData.map(row => columns.map(col => this.formatCellValue(row[col.field], col)).join('\t')).join('\n');
1410
+ const textData = headers + '\n' + rows;
1411
+ event.clipboardData?.setData('text/plain', textData);
1412
+ // Store for internal paste
1413
+ this.clipboardData = selectedData.map(row => columns.map(col => row[col.field]));
1414
+ };
1415
+ handlePaste = (event) => {
1416
+ if (!this.copyPaste || !this.editable) {
1417
+ return;
1418
+ }
1419
+ event.preventDefault();
1420
+ const pastedText = event.clipboardData?.getData('text/plain');
1421
+ if (!pastedText)
1422
+ return;
1423
+ // Parse pasted data
1424
+ const rows = pastedText.split('\n').map(row => row.split('\t'));
1425
+ // Emit paste event for external handling
1426
+ this.cellEdit.emit({
1427
+ rowId: 'paste',
1428
+ field: 'multiple',
1429
+ value: rows
1430
+ });
1431
+ };
1432
+ // Feature 5: Conditional Formatting
1433
+ getConditionalFormattingStyle(value, column) {
1434
+ if (!this.conditionalFormatting || !this.formattingRules[column.field]) {
1435
+ return {};
1436
+ }
1437
+ const rules = this.formattingRules[column.field];
1438
+ const numValue = Number(value);
1439
+ // Color scale
1440
+ if (rules.colorScale) {
1441
+ const { min, max, minColor, maxColor } = rules.colorScale;
1442
+ const ratio = (numValue - min) / (max - min);
1443
+ const r = Math.round(minColor.r + (maxColor.r - minColor.r) * ratio);
1444
+ const g = Math.round(minColor.g + (maxColor.g - minColor.g) * ratio);
1445
+ const b = Math.round(minColor.b + (maxColor.b - minColor.b) * ratio);
1446
+ return { backgroundColor: `rgb(${r}, ${g}, ${b})` };
1447
+ }
1448
+ // Data bars
1449
+ if (rules.dataBar) {
1450
+ const { min, max, color } = rules.dataBar;
1451
+ const percentage = ((numValue - min) / (max - min)) * 100;
1452
+ return {
1453
+ background: `linear-gradient(90deg, ${color} ${percentage}%, transparent ${percentage}%)`
1454
+ };
1455
+ }
1456
+ // Custom rules
1457
+ if (rules.custom && typeof rules.custom === 'function') {
1458
+ return rules.custom(value);
1459
+ }
1460
+ return {};
1461
+ }
1462
+ toggleColumnVisibility(columnId) {
1463
+ const newVisible = new Set(this.state.visibleColumns);
1464
+ if (newVisible.has(columnId)) {
1465
+ newVisible.delete(columnId);
1466
+ }
1467
+ else {
1468
+ newVisible.add(columnId);
1469
+ }
1470
+ this.state = { ...this.state, visibleColumns: newVisible };
1471
+ this.columnVisibilityChange.emit({ visible: Array.from(newVisible) });
1472
+ }
1473
+ handleColumnDragStart(columnId, event) {
1474
+ this.draggedColumn = columnId;
1475
+ event.dataTransfer.effectAllowed = 'move';
1476
+ }
1477
+ handleColumnDragOver(event) {
1478
+ event.preventDefault();
1479
+ event.dataTransfer.dropEffect = 'move';
1480
+ }
1481
+ handleColumnDrop(targetColumnId, event) {
1482
+ event.preventDefault();
1483
+ if (!this.draggedColumn || this.draggedColumn === targetColumnId)
1484
+ return;
1485
+ const newOrder = [...this.state.columnOrder];
1486
+ const draggedIndex = newOrder.indexOf(this.draggedColumn);
1487
+ const targetIndex = newOrder.indexOf(targetColumnId);
1488
+ newOrder.splice(draggedIndex, 1);
1489
+ newOrder.splice(targetIndex, 0, this.draggedColumn);
1490
+ this.state = { ...this.state, columnOrder: newOrder };
1491
+ this.columnOrderChange.emit({ order: newOrder });
1492
+ this.draggedColumn = null;
1493
+ }
1494
+ /**
1495
+ * Pin/Unpin column
1496
+ */
1497
+ async handleColumnPin(columnId, position) {
1498
+ const newPinned = { ...this.pinnedColumns };
1499
+ // Remove from both sides first
1500
+ newPinned.left = newPinned.left.filter(id => id !== columnId);
1501
+ newPinned.right = newPinned.right.filter(id => id !== columnId);
1502
+ // Add to new position
1503
+ if (position === 'left') {
1504
+ newPinned.left.push(columnId);
1505
+ }
1506
+ else if (position === 'right') {
1507
+ newPinned.right.push(columnId);
1508
+ }
1509
+ this.pinnedColumns = newPinned;
1510
+ this.columnPin.emit({ columnId, position });
1511
+ }
1512
+ /**
1513
+ * Pin/Unpin row
1514
+ */
1515
+ async handleRowPin(rowId, position) {
1516
+ const newPinned = { ...this.pinnedRows };
1517
+ // Remove from both positions first
1518
+ newPinned.top = newPinned.top.filter(id => id !== rowId);
1519
+ newPinned.bottom = newPinned.bottom.filter(id => id !== rowId);
1520
+ // Add to new position
1521
+ if (position === 'top') {
1522
+ newPinned.top.push(rowId);
1523
+ }
1524
+ else if (position === 'bottom') {
1525
+ newPinned.bottom.push(rowId);
1526
+ }
1527
+ this.pinnedRows = newPinned;
1528
+ this.rowPin.emit({ rowId, position });
1529
+ }
1530
+ /**
1531
+ * Row reordering handlers
1532
+ */
1533
+ handleRowDragStart(rowIndex, event) {
1534
+ if (!this.rowReorder)
1535
+ return;
1536
+ this.draggedRow = rowIndex;
1537
+ event.dataTransfer.effectAllowed = 'move';
1538
+ }
1539
+ handleRowDragOver(event) {
1540
+ if (!this.rowReorder)
1541
+ return;
1542
+ event.preventDefault();
1543
+ event.dataTransfer.dropEffect = 'move';
1544
+ }
1545
+ handleRowDrop(targetRowIndex, event) {
1546
+ event.preventDefault();
1547
+ if (this.draggedRow === null || this.draggedRow === targetRowIndex)
1548
+ return;
1549
+ this.rowReorderEvent.emit({ fromIndex: this.draggedRow, toIndex: targetRowIndex });
1550
+ this.draggedRow = null;
1551
+ }
1552
+ /**
1553
+ * Multi-filter management
1554
+ */
1555
+ addFilter(field, operator, value) {
1556
+ const fieldFilters = this.activeFilters.get(field) || [];
1557
+ fieldFilters.push({ operator, value });
1558
+ this.activeFilters.set(field, fieldFilters);
1559
+ // Update filter config
1560
+ const newFilters = { ...this.state.filterConfig };
1561
+ newFilters[field] = fieldFilters;
1562
+ this.state = { ...this.state, filterConfig: newFilters };
1563
+ this.filterChange.emit(newFilters);
1564
+ }
1565
+ removeFilter(field, index) {
1566
+ const fieldFilters = this.activeFilters.get(field) || [];
1567
+ fieldFilters.splice(index, 1);
1568
+ if (fieldFilters.length === 0) {
1569
+ this.activeFilters.delete(field);
1570
+ }
1571
+ else {
1572
+ this.activeFilters.set(field, fieldFilters);
1573
+ }
1574
+ // Update filter config
1575
+ const newFilters = { ...this.state.filterConfig };
1576
+ if (fieldFilters.length === 0) {
1577
+ delete newFilters[field];
1578
+ }
1579
+ else {
1580
+ newFilters[field] = fieldFilters;
1581
+ }
1582
+ this.state = { ...this.state, filterConfig: newFilters };
1583
+ this.filterChange.emit(newFilters);
1584
+ }
1585
+ clearAllFilters() {
1586
+ this.activeFilters.clear();
1587
+ this.state = { ...this.state, filterConfig: {} };
1588
+ this.filterChange.emit({});
1589
+ }
1590
+ handleResizeStart = (columnId, event) => {
1591
+ event.preventDefault();
1592
+ event.stopPropagation();
1593
+ this.resizingColumnId = columnId;
1594
+ this.resizeStartX = event.clientX;
1595
+ this.resizeStartWidth = this.state.columnWidths.get(columnId) || 150;
1596
+ this.resizingColumn = columnId;
1597
+ document.addEventListener('mousemove', this.handleResizeMove);
1598
+ document.addEventListener('mouseup', this.handleResizeEnd);
1599
+ // Prevent text selection during resize
1600
+ document.body.style.userSelect = 'none';
1601
+ };
1602
+ handleResizeMove = (event) => {
1603
+ if (!this.resizingColumnId)
1604
+ return;
1605
+ const diff = event.clientX - this.resizeStartX;
1606
+ const newWidth = Math.max(50, this.resizeStartWidth + diff); // Minimum width of 50px
1607
+ const newWidths = new Map(this.state.columnWidths);
1608
+ newWidths.set(this.resizingColumnId, newWidth);
1609
+ this.state = {
1610
+ ...this.state,
1611
+ columnWidths: newWidths,
1612
+ };
1613
+ };
1614
+ handleResizeEnd = () => {
1615
+ this.resizingColumnId = '';
1616
+ this.resizingColumn = null;
1617
+ document.body.style.userSelect = '';
1618
+ document.removeEventListener('mousemove', this.handleResizeMove);
1619
+ document.removeEventListener('mouseup', this.handleResizeEnd);
1620
+ };
1621
+ calculateInitialColumnWidths(columns) {
1622
+ const widths = new Map();
1623
+ const visibleColumns = columns.filter(col => col.visible !== false);
1624
+ const columnCount = visibleColumns.length;
1625
+ // Base width calculation with non-linear scaling for many columns
1626
+ let baseWidth;
1627
+ if (columnCount <= 3) {
1628
+ baseWidth = 250;
1629
+ }
1630
+ else if (columnCount <= 6) {
1631
+ baseWidth = 200;
1632
+ }
1633
+ else if (columnCount <= 10) {
1634
+ baseWidth = 150;
1635
+ }
1636
+ else if (columnCount <= 15) {
1637
+ baseWidth = 120;
1638
+ }
1639
+ else {
1640
+ baseWidth = 100;
1641
+ }
1642
+ visibleColumns.forEach(col => {
1643
+ // Use specified width if available, otherwise use calculated base width
1644
+ if (col.width) {
1645
+ // Parse width (e.g., "200px" -> 200)
1646
+ const parsed = parseInt(col.width);
1647
+ widths.set(col.id, isNaN(parsed) ? baseWidth : parsed);
1648
+ }
1649
+ else {
1650
+ widths.set(col.id, baseWidth);
1651
+ }
1652
+ });
1653
+ return widths;
1654
+ }
1655
+ prepareExportData(options) {
1656
+ let data = options.selectedOnly
1657
+ ? this.parseData().filter(row => this.state.selectedRows.has(row.id))
1658
+ : this.getProcessedData();
1659
+ const columns = options.visibleColumnsOnly
1660
+ ? this.getVisibleColumns()
1661
+ : this.flattenColumns(this.parseColumns());
1662
+ return data.map(row => {
1663
+ const exportRow = {};
1664
+ columns.forEach(col => {
1665
+ if (col.field) {
1666
+ exportRow[col.label] = col.format
1667
+ ? col.format(row[col.field])
1668
+ : row[col.field];
1669
+ }
1670
+ });
1671
+ return exportRow;
1672
+ });
1673
+ }
1674
+ performExport(data, options) {
1675
+ if (options.format === 'csv') {
1676
+ this.exportToCSV(data, options.fileName || 'export.csv');
1677
+ }
1678
+ else if (options.format === 'json') {
1679
+ this.exportToJSON(data, options.fileName || 'export.json');
1680
+ }
1681
+ else if (options.format === 'excel') {
1682
+ this.exportToExcel(data, options.fileName || 'export.xlsx');
1683
+ }
1684
+ this.dataExport.emit({ data, format: options.format });
1685
+ this.showExportDialog = false;
1686
+ }
1687
+ exportToCSV(data, fileName) {
1688
+ if (data.length === 0)
1689
+ return;
1690
+ const headers = Object.keys(data[0]);
1691
+ const csvContent = [
1692
+ headers.join(','),
1693
+ ...data.map(row => headers.map(header => {
1694
+ const value = row[header];
1695
+ return typeof value === 'string' && value.includes(',')
1696
+ ? `"${value}"`
1697
+ : value;
1698
+ }).join(','))
1699
+ ].join('\n');
1700
+ this.downloadFile(csvContent, fileName, 'text/csv');
1701
+ }
1702
+ exportToJSON(data, fileName) {
1703
+ const jsonContent = JSON.stringify(data, null, 2);
1704
+ this.downloadFile(jsonContent, fileName, 'application/json');
1705
+ }
1706
+ exportToExcel(data, fileName) {
1707
+ if (data.length === 0)
1708
+ return;
1709
+ const headers = Object.keys(data[0]);
1710
+ // Build Excel XML (SpreadsheetML format)
1711
+ let xml = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>';
1712
+ xml += '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" ';
1713
+ xml += 'xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';
1714
+ xml += '<Styles>';
1715
+ xml += '<Style ss:ID="Header"><Font ss:Bold="1"/><Interior ss:Color="#4472C4" ss:Pattern="Solid"/></Style>';
1716
+ xml += '<Style ss:ID="Default"><Borders><Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/></Borders></Style>';
1717
+ xml += '</Styles>';
1718
+ xml += '<Worksheet ss:Name="Sheet1"><Table>';
1719
+ // Add header row
1720
+ xml += '<Row ss:StyleID="Header">';
1721
+ headers.forEach(header => {
1722
+ xml += `<Cell><Data ss:Type="String">${this.escapeXml(header)}</Data></Cell>`;
1723
+ });
1724
+ xml += '</Row>';
1725
+ // Add data rows
1726
+ data.forEach(row => {
1727
+ xml += '<Row ss:StyleID="Default">';
1728
+ headers.forEach(header => {
1729
+ const value = row[header];
1730
+ const type = typeof value === 'number' ? 'Number' : 'String';
1731
+ const cellValue = value !== null && value !== undefined ? value : '';
1732
+ xml += `<Cell><Data ss:Type="${type}">${this.escapeXml(String(cellValue))}</Data></Cell>`;
1733
+ });
1734
+ xml += '</Row>';
1735
+ });
1736
+ xml += '</Table></Worksheet></Workbook>';
1737
+ this.downloadFile(xml, fileName, 'application/vnd.ms-excel');
1738
+ }
1739
+ escapeXml(unsafe) {
1740
+ return unsafe
1741
+ .replace(/&/g, '&amp;')
1742
+ .replace(/</g, '&lt;')
1743
+ .replace(/>/g, '&gt;')
1744
+ .replace(/"/g, '&quot;')
1745
+ .replace(/'/g, '&apos;');
1746
+ }
1747
+ downloadFile(content, fileName, mimeType) {
1748
+ const blob = new Blob([content], { type: mimeType });
1749
+ const url = URL.createObjectURL(blob);
1750
+ const link = document.createElement('a');
1751
+ link.href = url;
1752
+ link.download = fileName;
1753
+ link.click();
1754
+ URL.revokeObjectURL(url);
1755
+ }
1756
+ // ========== PHASE 2 EXPORT & UTILS ==========
1757
+ exportToPDF() {
1758
+ // Check if print optimization is enabled, use window.print as fallback
1759
+ if (this.printOptimized) {
1760
+ window.print();
1761
+ }
1762
+ else {
1763
+ console.warn('PDF Export requires jspdf library. Please enable print mode.');
1764
+ alert('PDF Export not fully implemented without jspdf. Printing page instead.');
1765
+ window.print();
1766
+ }
1767
+ }
1768
+ // ========== UNDO/REDO ==========
1769
+ pushUndoState() {
1770
+ if (!this.undoRedo)
1771
+ return;
1772
+ // Deep copy state
1773
+ const stateCopy = JSON.parse(JSON.stringify(this.state));
1774
+ this.undoStack = [...this.undoStack, stateCopy];
1775
+ this.redoStack = []; // Clear redo
1776
+ // Limit stack size
1777
+ if (this.undoStack.length > 20)
1778
+ this.undoStack.shift();
1779
+ }
1780
+ handleUndo() {
1781
+ if (!this.undoRedo || this.undoStack.length === 0)
1782
+ return;
1783
+ const currentState = JSON.parse(JSON.stringify(this.state));
1784
+ this.redoStack = [...this.redoStack, currentState];
1785
+ const prevState = this.undoStack.pop();
1786
+ this.undoStack = [...this.undoStack]; // trigger update
1787
+ this.state = { ...prevState };
1788
+ }
1789
+ handleRedo() {
1790
+ if (!this.undoRedo || this.redoStack.length === 0)
1791
+ return;
1792
+ const currentState = JSON.parse(JSON.stringify(this.state));
1793
+ this.undoStack = [...this.undoStack, currentState];
1794
+ const nextState = this.redoStack.pop();
1795
+ this.redoStack = [...this.redoStack];
1796
+ this.state = { ...nextState };
1797
+ }
1798
+ setupGlobalKeyboardShortcuts() {
1799
+ document.addEventListener('keydown', (e) => {
1800
+ if (this.undoRedo) {
1801
+ if ((e.ctrlKey || e.metaKey) && e.key === 'z') {
1802
+ e.preventDefault();
1803
+ this.handleUndo();
1804
+ }
1805
+ if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) {
1806
+ e.preventDefault();
1807
+ this.handleRedo();
1808
+ }
1809
+ }
1810
+ // Cell Navigation
1811
+ if (this.keyboardShortcuts && !this.state.editingCell) {
1812
+ this.handleKeyboardNavigation(e);
1813
+ }
1814
+ });
1815
+ }
1816
+ handleKeyboardNavigation(e) {
1817
+ const keys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', 'Escape', 'Tab'];
1818
+ if (!keys.includes(e.key))
1819
+ return;
1820
+ const data = this.getProcessedData();
1821
+ const columns = this.getVisibleColumns();
1822
+ if (data.length === 0 || columns.length === 0)
1823
+ return;
1824
+ let { focusedCell } = this.state;
1825
+ // If no cell focused, focus first cell on any arrow key
1826
+ if (!focusedCell) {
1827
+ if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {
1828
+ this.setFocusedCell(data[0].id, columns[0].field ?? '');
1829
+ e.preventDefault();
1830
+ }
1831
+ return;
1832
+ }
1833
+ const currentRowIndex = data.findIndex(r => r.id === focusedCell.rowId);
1834
+ const currentColIndex = columns.findIndex(c => c.field === focusedCell.field);
1835
+ if (currentRowIndex === -1 || currentColIndex === -1)
1836
+ return;
1837
+ switch (e.key) {
1838
+ case 'ArrowUp':
1839
+ if (currentRowIndex > 0) {
1840
+ this.setFocusedCell(data[currentRowIndex - 1].id, focusedCell.field);
1841
+ e.preventDefault();
1842
+ }
1843
+ break;
1844
+ case 'ArrowDown':
1845
+ if (currentRowIndex < data.length - 1) {
1846
+ this.setFocusedCell(data[currentRowIndex + 1].id, focusedCell.field);
1847
+ e.preventDefault();
1848
+ }
1849
+ break;
1850
+ case 'ArrowLeft':
1851
+ if (currentColIndex > 0) {
1852
+ this.setFocusedCell(focusedCell.rowId, columns[currentColIndex - 1].field ?? '');
1853
+ e.preventDefault();
1854
+ }
1855
+ break;
1856
+ case 'ArrowRight':
1857
+ if (currentColIndex < columns.length - 1) {
1858
+ this.setFocusedCell(focusedCell.rowId, columns[currentColIndex + 1].field ?? '');
1859
+ e.preventDefault();
1860
+ }
1861
+ break;
1862
+ case 'Enter':
1863
+ if (this.editable) {
1864
+ this.startCellEdit(focusedCell.rowId, focusedCell.field);
1865
+ e.preventDefault();
1866
+ }
1867
+ break;
1868
+ case 'Escape':
1869
+ this.setFocusedCell(null, '');
1870
+ break;
1871
+ }
1872
+ }
1873
+ setFocusedCell(rowId, field) {
1874
+ this.state = {
1875
+ ...this.state,
1876
+ focusedCell: rowId ? { rowId, field } : null
1877
+ };
1878
+ // Scroll into view if needed
1879
+ if (rowId) {
1880
+ setTimeout(() => {
1881
+ const cell = this.el.shadowRoot?.querySelector(`td[data-row-id="${rowId}"][data-field="${field}"]`);
1882
+ if (cell) {
1883
+ cell.scrollIntoView({ block: 'nearest', inline: 'nearest' });
1884
+ }
1885
+ }, 0);
1886
+ }
1887
+ }
1888
+ applyTheme() {
1889
+ const root = this.el.shadowRoot?.querySelector('.data-table-container');
1890
+ if (!root)
1891
+ return;
1892
+ if (this.theme === 'auto') {
1893
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
1894
+ root.classList.toggle('dark-mode', prefersDark);
1895
+ }
1896
+ else {
1897
+ root.classList.toggle('dark-mode', this.theme === 'dark');
1898
+ }
1899
+ }
1900
+ setupClickOutsideListener = () => {
1901
+ document.addEventListener('click', this.handleClickOutside);
1902
+ document.addEventListener('contextmenu', (e) => {
1903
+ if (this.contextMenu && this.contextMenuState.visible) {
1904
+ // Did we click inside the menu?
1905
+ const target = e.target;
1906
+ const menu = (this.el.shadowRoot || this.el).querySelector('.context-menu');
1907
+ if (menu && menu.contains(target)) {
1908
+ return;
1909
+ }
1910
+ // If not, let default happen or just close?
1911
+ // If we right clicked elsewhere, we want to open new menu there.
1912
+ // So this handler shouldn't block new menu.
1913
+ }
1914
+ });
1915
+ };
1916
+ handleClickOutside = (e) => {
1917
+ // Close actions menu if clicking outside
1918
+ if (this.activeActionMenu !== null) {
1919
+ const target = e.target;
1920
+ const actionsContainer = target.closest('.row-actions-container');
1921
+ // If click is outside any actions container, close the menu
1922
+ if (!actionsContainer) {
1923
+ this.activeActionMenu = null;
1924
+ }
1925
+ }
1926
+ // Close context menu
1927
+ if (this.contextMenuState.visible) {
1928
+ // Check if click is inside menu
1929
+ const target = e.target;
1930
+ const menu = (this.el.shadowRoot || this.el).querySelector('.context-menu');
1931
+ if (menu && menu.contains(target))
1932
+ return;
1933
+ this.contextMenuState = { ...this.contextMenuState, visible: false };
1934
+ }
1935
+ };
1936
+ handleHeaderContextMenu(e, col) {
1937
+ e.preventDefault();
1938
+ e.stopPropagation();
1939
+ const rect = e.currentTarget.getBoundingClientRect();
1940
+ this.contextMenuState = {
1941
+ visible: true,
1942
+ x: rect.left,
1943
+ y: rect.bottom + window.scrollY,
1944
+ type: 'header',
1945
+ target: col
1946
+ };
1947
+ }
1948
+ toggleColumnPin(columnId, side) {
1949
+ const newPinned = { ...this.pinnedColumns };
1950
+ // Remove from both sides first
1951
+ newPinned.left = newPinned.left.filter(id => id !== columnId);
1952
+ newPinned.right = newPinned.right.filter(id => id !== columnId);
1953
+ if (side === 'left') {
1954
+ newPinned.left.push(columnId);
1955
+ }
1956
+ else if (side === 'right') {
1957
+ newPinned.right.push(columnId);
1958
+ }
1959
+ this.pinnedColumns = newPinned;
1960
+ this.contextMenuState = { ...this.contextMenuState, visible: false };
1961
+ }
1962
+ handleContextMenu(e, type, target) {
1963
+ if (!this.contextMenu)
1964
+ return;
1965
+ e.preventDefault();
1966
+ e.stopPropagation();
1967
+ // Calculate position
1968
+ const x = e.clientX;
1969
+ const y = e.clientY;
1970
+ this.contextMenuState = {
1971
+ visible: true,
1972
+ x,
1973
+ y,
1974
+ type,
1975
+ target
1976
+ };
1977
+ }
1978
+ setupResizeObserver() {
1979
+ this.resizeObserver = new ResizeObserver((entries) => {
1980
+ this.el.shadowRoot?.host.dispatchEvent(new CustomEvent('tableResize'));
1981
+ // Update mobile view state
1982
+ for (const entry of entries) {
1983
+ this.isMobileView = entry.contentRect.width < 768;
1984
+ }
1985
+ });
1986
+ this.resizeObserver.observe(this.el);
1987
+ }
1988
+ setupLazyLoadObserver(element) {
1989
+ if (!element || !this.lazyLoad)
1990
+ return;
1991
+ // Disconnect existing observer if any
1992
+ if (this.lazyLoadObserver) {
1993
+ this.lazyLoadObserver.disconnect();
1994
+ }
1995
+ // Create new IntersectionObserver
1996
+ this.lazyLoadObserver = new IntersectionObserver((entries) => {
1997
+ entries.forEach(entry => {
1998
+ if (entry.isIntersecting && !this.loading) {
1999
+ // Emit event to load more data
2000
+ const currentCount = this.parseData().length;
2001
+ this.lazyLoadMore.emit({ currentCount });
2002
+ }
2003
+ });
2004
+ }, {
2005
+ root: null, // viewport
2006
+ rootMargin: '100px', // trigger 100px before reaching sentinel
2007
+ threshold: 0.1
2008
+ });
2009
+ this.lazyLoadObserver.observe(element);
2010
+ }
2011
+ announceToScreenReader(message) {
2012
+ if (!this.enhancedAccessibility)
2013
+ return;
2014
+ // Create or get ARIA live region
2015
+ let liveRegion = this.el.shadowRoot?.querySelector('.sr-announcer');
2016
+ if (!liveRegion) {
2017
+ liveRegion = document.createElement('div');
2018
+ liveRegion.className = 'sr-announcer';
2019
+ liveRegion.setAttribute('aria-live', 'polite');
2020
+ liveRegion.setAttribute('aria-atomic', 'true');
2021
+ liveRegion.setAttribute('role', 'status');
2022
+ this.el.shadowRoot?.appendChild(liveRegion);
2023
+ }
2024
+ // Clear and set message
2025
+ liveRegion.textContent = '';
2026
+ setTimeout(() => {
2027
+ liveRegion.textContent = message;
2028
+ }, 100);
2029
+ }
2030
+ // ========== AGGREGATION LOGIC ==========
2031
+ calculateAggregations(data) {
2032
+ const results = {};
2033
+ this.getVisibleColumns().forEach(col => {
2034
+ if (col.aggregation && col.aggregation.length > 0) {
2035
+ results[col.id] = {};
2036
+ col.aggregation.forEach(type => {
2037
+ const values = data.map(row => row[col.field]).filter(v => v !== null && v !== undefined && v !== '');
2038
+ switch (type) {
2039
+ case 'sum':
2040
+ results[col.id]['sum'] = values.reduce((a, b) => Number(a) + Number(b), 0);
2041
+ break;
2042
+ case 'avg':
2043
+ const sum = values.reduce((a, b) => Number(a) + Number(b), 0);
2044
+ results[col.id]['avg'] = values.length > 0 ? sum / values.length : 0;
2045
+ break;
2046
+ case 'min':
2047
+ if (col.type === 'date' || (col.id && col.id.toLowerCase().includes('date'))) {
2048
+ values.sort();
2049
+ results[col.id]['min'] = values[0];
2050
+ }
2051
+ else {
2052
+ results[col.id]['min'] = Math.min(...values.map(v => Number(v)));
2053
+ }
2054
+ break;
2055
+ case 'max':
2056
+ if (col.type === 'date' || (col.id && col.id.toLowerCase().includes('date'))) {
2057
+ values.sort();
2058
+ results[col.id]['max'] = values[values.length - 1];
2059
+ }
2060
+ else {
2061
+ results[col.id]['max'] = Math.max(...values.map(v => Number(v)));
2062
+ }
2063
+ break;
2064
+ case 'count':
2065
+ results[col.id]['count'] = values.length;
2066
+ break;
2067
+ }
2068
+ });
2069
+ }
2070
+ });
2071
+ return results;
2072
+ }
2073
+ renderAggregationFooter() {
2074
+ const data = this.getProcessedData();
2075
+ const aggregations = this.calculateAggregations(data);
2076
+ const hasAggregations = Object.keys(aggregations).length > 0;
2077
+ if (!hasAggregations)
2078
+ return null;
2079
+ return (index.h("tfoot", { class: "data-table-footer" }, index.h("tr", null, (this.selectable || this.multiSelect) && index.h("td", null), this.rowDetails && index.h("td", null), this.getVisibleColumns().map(col => {
2080
+ const agg = aggregations[col.id];
2081
+ const isPinnedLeft = this.pinnedColumns.left.includes(col.id);
2082
+ const isPinnedRight = this.pinnedColumns.right.includes(col.id);
2083
+ return (index.h("td", { class: {
2084
+ 'pinned-left': isPinnedLeft,
2085
+ 'pinned-right': isPinnedRight
2086
+ }, style: {
2087
+ position: (isPinnedLeft || isPinnedRight) ? 'sticky' : undefined,
2088
+ left: isPinnedLeft ? this.getPinnedOffset(col.id, 'left') : undefined,
2089
+ right: isPinnedRight ? this.getPinnedOffset(col.id, 'right') : undefined,
2090
+ zIndex: (isPinnedLeft || isPinnedRight) ? '3' : undefined,
2091
+ textAlign: col.align || 'left'
2092
+ } }, agg && Object.entries(agg).map(([key, value]) => (index.h("div", { class: "agg-item" }, index.h("span", { class: "agg-label" }, key, ":"), index.h("span", { class: "agg-value" }, col.format && typeof value === 'number' ? col.format(value) : value))))));
2093
+ }))));
2094
+ }
2095
+ renderSkeletonRows(columns) {
2096
+ return Array.from({ length: this.skeletonRows }, (_, rowIndex) => (index.h("tr", { key: `skeleton-${rowIndex}`, class: "skeleton-row" }, this.selectable && (index.h("td", { class: "skeleton-cell" }, index.h("ui-skeleton", { shape: "square", size: "sm", width: "16px", height: "16px" }))), columns.map(col => (index.h("td", { key: `skeleton-${rowIndex}-${col.id}`, class: "skeleton-cell" }, index.h("ui-skeleton", { shape: "text", animationType: "wave", width: `${30 + Math.random() * 40}%` })))))));
2097
+ }
2098
+ getPinnedOffset(columnId, side) {
2099
+ const visibleColumns = this.getVisibleColumns();
2100
+ const isPinned = (col) => side === 'left' ? this.pinnedColumns.left.includes(col.id) : this.pinnedColumns.right.includes(col.id);
2101
+ const pinnedCols = visibleColumns.filter(col => isPinned(col));
2102
+ const index = pinnedCols.findIndex(col => col.id === columnId);
2103
+ if (index <= 0)
2104
+ return '0px';
2105
+ let offset = 0;
2106
+ for (let i = 0; i < index; i++) {
2107
+ const colId = pinnedCols[i].id;
2108
+ const width = this.state.columnWidths.get(colId) || 150; // Default width assumption
2109
+ offset += width;
2110
+ }
2111
+ return `${offset}px`;
2112
+ }
2113
+ renderColumnHeader(column, rowSpan = 1) {
2114
+ if (column.children && column.children.length > 0) {
2115
+ return (index.h("th", { class: "column-group", colSpan: this.getLeafColumnCount(column), style: { textAlign: column.align || 'left' } }, index.h("div", { class: "column-header-content" }, index.h("span", null, column.label))));
2116
+ }
2117
+ const isSorted = this.state.sortConfig.field === column.field;
2118
+ const sortDirection = isSorted ? this.state.sortConfig.direction : null;
2119
+ const columnWidth = this.state.columnWidths.get(column.id);
2120
+ return (index.h("th", { rowSpan: rowSpan > 1 ? rowSpan : undefined, class: {
2121
+ 'sortable': this.sortable && column.sortable !== false,
2122
+ 'sorted': isSorted,
2123
+ 'sticky-column': column.sticky || this.pinnedColumns.left.includes(column.id) || this.pinnedColumns.right.includes(column.id),
2124
+ 'resizing': this.resizingColumn === column.id,
2125
+ 'pinned-left': this.pinnedColumns.left.includes(column.id),
2126
+ 'pinned-right': this.pinnedColumns.right.includes(column.id),
2127
+ }, style: {
2128
+ width: columnWidth ? `${columnWidth}px` : (column.width || 'auto'),
2129
+ minWidth: column.minWidth,
2130
+ textAlign: column.align || 'left',
2131
+ position: (column.sticky || this.pinnedColumns.left.includes(column.id) || this.pinnedColumns.right.includes(column.id)) ? 'sticky' : 'relative',
2132
+ left: this.pinnedColumns.left.includes(column.id) ? this.getPinnedOffset(column.id, 'left') : undefined,
2133
+ right: this.pinnedColumns.right.includes(column.id) ? this.getPinnedOffset(column.id, 'right') : undefined,
2134
+ zIndex: (column.sticky || this.pinnedColumns.left.includes(column.id) || this.pinnedColumns.right.includes(column.id)) ? '30' : undefined
2135
+ } }, index.h("div", { class: "column-header-content" }, this.columnReorder && (index.h("span", { class: "drag-handle", draggable: true, onDragStart: (e) => this.handleColumnDragStart(column.id, e), onDragOver: (e) => this.handleColumnDragOver(e), onDrop: (e) => this.handleColumnDrop(column.id, e), title: "Drag to reorder" }, index.h("ui-icon", { name: "grip-vertical", library: "lucide", size: "1.2em" }))), index.h("span", { class: "column-label", onClick: (e) => column.sortable !== false && this.handleMultiSort(column.field || column.id, e) }, (this.pinnedColumns.left.includes(column.id) || this.pinnedColumns.right.includes(column.id)) && (index.h("ui-icon", { name: "pin", library: "lucide", size: "14px", class: "pin-indicator" })), column.label), this.sortable && column.sortable !== false && (() => {
2136
+ // Multi-sort indicator
2137
+ if (this.multiSort) {
2138
+ const sortIndex = this.multiSortConfig.findIndex(s => s.field === (column.field || column.id));
2139
+ if (sortIndex >= 0) {
2140
+ const sort = this.multiSortConfig[sortIndex];
2141
+ return (index.h("span", { class: "sort-icon multi-sort" }, index.h("ui-icon", { name: sort.direction === 'asc' ? 'arrow-up' : 'arrow-down', library: "lucide", size: "14px" }), index.h("span", { class: "sort-order-badge" }, sortIndex + 1)));
2142
+ }
2143
+ return index.h("ui-icon", { name: "arrow-up-down", library: "lucide", size: "14px", class: "sort-icon" });
2144
+ }
2145
+ // Single sort indicator
2146
+ return (index.h("span", { class: "sort-icon" }, !isSorted && index.h("ui-icon", { name: "arrow-up-down", library: "lucide", size: "14px" }), isSorted && index.h("ui-icon", { name: sortDirection === 'asc' ? 'arrow-up' : 'arrow-down', library: "lucide", size: "14px" })));
2147
+ })(), index.h("ui-button", { variant: "ghost", class: "header-menu-trigger", onClick: (e) => this.handleHeaderContextMenu(e, column), ariaLabel: "Column options", icon: "more-vertical", iconLibrary: "lucide", iconOnly: true, size: "sm" })), this.filterable && column.filterable !== false && (index.h("div", { class: "column-filter" }, index.h("ui-input", { type: "text", placeholder: `Filter ${column.label}...`, value: this.state.filterConfig[column.field || column.id] || '', onInputChange: (e) => this.handleFilter(column.field || column.id, e.detail), onClick: (e) => e.stopPropagation(), size: "sm", variant: "outlined" }))), index.h("div", { class: "resize-handle", onMouseDown: (e) => this.handleResizeStart(column.id, e), onClick: (e) => e.stopPropagation() })));
2148
+ }
2149
+ renderTableHeaders() {
2150
+ const columns = this.parseColumns();
2151
+ const hasMultiLevel = columns.some(col => col.children && col.children.length > 0);
2152
+ if (!hasMultiLevel) {
2153
+ return (index.h("tr", null, this.selectable && (index.h("th", { class: "select-column" }, this.multiSelect && (index.h("ui-checkbox", { checked: this.state.selectedRows.size === this.getProcessedData().length, onCheckboxChange: (e) => this.handleSelectAll(e), ariaLabel: "Select all rows", size: "sm" })))), this.getVisibleColumns().map(col => this.renderColumnHeader(col)), this.showActions && (index.h("th", { class: "actions-column" }, "Actions")), this.rowDetails && (index.h("th", { class: "row-details-column" }, "Details"))));
2154
+ }
2155
+ // Multi-level headers
2156
+ const headerRows = [];
2157
+ const maxDepth = this.getMaxColumnDepth(columns);
2158
+ for (let depth = 0; depth < maxDepth; depth++) {
2159
+ headerRows.push(index.h("tr", null, depth === 0 && this.selectable && (index.h("th", { class: "select-column", rowSpan: maxDepth }, this.multiSelect && (index.h("ui-checkbox", { checked: this.state.selectedRows.size === this.getProcessedData().length, onCheckboxChange: (e) => this.handleSelectAll(e), ariaLabel: "Select all rows", size: "sm" })))), this.renderHeaderLevel(columns, depth, 0, maxDepth), depth === 0 && this.showActions && (index.h("th", { class: "actions-column", rowSpan: maxDepth }, "Actions")), depth === 0 && this.rowDetails && (index.h("th", { class: "row-details-column", rowSpan: maxDepth }, "Details"))));
2160
+ }
2161
+ return headerRows;
2162
+ }
2163
+ getMaxColumnDepth(columns) {
2164
+ let maxDepth = 1;
2165
+ const checkDepth = (cols, currentDepth) => {
2166
+ cols.forEach(col => {
2167
+ if (col.children && col.children.length > 0) {
2168
+ maxDepth = Math.max(maxDepth, currentDepth + 1);
2169
+ checkDepth(col.children, currentDepth + 1);
2170
+ }
2171
+ });
2172
+ };
2173
+ checkDepth(columns, 1);
2174
+ return maxDepth;
2175
+ }
2176
+ renderHeaderLevel(columns, targetDepth, currentDepth = 0, maxDepth = 1) {
2177
+ const result = [];
2178
+ columns.forEach(col => {
2179
+ const isGroup = col.children && col.children.length > 0;
2180
+ const isVisible = isGroup ? this.getLeafColumnCount(col) > 0 : this.state.visibleColumns.has(col.id);
2181
+ if (!isVisible)
2182
+ return;
2183
+ if (currentDepth === targetDepth) {
2184
+ const rowSpan = isGroup ? 1 : maxDepth - currentDepth;
2185
+ result.push(this.renderColumnHeader(col, rowSpan));
2186
+ }
2187
+ else if (isGroup) {
2188
+ result.push(...this.renderHeaderLevel(col.children, targetDepth, currentDepth + 1, maxDepth));
2189
+ }
2190
+ });
2191
+ return result;
2192
+ }
2193
+ renderCell(row, column) {
2194
+ const isEditing = this.state.editingCell?.rowId === row.id &&
2195
+ this.state.editingCell?.field === column.field;
2196
+ const value = column.field ? row[column.field] : '';
2197
+ // Determine content based on mode
2198
+ let content;
2199
+ if (this.editable && column.editable !== false) {
2200
+ // Use advanced cell editors if enabled
2201
+ content = this.advancedCellEditors
2202
+ ? this.renderAdvancedCellEditor(row, column, value)
2203
+ : this.renderEditableCell(row, column, value);
2204
+ }
2205
+ else if (isEditing && column.editable !== false) {
2206
+ content = this.advancedCellEditors
2207
+ ? this.renderAdvancedCellEditor(row, column, value)
2208
+ : this.renderEditableCell(row, column, value);
2209
+ }
2210
+ else {
2211
+ // Use column formatting for display
2212
+ const formattedValue = this.columnFormatting
2213
+ ? this.formatCellValue(value, column)
2214
+ : this.renderDisplayCell(row, column, value);
2215
+ content = formattedValue;
2216
+ }
2217
+ // Handle Tree Data Indentation for the first visible column
2218
+ const visibleCols = this.getVisibleColumns();
2219
+ const isFirstColumn = visibleCols.length > 0 && visibleCols[0].id === column.id;
2220
+ if (this.treeData && isFirstColumn) {
2221
+ const depth = row._depth || 0;
2222
+ const hasChildren = row._hasChildren;
2223
+ const isExpanded = this.state.expandedRows.has(row.id);
2224
+ const indentation = depth * 24; // 24px per level
2225
+ return (index.h("div", { class: "cell-content-wrapper", style: { display: 'flex', alignItems: 'center' } }, index.h("span", { style: { paddingLeft: `${indentation}px` } }), hasChildren ? (index.h("span", { class: "tree-toggle-icon", onClick: (e) => this.toggleRowExpansion(row.id, e), style: {
2226
+ cursor: 'pointer',
2227
+ marginRight: '8px',
2228
+ display: 'inline-block',
2229
+ width: '16px',
2230
+ textAlign: 'center',
2231
+ userSelect: 'none'
2232
+ } }, index.h("ui-icon", { name: isExpanded ? 'chevron-down' : 'chevron-right', library: "lucide", size: "14px" }))) : (index.h("span", { style: { display: 'inline-block', width: '24px' } }) // Spacer for alignment
2233
+ ), index.h("div", { class: "cell-inner-content", style: { flex: '1' } }, content)));
2234
+ }
2235
+ // Handle Column Reorder alignment spacer for standard cells
2236
+ if (this.columnReorder && (!column.align || column.align === 'left')) {
2237
+ return (index.h("div", { class: "cell-content-wrapper", style: { display: 'flex', alignItems: 'center' } }, index.h("span", { class: "drag-handle-spacer", style: { width: '22px', flexShrink: '0' } }), index.h("div", { class: "cell-inner-content", style: { flex: '1' } }, content)));
2238
+ }
2239
+ return content;
2240
+ }
2241
+ getLeafColumnCount(column) {
2242
+ if (!column.children || column.children.length === 0)
2243
+ return 1;
2244
+ let count = 0;
2245
+ column.children.forEach(child => {
2246
+ if (child.children && child.children.length > 0) {
2247
+ count += this.getLeafColumnCount(child);
2248
+ }
2249
+ else if (this.state.visibleColumns.has(child.id)) {
2250
+ count += 1;
2251
+ }
2252
+ });
2253
+ return count;
2254
+ }
2255
+ renderEditableCell(row, column, value) {
2256
+ // Only clear editing state on blur if table is not in global editable mode
2257
+ const handleBlur = () => {
2258
+ if (!this.editable) {
2259
+ this.state = { ...this.state, editingCell: null };
2260
+ }
2261
+ };
2262
+ const handleKeyDown = (e, inputEl) => {
2263
+ if (e.key === 'Enter') {
2264
+ this.handleCellEdit(row.id, column.field, inputEl.value);
2265
+ }
2266
+ else if (e.key === 'Escape') {
2267
+ if (!this.editable) {
2268
+ handleBlur();
2269
+ }
2270
+ }
2271
+ };
2272
+ switch (column.type) {
2273
+ case 'select':
2274
+ return (index.h("select", { ref: (el) => {
2275
+ if (el) {
2276
+ this.editInputRef = el;
2277
+ el.value = value;
2278
+ }
2279
+ }, onChange: (e) => this.handleCellEdit(row.id, column.field, e.target.value), onBlur: handleBlur, class: "cell-select" }, column.selectOptions?.map(opt => (index.h("option", { value: opt.value, selected: opt.value === value }, opt.label)))));
2280
+ case 'radio':
2281
+ return (index.h("div", { class: "cell-radio-group" }, column.radioOptions?.map(opt => (index.h("label", { class: "radio-label" }, index.h("ui-radio", { name: `${row.id}-${column.field}`, value: opt.value, checked: opt.value === value, onRadioChange: (e) => this.handleCellEdit(row.id, column.field, e.detail.value), label: opt.label, size: "sm" }))))));
2282
+ case 'checkbox':
2283
+ return (index.h("ui-checkbox", { ref: (el) => (this.editInputRef = el), checked: value === true || value === 'true', onCheckboxChange: (e) => this.handleCellEdit(row.id, column.field, e.detail.checked), onCheckboxBlur: handleBlur, size: "sm" }));
2284
+ case 'switch':
2285
+ return (index.h("ui-switch", { checked: value === true || value === 'true', onSwitchChange: (e) => this.handleCellEdit(row.id, column.field, e.detail.checked), size: "sm" }));
2286
+ case 'rating':
2287
+ const maxRating = column.maxRating || 5;
2288
+ const currentRating = Number(value) || 0;
2289
+ return (index.h("div", { class: "cell-rating" }, Array.from({ length: maxRating }, (_, i) => i + 1).map(star => (index.h("span", { class: { 'star': true, 'filled': star <= currentRating }, onClick: () => this.handleCellEdit(row.id, column.field, star) }, index.h("ui-icon", { name: "star", library: "lucide", size: "1.2em", color: star <= currentRating ? '#ffc107' : '#bdbdbd' }))))));
2290
+ case 'date':
2291
+ case 'time':
2292
+ case 'datetime':
2293
+ case 'password':
2294
+ case 'email':
2295
+ return (index.h("ui-input", { ref: (el) => (this.editInputRef = el), type: column.type === 'datetime' ? 'datetime-local' : column.type, value: value, onInputChange: (e) => this.handleCellEdit(row.id, column.field, e.detail), onInputBlur: handleBlur, onInputKeydown: (e) => handleKeyDown(e.detail, e.target), customClass: "cell-input", variant: "plain", size: "sm" }));
2296
+ case 'url':
2297
+ return (index.h("ui-input", { ref: (el) => (this.editInputRef = el), type: column.type === 'number' ? 'number' : column.type === 'tel' ? 'tel' : column.type === 'url' ? 'url' : 'text', value: value, onInputChange: (e) => this.handleCellEdit(row.id, column.field, e.detail), onInputBlur: handleBlur, onInputKeydown: (e) => handleKeyDown(e.detail, e.target), customClass: "cell-input", variant: "plain", size: "sm" }));
2298
+ }
2299
+ }
2300
+ renderDisplayCell(row, column, value) {
2301
+ // Handle custom render function
2302
+ if (column.render) {
2303
+ return (index.h("span", { class: { 'editable-cell': this.editable && column.editable !== false }, onDblClick: () => this.editable && column.editable !== false && this.startCellEdit(row.id, column.field) }, column.render(value, row, 0)));
2304
+ }
2305
+ // Handle Sparklines (Phase 2)
2306
+ if (this.enableSparklines && Array.isArray(value) && value.length > 0 && typeof value[0] === 'number') {
2307
+ return this.renderSparkline(value);
2308
+ }
2309
+ // Handle different display types
2310
+ let displayContent;
2311
+ switch (column.type) {
2312
+ case 'checkbox':
2313
+ case 'boolean':
2314
+ displayContent = (index.h("span", { class: "cell-boolean" }, index.h("ui-icon", { name: value ? 'check' : 'x', library: "lucide", size: "1.2em", color: value ? '#4caf50' : '#f44336' })));
2315
+ break;
2316
+ case 'switch':
2317
+ displayContent = index.h("ui-switch", { checked: !!value, readonly: true, size: "sm" });
2318
+ break;
2319
+ case 'rating':
2320
+ displayContent = index.h("ui-rating", { value: Number(value) || 0, max: column.maxRating || 5, readonly: true, size: "sm" });
2321
+ break;
2322
+ case 'image':
2323
+ const imageStyle = column.imageStyle || {};
2324
+ displayContent = value ? (index.h("img", { src: value, alt: "Cell image", class: "cell-image", style: {
2325
+ width: imageStyle.width || '40px',
2326
+ height: imageStyle.height || '40px',
2327
+ borderRadius: imageStyle.borderRadius || '4px',
2328
+ } })) : null;
2329
+ break;
2330
+ case 'password':
2331
+ displayContent = index.h("span", { class: "cell-password" }, '•'.repeat(value?.length || 8));
2332
+ break;
2333
+ case 'date':
2334
+ displayContent = value ? new Date(value).toLocaleDateString() : '';
2335
+ break;
2336
+ case 'datetime':
2337
+ displayContent = value ? new Date(value).toLocaleString() : '';
2338
+ break;
2339
+ case 'time':
2340
+ displayContent = value;
2341
+ break;
2342
+ case 'email':
2343
+ displayContent = index.h("a", { href: `mailto:${value}`, class: "cell-link" }, value);
2344
+ break;
2345
+ case 'url':
2346
+ displayContent = index.h("a", { href: value, target: "_blank", rel: "noopener noreferrer", class: "cell-link" }, value);
2347
+ break;
2348
+ case 'tel':
2349
+ displayContent = index.h("a", { href: `tel:${value}`, class: "cell-link" }, value);
2350
+ break;
2351
+ default:
2352
+ displayContent = column.format ? column.format(value) : value;
2353
+ }
2354
+ return (index.h("span", { class: { 'editable-cell': this.editable && column.editable !== false }, onDblClick: () => this.editable && column.editable !== false && this.startCellEdit(row.id, column.field) }, displayContent));
2355
+ }
2356
+ /**
2357
+ * Render row actions menu (3-dot menu)
2358
+ */
2359
+ renderRowActions(row) {
2360
+ const isOpen = this.activeActionMenu === row.id;
2361
+ const defaultActions = [
2362
+ { label: 'Edit', value: 'edit', icon: '✏️' },
2363
+ { label: 'Delete', value: 'delete', icon: '🗑️' },
2364
+ ];
2365
+ const actions = this.customActions || defaultActions;
2366
+ return (index.h("div", { class: "row-actions-container" }, index.h("ui-button", { variant: "ghost", class: "row-actions-trigger", onClick: (e) => {
2367
+ e.stopPropagation();
2368
+ this.activeActionMenu = isOpen ? null : row.id;
2369
+ }, ariaLabel: "Row actions", icon: "more-vertical", iconLibrary: "lucide", iconOnly: true, size: "sm" }), isOpen && (index.h("div", { class: "row-actions-menu" }, actions.map(action => (index.h("ui-button", { key: action.value, variant: "ghost", class: "row-action-item", onClick: (e) => {
2370
+ e.stopPropagation();
2371
+ this.handleRowAction(row, action.value);
2372
+ }, icon: action.icon, iconLibrary: action.iconLibrary || this.iconLibrary, label: action.label, size: "sm", block: true, align: "start" })))))));
2373
+ }
2374
+ /**
2375
+ * Handle row action
2376
+ */
2377
+ handleRowAction(row, action) {
2378
+ this.activeActionMenu = null; // Close menu
2379
+ if (action === 'edit') {
2380
+ this.rowEdit.emit({ row });
2381
+ }
2382
+ else if (action === 'delete') {
2383
+ this.rowDelete.emit({ row });
2384
+ }
2385
+ else {
2386
+ this.rowAction.emit({ row, action });
2387
+ }
2388
+ }
2389
+ renderGroupedRows(data, columns) {
2390
+ const groups = this.groupData(data, this.state.groupBy);
2391
+ const rows = [];
2392
+ groups.forEach((groupRows, groupKey) => {
2393
+ const isExpanded = this.state.expandedGroups.has(groupKey);
2394
+ const groupCount = groupRows.length;
2395
+ // Render group header row
2396
+ rows.push(index.h("tr", { class: "group-header-row", key: `group-${groupKey}`, role: "row", "aria-expanded": isExpanded }, index.h("td", { colSpan: columns.length + (this.selectable ? 1 : 0) + (this.showActions ? 1 : 0), class: "group-header-cell", onClick: () => this.handleGroupToggle(groupKey), role: "button", tabIndex: 0, onKeyDown: (e) => {
2397
+ if (e.key === 'Enter' || e.key === ' ') {
2398
+ e.preventDefault();
2399
+ this.handleGroupToggle(groupKey);
2400
+ }
2401
+ }, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} group ${groupKey}` }, index.h("div", { class: "group-header-content" }, index.h("span", { class: "group-expand-icon" }, index.h("ui-icon", { name: isExpanded ? 'chevron-down' : 'chevron-right', library: "lucide", size: "14px" })), index.h("span", { class: "group-label" }, groupKey), this.showGroupCount && (index.h("span", { class: "group-count" }, "(", groupCount, " ", groupCount === 1 ? 'item' : 'items', ")"))))));
2402
+ // Only render group rows when expanded - rows are completely hidden when collapsed
2403
+ if (isExpanded) {
2404
+ groupRows.forEach((row, rowIndex) => {
2405
+ rows.push(index.h("tr", { class: {
2406
+ 'group-data-row': true,
2407
+ 'selected': this.state.selectedRows.has(row.id),
2408
+ }, key: row.id, role: "row", "data-group": groupKey, "aria-label": `Row ${rowIndex + 1} in group ${groupKey}` }, this.selectable && (index.h("td", { class: "select-column", role: "cell" }, index.h("ui-checkbox", { checked: this.state.selectedRows.has(row.id), onCheckboxChange: (e) => this.handleRowSelect(row.id, e.detail), ariaLabel: `Select row ${rowIndex + 1}`, size: "sm" }))), columns.map(col => (index.h("td", { key: col.id, class: {
2409
+ 'sticky-column': !!col.sticky,
2410
+ 'focused-cell': this.state.focusedCell?.rowId === row.id && this.state.focusedCell?.field === col.field,
2411
+ 'pinned-left': this.pinnedColumns.left.includes(col.id),
2412
+ 'pinned-right': this.pinnedColumns.right.includes(col.id)
2413
+ }, style: { textAlign: col.align || 'left' }, role: "cell", "data-row-id": row.id, "data-field": col.field, tabIndex: 0, onFocus: () => this.setFocusedCell(row.id, col.field) }, this.renderCell(row, col)))), this.showActions && (index.h("td", { class: "actions-column", role: "cell" }, this.renderRowActions(row))), this.rowDetails && (index.h("td", { class: "row-details-toggle-cell", role: "cell" }, index.h("ui-button", { variant: "ghost", size: "sm", onClick: () => this.toggleRowDetails(row.id), ariaLabel: "Toggle row details", icon: this.expandedRowDetails.has(row.id) ? 'chevron-down' : 'chevron-right', iconLibrary: "lucide", iconOnly: true, iconSize: "1.2em" })))));
2414
+ if (this.rowDetails && this.expandedRowDetails.has(row.id)) {
2415
+ rows.push(this.renderRowDetailsPanel(row));
2416
+ }
2417
+ });
2418
+ }
2419
+ });
2420
+ return rows;
2421
+ }
2422
+ // ========== PREMIUM UI RENDER METHODS ==========
2423
+ renderRowDetailsPanel(row) {
2424
+ if (!this.rowDetails || !this.expandedRowDetails.has(row.id))
2425
+ return null;
2426
+ const columns = this.getVisibleColumns();
2427
+ const colSpan = columns.length +
2428
+ (this.selectable ? 1 : 0) +
2429
+ (this.rowReorder ? 1 : 0) +
2430
+ (this.showActions ? 1 : 0);
2431
+ return (index.h("tr", { key: `${row.id}-details`, class: "row-details-row" }, index.h("td", { colSpan: colSpan }, index.h("div", { class: "row-details-panel" }, index.h("div", { class: "details-header" }, index.h("h4", null, "Row Details"), index.h("ui-button", { variant: "ghost", onClick: () => this.toggleRowDetails(row.id), icon: "x", iconLibrary: "lucide", iconOnly: true, size: "sm" })), index.h("div", { class: "details-content" }, Object.entries(row).map(([key, value]) => (index.h("div", { key: key, class: "detail-item" }, index.h("strong", { class: "detail-label" }, key, ":"), index.h("span", { class: "detail-value" }, String(value))))))))));
2432
+ }
2433
+ renderKeyboardShortcutsModal() {
2434
+ if (!this.showKeyboardShortcutsHelp)
2435
+ return null;
2436
+ return (index.h("div", { class: "keyboard-shortcuts-modal", onClick: () => this.showKeyboardShortcutsHelp = false }, index.h("div", { class: "modal-content", onClick: (e) => e.stopPropagation() }, index.h("div", { class: "modal-header" }, index.h("h3", null, "Keyboard Shortcuts"), index.h("ui-button", { variant: "ghost", icon: "x", iconLibrary: "lucide", iconOnly: true, size: "sm", onClick: () => this.showKeyboardShortcutsHelp = false })), index.h("div", { class: "modal-body" }, index.h("table", { class: "shortcuts-table" }, index.h("tbody", null, index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Ctrl + F"), index.h("td", { class: "shortcut-desc" }, "Focus search")), index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Ctrl + A"), index.h("td", { class: "shortcut-desc" }, "Select all rows")), index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Ctrl + E"), index.h("td", { class: "shortcut-desc" }, "Export data")), index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Ctrl + Click"), index.h("td", { class: "shortcut-desc" }, "Multi-column sort")), index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Shift + ?"), index.h("td", { class: "shortcut-desc" }, "Show this help")), index.h("tr", null, index.h("td", { class: "shortcut-key" }, "Arrow Keys"), index.h("td", { class: "shortcut-desc" }, "Navigate cells"))))))));
2437
+ }
2438
+ // ========== PHASE 2 RENDER METHODS ==========
2439
+ renderSparkline(data) {
2440
+ if (data.length < 2)
2441
+ return data.join(', ');
2442
+ const width = 100;
2443
+ const height = 20;
2444
+ const min = Math.min(...data);
2445
+ const max = Math.max(...data);
2446
+ const range = max - min || 1;
2447
+ const points = data.map((val, i) => {
2448
+ const x = (i / (data.length - 1)) * width;
2449
+ const y = height - ((val - min) / range) * height;
2450
+ return `${x},${y}`;
2451
+ }).join(' ');
2452
+ return (index.h("svg", { width: width, height: height, class: "sparkline", style: { display: 'block' } }, index.h("polyline", { points: points, fill: "none", stroke: "currentColor", "stroke-width": "1.5" })));
2453
+ }
2454
+ renderContextMenu() {
2455
+ if (!this.contextMenuState.visible)
2456
+ return null;
2457
+ const { x, y, type, target } = this.contextMenuState;
2458
+ const style = { top: `${y}px`, left: `${x}px`, position: 'fixed', zIndex: '1000' };
2459
+ if (type === 'header') {
2460
+ const col = target;
2461
+ const isPinnedLeft = this.pinnedColumns.left.includes(col.id);
2462
+ const isPinnedRight = this.pinnedColumns.right.includes(col.id);
2463
+ return (index.h("div", { class: "context-menu header-context-menu", style: style }, index.h("div", { class: "context-menu-header" }, col.label, " Options"), index.h("ul", null, index.h("li", { onClick: () => this.handleSort(col.field || col.id) }, this.state.sortConfig.field === (col.field || col.id) && this.state.sortConfig.direction === 'asc' ? index.h("span", null, index.h("ui-icon", { name: "check", library: "lucide", size: "1.2em" }), " Sort Decending") : 'Sort Ascending'), index.h("li", { class: "divider" }), index.h("li", { class: "has-submenu" }, "Pin Column", index.h("ul", { class: "submenu" }, index.h("li", { onClick: () => this.toggleColumnPin(col.id, 'left') }, isPinnedLeft && index.h("ui-icon", { name: "check", library: "lucide", size: "1.2em" }), "Pin to Left"), index.h("li", { onClick: () => this.toggleColumnPin(col.id, 'right') }, isPinnedRight && index.h("ui-icon", { name: "check", library: "lucide", size: "1.2em" }), "Pin to Right"), index.h("li", { onClick: () => this.toggleColumnPin(col.id, 'none') }, !isPinnedLeft && !isPinnedRight && index.h("ui-icon", { name: "check", library: "lucide", size: "1.2em" }), "No Pin"))), index.h("li", { onClick: () => this.toggleColumnVisibility(col.id) }, "Hide Column"), index.h("li", { class: "divider" }), index.h("li", { onClick: () => { this.handleFilter(col.field || col.id, ''); this.contextMenuState = { ...this.contextMenuState, visible: false }; } }, "Clear Column Filter"))));
2464
+ }
2465
+ return (index.h("div", { class: "context-menu", style: style }, index.h("ul", null, index.h("li", { onClick: () => this.handleContextAction('copy') }, "Copy"), type === 'row' && index.h("li", { onClick: () => this.handleContextAction('delete') }, "Delete Row"), type === 'cell' && index.h("li", { onClick: () => this.handleContextAction('edit') }, "Edit Cell"), index.h("li", { class: "divider" }), index.h("li", { onClick: () => this.handleContextAction('export') }, "Export Row"))));
2466
+ }
2467
+ handleContextAction(action) {
2468
+ const { target, type } = this.contextMenuState;
2469
+ if (action === 'copy') {
2470
+ let text = '';
2471
+ if (type === 'cell') {
2472
+ text = String(target.value || '');
2473
+ }
2474
+ else if (type === 'row') {
2475
+ text = JSON.stringify(target);
2476
+ }
2477
+ if (text) {
2478
+ navigator.clipboard.writeText(text).catch(err => console.error('Copy failed', err));
2479
+ }
2480
+ }
2481
+ else if (action === 'edit' && type === 'cell') {
2482
+ this.startCellEdit(target.rowId, target.field);
2483
+ }
2484
+ this.contextMenuState = { ...this.contextMenuState, visible: false };
2485
+ }
2486
+ renderMobileCards(data) {
2487
+ const columns = this.getVisibleColumns();
2488
+ return (index.h("div", { class: "mobile-cards-view" }, data.map(row => (index.h("div", { class: "mobile-card", key: row.id }, index.h("div", { class: "card-header" }, this.selectable && (index.h("ui-checkbox", { checked: this.state.selectedRows.has(row.id), onCheckboxChange: (e) => this.handleRowSelect(row.id, e.detail), size: "sm" })), index.h("span", { class: "card-title" }, "Row #", row.id), this.showActions && index.h("div", { class: "card-actions" }, this.renderRowActions(row))), index.h("div", { class: "card-body" }, columns.map(col => (index.h("div", { class: "card-field", key: col.id }, index.h("label", null, col.label || col.field), index.h("div", { class: "card-value" }, this.renderCell(row, col))))))))), this.renderLazyLoadSentinel()));
2489
+ }
2490
+ renderLazyLoadSentinel() {
2491
+ if (!this.lazyLoad)
2492
+ return null;
2493
+ // Sentinel for IntersectionObserver
2494
+ return (index.h("div", { class: "lazy-load-sentinel", ref: (el) => {
2495
+ if (el)
2496
+ this.setupLazyLoadObserver(el);
2497
+ }, style: { height: '20px', textAlign: 'center', padding: '10px' } }, this.loading ? 'Loading more...' : ''));
2498
+ }
2499
+ renderValidationError(rowId, field) {
2500
+ if (!this.advancedValidation)
2501
+ return null;
2502
+ const rowKey = String(rowId);
2503
+ const error = this.validationErrors.get(rowKey)?.get(field);
2504
+ if (!error)
2505
+ return null;
2506
+ return (index.h("div", { class: "validation-error-tooltip" }, index.h("ui-icon", { name: "alert-triangle", library: "lucide", size: "14px", class: "error-icon", color: "#f44336" }), index.h("span", { class: "error-message" }, error)));
2507
+ }
2508
+ renderPagination() {
2509
+ if (!this.pagination)
2510
+ return null;
2511
+ const { currentPage, pageSize, totalRows } = this.state.pagination;
2512
+ return (index.h("div", { class: "pagination-container" }, index.h("ui-pagination", { "total-items": totalRows, "items-per-page": pageSize, "current-page": currentPage, "show-first-last": true, "show-page-size": true, "show-total": true, "page-size-options": JSON.stringify(this.parsePageSizeOptions()), theme: this.paginationTheme, shape: this.paginationShape, "keyboard-nav": this.paginationKeyboardNav, "quick-jump": this.paginationQuickJump, "quick-jump-step": this.paginationQuickJumpStep, "show-progress": this.paginationShowProgress, sticky: this.paginationSticky, "sticky-position": this.paginationStickyPosition, "page-transition": this.paginationTransitions, "url-sync": this.paginationUrlSync, "url-param": this.paginationUrlParam, "persist-page": this.paginationPersistPage, "storage-key": this.paginationStorageKey, "swipe-gestures": this.paginationSwipeGestures, "smart-compact": this.paginationSmartCompact, "smart-compact-threshold": this.paginationSmartCompactThreshold, "auto-hide": this.paginationAutoHide, "responsive-mode": this.paginationResponsive, "mobile-breakpoint": this.paginationMobileBreakpoint, onPageChange: (e) => this.handlePaginationChange(e), onItemsPerPageChange: (e) => this.handlePageSizeChangeFromPagination(e) })));
2513
+ }
2514
+ renderToolbar() {
2515
+ return (index.h("div", { class: "table-toolbar" }, index.h("div", { class: "toolbar-left" }, this.searchable && (index.h("div", { class: "search-box" }, index.h("ui-input", { type: "text", placeholder: "Search...", value: this.state.searchQuery, onInputChange: (e) => this.handleSearch(e.detail), ariaLabel: "Search table", size: "sm", prefixIcon: "search", variant: "outlined" }))), this.grouping && this.renderGroupingSelector()), index.h("div", { class: "toolbar-right" }, this.filterable && (index.h("ui-button", { variant: "ghost", size: "sm", icon: "filter", iconLibrary: "lucide", iconSize: "1.1em", label: "Filters", ariaLabel: "Filter panel", onClick: () => this.showFilterPanel = !this.showFilterPanel, "data-expanded": this.showFilterPanel })), this.columnVisibility && (index.h("ui-button", { variant: "ghost", size: "sm", icon: "settings", iconLibrary: "lucide", iconSize: "1.1em", label: "Columns", ariaLabel: "Column settings", onClick: () => this.showColumnSettings = !this.showColumnSettings, "data-expanded": this.showColumnSettings })), this.exportable && (index.h("ui-button", { variant: "ghost", size: "sm", icon: "download", iconLibrary: "lucide", iconSize: "1.1em", label: "Export", ariaLabel: "Export data", onClick: () => this.showExportDialog = !this.showExportDialog })), index.h("ui-button", { variant: "ghost", size: "sm", icon: "refresh-cw", iconLibrary: "lucide", iconSize: "1.1em", label: "Refresh", ariaLabel: "Refresh table", onClick: () => this.refresh() }))));
2516
+ }
2517
+ renderGroupingSelector() {
2518
+ const groupableColumns = this.getVisibleColumns().filter(col => col.groupBy !== false);
2519
+ if (groupableColumns.length === 0)
2520
+ return null;
2521
+ return (index.h("div", { class: "grouping-selector" }, index.h("label", { htmlFor: "group-by-select" }, "Group by:"), index.h("select", { id: "group-by-select", onInput: (e) => this.handleGroupByChange(e.target.value), "aria-label": "Group table by column" }, index.h("option", { value: "", selected: !this.state.groupBy }, "None"), groupableColumns.map(col => (index.h("option", { value: col.field || col.id, key: col.id, selected: this.state.groupBy === (col.field || col.id) }, col.label))))));
2522
+ }
2523
+ renderFilterPanel() {
2524
+ if (!this.showFilterPanel)
2525
+ return null;
2526
+ const flatColumns = this.flattenColumns(this.parseColumns());
2527
+ const filterableColumns = flatColumns.filter(col => col.filterable !== false);
2528
+ const getColumnType = (col) => {
2529
+ if (col.type)
2530
+ return col.type;
2531
+ // Auto-detect from field name
2532
+ if (col.field?.includes('date') || col.field?.includes('Date'))
2533
+ return 'date';
2534
+ if (col.field?.includes('price') || col.field?.includes('salary') || col.field?.includes('amount'))
2535
+ return 'number';
2536
+ if (col.field?.includes('email'))
2537
+ return 'email';
2538
+ return 'text';
2539
+ };
2540
+ const getOperatorsForType = (type) => {
2541
+ const commonOps = [
2542
+ { value: 'equals', label: 'Equals' },
2543
+ { value: 'notEquals', label: 'Not Equals' },
2544
+ ];
2545
+ if (type === 'number' || type === 'date') {
2546
+ return [
2547
+ ...commonOps,
2548
+ { value: 'greaterThan', label: 'Greater Than' },
2549
+ { value: 'lessThan', label: 'Less Than' },
2550
+ { value: 'between', label: 'Between' },
2551
+ ];
2552
+ }
2553
+ if (type === 'text' || type === 'email' || type === 'url') {
2554
+ return [
2555
+ ...commonOps,
2556
+ { value: 'contains', label: 'Contains' },
2557
+ { value: 'notContains', label: 'Not Contains' },
2558
+ { value: 'startsWith', label: 'Starts With' },
2559
+ { value: 'endsWith', label: 'Ends With' },
2560
+ ];
2561
+ }
2562
+ return commonOps;
2563
+ };
2564
+ const selectedColumn = filterableColumns.find(col => col.id === this.filterPanelField);
2565
+ const columnType = selectedColumn ? getColumnType(selectedColumn) : 'text';
2566
+ const operators = getOperatorsForType(columnType);
2567
+ return (index.h("div", { class: "filter-panel" }, index.h("div", { class: "filter-panel-header" }, index.h("h4", null, index.h("ui-icon", { name: "filter", library: "lucide", size: "1.1em" }), " Advanced Filters"), index.h("ui-button", { variant: "ghost", size: "sm", icon: "x", iconLibrary: "lucide", iconSize: "1.1em", onClick: () => this.showFilterPanel = false })), index.h("div", { class: "filter-panel-body" }, index.h("div", { class: "filter-builder" }, index.h("div", { class: "filter-row" }, index.h("select", { class: "filter-field-select", onChange: (e) => {
2568
+ this.filterPanelField = e.target.value;
2569
+ this.filterPanelValue = '';
2570
+ } }, index.h("option", { value: "", selected: this.filterPanelField === '' }, "Select Column..."), filterableColumns.map(col => (index.h("option", { value: col.id, selected: this.filterPanelField === col.id }, col.label)))), index.h("select", { class: "filter-operator-select", onChange: (e) => this.filterPanelOperator = e.target.value, disabled: !this.filterPanelField }, operators.map(op => (index.h("option", { value: op.value, selected: this.filterPanelOperator === op.value }, op.label)))), index.h("ui-input", { type: columnType === 'number' ? 'number' : columnType === 'date' ? 'date' : 'text', customClass: "filter-value-input", value: this.filterPanelValue, onInputChange: (e) => this.filterPanelValue = e.detail, placeholder: "Filter value...", disabled: !this.filterPanelField, size: "sm", variant: "outlined" }), index.h("ui-button", { variant: "ghost", size: "sm", icon: "plus", iconLibrary: "lucide", iconSize: "1.2em", label: "Add", onClick: () => {
2571
+ if (this.filterPanelField && this.filterPanelValue) {
2572
+ this.addFilter(this.filterPanelField, this.filterPanelOperator, this.filterPanelValue);
2573
+ this.filterPanelField = '';
2574
+ this.filterPanelValue = '';
2575
+ }
2576
+ }, disabled: !this.filterPanelField || !this.filterPanelValue }))), index.h("div", { class: "active-filters" }, index.h("div", { class: "active-filters-header" }, index.h("span", null, "Active Filters (", Array.from(this.activeFilters.values()).flat().length, ")"), this.activeFilters.size > 0 && (index.h("ui-button", { variant: "ghost", size: "sm", label: "Clear All", onClick: () => this.clearAllFilters() }))), index.h("div", { class: "filter-chips" }, Array.from(this.activeFilters.entries()).map(([field, filters]) => {
2577
+ const column = flatColumns.find(col => col.id === field);
2578
+ return filters.map((filter, index$1) => (index.h("div", { class: "filter-chip" }, index.h("span", { class: "filter-chip-label" }, index.h("strong", null, column?.label || field), " ", filter.operator, " \"", filter.value, "\""), index.h("ui-button", { variant: "ghost", size: "sm", class: "filter-chip-remove", icon: "x", iconLibrary: "lucide", iconSize: "14px", onClick: () => this.removeFilter(field, index$1) }))));
2579
+ }), this.activeFilters.size === 0 && (index.h("div", { class: "no-filters" }, "No active filters")))))));
2580
+ }
2581
+ renderColumnSettings() {
2582
+ if (!this.showColumnSettings)
2583
+ return null;
2584
+ const flatColumns = this.flattenColumns(this.parseColumns());
2585
+ return (index.h("div", { class: "column-settings-dialog" }, index.h("div", { class: "dialog-overlay", onClick: () => this.showColumnSettings = false }), index.h("div", { class: "dialog-content" }, index.h("div", { class: "dialog-header" }, index.h("h3", null, "Column Settings"), index.h("ui-button", { variant: "ghost", size: "sm", icon: "x", iconLibrary: "lucide", iconSize: "1.2em", onClick: () => this.showColumnSettings = false })), index.h("div", { class: "dialog-body" }, index.h("div", { class: "column-list" }, flatColumns.map(col => (index.h("label", { class: "column-item" }, index.h("ui-checkbox", { checked: this.state.visibleColumns.has(col.id), onCheckboxChange: () => this.toggleColumnVisibility(col.id), label: col.label, size: "sm" })))))), index.h("div", { class: "dialog-footer" }, index.h("ui-button", { variant: "primary", label: "Done", onClick: () => this.showColumnSettings = false })))));
2586
+ }
2587
+ renderExportDialog() {
2588
+ if (!this.showExportDialog)
2589
+ return null;
2590
+ return (index.h("div", { class: "export-dialog" }, index.h("div", { class: "dialog-overlay", onClick: () => this.showExportDialog = false }), index.h("div", { class: "dialog-content" }, index.h("div", { class: "dialog-header" }, index.h("h3", null, "Export Data"), index.h("ui-button", { variant: "ghost", size: "sm", icon: "x", iconLibrary: "lucide", iconSize: "1.2em", onClick: () => this.showExportDialog = false })), index.h("div", { class: "dialog-body" }, index.h("div", { class: "export-options" }, index.h("ui-button", { variant: "ghost", fullWidth: true, icon: "file-text", iconLibrary: "lucide", iconSize: "1.2em", label: "Export as CSV", onClick: () => this.exportData({ format: 'csv', visibleColumnsOnly: true }) }), index.h("ui-button", { variant: "ghost", fullWidth: true, icon: "clipboard", iconLibrary: "lucide", iconSize: "1.2em", label: "Export as JSON", onClick: () => this.exportData({ format: 'json', visibleColumnsOnly: true }) }), this.pdfExport && (index.h("ui-button", { variant: "ghost", fullWidth: true, icon: "book", iconLibrary: "lucide", iconSize: "1.2em", label: "Export as PDF", onClick: () => this.exportToPDF() })), this.state.selectedRows.size > 0 && (index.h("ui-button", { variant: "ghost", fullWidth: true, icon: "check-circle", iconLibrary: "lucide", iconSize: "1.2em", label: `Export Selected Only (${this.state.selectedRows.size} rows)`, onClick: () => this.exportData({ format: 'csv', selectedOnly: true }) })))))));
2591
+ }
2592
+ getHostStyles() {
2593
+ const styles = {};
2594
+ if (this.headerBackground)
2595
+ styles['--table-header-bg'] = this.headerBackground;
2596
+ if (this.stripedColor)
2597
+ styles['--table-striped-bg'] = this.stripedColor;
2598
+ if (this.stripedColorDark)
2599
+ styles['--table-striped-bg-dark'] = this.stripedColorDark;
2600
+ return styles;
2601
+ }
2602
+ render() {
2603
+ const allData = this.getProcessedData();
2604
+ const columns = this.getVisibleColumns();
2605
+ // Virtual Scrolling Logic
2606
+ let displayData = allData;
2607
+ let topSpacer = 0;
2608
+ let bottomSpacer = 0;
2609
+ if (this.virtualScroll) {
2610
+ const { start, end } = this.state.virtualVisibleRange;
2611
+ // Ensure range is valid
2612
+ const safeStart = Math.max(0, start);
2613
+ const safeEnd = Math.min(allData.length, end);
2614
+ displayData = allData.slice(safeStart, safeEnd);
2615
+ topSpacer = safeStart * this.virtualRowHeight;
2616
+ bottomSpacer = (allData.length - safeEnd) * this.virtualRowHeight;
2617
+ }
2618
+ // Mobile View Check (Phase 2)
2619
+ if (this.mobileCardView && this.isMobileView) {
2620
+ return (index.h("div", { class: {
2621
+ 'data-table-container': true,
2622
+ 'mobile-view': true,
2623
+ [`advanced-table-${this.variant}`]: true,
2624
+ [`table-color-${this.color}`]: true,
2625
+ 'dark-mode': this.theme === 'dark',
2626
+ [this.rowHeight]: !!this.rowHeight
2627
+ }, style: this.getHostStyles() }, this.renderToolbar(), this.renderMobileCards(displayData), this.renderPagination(), this.renderFilterPanel(), this.renderColumnSettings(), this.renderExportDialog(), this.renderKeyboardShortcutsModal(), this.renderContextMenu()));
2628
+ }
2629
+ return (index.h("div", { class: {
2630
+ 'data-table-container': true,
2631
+ [`advanced-table-${this.variant}`]: true,
2632
+ [`table-color-${this.color}`]: true,
2633
+ 'dark-mode': this.theme === 'dark',
2634
+ [this.rowHeight]: !!this.rowHeight
2635
+ }, style: this.getHostStyles() }, this.renderToolbar(), index.h("div", { class: {
2636
+ 'table-wrapper': true,
2637
+ 'virtual-scroll': this.virtualScroll
2638
+ }, onScroll: this.virtualScroll ? this.handleVirtualScroll : undefined }, index.h("table", { class: {
2639
+ 'data-table': true,
2640
+ 'sticky-header': this.stickyHeader,
2641
+ 'striped': this.striped,
2642
+ 'hoverable': this.hoverable,
2643
+ 'bordered': this.bordered,
2644
+ }, role: "table", "aria-label": "Data table" }, index.h("thead", null, this.renderTableHeaders()), index.h("tbody", null, this.loading && this.showSkeleton && this.renderSkeletonRows(columns), this.loading && !this.showSkeleton && (index.h("tr", null, index.h("td", { colSpan: columns.length + (this.selectable ? 1 : 0) + (this.showActions ? 1 : 0) + (this.rowDetails ? 1 : 0), class: "loading-cell" }, index.h("div", { class: "loading-container" }, index.h("ui-loader", { type: "spinner", size: "2em", color: "primary" }), index.h("span", null, "Loading..."))))), !this.loading && allData.length === 0 && (index.h("tr", null, index.h("td", { colSpan: columns.length + (this.selectable ? 1 : 0) + (this.showActions ? 1 : 0) + (this.rowDetails ? 1 : 0), class: "empty-cell" }, this.emptyMessage))), topSpacer > 0 && (index.h("tr", { style: { height: `${topSpacer}px` }, role: "presentation" }, index.h("td", { colSpan: columns.length + (this.selectable ? 1 : 0) + (this.showActions ? 1 : 0), style: { padding: '0', border: 'none' } }))), !this.loading && displayData.length > 0 && this.state.groupBy && this.renderGroupedRows(displayData, columns), !this.loading && displayData.length > 0 && !this.state.groupBy && displayData.map((row, rowIndex) => [
2645
+ index.h("tr", { class: {
2646
+ 'selected': this.state.selectedRows.has(row.id),
2647
+ 'pinned-row-top': this.pinnedRows.top.includes(row.id),
2648
+ 'pinned-row-bottom': this.pinnedRows.bottom.includes(row.id),
2649
+ }, key: row.id, role: "row", onContextMenu: (e) => this.handleContextMenu(e, 'row', row), "data-row-id": row.id }, this.selectable && (index.h("td", { class: "select-column", role: "cell" }, index.h("ui-checkbox", { checked: this.state.selectedRows.has(row.id), onCheckboxChange: (e) => this.handleRowSelect(row.id, e), ariaLabel: `Select row ${rowIndex + 1}`, size: "sm" }))), columns.map(col => (index.h("td", { key: col.id, class: {
2650
+ 'sticky-column': !!col.sticky,
2651
+ 'range-selection-cell': true,
2652
+ 'focused-cell': this.state.focusedCell?.rowId === row.id && this.state.focusedCell?.field === col.field,
2653
+ 'pinned-left': this.pinnedColumns.left.includes(col.id),
2654
+ 'pinned-right': this.pinnedColumns.right.includes(col.id)
2655
+ }, style: {
2656
+ textAlign: col.align || 'left',
2657
+ left: this.pinnedColumns.left.includes(col.id) ? this.getPinnedOffset(col.id, 'left') : undefined,
2658
+ right: this.pinnedColumns.right.includes(col.id) ? this.getPinnedOffset(col.id, 'right') : undefined,
2659
+ ...this.getConditionalFormattingStyle(row[col.field], col)
2660
+ }, role: "cell", onClick: (e) => this.handleCellClick(row.id, col.field, e), onContextMenu: (e) => this.handleContextMenu(e, 'cell', { rowId: row.id, field: col.field, value: row[col.field] }), "data-row-id": row.id, "data-field": col.field, tabIndex: 0, onFocus: () => this.setFocusedCell(row.id, col.field) }, this.renderCell(row, col), this.renderValidationError(row.id, col.field)))), this.showActions && (index.h("td", { class: "actions-column", role: "cell" }, this.renderRowActions(row))), this.rowDetails && (index.h("td", { class: "row-details-toggle-cell", role: "cell" }, index.h("ui-button", { variant: "ghost", size: "sm", icon: this.expandedRowDetails.has(row.id) ? 'chevron-down' : 'chevron-right', iconLibrary: "lucide", iconSize: "16px", ariaLabel: "Toggle row details", onClick: () => this.toggleRowDetails(row.id) })))),
2661
+ this.renderRowDetailsPanel(row)
2662
+ ]), bottomSpacer > 0 && (index.h("tr", { style: { height: `${bottomSpacer}px` }, role: "presentation" }, index.h("td", { colSpan: 100, style: { padding: '0', border: 'none' } })))), this.columnAggregation && this.renderAggregationFooter()), this.renderLazyLoadSentinel()), this.renderPagination(), this.renderFilterPanel(), this.renderColumnSettings(), this.renderExportDialog(), this.renderKeyboardShortcutsModal(), this.renderContextMenu()));
2663
+ }
2664
+ static get watchers() { return {
2665
+ "data": [{
2666
+ "onDataOrColumnsChange": 0
2667
+ }],
2668
+ "columns": [{
2669
+ "onDataOrColumnsChange": 0
2670
+ }],
2671
+ "pageSize": [{
2672
+ "onPageSizeChange": 0
2673
+ }],
2674
+ "groupBy": [{
2675
+ "onGroupByChange": 0
2676
+ }],
2677
+ "theme": [{
2678
+ "onThemeChange": 0
2679
+ }]
2680
+ }; }
2681
+ };
2682
+ AdvancedDataTable.style = advancedDataTableCss();
2683
+
2684
+ exports.ui_advanced_data_table = AdvancedDataTable;