eidos-ui 2.0.0 → 2.1.0

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 (223) hide show
  1. package/dist/Avatar.types-BY-C09Ke.d.cts +23 -0
  2. package/dist/Avatar.types-BY-C09Ke.d.ts +23 -0
  3. package/dist/{Header.types-BZi80bWz.d.cts → Header.types-B3QtuiL-.d.cts} +7 -3
  4. package/dist/{Header.types-DJt-q01P.d.ts → Header.types-C6w0FBY8.d.ts} +7 -3
  5. package/dist/{Table.types-Cl5gR8r9.d.cts → Table.types-CPj-udMc.d.cts} +95 -0
  6. package/dist/{Table.types-jhPb7JNU.d.ts → Table.types-CZZ7QWAI.d.ts} +95 -0
  7. package/dist/Toolbar.types-DSk8z2iy.d.cts +38 -0
  8. package/dist/Toolbar.types-RN0klQzu.d.ts +38 -0
  9. package/dist/alert/index.cjs +4 -4
  10. package/dist/alert/index.d.cts +2 -1
  11. package/dist/alert/index.d.ts +2 -1
  12. package/dist/alert/index.js +3 -3
  13. package/dist/avatar/index.d.cts +3 -21
  14. package/dist/avatar/index.d.ts +3 -21
  15. package/dist/button/index.cjs +3 -3
  16. package/dist/button/index.js +2 -2
  17. package/dist/chip/index.cjs +3 -3
  18. package/dist/chip/index.js +2 -2
  19. package/dist/{chunk-KIXFSXIN.cjs → chunk-3E7TKBQI.cjs} +5 -3
  20. package/dist/chunk-3E7TKBQI.cjs.map +1 -0
  21. package/dist/{chunk-ZBKJ3EMK.cjs → chunk-442U3W6R.cjs} +3 -3
  22. package/dist/{chunk-ZBKJ3EMK.cjs.map → chunk-442U3W6R.cjs.map} +1 -1
  23. package/dist/{chunk-YQLCPKGV.js → chunk-5HUZYY54.js} +6 -4
  24. package/dist/chunk-5HUZYY54.js.map +1 -0
  25. package/dist/{chunk-G5IGADJI.cjs → chunk-5VM2256W.cjs} +7 -11
  26. package/dist/chunk-5VM2256W.cjs.map +1 -0
  27. package/dist/{chunk-Z4ZY7L7W.js → chunk-5ZL6PYU3.js} +3 -3
  28. package/dist/{chunk-A3NE2C7C.js → chunk-67RFMV6K.js} +2 -2
  29. package/dist/{chunk-2U7UJOOB.cjs → chunk-6HUHH6Y4.cjs} +17 -15
  30. package/dist/chunk-6HUHH6Y4.cjs.map +1 -0
  31. package/dist/{chunk-5WROPW7Z.js → chunk-A7WQINIG.js} +3 -3
  32. package/dist/{chunk-DKZTDYH5.cjs → chunk-AAA6TR5I.cjs} +3 -3
  33. package/dist/{chunk-DKZTDYH5.cjs.map → chunk-AAA6TR5I.cjs.map} +1 -1
  34. package/dist/{chunk-A7Z2QAFZ.cjs → chunk-APK5OQRV.cjs} +5 -5
  35. package/dist/{chunk-A7Z2QAFZ.cjs.map → chunk-APK5OQRV.cjs.map} +1 -1
  36. package/dist/{chunk-ISABZ2VX.cjs → chunk-AXBYJ2OY.cjs} +9 -9
  37. package/dist/{chunk-ISABZ2VX.cjs.map → chunk-AXBYJ2OY.cjs.map} +1 -1
  38. package/dist/{chunk-6RGJAQCU.cjs → chunk-B5G5XVFJ.cjs} +5 -5
  39. package/dist/{chunk-6RGJAQCU.cjs.map → chunk-B5G5XVFJ.cjs.map} +1 -1
  40. package/dist/{chunk-MW2S7PZ7.cjs → chunk-D5IY2HUV.cjs} +5 -5
  41. package/dist/{chunk-MW2S7PZ7.cjs.map → chunk-D5IY2HUV.cjs.map} +1 -1
  42. package/dist/{chunk-FMPXSF3H.cjs → chunk-DAXZRNNO.cjs} +4 -4
  43. package/dist/{chunk-FMPXSF3H.cjs.map → chunk-DAXZRNNO.cjs.map} +1 -1
  44. package/dist/{chunk-AJZTVCST.js → chunk-EXITZVB2.js} +24 -9
  45. package/dist/chunk-EXITZVB2.js.map +1 -0
  46. package/dist/{chunk-AYMD4D4M.cjs → chunk-EZME5CLK.cjs} +3 -3
  47. package/dist/{chunk-AYMD4D4M.cjs.map → chunk-EZME5CLK.cjs.map} +1 -1
  48. package/dist/{chunk-IV4LM3MB.js → chunk-F26VIKNF.js} +9 -11
  49. package/dist/chunk-F26VIKNF.js.map +1 -0
  50. package/dist/{chunk-WPTMMOA6.cjs → chunk-G77YR73R.cjs} +10 -13
  51. package/dist/chunk-G77YR73R.cjs.map +1 -0
  52. package/dist/chunk-GEHL4LKK.cjs +32 -0
  53. package/dist/chunk-GEHL4LKK.cjs.map +1 -0
  54. package/dist/chunk-GGSII6Y2.cjs +921 -0
  55. package/dist/chunk-GGSII6Y2.cjs.map +1 -0
  56. package/dist/{chunk-3VRMTWUS.js → chunk-GHQ6SQPI.js} +7 -10
  57. package/dist/chunk-GHQ6SQPI.js.map +1 -0
  58. package/dist/{chunk-56B6RLOE.js → chunk-GI6VJYOS.js} +4 -4
  59. package/dist/{chunk-56B6RLOE.js.map → chunk-GI6VJYOS.js.map} +1 -1
  60. package/dist/{chunk-UGMONQGH.cjs → chunk-GR2PMCVN.cjs} +10 -12
  61. package/dist/chunk-GR2PMCVN.cjs.map +1 -0
  62. package/dist/{chunk-7AHZTHXR.cjs → chunk-GT22EGJP.cjs} +5 -5
  63. package/dist/{chunk-7AHZTHXR.cjs.map → chunk-GT22EGJP.cjs.map} +1 -1
  64. package/dist/{chunk-ALGX5X4N.js → chunk-IFVT5UCY.js} +3 -3
  65. package/dist/{chunk-5CLC3FJO.js → chunk-KBG77JHC.js} +13 -2
  66. package/dist/chunk-KBG77JHC.js.map +1 -0
  67. package/dist/{chunk-HLNKIAE5.cjs → chunk-KJZUYC4X.cjs} +5 -5
  68. package/dist/{chunk-HLNKIAE5.cjs.map → chunk-KJZUYC4X.cjs.map} +1 -1
  69. package/dist/{chunk-4BQM5F76.cjs → chunk-LFWPQYWX.cjs} +3 -3
  70. package/dist/{chunk-4BQM5F76.cjs.map → chunk-LFWPQYWX.cjs.map} +1 -1
  71. package/dist/{chunk-XVSODE4K.cjs → chunk-LIFUHQH5.cjs} +35 -20
  72. package/dist/chunk-LIFUHQH5.cjs.map +1 -0
  73. package/dist/{chunk-PJC7NZUV.cjs → chunk-LUL6RZ4M.cjs} +3 -3
  74. package/dist/{chunk-PJC7NZUV.cjs.map → chunk-LUL6RZ4M.cjs.map} +1 -1
  75. package/dist/{chunk-4UJ7LG4W.cjs → chunk-N2IGZIEX.cjs} +3 -3
  76. package/dist/{chunk-4UJ7LG4W.cjs.map → chunk-N2IGZIEX.cjs.map} +1 -1
  77. package/dist/{chunk-3LHQUOGP.js → chunk-NGVOXM7P.js} +3 -3
  78. package/dist/{chunk-WTXASLBB.js → chunk-O5WEKLNF.js} +2 -2
  79. package/dist/{chunk-BOB5JJ7F.js → chunk-P7IQY5YH.js} +2 -2
  80. package/dist/{chunk-VZYLJSV5.js → chunk-R4PU2TBM.js} +2 -2
  81. package/dist/{chunk-P2GCAVUZ.js → chunk-RAZRQ57B.js} +2 -2
  82. package/dist/{chunk-K7IFNKMN.js → chunk-REVK7IGN.js} +2 -2
  83. package/dist/{chunk-6U2H26A4.cjs → chunk-RHOT7AEI.cjs} +3 -3
  84. package/dist/{chunk-6U2H26A4.cjs.map → chunk-RHOT7AEI.cjs.map} +1 -1
  85. package/dist/{chunk-MH2CD2QT.js → chunk-RKA2OJRT.js} +207 -102
  86. package/dist/chunk-RKA2OJRT.js.map +1 -0
  87. package/dist/{chunk-JC4WLVBG.js → chunk-RWOX2NJN.js} +2 -2
  88. package/dist/{chunk-4LM33LDV.js → chunk-S3CT536K.js} +2 -2
  89. package/dist/{chunk-4M3LZLOH.js → chunk-SHYSLWQG.js} +2 -2
  90. package/dist/{chunk-EQEV7GPT.cjs → chunk-SKEWTQJ7.cjs} +5 -5
  91. package/dist/{chunk-EQEV7GPT.cjs.map → chunk-SKEWTQJ7.cjs.map} +1 -1
  92. package/dist/{chunk-2ZENLZEQ.cjs → chunk-SKTDGCWJ.cjs} +232 -127
  93. package/dist/chunk-SKTDGCWJ.cjs.map +1 -0
  94. package/dist/{chunk-2BXCIWL7.js → chunk-SN6EWQDJ.js} +3 -3
  95. package/dist/{chunk-DW2YDWGN.js → chunk-TEJIPPZR.js} +2 -2
  96. package/dist/{chunk-OGKD5PLS.cjs → chunk-TRLBYA5G.cjs} +4 -4
  97. package/dist/{chunk-OGKD5PLS.cjs.map → chunk-TRLBYA5G.cjs.map} +1 -1
  98. package/dist/{chunk-WE5FTQGD.js → chunk-VHMOKXUT.js} +3 -7
  99. package/dist/chunk-VHMOKXUT.js.map +1 -0
  100. package/dist/{chunk-S77GR5YQ.cjs → chunk-VHQTDITV.cjs} +3 -3
  101. package/dist/{chunk-S77GR5YQ.cjs.map → chunk-VHQTDITV.cjs.map} +1 -1
  102. package/dist/{chunk-3HMKE2GJ.js → chunk-VSTQEHVZ.js} +6 -4
  103. package/dist/chunk-VSTQEHVZ.js.map +1 -0
  104. package/dist/{chunk-HNUTV3HR.cjs → chunk-WUBQJVB7.cjs} +3 -3
  105. package/dist/{chunk-HNUTV3HR.cjs.map → chunk-WUBQJVB7.cjs.map} +1 -1
  106. package/dist/{chunk-S7TWEVC3.js → chunk-Y53HCLGW.js} +2 -2
  107. package/dist/{chunk-WIE7HDIM.js → chunk-YJXZR7RL.js} +2 -2
  108. package/dist/{chunk-IJYYHBZC.cjs → chunk-Z4SLV6WG.cjs} +3 -3
  109. package/dist/{chunk-IJYYHBZC.cjs.map → chunk-Z4SLV6WG.cjs.map} +1 -1
  110. package/dist/chunk-ZEZK664O.js +921 -0
  111. package/dist/chunk-ZEZK664O.js.map +1 -0
  112. package/dist/{chunk-JMD3P4CY.js → chunk-ZHFPV43D.js} +2 -2
  113. package/dist/combobox/index.cjs +4 -4
  114. package/dist/combobox/index.js +3 -3
  115. package/dist/context-menu/index.cjs +4 -4
  116. package/dist/context-menu/index.js +3 -3
  117. package/dist/data-grid/index.cjs +13 -13
  118. package/dist/data-grid/index.d.cts +49 -3
  119. package/dist/data-grid/index.d.ts +49 -3
  120. package/dist/data-grid/index.js +12 -12
  121. package/dist/date-picker/index.cjs +6 -6
  122. package/dist/date-picker/index.js +5 -5
  123. package/dist/drawer/index.cjs +4 -4
  124. package/dist/drawer/index.d.cts +2 -1
  125. package/dist/drawer/index.d.ts +2 -1
  126. package/dist/drawer/index.js +3 -3
  127. package/dist/empty-state/index.d.cts +2 -2
  128. package/dist/empty-state/index.d.ts +2 -2
  129. package/dist/header/index.cjs +4 -4
  130. package/dist/header/index.d.cts +2 -2
  131. package/dist/header/index.d.ts +2 -2
  132. package/dist/header/index.js +3 -3
  133. package/dist/index.cjs +29 -29
  134. package/dist/index.css +318 -73
  135. package/dist/index.d.cts +5 -4
  136. package/dist/index.d.ts +5 -4
  137. package/dist/index.js +28 -28
  138. package/dist/inline-edit/index.cjs +4 -4
  139. package/dist/inline-edit/index.js +3 -3
  140. package/dist/input/index.cjs +3 -3
  141. package/dist/input/index.js +2 -2
  142. package/dist/menu/index.cjs +3 -3
  143. package/dist/menu/index.js +2 -2
  144. package/dist/modal/index.cjs +4 -4
  145. package/dist/modal/index.d.cts +2 -1
  146. package/dist/modal/index.d.ts +2 -1
  147. package/dist/modal/index.js +3 -3
  148. package/dist/navigation/index.cjs +4 -4
  149. package/dist/navigation/index.js +3 -3
  150. package/dist/page-layout/index.cjs +8 -8
  151. package/dist/page-layout/index.d.cts +3 -2
  152. package/dist/page-layout/index.d.ts +3 -2
  153. package/dist/page-layout/index.js +7 -7
  154. package/dist/pagination/index.cjs +6 -6
  155. package/dist/pagination/index.js +5 -5
  156. package/dist/popover/index.cjs +2 -2
  157. package/dist/popover/index.d.cts +2 -2
  158. package/dist/popover/index.d.ts +2 -2
  159. package/dist/popover/index.js +1 -1
  160. package/dist/segmented-control/index.cjs +3 -3
  161. package/dist/segmented-control/index.js +2 -2
  162. package/dist/select/index.cjs +4 -4
  163. package/dist/select/index.js +3 -3
  164. package/dist/snackbar/index.cjs +4 -4
  165. package/dist/snackbar/index.js +3 -3
  166. package/dist/split-button/index.cjs +4 -4
  167. package/dist/split-button/index.js +3 -3
  168. package/dist/table/index.cjs +11 -11
  169. package/dist/table/index.d.cts +3 -3
  170. package/dist/table/index.d.ts +3 -3
  171. package/dist/table/index.js +10 -10
  172. package/dist/tabs/index.cjs +3 -3
  173. package/dist/tabs/index.js +2 -2
  174. package/dist/tag-input/index.cjs +4 -4
  175. package/dist/tag-input/index.js +3 -3
  176. package/dist/textarea/index.cjs +3 -3
  177. package/dist/textarea/index.js +2 -2
  178. package/dist/toolbar/index.cjs +5 -5
  179. package/dist/toolbar/index.d.cts +3 -2
  180. package/dist/toolbar/index.d.ts +3 -2
  181. package/dist/toolbar/index.js +4 -4
  182. package/package.json +6 -5
  183. package/dist/Toolbar.types-BGD57Uhm.d.ts +0 -22
  184. package/dist/Toolbar.types-tQkLmPIu.d.cts +0 -22
  185. package/dist/chunk-2U7UJOOB.cjs.map +0 -1
  186. package/dist/chunk-2ZENLZEQ.cjs.map +0 -1
  187. package/dist/chunk-3HMKE2GJ.js.map +0 -1
  188. package/dist/chunk-3VRMTWUS.js.map +0 -1
  189. package/dist/chunk-5CLC3FJO.js.map +0 -1
  190. package/dist/chunk-AJZTVCST.js.map +0 -1
  191. package/dist/chunk-G5IGADJI.cjs.map +0 -1
  192. package/dist/chunk-GOR642KK.cjs +0 -21
  193. package/dist/chunk-GOR642KK.cjs.map +0 -1
  194. package/dist/chunk-IV4LM3MB.js.map +0 -1
  195. package/dist/chunk-KIXFSXIN.cjs.map +0 -1
  196. package/dist/chunk-MH2CD2QT.js.map +0 -1
  197. package/dist/chunk-QONDJ5VM.cjs +0 -744
  198. package/dist/chunk-QONDJ5VM.cjs.map +0 -1
  199. package/dist/chunk-UGMONQGH.cjs.map +0 -1
  200. package/dist/chunk-VSFKM7FE.js +0 -744
  201. package/dist/chunk-VSFKM7FE.js.map +0 -1
  202. package/dist/chunk-WE5FTQGD.js.map +0 -1
  203. package/dist/chunk-WPTMMOA6.cjs.map +0 -1
  204. package/dist/chunk-XVSODE4K.cjs.map +0 -1
  205. package/dist/chunk-YQLCPKGV.js.map +0 -1
  206. /package/dist/{chunk-Z4ZY7L7W.js.map → chunk-5ZL6PYU3.js.map} +0 -0
  207. /package/dist/{chunk-A3NE2C7C.js.map → chunk-67RFMV6K.js.map} +0 -0
  208. /package/dist/{chunk-5WROPW7Z.js.map → chunk-A7WQINIG.js.map} +0 -0
  209. /package/dist/{chunk-ALGX5X4N.js.map → chunk-IFVT5UCY.js.map} +0 -0
  210. /package/dist/{chunk-3LHQUOGP.js.map → chunk-NGVOXM7P.js.map} +0 -0
  211. /package/dist/{chunk-WTXASLBB.js.map → chunk-O5WEKLNF.js.map} +0 -0
  212. /package/dist/{chunk-BOB5JJ7F.js.map → chunk-P7IQY5YH.js.map} +0 -0
  213. /package/dist/{chunk-VZYLJSV5.js.map → chunk-R4PU2TBM.js.map} +0 -0
  214. /package/dist/{chunk-P2GCAVUZ.js.map → chunk-RAZRQ57B.js.map} +0 -0
  215. /package/dist/{chunk-K7IFNKMN.js.map → chunk-REVK7IGN.js.map} +0 -0
  216. /package/dist/{chunk-JC4WLVBG.js.map → chunk-RWOX2NJN.js.map} +0 -0
  217. /package/dist/{chunk-4LM33LDV.js.map → chunk-S3CT536K.js.map} +0 -0
  218. /package/dist/{chunk-4M3LZLOH.js.map → chunk-SHYSLWQG.js.map} +0 -0
  219. /package/dist/{chunk-2BXCIWL7.js.map → chunk-SN6EWQDJ.js.map} +0 -0
  220. /package/dist/{chunk-DW2YDWGN.js.map → chunk-TEJIPPZR.js.map} +0 -0
  221. /package/dist/{chunk-S7TWEVC3.js.map → chunk-Y53HCLGW.js.map} +0 -0
  222. /package/dist/{chunk-WIE7HDIM.js.map → chunk-YJXZR7RL.js.map} +0 -0
  223. /package/dist/{chunk-JMD3P4CY.js.map → chunk-ZHFPV43D.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Table/Table.component.tsx"],"sourcesContent":["import { useState, useMemo, useLayoutEffect, useRef } from 'react';\nimport React from 'react';\nimport {\n ChevronsUpDown,\n ArrowUp,\n ArrowDown,\n X,\n Check,\n Download,\n Columns3,\n AlignJustify,\n GripVertical,\n FolderOpen,\n SearchX,\n} from 'lucide-react';\nimport { DndContext, PointerSensor, KeyboardSensor, useSensor, useSensors } from '@dnd-kit/core';\nimport type { DragEndEvent } from '@dnd-kit/core';\nimport {\n SortableContext,\n horizontalListSortingStrategy,\n useSortable,\n sortableKeyboardCoordinates,\n arrayMove,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport type { RowKey } from '../../utils';\nimport type { TableColumn, TableProps, TableFilters, FilterValue } from './Table.types';\n\n// `TableColumn<T>` is a discriminated union, so `render` is a union of\n// function types and its parameter type is their intersection. The table\n// walks columns generically and looks values up by a runtime string key, so\n// it widens the renderer once here rather than narrowing the union at the\n// call site - the union is enforced where it matters, at the consumer's.\ntype TableCellRenderer<T> = (value: unknown, item: T) => React.ReactNode;\n\nexport type { TableColumn, TableProps, TableFilters, FilterValue };\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { Dropdown } from '../Dropdown';\nimport { EmptyState } from '../EmptyState';\nimport { Pagination } from '../Pagination';\nimport { SplitButton } from '../SplitButton';\nimport { Spinner } from '../Spinner';\nimport { TableFiltersDropdown } from './TableFiltersDropdown.component';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ntype Density = 'compact' | 'comfortable' | 'spacious';\n\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n];\n\n// ── CSV helpers ───────────────────────────────────────────────────────────────\n\nfunction escapeCsvValue(value: string): string {\n if (value.includes(',') || value.includes('\\n') || value.includes('\"')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\n// ── SortableColumnHeader ──────────────────────────────────────────────────────\n// Defined as a standalone component so it can legally call useSortable().\n// Only rendered when draggableColumns=true (inside a DndContext + SortableContext).\n\ninterface SortableThProps {\n id: string;\n column: { label: string };\n isSortable: boolean;\n isCurrentlySorted: boolean;\n sortDirection: 'asc' | 'desc' | null;\n alignment: string;\n columnType: string;\n columnWidth: string | undefined;\n pinnedClass: string;\n stickyStyle: React.CSSProperties;\n onSortClick: () => void;\n}\n\nfunction SortableColumnHeader({\n id,\n column,\n isSortable,\n isCurrentlySorted,\n sortDirection,\n alignment,\n columnType,\n columnWidth,\n pinnedClass,\n stickyStyle,\n onSortClick,\n}: SortableThProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n const transformStr = CSS.Transform.toString(transform);\n\n const thClassName = [\n 'eidos-table-header-cell',\n `eidos-table-header-cell-${columnType}`,\n isSortable ? 'eidos-table-sortable' : '',\n isCurrentlySorted ? 'eidos-table-sorted' : '',\n `eidos-table-align-${alignment}`,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <th\n ref={setNodeRef as React.LegacyRef<HTMLTableCellElement>}\n className={thClassName}\n style={{\n width: columnWidth,\n ...stickyStyle,\n ...(transformStr ? { transform: transformStr } : {}),\n transition: transition ?? undefined,\n opacity: isDragging ? 0.5 : 1,\n }}\n data-col-key={id}\n onClick={() => isSortable && onSortClick()}\n {...attributes}\n >\n {/* Grip - absolutely positioned in the left padding zone so it never\n displaces the column label or causes layout shift on hover. */}\n <span\n className=\"eidos-table-drag-handle\"\n {...listeners}\n onClick={(e) => e.stopPropagation()}\n title=\"Drag to reorder\"\n >\n <GripVertical size={12} />\n </span>\n <div className={`eidos-table-header-content eidos-table-align-${alignment}`}>\n <span className=\"eidos-table-header-label\">{column.label}</span>\n {isSortable && (\n <div className=\"eidos-table-sort-indicator\">\n {sortDirection === 'asc' && <ArrowUp size={14} />}\n {sortDirection === 'desc' && <ArrowDown size={14} />}\n {!sortDirection && <ChevronsUpDown size={14} />}\n </div>\n )}\n </div>\n </th>\n );\n}\n\n// ── Table ─────────────────────────────────────────────────────────────────────\n\nexport const Table = <T extends object>({\n data,\n columns,\n loading = false,\n emptyMessage = 'No data available',\n onRowClick,\n className,\n showFooter = false,\n totalItems,\n showPagination = false,\n pageSize = 25,\n pageSizeOptions = [10, 25, 50, 100],\n onSortChange,\n currentSort,\n filters = {},\n onFiltersChange,\n defaultFilters,\n showFilters = false,\n // Selection\n selectable = false,\n rowKey,\n selectedRows: controlledSelected,\n defaultSelectedRows = [],\n onSelectionChange,\n bulkActions = [],\n // New features\n density = 'comfortable',\n showDensity = false,\n showColumnVisibility = false,\n showExport = false,\n draggableColumns = false,\n onColumnReorder,\n}: TableProps<T>) => {\n // ── Column ordering (drag-reorder) ────────────────────────────────────────\n const [columnOrder, setColumnOrder] = useState<string[]>(() => columns.map((c) => String(c.key)));\n\n // Derived-state reset: when the set of column keys changes, reset the order.\n // Calling setState during render is the React-idiomatic way to do this.\n const columnKeysSignature = columns.map((c) => String(c.key)).join('\\0');\n const prevKeysRef = useRef(columnKeysSignature);\n if (prevKeysRef.current !== columnKeysSignature) {\n prevKeysRef.current = columnKeysSignature;\n setColumnOrder(columns.map((c) => String(c.key)));\n }\n\n const orderedColumns = useMemo(() => {\n const orderMap = new Map(columnOrder.map((key, idx) => [key, idx]));\n return [...columns].sort((a, b) => {\n const ai = orderMap.get(String(a.key)) ?? Infinity;\n const bi = orderMap.get(String(b.key)) ?? Infinity;\n return ai - bi;\n });\n }, [columns, columnOrder]);\n\n // ── Density (internal state when showDensity=true) ────────────────────────\n const [internalDensity, setInternalDensity] = useState<Density>(density as Density);\n // When showDensity is true the table owns density; otherwise respect the prop.\n const effectiveDensity: Density = showDensity ? internalDensity : (density as Density);\n\n // ── Column visibility ─────────────────────────────────────────────────────\n const [hiddenColumnKeys, setHiddenColumnKeys] = useState<Set<string>>(() => new Set<string>());\n\n const visibleColumns = useMemo(\n () => orderedColumns.filter((c) => !hiddenColumnKeys.has(String(c.key))),\n [orderedColumns, hiddenColumnKeys],\n );\n\n // ── Pinned / sticky columns ────────────────────────────────────────────────\n const theadRef = useRef<HTMLTableSectionElement>(null);\n const [pinnedOffsets, setPinnedOffsets] = useState<\n Map<string, { side: 'left' | 'right'; offset: number }>\n >(new Map());\n\n useLayoutEffect(() => {\n const hasPinned = visibleColumns.some((c) => c.pin);\n if (!hasPinned || !theadRef.current) {\n setPinnedOffsets(new Map());\n return;\n }\n\n const headerRow = theadRef.current.querySelector('tr');\n if (!headerRow) return;\n\n const cells = Array.from(headerRow.querySelectorAll<HTMLTableCellElement>('th[data-col-key]'));\n\n const newOffsets = new Map<string, { side: 'left' | 'right'; offset: number }>();\n\n // Left-pinned: scan left-to-right.\n // Checkbox (when selectable) counts as a left-pinned element.\n let leftAccum = 0;\n for (const cell of cells) {\n const key = cell.dataset.colKey!;\n if (key === '__checkbox__') {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n leftAccum += cell.offsetWidth;\n } else {\n const col = visibleColumns.find((c) => String(c.key) === key);\n if (col?.pin === 'left') {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n leftAccum += cell.offsetWidth;\n }\n }\n }\n\n // Right-pinned: scan right-to-left.\n let rightAccum = 0;\n for (let i = cells.length - 1; i >= 0; i--) {\n const cell = cells[i];\n const key = cell.dataset.colKey!;\n const col = visibleColumns.find((c) => String(c.key) === key);\n if (col?.pin === 'right') {\n newOffsets.set(key, { side: 'right', offset: rightAccum });\n rightAccum += cell.offsetWidth;\n }\n }\n\n setPinnedOffsets(newOffsets);\n }, [visibleColumns, selectable]);\n\n // ── Selection state (controlled / uncontrolled) ──────────────────────────\n const isControlledSelection = controlledSelected !== undefined;\n const [internalSelected, setInternalSelected] = useState<string[]>(defaultSelectedRows);\n const selectedSet = useMemo(\n () => new Set(isControlledSelection ? controlledSelected : internalSelected),\n [isControlledSelection, controlledSelected, internalSelected],\n );\n\n /** Stable string key for a row - uses `rowKey` prop, then \"id\", then index. */\n const getRowKey = (item: T, index: number): string => {\n if (rowKey) return String(item[rowKey]);\n if ('id' in item) return String(item.id);\n return String(index);\n };\n\n const commitSelection = (keys: string[]) => {\n if (!isControlledSelection) setInternalSelected(keys);\n const rows = data.filter((item, idx) => keys.includes(getRowKey(item, idx)));\n onSelectionChange?.(keys, rows);\n };\n\n const toggleRow = (key: string) => {\n const next = selectedSet.has(key)\n ? [...selectedSet].filter((k) => k !== key)\n : [...selectedSet, key];\n commitSelection(next);\n };\n\n const allKeys = useMemo(\n () => data.map((item, idx) => getRowKey(item, idx)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data, rowKey],\n );\n\n const allSelected = allKeys.length > 0 && allKeys.every((k) => selectedSet.has(k));\n const someSelected = !allSelected && allKeys.some((k) => selectedSet.has(k));\n\n const toggleAll = () => {\n commitSelection(allSelected ? [] : allKeys);\n };\n\n const clearSelection = () => commitSelection([]);\n\n // ── Pagination ────────────────────────────────────────────────────────────\n const [currentPage, setCurrentPage] = useState(1);\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\n\n const displayData = useMemo(() => {\n if (!showPagination) return data;\n const startIndex = (currentPage - 1) * currentPageSize;\n return data.slice(startIndex, startIndex + currentPageSize);\n }, [data, showPagination, currentPage, currentPageSize]);\n\n const totalPages = Math.ceil(data.length / currentPageSize);\n\n const handleSort = (key: string) => {\n const newDirection =\n currentSort?.key === key && currentSort?.direction === 'asc' ? 'desc' : 'asc';\n // `key` came from a rendered column, so it is a field of `T` by\n // construction - the public callback is narrowed for the caller's benefit,\n // which this internal string can't prove on its own.\n onSortChange?.(key as RowKey<T>, newDirection);\n };\n\n const handlePageChange = (page: number) => setCurrentPage(page);\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1);\n };\n\n // ── Derived UI state ──────────────────────────────────────────────────────\n const hasSelection = selectedSet.size > 0;\n const showToolbar =\n (showFilters && !!onFiltersChange) ||\n showColumnVisibility ||\n showExport ||\n showDensity ||\n (selectable && hasSelection);\n\n const selectedItems = useMemo(\n () => data.filter((item, idx) => selectedSet.has(getRowKey(item, idx))),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data, selectedSet, rowKey],\n );\n\n // ── CSV Export ────────────────────────────────────────────────────────────\n const getRawValue = (item: T, column: TableColumn<T>): string => {\n const value =\n typeof column.key === 'string' && column.key.includes('.')\n ? (column.key as string)\n .split('.')\n .reduce(\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\n item as unknown,\n )\n : item[column.key as keyof T];\n return String(value ?? '');\n };\n\n const handleExportCsv = () => {\n const headers = visibleColumns.map((c) => escapeCsvValue(c.label)).join(',');\n const rows = data.map((item) =>\n visibleColumns.map((col) => escapeCsvValue(getRawValue(item, col))).join(','),\n );\n const csv = [headers, ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'export.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n // ── DnD setup ─────────────────────────────────────────────────────────────\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n const activeId = String(active.id);\n const overId = String(over.id);\n const oldIndex = columnOrder.indexOf(activeId);\n const newIndex = columnOrder.indexOf(overId);\n if (oldIndex === -1 || newIndex === -1) return;\n\n const newOrder = arrayMove(columnOrder, oldIndex, newIndex);\n setColumnOrder(newOrder);\n\n if (onColumnReorder) {\n const orderMap = new Map(newOrder.map((key, idx) => [key, idx]));\n const reordered = [...columns].sort((a, b) => {\n const ai = orderMap.get(String(a.key)) ?? Infinity;\n const bi = orderMap.get(String(b.key)) ?? Infinity;\n return ai - bi;\n });\n onColumnReorder(reordered);\n }\n };\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n /** Returns sticky style + className for body <td> cells (zIndex: 1). */\n const getCellPinnedProps = (\n colKey: string,\n ): { style: React.CSSProperties; className: string } => {\n const pinInfo = pinnedOffsets.get(colKey);\n if (!pinInfo) return { style: {}, className: '' };\n return {\n style: {\n position: 'sticky',\n [pinInfo.side]: pinInfo.offset,\n zIndex: 1,\n },\n className:\n pinInfo.side === 'left'\n ? 'eidos-table-cell--pinned-left'\n : 'eidos-table-cell--pinned-right',\n };\n };\n\n /** Returns sticky style + className for header <th> cells (zIndex: 3). */\n const getHeaderPinnedProps = (\n colKey: string,\n ): { style: React.CSSProperties; className: string } => {\n const pinInfo = pinnedOffsets.get(colKey);\n if (!pinInfo) return { style: {}, className: '' };\n return {\n style: {\n position: 'sticky',\n [pinInfo.side]: pinInfo.offset,\n zIndex: 3,\n },\n className:\n pinInfo.side === 'left'\n ? 'eidos-table-header-cell--pinned-left'\n : 'eidos-table-header-cell--pinned-right',\n };\n };\n\n // ── Density class ─────────────────────────────────────────────────────────\n const densityClass = effectiveDensity !== 'comfortable' ? `eidos-table--${effectiveDensity}` : '';\n\n // ── Loading ───────────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div className={`eidos-table-container ${className || ''}`}>\n <div className=\"eidos-table-loading\">\n <Spinner size=\"md\" />\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // ── Density panel (Dropdown content) ──────────────────────────────────────\n const densityPanel = (\n <div className=\"eidos-table-menu-panel\">\n {DENSITY_OPTIONS.map((option) => (\n <button\n key={option.value}\n className={[\n 'eidos-table-menu-item',\n effectiveDensity === option.value ? 'eidos-table-menu-item--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setInternalDensity(option.value)}\n >\n <span className=\"eidos-table-menu-item-check\">\n {effectiveDensity === option.value && <Check size={14} />}\n </span>\n <span>{option.label}</span>\n </button>\n ))}\n </div>\n );\n\n // ── Column visibility panel (Dropdown content) ────────────────────────────\n const columnVisibilityPanel = (\n <div className=\"eidos-table-menu-panel\">\n {/* Use orderedColumns so list order mirrors current column order */}\n {orderedColumns.map((col) => {\n const key = String(col.key);\n const isVisible = !hiddenColumnKeys.has(key);\n const isLastVisible = visibleColumns.length === 1 && isVisible;\n return (\n <button\n key={key}\n className={['eidos-table-menu-item', isVisible ? 'eidos-table-menu-item--active' : '']\n .filter(Boolean)\n .join(' ')}\n disabled={isLastVisible}\n onClick={() => {\n setHiddenColumnKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }}\n >\n <Checkbox\n checked={isVisible}\n disabled={isLastVisible}\n size=\"sm\"\n onChange={() => {\n /* click handled by parent button */\n }}\n />\n <span>{col.label}</span>\n </button>\n );\n })}\n </div>\n );\n\n // ── SortableContext items: visible column keys only ───────────────────────\n const sortableItems = visibleColumns.map((c) => String(c.key));\n\n // ── Main JSX ──────────────────────────────────────────────────────────────\n const tableContent = (\n <div className={`eidos-table-container ${className || ''}`}>\n {/* ── Toolbar ───────────────────────────────────────────────────────── */}\n {showToolbar && (\n <div className=\"eidos-table-toolbar\">\n {/* Left - bulk actions / selection info */}\n <div className=\"eidos-table-toolbar-left\">\n {selectable && hasSelection && (\n <>\n <span className=\"eidos-table-selection-count\">{selectedSet.size} selected</span>\n\n {bulkActions.length > 0 && (\n <div className=\"eidos-table-bulk-actions\">\n {bulkActions.map((action) => {\n const isDisabled =\n typeof action.disabled === 'function'\n ? action.disabled(selectedItems)\n : (action.disabled ?? false);\n\n if (action.type === 'split-button') {\n return (\n <SplitButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n disabled={isDisabled}\n label={action.label}\n onClick={() => action.onClick(selectedItems)}\n options={action.options.map((option) => ({\n id: option.id,\n label: option.label,\n icon: option.icon,\n disabled: option.disabled,\n onClick: () => option.onClick(selectedItems),\n }))}\n />\n );\n }\n\n return action.label ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n posIcon={action.posIcon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n >\n {action.label}\n </Button>\n ) : action.icon ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n icon={action.icon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n />\n ) : null;\n })}\n </div>\n )}\n\n <button\n className=\"eidos-table-clear-selection\"\n onClick={clearSelection}\n aria-label=\"Clear selection\"\n >\n <X size={14} />\n </button>\n </>\n )}\n </div>\n\n {/* Right - density, column visibility, export, filter */}\n <div className=\"eidos-table-toolbar-right\">\n {showDensity && (\n <Dropdown\n placement=\"bottom\"\n align=\"end\"\n autoWidth={false}\n trigger={\n <Button variant=\"text\" size=\"sm\" preIcon={AlignJustify}>\n Density\n </Button>\n }\n content={densityPanel}\n />\n )}\n\n {showColumnVisibility && (\n <Dropdown\n placement=\"bottom\"\n align=\"end\"\n autoWidth={false}\n trigger={\n <Button variant=\"text\" size=\"sm\" preIcon={Columns3}>\n Columns\n </Button>\n }\n content={columnVisibilityPanel}\n />\n )}\n\n {showExport && (\n <Button\n variant=\"text\"\n size=\"sm\"\n icon={Download}\n onClick={handleExportCsv}\n tooltip=\"Export CSV\"\n />\n )}\n\n {showFilters && onFiltersChange && (\n <TableFiltersDropdown\n columns={columns}\n filters={filters}\n onFiltersChange={onFiltersChange}\n defaultFilters={defaultFilters}\n />\n )}\n </div>\n </div>\n )}\n\n {/* ── Table (wrapped for horizontal scroll) ─────────────────────────── */}\n <div className=\"eidos-table-scroll\">\n <table\n className={[\n 'eidos-table',\n densityClass,\n draggableColumns ? 'eidos-table--draggable-columns' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <thead ref={theadRef}>\n <tr>\n {selectable && (\n <th\n className={[\n 'eidos-table-header-cell',\n 'eidos-table-checkbox-cell',\n getHeaderPinnedProps('__checkbox__').className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={getHeaderPinnedProps('__checkbox__').style}\n data-col-key=\"__checkbox__\"\n >\n <Checkbox\n size=\"sm\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n\n {/* ── Headers: draggable or plain ──────────────────────────── */}\n {draggableColumns\n ? visibleColumns.map((column) => {\n const colKey = String(column.key);\n const columnType = column.type || 'data';\n const columnWidth =\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\n const isSortable = !!column.sortable;\n const isCurrentlySorted = currentSort?.key === colKey;\n const sortDirection = isCurrentlySorted\n ? (currentSort!.direction as 'asc' | 'desc')\n : null;\n const alignment = column.align || 'left';\n const { style: pinnedStyle, className: pinnedClass } =\n getHeaderPinnedProps(colKey);\n\n return (\n <SortableColumnHeader\n key={colKey}\n id={colKey}\n column={column}\n isSortable={isSortable}\n isCurrentlySorted={!!isCurrentlySorted}\n sortDirection={sortDirection}\n alignment={alignment}\n columnType={columnType}\n columnWidth={columnWidth}\n pinnedClass={pinnedClass}\n stickyStyle={pinnedStyle}\n onSortClick={() => handleSort(colKey)}\n />\n );\n })\n : visibleColumns.map((column, index) => {\n const colKey = String(column.key);\n const columnType = column.type || 'data';\n const columnWidth =\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\n const isSortable = column.sortable;\n const isCurrentlySorted = currentSort?.key === colKey;\n const sortDirection = isCurrentlySorted ? currentSort!.direction : null;\n const alignment = column.align || 'left';\n const alignmentClass = `eidos-table-align-${alignment}`;\n const { style: pinnedStyle, className: pinnedClass } =\n getHeaderPinnedProps(colKey);\n\n return (\n <th\n key={index}\n className={[\n 'eidos-table-header-cell',\n `eidos-table-header-cell-${columnType}`,\n isSortable ? 'eidos-table-sortable' : '',\n isCurrentlySorted ? 'eidos-table-sorted' : '',\n alignmentClass,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ width: columnWidth, ...pinnedStyle }}\n data-col-key={colKey}\n onClick={() => isSortable && handleSort(colKey)}\n >\n <div className={`eidos-table-header-content ${alignmentClass}`}>\n <span>{column.label}</span>\n {isSortable && (\n <div className=\"eidos-table-sort-indicator\">\n {sortDirection === 'asc' && <ArrowUp size={14} />}\n {sortDirection === 'desc' && <ArrowDown size={14} />}\n {!sortDirection && <ChevronsUpDown size={14} />}\n </div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {displayData.length > 0 ? (\n displayData.map((item, rowIndex) => {\n const globalIndex = showPagination\n ? (currentPage - 1) * currentPageSize + rowIndex\n : rowIndex;\n const key = getRowKey(item, globalIndex);\n const isSelected = selectedSet.has(key);\n\n return (\n <tr\n key={key}\n className={[\n 'eidos-table-row',\n onRowClick ? 'eidos-table-clickable' : '',\n isSelected ? 'eidos-table-row--selected' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td\n className={[\n 'eidos-table-cell',\n 'eidos-table-checkbox-cell',\n getCellPinnedProps('__checkbox__').className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={getCellPinnedProps('__checkbox__').style}\n onClick={(e) => {\n e.stopPropagation();\n toggleRow(key);\n }}\n >\n {/* Wrap in a span so Checkbox click-events don't\n bubble to the <td> and cause a double-toggle.\n The <td> onClick handles toggling when the user\n clicks the cell margin outside the checkbox. */}\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n size=\"sm\"\n checked={isSelected}\n onChange={() => toggleRow(key)}\n aria-label={`Select row ${globalIndex + 1}`}\n />\n </span>\n </td>\n )}\n {visibleColumns.map((column, colIndex) => {\n const colKey = String(column.key);\n const value =\n typeof column.key === 'string' && column.key.includes('.')\n ? (column.key as string)\n .split('.')\n .reduce(\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\n item as unknown,\n )\n : item[column.key as keyof T];\n\n const columnType = column.type || 'data';\n const columnWidth =\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\n const alignment = column.align || 'left';\n const alignmentClass = `eidos-table-align-${alignment}`;\n const { style: pinnedStyle, className: pinnedClass } =\n getCellPinnedProps(colKey);\n\n return (\n <td\n key={colIndex}\n className={[\n 'eidos-table-cell',\n `eidos-table-cell-${columnType}`,\n alignmentClass,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ width: columnWidth, ...pinnedStyle }}\n // `type: 'action'` cells exist specifically to hold\n // interactive controls (a row-actions Menu/button,\n // typically) - without this, clicking them bubbles\n // straight into `onRowClick` on the <tr> below,\n // e.g. opening a details drawer at the same time as\n // (or instead of) the action itself. Mirrors the\n // selectable checkbox cell's own stopPropagation\n // above, for the same reason.\n onClick={columnType === 'action' ? (e) => e.stopPropagation() : undefined}\n >\n {column.render\n ? (column.render as TableCellRenderer<T>)(value, item)\n : String(value ?? '')}\n </td>\n );\n })}\n </tr>\n );\n })\n ) : (\n <tr className=\"eidos-table-empty-row\">\n <td\n colSpan={selectable ? visibleColumns.length + 1 : visibleColumns.length}\n className=\"eidos-table-cell eidos-table-empty-cell\"\n >\n {Object.keys(filters).length > 0 ? (\n <EmptyState\n icon={<SearchX />}\n title=\"No results found\"\n description=\"Try adjusting your filters or search terms.\"\n action={\n onFiltersChange ? (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => onFiltersChange({})}\n >\n Clear filters\n </Button>\n ) : undefined\n }\n size=\"sm\"\n />\n ) : (\n <EmptyState\n icon={<FolderOpen />}\n title={emptyMessage}\n description=\"There are no records to display.\"\n size=\"sm\"\n />\n )}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Footer / Pagination ───────────────────────────────────────────── */}\n {showFooter && (\n <div className=\"eidos-table-footer\">\n <div className=\"eidos-table-footer-content\">\n {showPagination && data.length > 0 ? (\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n totalItems={totalItems ?? data.length}\n pageSize={currentPageSize}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={pageSizeOptions}\n size=\"sm\"\n />\n ) : (\n <span className=\"eidos-table-results-info\">\n Showing {data.length} of {totalItems ?? data.length} results\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n\n // ── Wrap with DnD context when draggableColumns=true ─────────────────────\n if (draggableColumns) {\n return (\n <DndContext sensors={sensors} onDragEnd={handleDragEnd}>\n <SortableContext items={sortableItems} strategy={horizontalListSortingStrategy}>\n {tableContent}\n </SortableContext>\n </DndContext>\n );\n }\n\n return tableContent;\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Input/Input.component.tsx"],"sourcesContent":["import React, { forwardRef, useState, useId } from 'react';\nimport { Eye, EyeOff, CircleAlert, X, ChevronDown } from 'lucide-react';\nimport { renderIcon } from '../../utils';\nimport type { InputProps } from './Input.types';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n className = '',\n width,\n label,\n error,\n disclaimerIcon,\n disclaimerContent,\n preIcon,\n posIcon,\n posIconButton = false,\n onPosIconClick,\n type = 'text',\n id,\n name,\n required,\n isSelect = false,\n clearable = true,\n fullWidth = false,\n ...inputProps\n },\n ref,\n ) => {\n // Extract defaultValue so it never reaches the native <input> alongside `value`.\n // Passing both causes React's \"controlled/uncontrolled\" warning because we always\n // set value={currentValue} below - defaultValue is only needed to seed local state.\n const { defaultValue, ...restInputProps } = inputProps;\n\n const [showPassword, setShowPassword] = useState(false);\n const [localValue, setLocalValue] = useState(defaultValue || '');\n const [isFocused, setIsFocused] = useState(false);\n\n // Auto-generate id and name if not provided\n const generatedId = useId();\n const inputId = id || `input-${generatedId}`;\n const inputName = name || inputId;\n\n // Determine if using controlled or uncontrolled mode\n const isControlled = restInputProps.value !== undefined;\n const currentValue = isControlled ? restInputProps.value : localValue;\n\n // For select inputs, don't manage localValue - let the select component handle it\n // This prevents the Input's clear button from showing\n\n // Determine if label should float (only when there's content - static behavior)\n // For select inputs, keep label completely static (never float)\n const shouldFloatLabel = isSelect ? false : currentValue || defaultValue;\n\n // Check if field is required (from props or enhanced register function)\n const isRequired = required || Boolean('required' in restInputProps && restInputProps.required);\n\n // Handle number input to allow decimals and negative numbers\n const handleNumberInput = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (type === 'number') {\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'Enter',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n ];\n const isNumber = /[0-9]/.test(e.key);\n const isDecimal = /[.,]/.test(e.key);\n const isMinus = e.key === '-';\n const isAllowedKey = allowedKeys.includes(e.key);\n const isControlKey = e.ctrlKey || e.metaKey;\n\n // Allow minus only at the beginning or when no text is selected\n if (isMinus) {\n const selectionStart = e.currentTarget.selectionStart || 0;\n const selectionEnd = e.currentTarget.selectionEnd || 0;\n const hasSelection = selectionStart !== selectionEnd;\n\n // Allow if at beginning or if replacing selected text\n if (selectionStart !== 0 && !hasSelection) {\n e.preventDefault();\n return;\n }\n }\n\n // Allow decimal only once\n if (isDecimal) {\n const currentValue = e.currentTarget.value;\n const hasDecimal = /[.,]/.test(currentValue);\n if (hasDecimal) {\n e.preventDefault();\n return;\n }\n }\n\n if (!isNumber && !isDecimal && !isMinus && !isAllowedKey && !isControlKey) {\n e.preventDefault();\n }\n }\n };\n\n // Handle input change for number inputs\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n // Only update localValue if uncontrolled and not a select input\n if (!isControlled && !isSelect) {\n setLocalValue(value);\n }\n restInputProps.onChange?.(e);\n };\n\n // Handle clear button\n const handleClear = () => {\n // Update localValue if uncontrolled\n if (!isControlled) {\n setLocalValue('');\n }\n\n // Create a proper synthetic event for React Hook Form\n const syntheticEvent = {\n target: {\n value: '',\n name: inputName,\n id: inputId,\n type: actualType,\n },\n } as React.ChangeEvent<HTMLInputElement>;\n\n // Call the form's onChange handler\n restInputProps.onChange?.(syntheticEvent);\n\n // Also try to update the input element directly\n if (ref && typeof ref === 'object' && ref.current) {\n ref.current.value = '';\n }\n };\n\n // Handle focus and blur\n const handleFocus = () => {\n setIsFocused(true);\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n };\n\n // Determine actual input type (handle password visibility)\n const actualType = type === 'password' ? (showPassword ? 'text' : 'password') : type;\n\n // Generate CSS classes\n const inputClasses = [\n 'eidos-input',\n `eidos-input--${variant}`,\n `eidos-input--${color}`,\n `eidos-input--${size}`,\n fullWidth && `eidos-input--fullWidth`,\n loading && `eidos-input--loading`,\n error && `eidos-input--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperClasses = [\n 'eidos-input-wrapper',\n `eidos-input-wrapper--${variant}`,\n `eidos-input-wrapper--${color}`,\n `eidos-input-wrapper--${size}`,\n fullWidth && `eidos-input-wrapper--fullWidth`,\n loading && `eidos-input-wrapper--loading`,\n isFocused && `eidos-input-wrapper--focused`,\n error && `eidos-input-wrapper--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelClasses = [\n 'eidos-input-label',\n shouldFloatLabel && `eidos-input-label--floating`,\n disclaimerIcon && `eidos-input-label--with-icon`,\n error && `eidos-input-label--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={`eidos-input-container ${fullWidth ? `eidos-input-container--fullWidth` : ''} ${className}`}\n >\n {label && (\n <label htmlFor={inputId} className={labelClasses}>\n <span className={`eidos-input-label-text`}>{label}</span>\n {isRequired && <span className={`eidos-input-required-asterisk`}>*</span>}\n {disclaimerIcon &&\n (disclaimerContent ? (\n <Tooltip message={disclaimerContent}>\n <span className={`eidos-input-disclaimer-icon`}>\n {renderIcon(disclaimerIcon, `eidos-input-disclaimer-icon-svg`)}\n </span>\n </Tooltip>\n ) : (\n <span className={`eidos-input-disclaimer-icon`}>\n {renderIcon(disclaimerIcon, `eidos-input-disclaimer-icon-svg`)}\n </span>\n ))}\n </label>\n )}\n\n <div className={wrapperClasses}>\n {preIcon && (\n <span className={`eidos-input-pre-icon`}>\n {renderIcon(preIcon, `eidos-input-pre-icon-svg`)}\n </span>\n )}\n\n <input\n ref={ref}\n id={inputId}\n name={inputName}\n type={actualType}\n className={inputClasses}\n style={\n width\n ? {\n width: typeof width === 'number' ? `${width}px` : width,\n minWidth: typeof width === 'number' ? `${width}px` : width,\n maxWidth: typeof width === 'number' ? `${width}px` : width,\n }\n : undefined\n }\n disabled={disabled || loading}\n onKeyDown={handleNumberInput}\n {...restInputProps}\n value={currentValue}\n onFocus={(e) => {\n handleFocus();\n restInputProps.onFocus?.(e);\n }}\n onBlur={(e) => {\n handleBlur();\n restInputProps.onBlur?.(e);\n }}\n onChange={handleInputChange}\n />\n\n {type === 'password' && (\n <button\n type=\"button\"\n className={`eidos-input-password-toggle`}\n onClick={() => setShowPassword(!showPassword)}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n {showPassword ? (\n <EyeOff className={`eidos-input-password-toggle-icon`} />\n ) : (\n <Eye className={`eidos-input-password-toggle-icon`} />\n )}\n </button>\n )}\n\n {/* Clear button - show when there's content and clearable is enabled (default: true) */}\n {currentValue &&\n String(currentValue).trim().length > 0 &&\n type !== 'password' &&\n !isSelect &&\n clearable !== false && (\n <button\n type=\"button\"\n className={`eidos-input-clear-button`}\n onClick={handleClear}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n <X className={`eidos-input-clear-button-icon`} />\n </button>\n )}\n\n {posIcon && !posIconButton && (\n <span className={`eidos-input-pos-icon`}>\n {renderIcon(posIcon, `eidos-input-pos-icon-svg`)}\n </span>\n )}\n\n {posIcon && posIconButton && onPosIconClick && (\n <button\n type=\"button\"\n className={`eidos-input-pos-icon-button`}\n onClick={onPosIconClick}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n {renderIcon(posIcon, `eidos-input-pos-icon-svg`)}\n </button>\n )}\n\n {/* Chevron for select inputs */}\n {isSelect && (\n <span className={`eidos-input-select-chevron`}>\n <ChevronDown className={`eidos-input-pos-icon-svg`} />\n </span>\n )}\n </div>\n\n {error && (\n <div className={`eidos-input-error-message`}>\n <CircleAlert className={`eidos-input-error-icon`} />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n"],"mappings":";;;;;;;;AAAA,SAAgB,YAAY,UAAU,aAAa;AACnD,SAAS,KAAK,QAAQ,aAAa,GAAG,mBAAmB;AAuM/C,SACE,KADF;AAlMH,IAAM,QAAQ;AAAA,EACnB,CACE;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AAIH,UAAM,EAAE,cAAc,GAAG,eAAe,IAAI;AAE5C,UAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,UAAM,CAAC,YAAY,aAAa,IAAI,SAAS,gBAAgB,EAAE;AAC/D,UAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,UAAM,cAAc,MAAM;AAC1B,UAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,UAAM,YAAY,QAAQ;AAG1B,UAAM,eAAe,eAAe,UAAU;AAC9C,UAAM,eAAe,eAAe,eAAe,QAAQ;AAO3D,UAAM,mBAAmB,WAAW,QAAQ,gBAAgB;AAG5D,UAAM,aAAa,YAAY,QAAQ,cAAc,kBAAkB,eAAe,QAAQ;AAG9F,UAAM,oBAAoB,CAAC,MAA6C;AACtE,UAAI,SAAS,UAAU;AACrB,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,WAAW,QAAQ,KAAK,EAAE,GAAG;AACnC,cAAM,YAAY,OAAO,KAAK,EAAE,GAAG;AACnC,cAAM,UAAU,EAAE,QAAQ;AAC1B,cAAM,eAAe,YAAY,SAAS,EAAE,GAAG;AAC/C,cAAM,eAAe,EAAE,WAAW,EAAE;AAGpC,YAAI,SAAS;AACX,gBAAM,iBAAiB,EAAE,cAAc,kBAAkB;AACzD,gBAAM,eAAe,EAAE,cAAc,gBAAgB;AACrD,gBAAM,eAAe,mBAAmB;AAGxC,cAAI,mBAAmB,KAAK,CAAC,cAAc;AACzC,cAAE,eAAe;AACjB;AAAA,UACF;AAAA,QACF;AAGA,YAAI,WAAW;AACb,gBAAMA,gBAAe,EAAE,cAAc;AACrC,gBAAM,aAAa,OAAO,KAAKA,aAAY;AAC3C,cAAI,YAAY;AACd,cAAE,eAAe;AACjB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,gBAAgB,CAAC,cAAc;AACzE,YAAE,eAAe;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,oBAAoB,CAAC,MAA2C;AACpE,YAAM,QAAQ,EAAE,OAAO;AAEvB,UAAI,CAAC,gBAAgB,CAAC,UAAU;AAC9B,sBAAc,KAAK;AAAA,MACrB;AACA,qBAAe,WAAW,CAAC;AAAA,IAC7B;AAGA,UAAM,cAAc,MAAM;AAExB,UAAI,CAAC,cAAc;AACjB,sBAAc,EAAE;AAAA,MAClB;AAGA,YAAM,iBAAiB;AAAA,QACrB,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,MAAM;AAAA,QACR;AAAA,MACF;AAGA,qBAAe,WAAW,cAAc;AAGxC,UAAI,OAAO,OAAO,QAAQ,YAAY,IAAI,SAAS;AACjD,YAAI,QAAQ,QAAQ;AAAA,MACtB;AAAA,IACF;AAGA,UAAM,cAAc,MAAM;AACxB,mBAAa,IAAI;AAAA,IACnB;AAEA,UAAM,aAAa,MAAM;AACvB,mBAAa,KAAK;AAAA,IACpB;AAGA,UAAM,aAAa,SAAS,aAAc,eAAe,SAAS,aAAc;AAGhF,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,gBAAgB,OAAO;AAAA,MACvB,gBAAgB,KAAK;AAAA,MACrB,gBAAgB,IAAI;AAAA,MACpB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,IACX,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,wBAAwB,OAAO;AAAA,MAC/B,wBAAwB,KAAK;AAAA,MAC7B,wBAAwB,IAAI;AAAA,MAC5B,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS;AAAA,IACX,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB,SAAS;AAAA,IACX,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,yBAAyB,YAAY,qCAAqC,EAAE,IAAI,SAAS;AAAA,QAEnG;AAAA,mBACC,qBAAC,WAAM,SAAS,SAAS,WAAW,cAClC;AAAA,gCAAC,UAAK,WAAW,0BAA2B,iBAAM;AAAA,YACjD,cAAc,oBAAC,UAAK,WAAW,iCAAiC,eAAC;AAAA,YACjE,mBACE,oBACC,oBAAC,WAAQ,SAAS,mBAChB,8BAAC,UAAK,WAAW,+BACd,qBAAW,gBAAgB,iCAAiC,GAC/D,GACF,IAEA,oBAAC,UAAK,WAAW,+BACd,qBAAW,gBAAgB,iCAAiC,GAC/D;AAAA,aAEN;AAAA,UAGF,qBAAC,SAAI,WAAW,gBACb;AAAA,uBACC,oBAAC,UAAK,WAAW,wBACd,qBAAW,SAAS,0BAA0B,GACjD;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,IAAI;AAAA,gBACJ,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,OACE,QACI;AAAA,kBACE,OAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,kBAClD,UAAU,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,kBACrD,UAAU,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,gBACvD,IACA;AAAA,gBAEN,UAAU,YAAY;AAAA,gBACtB,WAAW;AAAA,gBACV,GAAG;AAAA,gBACJ,OAAO;AAAA,gBACP,SAAS,CAAC,MAAM;AACd,8BAAY;AACZ,iCAAe,UAAU,CAAC;AAAA,gBAC5B;AAAA,gBACA,QAAQ,CAAC,MAAM;AACb,6BAAW;AACX,iCAAe,SAAS,CAAC;AAAA,gBAC3B;AAAA,gBACA,UAAU;AAAA;AAAA,YACZ;AAAA,YAEC,SAAS,cACR;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,gBACX,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,gBAC5C,UAAU,YAAY;AAAA,gBACtB,UAAU;AAAA,gBAET,yBACC,oBAAC,UAAO,WAAW,oCAAoC,IAEvD,oBAAC,OAAI,WAAW,oCAAoC;AAAA;AAAA,YAExD;AAAA,YAID,gBACC,OAAO,YAAY,EAAE,KAAK,EAAE,SAAS,KACrC,SAAS,cACT,CAAC,YACD,cAAc,SACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,UAAU,YAAY;AAAA,gBACtB,UAAU;AAAA,gBAEV,8BAAC,KAAE,WAAW,iCAAiC;AAAA;AAAA,YACjD;AAAA,YAGH,WAAW,CAAC,iBACX,oBAAC,UAAK,WAAW,wBACd,qBAAW,SAAS,0BAA0B,GACjD;AAAA,YAGD,WAAW,iBAAiB,kBAC3B;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,UAAU,YAAY;AAAA,gBACtB,UAAU;AAAA,gBAET,qBAAW,SAAS,0BAA0B;AAAA;AAAA,YACjD;AAAA,YAID,YACC,oBAAC,UAAK,WAAW,8BACf,8BAAC,eAAY,WAAW,4BAA4B,GACtD;AAAA,aAEJ;AAAA,UAEC,SACC,qBAAC,SAAI,WAAW,6BACd;AAAA,gCAAC,eAAY,WAAW,0BAA0B;AAAA,YAClD,oBAAC,UAAM,iBAAM;AAAA,aACf;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;","names":["currentValue"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-WPTMMOA6.cjs","../src/components/PageLayout/PageLayout.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACYqE,+CAAA;AAhBrE,IAAM,cAAA,EAA6B,EAAE,SAAA,EAAW,CAAA,KAAA,EAAA,iBAAK,IAAI,IAAA,CAAK,CAAA,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA,SAAA,EAAY,CAAA;AAElF,IAAM,WAAA,EAAwC,CAAC;AAAA,EACpD,OAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,EAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,kBAAA,EAAoB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAExE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EAAU,GAAG,IAAA,EAC3B,QAAA,EAAA;AAAA,oBAAA,6BAAA;AAAA,MAAC,yBAAA;AAAA,MAAA;AAAA,QACC,WAAA,kBAAa,OAAA,2BAAS,cAAA,GAAe,EAAE,KAAA,EAAO,CAAC,CAAA,EAAG,SAAA,kBAAW,6BAAA,oBAAA,EAAA,CAAA,CAAE,EAAI,CAAA;AAAA,QACnE,eAAA,kBAAiB,OAAA,6BAAS,kBAAA,GAAmB,CAAC,CAAA;AAAA,QAC9C,OAAA,kBAAS,OAAA,6BAAS,UAAA,GAAW,CAAC,CAAA;AAAA,QAC9B,QAAA,kBAAU,OAAA,6BAAS,WAAA,GAAY,CAAC,CAAA;AAAA,QAChC,SAAA,EAAU;AAAA,MAAA;AAAA,IACZ,CAAA;AAAA,oBACA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA,WAAA,mBAAc,6BAAA,4BAAC,EAAA,EAAY,GAAG,WAAA,CAAY,EAAA,CAC7C,CAAA;AAAA,oBACA,8BAAA,MAAC,EAAA,EAAK,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,MAAA,OAAA,mBACC,6BAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,SAAA,EAAW,CAAC,0BAAA,EAA4B,MAAA,CAAO,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG;AAAA,QAAA;AAAA,MACpF,CAAA;AAAA,sBAEF,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EAA0B,SAAA,CAAS,CAAA;AAAA,sBAClD,6BAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACE,oBAAI,MAAA,UAAU,eAAA;AAAA,UACf,SAAA,EAAW,CAAC,0BAAA,kBAA4B,MAAA,6BAAQ,WAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG;AAAA,QAAA;AAAA,MACrF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADQA;AACA;AACE;AACF,gCAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-WPTMMOA6.cjs","sourcesContent":[null,"import React from 'react';\nimport type { PageLayoutProps } from './PageLayout.types';\nimport './PageLayout.scss';\nimport { Toolbar } from '../Toolbar';\nimport { Header } from '../Header';\nimport { Footer } from '../Footer';\nimport type { FooterProps } from '../Footer';\nimport { Navigation } from '../Navigation';\n\nconst defaultFooter: FooterProps = { copyright: `© ${new Date().getFullYear()} Eidos UI` };\n\nexport const PageLayout: React.FC<PageLayoutProps> = ({\n toolbar,\n navigation,\n header,\n footer,\n children,\n className = '',\n ...rest\n}) => {\n const classes = ['eidos-pagelayout', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} {...rest}>\n <Toolbar\n breadcrumbs={toolbar?.breadcrumbs || { items: [], separator: <></> }}\n cmdPaletteItems={toolbar?.cmdPaletteItems || []}\n actions={toolbar?.actions || []}\n userMenu={toolbar?.userMenu || []}\n className=\"eidos-pagelayout__toolbar\"\n />\n <div className=\"eidos-pagelayout__navigation\">\n {navigation && <Navigation {...navigation} />}\n </div>\n <main className=\"eidos-pagelayout__content\">\n {header && (\n <Header\n {...header}\n className={['eidos-pagelayout__header', header.className].filter(Boolean).join(' ')}\n />\n )}\n <div className=\"eidos-pagelayout__body\">{children}</div>\n <Footer\n {...(footer ?? defaultFooter)}\n className={['eidos-pagelayout__footer', footer?.className].filter(Boolean).join(' ')}\n />\n </main>\n </div>\n );\n};\n"]}