@mieweb/ui 0.10.0-dev.31 → 0.10.0-dev.33

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 (493) hide show
  1. package/dist/CsvBlock-CFXSDPBI.js +9 -0
  2. package/dist/{CsvBlock-VLMG7GUO.js.map → CsvBlock-CFXSDPBI.js.map} +1 -1
  3. package/dist/CsvBlock-RGO7JXHJ.cjs +18 -0
  4. package/dist/{CsvBlock-FX5YNGNE.cjs.map → CsvBlock-RGO7JXHJ.cjs.map} +1 -1
  5. package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +18 -0
  6. package/dist/{HtmlPreviewBlock-UO37JQ3K.cjs.map → HtmlPreviewBlock-VBYXCXVT.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-Z2GCK325.js +9 -0
  8. package/dist/{HtmlPreviewBlock-5JE7L3GR.js.map → HtmlPreviewBlock-Z2GCK325.js.map} +1 -1
  9. package/dist/MermaidBlock-I2R2BQOX.cjs +18 -0
  10. package/dist/{MermaidBlock-RZ75RPZA.cjs.map → MermaidBlock-I2R2BQOX.cjs.map} +1 -1
  11. package/dist/MermaidBlock-XCAK7IA5.js +9 -0
  12. package/dist/{MermaidBlock-3XHFBAMV.js.map → MermaidBlock-XCAK7IA5.js.map} +1 -1
  13. package/dist/SurveyBlock-KI5JOWCL.js +9 -0
  14. package/dist/{SurveyBlock-MUVJ3JUI.js.map → SurveyBlock-KI5JOWCL.js.map} +1 -1
  15. package/dist/SurveyBlock-UKSGISRT.cjs +18 -0
  16. package/dist/{SurveyBlock-VH47YXZC.cjs.map → SurveyBlock-UKSGISRT.cjs.map} +1 -1
  17. package/dist/brands/index.cjs +7 -7
  18. package/dist/brands/index.js +2 -2
  19. package/dist/{chunk-6ZPTZTKN.js → chunk-24AFHH4J.js} +3 -3
  20. package/dist/{chunk-6ZPTZTKN.js.map → chunk-24AFHH4J.js.map} +1 -1
  21. package/dist/{chunk-BNH4SXJB.js → chunk-2X54ZLT6.js} +6 -6
  22. package/dist/{chunk-BNH4SXJB.js.map → chunk-2X54ZLT6.js.map} +1 -1
  23. package/dist/{chunk-TYE5K5WV.cjs → chunk-32ZCJOSR.cjs} +4 -4
  24. package/dist/{chunk-TYE5K5WV.cjs.map → chunk-32ZCJOSR.cjs.map} +1 -1
  25. package/dist/chunk-47P5QLX4.cjs +42 -0
  26. package/dist/chunk-47P5QLX4.cjs.map +1 -0
  27. package/dist/chunk-4ZB7RSMY.cjs +306 -0
  28. package/dist/chunk-4ZB7RSMY.cjs.map +1 -0
  29. package/dist/chunk-56VTM4OX.js +261 -0
  30. package/dist/chunk-56VTM4OX.js.map +1 -0
  31. package/dist/{chunk-D22GE27K.js → chunk-5A4SL436.js} +4 -4
  32. package/dist/{chunk-D22GE27K.js.map → chunk-5A4SL436.js.map} +1 -1
  33. package/dist/chunk-6BNZLN4B.cjs +548 -0
  34. package/dist/chunk-6BNZLN4B.cjs.map +1 -0
  35. package/dist/chunk-6JSFT2J5.js +130 -0
  36. package/dist/chunk-6JSFT2J5.js.map +1 -0
  37. package/dist/chunk-6N7NMOSV.js +233 -0
  38. package/dist/chunk-6N7NMOSV.js.map +1 -0
  39. package/dist/chunk-6TTCZY3P.cjs +4 -0
  40. package/dist/chunk-6TTCZY3P.cjs.map +1 -0
  41. package/dist/{chunk-TTSSUOEV.cjs → chunk-7C5W744U.cjs} +8 -8
  42. package/dist/{chunk-TTSSUOEV.cjs.map → chunk-7C5W744U.cjs.map} +1 -1
  43. package/dist/chunk-7HUTR6RX.js +178 -0
  44. package/dist/chunk-7HUTR6RX.js.map +1 -0
  45. package/dist/chunk-7IRTD4JT.cjs +61 -0
  46. package/dist/chunk-7IRTD4JT.cjs.map +1 -0
  47. package/dist/{chunk-YU55JD35.js → chunk-7QW6TU4X.js} +3 -3
  48. package/dist/{chunk-YU55JD35.js.map → chunk-7QW6TU4X.js.map} +1 -1
  49. package/dist/chunk-7WJ6MBF5.cjs +47 -0
  50. package/dist/chunk-7WJ6MBF5.cjs.map +1 -0
  51. package/dist/chunk-A4W5CSK7.cjs +216 -0
  52. package/dist/chunk-A4W5CSK7.cjs.map +1 -0
  53. package/dist/{chunk-WXFGHDTV.cjs → chunk-AJPFQF3H.cjs} +18 -18
  54. package/dist/{chunk-WXFGHDTV.cjs.map → chunk-AJPFQF3H.cjs.map} +1 -1
  55. package/dist/chunk-AMYFRY7K.js +3 -0
  56. package/dist/chunk-AMYFRY7K.js.map +1 -0
  57. package/dist/{chunk-X6A27RGO.cjs → chunk-ANMX7YDL.cjs} +2 -2
  58. package/dist/{chunk-X6A27RGO.cjs.map → chunk-ANMX7YDL.cjs.map} +1 -1
  59. package/dist/{chunk-DVOQ3JNO.js → chunk-B4CKCNWD.js} +16 -8
  60. package/dist/chunk-B4CKCNWD.js.map +1 -0
  61. package/dist/chunk-BJ6ABRSQ.cjs +256 -0
  62. package/dist/chunk-BJ6ABRSQ.cjs.map +1 -0
  63. package/dist/chunk-BXRQ6HEP.cjs +4 -0
  64. package/dist/chunk-BXRQ6HEP.cjs.map +1 -0
  65. package/dist/{chunk-TJCX4OML.cjs → chunk-C77FAR3F.cjs} +2 -2
  66. package/dist/{chunk-TJCX4OML.cjs.map → chunk-C77FAR3F.cjs.map} +1 -1
  67. package/dist/chunk-CBBKWRLG.js +213 -0
  68. package/dist/chunk-CBBKWRLG.js.map +1 -0
  69. package/dist/{chunk-ZTMYKAVU.cjs → chunk-CCAVJSWL.cjs} +49 -48
  70. package/dist/chunk-CCAVJSWL.cjs.map +1 -0
  71. package/dist/chunk-CPDNX3LS.cjs +47 -0
  72. package/dist/chunk-CPDNX3LS.cjs.map +1 -0
  73. package/dist/chunk-CVNPNZMX.js +44 -0
  74. package/dist/chunk-CVNPNZMX.js.map +1 -0
  75. package/dist/chunk-DHGCLPFZ.js +91 -0
  76. package/dist/chunk-DHGCLPFZ.js.map +1 -0
  77. package/dist/chunk-DO2YN46R.cjs +201 -0
  78. package/dist/chunk-DO2YN46R.cjs.map +1 -0
  79. package/dist/chunk-DVDT7TX7.js +151 -0
  80. package/dist/chunk-DVDT7TX7.js.map +1 -0
  81. package/dist/{chunk-R5Z7AOVU.cjs → chunk-DZ3JTMKM.cjs} +9 -9
  82. package/dist/{chunk-R5Z7AOVU.cjs.map → chunk-DZ3JTMKM.cjs.map} +1 -1
  83. package/dist/chunk-EACNRR3C.cjs +4 -0
  84. package/dist/chunk-EACNRR3C.cjs.map +1 -0
  85. package/dist/{chunk-E2PBPQGS.js → chunk-EEOGIGIA.js} +2 -2
  86. package/dist/{chunk-E2PBPQGS.js.map → chunk-EEOGIGIA.js.map} +1 -1
  87. package/dist/chunk-EPCUPHEO.js +193 -0
  88. package/dist/chunk-EPCUPHEO.js.map +1 -0
  89. package/dist/chunk-EPTP3VKT.js +283 -0
  90. package/dist/chunk-EPTP3VKT.js.map +1 -0
  91. package/dist/{chunk-HIZWOAWY.cjs → chunk-ERACGSDY.cjs} +8 -8
  92. package/dist/{chunk-HIZWOAWY.cjs.map → chunk-ERACGSDY.cjs.map} +1 -1
  93. package/dist/{chunk-VOQJHSXN.cjs → chunk-F2FOG4EG.cjs} +9 -9
  94. package/dist/{chunk-VOQJHSXN.cjs.map → chunk-F2FOG4EG.cjs.map} +1 -1
  95. package/dist/{chunk-GBUVIGD5.js → chunk-F3EWRDIT.js} +99 -3
  96. package/dist/chunk-F3EWRDIT.js.map +1 -0
  97. package/dist/{chunk-GVLNXPJX.js → chunk-FGLIP6YR.js} +4 -4
  98. package/dist/{chunk-GVLNXPJX.js.map → chunk-FGLIP6YR.js.map} +1 -1
  99. package/dist/chunk-FKGFOBC2.js +314 -0
  100. package/dist/chunk-FKGFOBC2.js.map +1 -0
  101. package/dist/chunk-FSGJXCBG.cjs +318 -0
  102. package/dist/chunk-FSGJXCBG.cjs.map +1 -0
  103. package/dist/chunk-FTEZNCRI.js +29 -0
  104. package/dist/chunk-FTEZNCRI.js.map +1 -0
  105. package/dist/{chunk-COM7RNZU.cjs → chunk-FYQZWLAM.cjs} +2 -2
  106. package/dist/{chunk-COM7RNZU.cjs.map → chunk-FYQZWLAM.cjs.map} +1 -1
  107. package/dist/{chunk-YVPC65ZJ.cjs → chunk-GF2BE4FB.cjs} +91 -32
  108. package/dist/chunk-GF2BE4FB.cjs.map +1 -0
  109. package/dist/{chunk-JEIW7BSV.cjs → chunk-GKDHMNUA.cjs} +2 -52
  110. package/dist/chunk-GKDHMNUA.cjs.map +1 -0
  111. package/dist/{chunk-N7C4OEP7.cjs → chunk-GM32IDVL.cjs} +6 -6
  112. package/dist/{chunk-N7C4OEP7.cjs.map → chunk-GM32IDVL.cjs.map} +1 -1
  113. package/dist/chunk-GY5SP4ST.js +3 -0
  114. package/dist/chunk-GY5SP4ST.js.map +1 -0
  115. package/dist/chunk-H2Y7HZV5.js +3 -0
  116. package/dist/chunk-H2Y7HZV5.js.map +1 -0
  117. package/dist/chunk-H3QPREIJ.js +195 -0
  118. package/dist/chunk-H3QPREIJ.js.map +1 -0
  119. package/dist/{chunk-QOVJ6Z6R.js → chunk-HDY7YQFX.js} +3 -3
  120. package/dist/{chunk-QOVJ6Z6R.js.map → chunk-HDY7YQFX.js.map} +1 -1
  121. package/dist/chunk-HNFFFFYH.cjs +114 -0
  122. package/dist/chunk-HNFFFFYH.cjs.map +1 -0
  123. package/dist/chunk-HNXLLDPN.js +25 -0
  124. package/dist/chunk-HNXLLDPN.js.map +1 -0
  125. package/dist/chunk-I2MMUFCN.cjs +154 -0
  126. package/dist/chunk-I2MMUFCN.cjs.map +1 -0
  127. package/dist/{chunk-GYXUS65N.cjs → chunk-IGDO62KR.cjs} +5 -5
  128. package/dist/{chunk-GYXUS65N.cjs.map → chunk-IGDO62KR.cjs.map} +1 -1
  129. package/dist/{chunk-HC3NAN55.cjs → chunk-IPL2O2OL.cjs} +19 -19
  130. package/dist/{chunk-HC3NAN55.cjs.map → chunk-IPL2O2OL.cjs.map} +1 -1
  131. package/dist/chunk-ISUIKUX7.cjs +337 -0
  132. package/dist/chunk-ISUIKUX7.cjs.map +1 -0
  133. package/dist/{chunk-N5O47VGS.cjs → chunk-IVGI353O.cjs} +2 -2
  134. package/dist/{chunk-N5O47VGS.cjs.map → chunk-IVGI353O.cjs.map} +1 -1
  135. package/dist/chunk-IWRBJHO3.cjs +51 -0
  136. package/dist/chunk-IWRBJHO3.cjs.map +1 -0
  137. package/dist/{chunk-BIQ7GSO2.js → chunk-JMAZ2GKT.js} +3 -3
  138. package/dist/{chunk-BIQ7GSO2.js.map → chunk-JMAZ2GKT.js.map} +1 -1
  139. package/dist/{chunk-KRU6IGV7.js → chunk-JUJGWUAN.js} +28 -6
  140. package/dist/chunk-JUJGWUAN.js.map +1 -0
  141. package/dist/{chunk-BUT6MF5K.cjs → chunk-KQ6GLYFZ.cjs} +4 -4
  142. package/dist/{chunk-BUT6MF5K.cjs.map → chunk-KQ6GLYFZ.cjs.map} +1 -1
  143. package/dist/chunk-L6K4PRZK.cjs +4 -0
  144. package/dist/chunk-L6K4PRZK.cjs.map +1 -0
  145. package/dist/{chunk-T4L7Q5FA.cjs → chunk-LC3JL2HB.cjs} +6 -2
  146. package/dist/chunk-LC3JL2HB.cjs.map +1 -0
  147. package/dist/{chunk-P7UMS4E6.cjs → chunk-LC7PVBXH.cjs} +16 -8
  148. package/dist/chunk-LC7PVBXH.cjs.map +1 -0
  149. package/dist/chunk-LRRSD7LR.js +248 -0
  150. package/dist/chunk-LRRSD7LR.js.map +1 -0
  151. package/dist/chunk-LSMS6DY7.cjs +331 -0
  152. package/dist/chunk-LSMS6DY7.cjs.map +1 -0
  153. package/dist/chunk-M3VPGJMV.js +283 -0
  154. package/dist/chunk-M3VPGJMV.js.map +1 -0
  155. package/dist/{chunk-QURJVPRH.cjs → chunk-MJJJDQ5P.cjs} +46 -2
  156. package/dist/chunk-MJJJDQ5P.cjs.map +1 -0
  157. package/dist/{chunk-2JICT4A2.js → chunk-N54FYWG6.js} +3 -3
  158. package/dist/{chunk-2JICT4A2.js.map → chunk-N54FYWG6.js.map} +1 -1
  159. package/dist/chunk-N5JDL4VE.js +3 -0
  160. package/dist/chunk-N5JDL4VE.js.map +1 -0
  161. package/dist/{chunk-KGKBZN3T.cjs → chunk-NAH65KPK.cjs} +8 -8
  162. package/dist/{chunk-KGKBZN3T.cjs.map → chunk-NAH65KPK.cjs.map} +1 -1
  163. package/dist/{chunk-NKV76R65.cjs → chunk-O6BJMVGT.cjs} +45 -45
  164. package/dist/{chunk-NKV76R65.cjs.map → chunk-O6BJMVGT.cjs.map} +1 -1
  165. package/dist/{chunk-SVSHA7XV.js → chunk-O6XDA3SI.js} +31 -33
  166. package/dist/chunk-O6XDA3SI.js.map +1 -0
  167. package/dist/chunk-OIF34LEN.cjs +425 -0
  168. package/dist/chunk-OIF34LEN.cjs.map +1 -0
  169. package/dist/chunk-ORCCJ5VY.cjs +218 -0
  170. package/dist/chunk-ORCCJ5VY.cjs.map +1 -0
  171. package/dist/{chunk-CRS2CQWM.js → chunk-OSTSZDQC.js} +3 -3
  172. package/dist/{chunk-CRS2CQWM.js.map → chunk-OSTSZDQC.js.map} +1 -1
  173. package/dist/chunk-P22YCUVM.cjs +4 -0
  174. package/dist/chunk-P22YCUVM.cjs.map +1 -0
  175. package/dist/chunk-P55LNEDH.cjs +306 -0
  176. package/dist/chunk-P55LNEDH.cjs.map +1 -0
  177. package/dist/{chunk-R6KPWIGO.js → chunk-P7D7BYFE.js} +4 -4
  178. package/dist/{chunk-R6KPWIGO.js.map → chunk-P7D7BYFE.js.map} +1 -1
  179. package/dist/{chunk-GU5OS7JJ.cjs → chunk-PYI2IWNX.cjs} +4 -4
  180. package/dist/{chunk-GU5OS7JJ.cjs.map → chunk-PYI2IWNX.cjs.map} +1 -1
  181. package/dist/chunk-Q3YVLO52.cjs +174 -0
  182. package/dist/chunk-Q3YVLO52.cjs.map +1 -0
  183. package/dist/{chunk-K34DXMLZ.js → chunk-QJ2L5RU6.js} +7 -7
  184. package/dist/{chunk-K34DXMLZ.js.map → chunk-QJ2L5RU6.js.map} +1 -1
  185. package/dist/{chunk-X4LBUPJO.cjs → chunk-QX6AAVDE.cjs} +31 -33
  186. package/dist/chunk-QX6AAVDE.cjs.map +1 -0
  187. package/dist/{chunk-LFPJ3OUM.cjs → chunk-RIUQP2QS.cjs} +5 -5
  188. package/dist/{chunk-LFPJ3OUM.cjs.map → chunk-RIUQP2QS.cjs.map} +1 -1
  189. package/dist/{chunk-JHG3ELS2.js → chunk-RPFATYUI.js} +2 -2
  190. package/dist/{chunk-JHG3ELS2.js.map → chunk-RPFATYUI.js.map} +1 -1
  191. package/dist/{chunk-FZURBQJ2.js → chunk-RSJGTWLM.js} +3 -3
  192. package/dist/{chunk-FZURBQJ2.js.map → chunk-RSJGTWLM.js.map} +1 -1
  193. package/dist/{chunk-XBTKZCZF.js → chunk-RZSSQ7AT.js} +3 -3
  194. package/dist/{chunk-XBTKZCZF.js.map → chunk-RZSSQ7AT.js.map} +1 -1
  195. package/dist/{chunk-SD7ONW6S.js → chunk-S2JZL4JC.js} +5 -5
  196. package/dist/{chunk-SD7ONW6S.js.map → chunk-S2JZL4JC.js.map} +1 -1
  197. package/dist/{chunk-VROIMIHB.cjs → chunk-SHBCUXFS.cjs} +28 -6
  198. package/dist/chunk-SHBCUXFS.cjs.map +1 -0
  199. package/dist/{chunk-JELTRRR5.cjs → chunk-SW2E7XKY.cjs} +9 -9
  200. package/dist/{chunk-JELTRRR5.cjs.map → chunk-SW2E7XKY.cjs.map} +1 -1
  201. package/dist/chunk-SZSRGUVO.js +402 -0
  202. package/dist/chunk-SZSRGUVO.js.map +1 -0
  203. package/dist/{chunk-HZ4MBUC3.js → chunk-TI3TQQ7F.js} +4 -53
  204. package/dist/chunk-TI3TQQ7F.js.map +1 -0
  205. package/dist/{chunk-MLAWXPRY.js → chunk-TKWNXAFI.js} +46 -2
  206. package/dist/chunk-TKWNXAFI.js.map +1 -0
  207. package/dist/{chunk-H2IAMSHK.js → chunk-TVEJKKIM.js} +3 -3
  208. package/dist/{chunk-H2IAMSHK.js.map → chunk-TVEJKKIM.js.map} +1 -1
  209. package/dist/{chunk-LHBWRMNC.cjs → chunk-TVU4KB27.cjs} +130 -12
  210. package/dist/chunk-TVU4KB27.cjs.map +1 -0
  211. package/dist/{chunk-ENMXHZNE.js → chunk-TWQSMUE6.js} +6 -2
  212. package/dist/chunk-TWQSMUE6.js.map +1 -0
  213. package/dist/{chunk-ZYL4SNOR.js → chunk-UJDWFDKE.js} +3 -3
  214. package/dist/{chunk-ZYL4SNOR.js.map → chunk-UJDWFDKE.js.map} +1 -1
  215. package/dist/{chunk-4HC2IBOX.js → chunk-UNFDIBKJ.js} +3 -3
  216. package/dist/{chunk-4HC2IBOX.js.map → chunk-UNFDIBKJ.js.map} +1 -1
  217. package/dist/chunk-UTIPENPW.cjs +286 -0
  218. package/dist/chunk-UTIPENPW.cjs.map +1 -0
  219. package/dist/{chunk-IYWG72DM.js → chunk-VEE46VTX.js} +4 -4
  220. package/dist/{chunk-IYWG72DM.js.map → chunk-VEE46VTX.js.map} +1 -1
  221. package/dist/{chunk-Y4E2WRUR.cjs → chunk-VFFV7EMT.cjs} +6 -6
  222. package/dist/{chunk-Y4E2WRUR.cjs.map → chunk-VFFV7EMT.cjs.map} +1 -1
  223. package/dist/chunk-VNEAQCY2.js +308 -0
  224. package/dist/chunk-VNEAQCY2.js.map +1 -0
  225. package/dist/chunk-VOYLX32A.cjs +271 -0
  226. package/dist/chunk-VOYLX32A.cjs.map +1 -0
  227. package/dist/{chunk-7ZV67VZE.js → chunk-VSRO4PAI.js} +21 -3
  228. package/dist/chunk-VSRO4PAI.js.map +1 -0
  229. package/dist/{chunk-L6MDULYB.js → chunk-VU3ZMJBN.js} +2 -2
  230. package/dist/{chunk-L6MDULYB.js.map → chunk-VU3ZMJBN.js.map} +1 -1
  231. package/dist/{chunk-CPPUT74P.cjs → chunk-VV2U36T6.cjs} +9 -9
  232. package/dist/{chunk-CPPUT74P.cjs.map → chunk-VV2U36T6.cjs.map} +1 -1
  233. package/dist/{chunk-35Y4ILCU.cjs → chunk-VXW7D5LR.cjs} +21 -3
  234. package/dist/chunk-VXW7D5LR.cjs.map +1 -0
  235. package/dist/{chunk-7YO7DNUV.js → chunk-WFBUBT54.js} +2 -2
  236. package/dist/{chunk-7YO7DNUV.js.map → chunk-WFBUBT54.js.map} +1 -1
  237. package/dist/chunk-WQHBMZSC.js +295 -0
  238. package/dist/chunk-WQHBMZSC.js.map +1 -0
  239. package/dist/chunk-X5JOEZVR.js +525 -0
  240. package/dist/chunk-X5JOEZVR.js.map +1 -0
  241. package/dist/chunk-XBAAHOCP.js +3 -0
  242. package/dist/chunk-XBAAHOCP.js.map +1 -0
  243. package/dist/chunk-XNPDZANN.cjs +238 -0
  244. package/dist/chunk-XNPDZANN.cjs.map +1 -0
  245. package/dist/chunk-XXA4NZUC.js +3 -0
  246. package/dist/chunk-XXA4NZUC.js.map +1 -0
  247. package/dist/chunk-Y424YL55.js +59 -0
  248. package/dist/chunk-Y424YL55.js.map +1 -0
  249. package/dist/chunk-YGS2TRMP.js +38 -0
  250. package/dist/chunk-YGS2TRMP.js.map +1 -0
  251. package/dist/{chunk-JBIGSP2T.js → chunk-YMILRSRO.js} +6 -5
  252. package/dist/chunk-YMILRSRO.js.map +1 -0
  253. package/dist/chunk-YUMOM3KE.js +167 -0
  254. package/dist/chunk-YUMOM3KE.js.map +1 -0
  255. package/dist/{chunk-3KPDQG5O.cjs → chunk-ZG6FXMDX.cjs} +5 -5
  256. package/dist/{chunk-3KPDQG5O.cjs.map → chunk-ZG6FXMDX.cjs.map} +1 -1
  257. package/dist/chunk-ZNUMOJOI.cjs +4 -0
  258. package/dist/chunk-ZNUMOJOI.cjs.map +1 -0
  259. package/dist/components/Accordion/index.cjs +2 -2
  260. package/dist/components/Accordion/index.d.cts +6 -0
  261. package/dist/components/Accordion/index.d.ts +6 -0
  262. package/dist/components/Accordion/index.js +1 -1
  263. package/dist/components/ActionPlan/index.cjs +34 -0
  264. package/dist/components/ActionPlan/index.cjs.map +1 -0
  265. package/dist/components/ActionPlan/index.d.cts +65 -0
  266. package/dist/components/ActionPlan/index.d.ts +65 -0
  267. package/dist/components/ActionPlan/index.js +21 -0
  268. package/dist/components/ActionPlan/index.js.map +1 -0
  269. package/dist/components/ActivityFeed/index.cjs +31 -0
  270. package/dist/components/ActivityFeed/index.cjs.map +1 -0
  271. package/dist/components/ActivityFeed/index.d.cts +99 -0
  272. package/dist/components/ActivityFeed/index.d.ts +99 -0
  273. package/dist/components/ActivityFeed/index.js +18 -0
  274. package/dist/components/ActivityFeed/index.js.map +1 -0
  275. package/dist/components/AlertDialog/index.cjs +17 -4
  276. package/dist/components/AlertDialog/index.d.cts +66 -13
  277. package/dist/components/AlertDialog/index.d.ts +66 -13
  278. package/dist/components/AlertDialog/index.js +4 -3
  279. package/dist/components/AssociationList/index.cjs +29 -0
  280. package/dist/components/AssociationList/index.cjs.map +1 -0
  281. package/dist/components/AssociationList/index.d.cts +50 -0
  282. package/dist/components/AssociationList/index.d.ts +50 -0
  283. package/dist/components/AssociationList/index.js +16 -0
  284. package/dist/components/AssociationList/index.js.map +1 -0
  285. package/dist/components/Avatar/index.cjs +9 -7
  286. package/dist/components/Avatar/index.d.cts +45 -14
  287. package/dist/components/Avatar/index.d.ts +45 -14
  288. package/dist/components/Avatar/index.js +3 -1
  289. package/dist/components/AvatarGroup/index.cjs +20 -0
  290. package/dist/components/AvatarGroup/index.cjs.map +1 -0
  291. package/dist/components/AvatarGroup/index.d.cts +57 -0
  292. package/dist/components/AvatarGroup/index.d.ts +57 -0
  293. package/dist/components/AvatarGroup/index.js +7 -0
  294. package/dist/components/AvatarGroup/index.js.map +1 -0
  295. package/dist/components/Button/index.cjs +3 -2
  296. package/dist/components/Button/index.js +2 -1
  297. package/dist/components/CalendarHeatmap/index.cjs +18 -0
  298. package/dist/components/CalendarHeatmap/index.cjs.map +1 -0
  299. package/dist/components/CalendarHeatmap/index.d.cts +47 -0
  300. package/dist/components/CalendarHeatmap/index.d.ts +47 -0
  301. package/dist/components/CalendarHeatmap/index.js +5 -0
  302. package/dist/components/CalendarHeatmap/index.js.map +1 -0
  303. package/dist/components/CalendarView/index.cjs +5 -4
  304. package/dist/components/CalendarView/index.js +3 -2
  305. package/dist/components/ClampedText/index.cjs +3 -2
  306. package/dist/components/ClampedText/index.js +2 -1
  307. package/dist/components/CollabStatus/index.cjs +6 -4
  308. package/dist/components/CollabStatus/index.d.cts +11 -0
  309. package/dist/components/CollabStatus/index.d.ts +11 -0
  310. package/dist/components/CollabStatus/index.js +3 -1
  311. package/dist/components/Collapsible/index.cjs +4 -4
  312. package/dist/components/Collapsible/index.d.cts +6 -0
  313. package/dist/components/Collapsible/index.d.ts +6 -0
  314. package/dist/components/Collapsible/index.js +1 -1
  315. package/dist/components/CompletenessMeter/index.cjs +22 -0
  316. package/dist/components/CompletenessMeter/index.cjs.map +1 -0
  317. package/dist/components/CompletenessMeter/index.d.cts +52 -0
  318. package/dist/components/CompletenessMeter/index.d.ts +52 -0
  319. package/dist/components/CompletenessMeter/index.js +5 -0
  320. package/dist/components/CompletenessMeter/index.js.map +1 -0
  321. package/dist/components/CustomizableDashboard/index.cjs +10 -9
  322. package/dist/components/CustomizableDashboard/index.js +3 -2
  323. package/dist/components/DateInput/index.d.cts +36 -4
  324. package/dist/components/DateInput/index.d.ts +36 -4
  325. package/dist/components/Dropdown/index.cjs +9 -8
  326. package/dist/components/Dropdown/index.js +2 -1
  327. package/dist/components/FieldHistory/index.cjs +34 -0
  328. package/dist/components/FieldHistory/index.cjs.map +1 -0
  329. package/dist/components/FieldHistory/index.d.cts +66 -0
  330. package/dist/components/FieldHistory/index.d.ts +66 -0
  331. package/dist/components/FieldHistory/index.js +21 -0
  332. package/dist/components/FieldHistory/index.js.map +1 -0
  333. package/dist/components/FloatingWindow/index.cjs +5 -4
  334. package/dist/components/FloatingWindow/index.js +3 -2
  335. package/dist/components/InlineEdit/index.cjs +20 -0
  336. package/dist/components/InlineEdit/index.cjs.map +1 -0
  337. package/dist/components/InlineEdit/index.d.cts +56 -0
  338. package/dist/components/InlineEdit/index.d.ts +56 -0
  339. package/dist/components/InlineEdit/index.js +7 -0
  340. package/dist/components/InlineEdit/index.js.map +1 -0
  341. package/dist/components/KeyboardShortcutsOverlay/index.cjs +4 -4
  342. package/dist/components/KeyboardShortcutsOverlay/index.js +2 -2
  343. package/dist/components/ListView/index.cjs +5 -4
  344. package/dist/components/ListView/index.js +3 -2
  345. package/dist/components/LogoUploader/index.cjs +18 -0
  346. package/dist/components/LogoUploader/index.cjs.map +1 -0
  347. package/dist/components/LogoUploader/index.d.cts +49 -0
  348. package/dist/components/LogoUploader/index.d.ts +49 -0
  349. package/dist/components/LogoUploader/index.js +5 -0
  350. package/dist/components/LogoUploader/index.js.map +1 -0
  351. package/dist/components/Markdown/index.cjs +17 -16
  352. package/dist/components/Markdown/index.js +8 -7
  353. package/dist/components/MediaEditor/index.cjs +10 -9
  354. package/dist/components/MediaEditor/index.js +5 -4
  355. package/dist/components/MediaFeed/index.cjs +9 -6
  356. package/dist/components/MediaFeed/index.js +8 -5
  357. package/dist/components/MediaPlayer/index.cjs +6 -5
  358. package/dist/components/MediaPlayer/index.js +3 -2
  359. package/dist/components/MegaMenu/index.cjs +2 -1
  360. package/dist/components/MegaMenu/index.js +2 -1
  361. package/dist/components/Modal/index.cjs +9 -9
  362. package/dist/components/Modal/index.js +1 -1
  363. package/dist/components/PhiMask/index.cjs +18 -0
  364. package/dist/components/PhiMask/index.cjs.map +1 -0
  365. package/dist/components/PhiMask/index.d.cts +45 -0
  366. package/dist/components/PhiMask/index.d.ts +45 -0
  367. package/dist/components/PhiMask/index.js +5 -0
  368. package/dist/components/PhiMask/index.js.map +1 -0
  369. package/dist/components/PhoneInput/index.d.cts +3 -36
  370. package/dist/components/PhoneInput/index.d.ts +3 -36
  371. package/dist/components/PropertyList/index.cjs +25 -0
  372. package/dist/components/PropertyList/index.cjs.map +1 -0
  373. package/dist/components/PropertyList/index.d.cts +71 -0
  374. package/dist/components/PropertyList/index.d.ts +71 -0
  375. package/dist/components/PropertyList/index.js +12 -0
  376. package/dist/components/PropertyList/index.js.map +1 -0
  377. package/dist/components/RadialExplorer/index.cjs +2 -1
  378. package/dist/components/RadialExplorer/index.js +2 -1
  379. package/dist/components/Rating/index.cjs +28 -0
  380. package/dist/components/Rating/index.cjs.map +1 -0
  381. package/dist/components/Rating/index.d.cts +85 -0
  382. package/dist/components/Rating/index.d.ts +85 -0
  383. package/dist/components/Rating/index.js +7 -0
  384. package/dist/components/Rating/index.js.map +1 -0
  385. package/dist/components/RecordHeader/index.cjs +29 -0
  386. package/dist/components/RecordHeader/index.cjs.map +1 -0
  387. package/dist/components/RecordHeader/index.d.cts +86 -0
  388. package/dist/components/RecordHeader/index.d.ts +86 -0
  389. package/dist/components/RecordHeader/index.js +16 -0
  390. package/dist/components/RecordHeader/index.js.map +1 -0
  391. package/dist/components/RecordLayout/index.cjs +21 -0
  392. package/dist/components/RecordLayout/index.cjs.map +1 -0
  393. package/dist/components/RecordLayout/index.d.cts +40 -0
  394. package/dist/components/RecordLayout/index.d.ts +40 -0
  395. package/dist/components/RecordLayout/index.js +8 -0
  396. package/dist/components/RecordLayout/index.js.map +1 -0
  397. package/dist/components/RichTextEditor/index.cjs +8 -6
  398. package/dist/components/RichTextEditor/index.js +5 -3
  399. package/dist/components/SectionSpyNav/index.cjs +2 -1
  400. package/dist/components/SectionSpyNav/index.js +2 -1
  401. package/dist/components/SuperChat/index.cjs +23 -19
  402. package/dist/components/SuperChat/index.cjs.map +1 -1
  403. package/dist/components/SuperChat/index.js +11 -7
  404. package/dist/components/SuperChat/index.js.map +1 -1
  405. package/dist/components/SuperChat/plugins/index.cjs +5 -4
  406. package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
  407. package/dist/components/SuperChat/plugins/index.js +4 -3
  408. package/dist/components/SuperChat/plugins/index.js.map +1 -1
  409. package/dist/components/Tabs/index.cjs +9 -7
  410. package/dist/components/Tabs/index.d.cts +12 -1
  411. package/dist/components/Tabs/index.d.ts +12 -1
  412. package/dist/components/Tabs/index.js +3 -1
  413. package/dist/components/TagEditor/index.cjs +20 -0
  414. package/dist/components/TagEditor/index.cjs.map +1 -0
  415. package/dist/components/TagEditor/index.d.cts +46 -0
  416. package/dist/components/TagEditor/index.d.ts +46 -0
  417. package/dist/components/TagEditor/index.js +7 -0
  418. package/dist/components/TagEditor/index.js.map +1 -0
  419. package/dist/components/UserPicker/index.cjs +24 -0
  420. package/dist/components/UserPicker/index.cjs.map +1 -0
  421. package/dist/components/UserPicker/index.d.cts +60 -0
  422. package/dist/components/UserPicker/index.d.ts +60 -0
  423. package/dist/components/UserPicker/index.js +11 -0
  424. package/dist/components/UserPicker/index.js.map +1 -0
  425. package/dist/components/ViewSet/index.cjs +6 -5
  426. package/dist/components/ViewSet/index.d.cts +2 -1
  427. package/dist/components/ViewSet/index.d.ts +2 -1
  428. package/dist/components/ViewSet/index.js +5 -4
  429. package/dist/components/ViewSwitcher/index.d.cts +39 -4
  430. package/dist/components/ViewSwitcher/index.d.ts +39 -4
  431. package/dist/datavis.cjs +3 -2
  432. package/dist/datavis.cjs.map +1 -1
  433. package/dist/datavis.js +2 -1
  434. package/dist/datavis.js.map +1 -1
  435. package/dist/esheet.cjs +9 -7
  436. package/dist/esheet.cjs.map +1 -1
  437. package/dist/esheet.js +6 -4
  438. package/dist/esheet.js.map +1 -1
  439. package/dist/hooks/index.cjs +53 -27
  440. package/dist/hooks/index.d.cts +91 -6
  441. package/dist/hooks/index.d.ts +91 -6
  442. package/dist/hooks/index.js +5 -3
  443. package/dist/index.cjs +1391 -847
  444. package/dist/index.cjs.map +1 -1
  445. package/dist/index.d.cts +1253 -168
  446. package/dist/index.d.ts +1253 -168
  447. package/dist/index.js +539 -171
  448. package/dist/index.js.map +1 -1
  449. package/dist/org-chart.cjs +1302 -0
  450. package/dist/org-chart.cjs.map +1 -0
  451. package/dist/org-chart.d.cts +164 -0
  452. package/dist/org-chart.d.ts +164 -0
  453. package/dist/org-chart.js +1277 -0
  454. package/dist/org-chart.js.map +1 -0
  455. package/dist/styles.css +1 -1
  456. package/dist/tailwind-preset.cjs +4 -4
  457. package/dist/tailwind-preset.js +1 -1
  458. package/dist/{index-DoYYWsNc.d.cts → types-CDeBNZiE.d.cts} +1 -36
  459. package/dist/{index-DoYYWsNc.d.ts → types-CDeBNZiE.d.ts} +1 -36
  460. package/package.json +22 -2
  461. package/dist/CsvBlock-FX5YNGNE.cjs +0 -17
  462. package/dist/CsvBlock-VLMG7GUO.js +0 -8
  463. package/dist/HtmlPreviewBlock-5JE7L3GR.js +0 -8
  464. package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +0 -17
  465. package/dist/MermaidBlock-3XHFBAMV.js +0 -8
  466. package/dist/MermaidBlock-RZ75RPZA.cjs +0 -17
  467. package/dist/SurveyBlock-MUVJ3JUI.js +0 -8
  468. package/dist/SurveyBlock-VH47YXZC.cjs +0 -17
  469. package/dist/chunk-35Y4ILCU.cjs.map +0 -1
  470. package/dist/chunk-6N6LIAUJ.cjs +0 -80
  471. package/dist/chunk-6N6LIAUJ.cjs.map +0 -1
  472. package/dist/chunk-7ZV67VZE.js.map +0 -1
  473. package/dist/chunk-7ZVTLTJF.js +0 -109
  474. package/dist/chunk-7ZVTLTJF.js.map +0 -1
  475. package/dist/chunk-DVOQ3JNO.js.map +0 -1
  476. package/dist/chunk-ENMXHZNE.js.map +0 -1
  477. package/dist/chunk-GBUVIGD5.js.map +0 -1
  478. package/dist/chunk-HZ4MBUC3.js.map +0 -1
  479. package/dist/chunk-JBIGSP2T.js.map +0 -1
  480. package/dist/chunk-JEIW7BSV.cjs.map +0 -1
  481. package/dist/chunk-KRU6IGV7.js.map +0 -1
  482. package/dist/chunk-LHBWRMNC.cjs.map +0 -1
  483. package/dist/chunk-MLAWXPRY.js.map +0 -1
  484. package/dist/chunk-P7UMS4E6.cjs.map +0 -1
  485. package/dist/chunk-QURJVPRH.cjs.map +0 -1
  486. package/dist/chunk-SVSHA7XV.js.map +0 -1
  487. package/dist/chunk-T4L7Q5FA.cjs.map +0 -1
  488. package/dist/chunk-UBSH27C2.js +0 -78
  489. package/dist/chunk-UBSH27C2.js.map +0 -1
  490. package/dist/chunk-VROIMIHB.cjs.map +0 -1
  491. package/dist/chunk-X4LBUPJO.cjs.map +0 -1
  492. package/dist/chunk-YVPC65ZJ.cjs.map +0 -1
  493. package/dist/chunk-ZTMYKAVU.cjs.map +0 -1
@@ -1,3 +1,4 @@
1
+ import * as React from 'react';
1
2
  import { useState, useEffect, useCallback } from 'react';
2
3
 
3
4
  // src/hooks/useDirection.ts
@@ -210,7 +211,102 @@ function useIsLargeDesktop() {
210
211
  function useIsMobileOrTablet() {
211
212
  return useMediaQuery("(max-width: 1023px)");
212
213
  }
214
+ function mergeOrder(saved, ids) {
215
+ if (!saved) return ids;
216
+ const known = new Set(ids);
217
+ const kept = [...new Set(saved)].filter((id) => known.has(id));
218
+ const keptSet = new Set(kept);
219
+ return [...kept, ...ids.filter((id) => !keptSet.has(id))];
220
+ }
221
+ function useOrderPersistence(ids, { load, save, debounceMs = 500, onError }) {
222
+ const [saved, setSaved] = React.useState(null);
223
+ const callbacks = React.useRef({ load, save, onError });
224
+ callbacks.current = { load, save, onError };
225
+ const pending = React.useRef(null);
226
+ const timer = React.useRef(
227
+ void 0
228
+ );
229
+ const touched = React.useRef(false);
230
+ const saving = React.useRef(0);
231
+ const lastStarted = React.useRef(null);
232
+ const overlapped = React.useRef(false);
233
+ const flush = React.useCallback(function flushPending(force = false) {
234
+ clearTimeout(timer.current);
235
+ const next = pending.current;
236
+ if (!next || saving.current > 0 && !force) return;
237
+ pending.current = null;
238
+ if (saving.current > 0) overlapped.current = true;
239
+ saving.current += 1;
240
+ lastStarted.current = next;
241
+ const { save: run, onError: fail } = callbacks.current;
242
+ let result;
243
+ try {
244
+ result = run(next);
245
+ } catch (e) {
246
+ result = Promise.reject(e);
247
+ }
248
+ void Promise.resolve(result).catch((e) => fail?.(e)).finally(() => {
249
+ saving.current -= 1;
250
+ if (saving.current > 0) return;
251
+ if (overlapped.current) {
252
+ overlapped.current = false;
253
+ pending.current ??= lastStarted.current;
254
+ }
255
+ flushPending();
256
+ });
257
+ }, []);
258
+ React.useEffect(() => {
259
+ let active = true;
260
+ const { load: read, onError: fail } = callbacks.current;
261
+ Promise.resolve().then(read).then((value) => {
262
+ if (active && value && !touched.current) setSaved(value);
263
+ }).catch((e) => fail?.(e));
264
+ return () => {
265
+ active = false;
266
+ flush();
267
+ };
268
+ }, [flush]);
269
+ React.useEffect(() => {
270
+ const onPageHide = () => flush(true);
271
+ window.addEventListener("pagehide", onPageHide);
272
+ return () => window.removeEventListener("pagehide", onPageHide);
273
+ }, [flush]);
274
+ const setOrder = React.useCallback(
275
+ (next) => {
276
+ touched.current = true;
277
+ setSaved(next);
278
+ pending.current = next;
279
+ clearTimeout(timer.current);
280
+ timer.current = setTimeout(flush, debounceMs);
281
+ },
282
+ [debounceMs, flush]
283
+ );
284
+ const order = React.useMemo(() => mergeOrder(saved, ids), [saved, ids]);
285
+ return { order, setOrder };
286
+ }
287
+ function localStorageOrderAdapter(key) {
288
+ return {
289
+ load: () => {
290
+ try {
291
+ if (typeof window === "undefined") return null;
292
+ const raw = JSON.parse(
293
+ window.localStorage.getItem(key) ?? "null"
294
+ );
295
+ return Array.isArray(raw) && raw.every((v) => typeof v === "string") ? raw : null;
296
+ } catch {
297
+ return null;
298
+ }
299
+ },
300
+ save: (order) => {
301
+ try {
302
+ if (typeof window !== "undefined")
303
+ window.localStorage.setItem(key, JSON.stringify(order));
304
+ } catch {
305
+ }
306
+ }
307
+ };
308
+ }
213
309
 
214
- export { KEYBOARD_INSET_VAR, KEYBOARD_OPEN_ATTRIBUTE, KEYBOARD_SOURCE_ATTRIBUTE, RTL_LOCALES, VISUAL_VIEWPORT_HEIGHT_VAR, VISUAL_VIEWPORT_OFFSET_TOP_VAR, isRtlLocale, useCommandK, useDirection, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardInset, useKeyboardShortcut, useMediaQuery };
215
- //# sourceMappingURL=chunk-GBUVIGD5.js.map
216
- //# sourceMappingURL=chunk-GBUVIGD5.js.map
310
+ export { KEYBOARD_INSET_VAR, KEYBOARD_OPEN_ATTRIBUTE, KEYBOARD_SOURCE_ATTRIBUTE, RTL_LOCALES, VISUAL_VIEWPORT_HEIGHT_VAR, VISUAL_VIEWPORT_OFFSET_TOP_VAR, isRtlLocale, localStorageOrderAdapter, mergeOrder, useCommandK, useDirection, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardInset, useKeyboardShortcut, useMediaQuery, useOrderPersistence };
311
+ //# sourceMappingURL=chunk-F3EWRDIT.js.map
312
+ //# sourceMappingURL=chunk-F3EWRDIT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDirection.ts","../src/hooks/useKeyboardInset.ts","../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useOrderPersistence.ts"],"names":["useState","useEffect"],"mappings":"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","file":"chunk-F3EWRDIT.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\n/** Locales whose primary script reads right-to-left. */\nexport const RTL_LOCALES = ['ar', 'he', 'fa', 'ur'] as const;\n\n/**\n * Returns true when the given locale (e.g. `ar`, `ar-SA`, `he_IL`) uses a\n * right-to-left script.\n */\nexport function isRtlLocale(locale: string): boolean {\n const lang = locale.toLowerCase().split(/[-_]/)[0];\n return (RTL_LOCALES as readonly string[]).includes(lang);\n}\n\nfunction resolveDirection(element?: HTMLElement | null): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const target = element ?? document.documentElement;\n return getComputedStyle(target).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/**\n * Hook returning the effective text direction (`ltr` | `rtl`) inherited from\n * the nearest `dir` attribute — zero setup for consumers who set\n * `<html dir=\"rtl\">`.\n *\n * Use for JS-level direction logic that CSS logical properties can't cover:\n * inverting ArrowLeft/ArrowRight keyboard handling, popover/toast placement,\n * drag math, etc.\n *\n * @param elementRef - Optional ref; when provided, direction is resolved from\n * that element (respecting any local `dir` override) instead of `<html>`.\n *\n * @example\n * ```tsx\n * const direction = useDirection();\n * const nextKey = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n * ```\n */\nexport function useDirection(\n elementRef?: RefObject<HTMLElement | null>\n): Direction {\n const [direction, setDirection] = useState<Direction>(() =>\n resolveDirection(elementRef?.current)\n );\n\n useEffect(() => {\n const update = () => setDirection(resolveDirection(elementRef?.current));\n update();\n // dir changes are rare; observing the whole tree for just this attribute is cheap.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n subtree: true,\n });\n return () => observer.disconnect();\n }, [elementRef]);\n\n // Re-sync when a re-render points elementRef.current at a different node:\n // the MutationObserver only fires on `dir` attribute mutations, so a swapped\n // ref target with a different inherited direction would otherwise go stale.\n const currentElement = elementRef?.current ?? null;\n useEffect(() => {\n setDirection(resolveDirection(currentElement));\n }, [currentElement]);\n\n return direction;\n}\n","import { useEffect, useState } from 'react';\n\n/** CSS custom properties written to `<html>` while the hook is mounted. */\nexport const KEYBOARD_INSET_VAR = '--mieweb-keyboard-inset';\nexport const VISUAL_VIEWPORT_HEIGHT_VAR = '--mieweb-visual-viewport-height';\nexport const VISUAL_VIEWPORT_OFFSET_TOP_VAR =\n '--mieweb-visual-viewport-offset-top';\n/** Boolean attribute set on `<html>` while an on-screen keyboard is open. */\nexport const KEYBOARD_OPEN_ATTRIBUTE = 'data-keyboard-open';\n/** Attribute on `<html>` naming the active {@link KeyboardInsetSource}. */\nexport const KEYBOARD_SOURCE_ATTRIBUTE = 'data-keyboard-source';\n\n/**\n * Where keyboard metrics come from.\n *\n * - `'visual-viewport'` — the Visual Viewport API. Works in any browser, but\n * iOS only reports the keyboard once its slide-in animation has finished.\n * - `'native'` — `keyboardWillShow` / `keyboardWillHide` window events with a\n * `keyboardHeight` property, as fired by `cordova-plugin-ionic-keyboard` and\n * Capacitor's Keyboard plugin. They arrive *before* the keyboard animates,\n * so layout can move in step with it.\n */\nexport type KeyboardInsetSource = 'visual-viewport' | 'native';\n\nexport interface KeyboardInsetState {\n /** Pixels of the layout viewport covered by the on-screen keyboard. */\n keyboardInset: number;\n /** Whether an on-screen keyboard currently covers part of the page. */\n isKeyboardOpen: boolean;\n}\n\nexport interface UseKeyboardInsetOptions {\n /** Track the keyboard; `false` stops tracking and clears the CSS variables. @default true */\n enabled?: boolean;\n /** Where keyboard metrics come from. @default 'visual-viewport' */\n source?: KeyboardInsetSource;\n}\n\ninterface NativeKeyboardEvent extends Event {\n keyboardHeight?: number;\n}\n\nconst CLOSED: KeyboardInsetState = { keyboardInset: 0, isKeyboardOpen: false };\n\n/**\n * Tracks the on-screen keyboard and publishes it on `<html>`.\n *\n * ### `source: 'native'` (Cordova / Capacitor apps)\n *\n * Listens for the native keyboard plugin's `keyboardWillShow` /\n * `keyboardWillHide` window events. Configure the plugin so the WebView is\n * neither resized nor panned (for `cordova-plugin-ionic-keyboard`:\n * `KeyboardResize=false`), keep the app shell at full height, and move only\n * the composer dock by `--mieweb-keyboard-inset` with a short transition\n * (~250ms) so it rides up with the keyboard. Only `--mieweb-keyboard-inset`,\n * `data-keyboard-open` and `data-keyboard-source` are published; the\n * visual-viewport variables stay unset.\n *\n * ### `source: 'visual-viewport'` (browsers, default)\n *\n * Uses the Visual Viewport API.\n *\n * iOS Safari and WKWebView (Cordova) ignore\n * `interactive-widget=resizes-content`, and `dvh` does not shrink for the\n * keyboard: the page keeps its full height and iOS pans the visual viewport\n * to reveal the focused input, pushing headers off-screen. This hook\n * measures what is actually visible and publishes it on `<html>` so an app\n * shell can follow the visible area instead:\n *\n * - `--mieweb-keyboard-inset` — keyboard height in px (0 when closed)\n * - `--mieweb-visual-viewport-height` — visible height in px\n * - `--mieweb-visual-viewport-offset-top` — how far iOS panned the page\n * - `data-keyboard-open` — present while the keyboard is open\n *\n * On browsers that already resize the layout for the keyboard (Chrome on\n * Android with `interactive-widget=resizes-content`) the inset stays 0 and\n * the variables simply mirror the layout viewport.\n *\n * iOS reports the visual viewport only after the keyboard has finished\n * animating, so a shell sized this way snaps into place once the keyboard\n * lands. Prefer `source: 'native'` wherever a native keyboard plugin exists.\n *\n * Mount it once, near the app root.\n *\n * @example\n * ```tsx\n * function AppShell({ children }) {\n * useKeyboardInset();\n * return (\n * <div\n * style={{\n * height: 'var(--mieweb-visual-viewport-height, 100dvh)',\n * transform: 'translateY(var(--mieweb-visual-viewport-offset-top, 0px))',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n *\n * @example Native app (keyboard plugin with WebView resizing disabled)\n * ```tsx\n * function ComposerDock({ children }) {\n * useKeyboardInset({ source: 'native' });\n * return (\n * <div\n * style={{\n * paddingBottom: 'calc(var(--mieweb-keyboard-inset, 0px) + 0.5rem)',\n * transition: 'padding-bottom 250ms ease',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKeyboardInset(\n options: UseKeyboardInsetOptions = {}\n): KeyboardInsetState {\n const { enabled = true, source = 'visual-viewport' } = options;\n const [state, setState] = useState<KeyboardInsetState>(CLOSED);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n const root = document.documentElement;\n\n const publish = (keyboardInset: number) => {\n const isKeyboardOpen = keyboardInset > 0;\n root.style.setProperty(KEYBOARD_INSET_VAR, `${keyboardInset}px`);\n root.toggleAttribute(KEYBOARD_OPEN_ATTRIBUTE, isKeyboardOpen);\n setState((previous) =>\n previous.keyboardInset === keyboardInset\n ? previous\n : { keyboardInset, isKeyboardOpen }\n );\n };\n\n const clear = () => {\n root.style.removeProperty(KEYBOARD_INSET_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_HEIGHT_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_OFFSET_TOP_VAR);\n root.removeAttribute(KEYBOARD_OPEN_ATTRIBUTE);\n root.removeAttribute(KEYBOARD_SOURCE_ATTRIBUTE);\n setState(CLOSED);\n };\n\n if (source === 'native') {\n const handleWillShow = (event: Event) => {\n publish(\n Math.max(\n 0,\n Math.round((event as NativeKeyboardEvent).keyboardHeight ?? 0)\n )\n );\n };\n const handleWillHide = () => publish(0);\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n publish(0);\n window.addEventListener('keyboardWillShow', handleWillShow);\n window.addEventListener('keyboardWillHide', handleWillHide);\n\n return () => {\n window.removeEventListener('keyboardWillShow', handleWillShow);\n window.removeEventListener('keyboardWillHide', handleWillHide);\n clear();\n };\n }\n\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n let frame = 0;\n\n const measure = () => {\n frame = 0;\n // Pinch-zoom shrinks the visual viewport too; that is not a keyboard.\n const zoomed = Math.abs(viewport.scale - 1) > 0.01;\n const keyboardInset = zoomed\n ? 0\n : Math.max(\n 0,\n Math.round(\n window.innerHeight - viewport.height - viewport.offsetTop\n )\n );\n\n root.style.setProperty(\n VISUAL_VIEWPORT_HEIGHT_VAR,\n `${zoomed ? window.innerHeight : Math.round(viewport.height)}px`\n );\n root.style.setProperty(\n VISUAL_VIEWPORT_OFFSET_TOP_VAR,\n `${zoomed ? 0 : Math.round(viewport.offsetTop)}px`\n );\n publish(keyboardInset);\n };\n\n // Coalesce the resize + scroll bursts iOS fires while the keyboard\n // animates into one write per frame.\n const schedule = () => {\n if (frame === 0) frame = requestAnimationFrame(measure);\n };\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n measure();\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n\n return () => {\n cancelAnimationFrame(frame);\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n clear();\n };\n }, [enabled, source]);\n\n return state;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n","'use client';\n\nimport * as React from 'react';\n\nexport interface OrderPersistenceAdapter {\n /** Previously saved order, or null when there is none */\n load: () => string[] | null | Promise<string[] | null>;\n save: (order: string[]) => void | Promise<void>;\n}\n\nexport interface UseOrderPersistenceOptions extends OrderPersistenceAdapter {\n /** Delay before `save` runs; rapid changes collapse into one save. */\n debounceMs?: number;\n /** Called when `load` or `save` throws or rejects */\n onError?: (error: unknown) => void;\n}\n\nexport interface UseOrderPersistenceReturn {\n /** Saved order merged with the current `ids` */\n order: string[];\n /** Update the order immediately and schedule a debounced save */\n setOrder: (order: string[]) => void;\n}\n\n/** Keep saved ids that still exist, then append new ids in their given order. */\nexport function mergeOrder(saved: string[] | null, ids: string[]): string[] {\n if (!saved) return ids;\n const known = new Set(ids);\n const kept = [...new Set(saved)].filter((id) => known.has(id));\n const keptSet = new Set(kept);\n return [...kept, ...ids.filter((id) => !keptSet.has(id))];\n}\n\n/**\n * Persist a user's item order (sections, widgets, list rows) through any\n * storage. Updates are optimistic, saves are debounced and a pending save is\n * flushed on unmount and on `pagehide` (navigation, refresh, tab close). On\n * `pagehide` only work `save` starts synchronously is guaranteed — use\n * localStorage or `navigator.sendBeacon` there; an async `fetch` may be cut\n * off. `load` runs once after mount, so server and first client render use\n * `ids` order.\n *\n * @example\n * ```tsx\n * const adapter = React.useMemo(() => localStorageOrderAdapter('clinic-sections'), []);\n * const { order, setOrder } = useOrderPersistence(sectionIds, adapter);\n * const drag = useDragReorder({ ids: order, onReorder: setOrder });\n * ```\n */\nexport function useOrderPersistence(\n ids: string[],\n { load, save, debounceMs = 500, onError }: UseOrderPersistenceOptions\n): UseOrderPersistenceReturn {\n const [saved, setSaved] = React.useState<string[] | null>(null);\n const callbacks = React.useRef({ load, save, onError });\n callbacks.current = { load, save, onError };\n const pending = React.useRef<string[] | null>(null);\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n const touched = React.useRef(false);\n // In-flight save count: `force` (pagehide) saves may overlap a normal one,\n // so queued flushes resume only after every save settles.\n const saving = React.useRef(0);\n // When saves overlap, their completion order is unknown and a stale write\n // could land last; the newest payload is saved once more after all settle.\n const lastStarted = React.useRef<string[] | null>(null);\n const overlapped = React.useRef(false);\n\n // One save at a time; changes made meanwhile coalesce into the next save.\n // `force` skips the queue for page unloads, where a queued save never runs.\n const flush = React.useCallback(function flushPending(force = false) {\n clearTimeout(timer.current);\n const next = pending.current;\n if (!next || (saving.current > 0 && !force)) return;\n pending.current = null;\n if (saving.current > 0) overlapped.current = true;\n saving.current += 1;\n lastStarted.current = next;\n const { save: run, onError: fail } = callbacks.current;\n let result: void | Promise<void>;\n try {\n result = run(next);\n } catch (e) {\n result = Promise.reject(e);\n }\n void Promise.resolve(result)\n .catch((e: unknown) => fail?.(e))\n .finally(() => {\n saving.current -= 1;\n if (saving.current > 0) return;\n if (overlapped.current) {\n overlapped.current = false;\n pending.current ??= lastStarted.current;\n }\n flushPending();\n });\n }, []);\n\n React.useEffect(() => {\n let active = true;\n const { load: read, onError: fail } = callbacks.current;\n Promise.resolve()\n .then(read)\n .then((value) => {\n // A change made while loading wins over the stored order\n if (active && value && !touched.current) setSaved(value);\n })\n .catch((e: unknown) => fail?.(e));\n return () => {\n active = false;\n flush();\n };\n }, [flush]);\n\n React.useEffect(() => {\n const onPageHide = () => flush(true);\n window.addEventListener('pagehide', onPageHide);\n return () => window.removeEventListener('pagehide', onPageHide);\n }, [flush]);\n\n const setOrder = React.useCallback(\n (next: string[]) => {\n touched.current = true;\n setSaved(next);\n pending.current = next;\n clearTimeout(timer.current);\n timer.current = setTimeout(flush, debounceMs);\n },\n [debounceMs, flush]\n );\n\n const order = React.useMemo(() => mergeOrder(saved, ids), [saved, ids]);\n return { order, setOrder };\n}\n\n/** `useOrderPersistence` adapter backed by `localStorage` (no-op on the server or when storage is blocked). */\nexport function localStorageOrderAdapter(key: string): OrderPersistenceAdapter {\n return {\n load: () => {\n try {\n if (typeof window === 'undefined') return null;\n const raw: unknown = JSON.parse(\n window.localStorage.getItem(key) ?? 'null'\n );\n return Array.isArray(raw) && raw.every((v) => typeof v === 'string')\n ? (raw as string[])\n : null;\n } catch {\n return null;\n }\n },\n save: (order) => {\n try {\n if (typeof window !== 'undefined')\n window.localStorage.setItem(key, JSON.stringify(order));\n } catch {\n // Quota exceeded or storage disabled: keep the in-memory order\n }\n },\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { FenceBlock } from './chunk-QOVJ6Z6R.js';
2
- import { Button } from './chunk-7YO7DNUV.js';
1
+ import { FenceBlock } from './chunk-HDY7YQFX.js';
2
+ import { Button } from './chunk-WFBUBT54.js';
3
3
  import { Code, Eye, Maximize2 } from 'lucide-react';
4
4
  import { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -131,5 +131,5 @@ var HtmlPreviewBlock = ({
131
131
  };
132
132
 
133
133
  export { HtmlPreviewBlock };
134
- //# sourceMappingURL=chunk-GVLNXPJX.js.map
135
- //# sourceMappingURL=chunk-GVLNXPJX.js.map
134
+ //# sourceMappingURL=chunk-FGLIP6YR.js.map
135
+ //# sourceMappingURL=chunk-FGLIP6YR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Markdown/HtmlPreviewBlock.tsx"],"names":[],"mappings":"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","file":"chunk-GVLNXPJX.js","sourcesContent":["/** Sandboxed iframe preview for HTML code blocks. */\nimport { Code, Eye, Maximize2 } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface HtmlPreviewBlockProps {\n code: string;\n id: string;\n}\n\nfunction isFullDocument(html: string): boolean {\n return /<!DOCTYPE|<html/i.test(html);\n}\n\nfunction wrapFragment(html: string): string {\n return `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><style>body{margin:0;padding:8px;font-family:system-ui,sans-serif;font-size:14px}</style></head>\n<body>${html}</body>\n</html>`;\n}\n\nexport const HtmlPreviewBlock: React.FC<HtmlPreviewBlockProps> = ({\n code,\n id,\n}) => {\n const [showPreview, setShowPreview] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [iframeHeight, setIframeHeight] = useState(200);\n\n const srcdoc = isFullDocument(code) ? code : wrapFragment(code);\n\n useEffect(() => {\n function handleMessage(event: globalThis.MessageEvent) {\n // Sandboxed srcDoc iframes report origin \"null\"; validate source to prevent spoofing.\n if (event.origin !== 'null' && event.origin !== window.location.origin)\n return;\n if (event.source !== iframeRef.current?.contentWindow) return;\n if (event.data?.type === 'HTML_PREVIEW_RESIZE' && event.data?.id === id) {\n setIframeHeight(Math.min(Math.max(event.data.height, 200), 4000));\n }\n }\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [id]);\n\n useEffect(() => {\n if (!expanded) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setExpanded(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [expanded]);\n\n const togglePreview = useCallback(() => setShowPreview((v) => !v), []);\n\n const headerActions = (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={togglePreview}\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n {showPreview ? (\n <Code className=\"h-3 w-3\" />\n ) : (\n <Eye className=\"h-3 w-3\" />\n )}\n {showPreview ? 'Code' : 'Preview'}\n </Button>\n {showPreview && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded(true)}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Expand preview\"\n >\n <Maximize2 className=\"h-3 w-3\" />\n </Button>\n )}\n </>\n );\n\n return (\n <>\n <FenceBlock code={code} language=\"html\" headerActions={headerActions}>\n <div className=\"relative\">\n {showPreview ? (\n <iframe\n ref={iframeRef}\n srcDoc={srcdoc}\n // `allow-scripts` lets previewed HTML run its own JS (charts, demos,\n // and the optional resize-postMessage handshake). It is intentionally\n // NOT paired with `allow-same-origin`, so the content runs in an\n // opaque (null) origin with no access to this page, cookies, or storage.\n sandbox=\"allow-scripts allow-forms\"\n referrerPolicy=\"no-referrer\"\n className=\"w-full border-0\"\n style={{ height: iframeHeight }}\n title=\"HTML Preview\"\n />\n ) : (\n <pre className=\"overflow-x-auto p-3 text-sm\">\n <code>{code}</code>\n </pre>\n )}\n </div>\n </FenceBlock>\n\n {expanded && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"HTML Preview\"\n >\n <button\n type=\"button\"\n aria-label=\"Close preview\"\n className=\"absolute inset-0 h-full w-full cursor-default border-0 bg-transparent p-0\"\n onClick={() => setExpanded(false)}\n />\n <div className=\"relative h-[90vh] w-[90vw] overflow-hidden rounded-lg bg-white shadow-xl dark:bg-neutral-900\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-4 py-2 dark:border-neutral-700\">\n <span className=\"text-sm font-medium\">HTML Preview</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded(false)}\n >\n Close\n </Button>\n </div>\n <iframe\n srcDoc={srcdoc}\n sandbox=\"allow-scripts allow-forms\"\n referrerPolicy=\"no-referrer\"\n className=\"h-full w-full border-0\"\n title=\"HTML Preview (expanded)\"\n />\n </div>\n </div>\n )}\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Markdown/HtmlPreviewBlock.tsx"],"names":[],"mappings":"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","file":"chunk-FGLIP6YR.js","sourcesContent":["/** Sandboxed iframe preview for HTML code blocks. */\nimport { Code, Eye, Maximize2 } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface HtmlPreviewBlockProps {\n code: string;\n id: string;\n}\n\nfunction isFullDocument(html: string): boolean {\n return /<!DOCTYPE|<html/i.test(html);\n}\n\nfunction wrapFragment(html: string): string {\n return `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><style>body{margin:0;padding:8px;font-family:system-ui,sans-serif;font-size:14px}</style></head>\n<body>${html}</body>\n</html>`;\n}\n\nexport const HtmlPreviewBlock: React.FC<HtmlPreviewBlockProps> = ({\n code,\n id,\n}) => {\n const [showPreview, setShowPreview] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [iframeHeight, setIframeHeight] = useState(200);\n\n const srcdoc = isFullDocument(code) ? code : wrapFragment(code);\n\n useEffect(() => {\n function handleMessage(event: globalThis.MessageEvent) {\n // Sandboxed srcDoc iframes report origin \"null\"; validate source to prevent spoofing.\n if (event.origin !== 'null' && event.origin !== window.location.origin)\n return;\n if (event.source !== iframeRef.current?.contentWindow) return;\n if (event.data?.type === 'HTML_PREVIEW_RESIZE' && event.data?.id === id) {\n setIframeHeight(Math.min(Math.max(event.data.height, 200), 4000));\n }\n }\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [id]);\n\n useEffect(() => {\n if (!expanded) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setExpanded(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [expanded]);\n\n const togglePreview = useCallback(() => setShowPreview((v) => !v), []);\n\n const headerActions = (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={togglePreview}\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n {showPreview ? (\n <Code className=\"h-3 w-3\" />\n ) : (\n <Eye className=\"h-3 w-3\" />\n )}\n {showPreview ? 'Code' : 'Preview'}\n </Button>\n {showPreview && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded(true)}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Expand preview\"\n >\n <Maximize2 className=\"h-3 w-3\" />\n </Button>\n )}\n </>\n );\n\n return (\n <>\n <FenceBlock code={code} language=\"html\" headerActions={headerActions}>\n <div className=\"relative\">\n {showPreview ? (\n <iframe\n ref={iframeRef}\n srcDoc={srcdoc}\n // `allow-scripts` lets previewed HTML run its own JS (charts, demos,\n // and the optional resize-postMessage handshake). It is intentionally\n // NOT paired with `allow-same-origin`, so the content runs in an\n // opaque (null) origin with no access to this page, cookies, or storage.\n sandbox=\"allow-scripts allow-forms\"\n referrerPolicy=\"no-referrer\"\n className=\"w-full border-0\"\n style={{ height: iframeHeight }}\n title=\"HTML Preview\"\n />\n ) : (\n <pre className=\"overflow-x-auto p-3 text-sm\">\n <code>{code}</code>\n </pre>\n )}\n </div>\n </FenceBlock>\n\n {expanded && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"HTML Preview\"\n >\n <button\n type=\"button\"\n aria-label=\"Close preview\"\n className=\"absolute inset-0 h-full w-full cursor-default border-0 bg-transparent p-0\"\n onClick={() => setExpanded(false)}\n />\n <div className=\"relative h-[90vh] w-[90vw] overflow-hidden rounded-lg bg-white shadow-xl dark:bg-neutral-900\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-4 py-2 dark:border-neutral-700\">\n <span className=\"text-sm font-medium\">HTML Preview</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded(false)}\n >\n Close\n </Button>\n </div>\n <iframe\n srcDoc={srcdoc}\n sandbox=\"allow-scripts allow-forms\"\n referrerPolicy=\"no-referrer\"\n className=\"h-full w-full border-0\"\n title=\"HTML Preview (expanded)\"\n />\n </div>\n </div>\n )}\n </>\n );\n};\n"]}
@@ -0,0 +1,314 @@
1
+ import { withLocale } from './chunk-YGS2TRMP.js';
2
+ import { usePendingOverrides } from './chunk-FTEZNCRI.js';
3
+ import { RecordState } from './chunk-Y424YL55.js';
4
+ import { Progress } from './chunk-CEQJGUAS.js';
5
+ import { Checkbox } from './chunk-753Z3NXL.js';
6
+ import { Avatar } from './chunk-TI3TQQ7F.js';
7
+ import { accentClasses, toDateTime } from './chunk-3YBS4WUQ.js';
8
+ import { Badge } from './chunk-BMSG4NBH.js';
9
+ import { Button } from './chunk-WFBUBT54.js';
10
+ import { cn } from './chunk-TQONQSJO.js';
11
+ import * as React from 'react';
12
+ import { DateTime } from 'luxon';
13
+ import { Plus, CalendarClock } from 'lucide-react';
14
+ import { jsx, jsxs } from 'react/jsx-runtime';
15
+
16
+ var defaultActionPlanLabels = {
17
+ title: "Action plan",
18
+ progress: (done, total) => `${done} of ${total} complete`,
19
+ overdue: "Overdue",
20
+ todo: "To do",
21
+ inProgress: "In progress",
22
+ done: "Done",
23
+ addStep: "Add step",
24
+ loading: "Loading plan",
25
+ empty: "No steps yet",
26
+ error: "Could not load this plan",
27
+ retry: "Try again"
28
+ };
29
+ var STATUS_ORDER = ["in_progress", "todo", "done"];
30
+ var SUB_HEADING = { h2: "h3", h3: "h4", h4: "h5" };
31
+ var ActionPlan = React.forwardRef(
32
+ ({
33
+ items,
34
+ title,
35
+ loading = false,
36
+ error = null,
37
+ onRetry,
38
+ arrange = "manual",
39
+ now,
40
+ locale,
41
+ timeZone = "local",
42
+ onStatusChange,
43
+ onAdd,
44
+ onOpen,
45
+ getHref,
46
+ renderStepMeta,
47
+ emptyState,
48
+ labels,
49
+ classNames,
50
+ headingLevel: Heading = "h3",
51
+ className,
52
+ ...rest
53
+ }, ref) => {
54
+ const text = { ...defaultActionPlanLabels, ...labels };
55
+ const baseId = React.useId();
56
+ const [overrides, runStatus] = usePendingOverrides();
57
+ const today = (now ? DateTime.fromJSDate(now) : DateTime.now()).setZone(timeZone).startOf("day");
58
+ const statusOf = (step) => overrides.get(step.id) ?? step.status;
59
+ const statusLabel = {
60
+ todo: text.todo,
61
+ in_progress: text.inProgress,
62
+ done: text.done
63
+ };
64
+ const done = items.filter((s) => statusOf(s) === "done").length;
65
+ const dueOf = (step) => toDateTime(step.dueDate, timeZone);
66
+ const renderStep = (step) => {
67
+ const status = statusOf(step);
68
+ const pending = overrides.has(step.id);
69
+ const due = dueOf(step);
70
+ const overdue = status !== "done" && due !== null && due.startOf("day") < today;
71
+ const titleId = `${baseId}-step-${items.indexOf(step)}`;
72
+ const href = getHref?.(step.id, step);
73
+ const titleClasses = cn(
74
+ "text-sm font-medium",
75
+ status === "done" ? "text-muted-foreground line-through" : "text-foreground"
76
+ );
77
+ const focusRing = "rounded-sm hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
78
+ let titleNode = /* @__PURE__ */ jsx("span", { id: titleId, className: titleClasses, children: step.title });
79
+ if (href) {
80
+ titleNode = /* @__PURE__ */ jsx(
81
+ "a",
82
+ {
83
+ id: titleId,
84
+ href,
85
+ className: cn(titleClasses, focusRing),
86
+ onClick: (event) => {
87
+ if (!onOpen || event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0)
88
+ return;
89
+ event.preventDefault();
90
+ onOpen(step.id, step);
91
+ },
92
+ children: step.title
93
+ }
94
+ );
95
+ } else if (onOpen) {
96
+ titleNode = /* @__PURE__ */ jsx(
97
+ "button",
98
+ {
99
+ id: titleId,
100
+ type: "button",
101
+ className: cn(titleClasses, focusRing, "text-start"),
102
+ onClick: () => onOpen(step.id, step),
103
+ children: step.title
104
+ }
105
+ );
106
+ }
107
+ return /* @__PURE__ */ jsxs(
108
+ "li",
109
+ {
110
+ "data-slot": "action-plan-step",
111
+ "data-overdue": overdue || void 0,
112
+ "aria-busy": pending || void 0,
113
+ className: cn(
114
+ "flex items-start gap-3 px-4 py-3",
115
+ overdue && accentClasses.destructive.tint,
116
+ classNames?.step,
117
+ overdue && classNames?.overdueStep
118
+ ),
119
+ children: [
120
+ /* @__PURE__ */ jsx(
121
+ Checkbox,
122
+ {
123
+ size: "sm",
124
+ className: "mt-0.5",
125
+ checked: status === "done",
126
+ disabled: !onStatusChange || pending,
127
+ "aria-labelledby": titleId,
128
+ onChange: (event) => {
129
+ if (!onStatusChange) return;
130
+ const next = event.currentTarget.checked ? "done" : "todo";
131
+ void runStatus(
132
+ step.id,
133
+ next,
134
+ () => onStatusChange(step.id, next)
135
+ );
136
+ }
137
+ }
138
+ ),
139
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
140
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
141
+ titleNode,
142
+ status === "in_progress" && /* @__PURE__ */ jsx(Badge, { size: "sm", variant: "secondary", children: text.inProgress }),
143
+ overdue && /* @__PURE__ */ jsx(Badge, { size: "sm", variant: "danger", children: text.overdue })
144
+ ] }),
145
+ (step.owner || due) && /* @__PURE__ */ jsxs("div", { className: "text-muted-foreground mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs", children: [
146
+ step.owner && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
147
+ /* @__PURE__ */ jsx(
148
+ Avatar,
149
+ {
150
+ size: "xs",
151
+ name: step.owner.name,
152
+ src: step.owner.avatarUrl,
153
+ alt: "",
154
+ "aria-hidden": true
155
+ }
156
+ ),
157
+ step.owner.name
158
+ ] }),
159
+ due && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
160
+ /* @__PURE__ */ jsx(CalendarClock, { className: "size-3.5", "aria-hidden": true }),
161
+ /* @__PURE__ */ jsx("time", { dateTime: step.dueDate, children: withLocale(due, locale).toLocaleString(
162
+ DateTime.DATE_MED
163
+ ) })
164
+ ] }),
165
+ renderStepMeta?.(step)
166
+ ] }),
167
+ step.note && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: step.note })
168
+ ] })
169
+ ]
170
+ },
171
+ step.id
172
+ );
173
+ };
174
+ let body;
175
+ if (error) {
176
+ body = /* @__PURE__ */ jsx(
177
+ RecordState,
178
+ {
179
+ kind: "error",
180
+ slot: "action-plan-state",
181
+ message: text.error,
182
+ retryLabel: text.retry,
183
+ onRetry,
184
+ className: classNames?.state
185
+ }
186
+ );
187
+ } else if (loading) {
188
+ body = /* @__PURE__ */ jsx(
189
+ RecordState,
190
+ {
191
+ kind: "loading",
192
+ slot: "action-plan-state",
193
+ message: text.loading,
194
+ className: classNames?.state
195
+ }
196
+ );
197
+ } else if (items.length === 0) {
198
+ body = emptyState ?? /* @__PURE__ */ jsx(
199
+ RecordState,
200
+ {
201
+ kind: "empty",
202
+ slot: "action-plan-state",
203
+ message: text.empty,
204
+ className: classNames?.state
205
+ }
206
+ );
207
+ } else if (arrange === "status") {
208
+ const SubHeading = SUB_HEADING[Heading];
209
+ body = STATUS_ORDER.map((status) => {
210
+ const group = items.filter((s) => statusOf(s) === status);
211
+ if (group.length === 0) return null;
212
+ const groupId = `${baseId}-group-${status}`;
213
+ return /* @__PURE__ */ jsxs(
214
+ "section",
215
+ {
216
+ "aria-labelledby": groupId,
217
+ "data-slot": "action-plan-group",
218
+ className: classNames?.group,
219
+ children: [
220
+ /* @__PURE__ */ jsxs(
221
+ SubHeading,
222
+ {
223
+ id: groupId,
224
+ className: "border-border bg-muted text-muted-foreground flex items-center justify-between border-y px-4 py-1.5 text-xs font-semibold tracking-wide uppercase",
225
+ children: [
226
+ statusLabel[status],
227
+ /* @__PURE__ */ jsx("span", { className: "font-normal tabular-nums", children: group.length })
228
+ ]
229
+ }
230
+ ),
231
+ /* @__PURE__ */ jsx("ul", { className: "divide-border divide-y", children: group.map(renderStep) })
232
+ ]
233
+ },
234
+ status
235
+ );
236
+ });
237
+ } else {
238
+ const ordered = arrange === "dueDate" ? [...items].sort(
239
+ (a, b) => (dueOf(a)?.toMillis() ?? Infinity) - (dueOf(b)?.toMillis() ?? Infinity) || 0
240
+ ) : items;
241
+ body = /* @__PURE__ */ jsx("ul", { className: "divide-border divide-y", children: ordered.map(renderStep) });
242
+ }
243
+ const headingId = `${baseId}-title`;
244
+ return /* @__PURE__ */ jsxs(
245
+ "section",
246
+ {
247
+ ref,
248
+ "aria-labelledby": headingId,
249
+ "data-slot": "action-plan",
250
+ className: cn(
251
+ "border-border bg-card overflow-hidden rounded-lg border",
252
+ className
253
+ ),
254
+ ...rest,
255
+ children: [
256
+ /* @__PURE__ */ jsxs(
257
+ "div",
258
+ {
259
+ "data-slot": "action-plan-header",
260
+ className: cn(
261
+ "border-border space-y-3 border-b px-4 py-3",
262
+ classNames?.header
263
+ ),
264
+ children: [
265
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
266
+ /* @__PURE__ */ jsx(
267
+ Heading,
268
+ {
269
+ id: headingId,
270
+ className: "text-foreground min-w-0 flex-1 truncate text-sm font-semibold",
271
+ children: title ?? text.title
272
+ }
273
+ ),
274
+ onAdd && /* @__PURE__ */ jsx(
275
+ Button,
276
+ {
277
+ variant: "ghost",
278
+ size: "sm",
279
+ onClick: onAdd,
280
+ leftIcon: /* @__PURE__ */ jsx(Plus, { className: "size-4", "aria-hidden": true }),
281
+ children: text.addStep
282
+ }
283
+ )
284
+ ] }),
285
+ !loading && !error && items.length > 0 && /* @__PURE__ */ jsx(
286
+ "div",
287
+ {
288
+ "data-slot": "action-plan-progress",
289
+ className: classNames?.progress,
290
+ children: /* @__PURE__ */ jsx(
291
+ Progress,
292
+ {
293
+ size: "sm",
294
+ value: done,
295
+ max: items.length,
296
+ label: text.progress(done, items.length)
297
+ }
298
+ )
299
+ }
300
+ )
301
+ ]
302
+ }
303
+ ),
304
+ body
305
+ ]
306
+ }
307
+ );
308
+ }
309
+ );
310
+ ActionPlan.displayName = "ActionPlan";
311
+
312
+ export { ActionPlan, defaultActionPlanLabels };
313
+ //# sourceMappingURL=chunk-FKGFOBC2.js.map
314
+ //# sourceMappingURL=chunk-FKGFOBC2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ActionPlan/ActionPlan.tsx"],"names":[],"mappings":"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","file":"chunk-FKGFOBC2.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { DateTime } from 'luxon';\nimport { CalendarClock, Plus } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Avatar } from '../Avatar';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { Progress } from '../Progress';\nimport { accentClasses, toDateTime } from '../../views/types';\nimport { withLocale } from '../ActivityFeed/dayGroups';\nimport { RecordState } from '../ActivityFeed/RecordState';\nimport { usePendingOverrides } from '../ActivityFeed/usePendingOverrides';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ActionPlanStepStatus = 'todo' | 'in_progress' | 'done';\n\nexport interface ActionPlanOwner {\n name: string;\n avatarUrl?: string;\n}\n\nexport interface ActionPlanStep {\n id: string;\n title: string;\n owner?: ActionPlanOwner;\n /** ISO date or date-time. Date-only values are wall dates in `timeZone`. */\n dueDate?: string;\n status: ActionPlanStepStatus;\n note?: string;\n}\n\nexport interface ActionPlanLabels {\n title: string;\n progress: (done: number, total: number) => string;\n overdue: string;\n todo: string;\n inProgress: string;\n done: string;\n addStep: string;\n loading: string;\n empty: string;\n error: string;\n retry: string;\n}\n\nexport const defaultActionPlanLabels: ActionPlanLabels = {\n title: 'Action plan',\n progress: (done, total) => `${done} of ${total} complete`,\n overdue: 'Overdue',\n todo: 'To do',\n inProgress: 'In progress',\n done: 'Done',\n addStep: 'Add step',\n loading: 'Loading plan',\n empty: 'No steps yet',\n error: 'Could not load this plan',\n retry: 'Try again',\n};\n\nexport type ActionPlanSlot =\n | 'header'\n | 'progress'\n | 'group'\n | 'step'\n | 'overdueStep'\n | 'state';\n\nexport type ActionPlanArrange = 'manual' | 'dueDate' | 'status';\n\nexport interface ActionPlanProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n 'children' | 'title'\n> {\n items: ActionPlanStep[];\n /** Card heading. Defaults to `labels.title`. */\n title?: string;\n loading?: boolean;\n error?: Error | null;\n onRetry?: () => void;\n /** `manual` keeps `items` order; `dueDate` sorts soonest first; `status` groups by status. */\n arrange?: ActionPlanArrange;\n /** Reference for overdue checks. Defaults to the current time. */\n now?: Date;\n locale?: string;\n /** IANA zone for due dates. Defaults to local. */\n timeZone?: string;\n /** The checkbox shows the new status at once and restores it on rejection. */\n onStatusChange?: (\n id: string,\n status: ActionPlanStepStatus\n ) => void | Promise<void>;\n onAdd?: () => void;\n onOpen?: (id: string, step: ActionPlanStep) => void;\n getHref?: (id: string, step: ActionPlanStep) => string;\n /** Extra content on a step's meta line. */\n renderStepMeta?: (step: ActionPlanStep) => React.ReactNode;\n emptyState?: React.ReactNode;\n labels?: Partial<ActionPlanLabels>;\n classNames?: Partial<Record<ActionPlanSlot, string>>;\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\nconst STATUS_ORDER: ActionPlanStepStatus[] = ['in_progress', 'todo', 'done'];\nconst SUB_HEADING = { h2: 'h3', h3: 'h4', h4: 'h5' } as const;\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * A shared checklist with progress and due dates. Declared\n * `parameters.catalog.collection` — its load states are part of the API.\n */\nexport const ActionPlan = React.forwardRef<HTMLElement, ActionPlanProps>(\n (\n {\n items,\n title,\n loading = false,\n error = null,\n onRetry,\n arrange = 'manual',\n now,\n locale,\n timeZone = 'local',\n onStatusChange,\n onAdd,\n onOpen,\n getHref,\n renderStepMeta,\n emptyState,\n labels,\n classNames,\n headingLevel: Heading = 'h3',\n className,\n ...rest\n },\n ref\n ) => {\n const text = { ...defaultActionPlanLabels, ...labels };\n const baseId = React.useId();\n const [overrides, runStatus] = usePendingOverrides<ActionPlanStepStatus>();\n const today = (now ? DateTime.fromJSDate(now) : DateTime.now())\n .setZone(timeZone)\n .startOf('day');\n\n const statusOf = (step: ActionPlanStep) =>\n overrides.get(step.id) ?? step.status;\n const statusLabel: Record<ActionPlanStepStatus, string> = {\n todo: text.todo,\n in_progress: text.inProgress,\n done: text.done,\n };\n const done = items.filter((s) => statusOf(s) === 'done').length;\n\n const dueOf = (step: ActionPlanStep) => toDateTime(step.dueDate, timeZone);\n\n const renderStep = (step: ActionPlanStep) => {\n const status = statusOf(step);\n const pending = overrides.has(step.id);\n const due = dueOf(step);\n const overdue =\n status !== 'done' && due !== null && due.startOf('day') < today;\n // Position, not the caller's id: ids with spaces would break aria-labelledby.\n const titleId = `${baseId}-step-${items.indexOf(step)}`;\n const href = getHref?.(step.id, step);\n const titleClasses = cn(\n 'text-sm font-medium',\n status === 'done'\n ? 'text-muted-foreground line-through'\n : 'text-foreground'\n );\n const focusRing =\n 'rounded-sm hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring';\n\n let titleNode: React.ReactNode = (\n <span id={titleId} className={titleClasses}>\n {step.title}\n </span>\n );\n if (href) {\n titleNode = (\n <a\n id={titleId}\n href={href}\n className={cn(titleClasses, focusRing)}\n onClick={(event) => {\n if (\n !onOpen ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.button !== 0\n )\n return;\n event.preventDefault();\n onOpen(step.id, step);\n }}\n >\n {step.title}\n </a>\n );\n } else if (onOpen) {\n titleNode = (\n <button\n id={titleId}\n type=\"button\"\n className={cn(titleClasses, focusRing, 'text-start')}\n onClick={() => onOpen(step.id, step)}\n >\n {step.title}\n </button>\n );\n }\n\n return (\n <li\n key={step.id}\n data-slot=\"action-plan-step\"\n data-overdue={overdue || undefined}\n aria-busy={pending || undefined}\n className={cn(\n 'flex items-start gap-3 px-4 py-3',\n overdue && accentClasses.destructive.tint,\n classNames?.step,\n overdue && classNames?.overdueStep\n )}\n >\n <Checkbox\n size=\"sm\"\n className=\"mt-0.5\"\n checked={status === 'done'}\n disabled={!onStatusChange || pending}\n aria-labelledby={titleId}\n onChange={(event) => {\n if (!onStatusChange) return;\n const next = event.currentTarget.checked ? 'done' : 'todo';\n void runStatus(step.id, next, () =>\n onStatusChange(step.id, next)\n );\n }}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {titleNode}\n {status === 'in_progress' && (\n <Badge size=\"sm\" variant=\"secondary\">\n {text.inProgress}\n </Badge>\n )}\n {overdue && (\n <Badge size=\"sm\" variant=\"danger\">\n {text.overdue}\n </Badge>\n )}\n </div>\n {(step.owner || due) && (\n <div className=\"text-muted-foreground mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs\">\n {step.owner && (\n <span className=\"inline-flex items-center gap-1.5\">\n <Avatar\n size=\"xs\"\n name={step.owner.name}\n src={step.owner.avatarUrl}\n alt=\"\"\n aria-hidden\n />\n {step.owner.name}\n </span>\n )}\n {due && (\n <span className=\"inline-flex items-center gap-1\">\n <CalendarClock className=\"size-3.5\" aria-hidden />\n <time dateTime={step.dueDate}>\n {withLocale(due, locale).toLocaleString(\n DateTime.DATE_MED\n )}\n </time>\n </span>\n )}\n {renderStepMeta?.(step)}\n </div>\n )}\n {step.note && (\n <p className=\"text-muted-foreground mt-1 text-sm\">{step.note}</p>\n )}\n </div>\n </li>\n );\n };\n\n let body: React.ReactNode;\n if (error) {\n body = (\n <RecordState\n kind=\"error\"\n slot=\"action-plan-state\"\n message={text.error}\n retryLabel={text.retry}\n onRetry={onRetry}\n className={classNames?.state}\n />\n );\n } else if (loading) {\n body = (\n <RecordState\n kind=\"loading\"\n slot=\"action-plan-state\"\n message={text.loading}\n className={classNames?.state}\n />\n );\n } else if (items.length === 0) {\n body = emptyState ?? (\n <RecordState\n kind=\"empty\"\n slot=\"action-plan-state\"\n message={text.empty}\n className={classNames?.state}\n />\n );\n } else if (arrange === 'status') {\n const SubHeading = SUB_HEADING[Heading];\n body = STATUS_ORDER.map((status) => {\n const group = items.filter((s) => statusOf(s) === status);\n if (group.length === 0) return null;\n const groupId = `${baseId}-group-${status}`;\n return (\n <section\n key={status}\n aria-labelledby={groupId}\n data-slot=\"action-plan-group\"\n className={classNames?.group}\n >\n <SubHeading\n id={groupId}\n className=\"border-border bg-muted text-muted-foreground flex items-center justify-between border-y px-4 py-1.5 text-xs font-semibold tracking-wide uppercase\"\n >\n {statusLabel[status]}\n <span className=\"font-normal tabular-nums\">{group.length}</span>\n </SubHeading>\n <ul className=\"divide-border divide-y\">{group.map(renderStep)}</ul>\n </section>\n );\n });\n } else {\n const ordered =\n arrange === 'dueDate'\n ? [...items].sort(\n (a, b) =>\n (dueOf(a)?.toMillis() ?? Infinity) -\n (dueOf(b)?.toMillis() ?? Infinity) || 0\n )\n : items;\n body = (\n <ul className=\"divide-border divide-y\">{ordered.map(renderStep)}</ul>\n );\n }\n\n const headingId = `${baseId}-title`;\n return (\n <section\n ref={ref}\n aria-labelledby={headingId}\n data-slot=\"action-plan\"\n className={cn(\n 'border-border bg-card overflow-hidden rounded-lg border',\n className\n )}\n {...rest}\n >\n <div\n data-slot=\"action-plan-header\"\n className={cn(\n 'border-border space-y-3 border-b px-4 py-3',\n classNames?.header\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Heading\n id={headingId}\n className=\"text-foreground min-w-0 flex-1 truncate text-sm font-semibold\"\n >\n {title ?? text.title}\n </Heading>\n {onAdd && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<Plus className=\"size-4\" aria-hidden />}\n >\n {text.addStep}\n </Button>\n )}\n </div>\n {!loading && !error && items.length > 0 && (\n <div\n data-slot=\"action-plan-progress\"\n className={classNames?.progress}\n >\n <Progress\n size=\"sm\"\n value={done}\n max={items.length}\n label={text.progress(done, items.length)}\n />\n </div>\n )}\n </div>\n {body}\n </section>\n );\n }\n);\n\nActionPlan.displayName = 'ActionPlan';\n"]}