formanitor 0.1.11 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/AddInvestigationWidget-7UGZQYI5.mjs +30 -0
  2. package/dist/AddInvestigationWidget-7UGZQYI5.mjs.map +1 -0
  3. package/dist/AddInvestigationWidget-RY62UCPM.cjs +32 -0
  4. package/dist/AddInvestigationWidget-RY62UCPM.cjs.map +1 -0
  5. package/dist/AddMedicationWidget-UG26VMUX.mjs +30 -0
  6. package/dist/AddMedicationWidget-UG26VMUX.mjs.map +1 -0
  7. package/dist/AddMedicationWidget-WPI32WAP.cjs +32 -0
  8. package/dist/AddMedicationWidget-WPI32WAP.cjs.map +1 -0
  9. package/dist/AddProcedureWidget-SF6MTRBV.cjs +278 -0
  10. package/dist/AddProcedureWidget-SF6MTRBV.cjs.map +1 -0
  11. package/dist/AddProcedureWidget-SQJUKKMK.mjs +276 -0
  12. package/dist/AddProcedureWidget-SQJUKKMK.mjs.map +1 -0
  13. package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs +300 -0
  14. package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs.map +1 -0
  15. package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs +298 -0
  16. package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs.map +1 -0
  17. package/dist/DateTimeWidget-DIDVF2EB.cjs +61 -0
  18. package/dist/DateTimeWidget-DIDVF2EB.cjs.map +1 -0
  19. package/dist/DateTimeWidget-LFBB6HOP.mjs +59 -0
  20. package/dist/DateTimeWidget-LFBB6HOP.mjs.map +1 -0
  21. package/dist/DateWidget-4ND5TKP2.mjs +72 -0
  22. package/dist/DateWidget-4ND5TKP2.mjs.map +1 -0
  23. package/dist/DateWidget-BCVR5GDK.cjs +74 -0
  24. package/dist/DateWidget-BCVR5GDK.cjs.map +1 -0
  25. package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs +190 -0
  26. package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs.map +1 -0
  27. package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs +184 -0
  28. package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs.map +1 -0
  29. package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs +17 -0
  30. package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs.map +1 -0
  31. package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs +15 -0
  32. package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs.map +1 -0
  33. package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs +161 -0
  34. package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs.map +1 -0
  35. package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs +163 -0
  36. package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs.map +1 -0
  37. package/dist/EditableTable-TGCVUBLO.mjs +279 -0
  38. package/dist/EditableTable-TGCVUBLO.mjs.map +1 -0
  39. package/dist/EditableTable-VCUNJZEX.cjs +281 -0
  40. package/dist/EditableTable-VCUNJZEX.cjs.map +1 -0
  41. package/dist/FollowupWidget-F6FRZO4T.mjs +283 -0
  42. package/dist/FollowupWidget-F6FRZO4T.mjs.map +1 -0
  43. package/dist/FollowupWidget-NBTOV2ML.cjs +285 -0
  44. package/dist/FollowupWidget-NBTOV2ML.cjs.map +1 -0
  45. package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs +93 -0
  46. package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs.map +1 -0
  47. package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs +91 -0
  48. package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs.map +1 -0
  49. package/dist/GsExaminationWidget-57SL4BCI.cjs +528 -0
  50. package/dist/GsExaminationWidget-57SL4BCI.cjs.map +1 -0
  51. package/dist/GsExaminationWidget-J4VABGY6.mjs +526 -0
  52. package/dist/GsExaminationWidget-J4VABGY6.mjs.map +1 -0
  53. package/dist/GsGradingWidget-3WTLIP33.mjs +90 -0
  54. package/dist/GsGradingWidget-3WTLIP33.mjs.map +1 -0
  55. package/dist/GsGradingWidget-CIXE36HF.cjs +92 -0
  56. package/dist/GsGradingWidget-CIXE36HF.cjs.map +1 -0
  57. package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs +398 -0
  58. package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs.map +1 -0
  59. package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs +396 -0
  60. package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs.map +1 -0
  61. package/dist/HiddenVitalsWidget-HBK7PBPR.cjs +55 -0
  62. package/dist/HiddenVitalsWidget-HBK7PBPR.cjs.map +1 -0
  63. package/dist/HiddenVitalsWidget-JH3NRZLM.mjs +53 -0
  64. package/dist/HiddenVitalsWidget-JH3NRZLM.mjs.map +1 -0
  65. package/dist/LensAssessmentWidget-7WMULFS2.mjs +232 -0
  66. package/dist/LensAssessmentWidget-7WMULFS2.mjs.map +1 -0
  67. package/dist/LensAssessmentWidget-GSOOD7BX.cjs +234 -0
  68. package/dist/LensAssessmentWidget-GSOOD7BX.cjs.map +1 -0
  69. package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs +76 -0
  70. package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs.map +1 -0
  71. package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs +74 -0
  72. package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs.map +1 -0
  73. package/dist/OBGExaminationWidget-F2ZNSP2M.cjs +215 -0
  74. package/dist/OBGExaminationWidget-F2ZNSP2M.cjs.map +1 -0
  75. package/dist/OBGExaminationWidget-POVLALMA.mjs +213 -0
  76. package/dist/OBGExaminationWidget-POVLALMA.mjs.map +1 -0
  77. package/dist/OBGPathwayWidget-CGT7Q4T2.mjs +517 -0
  78. package/dist/OBGPathwayWidget-CGT7Q4T2.mjs.map +1 -0
  79. package/dist/OBGPathwayWidget-WCIQENMO.cjs +519 -0
  80. package/dist/OBGPathwayWidget-WCIQENMO.cjs.map +1 -0
  81. package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs +1113 -0
  82. package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs.map +1 -0
  83. package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs +1115 -0
  84. package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs.map +1 -0
  85. package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs +89 -0
  86. package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs.map +1 -0
  87. package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs +91 -0
  88. package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs.map +1 -0
  89. package/dist/OphthalmologyWidget-I3BKWOI2.cjs +1331 -0
  90. package/dist/OphthalmologyWidget-I3BKWOI2.cjs.map +1 -0
  91. package/dist/OphthalmologyWidget-RG2AI6WA.mjs +1329 -0
  92. package/dist/OphthalmologyWidget-RG2AI6WA.mjs.map +1 -0
  93. package/dist/OrthopedicExamWidget-BBZP6NVT.mjs +366 -0
  94. package/dist/OrthopedicExamWidget-BBZP6NVT.mjs.map +1 -0
  95. package/dist/OrthopedicExamWidget-M4KKU5RC.cjs +368 -0
  96. package/dist/OrthopedicExamWidget-M4KKU5RC.cjs.map +1 -0
  97. package/dist/PainScaleFlagsWidget-E576R6QB.mjs +151 -0
  98. package/dist/PainScaleFlagsWidget-E576R6QB.mjs.map +1 -0
  99. package/dist/PainScaleFlagsWidget-QHGESXNE.cjs +153 -0
  100. package/dist/PainScaleFlagsWidget-QHGESXNE.cjs.map +1 -0
  101. package/dist/ReadOnlyTable-4Y2XW4MX.mjs +6 -0
  102. package/dist/ReadOnlyTable-4Y2XW4MX.mjs.map +1 -0
  103. package/dist/ReadOnlyTable-L7G6GWEJ.cjs +15 -0
  104. package/dist/ReadOnlyTable-L7G6GWEJ.cjs.map +1 -0
  105. package/dist/ReferralWidget-J2PWYFDT.cjs +171 -0
  106. package/dist/ReferralWidget-J2PWYFDT.cjs.map +1 -0
  107. package/dist/ReferralWidget-UPYWEO5R.mjs +169 -0
  108. package/dist/ReferralWidget-UPYWEO5R.mjs.map +1 -0
  109. package/dist/RichTextWidget-BBCNJPMH.mjs +11 -0
  110. package/dist/RichTextWidget-BBCNJPMH.mjs.map +1 -0
  111. package/dist/RichTextWidget-CRQHNVJR.cjs +24 -0
  112. package/dist/RichTextWidget-CRQHNVJR.cjs.map +1 -0
  113. package/dist/SmartTextarea-DKWV4R6H.cjs +19 -0
  114. package/dist/SmartTextarea-DKWV4R6H.cjs.map +1 -0
  115. package/dist/SmartTextarea-ZTQIW6O2.mjs +10 -0
  116. package/dist/SmartTextarea-ZTQIW6O2.mjs.map +1 -0
  117. package/dist/SuggestionTextareaWidget-22NR3JWM.mjs +215 -0
  118. package/dist/SuggestionTextareaWidget-22NR3JWM.mjs.map +1 -0
  119. package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs +226 -0
  120. package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs.map +1 -0
  121. package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs +146 -0
  122. package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map +1 -0
  123. package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs +144 -0
  124. package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map +1 -0
  125. package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs +273 -0
  126. package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs.map +1 -0
  127. package/dist/UrologyExaminationWidget-QDTD3FJX.mjs +271 -0
  128. package/dist/UrologyExaminationWidget-QDTD3FJX.mjs.map +1 -0
  129. package/dist/UrologyPathwayWidget-QTFKUIM7.mjs +153 -0
  130. package/dist/UrologyPathwayWidget-QTFKUIM7.mjs.map +1 -0
  131. package/dist/UrologyPathwayWidget-TXZQNGP4.cjs +155 -0
  132. package/dist/UrologyPathwayWidget-TXZQNGP4.cjs.map +1 -0
  133. package/dist/UrologySmartHistoryWidget-53NATEO3.cjs +471 -0
  134. package/dist/UrologySmartHistoryWidget-53NATEO3.cjs.map +1 -0
  135. package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs +469 -0
  136. package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs.map +1 -0
  137. package/dist/VitalsWidget-BRFUKGNO.mjs +187 -0
  138. package/dist/VitalsWidget-BRFUKGNO.mjs.map +1 -0
  139. package/dist/VitalsWidget-PDCYXNBM.cjs +208 -0
  140. package/dist/VitalsWidget-PDCYXNBM.cjs.map +1 -0
  141. package/dist/chunk-3KRDT7TX.mjs +137 -0
  142. package/dist/chunk-3KRDT7TX.mjs.map +1 -0
  143. package/dist/chunk-4BAKQIPJ.mjs +27 -0
  144. package/dist/chunk-4BAKQIPJ.mjs.map +1 -0
  145. package/dist/chunk-4KSZUIJE.cjs +143 -0
  146. package/dist/chunk-4KSZUIJE.cjs.map +1 -0
  147. package/dist/chunk-4PMNVBJD.mjs +121 -0
  148. package/dist/chunk-4PMNVBJD.mjs.map +1 -0
  149. package/dist/chunk-5E3APMY6.cjs +54 -0
  150. package/dist/chunk-5E3APMY6.cjs.map +1 -0
  151. package/dist/chunk-5I2RC47Y.mjs +75 -0
  152. package/dist/chunk-5I2RC47Y.mjs.map +1 -0
  153. package/dist/chunk-6YX37XBM.cjs +32 -0
  154. package/dist/chunk-6YX37XBM.cjs.map +1 -0
  155. package/dist/chunk-7L2JOWGA.mjs +30 -0
  156. package/dist/chunk-7L2JOWGA.mjs.map +1 -0
  157. package/dist/chunk-AIZ3XYEZ.cjs +551 -0
  158. package/dist/chunk-AIZ3XYEZ.cjs.map +1 -0
  159. package/dist/chunk-AZHTIUOL.mjs +116 -0
  160. package/dist/chunk-AZHTIUOL.mjs.map +1 -0
  161. package/dist/chunk-AZSAPO2V.cjs +174 -0
  162. package/dist/chunk-AZSAPO2V.cjs.map +1 -0
  163. package/dist/chunk-B3GBIAHZ.mjs +285 -0
  164. package/dist/chunk-B3GBIAHZ.mjs.map +1 -0
  165. package/dist/chunk-BMNY7F6H.mjs +148 -0
  166. package/dist/chunk-BMNY7F6H.mjs.map +1 -0
  167. package/dist/chunk-BOBX45NY.cjs +77 -0
  168. package/dist/chunk-BOBX45NY.cjs.map +1 -0
  169. package/dist/chunk-BU4ZEAAP.mjs +102 -0
  170. package/dist/chunk-BU4ZEAAP.mjs.map +1 -0
  171. package/dist/chunk-DZYV47QC.mjs +54 -0
  172. package/dist/chunk-DZYV47QC.mjs.map +1 -0
  173. package/dist/chunk-E7WUDHSA.cjs +127 -0
  174. package/dist/chunk-E7WUDHSA.cjs.map +1 -0
  175. package/dist/chunk-FHHISVCH.cjs +13 -0
  176. package/dist/chunk-FHHISVCH.cjs.map +1 -0
  177. package/dist/chunk-GNZWSVTB.mjs +29 -0
  178. package/dist/chunk-GNZWSVTB.mjs.map +1 -0
  179. package/dist/chunk-GPU5P3FB.cjs +236 -0
  180. package/dist/chunk-GPU5P3FB.cjs.map +1 -0
  181. package/dist/chunk-GXXWMHAA.mjs +49 -0
  182. package/dist/chunk-GXXWMHAA.mjs.map +1 -0
  183. package/dist/chunk-GZPCYSJK.mjs +104 -0
  184. package/dist/chunk-GZPCYSJK.mjs.map +1 -0
  185. package/dist/chunk-HEFZA2AH.mjs +22 -0
  186. package/dist/chunk-HEFZA2AH.mjs.map +1 -0
  187. package/dist/chunk-I4AV6BQF.mjs +10 -0
  188. package/dist/chunk-I4AV6BQF.mjs.map +1 -0
  189. package/dist/chunk-I7TJVWYV.cjs +73 -0
  190. package/dist/chunk-I7TJVWYV.cjs.map +1 -0
  191. package/dist/chunk-IFMQKLNW.mjs +39 -0
  192. package/dist/chunk-IFMQKLNW.mjs.map +1 -0
  193. package/dist/chunk-IFSKLIS2.cjs +12 -0
  194. package/dist/chunk-IFSKLIS2.cjs.map +1 -0
  195. package/dist/chunk-IKAKE7TR.mjs +527 -0
  196. package/dist/chunk-IKAKE7TR.mjs.map +1 -0
  197. package/dist/chunk-JE6VXRWW.cjs +86 -0
  198. package/dist/chunk-JE6VXRWW.cjs.map +1 -0
  199. package/dist/chunk-JMGUUFOJ.cjs +45 -0
  200. package/dist/chunk-JMGUUFOJ.cjs.map +1 -0
  201. package/dist/chunk-KJA5BLGX.cjs +31 -0
  202. package/dist/chunk-KJA5BLGX.cjs.map +1 -0
  203. package/dist/chunk-KMJOTMUQ.cjs +109 -0
  204. package/dist/chunk-KMJOTMUQ.cjs.map +1 -0
  205. package/dist/chunk-L4CIIT4U.cjs +388 -0
  206. package/dist/chunk-L4CIIT4U.cjs.map +1 -0
  207. package/dist/chunk-LBWB7MYU.cjs +287 -0
  208. package/dist/chunk-LBWB7MYU.cjs.map +1 -0
  209. package/dist/chunk-LGGOBIEA.mjs +61 -0
  210. package/dist/chunk-LGGOBIEA.mjs.map +1 -0
  211. package/dist/chunk-LQYWMYEC.mjs +28 -0
  212. package/dist/chunk-LQYWMYEC.mjs.map +1 -0
  213. package/dist/chunk-MQ2JV7HL.cjs +140 -0
  214. package/dist/chunk-MQ2JV7HL.cjs.map +1 -0
  215. package/dist/chunk-N4L76SHJ.cjs +65 -0
  216. package/dist/chunk-N4L76SHJ.cjs.map +1 -0
  217. package/dist/chunk-O3VQBPEW.cjs +72 -0
  218. package/dist/chunk-O3VQBPEW.cjs.map +1 -0
  219. package/dist/chunk-P62377LB.cjs +27 -0
  220. package/dist/chunk-P62377LB.cjs.map +1 -0
  221. package/dist/chunk-PHADAQSH.cjs +49 -0
  222. package/dist/chunk-PHADAQSH.cjs.map +1 -0
  223. package/dist/chunk-PZBJYPWW.cjs +52 -0
  224. package/dist/chunk-PZBJYPWW.cjs.map +1 -0
  225. package/dist/chunk-QKJ7BQSR.cjs +538 -0
  226. package/dist/chunk-QKJ7BQSR.cjs.map +1 -0
  227. package/dist/chunk-QS6WG2XJ.cjs +56 -0
  228. package/dist/chunk-QS6WG2XJ.cjs.map +1 -0
  229. package/dist/chunk-S7EMPE2D.cjs +104 -0
  230. package/dist/chunk-S7EMPE2D.cjs.map +1 -0
  231. package/dist/chunk-SCMXLRX5.mjs +42 -0
  232. package/dist/chunk-SCMXLRX5.mjs.map +1 -0
  233. package/dist/chunk-SHQHDSA4.cjs +1959 -0
  234. package/dist/chunk-SHQHDSA4.cjs.map +1 -0
  235. package/dist/chunk-TJHG5WHX.cjs +47 -0
  236. package/dist/chunk-TJHG5WHX.cjs.map +1 -0
  237. package/dist/chunk-UGGUIXUS.cjs +41 -0
  238. package/dist/chunk-UGGUIXUS.cjs.map +1 -0
  239. package/dist/chunk-ULMK3TUI.mjs +69 -0
  240. package/dist/chunk-ULMK3TUI.mjs.map +1 -0
  241. package/dist/chunk-UULLSS4O.mjs +82 -0
  242. package/dist/chunk-UULLSS4O.mjs.map +1 -0
  243. package/dist/chunk-VNFBUAZD.mjs +25 -0
  244. package/dist/chunk-VNFBUAZD.mjs.map +1 -0
  245. package/dist/chunk-VPU66PI6.mjs +11 -0
  246. package/dist/chunk-VPU66PI6.mjs.map +1 -0
  247. package/dist/chunk-VZT5YNCD.mjs +228 -0
  248. package/dist/chunk-VZT5YNCD.mjs.map +1 -0
  249. package/dist/chunk-WYVXXEZI.mjs +46 -0
  250. package/dist/chunk-WYVXXEZI.mjs.map +1 -0
  251. package/dist/chunk-XDUVO3IZ.mjs +547 -0
  252. package/dist/chunk-XDUVO3IZ.mjs.map +1 -0
  253. package/dist/chunk-Y7TIWH4I.mjs +25 -0
  254. package/dist/chunk-Y7TIWH4I.mjs.map +1 -0
  255. package/dist/chunk-YEFM2ERQ.cjs +143 -0
  256. package/dist/chunk-YEFM2ERQ.cjs.map +1 -0
  257. package/dist/chunk-YHNI5NIX.mjs +361 -0
  258. package/dist/chunk-YHNI5NIX.mjs.map +1 -0
  259. package/dist/chunk-ZTT5XJR7.mjs +1921 -0
  260. package/dist/chunk-ZTT5XJR7.mjs.map +1 -0
  261. package/dist/index.cjs +2091 -14564
  262. package/dist/index.cjs.map +1 -1
  263. package/dist/index.d.cts +62 -767
  264. package/dist/index.d.ts +62 -767
  265. package/dist/index.mjs +1873 -14394
  266. package/dist/index.mjs.map +1 -1
  267. package/dist/read-only-table.cjs +15 -0
  268. package/dist/read-only-table.cjs.map +1 -0
  269. package/dist/read-only-table.d.cts +10 -0
  270. package/dist/read-only-table.d.ts +10 -0
  271. package/dist/read-only-table.mjs +6 -0
  272. package/dist/read-only-table.mjs.map +1 -0
  273. package/dist/rich-text.cjs +24 -0
  274. package/dist/rich-text.cjs.map +1 -0
  275. package/dist/rich-text.d.cts +8 -0
  276. package/dist/rich-text.d.ts +8 -0
  277. package/dist/rich-text.mjs +11 -0
  278. package/dist/rich-text.mjs.map +1 -0
  279. package/dist/richTextClassName--8wkuHkW.d.cts +10 -0
  280. package/dist/richTextClassName--8wkuHkW.d.ts +10 -0
  281. package/dist/smart.cjs +23 -0
  282. package/dist/smart.cjs.map +1 -0
  283. package/dist/smart.d.cts +23 -0
  284. package/dist/smart.d.ts +23 -0
  285. package/dist/smart.mjs +10 -0
  286. package/dist/smart.mjs.map +1 -0
  287. package/dist/types-CYtJk8H9.d.cts +782 -0
  288. package/dist/types-CYtJk8H9.d.ts +782 -0
  289. package/package.json +20 -2
@@ -0,0 +1,25 @@
1
+ // src/ui/themes/textareaThemes.ts
2
+ var textareaThemes = {
3
+ "highlight-label": {
4
+ wrapperClassName: "rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]",
5
+ labelClassName: "rounded-t-md bg-[#FEE8EC] px-3 py-1 text-sm shrink-0 z-[1] text-slate-600",
6
+ inputClassName: "rounded-t-none rounded-b-md border-0 border-t border-[#D0D0D0] text-xs resize-none -mt-1 min-w-0 bg-white text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50"
7
+ }
8
+ };
9
+
10
+ // src/ui/themes/index.ts
11
+ var themeRegistries = {
12
+ textarea: textareaThemes,
13
+ text: textareaThemes
14
+ // same themes can apply to single-line text if desired
15
+ };
16
+ function getThemeConfig(fieldType, themeName) {
17
+ if (!themeName) return void 0;
18
+ const registry = themeRegistries[fieldType];
19
+ if (!registry) return void 0;
20
+ return registry[themeName];
21
+ }
22
+
23
+ export { getThemeConfig };
24
+ //# sourceMappingURL=chunk-Y7TIWH4I.mjs.map
25
+ //# sourceMappingURL=chunk-Y7TIWH4I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/themes/textareaThemes.ts","../src/ui/themes/index.ts"],"names":[],"mappings":";AAQO,IAAM,cAAA,GAAuD;AAAA,EAClE,iBAAA,EAAmB;AAAA,IACjB,gBAAA,EAAkB,kEAAA;AAAA,IAClB,cAAA,EACE,2EAAA;AAAA,IACF,cAAA,EACE;AAAA;AAEN,CAAA;;;ACbA,IAAM,eAAA,GAA4F;AAAA,EAChG,QAAA,EAAU,cAAA;AAAA,EACV,IAAA,EAAM;AAAA;AACR,CAAA;AAMO,SAAS,cAAA,CACd,WACA,SAAA,EACkC;AAClC,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,EAAA,MAAM,QAAA,GAAW,gBAAgB,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,OAAO,SAAS,SAAS,CAAA;AAC3B","file":"chunk-Y7TIWH4I.mjs","sourcesContent":["import type { ComponentThemeConfig } from './types';\n\n/**\n * Textarea theme: label in a colored block overlapping the textarea.\n * Label has light pink background (#FEE8EC), rounded top corners only, border;\n * label overlaps the textarea so the textarea's top border radius is hidden.\n * Textarea has white background, rounded bottom corners only, border.\n */\nexport const textareaThemes: Record<string, ComponentThemeConfig> = {\n 'highlight-label': {\n wrapperClassName: 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]',\n labelClassName:\n 'rounded-t-md bg-[#FEE8EC] px-3 py-1 text-sm shrink-0 z-[1] text-slate-600',\n inputClassName:\n 'rounded-t-none rounded-b-md border-0 border-t border-[#D0D0D0] text-xs resize-none -mt-1 min-w-0 bg-white text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50',\n },\n};\n","import type { ComponentThemeConfig, FieldTypeForTheme } from './types';\nimport { textareaThemes } from './textareaThemes';\n\nconst themeRegistries: Partial<Record<FieldTypeForTheme, Record<string, ComponentThemeConfig>>> = {\n textarea: textareaThemes,\n text: textareaThemes, // same themes can apply to single-line text if desired\n};\n\n/**\n * Returns theme config for a field type and theme name.\n * Returns undefined if theme is not set or not found (no theme applied).\n */\nexport function getThemeConfig(\n fieldType: FieldTypeForTheme,\n themeName: string | undefined\n): ComponentThemeConfig | undefined {\n if (!themeName) return undefined;\n const registry = themeRegistries[fieldType];\n if (!registry) return undefined;\n return registry[themeName];\n}\n\nexport { textareaThemes } from './textareaThemes';\nexport type { ComponentThemeConfig, FieldTypeForTheme } from './types';\n"]}
@@ -0,0 +1,143 @@
1
+ 'use strict';
2
+
3
+ var chunkTJHG5WHX_cjs = require('./chunk-TJHG5WHX.cjs');
4
+ var chunkAZSAPO2V_cjs = require('./chunk-AZSAPO2V.cjs');
5
+ var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
6
+ var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
7
+ var React = require('react');
8
+ var dateFns = require('date-fns');
9
+ var lucideReact = require('lucide-react');
10
+ var jsxRuntime = require('react/jsx-runtime');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
+
32
+ function parseTimeString(value) {
33
+ if (!value) return null;
34
+ const [h, m] = value.split(":").map((v) => Number(v));
35
+ if (Number.isNaN(h) || Number.isNaN(m) || h < 0 || h > 23 || m < 0 || m > 59) {
36
+ return null;
37
+ }
38
+ return { hours: h, minutes: m };
39
+ }
40
+ function DateTimePicker({
41
+ dateTime,
42
+ setDateTime,
43
+ className,
44
+ placeholder = "Pick date & time"
45
+ }) {
46
+ const [internalDate, setInternalDate] = React__namespace.useState(dateTime);
47
+ const [timeString, setTimeString] = React__namespace.useState(() => {
48
+ if (!dateTime) return "";
49
+ const hours = dateTime.getHours().toString().padStart(2, "0");
50
+ const minutes = dateTime.getMinutes().toString().padStart(2, "0");
51
+ return `${hours}:${minutes}`;
52
+ });
53
+ React__namespace.useEffect(() => {
54
+ setInternalDate(dateTime);
55
+ if (!dateTime) {
56
+ setTimeString("");
57
+ } else {
58
+ const hours = dateTime.getHours().toString().padStart(2, "0");
59
+ const minutes = dateTime.getMinutes().toString().padStart(2, "0");
60
+ setTimeString(`${hours}:${minutes}`);
61
+ }
62
+ }, [dateTime]);
63
+ const handleDateSelect = (date) => {
64
+ setInternalDate(date);
65
+ if (!setDateTime) return;
66
+ if (!date) {
67
+ setDateTime(void 0);
68
+ return;
69
+ }
70
+ const parsed = parseTimeString(timeString);
71
+ const next = new Date(date);
72
+ if (parsed) {
73
+ next.setHours(parsed.hours, parsed.minutes, 0, 0);
74
+ }
75
+ setDateTime(next);
76
+ };
77
+ const handleTimeChange = (e) => {
78
+ const value = e.target.value;
79
+ setTimeString(value);
80
+ if (!setDateTime) return;
81
+ const parsed = parseTimeString(value);
82
+ if (!parsed) {
83
+ return;
84
+ }
85
+ const base = internalDate ?? /* @__PURE__ */ new Date();
86
+ const next = new Date(base);
87
+ next.setHours(parsed.hours, parsed.minutes, 0, 0);
88
+ setInternalDate(next);
89
+ setDateTime(next);
90
+ };
91
+ const hasValue = !!dateTime;
92
+ return /* @__PURE__ */ jsxRuntime.jsxs(chunkAZSAPO2V_cjs.Popover, { children: [
93
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
94
+ chunkO3VQBPEW_cjs.Button,
95
+ {
96
+ variant: "outline",
97
+ className: chunkFHHISVCH_cjs.cn(
98
+ "w-[280px] justify-start text-left font-normal",
99
+ !hasValue && "text-muted-foreground",
100
+ className
101
+ ),
102
+ children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "mr-2 h-4 w-4" }),
104
+ hasValue ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
105
+ dateFns.format(dateTime, "PPP"),
106
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "\u2022" }),
107
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1", children: [
108
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "h-3 w-3" }),
109
+ dateFns.format(dateTime, "HH:mm")
110
+ ] })
111
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: placeholder })
112
+ ]
113
+ }
114
+ ) }),
115
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverContent, { className: "w-auto p-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col md:flex-row", children: [
116
+ /* @__PURE__ */ jsxRuntime.jsx(
117
+ chunkAZSAPO2V_cjs.Calendar,
118
+ {
119
+ mode: "single",
120
+ selected: internalDate,
121
+ onSelect: handleDateSelect,
122
+ initialFocus: true
123
+ }
124
+ ),
125
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t md:border-t-0 md:border-l p-3 flex flex-col gap-2 min-w-[220px]", children: [
126
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-medium text-muted-foreground", children: "Time (24h)" }),
127
+ /* @__PURE__ */ jsxRuntime.jsx(
128
+ chunkTJHG5WHX_cjs.Input,
129
+ {
130
+ type: "time",
131
+ value: timeString,
132
+ onChange: handleTimeChange,
133
+ className: "w-full"
134
+ }
135
+ )
136
+ ] })
137
+ ] }) })
138
+ ] });
139
+ }
140
+
141
+ exports.DateTimePicker = DateTimePicker;
142
+ //# sourceMappingURL=chunk-YEFM2ERQ.cjs.map
143
+ //# sourceMappingURL=chunk-YEFM2ERQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/shadcn/datetime-picker.tsx"],"names":["React","Popover","jsx","PopoverTrigger","jsxs","Button","cn","CalendarIcon","format","Clock","PopoverContent","Calendar","Input"],"mappings":"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","file":"chunk-YEFM2ERQ.cjs","sourcesContent":["import * as React from \"react\"\nimport { format } from \"date-fns\"\nimport { Calendar as CalendarIcon, Clock } from \"lucide-react\"\n\nimport { cn } from \"../../core/utils\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\nimport { Input } from \"./input\"\n\nexport interface DateTimePickerProps {\n /**\n * The current value as a Date object.\n */\n dateTime?: Date\n /**\n * Setter for the value. Use undefined to clear.\n */\n setDateTime?: (value: Date | undefined) => void\n className?: string\n placeholder?: string\n}\n\nfunction parseTimeString(value: string): { hours: number; minutes: number } | null {\n if (!value) return null\n const [h, m] = value.split(\":\").map((v) => Number(v))\n if (\n Number.isNaN(h) ||\n Number.isNaN(m) ||\n h < 0 ||\n h > 23 ||\n m < 0 ||\n m > 59\n ) {\n return null\n }\n return { hours: h, minutes: m }\n}\n\nexport function DateTimePicker({\n dateTime,\n setDateTime,\n className,\n placeholder = \"Pick date & time\",\n}: DateTimePickerProps) {\n const [internalDate, setInternalDate] = React.useState<Date | undefined>(dateTime)\n const [timeString, setTimeString] = React.useState<string>(() => {\n if (!dateTime) return \"\"\n const hours = dateTime.getHours().toString().padStart(2, \"0\")\n const minutes = dateTime.getMinutes().toString().padStart(2, \"0\")\n return `${hours}:${minutes}`\n })\n\n React.useEffect(() => {\n setInternalDate(dateTime)\n if (!dateTime) {\n setTimeString(\"\")\n } else {\n const hours = dateTime.getHours().toString().padStart(2, \"0\")\n const minutes = dateTime.getMinutes().toString().padStart(2, \"0\")\n setTimeString(`${hours}:${minutes}`)\n }\n }, [dateTime])\n\n const handleDateSelect = (date: Date | undefined) => {\n setInternalDate(date)\n if (!setDateTime) return\n if (!date) {\n setDateTime(undefined)\n return\n }\n\n const parsed = parseTimeString(timeString)\n const next = new Date(date)\n if (parsed) {\n next.setHours(parsed.hours, parsed.minutes, 0, 0)\n }\n setDateTime(next)\n }\n\n const handleTimeChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const value = e.target.value\n setTimeString(value)\n if (!setDateTime) return\n\n const parsed = parseTimeString(value)\n if (!parsed) {\n // Don't propagate invalid time, just keep local string\n return\n }\n\n const base = internalDate ?? new Date()\n const next = new Date(base)\n next.setHours(parsed.hours, parsed.minutes, 0, 0)\n setInternalDate(next)\n setDateTime(next)\n }\n\n const hasValue = !!dateTime\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={\"outline\"}\n className={cn(\n \"w-[280px] justify-start text-left font-normal\",\n !hasValue && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {hasValue ? (\n <span className=\"flex items-center gap-1\">\n {format(dateTime as Date, \"PPP\")}\n <span className=\"text-muted-foreground\">•</span>\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {format(dateTime as Date, \"HH:mm\")}\n </span>\n </span>\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\">\n <div className=\"flex flex-col md:flex-row\">\n <Calendar\n mode=\"single\"\n selected={internalDate}\n onSelect={handleDateSelect}\n initialFocus\n />\n <div className=\"border-t md:border-t-0 md:border-l p-3 flex flex-col gap-2 min-w-[220px]\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Time (24h)\n </label>\n <Input\n type=\"time\"\n value={timeString}\n onChange={handleTimeChange}\n className=\"w-full\"\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n"]}
@@ -0,0 +1,361 @@
1
+ import { VoiceMicButton } from './chunk-5I2RC47Y.mjs';
2
+ import { isLabelVisible, FieldRequiredIndicator, fieldLabelClass, fieldControlClass, fieldErrorClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
3
+ import { useForm } from './chunk-7L2JOWGA.mjs';
4
+ import { Button } from './chunk-GXXWMHAA.mjs';
5
+ import { useField, useFormStore } from './chunk-ZTT5XJR7.mjs';
6
+ import { Label } from './chunk-HEFZA2AH.mjs';
7
+ import { cn } from './chunk-VPU66PI6.mjs';
8
+ import * as React from 'react';
9
+ import { useMemo, useEffect, useReducer } from 'react';
10
+ import { useEditor, EditorContent } from '@tiptap/react';
11
+ import StarterKit from '@tiptap/starter-kit';
12
+ import Placeholder from '@tiptap/extension-placeholder';
13
+ import Underline from '@tiptap/extension-underline';
14
+ import { TableRow, TableHeader, TableCell, Table } from '@tiptap/extension-table';
15
+ import { Undo, Redo, Bold, Italic, Underline as Underline$1, Strikethrough, List, ListOrdered, Table as Table$1, Rows2, Columns2, TableRowsSplit, TableColumnsSplit, Trash2 } from 'lucide-react';
16
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
17
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
18
+
19
+ var Separator = React.forwardRef(
20
+ ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
21
+ SeparatorPrimitive.Root,
22
+ {
23
+ ref,
24
+ decorative,
25
+ orientation,
26
+ className: cn(
27
+ "shrink-0 bg-border",
28
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
29
+ className
30
+ ),
31
+ ...props
32
+ }
33
+ )
34
+ );
35
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
36
+ function isEmptyHtml(html) {
37
+ const t = html.trim();
38
+ return t === "" || t === "<p></p>" || t === "<p><br></p>" || t === '<p><br class="ProseMirror-trailingBreak"></p>';
39
+ }
40
+ function buildRichTextExtensions(placeholder, tables) {
41
+ const base = [
42
+ StarterKit.configure({
43
+ // Disable headings entirely so the UI/content can't introduce H2/H3.
44
+ heading: false,
45
+ bulletList: {
46
+ HTMLAttributes: {
47
+ class: "list-disc pl-6 my-2"
48
+ }
49
+ },
50
+ orderedList: {
51
+ HTMLAttributes: {
52
+ class: "list-decimal pl-6 my-2"
53
+ }
54
+ },
55
+ listItem: {
56
+ HTMLAttributes: {
57
+ class: "my-1"
58
+ }
59
+ }
60
+ }),
61
+ Underline,
62
+ Placeholder.configure({
63
+ placeholder
64
+ })
65
+ ];
66
+ if (!tables) return base;
67
+ return [
68
+ ...base,
69
+ Table.configure({
70
+ resizable: true,
71
+ /** Wider hit zone along column borders (default 5px). */
72
+ handleWidth: 8,
73
+ cellMinWidth: 50
74
+ }),
75
+ TableRow,
76
+ TableHeader,
77
+ TableCell
78
+ ];
79
+ }
80
+ function RichTextToolbar({
81
+ editor,
82
+ disabled,
83
+ tablesEnabled
84
+ }) {
85
+ const [, rerender] = useReducer((n) => n + 1, 0);
86
+ useEffect(() => {
87
+ if (!editor) return;
88
+ const handler = () => rerender();
89
+ editor.on("selectionUpdate", handler);
90
+ editor.on("transaction", handler);
91
+ return () => {
92
+ editor.off("selectionUpdate", handler);
93
+ editor.off("transaction", handler);
94
+ };
95
+ }, [editor]);
96
+ if (!editor) {
97
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]" });
98
+ }
99
+ const fmtBtn = (active, onClick, icon, title) => /* @__PURE__ */ jsx(
100
+ Button,
101
+ {
102
+ type: "button",
103
+ variant: active ? "secondary" : "outline",
104
+ size: "icon",
105
+ className: "h-8 w-8 shrink-0",
106
+ disabled,
107
+ title,
108
+ onClick: () => {
109
+ if (!disabled) onClick();
110
+ },
111
+ children: icon
112
+ }
113
+ );
114
+ const inTable = tablesEnabled && editor.isActive("table");
115
+ return /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ className: "flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5",
119
+ role: "toolbar",
120
+ "aria-label": "Rich text formatting",
121
+ children: [
122
+ fmtBtn(
123
+ editor.isActive("bold"),
124
+ () => editor.chain().focus().toggleBold().run(),
125
+ /* @__PURE__ */ jsx(Bold, { className: "h-4 w-4" }),
126
+ "Bold"
127
+ ),
128
+ fmtBtn(
129
+ editor.isActive("italic"),
130
+ () => editor.chain().focus().toggleItalic().run(),
131
+ /* @__PURE__ */ jsx(Italic, { className: "h-4 w-4" }),
132
+ "Italic"
133
+ ),
134
+ fmtBtn(
135
+ editor.isActive("underline"),
136
+ () => editor.chain().focus().toggleUnderline().run(),
137
+ /* @__PURE__ */ jsx(Underline$1, { className: "h-4 w-4" }),
138
+ "Underline"
139
+ ),
140
+ fmtBtn(
141
+ editor.isActive("strike"),
142
+ () => editor.chain().focus().toggleStrike().run(),
143
+ /* @__PURE__ */ jsx(Strikethrough, { className: "h-4 w-4" }),
144
+ "Strikethrough"
145
+ ),
146
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-0.5 h-6" }),
147
+ fmtBtn(
148
+ editor.isActive("bulletList"),
149
+ () => editor.chain().focus().toggleBulletList().run(),
150
+ /* @__PURE__ */ jsx(List, { className: "h-4 w-4" }),
151
+ "Bullet list"
152
+ ),
153
+ fmtBtn(
154
+ editor.isActive("orderedList"),
155
+ () => editor.chain().focus().toggleOrderedList().run(),
156
+ /* @__PURE__ */ jsx(ListOrdered, { className: "h-4 w-4" }),
157
+ "Numbered list"
158
+ ),
159
+ tablesEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
160
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-0.5 h-6" }),
161
+ !inTable ? fmtBtn(
162
+ false,
163
+ () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),
164
+ /* @__PURE__ */ jsx(Table$1, { className: "h-4 w-4" }),
165
+ "Insert table"
166
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ fmtBtn(
168
+ false,
169
+ () => editor.chain().focus().addRowAfter().run(),
170
+ /* @__PURE__ */ jsx(Rows2, { className: "h-4 w-4" }),
171
+ "Add row below"
172
+ ),
173
+ fmtBtn(
174
+ false,
175
+ () => editor.chain().focus().addColumnAfter().run(),
176
+ /* @__PURE__ */ jsx(Columns2, { className: "h-4 w-4" }),
177
+ "Add column right"
178
+ ),
179
+ fmtBtn(
180
+ false,
181
+ () => editor.chain().focus().deleteRow().run(),
182
+ /* @__PURE__ */ jsx(TableRowsSplit, { className: "h-4 w-4" }),
183
+ "Delete row"
184
+ ),
185
+ fmtBtn(
186
+ false,
187
+ () => editor.chain().focus().deleteColumn().run(),
188
+ /* @__PURE__ */ jsx(TableColumnsSplit, { className: "h-4 w-4" }),
189
+ "Delete column"
190
+ ),
191
+ fmtBtn(
192
+ false,
193
+ () => editor.chain().focus().deleteTable().run(),
194
+ /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4" }),
195
+ "Delete table"
196
+ )
197
+ ] })
198
+ ] }),
199
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-0.5 h-6" }),
200
+ /* @__PURE__ */ jsx(
201
+ Button,
202
+ {
203
+ type: "button",
204
+ variant: "outline",
205
+ size: "icon",
206
+ className: "h-8 w-8 shrink-0",
207
+ disabled: disabled || !editor.can().undo(),
208
+ title: "Undo",
209
+ onClick: () => editor.chain().focus().undo().run(),
210
+ children: /* @__PURE__ */ jsx(Undo, { className: "h-4 w-4" })
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsx(
214
+ Button,
215
+ {
216
+ type: "button",
217
+ variant: "outline",
218
+ size: "icon",
219
+ className: "h-8 w-8 shrink-0",
220
+ disabled: disabled || !editor.can().redo(),
221
+ title: "Redo",
222
+ onClick: () => editor.chain().focus().redo().run(),
223
+ children: /* @__PURE__ */ jsx(Redo, { className: "h-4 w-4" })
224
+ }
225
+ )
226
+ ]
227
+ }
228
+ );
229
+ }
230
+ var RichTextWidget = ({ fieldId }) => {
231
+ const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);
232
+ const { state } = useForm();
233
+ const store = useFormStore();
234
+ const hasVoice = !!(fieldDef?.voice && store.getVoice());
235
+ const showError = !!error && (touched || state.submitAttempted);
236
+ const def = fieldDef;
237
+ const placeholder = def?.placeholder ?? "Start typing\u2026";
238
+ const minHeight = def?.minHeight ?? 160;
239
+ const tablesEnabled = !!def?.tables;
240
+ const extensions = useMemo(
241
+ () => buildRichTextExtensions(placeholder, tablesEnabled),
242
+ [placeholder, tablesEnabled]
243
+ );
244
+ const stringValue = typeof value === "string" ? value : "";
245
+ const editor = useEditor(
246
+ {
247
+ extensions,
248
+ content: stringValue || "",
249
+ editable: !disabled,
250
+ immediatelyRender: false,
251
+ onUpdate: ({ editor: ed }) => {
252
+ const html = ed.getHTML();
253
+ setValue(isEmptyHtml(html) ? "" : html);
254
+ },
255
+ onBlur: () => setTouched(),
256
+ editorProps: {
257
+ attributes: {
258
+ id: fieldId,
259
+ class: "tiptap focus:outline-none",
260
+ style: `min-height: ${minHeight}px`
261
+ }
262
+ }
263
+ },
264
+ [extensions, fieldId]
265
+ );
266
+ useEffect(() => {
267
+ if (!editor || editor.isDestroyed) return;
268
+ editor.setEditable(!disabled);
269
+ }, [editor, disabled]);
270
+ useEffect(() => {
271
+ if (!editor || editor.isDestroyed) return;
272
+ const el = editor.view.dom;
273
+ el.style.minHeight = `${minHeight}px`;
274
+ }, [editor, minHeight]);
275
+ useEffect(() => {
276
+ if (!editor || editor.isDestroyed) return;
277
+ const el = editor.view.dom;
278
+ const handler = (e) => {
279
+ const { text } = e.detail;
280
+ if (!text) return;
281
+ const currentText = editor.getText();
282
+ const prefix = currentText.length > 0 && !/\s$/.test(currentText) ? " " : "";
283
+ editor.chain().focus().insertContent(prefix + text).run();
284
+ };
285
+ el.addEventListener("insertTranscript", handler);
286
+ return () => el.removeEventListener("insertTranscript", handler);
287
+ }, [editor]);
288
+ useEffect(() => {
289
+ if (!editor || editor.isDestroyed) return;
290
+ const fromForm = stringValue;
291
+ const fromEditor = editor.getHTML();
292
+ if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;
293
+ if (fromForm && fromForm !== fromEditor) {
294
+ editor.commands.setContent(fromForm, { emitUpdate: false });
295
+ }
296
+ if (!fromForm && !isEmptyHtml(fromEditor)) {
297
+ editor.commands.setContent("", { emitUpdate: false });
298
+ }
299
+ }, [stringValue, editor]);
300
+ if (!fieldDef) return null;
301
+ const showLabel = isLabelVisible(fieldDef);
302
+ const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
303
+ fieldDef.label,
304
+ " ",
305
+ /* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef })
306
+ ] });
307
+ const labelEl = /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(fieldDef), children: labelContent });
308
+ return /* @__PURE__ */ jsxs("div", { className: fieldWrapperClass(fieldDef, "space-y-2"), children: [
309
+ hasVoice ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
310
+ showLabel ? labelEl : null,
311
+ /* @__PURE__ */ jsx(VoiceMicButton, { fieldId, onTranscriptReady: setValue })
312
+ ] }) : showLabel ? labelEl : null,
313
+ /* @__PURE__ */ jsxs(
314
+ "div",
315
+ {
316
+ className: fieldControlClass(
317
+ fieldDef,
318
+ cn(
319
+ "rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden",
320
+ showError && "border-red-500",
321
+ disabled && "opacity-60"
322
+ )
323
+ ),
324
+ children: [
325
+ /* @__PURE__ */ jsx(
326
+ RichTextToolbar,
327
+ {
328
+ editor,
329
+ disabled,
330
+ tablesEnabled
331
+ }
332
+ ),
333
+ /* @__PURE__ */ jsx(
334
+ "div",
335
+ {
336
+ className: cn(
337
+ "px-3 py-2",
338
+ "[&_.ProseMirror]:outline-none",
339
+ "[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2",
340
+ "[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2",
341
+ "[&_.ProseMirror_li]:list-item",
342
+ "[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2",
343
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground",
344
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]",
345
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left",
346
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none",
347
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0"
348
+ ),
349
+ children: /* @__PURE__ */ jsx(EditorContent, { editor })
350
+ }
351
+ )
352
+ ]
353
+ }
354
+ ),
355
+ showError && /* @__PURE__ */ jsx("p", { className: fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
356
+ ] });
357
+ };
358
+
359
+ export { RichTextWidget };
360
+ //# sourceMappingURL=chunk-YHNI5NIX.mjs.map
361
+ //# sourceMappingURL=chunk-YHNI5NIX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["jsx","UnderlineIcon","TableIcon"],"mappings":"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","file":"chunk-YHNI5NIX.mjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}