@uva-glass/component-library 3.57.4 → 3.57.5

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 (183) hide show
  1. package/dist/{DataTable-Guuh0GZc.js → DataTable-UslvEf3c.js} +3 -3
  2. package/dist/{DataTable-Guuh0GZc.js.map → DataTable-UslvEf3c.js.map} +1 -1
  3. package/dist/{Lexical.prod-Dy5aDppc.js → Lexical.prod-BlUfEvo-.js} +1461 -1476
  4. package/dist/{Lexical.prod-Dy5aDppc.js.map → Lexical.prod-BlUfEvo-.js.map} +1 -1
  5. package/dist/{LexicalClipboard.prod-CS8a49uL.js → LexicalClipboard.prod-DQbm50C_.js} +132 -131
  6. package/dist/LexicalClipboard.prod-DQbm50C_.js.map +1 -0
  7. package/dist/LexicalHtml.prod-Czkg35Fe.js +1129 -0
  8. package/dist/LexicalHtml.prod-Czkg35Fe.js.map +1 -0
  9. package/dist/{LexicalLink.prod-DzgwWhQM.js → LexicalLink.prod-6gI2ABQo.js} +141 -141
  10. package/dist/{LexicalLink.prod-DzgwWhQM.js.map → LexicalLink.prod-6gI2ABQo.js.map} +1 -1
  11. package/dist/{LexicalList.prod-icY8mpm6.js → LexicalList.prod-CMGvSM1c.js} +265 -265
  12. package/dist/{LexicalList.prod-icY8mpm6.js.map → LexicalList.prod-CMGvSM1c.js.map} +1 -1
  13. package/dist/LexicalSelection.prod-DS_R6Cl1.js +99 -0
  14. package/dist/LexicalSelection.prod-DS_R6Cl1.js.map +1 -0
  15. package/dist/{LexicalTable.prod-Bf0is-op.js → LexicalTable.prod-D3FUVxbr.js} +582 -582
  16. package/dist/LexicalTable.prod-D3FUVxbr.js.map +1 -0
  17. package/dist/LexicalUtils.prod-CNWf_0sq.js +164 -0
  18. package/dist/LexicalUtils.prod-CNWf_0sq.js.map +1 -0
  19. package/dist/{LinkContextMenu-C8ehPbP8.js → LinkContextMenu-59-rbxa2.js} +2 -2
  20. package/dist/{LinkContextMenu-C8ehPbP8.js.map → LinkContextMenu-59-rbxa2.js.map} +1 -1
  21. package/dist/{PasteHandlerPlugin-CSo_lOE8.js → PasteHandlerPlugin-CTzYRyAx.js} +9 -9
  22. package/dist/{PasteHandlerPlugin-CSo_lOE8.js.map → PasteHandlerPlugin-CTzYRyAx.js.map} +1 -1
  23. package/dist/{Slider-Czd2xAGf.js → Slider-CqYFsgRL.js} +3 -3
  24. package/dist/{Slider-Czd2xAGf.js.map → Slider-CqYFsgRL.js.map} +1 -1
  25. package/dist/{TableCellResizerPlugin-Bb2blXnq.js → TableCellResizerPlugin-D-fX5I3p.js} +12 -5
  26. package/dist/{TableCellResizerPlugin-Bb2blXnq.js.map → TableCellResizerPlugin-D-fX5I3p.js.map} +1 -1
  27. package/dist/{chunk-5WKL7XVT-CvOIS3NE.js → chunk-SNLGT2ZI--XVeLAcq.js} +2540 -2881
  28. package/dist/chunk-SNLGT2ZI--XVeLAcq.js.map +1 -0
  29. package/dist/{client-CXlG3hNo.js → client-CTHUtwUP.js} +4 -4
  30. package/dist/{client-CXlG3hNo.js.map → client-CTHUtwUP.js.map} +1 -1
  31. package/dist/components/Accordion/Accordion.test.js +15 -14
  32. package/dist/components/Accordion/Accordion.test.js.map +1 -1
  33. package/dist/components/AccordionCard/AccordionCard.test.js +20 -19
  34. package/dist/components/AccordionCard/AccordionCard.test.js.map +1 -1
  35. package/dist/components/ActionList/ActionList.test.js +26 -25
  36. package/dist/components/ActionList/ActionList.test.js.map +1 -1
  37. package/dist/components/AppStatusBar/AppStatusBar.test.js +6 -5
  38. package/dist/components/AppStatusBar/AppStatusBar.test.js.map +1 -1
  39. package/dist/components/Attention/Attention.test.js +5 -4
  40. package/dist/components/Attention/Attention.test.js.map +1 -1
  41. package/dist/components/Backdrop/Backdrop.test.js +5 -4
  42. package/dist/components/Backdrop/Backdrop.test.js.map +1 -1
  43. package/dist/components/Buttons/Button.stories.js +1 -1
  44. package/dist/components/Buttons/Button.test.js +20 -19
  45. package/dist/components/Buttons/Button.test.js.map +1 -1
  46. package/dist/components/Buttons/LinkButton.stories.js +1 -1
  47. package/dist/components/Buttons/LinkButton.test.js +22 -21
  48. package/dist/components/Buttons/LinkButton.test.js.map +1 -1
  49. package/dist/components/Buttons/MenuButton.stories.js +1 -1
  50. package/dist/components/Buttons/MenuButton.test.js +20 -19
  51. package/dist/components/Buttons/MenuButton.test.js.map +1 -1
  52. package/dist/components/Card/Card.test.js +5 -4
  53. package/dist/components/Card/Card.test.js.map +1 -1
  54. package/dist/components/Checkbox/Checkbox.stories.js +1 -1
  55. package/dist/components/Checkbox/Checkbox.test.js +9 -8
  56. package/dist/components/Checkbox/Checkbox.test.js.map +1 -1
  57. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.stories.js +1 -1
  58. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js +16 -15
  59. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js.map +1 -1
  60. package/dist/components/CheckboxTree/CheckboxTree.js +1 -1
  61. package/dist/components/CheckboxTree/CheckboxTree.stories.js +3 -3
  62. package/dist/components/CheckboxTree/index.js +1 -1
  63. package/dist/components/Chip/Chip.stories.js +1 -1
  64. package/dist/components/ControlsButton/ControlsButton.stories.js +1 -1
  65. package/dist/components/DataTable/DataTable.js +1 -1
  66. package/dist/components/DataTable/DataTable.stories.js +1 -1
  67. package/dist/components/DataTable/index.js +1 -1
  68. package/dist/components/Drawer/Drawer.stories.js +1 -1
  69. package/dist/components/FeedbackBar/FeedbackBar.test.js +8 -7
  70. package/dist/components/FeedbackBar/FeedbackBar.test.js.map +1 -1
  71. package/dist/components/FormInput/FormInput.js +1 -1
  72. package/dist/components/FormInput/FormInput.stories.js +2 -2
  73. package/dist/components/FormInput/index.js +1 -1
  74. package/dist/components/IconButton/IconButton.stories.js +1 -1
  75. package/dist/components/InputField/InputField.stories.js +1 -1
  76. package/dist/components/Label/Label.test.js +12 -11
  77. package/dist/components/Label/Label.test.js.map +1 -1
  78. package/dist/components/MetaDataBar/MetaDataBar.test.js +5 -4
  79. package/dist/components/MetaDataBar/MetaDataBar.test.js.map +1 -1
  80. package/dist/components/ModalDialog/ModalDialog.stories.js +1 -1
  81. package/dist/components/MultiSelect/MultiSelect.js +1 -1
  82. package/dist/components/MultiSelect/MultiSelect.stories.js +2 -2
  83. package/dist/components/MultiSelect/components/MultiSelectHeader.js +1 -1
  84. package/dist/components/MultiSelect/index.js +1 -1
  85. package/dist/components/MultiSelectBox/MultiSelectBox.stories.js +1 -1
  86. package/dist/components/MultiSelectBox/MultiSelectBox.test.js +12 -11
  87. package/dist/components/MultiSelectBox/MultiSelectBox.test.js.map +1 -1
  88. package/dist/components/Notification/Notification.stories.js +1 -1
  89. package/dist/components/Notification/Notification.test.js +8 -7
  90. package/dist/components/Notification/Notification.test.js.map +1 -1
  91. package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js +1 -1
  92. package/dist/components/PeriodSelector/PeriodSelector.js +1 -1
  93. package/dist/components/PeriodSelector/PeriodSelector.stories.js +2 -2
  94. package/dist/components/PeriodSelector/index.js +1 -1
  95. package/dist/components/RadioGroup/RadioGroup.stories.js +1 -1
  96. package/dist/components/RadioGroup/Radiogroup.test.js +10 -9
  97. package/dist/components/RadioGroup/Radiogroup.test.js.map +1 -1
  98. package/dist/components/RadioTabSelector/RadioTabSelector.js +1 -1
  99. package/dist/components/RadioTabSelector/RadioTabSelector.stories.js +2 -2
  100. package/dist/components/RadioTabSelector/index.js +1 -1
  101. package/dist/components/RteEditor/EditorHeader/EditorHeader.js +1 -1
  102. package/dist/components/RteEditor/EditorHeader/index.js +1 -1
  103. package/dist/components/RteEditor/Plugins/BlockFormatPlugin/BlockFormatPlugin.js +4 -4
  104. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js +20 -20
  105. package/dist/components/RteEditor/Plugins/HistoryPlugin/HistoryPlugin.js +1 -1
  106. package/dist/components/RteEditor/Plugins/HistoryPlugin/index.js +1 -1
  107. package/dist/components/RteEditor/Plugins/LinkPlugin/AddLinkForm/AddLinkFrom.js +1 -1
  108. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js +1 -1
  109. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkPlugin.js +1 -1
  110. package/dist/components/RteEditor/Plugins/LinkPlugin/helpers.js +7 -2
  111. package/dist/components/RteEditor/Plugins/LinkPlugin/helpers.js.map +1 -0
  112. package/dist/components/RteEditor/Plugins/LinkPlugin/index.js +1 -1
  113. package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js +12 -12
  114. package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/PasteHandlerPlugin.js +1 -1
  115. package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/index.js +1 -1
  116. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/TableCellResizerPlugin.js +1 -1
  117. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/index.js +1 -1
  118. package/dist/components/RteEditor/Plugins/TablePlugin/AddTableFrom.js +1 -1
  119. package/dist/components/RteEditor/Plugins/TablePlugin/TablePlugin.js +1 -1
  120. package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js +2 -2
  121. package/dist/components/RteEditor/Plugins/TablePlugin/index.js +1 -1
  122. package/dist/components/RteEditor/Plugins/ToolbarPlugin/ToolbarPlugin.js +1 -1
  123. package/dist/components/RteEditor/Plugins/ToolbarPlugin/index.js +1 -1
  124. package/dist/components/RteEditor/Plugins/index.js +3 -3
  125. package/dist/components/RteEditor/RteEditor.js +1 -1
  126. package/dist/components/RteEditor/RteEditor.stories.js +1 -1
  127. package/dist/components/RteEditor/helpers.js +5 -5
  128. package/dist/components/RteEditor/index.js +1 -1
  129. package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js +14 -14
  130. package/dist/components/RteEditor/nodes/TableWrapperNode/TableWrapperNode.js +20 -19
  131. package/dist/components/RteEditor/nodes/TableWrapperNode/TableWrapperNode.js.map +1 -1
  132. package/dist/components/SelectListbox/SelectListBox.stories.js +1 -1
  133. package/dist/components/SelectListbox/SelectProvider.js +2 -1
  134. package/dist/components/SelectListbox/SelectProvider.js.map +1 -1
  135. package/dist/components/Slider/Slider.js +1 -1
  136. package/dist/components/Slider/Slider.stories.js +1 -1
  137. package/dist/components/Slider/index.js +1 -1
  138. package/dist/components/Sortable/Sortable.stories.js +1 -1
  139. package/dist/components/Sortable/components/SortableItem.js +2 -2
  140. package/dist/components/Sortable/components/SortableItem.js.map +1 -1
  141. package/dist/components/StatusBadge/StatusBadge.test.js +7 -6
  142. package/dist/components/StatusBadge/StatusBadge.test.js.map +1 -1
  143. package/dist/components/TextArea/TextArea.stories.js +1 -1
  144. package/dist/components/TextArea/TextArea.test.js +14 -13
  145. package/dist/components/TextArea/TextArea.test.js.map +1 -1
  146. package/dist/components/ToggleSwitch/ToggleSwitch.stories.js +1 -1
  147. package/dist/components/VarIndicator/VarIndicator.stories.js +1 -1
  148. package/dist/components/VarIndicator/VarIndicator.test.js +26 -25
  149. package/dist/components/VarIndicator/VarIndicator.test.js.map +1 -1
  150. package/dist/components/hooks/useResponsive.js +1 -1
  151. package/dist/components/hooks/useResponsive.js.map +1 -1
  152. package/dist/components/index.js +3 -3
  153. package/dist/{components-CgBF6db6.js → components-D2rPfyIW.js} +438 -408
  154. package/dist/components-D2rPfyIW.js.map +1 -0
  155. package/dist/{dist-oLwM--0y.js → dist-CuwCMU7Y.js} +4 -4
  156. package/dist/{dist-oLwM--0y.js.map → dist-CuwCMU7Y.js.map} +1 -1
  157. package/dist/{react.esm-DwWzhs9e.js → dom.esm-S0SD0DBW.js} +938 -1029
  158. package/dist/dom.esm-S0SD0DBW.js.map +1 -0
  159. package/dist/{esm-BXzGXYWZ.js → esm-Bfz5h0_d.js} +5 -5
  160. package/dist/{esm-BXzGXYWZ.js.map → esm-Bfz5h0_d.js.map} +1 -1
  161. package/dist/index.js +3 -3
  162. package/dist/{react-18-BwdnKC48.js → react-18-yf-KbRra.js} +3 -3
  163. package/dist/{react-18-BwdnKC48.js.map → react-18-yf-KbRra.js.map} +1 -1
  164. package/dist/react.esm-D50lAl1F.js +226 -0
  165. package/dist/react.esm-D50lAl1F.js.map +1 -0
  166. package/dist/setupTests.js +1 -1
  167. package/dist/storybook__react.d.js +22 -22
  168. package/dist/storybook__react.d.js.map +1 -1
  169. package/dist/{test-Gtly6H2f.js → test-BjtC-Q32.js} +3684 -6919
  170. package/dist/test-BjtC-Q32.js.map +1 -0
  171. package/package.json +13 -13
  172. package/dist/LexicalClipboard.prod-CS8a49uL.js.map +0 -1
  173. package/dist/LexicalHtml.prod-BtzosUOH.js +0 -1611
  174. package/dist/LexicalHtml.prod-BtzosUOH.js.map +0 -1
  175. package/dist/LexicalTable.prod-Bf0is-op.js.map +0 -1
  176. package/dist/LexicalUtils.prod-CjGUKarD.js +0 -259
  177. package/dist/LexicalUtils.prod-CjGUKarD.js.map +0 -1
  178. package/dist/chunk-5WKL7XVT-CvOIS3NE.js.map +0 -1
  179. package/dist/components-CgBF6db6.js.map +0 -1
  180. package/dist/helpers-MMNO9vlK.js +0 -34
  181. package/dist/helpers-MMNO9vlK.js.map +0 -1
  182. package/dist/react.esm-DwWzhs9e.js.map +0 -1
  183. package/dist/test-Gtly6H2f.js.map +0 -1
@@ -67,8 +67,8 @@ var l = {
67
67
  let e = () => {
68
68
  let e = x.current?.querySelector("tr");
69
69
  if (!e) return;
70
- let t = e.querySelectorAll("td");
71
- A(Array.from(t).map((e) => e.getBoundingClientRect().width));
70
+ let t = e.querySelectorAll("td"), n = Array.from(t).map((e) => e.getBoundingClientRect().width);
71
+ A(n);
72
72
  }, t = new ResizeObserver(() => {
73
73
  requestAnimationFrame(e);
74
74
  });
@@ -155,4 +155,4 @@ var l = {
155
155
  //#endregion
156
156
  export { d as t };
157
157
 
158
- //# sourceMappingURL=DataTable-Guuh0GZc.js.map
158
+ //# sourceMappingURL=DataTable-UslvEf3c.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable-Guuh0GZc.js","names":[],"sources":["../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx"],"sourcesContent":[".data-table__container {\n height: 100%;\n overflow-y: auto;\n position: relative;\n width: 100%;\n}\n\n.data-table__spacer {\n background-color: transparent;\n width: 0.0625rem;\n}\n\n.data-table {\n border-collapse: collapse;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n}\n\n.data-table--virtualized {\n border-collapse: collapse;\n left: 0;\n position: sticky;\n top: 0;\n width: 100%;\n z-index: 10;\n}\n\n.data-table__row,\n.data-table__header-row {\n background-color: var(--color-uva-white);\n border-bottom: 0.0625rem solid var(--color-grey-300);\n}\n\n.data-table__header-row {\n border-left: 0.0625rem solid transparent;\n border-right: 0.0625rem solid transparent;\n}\n\n.data-table__row {\n border-left: 0.0625rem solid var(--color-grey-300);\n border-right: 0.0625rem solid var(--color-grey-300);\n}\n\n.data-table__row--hoverable:hover {\n background-color: var(--color-grey-200);\n}\n\n.data-table__row--active {\n background-color: var(--color-navy-100);\n}\n\n.data-table__row--active.data-table__row--hoverable:hover {\n background-color: var(--color-navy-200);\n}\n\n.data-table__cell {\n overflow: hidden;\n padding: 0.6875rem 0.75rem;\n text-align: left;\n vertical-align: baseline;\n}\n\n.data-table__sticky-header {\n background-color: var(--color-uva-white);\n left: 0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.data-table__sticky-header::after {\n border-bottom: 0.0625rem solid var(--color-grey-300);\n content: \"\";\n display: block;\n height: 0.0625rem;\n left: 0;\n position: absolute;\n top: 100%;\n width: 100%;\n}\n\n.data-table__empty-state {\n color: var(--color-grey-600);\n font-size: 1rem;\n padding: 2rem;\n text-align: center;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type UIEvent } from 'react';\r\nimport { clsx } from 'clsx';\r\n\r\nimport styles from './DataTable.module.css';\r\nimport { useVirtualScroll } from './hooks/useVirtualScroll';\r\n\r\ntype DataTablePrimitive = string | number | boolean | null | undefined;\r\ntype DataTableRow = Record<string, DataTablePrimitive>;\r\nexport type DataTableColumnContent<TRow extends object> = ReactNode | ((row: TRow) => ReactNode);\r\ntype DataTableColumn<TRow extends object> = {\r\n key: Extract<keyof TRow, string>;\r\n label?: ReactNode | ((row: TRow) => ReactNode);\r\n cell?: ReactNode | ((row: TRow) => ReactNode);\r\n fixedWidth?: string;\r\n};\r\ntype DataRow<TRow extends object> = { visibleRows: Partial<TRow>[]; rowsToRender: TRow[] };\r\n\r\nexport type DataTableProps<TRow extends { id: string | number } = DataTableRow & { id: string | number }> = {\r\n /** The data to be displayed in the table */\r\n data: TRow[];\r\n /** The columns configuration for the table */\r\n columns?: DataTableColumn<TRow>[];\r\n /** Whether the table header should be sticky */\r\n stickyHeader?: boolean;\r\n /** Virtualization settings for the table */\r\n virtualize?: {\r\n /** The height of each row in pixels */\r\n rowHeight: number;\r\n /** The number of additional rows to render above and below the visible area for smoother scrolling */\r\n buffer?: number;\r\n } | null;\r\n /** The keys in the data objects that indicate whether a row is active (for styling purposes) */\r\n activeKeys?: (string | number)[];\r\n /** Message to display when there is no data */\r\n noDataMessage?: string;\r\n /** Disable hover styling on rows */\r\n noHover?: boolean;\r\n};\r\n\r\nconst DEFAULT_BUFFER = 4;\r\n\r\nexport const DataTable = <TRow extends { id: string | number } = DataTableRow & { id: string | number }>({\r\n data,\r\n columns,\r\n stickyHeader = false,\r\n virtualize = null,\r\n activeKeys = [],\r\n noDataMessage = 'No data to display',\r\n noHover = false,\r\n}: DataTableProps<TRow>) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const headerRef = useRef<HTMLTableSectionElement>(null);\r\n const headerRowRef = useRef<HTMLTableRowElement>(null);\r\n const tbodyRef = useRef<HTMLTableSectionElement>(null);\r\n const { visibleItems, totalHeight, offsetTop, onScroll, setContainerHeight } = useVirtualScroll({\r\n rowHeight: virtualize?.rowHeight ?? 0,\r\n buffer: virtualize?.buffer ?? DEFAULT_BUFFER,\r\n totalItems: data.length,\r\n });\r\n const throttling = useRef(false);\r\n const resizeThrottling = useRef(false);\r\n const [columnWidths, setColumnWidths] = useState<number[]>([]);\r\n\r\n const tableData: DataRow<TRow> = useMemo(() => {\r\n if (!columns) return { visibleRows: data, rowsToRender: data };\r\n const rowsToRender = virtualize ? visibleItems.map((index) => data[index]) : data;\r\n const visibleRows = rowsToRender.map((row) => {\r\n const newRow: Partial<TRow> = {};\r\n columns.forEach((col) => {\r\n newRow[col.key] = row[col.key];\r\n });\r\n return newRow;\r\n });\r\n return { visibleRows, rowsToRender };\r\n }, [columns, data, virtualize, visibleItems]);\r\n\r\n const handleScroll = useCallback(\r\n (event: UIEvent<HTMLDivElement>) => {\r\n if (!virtualize) return;\r\n\r\n const scrollTop = event.currentTarget.scrollTop;\r\n\r\n if (!throttling.current) {\r\n throttling.current = true;\r\n\r\n requestAnimationFrame(() => {\r\n onScroll({ currentTarget: { scrollTop } } as UIEvent<HTMLElement>);\r\n throttling.current = false;\r\n });\r\n }\r\n },\r\n [virtualize, onScroll]\r\n );\r\n\r\n const onRenderValue = (value: ((row: TRow) => ReactNode) | ReactNode, row?: TRow) =>\r\n typeof value === 'function' ? value(row!) : value;\r\n\r\n useEffect(() => {\r\n if (!virtualize || !containerRef.current) {\r\n return;\r\n }\r\n\r\n const handleResize = () => {\r\n const containerHeight = containerRef.current?.parentElement?.clientHeight ?? 0;\r\n\r\n if (!resizeThrottling.current) {\r\n resizeThrottling.current = true;\r\n\r\n requestAnimationFrame(() => {\r\n setContainerHeight(containerHeight);\r\n resizeThrottling.current = false;\r\n });\r\n }\r\n };\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n };\r\n }, [virtualize, setContainerHeight]);\r\n\r\n useEffect(() => {\r\n if (containerRef.current) {\r\n setContainerHeight(containerRef.current.parentElement?.clientHeight ?? 0);\r\n }\r\n }, [setContainerHeight]);\r\n\r\n useEffect(() => {\r\n containerRef.current?.scrollTo({ top: 0 });\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (!stickyHeader || !tbodyRef.current) return;\r\n\r\n const measureWidths = () => {\r\n const firstRow = tbodyRef.current?.querySelector('tr');\r\n if (!firstRow) return;\r\n\r\n const cells = firstRow.querySelectorAll('td');\r\n const widths = Array.from(cells).map((cell) => cell.getBoundingClientRect().width);\r\n\r\n setColumnWidths(widths);\r\n };\r\n\r\n const observer = new ResizeObserver(() => {\r\n requestAnimationFrame(measureWidths);\r\n });\r\n\r\n observer.observe(tbodyRef.current);\r\n\r\n measureWidths();\r\n\r\n return () => observer.disconnect();\r\n }, [stickyHeader, tableData.visibleRows]);\r\n\r\n return data.length ? (\r\n <div className={styles['data-table__container']} onScroll={handleScroll} ref={containerRef}>\r\n {/* sticky header if virtualized */}\r\n {virtualize && stickyHeader && columns && (\r\n <table className={styles['data-table--virtualized']}>\r\n <thead className={styles['data-table__sticky-header']}>\r\n <tr className={styles['data-table__header-row']} ref={headerRowRef}>\r\n {columns &&\r\n columns.map((column, index) => {\r\n const forcedWidth = columnWidths[index] ? `${columnWidths[index]}px` : column.fixedWidth;\r\n return (\r\n <th\r\n key={column.key}\r\n className={styles['data-table__cell']}\r\n style={{\r\n width: forcedWidth,\r\n minWidth: forcedWidth,\r\n maxWidth: forcedWidth,\r\n }}\r\n >\r\n {onRenderValue(column?.label)}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n </table>\r\n )}\r\n\r\n <div className={styles['data-table__spacer']} style={{ height: totalHeight }} />\r\n <table\r\n className={styles['data-table']}\r\n style={virtualize ? { transform: `translateY(${offsetTop}px)` } : undefined}\r\n >\r\n {/* header */}\r\n <thead className={clsx({ [styles['data-table__sticky-header']]: stickyHeader })} ref={headerRef}>\r\n <tr className={styles['data-table__header-row']}>\r\n {!virtualize || !stickyHeader ? (\r\n columns &&\r\n columns.map((column, index) => {\r\n const forcedWidth = columnWidths[index] ? `${columnWidths[index]}px` : column.fixedWidth;\r\n return (\r\n <th key={column.key} className={styles['data-table__cell']} style={{ width: forcedWidth }}>\r\n {onRenderValue(column?.label)}\r\n </th>\r\n );\r\n })\r\n ) : (\r\n <th colSpan={columns?.length} style={{ height: headerRowRef.current?.clientHeight }} />\r\n )}\r\n </tr>\r\n </thead>\r\n\r\n {/* data rows */}\r\n <tbody ref={tbodyRef}>\r\n {tableData.visibleRows.map((row, index) => (\r\n <tr\r\n key={tableData.rowsToRender[index].id}\r\n className={clsx(styles['data-table__row'], {\r\n [styles['data-table__row--active']]: activeKeys.includes(tableData.rowsToRender[index].id),\r\n [styles['data-table__row--hoverable']]: !noHover,\r\n })}\r\n >\r\n {Object.entries(row as Record<string, unknown>).map(([key]) => {\r\n const column = columns?.find((col) => col.key === key);\r\n return (\r\n <td\r\n key={key}\r\n className={styles['data-table__cell']}\r\n style={{\r\n width: column?.fixedWidth,\r\n height: virtualize ? virtualize.rowHeight : undefined,\r\n maxHeight: virtualize ? virtualize.rowHeight : undefined,\r\n }}\r\n >\r\n {onRenderValue(column?.cell, tableData.rowsToRender[index])}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className={styles['data-table__empty-state']}>{noDataMessage}</div>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable-UslvEf3c.js","names":[],"sources":["../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx"],"sourcesContent":[".data-table__container {\n height: 100%;\n overflow-y: auto;\n position: relative;\n width: 100%;\n}\n\n.data-table__spacer {\n background-color: transparent;\n width: 0.0625rem;\n}\n\n.data-table {\n border-collapse: collapse;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n}\n\n.data-table--virtualized {\n border-collapse: collapse;\n left: 0;\n position: sticky;\n top: 0;\n width: 100%;\n z-index: 10;\n}\n\n.data-table__row,\n.data-table__header-row {\n background-color: var(--color-uva-white);\n border-bottom: 0.0625rem solid var(--color-grey-300);\n}\n\n.data-table__header-row {\n border-left: 0.0625rem solid transparent;\n border-right: 0.0625rem solid transparent;\n}\n\n.data-table__row {\n border-left: 0.0625rem solid var(--color-grey-300);\n border-right: 0.0625rem solid var(--color-grey-300);\n}\n\n.data-table__row--hoverable:hover {\n background-color: var(--color-grey-200);\n}\n\n.data-table__row--active {\n background-color: var(--color-navy-100);\n}\n\n.data-table__row--active.data-table__row--hoverable:hover {\n background-color: var(--color-navy-200);\n}\n\n.data-table__cell {\n overflow: hidden;\n padding: 0.6875rem 0.75rem;\n text-align: left;\n vertical-align: baseline;\n}\n\n.data-table__sticky-header {\n background-color: var(--color-uva-white);\n left: 0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.data-table__sticky-header::after {\n border-bottom: 0.0625rem solid var(--color-grey-300);\n content: \"\";\n display: block;\n height: 0.0625rem;\n left: 0;\n position: absolute;\n top: 100%;\n width: 100%;\n}\n\n.data-table__empty-state {\n color: var(--color-grey-600);\n font-size: 1rem;\n padding: 2rem;\n text-align: center;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type UIEvent } from 'react';\r\nimport { clsx } from 'clsx';\r\n\r\nimport styles from './DataTable.module.css';\r\nimport { useVirtualScroll } from './hooks/useVirtualScroll';\r\n\r\ntype DataTablePrimitive = string | number | boolean | null | undefined;\r\ntype DataTableRow = Record<string, DataTablePrimitive>;\r\nexport type DataTableColumnContent<TRow extends object> = ReactNode | ((row: TRow) => ReactNode);\r\ntype DataTableColumn<TRow extends object> = {\r\n key: Extract<keyof TRow, string>;\r\n label?: ReactNode | ((row: TRow) => ReactNode);\r\n cell?: ReactNode | ((row: TRow) => ReactNode);\r\n fixedWidth?: string;\r\n};\r\ntype DataRow<TRow extends object> = { visibleRows: Partial<TRow>[]; rowsToRender: TRow[] };\r\n\r\nexport type DataTableProps<TRow extends { id: string | number } = DataTableRow & { id: string | number }> = {\r\n /** The data to be displayed in the table */\r\n data: TRow[];\r\n /** The columns configuration for the table */\r\n columns?: DataTableColumn<TRow>[];\r\n /** Whether the table header should be sticky */\r\n stickyHeader?: boolean;\r\n /** Virtualization settings for the table */\r\n virtualize?: {\r\n /** The height of each row in pixels */\r\n rowHeight: number;\r\n /** The number of additional rows to render above and below the visible area for smoother scrolling */\r\n buffer?: number;\r\n } | null;\r\n /** The keys in the data objects that indicate whether a row is active (for styling purposes) */\r\n activeKeys?: (string | number)[];\r\n /** Message to display when there is no data */\r\n noDataMessage?: string;\r\n /** Disable hover styling on rows */\r\n noHover?: boolean;\r\n};\r\n\r\nconst DEFAULT_BUFFER = 4;\r\n\r\nexport const DataTable = <TRow extends { id: string | number } = DataTableRow & { id: string | number }>({\r\n data,\r\n columns,\r\n stickyHeader = false,\r\n virtualize = null,\r\n activeKeys = [],\r\n noDataMessage = 'No data to display',\r\n noHover = false,\r\n}: DataTableProps<TRow>) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const headerRef = useRef<HTMLTableSectionElement>(null);\r\n const headerRowRef = useRef<HTMLTableRowElement>(null);\r\n const tbodyRef = useRef<HTMLTableSectionElement>(null);\r\n const { visibleItems, totalHeight, offsetTop, onScroll, setContainerHeight } = useVirtualScroll({\r\n rowHeight: virtualize?.rowHeight ?? 0,\r\n buffer: virtualize?.buffer ?? DEFAULT_BUFFER,\r\n totalItems: data.length,\r\n });\r\n const throttling = useRef(false);\r\n const resizeThrottling = useRef(false);\r\n const [columnWidths, setColumnWidths] = useState<number[]>([]);\r\n\r\n const tableData: DataRow<TRow> = useMemo(() => {\r\n if (!columns) return { visibleRows: data, rowsToRender: data };\r\n const rowsToRender = virtualize ? visibleItems.map((index) => data[index]) : data;\r\n const visibleRows = rowsToRender.map((row) => {\r\n const newRow: Partial<TRow> = {};\r\n columns.forEach((col) => {\r\n newRow[col.key] = row[col.key];\r\n });\r\n return newRow;\r\n });\r\n return { visibleRows, rowsToRender };\r\n }, [columns, data, virtualize, visibleItems]);\r\n\r\n const handleScroll = useCallback(\r\n (event: UIEvent<HTMLDivElement>) => {\r\n if (!virtualize) return;\r\n\r\n const scrollTop = event.currentTarget.scrollTop;\r\n\r\n if (!throttling.current) {\r\n throttling.current = true;\r\n\r\n requestAnimationFrame(() => {\r\n onScroll({ currentTarget: { scrollTop } } as UIEvent<HTMLElement>);\r\n throttling.current = false;\r\n });\r\n }\r\n },\r\n [virtualize, onScroll]\r\n );\r\n\r\n const onRenderValue = (value: ((row: TRow) => ReactNode) | ReactNode, row?: TRow) =>\r\n typeof value === 'function' ? value(row!) : value;\r\n\r\n useEffect(() => {\r\n if (!virtualize || !containerRef.current) {\r\n return;\r\n }\r\n\r\n const handleResize = () => {\r\n const containerHeight = containerRef.current?.parentElement?.clientHeight ?? 0;\r\n\r\n if (!resizeThrottling.current) {\r\n resizeThrottling.current = true;\r\n\r\n requestAnimationFrame(() => {\r\n setContainerHeight(containerHeight);\r\n resizeThrottling.current = false;\r\n });\r\n }\r\n };\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n };\r\n }, [virtualize, setContainerHeight]);\r\n\r\n useEffect(() => {\r\n if (containerRef.current) {\r\n setContainerHeight(containerRef.current.parentElement?.clientHeight ?? 0);\r\n }\r\n }, [setContainerHeight]);\r\n\r\n useEffect(() => {\r\n containerRef.current?.scrollTo({ top: 0 });\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (!stickyHeader || !tbodyRef.current) return;\r\n\r\n const measureWidths = () => {\r\n const firstRow = tbodyRef.current?.querySelector('tr');\r\n if (!firstRow) return;\r\n\r\n const cells = firstRow.querySelectorAll('td');\r\n const widths = Array.from(cells).map((cell) => cell.getBoundingClientRect().width);\r\n\r\n setColumnWidths(widths);\r\n };\r\n\r\n const observer = new ResizeObserver(() => {\r\n requestAnimationFrame(measureWidths);\r\n });\r\n\r\n observer.observe(tbodyRef.current);\r\n\r\n measureWidths();\r\n\r\n return () => observer.disconnect();\r\n }, [stickyHeader, tableData.visibleRows]);\r\n\r\n return data.length ? (\r\n <div className={styles['data-table__container']} onScroll={handleScroll} ref={containerRef}>\r\n {/* sticky header if virtualized */}\r\n {virtualize && stickyHeader && columns && (\r\n <table className={styles['data-table--virtualized']}>\r\n <thead className={styles['data-table__sticky-header']}>\r\n <tr className={styles['data-table__header-row']} ref={headerRowRef}>\r\n {columns &&\r\n columns.map((column, index) => {\r\n const forcedWidth = columnWidths[index] ? `${columnWidths[index]}px` : column.fixedWidth;\r\n return (\r\n <th\r\n key={column.key}\r\n className={styles['data-table__cell']}\r\n style={{\r\n width: forcedWidth,\r\n minWidth: forcedWidth,\r\n maxWidth: forcedWidth,\r\n }}\r\n >\r\n {onRenderValue(column?.label)}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n </table>\r\n )}\r\n\r\n <div className={styles['data-table__spacer']} style={{ height: totalHeight }} />\r\n <table\r\n className={styles['data-table']}\r\n style={virtualize ? { transform: `translateY(${offsetTop}px)` } : undefined}\r\n >\r\n {/* header */}\r\n <thead className={clsx({ [styles['data-table__sticky-header']]: stickyHeader })} ref={headerRef}>\r\n <tr className={styles['data-table__header-row']}>\r\n {!virtualize || !stickyHeader ? (\r\n columns &&\r\n columns.map((column, index) => {\r\n const forcedWidth = columnWidths[index] ? `${columnWidths[index]}px` : column.fixedWidth;\r\n return (\r\n <th key={column.key} className={styles['data-table__cell']} style={{ width: forcedWidth }}>\r\n {onRenderValue(column?.label)}\r\n </th>\r\n );\r\n })\r\n ) : (\r\n <th colSpan={columns?.length} style={{ height: headerRowRef.current?.clientHeight }} />\r\n )}\r\n </tr>\r\n </thead>\r\n\r\n {/* data rows */}\r\n <tbody ref={tbodyRef}>\r\n {tableData.visibleRows.map((row, index) => (\r\n <tr\r\n key={tableData.rowsToRender[index].id}\r\n className={clsx(styles['data-table__row'], {\r\n [styles['data-table__row--active']]: activeKeys.includes(tableData.rowsToRender[index].id),\r\n [styles['data-table__row--hoverable']]: !noHover,\r\n })}\r\n >\r\n {Object.entries(row as Record<string, unknown>).map(([key]) => {\r\n const column = columns?.find((col) => col.key === key);\r\n return (\r\n <td\r\n key={key}\r\n className={styles['data-table__cell']}\r\n style={{\r\n width: column?.fixedWidth,\r\n height: virtualize ? virtualize.rowHeight : undefined,\r\n maxHeight: virtualize ? virtualize.rowHeight : undefined,\r\n }}\r\n >\r\n {onRenderValue(column?.cell, tableData.rowsToRender[index])}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className={styles['data-table__empty-state']}>{noDataMessage}</div>\r\n );\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;GCuCM,IAAiB,GAEV,KAA4F,EACvG,SACA,YACA,kBAAe,IACf,gBAAa,MACb,gBAAa,CAAC,GACd,mBAAgB,sBAChB,aAAU,SACgB;CAC1B,IAAM,IAAe,EAAuB,IAAI,GAC1C,IAAY,EAAgC,IAAI,GAChD,IAAe,EAA4B,IAAI,GAC/C,IAAW,EAAgC,IAAI,GAC/C,EAAE,iBAAc,gBAAa,cAAW,aAAU,0BAAuB,EAAiB;EAC9F,WAAW,GAAY,aAAa;EACpC,QAAQ,GAAY,UAAU;EAC9B,YAAY,EAAK;CACnB,CAAC,GACK,IAAa,EAAO,EAAK,GACzB,IAAmB,EAAO,EAAK,GAC/B,CAAC,GAAc,KAAmB,EAAmB,CAAC,CAAC,GAEvD,IAA2B,QAAc;EAC7C,IAAI,CAAC,GAAS,OAAO;GAAE,aAAa;GAAM,cAAc;EAAK;EAC7D,IAAM,IAAe,IAAa,EAAa,KAAK,MAAU,EAAK,EAAM,IAAI;EAQ7E,OAAO;GAAE,aAPW,EAAa,KAAK,MAAQ;IAC5C,IAAM,IAAwB,CAAC;IAI/B,OAHA,EAAQ,SAAS,MAAQ;KACvB,EAAO,EAAI,OAAO,EAAI,EAAI;IAC5B,CAAC,GACM;GACT,CACS;GAAa;EAAa;CACrC,GAAG;EAAC;EAAS;EAAM;EAAY;CAAY,CAAC,GAEtC,IAAe,GAClB,MAAmC;EAClC,IAAI,CAAC,GAAY;EAEjB,IAAM,IAAY,EAAM,cAAc;EAEtC,AAAK,EAAW,YACd,EAAW,UAAU,IAErB,4BAA4B;GAE1B,AADA,EAAS,EAAE,eAAe,EAAE,aAAU,EAAE,CAAyB,GACjE,EAAW,UAAU;EACvB,CAAC;CAEL,GACA,CAAC,GAAY,CAAQ,CACvB,GAEM,KAAiB,GAA+C,MACpE,OAAO,KAAU,aAAa,EAAM,CAAI,IAAI;CA4D9C,OA1DA,QAAgB;EACd,IAAI,CAAC,KAAc,CAAC,EAAa,SAC/B;EAGF,IAAM,UAAqB;GACzB,IAAM,IAAkB,EAAa,SAAS,eAAe,gBAAgB;GAE7E,AAAK,EAAiB,YACpB,EAAiB,UAAU,IAE3B,4BAA4B;IAE1B,AADA,EAAmB,CAAe,GAClC,EAAiB,UAAU;GAC7B,CAAC;EAEL;EAGA,OAFA,OAAO,iBAAiB,UAAU,CAAY,SAEjC;GACX,OAAO,oBAAoB,UAAU,CAAY;EACnD;CACF,GAAG,CAAC,GAAY,CAAkB,CAAC,GAEnC,QAAgB;EACd,AAAI,EAAa,WACf,EAAmB,EAAa,QAAQ,eAAe,gBAAgB,CAAC;CAE5E,GAAG,CAAC,CAAkB,CAAC,GAEvB,QAAgB;EACd,EAAa,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC;CAC3C,GAAG,CAAC,CAAI,CAAC,GAET,QAAgB;EACd,IAAI,CAAC,KAAgB,CAAC,EAAS,SAAS;EAExC,IAAM,UAAsB;GAC1B,IAAM,IAAW,EAAS,SAAS,cAAc,IAAI;GACrD,IAAI,CAAC,GAAU;GAEf,IAAM,IAAQ,EAAS,iBAAiB,IAAI,GACtC,IAAS,MAAM,KAAK,CAAK,CAAC,CAAC,KAAK,MAAS,EAAK,sBAAsB,CAAC,CAAC,KAAK;GAEjF,EAAgB,CAAM;EACxB,GAEM,IAAW,IAAI,qBAAqB;GACxC,sBAAsB,CAAa;EACrC,CAAC;EAMD,OAJA,EAAS,QAAQ,EAAS,OAAO,GAEjC,EAAc,SAED,EAAS,WAAW;CACnC,GAAG,CAAC,GAAc,EAAU,WAAW,CAAC,GAEjC,EAAK,SACV,kBAAC,OAAD;EAAK,WAAW,EAAO;EAA0B,UAAU;EAAc,KAAK;YAA9E;GAEG,KAAc,KAAgB,KAC7B,kBAAC,SAAD;IAAO,WAAW,EAAO;cACvB,kBAAC,SAAD;KAAO,WAAW,EAAO;eACvB,kBAAC,MAAD;MAAI,WAAW,EAAO;MAA2B,KAAK;gBACnD,KACC,EAAQ,KAAK,GAAQ,MAAU;OAC7B,IAAM,IAAc,EAAa,KAAS,GAAG,EAAa,GAAO,MAAM,EAAO;OAC9E,OACE,kBAAC,MAAD;QAEE,WAAW,EAAO;QAClB,OAAO;SACL,OAAO;SACP,UAAU;SACV,UAAU;QACZ;kBAEC,EAAc,GAAQ,KAAK;OAC1B,GATG,EAAO,GASV;MAER,CAAC;KACD,CAAA;IACC,CAAA;GACF,CAAA;GAGT,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAuB,OAAO,EAAE,QAAQ,EAAY;GAAI,CAAA;GAC/E,kBAAC,SAAD;IACE,WAAW,EAAO;IAClB,OAAO,IAAa,EAAE,WAAW,cAAc,EAAU,KAAK,IAAI,KAAA;cAFpE,CAKE,kBAAC,SAAD;KAAO,WAAW,EAAK,GAAG,EAAO,+BAA+B,EAAa,CAAC;KAAG,KAAK;eACpF,kBAAC,MAAD;MAAI,WAAW,EAAO;gBACnB,CAAC,KAAc,CAAC,IACf,KACA,EAAQ,KAAK,GAAQ,MAAU;OAC7B,IAAM,IAAc,EAAa,KAAS,GAAG,EAAa,GAAO,MAAM,EAAO;OAC9E,OACE,kBAAC,MAAD;QAAqB,WAAW,EAAO;QAAqB,OAAO,EAAE,OAAO,EAAY;kBACrF,EAAc,GAAQ,KAAK;OAC1B,GAFK,EAAO,GAEZ;MAER,CAAC,IAED,kBAAC,MAAD;OAAI,SAAS,GAAS;OAAQ,OAAO,EAAE,QAAQ,EAAa,SAAS,aAAa;MAAI,CAAA;KAEtF,CAAA;IACC,CAAA,GAGP,kBAAC,SAAD;KAAO,KAAK;eACT,EAAU,YAAY,KAAK,GAAK,MAC/B,kBAAC,MAAD;MAEE,WAAW,EAAK,EAAO,oBAAoB;QACxC,EAAO,6BAA6B,EAAW,SAAS,EAAU,aAAa,EAAM,CAAC,EAAE;QACxF,EAAO,gCAAgC,CAAC;MAC3C,CAAC;gBAEA,OAAO,QAAQ,CAA8B,CAAC,CAAC,KAAK,CAAC,OAAS;OAC7D,IAAM,IAAS,GAAS,MAAM,MAAQ,EAAI,QAAQ,CAAG;OACrD,OACE,kBAAC,MAAD;QAEE,WAAW,EAAO;QAClB,OAAO;SACL,OAAO,GAAQ;SACf,QAAQ,IAAa,EAAW,YAAY,KAAA;SAC5C,WAAW,IAAa,EAAW,YAAY,KAAA;QACjD;kBAEC,EAAc,GAAQ,MAAM,EAAU,aAAa,EAAM;OACxD,GATG,CASH;MAER,CAAC;KACC,GAtBG,EAAU,aAAa,EAAM,CAAC,EAsBjC,CACL;IACI,CAAA,CACF;;EACJ;MAEL,kBAAC,OAAD;EAAK,WAAW,EAAO;YAA6B;CAAmB,CAAA;AAE3E"}