@cwellt_software/cwellt-reactjs-lib 1.5.0 → 1.5.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 (237) hide show
  1. package/dist/content/fonts/roboto-mono/LICENSE +93 -0
  2. package/dist/content/fonts/roboto-mono/RobotoMono.css +43 -0
  3. package/dist/content/fonts/roboto-mono/files/roboto-mono-latin-ext-wght-italic.woff2 +0 -0
  4. package/dist/content/fonts/roboto-mono/files/roboto-mono-latin-ext-wght-normal.woff2 +0 -0
  5. package/dist/content/fonts/roboto-mono/files/roboto-mono-latin-wght-italic.woff2 +0 -0
  6. package/dist/content/fonts/roboto-mono/files/roboto-mono-latin-wght-normal.woff2 +0 -0
  7. package/dist/deprecated/components/MultiSelect_deprecated_.d.ts +24 -0
  8. package/dist/deprecated/components/MultiSelect_deprecated_.d.ts.map +1 -0
  9. package/dist/deprecated/components/dropdown/CwDropdownContainer.d.ts +17 -0
  10. package/dist/deprecated/components/dropdown/CwDropdownContainer.d.ts.map +1 -0
  11. package/dist/deprecated/components/multiselect/CwHeadFilter.d.ts +17 -0
  12. package/dist/deprecated/components/multiselect/CwHeadFilter.d.ts.map +1 -0
  13. package/dist/deprecated/components/multiselect/CwMultiselect.d.ts +13 -0
  14. package/dist/deprecated/components/multiselect/CwMultiselect.d.ts.map +1 -0
  15. package/dist/deprecated/components/multiselect/CwOptionList.d.ts +14 -0
  16. package/dist/deprecated/components/multiselect/CwOptionList.d.ts.map +1 -0
  17. package/dist/deprecated/components/tag/CwTag.d.ts +15 -0
  18. package/dist/deprecated/components/tag/CwTag.d.ts.map +1 -0
  19. package/dist/index.cjs.js +182 -33
  20. package/dist/index.css +1 -1
  21. package/dist/index.d.ts +99 -9
  22. package/dist/index.es.js +181 -34
  23. package/dist/playground/main.d.ts +4 -0
  24. package/dist/playground/main.d.ts.map +1 -0
  25. package/dist/src/components/control/action/button/CwPopoverButton.d.ts +33 -0
  26. package/dist/src/components/control/action/button/CwPopoverButton.d.ts.map +1 -0
  27. package/dist/src/components/control/action/contextual-menu/CwContextualMenu.d.ts +29 -0
  28. package/dist/src/components/control/action/contextual-menu/CwContextualMenu.d.ts.map +1 -0
  29. package/dist/src/components/control/action/search/CwAsyncSearch.d.ts +102 -0
  30. package/dist/src/components/control/action/search/CwAsyncSearch.d.ts.map +1 -0
  31. package/dist/src/components/control/action/tooltip-dialog/CwTooltipDialog.d.ts +19 -0
  32. package/dist/src/components/control/action/tooltip-dialog/CwTooltipDialog.d.ts.map +1 -0
  33. package/dist/src/components/control/choice/deprecated/CwDropdown.d.ts +19 -0
  34. package/dist/src/components/control/choice/deprecated/CwDropdown.d.ts.map +1 -0
  35. package/dist/src/components/control/choice/deprecated/CwDropdownNavigation.d.ts +21 -0
  36. package/dist/src/components/control/choice/deprecated/CwDropdownNavigation.d.ts.map +1 -0
  37. package/dist/src/components/control/choice/deprecated/MultiSelect_deprecated_.d.ts +24 -0
  38. package/dist/src/components/control/choice/deprecated/MultiSelect_deprecated_.d.ts.map +1 -0
  39. package/dist/src/components/control/choice/dropdown/CwDropdown.d.ts +19 -0
  40. package/dist/src/components/control/choice/dropdown/CwDropdown.d.ts.map +1 -0
  41. package/dist/src/components/control/choice/dropdown/CwDropdownContainer.d.ts +17 -0
  42. package/dist/src/components/control/choice/dropdown/CwDropdownContainer.d.ts.map +1 -0
  43. package/dist/src/components/control/choice/dropdown/CwDropdownNavigation.d.ts +21 -0
  44. package/dist/src/components/control/choice/dropdown/CwDropdownNavigation.d.ts.map +1 -0
  45. package/dist/src/components/control/choice/multiselect/CwHeadFilter.d.ts +17 -0
  46. package/dist/src/components/control/choice/multiselect/CwHeadFilter.d.ts.map +1 -0
  47. package/dist/src/components/control/choice/multiselect/CwMultiselect.d.ts +13 -0
  48. package/dist/src/components/control/choice/multiselect/CwMultiselect.d.ts.map +1 -0
  49. package/dist/src/components/control/choice/multiselect/CwOptionList.d.ts +14 -0
  50. package/dist/src/components/control/choice/multiselect/CwOptionList.d.ts.map +1 -0
  51. package/dist/src/components/control/choice/nav-menu/CwNavMenu.d.ts.map +1 -1
  52. package/dist/src/components/control/input/new-dates/CwDateTimePicker2.d.ts +47 -0
  53. package/dist/src/components/control/input/new-dates/CwDateTimePicker2.d.ts.map +1 -0
  54. package/dist/src/components/custom/scheduler-temporal/CwSchedulerComp2.d.ts +24 -0
  55. package/dist/src/components/custom/scheduler-temporal/CwSchedulerComp2.d.ts.map +1 -0
  56. package/dist/src/components/custom/scheduler-temporal/CwSuperSchedulerComp.d.ts +86 -0
  57. package/dist/src/components/custom/scheduler-temporal/CwSuperSchedulerComp.d.ts.map +1 -0
  58. package/dist/src/components/custom/scheduler-temporal/components/EventRender.d.ts +10 -0
  59. package/dist/src/components/custom/scheduler-temporal/components/EventRender.d.ts.map +1 -0
  60. package/dist/src/components/custom/scheduler-temporal/components/ResourceListRender.d.ts +20 -0
  61. package/dist/src/components/custom/scheduler-temporal/components/ResourceListRender.d.ts.map +1 -0
  62. package/dist/src/components/custom/scheduler-temporal/components/ResourceRender.d.ts +14 -0
  63. package/dist/src/components/custom/scheduler-temporal/components/ResourceRender.d.ts.map +1 -0
  64. package/dist/src/components/custom/scheduler-temporal/components/day_headers/DayHeader.d.ts +11 -0
  65. package/dist/src/components/custom/scheduler-temporal/components/day_headers/DayHeader.d.ts.map +1 -0
  66. package/dist/src/components/custom/scheduler-temporal/components/day_headers/MonthHeader.d.ts +11 -0
  67. package/dist/src/components/custom/scheduler-temporal/components/day_headers/MonthHeader.d.ts.map +1 -0
  68. package/dist/src/components/custom/scheduler-temporal/components/day_headers/MyDaysHeader.d.ts +13 -0
  69. package/dist/src/components/custom/scheduler-temporal/components/day_headers/MyDaysHeader.d.ts.map +1 -0
  70. package/dist/src/components/custom/scheduler-temporal/components/day_headers/WeekHeader.d.ts +11 -0
  71. package/dist/src/components/custom/scheduler-temporal/components/day_headers/WeekHeader.d.ts.map +1 -0
  72. package/dist/src/components/custom/scheduler-temporal/components/resources_title_list/ResourcesTitleList.d.ts +14 -0
  73. package/dist/src/components/custom/scheduler-temporal/components/resources_title_list/ResourcesTitleList.d.ts.map +1 -0
  74. package/dist/src/components/custom/scheduler-temporal/components/scheduler_content_area/SchedulerContentArea.d.ts +23 -0
  75. package/dist/src/components/custom/scheduler-temporal/components/scheduler_content_area/SchedulerContentArea.d.ts.map +1 -0
  76. package/dist/src/components/custom/scheduler-temporal/components/scheduler_header/SchedulerHeader.d.ts +8 -0
  77. package/dist/src/components/custom/scheduler-temporal/components/scheduler_header/SchedulerHeader.d.ts.map +1 -0
  78. package/dist/src/components/custom/scheduler-temporal/components/scheduler_timeline/SchedulerTimeLine.d.ts +12 -0
  79. package/dist/src/components/custom/scheduler-temporal/components/scheduler_timeline/SchedulerTimeLine.d.ts.map +1 -0
  80. package/dist/src/components/custom/scheduler-temporal/components/time_headers/TimeHeader.d.ts +12 -0
  81. package/dist/src/components/custom/scheduler-temporal/components/time_headers/TimeHeader.d.ts.map +1 -0
  82. package/dist/src/components/custom/scheduler-temporal/components/time_headers/TimeHeaderRow.d.ts +10 -0
  83. package/dist/src/components/custom/scheduler-temporal/components/time_headers/TimeHeaderRow.d.ts.map +1 -0
  84. package/dist/src/components/custom/scheduler-temporal/components/time_line/TimeLine.d.ts +12 -0
  85. package/dist/src/components/custom/scheduler-temporal/components/time_line/TimeLine.d.ts.map +1 -0
  86. package/dist/src/components/custom/scheduler-temporal/logic/dates/addMinutesToDateFromPx.d.ts +2 -0
  87. package/dist/src/components/custom/scheduler-temporal/logic/dates/addMinutesToDateFromPx.d.ts.map +1 -0
  88. package/dist/src/components/custom/scheduler-temporal/logic/dates/daysBetweenTwoDates.d.ts +2 -0
  89. package/dist/src/components/custom/scheduler-temporal/logic/dates/daysBetweenTwoDates.d.ts.map +1 -0
  90. package/dist/src/components/custom/scheduler-temporal/logic/dates/daysBetweenTwoDatesWithoutCeil.d.ts +2 -0
  91. package/dist/src/components/custom/scheduler-temporal/logic/dates/daysBetweenTwoDatesWithoutCeil.d.ts.map +1 -0
  92. package/dist/src/components/custom/scheduler-temporal/logic/dates/getFormatedTimeForHeader.d.ts +7 -0
  93. package/dist/src/components/custom/scheduler-temporal/logic/dates/getFormatedTimeForHeader.d.ts.map +1 -0
  94. package/dist/src/components/custom/scheduler-temporal/logic/dates/getMonthHeaderData.d.ts +10 -0
  95. package/dist/src/components/custom/scheduler-temporal/logic/dates/getMonthHeaderData.d.ts.map +1 -0
  96. package/dist/src/components/custom/scheduler-temporal/logic/dates/getUtcToday.d.ts +2 -0
  97. package/dist/src/components/custom/scheduler-temporal/logic/dates/getUtcToday.d.ts.map +1 -0
  98. package/dist/src/components/custom/scheduler-temporal/logic/dates/getWeekHeaderDataFromWeekRange.d.ts +7 -0
  99. package/dist/src/components/custom/scheduler-temporal/logic/dates/getWeekHeaderDataFromWeekRange.d.ts.map +1 -0
  100. package/dist/src/components/custom/scheduler-temporal/logic/dates/listOfDatesToWeeks.d.ts +8 -0
  101. package/dist/src/components/custom/scheduler-temporal/logic/dates/listOfDatesToWeeks.d.ts.map +1 -0
  102. package/dist/src/components/custom/scheduler-temporal/logic/divisions/calculateDivisionType.d.ts +2 -0
  103. package/dist/src/components/custom/scheduler-temporal/logic/divisions/calculateDivisionType.d.ts.map +1 -0
  104. package/dist/src/components/custom/scheduler-temporal/logic/divisions/calculateDivisions.d.ts +2 -0
  105. package/dist/src/components/custom/scheduler-temporal/logic/divisions/calculateDivisions.d.ts.map +1 -0
  106. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterAndProcessResources.d.ts +4 -0
  107. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterAndProcessResources.d.ts.map +1 -0
  108. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterEvents.d.ts +3 -0
  109. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterEvents.d.ts.map +1 -0
  110. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterResources.d.ts +3 -0
  111. package/dist/src/components/custom/scheduler-temporal/logic/filtering/filterResources.d.ts.map +1 -0
  112. package/dist/src/components/custom/scheduler-temporal/logic/filtering/hasSameProperties.d.ts +3 -0
  113. package/dist/src/components/custom/scheduler-temporal/logic/filtering/hasSameProperties.d.ts.map +1 -0
  114. package/dist/src/components/custom/scheduler-temporal/logic/onDrop/OnDrop.d.ts +13 -0
  115. package/dist/src/components/custom/scheduler-temporal/logic/onDrop/OnDrop.d.ts.map +1 -0
  116. package/dist/src/components/custom/scheduler-temporal/logic/pixels/getHeightLineScheduler.d.ts +2 -0
  117. package/dist/src/components/custom/scheduler-temporal/logic/pixels/getHeightLineScheduler.d.ts.map +1 -0
  118. package/dist/src/components/custom/scheduler-temporal/logic/pixels/getPixelsForEvent.d.ts +7 -0
  119. package/dist/src/components/custom/scheduler-temporal/logic/pixels/getPixelsForEvent.d.ts.map +1 -0
  120. package/dist/src/components/custom/scheduler-temporal/logic/pixels/heightScheduler.d.ts +3 -0
  121. package/dist/src/components/custom/scheduler-temporal/logic/pixels/heightScheduler.d.ts.map +1 -0
  122. package/dist/src/components/custom/scheduler-temporal/logic/pixels/heightSchedulerPinned.d.ts +2 -0
  123. package/dist/src/components/custom/scheduler-temporal/logic/pixels/heightSchedulerPinned.d.ts.map +1 -0
  124. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/doubleClickOnResource.d.ts +4 -0
  125. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/doubleClickOnResource.d.ts.map +1 -0
  126. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/handlePropChanges.d.ts +6 -0
  127. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/handlePropChanges.d.ts.map +1 -0
  128. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/handleResourceChange.d.ts +5 -0
  129. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/handleResourceChange.d.ts.map +1 -0
  130. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onDragOver.d.ts +2 -0
  131. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onDragOver.d.ts.map +1 -0
  132. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onDropEventToResource.d.ts +5 -0
  133. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onDropEventToResource.d.ts.map +1 -0
  134. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onResizeEvent.d.ts +4 -0
  135. package/dist/src/components/custom/scheduler-temporal/logic/state_handle/onResizeEvent.d.ts.map +1 -0
  136. package/dist/src/components/custom/scheduler-temporal/logic/strings/compareStrings.d.ts +2 -0
  137. package/dist/src/components/custom/scheduler-temporal/logic/strings/compareStrings.d.ts.map +1 -0
  138. package/dist/src/components/custom/scheduler-temporal/logic/strings/getGUID.d.ts +2 -0
  139. package/dist/src/components/custom/scheduler-temporal/logic/strings/getGUID.d.ts.map +1 -0
  140. package/dist/src/components/custom/scheduler-temporal/logic/ui/checkIfSlotAvailable.d.ts +3 -0
  141. package/dist/src/components/custom/scheduler-temporal/logic/ui/checkIfSlotAvailable.d.ts.map +1 -0
  142. package/dist/src/components/custom/scheduler-temporal/logic/ui/getEventsOfResource.d.ts +6 -0
  143. package/dist/src/components/custom/scheduler-temporal/logic/ui/getEventsOfResource.d.ts.map +1 -0
  144. package/dist/src/components/custom/scheduler-temporal/logic/ui/getHasPropsChanged.d.ts +4 -0
  145. package/dist/src/components/custom/scheduler-temporal/logic/ui/getHasPropsChanged.d.ts.map +1 -0
  146. package/dist/src/components/custom/scheduler-temporal/logic/ui/getTimeHeaders.d.ts +2 -0
  147. package/dist/src/components/custom/scheduler-temporal/logic/ui/getTimeHeaders.d.ts.map +1 -0
  148. package/dist/src/components/custom/scheduler-temporal/logic/ui/isAllowedToMove.d.ts +3 -0
  149. package/dist/src/components/custom/scheduler-temporal/logic/ui/isAllowedToMove.d.ts.map +1 -0
  150. package/dist/src/components/custom/scheduler-temporal/logic/ui/shouldTriggerScroll.d.ts +4 -0
  151. package/dist/src/components/custom/scheduler-temporal/logic/ui/shouldTriggerScroll.d.ts.map +1 -0
  152. package/dist/src/components/custom/scheduler-temporal/logic/ui/updateResourceVisibility.d.ts +3 -0
  153. package/dist/src/components/custom/scheduler-temporal/logic/ui/updateResourceVisibility.d.ts.map +1 -0
  154. package/dist/src/components/custom/scheduler-temporal/state/CblDragAndDrop.d.ts +11 -0
  155. package/dist/src/components/custom/scheduler-temporal/state/CblDragAndDrop.d.ts.map +1 -0
  156. package/dist/src/components/custom/scheduler-temporal/state/CwSchedulerProps.d.ts +43 -0
  157. package/dist/src/components/custom/scheduler-temporal/state/CwSchedulerProps.d.ts.map +1 -0
  158. package/dist/src/components/custom/scheduler-temporal/state/Resource.d.ts +14 -0
  159. package/dist/src/components/custom/scheduler-temporal/state/Resource.d.ts.map +1 -0
  160. package/dist/src/components/custom/scheduler-temporal/state/State.d.ts +25 -0
  161. package/dist/src/components/custom/scheduler-temporal/state/State.d.ts.map +1 -0
  162. package/dist/src/components/custom/scheduler-temporal/state/cblEvent.d.ts +18 -0
  163. package/dist/src/components/custom/scheduler-temporal/state/cblEvent.d.ts.map +1 -0
  164. package/dist/src/components/custom/scheduler-temporal/state/cblEventCompProps.d.ts +7 -0
  165. package/dist/src/components/custom/scheduler-temporal/state/cblEventCompProps.d.ts.map +1 -0
  166. package/dist/src/components/custom/scheduler-temporal/state/resourceCompProps2.d.ts +6 -0
  167. package/dist/src/components/custom/scheduler-temporal/state/resourceCompProps2.d.ts.map +1 -0
  168. package/dist/src/components/display/data/table/CwTable.d.ts +4 -1
  169. package/dist/src/components/display/data/table/CwTable.d.ts.map +1 -1
  170. package/dist/src/components/display/data/table-serverside/CwTableServerSide.d.ts +4 -1
  171. package/dist/src/components/display/data/table-serverside/CwTableServerSide.d.ts.map +1 -1
  172. package/dist/src/components/display/data/table_sortable/CwSortableTable.d.ts +4 -2
  173. package/dist/src/components/display/data/table_sortable/CwSortableTable.d.ts.map +1 -1
  174. package/dist/src/components/display/graphics/progress/CwProgress.d.ts +36 -0
  175. package/dist/src/components/display/graphics/progress/CwProgress.d.ts.map +1 -0
  176. package/dist/src/components/display/graphics/skeleton/CwSkeleton.d.ts +31 -0
  177. package/dist/src/components/display/graphics/skeleton/CwSkeleton.d.ts.map +1 -0
  178. package/dist/src/components/display/graphics/skeleton/CwSkeletonCard.d.ts +21 -0
  179. package/dist/src/components/display/graphics/skeleton/CwSkeletonCard.d.ts.map +1 -0
  180. package/dist/src/components/display/graphics/skeleton/normalizeSkeletonCount.d.ts +8 -0
  181. package/dist/src/components/display/graphics/skeleton/normalizeSkeletonCount.d.ts.map +1 -0
  182. package/dist/src/components/display/graphics/skeleton/skeletonCellWidth.d.ts +8 -0
  183. package/dist/src/components/display/graphics/skeleton/skeletonCellWidth.d.ts.map +1 -0
  184. package/dist/src/components/display/text/tag/CwTag.d.ts +15 -0
  185. package/dist/src/components/display/text/tag/CwTag.d.ts.map +1 -0
  186. package/dist/src/components/display/text/tooltip/CwTooltip.d.ts +11 -0
  187. package/dist/src/components/display/text/tooltip/CwTooltip.d.ts.map +1 -0
  188. package/dist/src/components/layout/card/CwCard.d.ts +3 -1
  189. package/dist/src/components/layout/card/CwCard.d.ts.map +1 -1
  190. package/dist/src/components/layout/card/CwCardList.d.ts +4 -2
  191. package/dist/src/components/layout/card/CwCardList.d.ts.map +1 -1
  192. package/dist/src/components/layout/list/key-value/CwKeyValueList.d.ts +4 -0
  193. package/dist/src/components/layout/list/key-value/CwKeyValueList.d.ts.map +1 -1
  194. package/dist/src/components/layout/master-detail/CwMasterDetail.d.ts +4 -0
  195. package/dist/src/components/layout/master-detail/CwMasterDetail.d.ts.map +1 -1
  196. package/dist/src/components/layout/modal/legacy/cw_modal_confirm.d.ts +16 -0
  197. package/dist/src/components/layout/modal/legacy/cw_modal_confirm.d.ts.map +1 -0
  198. package/dist/src/components/layout/modal/legacy/cw_modal_iframe.d.ts +21 -0
  199. package/dist/src/components/layout/modal/legacy/cw_modal_iframe.d.ts.map +1 -0
  200. package/dist/src/components/layout/tabs/CwTabs.d.ts +7 -0
  201. package/dist/src/components/layout/tabs/CwTabs.d.ts.map +1 -1
  202. package/dist/src/index.d.ts +2 -0
  203. package/dist/src/index.d.ts.map +1 -1
  204. package/dist/src/playground/PlaygroundApp.d.ts.map +1 -1
  205. package/dist/src/playground/pages/ProgressPage.d.ts +3 -0
  206. package/dist/src/playground/pages/ProgressPage.d.ts.map +1 -0
  207. package/dist/src/playground/pages/SkeletonPage.d.ts +3 -0
  208. package/dist/src/playground/pages/SkeletonPage.d.ts.map +1 -0
  209. package/dist/test/components/control/choice/nav-menu/CwNavMenu.test.d.ts +2 -0
  210. package/dist/test/components/control/choice/nav-menu/CwNavMenu.test.d.ts.map +1 -0
  211. package/dist/test/components/display/data/table/CwTable.test.d.ts +2 -0
  212. package/dist/test/components/display/data/table/CwTable.test.d.ts.map +1 -0
  213. package/dist/test/components/display/data/table-serverside/CwTableServerSide.test.d.ts +2 -0
  214. package/dist/test/components/display/data/table-serverside/CwTableServerSide.test.d.ts.map +1 -0
  215. package/dist/test/components/display/data/table_sortable/CwSortableTable.test.d.ts +2 -0
  216. package/dist/test/components/display/data/table_sortable/CwSortableTable.test.d.ts.map +1 -0
  217. package/dist/test/components/display/graphics/progress/CwProgress.test.d.ts +2 -0
  218. package/dist/test/components/display/graphics/progress/CwProgress.test.d.ts.map +1 -0
  219. package/dist/test/components/display/graphics/skeleton/CwSkeleton.test.d.ts +2 -0
  220. package/dist/test/components/display/graphics/skeleton/CwSkeleton.test.d.ts.map +1 -0
  221. package/dist/test/components/display/graphics/skeleton/CwSkeletonCard.test.d.ts +2 -0
  222. package/dist/test/components/display/graphics/skeleton/CwSkeletonCard.test.d.ts.map +1 -0
  223. package/dist/test/components/display/graphics/skeleton/normalizeSkeletonCount.test.d.ts +2 -0
  224. package/dist/test/components/display/graphics/skeleton/normalizeSkeletonCount.test.d.ts.map +1 -0
  225. package/dist/test/components/display/graphics/skeleton/skeletonCellWidth.test.d.ts +2 -0
  226. package/dist/test/components/display/graphics/skeleton/skeletonCellWidth.test.d.ts.map +1 -0
  227. package/dist/test/components/layout/card/CwCard.test.d.ts +2 -0
  228. package/dist/test/components/layout/card/CwCard.test.d.ts.map +1 -0
  229. package/dist/test/components/layout/card/CwCardList.test.d.ts +2 -0
  230. package/dist/test/components/layout/card/CwCardList.test.d.ts.map +1 -0
  231. package/dist/test/components/layout/list/key-value/CwKeyValueList.test.d.ts +2 -0
  232. package/dist/test/components/layout/list/key-value/CwKeyValueList.test.d.ts.map +1 -0
  233. package/dist/test/components/layout/master-detail/CwMasterDetail.test.d.ts +2 -0
  234. package/dist/test/components/layout/master-detail/CwMasterDetail.test.d.ts.map +1 -0
  235. package/dist/test/jest.setup.d.ts +2 -0
  236. package/dist/test/jest.setup.d.ts.map +1 -0
  237. package/package.json +1 -1
package/dist/index.es.js CHANGED
@@ -161,7 +161,7 @@ function getContrastColor(color) {
161
161
  return `hsl(${hsl.h}, ${contrastS}%, ${targetL}%)`;
162
162
  }
163
163
 
164
- var styles$v = {"cw-tooltip-content":"cw-tooltip-module__cw-tooltip-content__RZczd","cw-tooltip":"cw-tooltip-module__cw-tooltip__1KYig"};
164
+ var styles$x = {"cw-tooltip-content":"cw-tooltip-module__cw-tooltip-content__RZczd","cw-tooltip":"cw-tooltip-module__cw-tooltip__1KYig"};
165
165
 
166
166
  // Constants
167
167
  const margin$1 = 16;
@@ -451,7 +451,7 @@ const CwTooltipManager = () => {
451
451
  if (!state.isVisible || !state.content) {
452
452
  return null;
453
453
  }
454
- return createPortal(jsx("div", { ref: tooltipRef, className: styles$v["cw-tooltip-content"], "data-position": actualPosition, "data-visible": state.isVisible, "data-inline": state.displayInline, style: {
454
+ return createPortal(jsx("div", { ref: tooltipRef, className: styles$x["cw-tooltip-content"], "data-position": actualPosition, "data-visible": state.isVisible, "data-inline": state.displayInline, style: {
455
455
  top: `${tooltipPosition.top}px`,
456
456
  left: `${tooltipPosition.left}px`,
457
457
  opacity: (isPositioned && !isMeasuring) ? 1 : 0,
@@ -532,7 +532,7 @@ const CwTooltipNew = ({ children, content = null, position = "right", dissapears
532
532
  useEffect(() => {
533
533
  ensureTooltipManager();
534
534
  }, []);
535
- return (jsx("div", { ref: containerRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, style: overlayStyle, "data-inline": displayInline, className: styles$v["cw-tooltip"], children: children }));
535
+ return (jsx("div", { ref: containerRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, style: overlayStyle, "data-inline": displayInline, className: styles$x["cw-tooltip"], children: children }));
536
536
  };
537
537
 
538
538
  const SVG_ICONS = {
@@ -991,6 +991,95 @@ function CwLoading({ isLoading = false, text = '', size = 'regular', iconPositio
991
991
  return (jsxs("div", { "aria-busy": isLoading, className: "cw-loading-container", "data-children": !!children, children: [overlay, jsx("div", { className: "cw-loading-disabled-content", children: children })] }));
992
992
  }
993
993
 
994
+ var styles$w = {"skeleton":"cw-skeleton-module__skeleton__Jvx2x","group":"cw-skeleton-module__group__Cm8AU"};
995
+
996
+ /*
997
+ * Internal helper for skeleton allocations (CwSkeleton, tables, cards).
998
+ * Not exported from the library barrel - not a public API.
999
+ */
1000
+ /** Upper bound so a pathological count cannot allocate an unbounded number of nodes. */
1001
+ const MAX_SKELETON_COUNT = 100;
1002
+ /**
1003
+ * Normalizes a skeleton count to a finite, floored, non-negative integer capped at
1004
+ * MAX_SKELETON_COUNT. Falls back to `fallback` for undefined, NaN, non-finite or
1005
+ * non-positive input, so valid inputs keep the public default behaviour and only
1006
+ * pathological ones are bounded.
1007
+ */
1008
+ function normalizeSkeletonCount(value, fallback) {
1009
+ if (value === undefined || !Number.isFinite(value) || value < 1) {
1010
+ return fallback;
1011
+ }
1012
+ return Math.min(Math.floor(value), MAX_SKELETON_COUNT);
1013
+ }
1014
+
1015
+ /**
1016
+ * CwSkeleton - a shimmering placeholder that reserves the shape of content while it loads.
1017
+ *
1018
+ * Renders inline <span> elements so it can sit inside text-level contexts. Sizing flows
1019
+ * through component-scoped custom properties; only the props the caller provides are set
1020
+ * inline, so the CSS defaults per variant (and the 60% last-line rule) stay in charge.
1021
+ *
1022
+ * @example
1023
+ * <CwSkeleton count={3} />
1024
+ * <CwSkeleton variant="circle" />
1025
+ * <CwSkeleton variant="rect" height="10rem" />
1026
+ */
1027
+ function CwSkeleton({ variant = 'text', width, height, count = 1, radius, gap }) {
1028
+ // Only forward the custom properties the caller actually set; CSS declares the defaults.
1029
+ const style = {
1030
+ ...(width !== undefined && { '--skeleton-width': width }),
1031
+ ...(height !== undefined && { '--skeleton-height': height }),
1032
+ ...(radius !== undefined && { '--skeleton-radius': radius })
1033
+ };
1034
+ // The un-hashed cw-skeleton / cw-skeleton-group classes carry no styles in the
1035
+ // library - they are stable public hooks for exceptional external overrides.
1036
+ const skeletonClassName = ['cw-skeleton', styles$w.skeleton].filter(Boolean).join(' ');
1037
+ const groupClassName = ['cw-skeleton-group', styles$w.group].filter(Boolean).join(' ');
1038
+ const lineCount = normalizeSkeletonCount(count, 1);
1039
+ if (lineCount <= 1) {
1040
+ return (jsx("span", { className: skeletonClassName, "data-variant": variant, "aria-hidden": "true", style: style }));
1041
+ }
1042
+ const skeletonElements = Array.from({ length: lineCount }, (_, index) => (jsx("span", { className: skeletonClassName, "data-variant": variant, style: style }, index)));
1043
+ const groupStyle = {
1044
+ ...(gap !== undefined && { '--skeleton-gap': gap })
1045
+ };
1046
+ return (jsx("span", { className: groupClassName, "aria-hidden": "true", style: groupStyle, children: skeletonElements }));
1047
+ }
1048
+
1049
+ var styles$v = {"progress":"cw-progress-module__progress__d-g2-","value":"cw-progress-module__value__Q-DrH","header":"cw-progress-module__header__mv5ct","label":"cw-progress-module__label__jwOWp","track":"cw-progress-module__track__572-3","fill":"cw-progress-module__fill__fX1UA"};
1050
+
1051
+ /**
1052
+ * CwProgress - a determinate or indeterminate progress bar.
1053
+ *
1054
+ * Use it for measurable operations (imports, uploads, batch jobs). For short
1055
+ * unmeasurable waits use CwLoading; for initial layout loads use CwSkeleton.
1056
+ *
1057
+ * @example
1058
+ * <CwProgress value={62} label="Import" color="success" />
1059
+ * <CwProgress indeterminate label="Uploading" />
1060
+ */
1061
+ function CwProgress({ value, indeterminate = false, label, rightLabel, size = 'regular', layout = 'row', color = 'primary', monoValue = false, prominent = false }) {
1062
+ const labelId = React__default.useId();
1063
+ // Determinate: a missing or non-finite value is treated as 0 (never NaN), then
1064
+ // clamped to [0,100] for aria-valuenow and the fill width. Indeterminate has no value.
1065
+ const clamped = indeterminate
1066
+ ? undefined
1067
+ : Math.min(Math.max(Number.isFinite(value) ? value : 0, 0), 100);
1068
+ const percent = clamped !== undefined ? Math.round(clamped) : undefined;
1069
+ const showValue = rightLabel !== undefined || (!indeterminate && percent !== undefined);
1070
+ const valueText = rightLabel ?? (percent !== undefined ? `${percent}%` : '');
1071
+ // The un-hashed cw-progress class carries no styles in the library - a stable
1072
+ // public hook for exceptional external overrides only.
1073
+ const rootClassName = ['cw-progress', styles$v.progress].filter(Boolean).join(' ');
1074
+ const labelSpan = label ? jsx("span", { className: styles$v.label, id: labelId, children: label }) : null;
1075
+ const valueLabel = showValue ? (jsx("span", { className: styles$v.value, "data-mono": monoValue || undefined, children: valueText })) : null;
1076
+ return (jsxs("div", { className: rootClassName, "data-layout": layout, "data-size": size, "data-color": color, "data-prominent": prominent || undefined, "data-indeterminate": indeterminate || undefined, children: [layout === 'column' && (labelSpan || valueLabel) && (jsxs("header", { className: styles$v.header, children: [labelSpan, valueLabel] })), layout === 'row' && labelSpan, jsx("div", { className: styles$v.track, role: "progressbar", ...(label && { 'aria-labelledby': labelId }), ...(!indeterminate && percent !== undefined && {
1077
+ 'aria-valuenow': percent,
1078
+ 'aria-valuemin': 0,
1079
+ 'aria-valuemax': 100
1080
+ }), children: jsx("div", { className: styles$v.fill, style: !indeterminate && clamped !== undefined ? { width: `${clamped}%` } : undefined }) }), layout === 'row' && valueLabel] }));
1081
+ }
1082
+
994
1083
  var styles$u = {"cw-generic-tooltip-content":"cw-generic-tooltip-module__cw-generic-tooltip-content__la-Si","cw-generic-tooltip":"cw-generic-tooltip-module__cw-generic-tooltip__Ij76M"};
995
1084
 
996
1085
  // Constants moved outside to prevent recreation
@@ -1729,7 +1818,7 @@ function CwAlign(props) {
1729
1818
  }, children: props.children }));
1730
1819
  }
1731
1820
 
1732
- var styles$r = {"card":"cw-card-module__card__HJUT0","clickable":"cw-card-module__clickable__Y-V3X","disabled":"cw-card-module__disabled__0wHh1","loading":"cw-card-module__loading__-fzlx","content":"cw-card-module__content__ma9qy","headerContent":"cw-card-module__headerContent__x4Jfl","footerTags":"cw-card-module__footerTags__80sSW","loadingOverlay":"cw-card-module__loadingOverlay__8-zVV"};
1821
+ var styles$r = {"card":"cw-card-module__card__HJUT0","clickable":"cw-card-module__clickable__Y-V3X","disabled":"cw-card-module__disabled__0wHh1","content":"cw-card-module__content__ma9qy","headerContent":"cw-card-module__headerContent__x4Jfl","footerTags":"cw-card-module__footerTags__80sSW"};
1733
1822
 
1734
1823
  /**
1735
1824
  * CwCard - A simple card component for displaying content in a contained format
@@ -1749,7 +1838,7 @@ var styles$r = {"card":"cw-card-module__card__HJUT0","clickable":"cw-card-module
1749
1838
  * <p>This is the main content of the card.</p>
1750
1839
  * </CwCard>
1751
1840
  **/
1752
- const CwCard = ({ id, title, subtitle, alignment = 'center', children, footer, onEdit, onDelete, extraActions, className = '', clickable = false, onClick, isLoading = false, disabled = false, style, chips = [], variant = "border", direction = "column", layout, }) => {
1841
+ const CwCard = ({ id, title, subtitle, alignment = 'center', children, footer, onEdit, onDelete, extraActions, className = '', clickable = false, onClick, isLoading = false, skeletonLines = 3, disabled = false, style, chips = [], variant = "border", direction = "column", layout, }) => {
1753
1842
  const resolvedDirection = layout?.direction ?? direction;
1754
1843
  const resolvedAlign = layout?.align ?? (alignment === 'left' ? 'start' : 'center');
1755
1844
  // Construct class names using CSS modules
@@ -1759,7 +1848,6 @@ const CwCard = ({ id, title, subtitle, alignment = 'center', children, footer, o
1759
1848
  className,
1760
1849
  clickable ? styles$r.clickable : '',
1761
1850
  disabled ? styles$r.disabled : '',
1762
- isLoading ? styles$r.loading : '',
1763
1851
  ].filter(Boolean).join(' ');
1764
1852
  // Handle click event when card is clickable
1765
1853
  const handleClick = () => {
@@ -1775,16 +1863,17 @@ const CwCard = ({ id, title, subtitle, alignment = 'center', children, footer, o
1775
1863
  const hasChips = chips.length > 0;
1776
1864
  // Determine if footer should be rendered
1777
1865
  const hasFooter = hasChips || footer || (hasActions && resolvedDirection === "row");
1778
- // Actions component to reuse
1779
- const ActionsComponent = hasActions && !disabled ? (jsxs("div", { className: styles$r.actions, children: [extraActions ?? null, onEdit && jsx(CwButton, { variant: "icon", icon: "edit", onClick: onEdit }), onDelete && jsx(CwButton, { variant: "icon", icon: "delete", color: "danger", onClick: onDelete })] })) : null;
1780
- return (jsxs("div", { ...(id && { id }), className: cardClassNames, ...(style && { style }), ...(clickable && {
1866
+ // Actions component to reuse. While loading, each provided action renders a circular
1867
+ // ghost sized to the CwButton icon footprint (2rem) - no interactive buttons.
1868
+ const ActionsComponent = hasActions && !disabled ? (jsx("div", { className: styles$r.actions, children: isLoading ? (jsxs(Fragment, { children: [extraActions && jsx(CwSkeleton, { variant: "circle", height: "2rem" }), onEdit && jsx(CwSkeleton, { variant: "circle", height: "2rem" }), onDelete && jsx(CwSkeleton, { variant: "circle", height: "2rem" })] })) : (jsxs(Fragment, { children: [extraActions ?? null, onEdit && jsx(CwButton, { variant: "icon", icon: "edit", onClick: onEdit }), onDelete && jsx(CwButton, { variant: "icon", icon: "delete", color: "danger", onClick: onDelete })] })) })) : null;
1869
+ return (jsxs("div", { ...(id && { id }), className: cardClassNames, ...(style && { style }), ...(clickable && !isLoading && {
1781
1870
  role: 'button',
1782
1871
  tabIndex: 0,
1783
1872
  onClick: handleClick,
1784
- }), "data-variant": variant, "data-direction": resolvedDirection, children: [hasHeader && (jsxs("header", { children: [(title || subtitle) && (jsxs("div", { className: styles$r.headerContent, "data-align": resolvedAlign, children: [title && jsx("h5", { children: title }), subtitle && jsx("strong", { children: subtitle })] })), resolvedDirection === "column" && ActionsComponent] })), jsx("div", { className: styles$r.content, children: children }), hasFooter && (jsxs("footer", { children: [hasChips && (jsx("div", { className: styles$r.footerTags, children: chips.map((chip, index) => (jsx(CwChip, { label: chip.label, colorScheme: chip.colorScheme, className: styles$r.chip, ...(chip.customColor && { customColor: chip.customColor }), ...(chip.variant && { variant: chip.variant }), ...(chip.icon && { icon: chip.icon }) }, index))) })), footer && (jsx("div", { className: styles$r.footerContent, children: footer }))] })), resolvedDirection === "row" && ActionsComponent, isLoading && (jsx("div", { className: styles$r.loadingOverlay, children: jsx(CwLoading, { isLoading: isLoading, size: "small" }) }))] }));
1873
+ }), "data-variant": variant, "data-direction": resolvedDirection, "aria-busy": isLoading || undefined, children: [isLoading ? (jsxs("header", { children: [jsx("div", { className: styles$r.headerContent, "data-align": resolvedAlign, children: jsx(CwSkeleton, { width: "8rem", height: "1.5em" }) }), resolvedDirection === "column" && ActionsComponent] })) : (hasHeader && (jsxs("header", { children: [(title || subtitle) && (jsxs("div", { className: styles$r.headerContent, "data-align": resolvedAlign, children: [title && jsx("h5", { children: title }), subtitle && jsx("strong", { children: subtitle })] })), resolvedDirection === "column" && ActionsComponent] }))), jsx("div", { className: styles$r.content, children: isLoading ? jsx(CwSkeleton, { count: normalizeSkeletonCount(skeletonLines, 3) }) : children }), hasFooter && (isLoading ? (jsx("footer", { children: jsx("div", { className: styles$r.footerTags, children: jsx(CwSkeleton, { variant: "rect", width: "4rem", height: "1.5em", radius: "1rem" }) }) })) : (jsxs("footer", { children: [hasChips && (jsx("div", { className: styles$r.footerTags, children: chips.map((chip, index) => (jsx(CwChip, { label: chip.label, colorScheme: chip.colorScheme, className: styles$r.chip, ...(chip.customColor && { customColor: chip.customColor }), ...(chip.variant && { variant: chip.variant }), ...(chip.icon && { icon: chip.icon }) }, index))) })), footer && (jsx("div", { className: styles$r.footerContent, children: footer }))] }))), resolvedDirection === "row" && ActionsComponent] }));
1785
1874
  };
1786
1875
 
1787
- var styles$q = {"cardContainer":"cw-card-list-module__cardContainer__l3YEh","pagination":"cw-card-list-module__pagination__5Ay78","pageInfo":"cw-card-list-module__pageInfo__uiMel","loading":"cw-card-list-module__loading__cYpND","emptyState":"cw-card-list-module__emptyState__RlqiS"};
1876
+ var styles$q = {"cardContainer":"cw-card-list-module__cardContainer__l3YEh","pagination":"cw-card-list-module__pagination__5Ay78","pageInfo":"cw-card-list-module__pageInfo__uiMel","emptyState":"cw-card-list-module__emptyState__RlqiS"};
1788
1877
 
1789
1878
  /**
1790
1879
  * Option to display in the CwSelect
@@ -1842,7 +1931,7 @@ function CwSelect(props) {
1842
1931
  : selectProps.onChange, children: [placeholder && jsx(CwOption, { value: "", children: placeholder }), children] }), buttonProps && jsx(CwButton, { ...buttonProps })] })] }), feedbackMessages.map((feedbackItem, index) => (jsx("p", { className: "cw-input-info", "data-color": feedbackItem.type, children: feedbackItem.message }, index)))] }));
1843
1932
  }
1844
1933
 
1845
- function CwCardList({ items, renderCard, pageSize = 10, layout = 'grid', defaultCardWidth = 320, cardGap = 16, isLoading = false, emptyState, sortOptions = [], defaultSortKey, keyExtractor, ...htmlProps }) {
1934
+ function CwCardList({ items, renderCard, pageSize = 10, layout = 'grid', defaultCardWidth = 320, cardGap = 16, isLoading = false, skeletonCards = 6, emptyState, sortOptions = [], defaultSortKey, keyExtractor, ...htmlProps }) {
1846
1935
  const [currentPage, setCurrentPage] = useState(1);
1847
1936
  const [sortKey, setSortKey] = useState(defaultSortKey || sortOptions[0]?.key || '');
1848
1937
  const [sortDirection, setSortDirection] = useState('asc');
@@ -1879,7 +1968,7 @@ function CwCardList({ items, renderCard, pageSize = 10, layout = 'grid', default
1879
1968
  icon: sortDirection === 'asc' ? 'arrow-up' : 'arrow-down',
1880
1969
  onClick: () => setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc'),
1881
1970
  title: `Sort ${sortDirection === 'asc' ? 'descending' : 'ascending'}`,
1882
- }, value: sortKey, onChange: (e) => handleSortChange(e.target.value), children: sortOptions.map(option => (jsx(CwOption, { value: option.key, children: option.label }, option.key))) }) })), isLoading ? (jsx("div", { className: styles$q.loading, children: jsx(CwLoading, { isLoading: isLoading }) })) : sortedItems.length === 0 ? (jsx("div", { className: styles$q.emptyState, children: emptyState || jsx("p", { children: "No items to display" }) })) : (jsxs(Fragment, { children: [jsx("div", { className: `${styles$q.cardContainer}`, "data-layout": layout, style: gridStyle, children: visibleItems.map((item, index) => (jsx(React__default.Fragment, { children: renderCard(item, index) }, keyExtractor ? keyExtractor(item, index) : index))) }), totalPages > 1 && (jsxs("div", { className: styles$q.pagination, children: [jsx(CwButton, { variant: "icon", icon: "chevron-left", disabled: currentPage === 1, onClick: () => setCurrentPage(p => Math.max(1, p - 1)) }), jsxs("span", { className: styles$q.pageInfo, children: [currentPage, " / ", totalPages] }), jsx(CwButton, { variant: "icon", icon: "chevron-right", disabled: currentPage === totalPages, onClick: () => setCurrentPage(p => Math.min(totalPages, p + 1)) })] }))] }))] }));
1971
+ }, value: sortKey, onChange: (e) => handleSortChange(e.target.value), children: sortOptions.map(option => (jsx(CwOption, { value: option.key, children: option.label }, option.key))) }) })), isLoading ? (jsx("div", { className: `${styles$q.cardContainer}`, "data-layout": layout, style: gridStyle, "aria-busy": true, children: Array.from({ length: normalizeSkeletonCount(skeletonCards, 6) }, (_, index) => (jsx(CwCard, { isLoading: true, children: null }, `skeleton_${index}`))) })) : sortedItems.length === 0 ? (jsx("div", { className: styles$q.emptyState, children: emptyState || jsx("p", { children: "No items to display" }) })) : (jsxs(Fragment, { children: [jsx("div", { className: `${styles$q.cardContainer}`, "data-layout": layout, style: gridStyle, children: visibleItems.map((item, index) => (jsx(React__default.Fragment, { children: renderCard(item, index) }, keyExtractor ? keyExtractor(item, index) : index))) }), totalPages > 1 && (jsxs("div", { className: styles$q.pagination, children: [jsx(CwButton, { variant: "icon", icon: "chevron-left", disabled: currentPage === 1, onClick: () => setCurrentPage(p => Math.max(1, p - 1)) }), jsxs("span", { className: styles$q.pageInfo, children: [currentPage, " / ", totalPages] }), jsx(CwButton, { variant: "icon", icon: "chevron-right", disabled: currentPage === totalPages, onClick: () => setCurrentPage(p => Math.min(totalPages, p + 1)) })] }))] }))] }));
1883
1972
  }
1884
1973
 
1885
1974
  var styles$p = {"cw-accordion":"cw-accordion-module__cw-accordion__ErvlW","cw-accordion-body":"cw-accordion-module__cw-accordion-body__xlI8b"};
@@ -1902,6 +1991,21 @@ function CwAccordionContainer(CwelltAccordionContainerProps) {
1902
1991
  return (jsxs("div", { className: styles$p["cw-accordion"], style: CwelltAccordionContainerProps.style, "data-open": isVisible_accordionBody, children: [jsxs("header", { onClick: () => showAccordionBody(), children: [jsx("div", { children: CwelltAccordionContainerProps.desc_text }), jsx("button", { className: "cw-button-icon" })] }), jsx("div", { className: styles$p["cw-accordion-body"], children: CwelltAccordionContainerProps.children })] }));
1903
1992
  }
1904
1993
 
1994
+ /*
1995
+ * Internal helper for table loading ghosts (CwTable, CwSortableTable).
1996
+ * Not exported from the library barrel - not a public API.
1997
+ */
1998
+ const SKELETON_CELL_WIDTHS = ['85%', '60%', '95%', '70%', '80%', '65%'];
1999
+ /**
2000
+ * Deterministic width for a table ghost cell so skeleton rows look like real,
2001
+ * unevenly sized content. Derived purely from indices - stable across re-renders
2002
+ * (no reshuffling) - and offset by the column count so the pattern does not
2003
+ * repeat identically per row or per column.
2004
+ */
2005
+ function getSkeletonCellWidth(rowIndex, columnIndex, columnCount) {
2006
+ return SKELETON_CELL_WIDTHS[(rowIndex * columnCount + columnIndex) % SKELETON_CELL_WIDTHS.length];
2007
+ }
2008
+
1905
2009
  /**
1906
2010
  * A reusable and customizable table component.
1907
2011
  *
@@ -1971,7 +2075,7 @@ function CwAccordionContainer(CwelltAccordionContainerProps) {
1971
2075
  *
1972
2076
  * @returns React component
1973
2077
  */
1974
- function CwTable({ columns, data, pagination = false, pageSizeOptions = [5, 10, 20, 50], expandedRowRender, onExpand, className, classNameRow, style, classNameContainer, id, testId, textNoData = "No data available at the moment", rowKey = "key", loading = false, scrollHeight, stickyHeader = false, pageLabel = "page", rowSelection }) {
2078
+ function CwTable({ columns, data, pagination = false, pageSizeOptions = [5, 10, 20, 50], expandedRowRender, onExpand, className, classNameRow, style, classNameContainer, id, testId, textNoData = "No data available at the moment", rowKey = "key", loading = false, skeletonRows = 5, scrollHeight, stickyHeader = false, pageLabel = "page", rowSelection }) {
1975
2079
  const [currentPage, setCurrentPage] = useState(1);
1976
2080
  const [expandedRowKey, setExpandedRowKey] = useState(null);
1977
2081
  const [sortConfig, setSortConfig] = useState({
@@ -2109,7 +2213,9 @@ function CwTable({ columns, data, pagination = false, pageSizeOptions = [5, 10,
2109
2213
  };
2110
2214
  const renderTableBody = () => {
2111
2215
  if (loading) {
2112
- return (jsx("tr", { children: jsx("td", { colSpan: getColSpan(), children: jsx("div", { children: "Loading data..." }) }) }));
2216
+ // Ghost rows: rendered outside the data/selection/expand code paths, so they
2217
+ // cannot trigger row click, selection or expansion.
2218
+ return Array.from({ length: normalizeSkeletonCount(skeletonRows, 5) }, (_, rowIndex) => (jsxs("tr", { children: [expandedRowRender && jsx("td", { className: "cw-table-col-action" }), columns.map((col, columnIndex) => (jsx("td", { className: col.className ?? "", children: jsx(CwSkeleton, { variant: "text", width: getSkeletonCellWidth(rowIndex, columnIndex, columns.length) }) }, col.key)))] }, `skeleton_${rowIndex}`)));
2113
2219
  }
2114
2220
  if (!paginatedData || paginatedData.length === 0) {
2115
2221
  return (jsx("tr", { children: jsx("td", { colSpan: getColSpan(), className: "cw-table-cell-empty", style: { textAlign: "center" }, children: textNoData }) }));
@@ -2131,7 +2237,7 @@ function CwTable({ columns, data, pagination = false, pageSizeOptions = [5, 10,
2131
2237
  : "cwi-chevron-right"}` }) })), columns.map(col => (jsx("td", { className: col.className ?? "", children: col.render ? col.render(item) : col.dataIndex ? String(item[col.dataIndex] ?? "") : "" }, `${itemKey}_${col.key}`)))] }), expandedRowRender && expandedRowKey === itemKey && (jsx("tr", { className: "cw-table-row-expanded", children: jsx("td", { colSpan: getColSpan(), children: expandedRowRender(item) }) }))] }, String(itemKey)));
2132
2238
  });
2133
2239
  };
2134
- return (jsxs("div", { id: id, "data-testid": testId, className: `cw-table-container${stickyHeader || scrollHeight ? " cw-table-scroll" : ""} ${classNameContainer ?? ""}`, style: { ...(scrollHeight ? { "--table-height": typeof scrollHeight === "number" ? `${scrollHeight}px` : scrollHeight } : {}), ...style }, children: [jsxs("table", { className: `cw-table ${className ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [expandedRowRender && jsx("th", {}), columns.map(col => (jsxs("th", { onClick: () => col.sortable && col.dataIndex && handleSort(col.dataIndex), className: `${col.className ?? ""} ${sortConfig.key === col.dataIndex
2240
+ return (jsxs("div", { id: id, "data-testid": testId, className: `cw-table-container${stickyHeader || scrollHeight ? " cw-table-scroll" : ""} ${classNameContainer ?? ""}`, style: { ...(scrollHeight ? { "--table-height": typeof scrollHeight === "number" ? `${scrollHeight}px` : scrollHeight } : {}), ...style }, "aria-busy": loading || undefined, children: [jsxs("table", { className: `cw-table ${className ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [expandedRowRender && jsx("th", {}), columns.map(col => (jsxs("th", { onClick: () => col.sortable && col.dataIndex && handleSort(col.dataIndex), className: `${col.className ?? ""} ${sortConfig.key === col.dataIndex
2135
2241
  ? sortConfig.direction
2136
2242
  : ""}`.trim(), style: {
2137
2243
  cursor: col.sortable ? "pointer" : "default",
@@ -2157,7 +2263,7 @@ function CwTable({ columns, data, pagination = false, pageSizeOptions = [5, 10,
2157
2263
  }, min: 1, max: totalPages }), jsx("span", { children: "/" }), jsx("span", { children: totalPages }), jsx(CwButton, { onClick: () => handlePageChange(currentPage + 1), disabled: currentPage === totalPages || totalPages <= 1, variant: "icon", icon: "chevron-right" }), jsx(CwButton, { onClick: () => handlePageChange(totalPages), disabled: currentPage === totalPages || totalPages <= 1, variant: "icon", icon: "chevron-right-double" })] })] }))] }));
2158
2264
  }
2159
2265
 
2160
- var styles$o = {"dropIndicator":"cw-sortable-table-module__dropIndicator__ov-Jz","dragging":"cw-sortable-table-module__dragging__MrLrz","skeletonRow":"cw-sortable-table-module__skeletonRow__vyD0M","skeleton":"cw-sortable-table-module__skeleton__QGXAD","saveBar":"cw-sortable-table-module__saveBar__3OdoZ cw-flex-row cw-align-center-center cw-gap-small"};
2266
+ var styles$o = {"dropIndicator":"cw-sortable-table-module__dropIndicator__ov-Jz","dragging":"cw-sortable-table-module__dragging__MrLrz","saveBar":"cw-sortable-table-module__saveBar__3OdoZ cw-flex-row cw-align-center-center cw-gap-small"};
2161
2267
 
2162
2268
  /**
2163
2269
  * Hook that provides state management for CwSortableTable.
@@ -2222,7 +2328,12 @@ function useSortableTable(initialItems) {
2222
2328
  // ─── Drop indicator row ───────────────────────────────────────────────────────
2223
2329
  const DropIndicatorRow = ({ colSpan }) => (jsx("tr", { className: styles$o.dropIndicator, "aria-hidden": true, children: jsx("td", { colSpan: colSpan, children: jsx("div", {}) }) }));
2224
2330
  // ─── Loading skeleton ─────────────────────────────────────────────────────────
2225
- const LoadingRows = ({ colSpan }) => (jsx(Fragment, { children: Array.from({ length: 4 }).map((_, i) => (jsx("tr", { className: styles$o.skeletonRow, children: jsx("td", { colSpan: colSpan, children: jsx("div", { className: styles$o.skeleton }) }) }, i))) }));
2331
+ // Plain td cells (no local class): the ghost cells get the same global cw-table
2332
+ // padding as real body cells, so row heights match the loaded rows exactly.
2333
+ // One cell per real column, so column classNames/widths apply to the ghost too.
2334
+ function LoadingRows({ columns, showHandle, skeletonRows }) {
2335
+ return (jsx(Fragment, { children: Array.from({ length: skeletonRows }).map((_, rowIndex) => (jsxs("tr", { children: [showHandle && jsx("td", { className: "cw-table-col-action" }), columns.map((col, columnIndex) => (jsx("td", { className: col.className ?? "", style: col.width ? { width: col.width } : undefined, children: jsx(CwSkeleton, { variant: "text", width: getSkeletonCellWidth(rowIndex, columnIndex, columns.length) }) }, col.key)))] }, rowIndex))) }));
2336
+ }
2226
2337
  // ─── Component ────────────────────────────────────────────────────────────────
2227
2338
  /**
2228
2339
  * CwSortableTable
@@ -2239,7 +2350,7 @@ const LoadingRows = ({ colSpan }) => (jsx(Fragment, { children: Array.from({ len
2239
2350
  * - Reorder is calculated in onDragEnd using lastValidDropIndex
2240
2351
  * - draggedItem is tracked in state, not via dataTransfer
2241
2352
  */
2242
- function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = false, textNoData = "No data available", className, tableClassName, maxHeight, showHandle = true, style, saveLabel = "Save order", discardLabel = "Discard", }) {
2353
+ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = false, skeletonRows = 5, textNoData = "No data available", className, tableClassName, maxHeight, showHandle = true, style, saveLabel = "Save order", discardLabel = "Discard", }) {
2243
2354
  const { items, hasChanges, handleReorder, handleSave, handleDiscard, } = useSortableTable(data);
2244
2355
  // Drag state lives in the component, same as CwSortableList
2245
2356
  const [draggedItem, setDraggedItem] = useState(null);
@@ -2258,11 +2369,15 @@ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = f
2258
2369
  setLastValidDropIndex(null);
2259
2370
  };
2260
2371
  const handleDragStart = (e, item) => {
2372
+ if (loading)
2373
+ return;
2261
2374
  setDraggedItem(item);
2262
2375
  setLastValidDropIndex(null);
2263
2376
  e.dataTransfer.effectAllowed = "move";
2264
2377
  };
2265
2378
  const handleDragOver = (e, index) => {
2379
+ if (loading)
2380
+ return;
2266
2381
  e.preventDefault();
2267
2382
  if (!draggedItem)
2268
2383
  return;
@@ -2275,6 +2390,11 @@ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = f
2275
2390
  }
2276
2391
  };
2277
2392
  const handleDragEnd = () => {
2393
+ // Never persist a reorder computed against stale/ghost data while loading.
2394
+ if (loading) {
2395
+ cleanupDragState();
2396
+ return;
2397
+ }
2278
2398
  if (draggedItem && lastValidDropIndex !== null) {
2279
2399
  const dragIndex = items.findIndex(item => item[rowKey] === draggedItem[rowKey]);
2280
2400
  if (dragIndex !== lastValidDropIndex && dragIndex !== lastValidDropIndex - 1) {
@@ -2301,7 +2421,7 @@ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = f
2301
2421
  };
2302
2422
  const renderBody = () => {
2303
2423
  if (loading) {
2304
- return jsx(LoadingRows, { colSpan: totalCols });
2424
+ return jsx(LoadingRows, { columns: columns, showHandle: showHandle, skeletonRows: normalizeSkeletonCount(skeletonRows, 5) });
2305
2425
  }
2306
2426
  if (!items || items.length === 0) {
2307
2427
  return (jsx("tr", { children: jsx("td", { colSpan: totalCols, className: "cw-table-cell-empty", style: { textAlign: "center" }, children: textNoData }) }));
@@ -2313,7 +2433,7 @@ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = f
2313
2433
  });
2314
2434
  };
2315
2435
  // ── Render ──────────────────────────────────────────────────────────────
2316
- return (jsxs("div", { className: `cw-table-container ${className ?? ""}`, style: containerStyle, children: [jsxs("table", { className: `cw-table cw-sortable-table ${tableClassName ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [showHandle && jsx("th", { className: "cw-table-col-action" }), columns.map(col => (jsx("th", { className: col.className ?? "", style: col.width ? { width: col.width, minWidth: 50 } : undefined, children: col.title }, col.key)))] }) }), jsx("tbody", { children: renderBody() })] }), hasChanges && (jsxs("footer", { className: styles$o.saveBar, children: [jsx(CwButton, { variant: "outline", color: "neutral", icon: "undo", text: discardLabel, onClick: handleDiscard }), jsx(CwButton, { variant: "solid", color: "primary", icon: "save", text: saveLabel, onClick: () => handleSave(onReorder) })] }))] }));
2436
+ return (jsxs("div", { className: `cw-table-container ${className ?? ""}`, style: containerStyle, "aria-busy": loading || undefined, children: [jsxs("table", { className: `cw-table cw-sortable-table ${tableClassName ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [showHandle && jsx("th", { className: "cw-table-col-action" }), columns.map(col => (jsx("th", { className: col.className ?? "", style: col.width ? { width: col.width, minWidth: 50 } : undefined, children: col.title }, col.key)))] }) }), jsx("tbody", { children: renderBody() })] }), !loading && hasChanges && (jsxs("footer", { className: styles$o.saveBar, children: [jsx(CwButton, { variant: "outline", color: "neutral", icon: "undo", text: discardLabel, onClick: handleDiscard }), jsx(CwButton, { variant: "solid", color: "primary", icon: "save", text: saveLabel, onClick: () => handleSave(onReorder) })] }))] }));
2317
2437
  }
2318
2438
 
2319
2439
  /**
@@ -2369,7 +2489,7 @@ function CwSortableTable({ columns, data, rowKey = "key", onReorder, loading = f
2369
2489
  *
2370
2490
  * @returns React component
2371
2491
  */
2372
- function CwTableServerSide({ columns, data, totalItems, pagination = false, pageSizeOptions = [5, 10, 20, 50], pageLabel = "page", expandedRowRender, onExpand, className, classNameRow, style, classNameContainer, id, testId, textNoData = "No data available at the moment", rowKey = "key", loading = false, scrollHeight, stickyHeader = false, rowSelection, onChange, serverState, }) {
2492
+ function CwTableServerSide({ columns, data, totalItems, pagination = false, pageSizeOptions = [5, 10, 20, 50], pageLabel = "page", expandedRowRender, onExpand, className, classNameRow, style, classNameContainer, id, testId, textNoData = "No data available at the moment", rowKey = "key", loading = false, skeletonRows = 5, scrollHeight, stickyHeader = false, rowSelection, onChange, serverState, }) {
2373
2493
  const [internalState, setInternalState] = useState({
2374
2494
  page: 1,
2375
2495
  pageSize: pageSizeOptions[0],
@@ -2470,7 +2590,9 @@ function CwTableServerSide({ columns, data, totalItems, pagination = false, page
2470
2590
  };
2471
2591
  const renderTableBody = () => {
2472
2592
  if (loading) {
2473
- return (jsx("tr", { children: jsx("td", { colSpan: getColSpan(), children: jsx("div", { children: "Loading data..." }) }) }));
2593
+ // Ghost rows: rendered outside the data/selection/expand code paths, so they
2594
+ // cannot trigger row click, selection or expansion.
2595
+ return Array.from({ length: normalizeSkeletonCount(skeletonRows, 5) }, (_, rowIndex) => (jsxs("tr", { children: [expandedRowRender && jsx("td", { className: "cw-table-col-action" }), columns.map((col, columnIndex) => (jsx("td", { className: col.className ?? "", children: jsx(CwSkeleton, { variant: "text", width: getSkeletonCellWidth(rowIndex, columnIndex, columns.length) }) }, col.key)))] }, `skeleton_${rowIndex}`)));
2474
2596
  }
2475
2597
  if (!data || data.length === 0) {
2476
2598
  return (jsx("tr", { children: jsx("td", { colSpan: getColSpan(), className: "cw-table-cell-empty", style: { textAlign: "center" }, children: textNoData }) }));
@@ -2488,7 +2610,7 @@ function CwTableServerSide({ columns, data, totalItems, pagination = false, page
2488
2610
  }, children: [expandedRowRender && (jsx("td", { className: "cw-table-col-action cw-table-col-expand", children: jsx("button", { onClick: () => handleRowExpand(item), className: `cw-button-icon ${expandedRowKey === itemKey ? "cwi-chevron-down" : "cwi-chevron-right"}` }) })), columns.map((col) => (jsx("td", { className: col.className ?? "", children: col.render ? col.render(item) : col.dataIndex ? String(item[col.dataIndex] ?? "") : "" }, `${itemKey}_${col.key}`)))] }), expandedRowRender && expandedRowKey === itemKey && (jsx("tr", { className: "cw-table-row-expanded", children: jsx("td", { colSpan: getColSpan(), children: expandedRowRender(item) }) }))] }, String(itemKey)));
2489
2611
  });
2490
2612
  };
2491
- return (jsxs("div", { id: id, "data-testid": testId, className: `cw-table-container${stickyHeader || scrollHeight ? " cw-table-scroll" : ""} ${classNameContainer ?? ""}`, style: { ...(scrollHeight ? { "--table-height": typeof scrollHeight === "number" ? `${scrollHeight}px` : scrollHeight } : {}), ...style }, children: [jsxs("table", { className: `cw-table ${className ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [expandedRowRender && jsx("th", {}), columns.map((col) => (jsxs("th", { onClick: () => col.sortable && col.dataIndex && handleSort(col.dataIndex), className: `${col.className ?? ""} ${state.sortKey === col.dataIndex ? state.sortDirection : ""}`.trim(), style: {
2613
+ return (jsxs("div", { id: id, "data-testid": testId, className: `cw-table-container${stickyHeader || scrollHeight ? " cw-table-scroll" : ""} ${classNameContainer ?? ""}`, style: { ...(scrollHeight ? { "--table-height": typeof scrollHeight === "number" ? `${scrollHeight}px` : scrollHeight } : {}), ...style }, "aria-busy": loading || undefined, children: [jsxs("table", { className: `cw-table ${className ?? ""}`, style: { width: "100%" }, children: [jsx("thead", { children: jsxs("tr", { children: [expandedRowRender && jsx("th", {}), columns.map((col) => (jsxs("th", { onClick: () => col.sortable && col.dataIndex && handleSort(col.dataIndex), className: `${col.className ?? ""} ${state.sortKey === col.dataIndex ? state.sortDirection : ""}`.trim(), style: {
2492
2614
  cursor: col.sortable ? "pointer" : "default",
2493
2615
  userSelect: "none",
2494
2616
  width: columnWidths[col.key] ?? col.width,
@@ -2562,7 +2684,7 @@ function CwTabs(CwTabsProps) {
2562
2684
  const tabsListStyle = position === 'left' && CwTabsProps.tabsListWidth
2563
2685
  ? { minWidth: CwTabsProps.tabsListWidth }
2564
2686
  : undefined;
2565
- return (jsxs("div", { id: CwTabsProps.id, "data-testid": CwTabsProps.testId, className: styles$n['cw-tabs'] + (CwTabsProps.className ? ` ${CwTabsProps.className}` : "") + "", style: CwTabsProps.style, "data-tabs-position": position, children: [jsx("ul", { style: tabsListStyle, children: CwTabsProps.tabs.map(tab => (jsxs("li", { className: `${tab.key === activeTab ? "cw-tab-active" : ""}`, onClick: () => handleTabClick(tab), "data-active": tab.key === activeTab, "data-tab-key": tab.key, children: [jsx(TabIcon, { icon: tab.icon }), tab.title, (tab.badge !== undefined || tab.badgeColor) && (jsx("span", { className: styles$n['badge'], style: tab.badgeColor ? { backgroundColor: tab.badgeColor, color: getContrastColor(tab.badgeColor) } : undefined, children: tab.badge }))] }, tab.key))) }), jsx("div", { className: styles$n['cw-tabs-content'], "data-active-tab-key": activeTab ?? undefined, children: activeTab !== null && CwTabsProps.tabs.find(tab => tab.key === activeTab)?.content })] }));
2687
+ return (jsxs("div", { id: CwTabsProps.id, "data-testid": CwTabsProps.testId, className: styles$n['cw-tabs'] + (CwTabsProps.className ? ` ${CwTabsProps.className}` : "") + "", style: CwTabsProps.style, "data-tabs-position": position, children: [jsx("ul", { style: tabsListStyle, children: CwTabsProps.tabs.map(tab => (jsxs("li", { className: `${tab.key === activeTab ? "cw-tab-active" : ""}`, onClick: () => handleTabClick(tab), "data-active": tab.key === activeTab, "data-tab-key": tab.key, children: [jsx(TabIcon, { icon: tab.icon }), tab.title, (tab.badge !== undefined || tab.badgeColor) && (jsx("span", { className: styles$n['badge'], style: tab.badgeColor ? { backgroundColor: tab.badgeColor, color: getContrastColor(tab.badgeColor) } : undefined, children: tab.badge }))] }, tab.key))) }), jsx("div", { className: styles$n['cw-tabs-content'], "data-active-tab-key": activeTab ?? undefined, style: CwTabsProps.contentHeight ? { '--tabs-height': CwTabsProps.contentHeight } : undefined, children: activeTab !== null && CwTabsProps.tabs.find(tab => tab.key === activeTab)?.content })] }));
2566
2688
  }
2567
2689
 
2568
2690
  /**
@@ -2589,9 +2711,17 @@ const CwExpandable = ({ briefing, onToggle, onOpen, onClose, children, ...detail
2589
2711
  return (jsxs("details", { ref: myRef, ...detailsProps, className: "cw-expandable", children: [jsx("summary", { children: briefing }), children && jsx("section", { children: children })] }));
2590
2712
  };
2591
2713
 
2592
- var styles$m = {"cw-master-detail":"cw-master-detail-module__cw-master-detail__O8-FA","resizer":"cw-master-detail-module__resizer__hvGhL","detail":"cw-master-detail-module__detail__BG4Dm","detail-empty":"cw-master-detail-module__detail-empty__KFScK"};
2714
+ var styles$m = {"cw-master-detail":"cw-master-detail-module__cw-master-detail__O8-FA","resizer":"cw-master-detail-module__resizer__hvGhL","detail":"cw-master-detail-module__detail__BG4Dm","skeletonRow":"cw-master-detail-module__skeletonRow__6BUgt","detailSkeleton":"cw-master-detail-module__detailSkeleton__GcDS4","detail-empty":"cw-master-detail-module__detail-empty__KFScK"};
2593
2715
 
2594
- const CwMasterDetail = ({ id, className, style, items, selectedKey, onSelect, detailContent, emptyDetail, searchPlaceholder = 'Search...', onSearch, masterHeader, masterFooter, masterWidth: initialWidth = 320, minMasterWidth = 240, maxMasterWidth = 500, resizable = true, showSearch = true, }) => {
2716
+ /*
2717
+ * Fixed rem widths for the ghosts: the master rows and detail panel size their
2718
+ * content freely, so a percentage-width skeleton would resolve to 100% of ~0 and
2719
+ * collapse to nothing. Fixed widths render regardless of layout. Cycled so rows do
2720
+ * not all look identical.
2721
+ */
2722
+ const MASTER_TITLE_WIDTHS = ['9rem', '11rem', '8rem', '10rem'];
2723
+ const MASTER_SUBTITLE_WIDTH = '5rem';
2724
+ const CwMasterDetail = ({ id, className, style, items, selectedKey, onSelect, detailContent, emptyDetail, searchPlaceholder = 'Search...', onSearch, masterHeader, masterFooter, masterWidth: initialWidth = 320, minMasterWidth = 240, maxMasterWidth = 500, resizable = true, showSearch = true, loading = false, skeletonRows = 5, }) => {
2595
2725
  const [masterWidth, setMasterWidth] = useState(initialWidth);
2596
2726
  const [isResizing, setIsResizing] = useState(false);
2597
2727
  const containerRef = useRef(null);
@@ -2626,11 +2756,21 @@ const CwMasterDetail = ({ id, className, style, items, selectedKey, onSelect, de
2626
2756
  };
2627
2757
  }, [isResizing, minMasterWidth, maxMasterWidth]);
2628
2758
  const rootClassName = [styles$m['cw-master-detail'], className].filter(Boolean).join(' ');
2629
- return (jsxs("div", { id: id, ref: containerRef, className: rootClassName, style: style, children: [jsxs("aside", { style: { width: masterWidth, minWidth: masterWidth }, children: [showSearch && (jsx("search", { children: jsx("input", { type: "text", placeholder: searchPlaceholder, onChange: (e) => onSearch?.(e.target.value) }) })), masterHeader && (jsx("header", { children: masterHeader })), jsx("ul", { children: items.map((item) => (jsx("li", { "data-master-key": item.key, "data-selected": item.key === selectedKey, "data-disabled": item.disabled, onClick: () => onSelect?.(item.key), children: item.content }, item.key))) }), masterFooter && (jsx("footer", { children: masterFooter }))] }), resizable && (jsx("div", { className: styles$m.resizer, "data-resizing": isResizing, onMouseDown: handleMouseDown })), jsx("section", { className: styles$m.detail, children: selectedKey && detailContent
2759
+ return (jsxs("div", { id: id, ref: containerRef, className: rootClassName, style: style, "aria-busy": loading || undefined, children: [jsxs("aside", { style: { width: masterWidth, minWidth: masterWidth }, children: [showSearch && (jsx("search", { children: jsx("input", { type: "text", placeholder: searchPlaceholder, onChange: (e) => onSearch?.(e.target.value) }) })), masterHeader && (jsx("header", { children: masterHeader })), jsx("ul", { children: loading
2760
+ ? Array.from({ length: skeletonRows }, (_unused, rowIndex) => (jsxs("li", { "aria-hidden": "true", children: [jsx(CwSkeleton, { variant: "circle", height: "2rem" }), jsxs("div", { className: styles$m.skeletonRow, children: [jsx(CwSkeleton, { variant: "text", width: MASTER_TITLE_WIDTHS[rowIndex % MASTER_TITLE_WIDTHS.length] }), jsx(CwSkeleton, { variant: "text", width: MASTER_SUBTITLE_WIDTH })] })] }, `skeleton_${rowIndex}`)))
2761
+ : items.map((item) => (jsx("li", { "data-master-key": item.key, "data-selected": item.key === selectedKey, "data-disabled": item.disabled, onClick: () => onSelect?.(item.key), children: item.content }, item.key))) }), masterFooter && (jsx("footer", { children: masterFooter }))] }), resizable && (jsx("div", { className: styles$m.resizer, "data-resizing": isResizing, onMouseDown: handleMouseDown })), jsx("section", { className: styles$m.detail, children: loading ? (jsxs("div", { className: styles$m.detailSkeleton, "aria-hidden": "true", children: [jsx(CwSkeleton, { variant: "text", width: "14rem", height: "1.5em" }), jsx(CwSkeleton, { variant: "text", width: "22rem" }), jsx(CwSkeleton, { variant: "text", width: "18rem" }), jsx(CwSkeleton, { variant: "text", width: "20rem" })] })) : selectedKey && detailContent
2630
2762
  ? detailContent
2631
2763
  : (jsx("div", { className: styles$m['detail-empty'], children: emptyDetail ?? 'Select an item to view details' })) })] }));
2632
2764
  };
2633
2765
 
2766
+ /*
2767
+ * Fixed rem widths (not percentages): dt and dd size to their content in the list
2768
+ * item, so a percentage-width skeleton would resolve to 100% of ~0 and collapse to
2769
+ * nothing. Fixed widths are visible in both row (dt beside dd) and column (dt above
2770
+ * dd) item layouts. Cycled by row so keys and values do not all look identical.
2771
+ */
2772
+ const SKELETON_KEY_WIDTHS = ["5rem", "6.5rem", "4.5rem", "6rem"];
2773
+ const SKELETON_VALUE_WIDTHS = ["8rem", "6rem", "9rem", "7rem"];
2634
2774
  /**
2635
2775
  * A component for displaying key-value pairs in a definition list format
2636
2776
  * Used for read-only display of structured data
@@ -2644,13 +2784,20 @@ const CwMasterDetail = ({ id, className, style, items, selectedKey, onSelect, de
2644
2784
  * emptyValue="N/A"
2645
2785
  * />
2646
2786
  */
2647
- const CwKeyValueList = ({ items, className = "", emptyValue = "-", direction = "row", groupLayout, itemLayout, ...htmlProps }) => {
2787
+ const CwKeyValueList = ({ items, className = "", emptyValue = "-", direction = "row", loading = false, skeletonRows = 4, groupLayout, itemLayout, ...htmlProps }) => {
2648
2788
  const itemDirection = itemLayout?.direction ?? direction;
2649
- return (jsx("dl", { className: `cw-keyvalue-list ${className}`, "data-direction": groupLayout?.direction, "data-align": groupLayout?.align, "data-justify": groupLayout?.justify, "data-gap": groupLayout?.gap, ...htmlProps, children: items.map(item => (jsxs("div", { className: `cw-keyvalue-list-item cw-flex-${itemDirection}`, "data-align": itemLayout?.align, "data-justify": itemLayout?.justify, "data-gap": itemLayout?.gap, children: [jsx("dt", { children: item.label }), jsx("dd", { children: item.value !== undefined && item.value !== null && item.value !== ""
2789
+ const renderItems = () => {
2790
+ if (loading) {
2791
+ // The whole list comes from one data load, so both key and value ghost.
2792
+ return Array.from({ length: skeletonRows }, (_unused, rowIndex) => (jsxs("div", { className: `cw-keyvalue-list-item cw-flex-${itemDirection}`, "data-align": itemLayout?.align, "data-justify": itemLayout?.justify, "data-gap": itemLayout?.gap, "aria-hidden": "true", children: [jsx("dt", { children: jsx(CwSkeleton, { variant: "text", width: SKELETON_KEY_WIDTHS[rowIndex % SKELETON_KEY_WIDTHS.length] }) }), jsx("dd", { children: jsx(CwSkeleton, { variant: "text", width: SKELETON_VALUE_WIDTHS[rowIndex % SKELETON_VALUE_WIDTHS.length] }) })] }, `skeleton_${rowIndex}`)));
2793
+ }
2794
+ return items.map(item => (jsxs("div", { className: `cw-keyvalue-list-item cw-flex-${itemDirection}`, "data-align": itemLayout?.align, "data-justify": itemLayout?.justify, "data-gap": itemLayout?.gap, children: [jsx("dt", { children: item.label }), jsx("dd", { children: item.value !== undefined && item.value !== null && item.value !== ""
2650
2795
  ? (React__default.isValidElement(item.value)
2651
2796
  ? item.value
2652
2797
  : `${item.value}${item.suffix ? ` ${item.suffix}` : ''}`)
2653
- : emptyValue })] }, item.key))) }));
2798
+ : emptyValue })] }, item.key)));
2799
+ };
2800
+ return (jsx("dl", { className: `cw-keyvalue-list ${className}`, "data-direction": groupLayout?.direction, "data-align": groupLayout?.align, "data-justify": groupLayout?.justify, "data-gap": groupLayout?.gap, "aria-busy": loading || undefined, ...htmlProps, children: renderItems() }));
2654
2801
  };
2655
2802
 
2656
2803
  var styles$l = {"sortableList":"cw-sortable-list-module__sortableList__PyLO-","sortableItem":"cw-sortable-list-module__sortableItem__FAnn2","readOnly":"cw-sortable-list-module__readOnly__r7GcH","dragging":"cw-sortable-list-module__dragging__MD715","moved":"cw-sortable-list-module__moved__sE6-N","expandedContent":"cw-sortable-list-module__expandedContent__Kocna","sortableHandle":"cw-sortable-list-module__sortableHandle__HvYBK","sortableContent":"cw-sortable-list-module__sortableContent__C6JhR","sortableTitle":"cw-sortable-list-module__sortableTitle__EgWXr","sortableExtraContent":"cw-sortable-list-module__sortableExtraContent__s4LSv","sortableActions":"cw-sortable-list-module__sortableActions__gwQOU","dropIndicator":"cw-sortable-list-module__dropIndicator__MNSF-","emptyMessage":"cw-sortable-list-module__emptyMessage__gMpaL"};
@@ -5115,8 +5262,8 @@ function CwNavMenu({ items, loading = false, isActive, renderLink = defaultRende
5115
5262
  }
5116
5263
  return (jsx("li", { "data-active": isActive?.(item) ? "true" : undefined, children: renderLink(item, jsxs(Fragment, { children: [item.icon && jsx(CwIcon, { iconId: item.icon, size: "medium" }), item.label, isFavorite?.(item) && jsx(CwIcon, { iconId: "star", size: "small", className: styles$8.favoriteStar })] })) }, item.id));
5117
5264
  };
5118
- return (jsxs("nav", { ...navProps, className: [styles$8.menu, className].filter(Boolean).join(" "), children: [favoritesSlot && (jsxs("details", { open: true, ...favoritesProps, className: [styles$8.favorites, favoritesProps?.className].filter(Boolean).join(" "), children: [jsxs("summary", { children: [jsx(CwIcon, { iconId: "star", size: "medium" }), favoritesLabel] }), jsx("div", { className: styles$8.favoritesContent, children: favoritesSlot })] })), beforeTreeSlot, jsx("ul", { children: loading
5119
- ? Array.from({ length: SKELETON_ROW_COUNT }, (_unused, index) => (jsx("li", { className: styles$8.skeleton }, index)))
5265
+ return (jsxs("nav", { ...navProps, className: [styles$8.menu, className].filter(Boolean).join(" "), "aria-busy": loading || undefined, children: [favoritesSlot && (jsxs("details", { open: true, ...favoritesProps, className: [styles$8.favorites, favoritesProps?.className].filter(Boolean).join(" "), children: [jsxs("summary", { children: [jsx(CwIcon, { iconId: "star", size: "medium" }), favoritesLabel] }), jsx("div", { className: styles$8.favoritesContent, children: favoritesSlot })] })), beforeTreeSlot, jsx("ul", { children: loading
5266
+ ? Array.from({ length: SKELETON_ROW_COUNT }, (_unused, index) => (jsx("li", { className: styles$8.skeleton, children: jsx(CwSkeleton, { height: "var(--cw-size-small)", radius: "var(--cw-border-radius-small)" }) }, index)))
5120
5267
  : visibleItems.map(item => renderItem(item, 1)) }), showEmptyMessage && jsx("p", { className: styles$8.emptyMessage, children: emptyMessage })] }));
5121
5268
  }
5122
5269
 
@@ -11441,4 +11588,4 @@ const CwFindCrewmember = ({ handleChange, placeHolder = "Search crew…", requir
11441
11588
  }, "data-direction": direction, children: [jsxs(CwAlign, { ...alignProps, itemProp: required ? "required" : "", children: [labelProps && (jsx(CwLabel, { ...labelProps, children: labelProps.text })), jsxs("div", { className: "cw-search-input-wrapper", ref: wrapperRef, children: [jsx("input", { ref: inputRef, type: "text", value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: handleInputFocus, placeholder: isInitialLoading ? "Loading…" : placeHolder, disabled: disabled, required: required, autoComplete: "off", "aria-expanded": showDropdown, "aria-haspopup": "listbox", role: "combobox", title: tooltipText }), (isLoading || isInitialLoading) && (jsx("div", { className: "cw-search-input-loading", children: jsx(CwIcon, { iconId: "spinner" }) })), jsx("div", { className: "cw-search-input-icons", children: inputValue && !disabled && !isInitialLoading ? (jsx(CwButton, { type: "button", onClick: handleClear, "aria-label": "Clear selected crewmember", variant: "icon", icon: "close", color: "neutral" })) : (jsx(CwIcon, { iconId: "person" })) })] })] }), renderPanel(jsx("div", { ref: panelRef, className: dropdownStyles.dropdown, style: panelStyle, role: "listbox", children: jsx("ul", { children: options.map((option, index) => (jsx("li", { className: `${dropdownStyles.option}${index === highlightedIndex ? ` ${dropdownStyles.optionFocused}` : ""}`, onClick: () => handleOptionSelect(option.value), onMouseDown: (e) => e.preventDefault(), onMouseEnter: () => setHighlightedIndex(index), role: "option", "aria-selected": index === highlightedIndex, children: option.text }, option.value))) }) }))] }));
11442
11589
  };
11443
11590
 
11444
- export { CblDragAndDrop, CwAccordionContainer, CwAlign, CwAnchoredMenu, CwBtnApprove, CwBtnCancel, CwBtnDelete, CwBtnEdit, CwBtnSave, CwButton, CwButtonSplit, CwButtonSwitch, CwCard, CwCardList, CwCheck, CwCheckbox, CwCheckboxGroup, CwChip, CwColorPicker, CwConfirmationPopup, CwContextMenu, CwDatePicker, CwDatePickerTemporal, CwDateRangePicker, CwDateRangePickerTemporal, CwDateTimePicker, CwDateTimePickerCompact, CwDateTimePickerTemporal, CwDialog, CwDigit, CwDisplayMessage, CwDropdown, CwDropdownFilter, CwExpandable, CwFileUploadMultiple, CwFindAirport, CwFindCrewmember, CwGenericTooltip, CwHeadingMain, CwHeadingSecond, CwIcon, CwImageArea, CwImageGallery, CwImageZoom, CwInput, CwInputColor, CwInputDateText, CwInputDatetime, CwInputImage, CwInputNumber, CwInputPhone, CwInputText, CwKeyValueList, CwLabel, CwLoading, CwMasterDetail, CwMessage, CwMessageManager, CwMessageType, CwModal, CwModalHover, CwModalReportFunctional, CwMultiFilter, CwMultiFilterTag, CwNavMenu, CwNote, CwOption, CwPopoverButton, CwRadioGroup, CwReportModal, CwScheduler, CwSearchAsync, CwSearchInput, CwSelect, CwSelectList, CwSelectListItems, CwSortableList, CwSortableTable, CwSuperScheduler, CwTable, CwTableGrouped, CwTableServerSide, CwTabs, CwTagSelector, CwTextArea, CwTime, CwTimePicker, CwToggle, CwTooltipManager, CwTooltipNew, CwTreeView, CwWeekdaySelector, DefaultRowHeader, OnClearPinned, OnClickContextMenu, OnClickEvent, OnClickRowEvent, OnClickRowHeader, OnClickUtc, OnDoubleClickEvent, OnDoubleClickRowEvent, OnDragEvent, OnDropCtrlEvent, OnDropEvent, OnEndClickHeaderEvent, OnLeftDragStart, OnMultiClickEvent, OnPinRow, OnRangeClickEvent, OnRightClickEvent, OnRightClickRow, OnRightDragStart, OnStartClickHeaderEvent, OnUnpinRow, PRESET_LIBRARY_TEMPORAL, PinRowHeader, Resource, Scheduler, SchedulerEvent, SuperScheduler, TooltipConstraintContext, UiEvent, Weekdays, cblEvent, configureCwLoading, eventIsVisible, filterNavItems, filterVisibleEvents, getCwLoadingDefaults, getDefaultDivisions, getEventSizes, getPresetsByKeysTemporal, itemsToMultiFilterTags, sortNavItems, useCwMessage, useSortableList, useSortableTable, useTooltipConstraint };
11591
+ export { CblDragAndDrop, CwAccordionContainer, CwAlign, CwAnchoredMenu, CwBtnApprove, CwBtnCancel, CwBtnDelete, CwBtnEdit, CwBtnSave, CwButton, CwButtonSplit, CwButtonSwitch, CwCard, CwCardList, CwCheck, CwCheckbox, CwCheckboxGroup, CwChip, CwColorPicker, CwConfirmationPopup, CwContextMenu, CwDatePicker, CwDatePickerTemporal, CwDateRangePicker, CwDateRangePickerTemporal, CwDateTimePicker, CwDateTimePickerCompact, CwDateTimePickerTemporal, CwDialog, CwDigit, CwDisplayMessage, CwDropdown, CwDropdownFilter, CwExpandable, CwFileUploadMultiple, CwFindAirport, CwFindCrewmember, CwGenericTooltip, CwHeadingMain, CwHeadingSecond, CwIcon, CwImageArea, CwImageGallery, CwImageZoom, CwInput, CwInputColor, CwInputDateText, CwInputDatetime, CwInputImage, CwInputNumber, CwInputPhone, CwInputText, CwKeyValueList, CwLabel, CwLoading, CwMasterDetail, CwMessage, CwMessageManager, CwMessageType, CwModal, CwModalHover, CwModalReportFunctional, CwMultiFilter, CwMultiFilterTag, CwNavMenu, CwNote, CwOption, CwPopoverButton, CwProgress, CwRadioGroup, CwReportModal, CwScheduler, CwSearchAsync, CwSearchInput, CwSelect, CwSelectList, CwSelectListItems, CwSkeleton, CwSortableList, CwSortableTable, CwSuperScheduler, CwTable, CwTableGrouped, CwTableServerSide, CwTabs, CwTagSelector, CwTextArea, CwTime, CwTimePicker, CwToggle, CwTooltipManager, CwTooltipNew, CwTreeView, CwWeekdaySelector, DefaultRowHeader, OnClearPinned, OnClickContextMenu, OnClickEvent, OnClickRowEvent, OnClickRowHeader, OnClickUtc, OnDoubleClickEvent, OnDoubleClickRowEvent, OnDragEvent, OnDropCtrlEvent, OnDropEvent, OnEndClickHeaderEvent, OnLeftDragStart, OnMultiClickEvent, OnPinRow, OnRangeClickEvent, OnRightClickEvent, OnRightClickRow, OnRightDragStart, OnStartClickHeaderEvent, OnUnpinRow, PRESET_LIBRARY_TEMPORAL, PinRowHeader, Resource, Scheduler, SchedulerEvent, SuperScheduler, TooltipConstraintContext, UiEvent, Weekdays, cblEvent, configureCwLoading, eventIsVisible, filterNavItems, filterVisibleEvents, getCwLoadingDefaults, getDefaultDivisions, getEventSizes, getPresetsByKeysTemporal, itemsToMultiFilterTags, sortNavItems, useCwMessage, useSortableList, useSortableTable, useTooltipConstraint };
@@ -0,0 +1,4 @@
1
+ import '../dist/index.css';
2
+ import "../src/common/styles/cw-global.css";
3
+ export declare const App: () => import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../playground/main.tsx"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,CAAC;AAG3B,OAAO,oCAAoC,CAAA;AAI3C,eAAO,MAAM,GAAG,+CAWf,CAAC"}
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import { type CwButtonProps } from "./CwButton";
3
+ export interface CwPopoverButtonProps extends Omit<CwButtonProps, "onClick" | "children"> {
4
+ /** Content rendered inside the floating panel */
5
+ children: React.ReactNode;
6
+ /** Panel width — CSS value (e.g. "auto", "16rem"). @default "auto" */
7
+ panelWidth?: string;
8
+ /** Horizontal alignment relative to the button. @default "bottom-start" */
9
+ placement?: "bottom-start" | "bottom-end";
10
+ /** Additional CSS class for the panel */
11
+ panelClassName?: string;
12
+ }
13
+ /**
14
+ * Button that toggles a floating panel with arbitrary children.
15
+ * Closes on click-outside or Escape.
16
+ *
17
+ * Designed as a composable primitive:
18
+ * - Column picker: put `<CwCheckboxGroup>` inside
19
+ * - Options menu: put toggles / links inside
20
+ * - Future CwTable integration: use internally for column visibility
21
+ *
22
+ * @example
23
+ * <CwPopoverButton text="Columns" icon="table" variant="outline">
24
+ * <CwCheckboxGroup options={opts} value={val} onChange={setVal} />
25
+ * </CwPopoverButton>
26
+ *
27
+ * @example
28
+ * <CwPopoverButton text="Options" icon="options" variant="outline" placement="bottom-end">
29
+ * <CwToggle labelText="Show assigned" checked={v} onChange={setV} />
30
+ * </CwPopoverButton>
31
+ */
32
+ export declare function CwPopoverButton({ children, panelWidth, placement, panelClassName, ...buttonProps }: CwPopoverButtonProps): import("react/jsx-runtime").JSX.Element;
33
+ //# sourceMappingURL=CwPopoverButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CwPopoverButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/control/action/button/CwPopoverButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,UAAU,CAAC;IACxF,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,cAAc,GAAG,YAAY,CAAC;IAC1C,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,EAC/B,QAAQ,EACR,UAAmB,EACnB,SAA0B,EAC1B,cAAc,EACd,GAAG,WAAW,EACd,EAAE,oBAAoB,2CA0CtB"}
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ export interface CwContextualMenuProps {
3
+ children?: any;
4
+ handleContextMenu?: any;
5
+ onClick?: any;
6
+ dataSourceContextMenu?: Array<CwDataItemsListProps>;
7
+ dataSourceContextMenu_schd?: Array<CwDataItemsListSchdProps>;
8
+ }
9
+ export interface CwDataItemsListProps {
10
+ idDataItem?: string | number | any;
11
+ dataItemContent?: string | any;
12
+ style?: React.CSSProperties;
13
+ styleDataItem?: React.CSSProperties;
14
+ }
15
+ export interface CwDataItemsListSchdProps {
16
+ key?: string;
17
+ text?: string;
18
+ icon?: string;
19
+ color?: string;
20
+ }
21
+ export interface CwBoxItemsProps {
22
+ id?: any;
23
+ children?: any;
24
+ style?: React.CSSProperties;
25
+ styleDataItem?: React.CSSProperties;
26
+ }
27
+ export declare function CwDataItem(cwBoxItemsProps: React.PropsWithChildren<CwBoxItemsProps>): import("react/jsx-runtime").JSX.Element;
28
+ export declare function CwContextualMenu(CwelltRightClickProps: React.PropsWithChildren<CwContextualMenuProps>): import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=CwContextualMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CwContextualMenu.d.ts","sourceRoot":"","sources":["../../../../../../src/components/control/action/contextual-menu/CwContextualMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd,qBAAqB,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEpD,0BAA0B,CAAC,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAGD,MAAM,WAAW,oBAAoB;IAEpC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;IAEnC,eAAe,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAE/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACpC;AAGD,MAAM,WAAW,wBAAwB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC/B,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACpC;AAED,wBAAgB,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,2CAQnF;AAED,wBAAgB,gBAAgB,CAAC,qBAAqB,EAAE,KAAK,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,2CAyFrG"}