eidos-ui 3.3.0 → 3.5.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 (354) hide show
  1. package/README.md +17 -5
  2. package/dist/{Input.types-XrJTI0JC.d.ts → Input.types-CSDMaZNe.d.ts} +10 -0
  3. package/dist/{Input.types-DFZNyJGF.d.cts → Input.types-D7-sWq-q.d.cts} +10 -0
  4. package/dist/{Menu.types-DNIpjSAK.d.ts → Menu.types-BN4g1-3A.d.ts} +9 -0
  5. package/dist/{Menu.types-DwcuCZM7.d.cts → Menu.types-CTnUijv5.d.cts} +9 -0
  6. package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-C2tGy1vj.d.ts} +11 -1
  7. package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-ok-03rLo.d.cts} +11 -1
  8. package/dist/{Table.types-CPj-udMc.d.cts → Table.types-D-9tC0kJ.d.cts} +2 -3
  9. package/dist/{Table.types-CZZ7QWAI.d.ts → Table.types-D8pmgxKA.d.ts} +2 -3
  10. package/dist/{Toolbar.types-RN0klQzu.d.ts → Toolbar.types-CKnQC_TW.d.ts} +1 -1
  11. package/dist/{Toolbar.types-DSk8z2iy.d.cts → Toolbar.types-DUz2mxct.d.cts} +1 -1
  12. package/dist/alert/index.cjs +5 -5
  13. package/dist/alert/index.js +4 -4
  14. package/dist/button/index.cjs +4 -4
  15. package/dist/button/index.js +3 -3
  16. package/dist/checkbox/index.cjs +2 -2
  17. package/dist/checkbox/index.js +1 -1
  18. package/dist/chip/index.cjs +4 -4
  19. package/dist/chip/index.js +3 -3
  20. package/dist/{chunk-ITXDSQT2.js → chunk-24HKKSKX.js} +94 -102
  21. package/dist/chunk-24HKKSKX.js.map +1 -0
  22. package/dist/{chunk-GDQWSCJQ.js → chunk-26SO4LZ5.js} +4 -4
  23. package/dist/{chunk-GPRJYPIG.js → chunk-2JW3WSBF.js} +6 -4
  24. package/dist/chunk-2JW3WSBF.js.map +1 -0
  25. package/dist/{chunk-MHZIBV2C.js → chunk-2PCCGQOH.js} +90 -19
  26. package/dist/chunk-2PCCGQOH.js.map +1 -0
  27. package/dist/{chunk-3EPND5M2.cjs → chunk-2T7ZMMH5.cjs} +72 -19
  28. package/dist/chunk-2T7ZMMH5.cjs.map +1 -0
  29. package/dist/chunk-35LGEPLP.cjs +134 -0
  30. package/dist/chunk-35LGEPLP.cjs.map +1 -0
  31. package/dist/{chunk-R4M6SNUU.cjs → chunk-36JFXFM2.cjs} +48 -37
  32. package/dist/chunk-36JFXFM2.cjs.map +1 -0
  33. package/dist/{chunk-ND526PMG.cjs → chunk-3KBBJZHK.cjs} +11 -11
  34. package/dist/{chunk-ND526PMG.cjs.map → chunk-3KBBJZHK.cjs.map} +1 -1
  35. package/dist/{chunk-EH42ND5Q.cjs → chunk-3RWZC6OW.cjs} +5 -5
  36. package/dist/{chunk-EH42ND5Q.cjs.map → chunk-3RWZC6OW.cjs.map} +1 -1
  37. package/dist/{chunk-G5N3C6AU.cjs → chunk-3ZRFOKDM.cjs} +36 -36
  38. package/dist/{chunk-G5N3C6AU.cjs.map → chunk-3ZRFOKDM.cjs.map} +1 -1
  39. package/dist/{chunk-I5XR2V4A.cjs → chunk-4AO5RKV5.cjs} +87 -96
  40. package/dist/chunk-4AO5RKV5.cjs.map +1 -0
  41. package/dist/{chunk-5HUZYY54.js → chunk-4J25XZDI.js} +23 -13
  42. package/dist/chunk-4J25XZDI.js.map +1 -0
  43. package/dist/{chunk-FXZJL2AM.cjs → chunk-4JSTBA4F.cjs} +12 -6
  44. package/dist/chunk-4JSTBA4F.cjs.map +1 -0
  45. package/dist/{chunk-GG5YGESX.js → chunk-4LNTZPSQ.js} +4 -3
  46. package/dist/chunk-4LNTZPSQ.js.map +1 -0
  47. package/dist/{chunk-3EUTXQDB.js → chunk-5XH2PHT2.js} +31 -24
  48. package/dist/chunk-5XH2PHT2.js.map +1 -0
  49. package/dist/{chunk-OJDYTCMO.cjs → chunk-66UQTF57.cjs} +69 -62
  50. package/dist/chunk-66UQTF57.cjs.map +1 -0
  51. package/dist/{chunk-MCWTQT3M.cjs → chunk-6JHVXWDV.cjs} +125 -54
  52. package/dist/chunk-6JHVXWDV.cjs.map +1 -0
  53. package/dist/chunk-75GFIQRU.js +88 -0
  54. package/dist/chunk-75GFIQRU.js.map +1 -0
  55. package/dist/{chunk-55J4LEKT.cjs → chunk-7BFODYNL.cjs} +11 -8
  56. package/dist/chunk-7BFODYNL.cjs.map +1 -0
  57. package/dist/{chunk-TEVZHN5I.cjs → chunk-7VJCGKVP.cjs} +28 -15
  58. package/dist/chunk-7VJCGKVP.cjs.map +1 -0
  59. package/dist/{chunk-KQJ3IAFT.js → chunk-A3LMUPG3.js} +2 -2
  60. package/dist/{chunk-O2AACVSF.js → chunk-AR2ZOO6L.js} +3 -3
  61. package/dist/{chunk-Z5U4NJTW.cjs → chunk-BEOECPVJ.cjs} +50 -23
  62. package/dist/chunk-BEOECPVJ.cjs.map +1 -0
  63. package/dist/{chunk-E7FGY7BJ.js → chunk-BFKPJ627.js} +5 -4
  64. package/dist/chunk-BFKPJ627.js.map +1 -0
  65. package/dist/{chunk-M7PF4FKQ.js → chunk-D7SQ7LHJ.js} +6 -3
  66. package/dist/chunk-D7SQ7LHJ.js.map +1 -0
  67. package/dist/chunk-DA375AI6.cjs +88 -0
  68. package/dist/chunk-DA375AI6.cjs.map +1 -0
  69. package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
  70. package/dist/chunk-DGXHR6FV.js.map +1 -0
  71. package/dist/{chunk-ZNWIHUHZ.cjs → chunk-DU5JKTHK.cjs} +12 -4
  72. package/dist/chunk-DU5JKTHK.cjs.map +1 -0
  73. package/dist/{chunk-HALVTKW7.js → chunk-FIVMMCGM.js} +72 -81
  74. package/dist/chunk-FIVMMCGM.js.map +1 -0
  75. package/dist/{chunk-RYOQYYDO.js → chunk-GIEDIAPD.js} +12 -6
  76. package/dist/chunk-GIEDIAPD.js.map +1 -0
  77. package/dist/{chunk-NQ4L6PYW.js → chunk-GOF6A4M4.js} +2 -2
  78. package/dist/{chunk-NQ4L6PYW.js.map → chunk-GOF6A4M4.js.map} +1 -1
  79. package/dist/{chunk-L23WWO3D.js → chunk-GPVGGBIR.js} +2 -2
  80. package/dist/{chunk-OAK7HFOJ.js → chunk-GWHZFX2H.js} +21 -16
  81. package/dist/chunk-GWHZFX2H.js.map +1 -0
  82. package/dist/{chunk-HYDNZXPU.js → chunk-H2RS6Z6Q.js} +41 -25
  83. package/dist/{chunk-HYDNZXPU.js.map → chunk-H2RS6Z6Q.js.map} +1 -1
  84. package/dist/{chunk-2QEKSRVX.js → chunk-HEX4IMLO.js} +4 -4
  85. package/dist/{chunk-QJRKXT54.cjs → chunk-HMEREPDB.cjs} +7 -7
  86. package/dist/{chunk-QJRKXT54.cjs.map → chunk-HMEREPDB.cjs.map} +1 -1
  87. package/dist/{chunk-TTO7JXDB.cjs → chunk-HNGFRRVZ.cjs} +3 -3
  88. package/dist/{chunk-TTO7JXDB.cjs.map → chunk-HNGFRRVZ.cjs.map} +1 -1
  89. package/dist/{chunk-CJGFRPAS.cjs → chunk-I6M6CVI2.cjs} +4 -4
  90. package/dist/chunk-I6M6CVI2.cjs.map +1 -0
  91. package/dist/chunk-J76JHN7J.cjs +225 -0
  92. package/dist/chunk-J76JHN7J.cjs.map +1 -0
  93. package/dist/{chunk-YW65NAKH.cjs → chunk-JCKGAAPZ.cjs} +7 -7
  94. package/dist/{chunk-YW65NAKH.cjs.map → chunk-JCKGAAPZ.cjs.map} +1 -1
  95. package/dist/{chunk-6CPCNQKV.js → chunk-JHX6JK3M.js} +79 -75
  96. package/dist/chunk-JHX6JK3M.js.map +1 -0
  97. package/dist/{chunk-YV57RSPD.js → chunk-JNY7TUDS.js} +49 -22
  98. package/dist/chunk-JNY7TUDS.js.map +1 -0
  99. package/dist/{chunk-O3LG7B2J.cjs → chunk-JPYJQ4TF.cjs} +13 -5
  100. package/dist/chunk-JPYJQ4TF.cjs.map +1 -0
  101. package/dist/{chunk-PY2376XI.js → chunk-JT4KVXJK.js} +68 -15
  102. package/dist/chunk-JT4KVXJK.js.map +1 -0
  103. package/dist/{chunk-AOGNTG3W.cjs → chunk-KBQD4JLK.cjs} +5 -4
  104. package/dist/chunk-KBQD4JLK.cjs.map +1 -0
  105. package/dist/{chunk-P2JM22BF.cjs → chunk-KIZVY57H.cjs} +82 -78
  106. package/dist/chunk-KIZVY57H.cjs.map +1 -0
  107. package/dist/{chunk-QQIALSTX.cjs → chunk-KPMIIGHH.cjs} +27 -17
  108. package/dist/chunk-KPMIIGHH.cjs.map +1 -0
  109. package/dist/{chunk-ZXJU3TQD.cjs → chunk-KREHT4AQ.cjs} +11 -10
  110. package/dist/chunk-KREHT4AQ.cjs.map +1 -0
  111. package/dist/{chunk-S4S4LB63.js → chunk-L65MHFMD.js} +11 -3
  112. package/dist/chunk-L65MHFMD.js.map +1 -0
  113. package/dist/{chunk-OGC44JFZ.cjs → chunk-LQXFXXMJ.cjs} +8 -7
  114. package/dist/chunk-LQXFXXMJ.cjs.map +1 -0
  115. package/dist/{chunk-25PSIDPC.js → chunk-MPIVBAMY.js} +79 -21
  116. package/dist/chunk-MPIVBAMY.js.map +1 -0
  117. package/dist/{chunk-7SVDYEKM.js → chunk-MQAOXZD4.js} +28 -14
  118. package/dist/chunk-MQAOXZD4.js.map +1 -0
  119. package/dist/{chunk-6CSUUQ5M.cjs → chunk-NOQF7UQ5.cjs} +6 -6
  120. package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-NOQF7UQ5.cjs.map} +1 -1
  121. package/dist/{chunk-OU7DCYIA.js → chunk-O3QM3BFE.js} +2 -2
  122. package/dist/{chunk-WKDT2XFQ.js → chunk-OOCCSMWM.js} +4 -4
  123. package/dist/chunk-P4XZH3OR.js +225 -0
  124. package/dist/chunk-P4XZH3OR.js.map +1 -0
  125. package/dist/{chunk-ZWAFL2B3.cjs → chunk-PMSENLOA.cjs} +37 -27
  126. package/dist/chunk-PMSENLOA.cjs.map +1 -0
  127. package/dist/{chunk-L5W2XC6M.js → chunk-RHFD2Z5V.js} +8 -8
  128. package/dist/chunk-RHHZRTWM.js +134 -0
  129. package/dist/chunk-RHHZRTWM.js.map +1 -0
  130. package/dist/{chunk-NZO2I5AL.cjs → chunk-RJVHR45I.cjs} +7 -7
  131. package/dist/{chunk-NZO2I5AL.cjs.map → chunk-RJVHR45I.cjs.map} +1 -1
  132. package/dist/{chunk-E6SE552P.cjs → chunk-RUDXHT76.cjs} +41 -25
  133. package/dist/chunk-RUDXHT76.cjs.map +1 -0
  134. package/dist/{chunk-SXGCRHBZ.js → chunk-SDUGYJGW.js} +24 -14
  135. package/dist/chunk-SDUGYJGW.js.map +1 -0
  136. package/dist/{chunk-VPRUHE35.js → chunk-SFFKQQ5Z.js} +4 -4
  137. package/dist/{chunk-2RXQMQYW.js → chunk-SXL4DMZ7.js} +27 -17
  138. package/dist/{chunk-2RXQMQYW.js.map → chunk-SXL4DMZ7.js.map} +1 -1
  139. package/dist/{chunk-OAPOGYA5.cjs → chunk-TC5IC6OP.cjs} +7 -4
  140. package/dist/chunk-TC5IC6OP.cjs.map +1 -0
  141. package/dist/{chunk-T2KB3DJJ.js → chunk-THCTUBX6.js} +12 -4
  142. package/dist/chunk-THCTUBX6.js.map +1 -0
  143. package/dist/{chunk-NEYLNRVG.cjs → chunk-TTLFY76J.cjs} +21 -16
  144. package/dist/chunk-TTLFY76J.cjs.map +1 -0
  145. package/dist/{chunk-ZZSPQFMX.js → chunk-U233KQZX.js} +2 -1
  146. package/dist/{chunk-ZZSPQFMX.js.map → chunk-U233KQZX.js.map} +1 -1
  147. package/dist/{chunk-65PC3YDT.cjs → chunk-V4BZWBZT.cjs} +7 -7
  148. package/dist/{chunk-65PC3YDT.cjs.map → chunk-V4BZWBZT.cjs.map} +1 -1
  149. package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
  150. package/dist/chunk-VHO6JPRR.cjs.map +1 -0
  151. package/dist/{chunk-3E7TKBQI.cjs → chunk-VQGLVBPL.cjs} +24 -14
  152. package/dist/chunk-VQGLVBPL.cjs.map +1 -0
  153. package/dist/{chunk-27ZWUEPE.js → chunk-WE2SBWZ6.js} +20 -9
  154. package/dist/chunk-WE2SBWZ6.js.map +1 -0
  155. package/dist/{chunk-TQGO5WK6.js → chunk-WNDDS367.js} +7 -6
  156. package/dist/chunk-WNDDS367.js.map +1 -0
  157. package/dist/{chunk-Q5KQVBQP.cjs → chunk-X3BVQBXD.cjs} +18 -16
  158. package/dist/chunk-X3BVQBXD.cjs.map +1 -0
  159. package/dist/{chunk-J5RMLZ4P.cjs → chunk-XERBOFYZ.cjs} +80 -22
  160. package/dist/chunk-XERBOFYZ.cjs.map +1 -0
  161. package/dist/{chunk-3CXULV4G.cjs → chunk-XRVRGRC3.cjs} +2 -2
  162. package/dist/{chunk-3CXULV4G.cjs.map → chunk-XRVRGRC3.cjs.map} +1 -1
  163. package/dist/{chunk-K7T25Y3A.cjs → chunk-XZLSHEHE.cjs} +41 -27
  164. package/dist/chunk-XZLSHEHE.cjs.map +1 -0
  165. package/dist/{chunk-JRLUZDKA.js → chunk-YAKTVIVK.js} +20 -7
  166. package/dist/chunk-YAKTVIVK.js.map +1 -0
  167. package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
  168. package/dist/chunk-YJNQLH2L.cjs.map +1 -0
  169. package/dist/{chunk-ZPDETHQ7.js → chunk-YP4HUBKN.js} +3 -3
  170. package/dist/{chunk-ZPDETHQ7.js.map → chunk-YP4HUBKN.js.map} +1 -1
  171. package/dist/{chunk-5WH3JMR5.js → chunk-YXRKBKFB.js} +7 -4
  172. package/dist/chunk-YXRKBKFB.js.map +1 -0
  173. package/dist/{chunk-ACNTH2OQ.cjs → chunk-ZMRINZIO.cjs} +98 -106
  174. package/dist/chunk-ZMRINZIO.cjs.map +1 -0
  175. package/dist/color-picker/index.cjs +4 -4
  176. package/dist/color-picker/index.d.cts +8 -0
  177. package/dist/color-picker/index.d.ts +8 -0
  178. package/dist/color-picker/index.js +3 -3
  179. package/dist/combobox/index.cjs +6 -6
  180. package/dist/combobox/index.js +5 -5
  181. package/dist/command-palette/index.cjs +3 -2
  182. package/dist/command-palette/index.cjs.map +1 -1
  183. package/dist/command-palette/index.js +2 -1
  184. package/dist/context-menu/index.cjs +6 -6
  185. package/dist/context-menu/index.d.cts +1 -1
  186. package/dist/context-menu/index.d.ts +1 -1
  187. package/dist/context-menu/index.js +5 -5
  188. package/dist/conversation/index.cjs +8 -8
  189. package/dist/conversation/index.d.cts +1 -1
  190. package/dist/conversation/index.d.ts +1 -1
  191. package/dist/conversation/index.js +7 -7
  192. package/dist/data-grid/index.cjs +16 -16
  193. package/dist/data-grid/index.d.cts +14 -15
  194. package/dist/data-grid/index.d.ts +14 -15
  195. package/dist/data-grid/index.js +15 -15
  196. package/dist/date-picker/index.cjs +8 -8
  197. package/dist/date-picker/index.d.cts +12 -2
  198. package/dist/date-picker/index.d.ts +12 -2
  199. package/dist/date-picker/index.js +7 -7
  200. package/dist/drawer/index.cjs +5 -5
  201. package/dist/drawer/index.js +4 -4
  202. package/dist/dropdown/index.cjs +3 -3
  203. package/dist/dropdown/index.d.cts +34 -0
  204. package/dist/dropdown/index.d.ts +34 -0
  205. package/dist/dropdown/index.js +2 -2
  206. package/dist/file-upload/index.cjs +2 -2
  207. package/dist/file-upload/index.js +1 -1
  208. package/dist/header/index.cjs +6 -6
  209. package/dist/header/index.js +5 -5
  210. package/dist/index.cjs +42 -42
  211. package/dist/index.css +112 -40
  212. package/dist/index.d.cts +5 -5
  213. package/dist/index.d.ts +5 -5
  214. package/dist/index.js +41 -41
  215. package/dist/inline-edit/index.cjs +5 -5
  216. package/dist/inline-edit/index.js +4 -4
  217. package/dist/input/index.cjs +4 -4
  218. package/dist/input/index.d.cts +2 -2
  219. package/dist/input/index.d.ts +2 -2
  220. package/dist/input/index.js +3 -3
  221. package/dist/menu/index.cjs +5 -5
  222. package/dist/menu/index.d.cts +23 -2
  223. package/dist/menu/index.d.ts +23 -2
  224. package/dist/menu/index.js +4 -4
  225. package/dist/modal/index.cjs +5 -5
  226. package/dist/modal/index.js +4 -4
  227. package/dist/navigation/index.cjs +5 -5
  228. package/dist/navigation/index.js +4 -4
  229. package/dist/number-input/index.cjs +3 -3
  230. package/dist/number-input/index.js +2 -2
  231. package/dist/o-t-p-input/index.cjs +2 -2
  232. package/dist/o-t-p-input/index.js +1 -1
  233. package/dist/page-layout/index.cjs +12 -12
  234. package/dist/page-layout/index.d.cts +2 -2
  235. package/dist/page-layout/index.d.ts +2 -2
  236. package/dist/page-layout/index.js +11 -11
  237. package/dist/pagination/index.cjs +8 -8
  238. package/dist/pagination/index.js +7 -7
  239. package/dist/popover/index.cjs +3 -2
  240. package/dist/popover/index.cjs.map +1 -1
  241. package/dist/popover/index.d.cts +3 -1
  242. package/dist/popover/index.d.ts +3 -1
  243. package/dist/popover/index.js +2 -1
  244. package/dist/radio/index.cjs +2 -2
  245. package/dist/radio/index.js +1 -1
  246. package/dist/segmented-control/index.cjs +4 -4
  247. package/dist/segmented-control/index.js +3 -3
  248. package/dist/select/index.cjs +6 -6
  249. package/dist/select/index.d.cts +3 -3
  250. package/dist/select/index.d.ts +3 -3
  251. package/dist/select/index.js +5 -5
  252. package/dist/snackbar/index.cjs +5 -5
  253. package/dist/snackbar/index.d.cts +4 -0
  254. package/dist/snackbar/index.d.ts +4 -0
  255. package/dist/snackbar/index.js +4 -4
  256. package/dist/split-button/index.cjs +6 -6
  257. package/dist/split-button/index.js +5 -5
  258. package/dist/table/index.cjs +14 -14
  259. package/dist/table/index.d.cts +2 -2
  260. package/dist/table/index.d.ts +2 -2
  261. package/dist/table/index.js +13 -13
  262. package/dist/tabs/index.cjs +3 -3
  263. package/dist/tabs/index.js +2 -2
  264. package/dist/tag-input/index.cjs +6 -6
  265. package/dist/tag-input/index.js +5 -5
  266. package/dist/textarea/index.cjs +4 -4
  267. package/dist/textarea/index.js +3 -3
  268. package/dist/theme-editor/index.cjs +11 -11
  269. package/dist/theme-editor/index.js +10 -10
  270. package/dist/theme-provider/index.cjs +3 -3
  271. package/dist/theme-provider/index.js +2 -2
  272. package/dist/toolbar/index.cjs +8 -8
  273. package/dist/toolbar/index.d.cts +3 -3
  274. package/dist/toolbar/index.d.ts +3 -3
  275. package/dist/toolbar/index.js +7 -7
  276. package/dist/tooltip/index.cjs +3 -2
  277. package/dist/tooltip/index.cjs.map +1 -1
  278. package/dist/tooltip/index.js +2 -1
  279. package/dist/virtual-list/index.cjs +2 -2
  280. package/dist/virtual-list/index.js +1 -1
  281. package/package.json +7 -2
  282. package/dist/chunk-25PSIDPC.js.map +0 -1
  283. package/dist/chunk-27ZWUEPE.js.map +0 -1
  284. package/dist/chunk-3E7TKBQI.cjs.map +0 -1
  285. package/dist/chunk-3EPND5M2.cjs.map +0 -1
  286. package/dist/chunk-3EUTXQDB.js.map +0 -1
  287. package/dist/chunk-55J4LEKT.cjs.map +0 -1
  288. package/dist/chunk-5HUZYY54.js.map +0 -1
  289. package/dist/chunk-5WH3JMR5.js.map +0 -1
  290. package/dist/chunk-6CPCNQKV.js.map +0 -1
  291. package/dist/chunk-7SVDYEKM.js.map +0 -1
  292. package/dist/chunk-ACNTH2OQ.cjs.map +0 -1
  293. package/dist/chunk-AOGNTG3W.cjs.map +0 -1
  294. package/dist/chunk-BNVQ34FD.js +0 -125
  295. package/dist/chunk-BNVQ34FD.js.map +0 -1
  296. package/dist/chunk-CJGFRPAS.cjs.map +0 -1
  297. package/dist/chunk-CUJBNRJJ.cjs +0 -38
  298. package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
  299. package/dist/chunk-E6SE552P.cjs.map +0 -1
  300. package/dist/chunk-E7FGY7BJ.js.map +0 -1
  301. package/dist/chunk-EAJHEYZM.js +0 -38
  302. package/dist/chunk-EAJHEYZM.js.map +0 -1
  303. package/dist/chunk-FKXKBJUI.cjs.map +0 -1
  304. package/dist/chunk-FXZJL2AM.cjs.map +0 -1
  305. package/dist/chunk-GG5YGESX.js.map +0 -1
  306. package/dist/chunk-GPRJYPIG.js.map +0 -1
  307. package/dist/chunk-H6CWTMAH.js.map +0 -1
  308. package/dist/chunk-HALVTKW7.js.map +0 -1
  309. package/dist/chunk-I5XR2V4A.cjs.map +0 -1
  310. package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
  311. package/dist/chunk-ITXDSQT2.js.map +0 -1
  312. package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
  313. package/dist/chunk-JRLUZDKA.js.map +0 -1
  314. package/dist/chunk-K7T25Y3A.cjs.map +0 -1
  315. package/dist/chunk-L5Q6UDY3.js +0 -69
  316. package/dist/chunk-L5Q6UDY3.js.map +0 -1
  317. package/dist/chunk-M7PF4FKQ.js.map +0 -1
  318. package/dist/chunk-MCWTQT3M.cjs.map +0 -1
  319. package/dist/chunk-MHZIBV2C.js.map +0 -1
  320. package/dist/chunk-NEYLNRVG.cjs.map +0 -1
  321. package/dist/chunk-O3LG7B2J.cjs.map +0 -1
  322. package/dist/chunk-OAK7HFOJ.js.map +0 -1
  323. package/dist/chunk-OAPOGYA5.cjs.map +0 -1
  324. package/dist/chunk-OGC44JFZ.cjs.map +0 -1
  325. package/dist/chunk-OJDYTCMO.cjs.map +0 -1
  326. package/dist/chunk-P2JM22BF.cjs.map +0 -1
  327. package/dist/chunk-PY2376XI.js.map +0 -1
  328. package/dist/chunk-Q5KQVBQP.cjs.map +0 -1
  329. package/dist/chunk-QQIALSTX.cjs.map +0 -1
  330. package/dist/chunk-R4M6SNUU.cjs.map +0 -1
  331. package/dist/chunk-RYOQYYDO.js.map +0 -1
  332. package/dist/chunk-S4S4LB63.js.map +0 -1
  333. package/dist/chunk-SXGCRHBZ.js.map +0 -1
  334. package/dist/chunk-T2KB3DJJ.js.map +0 -1
  335. package/dist/chunk-TEVZHN5I.cjs.map +0 -1
  336. package/dist/chunk-TQGO5WK6.js.map +0 -1
  337. package/dist/chunk-VXO2MYYH.cjs +0 -125
  338. package/dist/chunk-VXO2MYYH.cjs.map +0 -1
  339. package/dist/chunk-WWYJNWJY.cjs +0 -69
  340. package/dist/chunk-WWYJNWJY.cjs.map +0 -1
  341. package/dist/chunk-YV57RSPD.js.map +0 -1
  342. package/dist/chunk-Z5U4NJTW.cjs.map +0 -1
  343. package/dist/chunk-ZNWIHUHZ.cjs.map +0 -1
  344. package/dist/chunk-ZWAFL2B3.cjs.map +0 -1
  345. package/dist/chunk-ZXJU3TQD.cjs.map +0 -1
  346. /package/dist/{chunk-GDQWSCJQ.js.map → chunk-26SO4LZ5.js.map} +0 -0
  347. /package/dist/{chunk-KQJ3IAFT.js.map → chunk-A3LMUPG3.js.map} +0 -0
  348. /package/dist/{chunk-O2AACVSF.js.map → chunk-AR2ZOO6L.js.map} +0 -0
  349. /package/dist/{chunk-L23WWO3D.js.map → chunk-GPVGGBIR.js.map} +0 -0
  350. /package/dist/{chunk-2QEKSRVX.js.map → chunk-HEX4IMLO.js.map} +0 -0
  351. /package/dist/{chunk-OU7DCYIA.js.map → chunk-O3QM3BFE.js.map} +0 -0
  352. /package/dist/{chunk-WKDT2XFQ.js.map → chunk-OOCCSMWM.js.map} +0 -0
  353. /package/dist/{chunk-L5W2XC6M.js.map → chunk-RHFD2Z5V.js.map} +0 -0
  354. /package/dist/{chunk-VPRUHE35.js.map → chunk-SFFKQQ5Z.js.map} +0 -0
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Toolbar
3
- } from "./chunk-VPRUHE35.js";
3
+ } from "./chunk-SFFKQQ5Z.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-WKDT2XFQ.js";
6
+ } from "./chunk-OOCCSMWM.js";
7
7
  import {
8
8
  Navigation
9
- } from "./chunk-2QEKSRVX.js";
9
+ } from "./chunk-HEX4IMLO.js";
10
10
  import {
11
11
  Footer
12
12
  } from "./chunk-W2F6WDUX.js";
@@ -56,4 +56,4 @@ var PageLayout = ({
56
56
  export {
57
57
  PageLayout
58
58
  };
59
- //# sourceMappingURL=chunk-GDQWSCJQ.js.map
59
+ //# sourceMappingURL=chunk-26SO4LZ5.js.map
@@ -12,16 +12,16 @@ import {
12
12
  } from "./chunk-3TUCQAYL.js";
13
13
  import {
14
14
  Chip
15
- } from "./chunk-OAK7HFOJ.js";
15
+ } from "./chunk-GWHZFX2H.js";
16
16
  import {
17
17
  Menu
18
- } from "./chunk-BNVQ34FD.js";
18
+ } from "./chunk-P4XZH3OR.js";
19
19
  import {
20
20
  Avatar
21
21
  } from "./chunk-XJBWFDDE.js";
22
22
  import {
23
23
  Button
24
- } from "./chunk-L5Q6UDY3.js";
24
+ } from "./chunk-75GFIQRU.js";
25
25
 
26
26
  // src/components/Conversation/Chat.component.tsx
27
27
  import { useCallback as useCallback3, useMemo } from "react";
@@ -380,6 +380,8 @@ var MessageComposer = ({
380
380
  multiple: true,
381
381
  accept: attachmentAccept,
382
382
  className: "eidos-composer-file-input",
383
+ tabIndex: -1,
384
+ "aria-hidden": "true",
383
385
  onChange: (event) => addFiles(event.target.files),
384
386
  disabled: disabled || pending
385
387
  }
@@ -883,4 +885,4 @@ export {
883
885
  Chat,
884
886
  CommentThread
885
887
  };
886
- //# sourceMappingURL=chunk-GPRJYPIG.js.map
888
+ //# sourceMappingURL=chunk-2JW3WSBF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Conversation/Chat.component.tsx","../src/components/Conversation/MessageComposer.component.tsx","../src/components/Conversation/Conversation.hooks.ts","../src/components/Conversation/Conversation.utils.ts","../src/components/Conversation/MessageItem.component.tsx","../src/components/Conversation/CommentThread.component.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport { ArrowDown, MessagesSquare } from 'lucide-react';\nimport { Button } from '../Button';\nimport { EmptyState } from '../EmptyState';\nimport { Skeleton } from '../Skeleton';\nimport { Spinner } from '../Spinner';\nimport { MessageComposer } from './MessageComposer.component';\nimport { MessageItem } from './MessageItem.component';\nimport type { ChatProps, ConversationMessage } from './Conversation.types';\nimport {\n useLoadMoreOnScrollTop,\n useNewMessageIds,\n useScrollAnchor,\n useStickToBottom,\n} from './Conversation.hooks';\nimport { classNames, continuesRun, formatDateSeparator, isSameDay } from './Conversation.utils';\n\nconst ChatSkeleton: React.FC = () => (\n <div className=\"eidos-chat-skeleton\" aria-hidden=\"true\">\n {[0, 1, 2, 3].map((row) => (\n <div\n key={row}\n className={classNames(\n 'eidos-chat-skeleton-row',\n row % 2 === 1 && 'eidos-chat-skeleton-row--own',\n )}\n >\n <Skeleton variant=\"circular\" width={28} height={28} />\n <Skeleton variant=\"rounded\" height={48} />\n </div>\n ))}\n </div>\n);\n\n/**\n * A bottom-anchored message thread with a composer.\n *\n * Controlled and transport-agnostic: it renders the `messages` it is given and\n * reports intent through `onSend` / `onLoadMore`. It never fetches, so the\n * same array can be persisted and replayed verbatim.\n */\nexport const Chat: React.FC<ChatProps> = ({\n messages,\n currentUserId,\n onSend,\n onRetry,\n readOnly = false,\n readOnlyMessage,\n renderBody,\n messageActions,\n renderMessageFooter,\n loading = false,\n emptyContent,\n hasMore = false,\n loadingMore = false,\n onLoadMore,\n groupConsecutive = true,\n groupWindowMinutes = 5,\n showDateSeparators = true,\n formatTimestamp,\n animateNewMessages = true,\n allowAttachments = false,\n attachmentAccept,\n typing,\n unreadFromId,\n placeholder = 'Write a message...',\n sendOnEnter = true,\n ariaLabel = 'Conversation',\n className = '',\n}) => {\n const { scrollRef, atBottom, scrollToBottom, handleScroll } = useStickToBottom(messages);\n const newIds = useNewMessageIds(messages, animateNewMessages);\n useScrollAnchor(scrollRef, messages);\n\n const loadMoreOnScroll = useLoadMoreOnScrollTop(scrollRef, { hasMore, loadingMore, onLoadMore });\n\n const onScroll = useCallback(() => {\n handleScroll();\n loadMoreOnScroll();\n }, [handleScroll, loadMoreOnScroll]);\n\n const byId = useMemo(() => new Map(messages.map((message) => [message.id, message])), [messages]);\n\n // An id that isn't in the current page must not draw a divider above\n // nothing - it would float at the top of whatever happens to be loaded.\n const unreadIndex = useMemo(() => {\n if (!unreadFromId) return -1;\n return messages.findIndex((message) => message.id === unreadFromId);\n }, [messages, unreadFromId]);\n\n const showComposer = !readOnly && Boolean(onSend);\n const isEmpty = !loading && messages.length === 0;\n\n const renderMessage = (message: ConversationMessage, index: number) => {\n const previous = messages[index - 1];\n const actions = readOnly ? undefined : messageActions?.(message);\n const quoted = message.parentId ? byId.get(message.parentId) : undefined;\n\n const nodes: React.ReactNode[] = [];\n\n if (showDateSeparators && (!previous || !isSameDay(previous.sentAt, message.sentAt))) {\n nodes.push(\n <li key={`date-${message.id}`} className=\"eidos-conversation-separator\">\n <span>{formatDateSeparator(message.sentAt)}</span>\n </li>,\n );\n }\n\n if (index === unreadIndex) {\n nodes.push(\n <li\n key={`unread-${message.id}`}\n className=\"eidos-conversation-separator eidos-conversation-separator--unread\"\n >\n <span>Unread messages</span>\n </li>,\n );\n }\n\n // A separator breaks a run: the message under it needs its own header.\n const grouped =\n groupConsecutive &&\n index !== unreadIndex &&\n nodes.length === 0 &&\n continuesRun(previous, message, groupWindowMinutes);\n\n nodes.push(\n <MessageItem\n key={message.id}\n message={message}\n layout=\"chat\"\n isOwn={Boolean(currentUserId) && message.author.id === currentUserId}\n grouped={grouped}\n isNew={newIds.has(message.id)}\n actions={actions}\n footer={renderMessageFooter?.(message)}\n body={renderBody?.(message)}\n onRetry={!readOnly && onRetry ? () => onRetry(message) : undefined}\n quoted={quoted}\n formatTimestamp={formatTimestamp}\n />,\n );\n\n return nodes;\n };\n\n return (\n <div className={classNames('eidos-chat', className)}>\n <div\n ref={scrollRef}\n className=\"eidos-chat-scroll\"\n onScroll={onScroll}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-busy={loading}\n aria-label={ariaLabel}\n tabIndex={0}\n >\n {hasMore && (\n <div className=\"eidos-chat-load-more\">\n {loadingMore ? (\n <span className=\"eidos-chat-loading-more\">\n <Spinner size=\"sm\" color=\"secondary\" />\n Loading earlier messages…\n </span>\n ) : (\n <Button variant=\"text\" color=\"secondary\" size=\"sm\" onClick={onLoadMore}>\n Load earlier messages\n </Button>\n )}\n </div>\n )}\n\n {loading && <ChatSkeleton />}\n\n {isEmpty &&\n (emptyContent ?? (\n <EmptyState\n icon={<MessagesSquare />}\n title=\"No messages yet\"\n description={\n showComposer ? 'Send the first message to start the conversation.' : undefined\n }\n size=\"sm\"\n />\n ))}\n\n {!loading && messages.length > 0 && (\n <ol className=\"eidos-conversation-list\">{messages.map(renderMessage)}</ol>\n )}\n\n {typing && typing.length > 0 && (\n <div className=\"eidos-chat-typing\" aria-live=\"polite\">\n <span className=\"eidos-chat-typing-dots\" aria-hidden=\"true\">\n <i />\n <i />\n <i />\n </span>\n {typing.length === 1\n ? `${typing[0].name} is typing…`\n : `${typing.length} people are typing…`}\n </div>\n )}\n </div>\n\n {!atBottom && messages.length > 0 && (\n <div className=\"eidos-chat-jump\">\n <Button\n size=\"sm\"\n variant=\"filled\"\n color=\"secondary\"\n preIcon={ArrowDown}\n onClick={() => scrollToBottom('smooth')}\n >\n Latest\n </Button>\n </div>\n )}\n\n {showComposer && (\n <div className=\"eidos-chat-composer\">\n <MessageComposer\n onSubmit={onSend as NonNullable<typeof onSend>}\n placeholder={placeholder}\n sendOnEnter={sendOnEnter}\n allowAttachments={allowAttachments}\n attachmentAccept={attachmentAccept}\n />\n </div>\n )}\n\n {readOnly && readOnlyMessage && (\n <p className=\"eidos-conversation-readonly\">{readOnlyMessage}</p>\n )}\n </div>\n );\n};\n\nChat.displayName = 'Chat';\n","import React, { useCallback, useId, useRef, useState } from 'react';\nimport { Paperclip, Send, X } from 'lucide-react';\nimport { Avatar } from '../Avatar';\nimport { Button } from '../Button';\nimport { Chip } from '../Chip';\nimport type { MessageComposerProps } from './Conversation.types';\nimport { useAutoGrow } from './Conversation.hooks';\nimport { classNames, formatFileSize } from './Conversation.utils';\n\n/**\n * The authoring half of a conversation - a growing text field, optional\n * attachments, and a submit control.\n *\n * Exported on its own so a consumer building a bespoke list can still reuse\n * the input, and used internally by both `Chat` and `CommentThread`.\n */\nexport const MessageComposer: React.FC<MessageComposerProps> = ({\n value,\n onChange,\n onSubmit,\n onCancel,\n placeholder = 'Write a message...',\n submitLabel = 'Send',\n sendOnEnter = false,\n parentId,\n replyingTo,\n allowAttachments = false,\n attachmentAccept,\n author,\n disabled = false,\n requireBody = true,\n autoFocus = false,\n maxLength,\n className = '',\n}) => {\n const [internalBody, setInternalBody] = useState('');\n const [attachments, setAttachments] = useState<File[]>([]);\n const [pending, setPending] = useState(false);\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fileInputId = useId();\n\n const isControlled = value !== undefined;\n const body = isControlled ? value : internalBody;\n\n useAutoGrow(textareaRef, body);\n\n const setBody = useCallback(\n (next: string) => {\n if (!isControlled) setInternalBody(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n const canSubmit = !disabled && !pending && (!requireBody || body.trim().length > 0);\n\n const submit = useCallback(async () => {\n if (!canSubmit) return;\n\n const draft = { body: body.trim(), attachments, parentId };\n const result = onSubmit(draft);\n\n // A synchronous handler clears immediately; an async one keeps the draft\n // until it resolves, so a rejected send never loses what was typed.\n if (!(result instanceof Promise)) {\n setBody('');\n setAttachments([]);\n return;\n }\n\n setPending(true);\n try {\n await result;\n setBody('');\n setAttachments([]);\n } catch {\n // Intentionally swallowed: the draft stays put and the consumer owns\n // error reporting (a Snackbar, an Alert, ...). Rethrowing here would\n // surface as an unhandled rejection from a keystroke.\n } finally {\n setPending(false);\n }\n }, [canSubmit, body, attachments, parentId, onSubmit, setBody]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!sendOnEnter) return;\n // Shift+Enter always inserts a newline; the modifier check also leaves\n // IME composition (which fires Enter to commit) alone.\n if (event.key !== 'Enter' || event.shiftKey || event.nativeEvent.isComposing) return;\n event.preventDefault();\n void submit();\n };\n\n const addFiles = (list: FileList | null) => {\n if (!list?.length) return;\n setAttachments((current) => [...current, ...Array.from(list)]);\n // Reset so selecting the same file twice in a row still fires `change`.\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const removeAttachment = (index: number) =>\n setAttachments((current) => current.filter((_, i) => i !== index));\n\n return (\n <form\n className={classNames('eidos-message-composer', className)}\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n {replyingTo && (\n <div className=\"eidos-composer-reply-hint\">\n <span>\n Replying to <strong>{replyingTo}</strong>\n </span>\n {onCancel && (\n <Button\n variant=\"text\"\n color=\"secondary\"\n size=\"sm\"\n icon={X}\n onClick={onCancel}\n tooltip=\"Cancel reply\"\n aria-label=\"Cancel reply\"\n />\n )}\n </div>\n )}\n\n <div className=\"eidos-composer-row\">\n {author && (\n <div className=\"eidos-composer-avatar\">\n <Avatar\n src={author.avatarSrc}\n name={author.name}\n size=\"sm\"\n color={author.avatarColor ?? 'gray'}\n />\n </div>\n )}\n\n <div className=\"eidos-composer-field\">\n <textarea\n ref={textareaRef}\n className=\"eidos-composer-input\"\n value={body}\n onChange={(event) => setBody(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || pending}\n rows={1}\n maxLength={maxLength}\n // Opt-in and off by default. Only the reply composer sets it, where\n // the field appears in direct response to the user pressing Reply -\n // moving focus there is the expected outcome, not a hijack.\n autoFocus={autoFocus}\n aria-label={placeholder}\n />\n\n {attachments.length > 0 && (\n <ul className=\"eidos-composer-attachments\">\n {attachments.map((file, index) => (\n <li key={`${file.name}-${file.size}-${index}`}>\n <Chip\n size=\"sm\"\n variant=\"outlined\"\n color=\"secondary\"\n preIcon={Paperclip}\n onRemove={() => removeAttachment(index)}\n >\n {file.name}\n {file.size > 0 && ` (${formatFileSize(file.size)})`}\n </Chip>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"eidos-composer-actions\">\n <div className=\"eidos-composer-actions-start\">\n {allowAttachments && (\n <>\n <input\n ref={fileInputRef}\n id={fileInputId}\n type=\"file\"\n multiple\n accept={attachmentAccept}\n // Hidden from both the tab order and the accessibility\n // tree. It is a proxy: the visible button above opens the\n // file dialog via `.click()`, so this input is an\n // implementation detail, not a control.\n //\n // `visually-hidden` keeps an element *focusable* - that is\n // the point of it, for skip links and screen-reader-only\n // text - so a keyboard user landed on an invisible control\n // and met the same \"Attach files\" action twice. `FileUpload`\n // already gets this right with `display: none` +\n // `tabIndex={-1}`; these two had drifted from it.\n //\n // `aria-hidden` is safe here only *because* of the\n // `tabIndex={-1}` beside it - hiding a focusable element is\n // its own violation.\n className=\"eidos-composer-file-input\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={(event) => addFiles(event.target.files)}\n disabled={disabled || pending}\n />\n <Button\n variant=\"text\"\n color=\"secondary\"\n size=\"sm\"\n icon={Paperclip}\n tooltip=\"Attach files\"\n aria-label=\"Attach files\"\n disabled={disabled || pending}\n onClick={() => fileInputRef.current?.click()}\n />\n </>\n )}\n {sendOnEnter && (\n <span className=\"eidos-composer-hint\">\n <kbd>Enter</kbd> to send · <kbd>Shift</kbd>+<kbd>Enter</kbd> for a new line\n </span>\n )}\n </div>\n\n <div className=\"eidos-composer-actions-end\">\n {onCancel && !replyingTo && (\n <Button\n variant=\"text\"\n color=\"secondary\"\n size=\"sm\"\n onClick={onCancel}\n disabled={pending}\n >\n Cancel\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"sm\"\n color=\"primary\"\n preIcon={Send}\n loading={pending}\n disabled={!canSubmit}\n >\n {submitLabel}\n </Button>\n </div>\n </div>\n </form>\n );\n};\n\nMessageComposer.displayName = 'MessageComposer';\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { ConversationMessage } from './Conversation.types';\n\n/**\n * Ids that arrived *after* the first render.\n *\n * Seeded from the first commit so an initial page of history is never\n * animated - otherwise opening a thread fades forty messages in at once,\n * which reads as a glitch rather than as feedback. Only genuinely new ids get\n * the entrance class, and each one only once.\n */\nexport const useNewMessageIds = (\n messages: ConversationMessage[],\n enabled: boolean,\n): Set<string> => {\n const seen = useRef<Set<string> | null>(null);\n const [fresh, setFresh] = useState<Set<string>>(() => new Set());\n\n useEffect(() => {\n // First commit: everything already on screen counts as pre-existing.\n if (seen.current === null) {\n seen.current = new Set(messages.map((message) => message.id));\n return;\n }\n\n if (!enabled) {\n for (const message of messages) seen.current.add(message.id);\n return;\n }\n\n const added = messages.filter((message) => !seen.current?.has(message.id));\n if (!added.length) return;\n\n for (const message of added) seen.current.add(message.id);\n setFresh(new Set(added.map((message) => message.id)));\n }, [messages, enabled]);\n\n return fresh;\n};\n\ninterface StickToBottom {\n scrollRef: React.RefObject<HTMLDivElement | null>;\n /** The viewport is at (or near) the newest message. */\n atBottom: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n handleScroll: () => void;\n}\n\n/** Distance from the bottom still counted as \"reading the newest message\". */\nconst BOTTOM_THRESHOLD_PX = 48;\n\n/**\n * Keeps a bottom-anchored list pinned to the newest message - but only while\n * the reader is already there.\n *\n * Scrolling someone back down while they are reading scrollback is the single\n * most common defect in chat UIs, so arrival of a new message only forces a\n * scroll when `atBottom` was already true. Otherwise the caller surfaces a\n * jump-to-latest affordance and leaves the viewport alone.\n */\nexport const useStickToBottom = (messages: ConversationMessage[]): StickToBottom => {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [atBottom, setAtBottom] = useState(true);\n // Read during a layout effect, so it must not be state - it has to be\n // correct for the commit that is happening right now, not the next render.\n const atBottomRef = useRef(true);\n const lastCount = useRef(messages.length);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n const node = scrollRef.current;\n if (!node) return;\n node.scrollTo({ top: node.scrollHeight, behavior });\n }, []);\n\n const handleScroll = useCallback(() => {\n const node = scrollRef.current;\n if (!node) return;\n const distance = node.scrollHeight - node.scrollTop - node.clientHeight;\n const next = distance <= BOTTOM_THRESHOLD_PX;\n atBottomRef.current = next;\n setAtBottom((current) => (current === next ? current : next));\n }, []);\n\n // Jump (not animate) to the bottom on first paint so a thread opens on its\n // newest message instead of visibly scrolling there.\n useLayoutEffect(() => {\n scrollToBottom('auto');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- mount only\n }, []);\n\n useLayoutEffect(() => {\n if (messages.length > lastCount.current && atBottomRef.current) {\n scrollToBottom('smooth');\n }\n lastCount.current = messages.length;\n }, [messages.length, scrollToBottom]);\n\n return { scrollRef, atBottom, scrollToBottom, handleScroll };\n};\n\n/**\n * Preserves the reader's position when older messages are prepended.\n *\n * Without this, inserting a page above the viewport pushes the content the\n * user was reading down by the height of everything added, which reads as the\n * list jumping to a random place. Capturing `scrollHeight` before the DOM\n * mutation and restoring the delta in a *layout* effect corrects it before the\n * browser paints, so there is no visible shift.\n */\nexport const useScrollAnchor = (\n scrollRef: React.RefObject<HTMLDivElement | null>,\n messages: ConversationMessage[],\n): void => {\n const previous = useRef({ height: 0, firstId: '', count: 0 });\n\n useLayoutEffect(() => {\n const node = scrollRef.current;\n if (!node) return;\n\n const firstId = messages[0]?.id ?? '';\n const before = previous.current;\n // A prepend is the only case where the first id changes while the list\n // grows - an append leaves it untouched, and a replacement shrinks it.\n const prepended =\n before.firstId !== '' && before.firstId !== firstId && messages.length > before.count;\n\n if (prepended) {\n node.scrollTop += node.scrollHeight - before.height;\n }\n\n previous.current = { height: node.scrollHeight, firstId, count: messages.length };\n }, [messages, scrollRef]);\n};\n\n/**\n * Fires `onLoadMore` once the reader approaches the top of the history.\n *\n * Latched on the way in and released only after they scroll back out of the\n * trigger zone, so a single pause near the top can't queue a dozen fetches.\n */\nexport const useLoadMoreOnScrollTop = (\n scrollRef: React.RefObject<HTMLDivElement | null>,\n {\n hasMore,\n loadingMore,\n onLoadMore,\n }: {\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n },\n thresholdPx = 80,\n): (() => void) => {\n const armed = useRef(true);\n\n return useCallback(() => {\n const node = scrollRef.current;\n if (!node) return;\n\n if (node.scrollTop > thresholdPx) {\n armed.current = true;\n return;\n }\n\n if (!armed.current || !hasMore || loadingMore || !onLoadMore) return;\n armed.current = false;\n onLoadMore();\n }, [scrollRef, hasMore, loadingMore, onLoadMore, thresholdPx]);\n};\n\n/**\n * Grows a textarea to fit its content, up to `maxHeight`.\n *\n * Height is written to `style.height` directly rather than through a React\n * inline style: it is measured from the live DOM after every keystroke, so it\n * cannot be expressed as a class, and routing it through state would add a\n * render per character. Assigning the property imperatively also keeps it out\n * of the server-rendered `style` attribute that CSP's `style-src-attr` gates.\n */\nexport const useAutoGrow = (\n ref: React.RefObject<HTMLTextAreaElement | null>,\n value: string,\n maxHeight = 200,\n): void => {\n useLayoutEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n node.style.height = 'auto';\n const next = Math.min(node.scrollHeight, maxHeight);\n node.style.height = `${next}px`;\n node.style.overflowY = node.scrollHeight > maxHeight ? 'auto' : 'hidden';\n }, [ref, value, maxHeight]);\n};\n","import type { ConversationMessage } from './Conversation.types';\n\n/**\n * Timestamp formatting goes through `Intl` rather than a date library on\n * purpose: `dayjs` is currently bundled only into the `DatePicker` chunk, and\n * pulling it in here would add it to every consumer importing a conversation.\n * `Intl` is built in and already locale-aware.\n */\n\nconst timeFormat = new Intl.DateTimeFormat(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n});\n\nconst dateFormat = new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n});\n\nconst dateFormatSameYear = new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'long',\n});\n\n/** Parses an ISO string, returning null rather than an `Invalid Date`. */\nexport const parseDate = (iso: string): Date | null => {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nexport const formatMessageTime = (iso: string): string => {\n const date = parseDate(iso);\n return date ? timeFormat.format(date) : iso;\n};\n\nconst startOfDay = (date: Date): number =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n\nexport const isSameDay = (a: string, b: string): boolean => {\n const first = parseDate(a);\n const second = parseDate(b);\n if (!first || !second) return false;\n return startOfDay(first) === startOfDay(second);\n};\n\n/** `Today` / `Yesterday` / a full date, for the divider between days. */\nexport const formatDateSeparator = (iso: string): string => {\n const date = parseDate(iso);\n if (!date) return iso;\n\n const now = new Date();\n const dayDelta = Math.round((startOfDay(now) - startOfDay(date)) / 86_400_000);\n\n if (dayDelta === 0) return 'Today';\n if (dayDelta === 1) return 'Yesterday';\n return date.getFullYear() === now.getFullYear()\n ? dateFormatSameYear.format(date)\n : dateFormat.format(date);\n};\n\nconst FILE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB'];\n\nexport const formatFileSize = (bytes: number): string => {\n if (!Number.isFinite(bytes) || bytes < 0) return '';\n if (bytes < 1024) return `${bytes} B`;\n\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < FILE_UNITS.length - 1) {\n value /= 1024;\n unit += 1;\n }\n // One decimal below 10 (9.4 MB), none above it (24 MB) - the extra digit\n // stops carrying information once the integer part is two digits.\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${FILE_UNITS[unit]}`;\n};\n\n/**\n * Whether `message` continues a run started by `previous` - same author, same\n * day, and within the grouping window. A grouped message hides its avatar and\n * author line.\n */\nexport const continuesRun = (\n previous: ConversationMessage | undefined,\n message: ConversationMessage,\n windowMinutes: number,\n): boolean => {\n if (!previous) return false;\n if (previous.author.id !== message.author.id) return false;\n if (!isSameDay(previous.sentAt, message.sentAt)) return false;\n\n const before = parseDate(previous.sentAt);\n const after = parseDate(message.sentAt);\n if (!before || !after) return false;\n\n return Math.abs(after.getTime() - before.getTime()) <= windowMinutes * 60_000;\n};\n\nexport const sortBySentAt = (messages: ConversationMessage[]): ConversationMessage[] =>\n [...messages].sort((a, b) => {\n const first = parseDate(a.sentAt)?.getTime() ?? 0;\n const second = parseDate(b.sentAt)?.getTime() ?? 0;\n return first - second;\n });\n\nexport interface ThreadNode {\n message: ConversationMessage;\n replies: ConversationMessage[];\n}\n\n/**\n * Collapses a flat list into one level of nesting.\n *\n * Deeper chains are flattened onto the nearest **top-level** ancestor rather\n * than being dropped or nested further: indentation past one level is\n * unreadable on a phone, and silently discarding a reply-to-a-reply would lose\n * data the consumer stored. `replyingToName` on the rendered reply is what\n * preserves who was actually answered.\n *\n * A `parentId` pointing at a message that isn't present (paged out, deleted)\n * is treated as top-level, so nothing ever disappears from the list.\n */\nexport const buildThread = (messages: ConversationMessage[]): ThreadNode[] => {\n const byId = new Map(messages.map((message) => [message.id, message]));\n\n /** Walks up to the outermost ancestor, guarding against a parentId cycle. */\n const rootIdOf = (message: ConversationMessage): string => {\n const seen = new Set<string>([message.id]);\n let current = message;\n\n while (current.parentId) {\n const parent = byId.get(current.parentId);\n if (!parent || seen.has(parent.id)) break;\n seen.add(parent.id);\n current = parent;\n }\n\n return current.id;\n };\n\n const nodes = new Map<string, ThreadNode>();\n const roots: ThreadNode[] = [];\n\n for (const message of messages) {\n if (message.parentId && byId.has(message.parentId)) continue;\n const node: ThreadNode = { message, replies: [] };\n nodes.set(message.id, node);\n roots.push(node);\n }\n\n for (const message of messages) {\n if (!message.parentId || !byId.has(message.parentId)) continue;\n nodes.get(rootIdOf(message))?.replies.push(message);\n }\n\n for (const node of nodes.values()) {\n node.replies = sortBySentAt(node.replies);\n }\n\n return roots;\n};\n\n/** Name of the author a reply was addressed to, when it isn't its own parent. */\nexport const replyTargetName = (\n message: ConversationMessage,\n byId: Map<string, ConversationMessage>,\n rootId: string,\n): string | undefined => {\n if (!message.parentId || message.parentId === rootId) return undefined;\n return byId.get(message.parentId)?.author.name;\n};\n\n/** Trims a quoted excerpt so a long parent message can't dominate the reply. */\nexport const excerpt = (body: string, maxLength = 120): string => {\n const flat = body.replace(/\\s+/g, ' ').trim();\n return flat.length > maxLength ? `${flat.slice(0, maxLength - 1)}…` : flat;\n};\n\nexport const classNames = (...values: Array<string | false | null | undefined>): string =>\n values.filter(Boolean).join(' ');\n","import React from 'react';\nimport { AlertCircle, MoreHorizontal, Paperclip, RotateCw } from 'lucide-react';\nimport { Avatar } from '../Avatar';\nimport { Button } from '../Button';\nimport { Menu } from '../Menu';\nimport { Pill } from '../Pill';\nimport { Spinner } from '../Spinner';\nimport type { ConversationMessage, MessageAttachment } from './Conversation.types';\nimport type { MenuItemType } from '../Menu';\nimport { classNames, excerpt, formatFileSize, formatMessageTime } from './Conversation.utils';\n\nexport interface MessageItemProps {\n message: ConversationMessage;\n /** 'chat' right-aligns own messages into bubbles; 'comment' renders a flat card. */\n layout: 'chat' | 'comment';\n isOwn: boolean;\n /** Continues a run from the same author - hides the avatar and author line. */\n grouped: boolean;\n /** Plays the entrance animation. */\n isNew: boolean;\n actions?: MenuItemType[];\n footer?: React.ReactNode;\n body?: React.ReactNode;\n onRetry?: () => void;\n /** Author of the message being answered, for a flattened deep reply. */\n replyingToName?: string;\n /** Quoted parent, rendered above the body in chat layout. */\n quoted?: ConversationMessage;\n /** Reply affordance; omitted entirely when the viewer may not reply. */\n onReply?: () => void;\n formatTimestamp?: (iso: string) => string;\n}\n\nconst AttachmentList: React.FC<{ attachments: MessageAttachment[] }> = ({ attachments }) => (\n <ul className=\"eidos-message-attachments\">\n {attachments.map((attachment) => {\n const label = (\n <>\n <Paperclip aria-hidden=\"true\" />\n <span className=\"eidos-message-attachment-name\">{attachment.name}</span>\n {attachment.size !== undefined && (\n <span className=\"eidos-message-attachment-size\">{formatFileSize(attachment.size)}</span>\n )}\n </>\n );\n\n return (\n <li key={attachment.id} className=\"eidos-message-attachment\">\n {attachment.url ? (\n <a\n href={attachment.url}\n className=\"eidos-message-attachment-link\"\n target=\"_blank\"\n rel=\"noreferrer\"\n download={attachment.name}\n >\n {label}\n </a>\n ) : (\n <span className=\"eidos-message-attachment-link\">{label}</span>\n )}\n </li>\n );\n })}\n </ul>\n);\n\nexport const MessageItem: React.FC<MessageItemProps> = ({\n message,\n layout,\n isOwn,\n grouped,\n isNew,\n actions,\n footer,\n body,\n onRetry,\n replyingToName,\n quoted,\n onReply,\n formatTimestamp,\n}) => {\n const { author, status = 'sent' } = message;\n const timestamp = formatTimestamp\n ? formatTimestamp(message.sentAt)\n : formatMessageTime(message.sentAt);\n // An empty action list must not leave a dead trigger behind - see the\n // permissions note in Conversation.types.ts.\n const hasActions = Boolean(actions && actions.length > 0);\n\n return (\n <li\n className={classNames(\n 'eidos-message',\n `eidos-message--${layout}`,\n isOwn && 'eidos-message--own',\n grouped && 'eidos-message--grouped',\n status !== 'sent' && `eidos-message--${status}`,\n isNew && 'eidos-message--enter',\n )}\n data-message-id={message.id}\n >\n <div className=\"eidos-message-avatar\">\n {!grouped && (\n <Avatar\n src={author.avatarSrc}\n name={author.name}\n size=\"sm\"\n color={author.avatarColor ?? 'gray'}\n />\n )}\n </div>\n\n <div className=\"eidos-message-main\">\n {!grouped && (\n <div className=\"eidos-message-header\">\n <span className=\"eidos-message-author\">{author.name}</span>\n {author.role && (\n <Pill size=\"sm\" variant=\"outlined\" color=\"secondary\">\n {author.role}\n </Pill>\n )}\n <time className=\"eidos-message-time\" dateTime={message.sentAt}>\n {timestamp}\n </time>\n {message.edited && <span className=\"eidos-message-edited\">edited</span>}\n </div>\n )}\n\n <div className=\"eidos-message-bubble\">\n {quoted && (\n <blockquote className=\"eidos-message-quote\">\n <span className=\"eidos-message-quote-author\">{quoted.author.name}</span>\n <span className=\"eidos-message-quote-body\">{excerpt(quoted.body)}</span>\n </blockquote>\n )}\n\n {replyingToName && (\n <span className=\"eidos-message-reply-target\">Replying to {replyingToName}</span>\n )}\n\n <div className=\"eidos-message-body\">{body ?? message.body}</div>\n\n {message.attachments && message.attachments.length > 0 && (\n <AttachmentList attachments={message.attachments} />\n )}\n\n {grouped && (\n <time\n className=\"eidos-message-time eidos-message-time--inline\"\n dateTime={message.sentAt}\n >\n {timestamp}\n </time>\n )}\n </div>\n\n {status === 'sending' && (\n <span className=\"eidos-message-status\">\n <Spinner size=\"sm\" color=\"secondary\" />\n Sending…\n </span>\n )}\n\n {status === 'failed' && (\n <span className=\"eidos-message-status eidos-message-status--failed\">\n <AlertCircle aria-hidden=\"true\" />\n Not sent\n {onRetry && (\n <Button variant=\"text\" color=\"danger\" size=\"sm\" preIcon={RotateCw} onClick={onRetry}>\n Retry\n </Button>\n )}\n </span>\n )}\n\n {footer && <div className=\"eidos-message-footer\">{footer}</div>}\n\n {onReply && (\n <div className=\"eidos-message-reply\">\n <Button variant=\"text\" color=\"secondary\" size=\"sm\" onClick={onReply}>\n Reply\n </Button>\n </div>\n )}\n </div>\n\n {hasActions && (\n <div className=\"eidos-message-actions\">\n <Menu\n items={actions ?? []}\n trigger={\n <Button\n variant=\"text\"\n color=\"secondary\"\n size=\"sm\"\n icon={MoreHorizontal}\n aria-label={`Actions for ${author.name}'s message`}\n />\n }\n />\n </div>\n )}\n </li>\n );\n};\n\nMessageItem.displayName = 'MessageItem';\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { MessageSquare } from 'lucide-react';\nimport { Button } from '../Button';\nimport { EmptyState } from '../EmptyState';\nimport { Skeleton } from '../Skeleton';\nimport { Spinner } from '../Spinner';\nimport { MessageComposer } from './MessageComposer.component';\nimport { MessageItem } from './MessageItem.component';\nimport type { CommentThreadProps, ConversationMessage, MessageDraft } from './Conversation.types';\nimport { useNewMessageIds } from './Conversation.hooks';\nimport {\n buildThread,\n classNames,\n continuesRun,\n replyTargetName,\n sortBySentAt,\n} from './Conversation.utils';\n\nconst CommentSkeleton: React.FC = () => (\n <div className=\"eidos-comment-thread-skeleton\" aria-hidden=\"true\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"eidos-comment-thread-skeleton-row\">\n <Skeleton variant=\"circular\" width={28} height={28} />\n <Skeleton variant=\"text\" lines={2} />\n </div>\n ))}\n </div>\n);\n\n/**\n * A comment section: document flow, no internal scroll container, one level of\n * nesting.\n *\n * Shares its data model and message rendering with `Chat`, so history captured\n * in one can be displayed in the other. Unlike `Chat` it has no scroll region\n * of its own - it grows with the page and pages *downward* via `onLoadMore`.\n */\nexport const CommentThread: React.FC<CommentThreadProps> = ({\n messages,\n currentUserId,\n onSend,\n onReply,\n onRetry,\n readOnly = false,\n readOnlyMessage,\n renderBody,\n messageActions,\n renderMessageFooter,\n loading = false,\n emptyContent,\n hasMore = false,\n loadingMore = false,\n onLoadMore,\n groupConsecutive = true,\n groupWindowMinutes = 5,\n formatTimestamp,\n animateNewMessages = true,\n allowAttachments = false,\n attachmentAccept,\n order = 'oldest-first',\n composerPosition = 'bottom',\n placeholder = 'Add a comment...',\n sendOnEnter = false,\n title,\n ariaLabel = 'Comments',\n className = '',\n}) => {\n const [replyingToId, setReplyingToId] = useState<string | null>(null);\n const newIds = useNewMessageIds(messages, animateNewMessages);\n\n const byId = useMemo(() => new Map(messages.map((message) => [message.id, message])), [messages]);\n\n const roots = useMemo(() => {\n const thread = buildThread(messages);\n const sorted = sortBySentAt(thread.map((node) => node.message));\n const ordered = order === 'newest-first' ? [...sorted].reverse() : sorted;\n const nodeById = new Map(thread.map((node) => [node.message.id, node]));\n // Replies always read oldest-first, even when roots are reversed - a\n // conversation under a single comment is chronological by nature.\n return ordered.map((message) => nodeById.get(message.id)!);\n }, [messages, order]);\n\n const canReply = !readOnly && Boolean(onReply);\n const showComposer = !readOnly && Boolean(onSend);\n const isEmpty = !loading && messages.length === 0;\n const total = messages.length;\n\n const handleReply = useCallback(\n async (draft: MessageDraft) => {\n await onReply?.(draft);\n setReplyingToId(null);\n },\n [onReply],\n );\n\n const renderComment = (\n message: ConversationMessage,\n options: { rootId: string; previous?: ConversationMessage; isReply: boolean },\n ) => {\n const actions = readOnly ? undefined : messageActions?.(message);\n\n return (\n <MessageItem\n key={message.id}\n message={message}\n layout=\"comment\"\n isOwn={Boolean(currentUserId) && message.author.id === currentUserId}\n grouped={groupConsecutive && continuesRun(options.previous, message, groupWindowMinutes)}\n isNew={newIds.has(message.id)}\n actions={actions}\n footer={renderMessageFooter?.(message)}\n body={renderBody?.(message)}\n onRetry={!readOnly && onRetry ? () => onRetry(message) : undefined}\n replyingToName={\n options.isReply ? replyTargetName(message, byId, options.rootId) : undefined\n }\n onReply={canReply ? () => setReplyingToId(message.id) : undefined}\n formatTimestamp={formatTimestamp}\n />\n );\n };\n\n const composer = showComposer && (\n <MessageComposer\n onSubmit={onSend as NonNullable<typeof onSend>}\n placeholder={placeholder}\n submitLabel=\"Comment\"\n sendOnEnter={sendOnEnter}\n allowAttachments={allowAttachments}\n attachmentAccept={attachmentAccept}\n className=\"eidos-comment-thread-composer\"\n />\n );\n\n return (\n <section className={classNames('eidos-comment-thread', className)} aria-label={ariaLabel}>\n {(title || total > 0) && (\n <header className=\"eidos-comment-thread-header\">\n {title && <h3 className=\"eidos-comment-thread-title\">{title}</h3>}\n {total > 0 && (\n <span className=\"eidos-comment-thread-count\">\n {total} {total === 1 ? 'comment' : 'comments'}\n </span>\n )}\n </header>\n )}\n\n {composerPosition === 'top' && composer}\n\n {loading && <CommentSkeleton />}\n\n {isEmpty &&\n (emptyContent ?? (\n <EmptyState\n icon={<MessageSquare />}\n title=\"No comments yet\"\n description={showComposer ? 'Start the discussion by leaving a comment.' : undefined}\n size=\"sm\"\n />\n ))}\n\n {!loading && roots.length > 0 && (\n <ol className=\"eidos-conversation-list eidos-comment-thread-list\" aria-busy={loadingMore}>\n {roots.map((node) => (\n <li key={node.message.id} className=\"eidos-comment-thread-node\">\n <ol className=\"eidos-conversation-list\">\n {renderComment(node.message, { rootId: node.message.id, isReply: false })}\n </ol>\n\n {node.replies.length > 0 && (\n <ol className=\"eidos-conversation-list eidos-comment-thread-replies\">\n {node.replies.map((reply, index) =>\n renderComment(reply, {\n rootId: node.message.id,\n previous: node.replies[index - 1],\n isReply: true,\n }),\n )}\n </ol>\n )}\n\n {replyingToId &&\n (replyingToId === node.message.id ||\n node.replies.some((reply) => reply.id === replyingToId)) && (\n <div className=\"eidos-comment-thread-reply-composer\">\n <MessageComposer\n onSubmit={handleReply}\n onCancel={() => setReplyingToId(null)}\n parentId={replyingToId}\n replyingTo={byId.get(replyingToId)?.author.name}\n placeholder=\"Write a reply...\"\n submitLabel=\"Reply\"\n sendOnEnter={sendOnEnter}\n allowAttachments={allowAttachments}\n attachmentAccept={attachmentAccept}\n autoFocus\n />\n </div>\n )}\n </li>\n ))}\n </ol>\n )}\n\n {hasMore && (\n <div className=\"eidos-comment-thread-load-more\">\n {loadingMore ? (\n <span className=\"eidos-comment-thread-loading-more\">\n <Spinner size=\"sm\" color=\"secondary\" />\n Loading more comments…\n </span>\n ) : (\n <Button variant=\"outlined\" color=\"secondary\" size=\"sm\" onClick={onLoadMore}>\n Load more comments\n </Button>\n )}\n </div>\n )}\n\n {composerPosition === 'bottom' && composer}\n\n {readOnly && readOnlyMessage && (\n <p className=\"eidos-conversation-readonly\">{readOnlyMessage}</p>\n )}\n </section>\n );\n};\n\nCommentThread.displayName = 'CommentThread';\n"],"mappings":"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","names":["useCallback","useCallback","useRef","useState","useState","useRef","useCallback","Paperclip","Fragment","jsx","jsxs","Paperclip","jsx","jsxs","useCallback","useCallback","useMemo","useState","jsx","jsxs","useState","useMemo","useCallback"]}
@@ -1,18 +1,20 @@
1
1
  import {
2
2
  Select
3
- } from "./chunk-7SVDYEKM.js";
3
+ } from "./chunk-MQAOXZD4.js";
4
4
  import {
5
5
  Input
6
- } from "./chunk-JRLUZDKA.js";
6
+ } from "./chunk-YAKTVIVK.js";
7
7
  import {
8
8
  Dropdown
9
- } from "./chunk-6CPCNQKV.js";
9
+ } from "./chunk-JHX6JK3M.js";
10
10
  import {
11
11
  Button
12
- } from "./chunk-L5Q6UDY3.js";
12
+ } from "./chunk-75GFIQRU.js";
13
13
  import {
14
- fullWidthModifier
15
- } from "./chunk-EAJHEYZM.js";
14
+ devWarn,
15
+ fullWidthModifier,
16
+ useDialogFocus
17
+ } from "./chunk-RHHZRTWM.js";
16
18
  import {
17
19
  __commonJS,
18
20
  __toESM
@@ -480,7 +482,7 @@ var require_weekOfYear = __commonJS({
480
482
  var import_dayjs2 = __toESM(require_dayjs_min(), 1);
481
483
  var import_utc = __toESM(require_utc(), 1);
482
484
  var import_timezone = __toESM(require_timezone(), 1);
483
- import { useState as useState2, useCallback as useCallback3, useRef, useMemo as useMemo2 } from "react";
485
+ import { useState as useState2, useCallback as useCallback3, useRef, useMemo as useMemo2, useId, useEffect as useEffect2 } from "react";
484
486
  import { Calendar as CalendarIcon, X } from "lucide-react";
485
487
 
486
488
  // src/components/DatePicker/Calendar.component.tsx
@@ -634,7 +636,15 @@ var Calendar = ({
634
636
  );
635
637
  return /* @__PURE__ */ jsxs("div", { className: "eidos-calendar", children: [
636
638
  /* @__PURE__ */ jsx("div", { className: "eidos-calendar-header", children: showNavigation ? granularity === "month" ? /* @__PURE__ */ jsxs(Fragment, { children: [
637
- /* @__PURE__ */ jsx(Button, { variant: "text", icon: ChevronLeft, onClick: handlePrevYear }),
639
+ /* @__PURE__ */ jsx(
640
+ Button,
641
+ {
642
+ variant: "text",
643
+ icon: ChevronLeft,
644
+ onClick: handlePrevYear,
645
+ "aria-label": "Previous year"
646
+ }
647
+ ),
638
648
  /* @__PURE__ */ jsx("div", { className: "eidos-calendar-selectors", children: /* @__PURE__ */ jsx(
639
649
  Select,
640
650
  {
@@ -642,14 +652,31 @@ var Calendar = ({
642
652
  value: currentDate.year().toString(),
643
653
  onChange: handleYearSelect,
644
654
  clearable: false,
655
+ inputProps: { "aria-label": "Year" },
645
656
  dropdownProps: {
646
657
  dropdownGroup: "calendar-navigation"
647
658
  }
648
659
  }
649
660
  ) }),
650
- /* @__PURE__ */ jsx(Button, { variant: "text", icon: ChevronRight, onClick: handleNextYear })
661
+ /* @__PURE__ */ jsx(
662
+ Button,
663
+ {
664
+ variant: "text",
665
+ icon: ChevronRight,
666
+ onClick: handleNextYear,
667
+ "aria-label": "Next year"
668
+ }
669
+ )
651
670
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
652
- /* @__PURE__ */ jsx(Button, { variant: "text", icon: ChevronLeft, onClick: handlePrevMonth }),
671
+ /* @__PURE__ */ jsx(
672
+ Button,
673
+ {
674
+ variant: "text",
675
+ icon: ChevronLeft,
676
+ onClick: handlePrevMonth,
677
+ "aria-label": "Previous month"
678
+ }
679
+ ),
653
680
  /* @__PURE__ */ jsxs("div", { className: "eidos-calendar-selectors", children: [
654
681
  /* @__PURE__ */ jsx(
655
682
  Select,
@@ -658,6 +685,7 @@ var Calendar = ({
658
685
  value: currentDate.month().toString(),
659
686
  onChange: handleMonthSelect,
660
687
  clearable: false,
688
+ inputProps: { "aria-label": "Month" },
661
689
  dropdownProps: {
662
690
  dropdownGroup: "calendar-navigation"
663
691
  }
@@ -670,13 +698,22 @@ var Calendar = ({
670
698
  value: currentDate.year().toString(),
671
699
  onChange: handleYearSelect,
672
700
  clearable: false,
701
+ inputProps: { "aria-label": "Year" },
673
702
  dropdownProps: {
674
703
  dropdownGroup: "calendar-navigation"
675
704
  }
676
705
  }
677
706
  )
678
707
  ] }),
679
- /* @__PURE__ */ jsx(Button, { variant: "text", icon: ChevronRight, onClick: handleNextMonth })
708
+ /* @__PURE__ */ jsx(
709
+ Button,
710
+ {
711
+ variant: "text",
712
+ icon: ChevronRight,
713
+ onClick: handleNextMonth,
714
+ "aria-label": "Next month"
715
+ }
716
+ )
680
717
  ] }) : /* @__PURE__ */ jsx("div", { className: "eidos-calendar-label", children: currentDate.format(granularity === "month" ? "YYYY" : "MMMM YYYY") }) }),
681
718
  granularity === "month" ? /* @__PURE__ */ jsx("div", { className: "eidos-calendar-month-cells", children: monthCells.map((month, index) => /* @__PURE__ */ jsx(
682
719
  "button",
@@ -838,6 +875,7 @@ var DatePicker = ({
838
875
  timeFormat: "HH:mm",
839
876
  timezone: "UTC"
840
877
  },
878
+ label,
841
879
  placeholder = "Select date...",
842
880
  disabled = false,
843
881
  required = false,
@@ -856,7 +894,22 @@ var DatePicker = ({
856
894
  maxHeight,
857
895
  autoWidth = false
858
896
  }) => {
859
- const [dropdownKey, setDropdownKey] = useState2(0);
897
+ const [isOpen, setIsOpen] = useState2(false);
898
+ const panelId = `${useId()}-date-panel`;
899
+ const panelRef = useRef(null);
900
+ useDialogFocus(isOpen, panelRef, { trapTab: false });
901
+ const fieldRef = useRef(null);
902
+ useEffect2(() => {
903
+ const element = fieldRef.current;
904
+ if (!element) return;
905
+ const named = (element.labels?.length ?? 0) > 0 || element.hasAttribute("aria-label") || element.hasAttribute("aria-labelledby");
906
+ if (!named) {
907
+ devWarn(
908
+ "date-picker-missing-label",
909
+ 'DatePicker: no accessible name. Pass `label` for a visible one, or `inputProps={{ "aria-label": "..." }}` where it must stay visually unlabelled - otherwise the field is announced as just "combobox". A placeholder is not a label, and disappears as soon as a date is chosen.'
910
+ );
911
+ }
912
+ }, []);
860
913
  const pickerTimezone = format.timezone || "UTC";
861
914
  const composeDateOnly = useCallback3(
862
915
  (date, boundary = "start") => {
@@ -973,7 +1026,7 @@ var DatePicker = ({
973
1026
  time: time.enabled ? activeTime : void 0
974
1027
  };
975
1028
  onChange?.(newValue);
976
- setDropdownKey((prev) => prev + 1);
1029
+ setIsOpen(false);
977
1030
  break;
978
1031
  }
979
1032
  case "multiple": {
@@ -1026,7 +1079,7 @@ var DatePicker = ({
1026
1079
  time: time.enabled ? currentRangeTime : void 0
1027
1080
  };
1028
1081
  onChange?.(newValue);
1029
- setDropdownKey((prev) => prev + 1);
1082
+ setIsOpen(false);
1030
1083
  }
1031
1084
  break;
1032
1085
  }
@@ -1128,7 +1181,7 @@ var DatePicker = ({
1128
1181
  }
1129
1182
  })();
1130
1183
  onChange?.(clearedValue);
1131
- setDropdownKey((prev) => prev + 1);
1184
+ setIsOpen(false);
1132
1185
  },
1133
1186
  [mode, time, onChange, defaultStartTime, defaultEndTime]
1134
1187
  );
@@ -1137,28 +1190,45 @@ var DatePicker = ({
1137
1190
  {
1138
1191
  ref: triggerRef,
1139
1192
  className: `eidos-date-picker-trigger${fullWidth ? ` ${fullWidthModifier("eidos-date-picker-trigger")}` : ""}`,
1193
+ onKeyDown: (event) => {
1194
+ if (disabled) return;
1195
+ if (event.key === "Enter" || event.key === " " || event.key === "ArrowDown") {
1196
+ event.preventDefault();
1197
+ setIsOpen(true);
1198
+ } else if (event.key === "Escape" && isOpen) {
1199
+ event.preventDefault();
1200
+ setIsOpen(false);
1201
+ }
1202
+ },
1140
1203
  children: /* @__PURE__ */ jsx3(
1141
1204
  Input,
1142
1205
  {
1206
+ ref: fieldRef,
1143
1207
  value: displayValue,
1208
+ label,
1144
1209
  placeholder,
1145
1210
  disabled,
1146
1211
  required,
1147
1212
  name,
1148
1213
  id,
1214
+ role: "combobox",
1215
+ "aria-haspopup": "dialog",
1216
+ "aria-expanded": isOpen,
1217
+ "aria-controls": isOpen ? panelId : void 0,
1149
1218
  fullWidth,
1150
1219
  readOnly: true,
1151
1220
  preIcon: CalendarIcon,
1152
1221
  posIcon: displayValue ? X : void 0,
1153
1222
  posIconButton: !!displayValue,
1154
1223
  onPosIconClick: displayValue ? handleClear : void 0,
1224
+ posIconLabel: "Clear date",
1155
1225
  ...inputProps,
1156
1226
  clearable: false
1157
1227
  }
1158
1228
  )
1159
1229
  }
1160
1230
  );
1161
- const dropdownContent = /* @__PURE__ */ jsxs3("div", { className: "eidos-date-picker-content", children: [
1231
+ const dropdownContent = /* @__PURE__ */ jsxs3("div", { ref: panelRef, id: panelId, className: "eidos-date-picker-content", children: [
1162
1232
  /* @__PURE__ */ jsx3("div", { className: "eidos-date-picker-calendars-wrapper", children: Array.from({ length: numberOfCalendars }, (_, index) => {
1163
1233
  const calendarDate = calendarDates[index] ?? (0, import_dayjs2.default)().add(index, "month");
1164
1234
  return /* @__PURE__ */ jsx3(
@@ -1295,6 +1365,8 @@ var DatePicker = ({
1295
1365
  children: /* @__PURE__ */ jsx3(
1296
1366
  Dropdown,
1297
1367
  {
1368
+ open: isOpen,
1369
+ onOpenChange: setIsOpen,
1298
1370
  trigger: triggerElement,
1299
1371
  content: dropdownContent,
1300
1372
  placement: "bottom",
@@ -1305,8 +1377,7 @@ var DatePicker = ({
1305
1377
  autoWidth,
1306
1378
  fullWidth,
1307
1379
  triggerRef
1308
- },
1309
- dropdownKey
1380
+ }
1310
1381
  )
1311
1382
  }
1312
1383
  );
@@ -1318,4 +1389,4 @@ export {
1318
1389
  TimeInput,
1319
1390
  DatePicker
1320
1391
  };
1321
- //# sourceMappingURL=chunk-MHZIBV2C.js.map
1392
+ //# sourceMappingURL=chunk-2PCCGQOH.js.map