@mieweb/ui 0.10.0-dev.14 → 0.10.0-dev.16

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 (215) hide show
  1. package/dist/CsvBlock-FVOKKWIY.cjs +17 -0
  2. package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-FVOKKWIY.cjs.map} +1 -1
  3. package/dist/CsvBlock-MXZO4W3N.js +8 -0
  4. package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-MXZO4W3N.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-2UGW33SQ.js +8 -0
  6. package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-2UGW33SQ.js.map} +1 -1
  7. package/dist/HtmlPreviewBlock-CZKTQUCL.cjs +17 -0
  8. package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-CZKTQUCL.cjs.map} +1 -1
  9. package/dist/MermaidBlock-NLDOJZUJ.cjs +17 -0
  10. package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-NLDOJZUJ.cjs.map} +1 -1
  11. package/dist/MermaidBlock-QXAEMOAA.js +8 -0
  12. package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-QXAEMOAA.js.map} +1 -1
  13. package/dist/SurveyBlock-GSHYZMTW.cjs +17 -0
  14. package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-GSHYZMTW.cjs.map} +1 -1
  15. package/dist/SurveyBlock-M5BEFZGT.js +8 -0
  16. package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-M5BEFZGT.js.map} +1 -1
  17. package/dist/brands/index.cjs +13 -13
  18. package/dist/brands/index.js +1 -1
  19. package/dist/{chunk-VNYW4C4J.cjs → chunk-2BGS7RFM.cjs} +4 -84
  20. package/dist/chunk-2BGS7RFM.cjs.map +1 -0
  21. package/dist/{chunk-TMMVIUUN.js → chunk-4IETGCMD.js} +4 -4
  22. package/dist/{chunk-TMMVIUUN.js.map → chunk-4IETGCMD.js.map} +1 -1
  23. package/dist/{chunk-76TBQDED.js → chunk-4LPGJ3ZO.js} +4 -4
  24. package/dist/{chunk-76TBQDED.js.map → chunk-4LPGJ3ZO.js.map} +1 -1
  25. package/dist/{chunk-V43ZFGCE.cjs → chunk-5FU7LVZF.cjs} +9 -9
  26. package/dist/{chunk-V43ZFGCE.cjs.map → chunk-5FU7LVZF.cjs.map} +1 -1
  27. package/dist/{chunk-6EN3IQQI.cjs → chunk-6GZKQR7P.cjs} +4 -4
  28. package/dist/{chunk-6EN3IQQI.cjs.map → chunk-6GZKQR7P.cjs.map} +1 -1
  29. package/dist/{chunk-Y5HFM7LO.js → chunk-77PNQILS.js} +3 -3
  30. package/dist/{chunk-Y5HFM7LO.js.map → chunk-77PNQILS.js.map} +1 -1
  31. package/dist/{chunk-G4D6CLBT.js → chunk-7U5QYH54.js} +3 -3
  32. package/dist/{chunk-G4D6CLBT.js.map → chunk-7U5QYH54.js.map} +1 -1
  33. package/dist/chunk-AXRRBEER.js +86 -0
  34. package/dist/chunk-AXRRBEER.js.map +1 -0
  35. package/dist/{chunk-VU6UTJRM.js → chunk-CATY3P2U.js} +3 -3
  36. package/dist/{chunk-VU6UTJRM.js.map → chunk-CATY3P2U.js.map} +1 -1
  37. package/dist/{chunk-3YFJBUX4.js → chunk-CXEKSA7I.js} +3 -3
  38. package/dist/{chunk-3YFJBUX4.js.map → chunk-CXEKSA7I.js.map} +1 -1
  39. package/dist/{chunk-UV2FVNWT.cjs → chunk-DF7K6DOJ.cjs} +5 -5
  40. package/dist/{chunk-UV2FVNWT.cjs.map → chunk-DF7K6DOJ.cjs.map} +1 -1
  41. package/dist/{chunk-TVTIGV7Q.js → chunk-DXCATYEO.js} +4 -4
  42. package/dist/{chunk-TVTIGV7Q.js.map → chunk-DXCATYEO.js.map} +1 -1
  43. package/dist/{chunk-5MCBWTIF.cjs → chunk-E2B5BLAF.cjs} +4 -4
  44. package/dist/{chunk-5MCBWTIF.cjs.map → chunk-E2B5BLAF.cjs.map} +1 -1
  45. package/dist/{chunk-GD7EBGC4.cjs → chunk-EQXFDPXV.cjs} +14 -14
  46. package/dist/{chunk-GD7EBGC4.cjs.map → chunk-EQXFDPXV.cjs.map} +1 -1
  47. package/dist/{chunk-ENKFJJZX.js → chunk-ETCHEURD.js} +4 -4
  48. package/dist/{chunk-ENKFJJZX.js.map → chunk-ETCHEURD.js.map} +1 -1
  49. package/dist/{chunk-DEDN5HAG.js → chunk-FDP6VS5G.js} +3 -3
  50. package/dist/{chunk-DEDN5HAG.js.map → chunk-FDP6VS5G.js.map} +1 -1
  51. package/dist/{chunk-WNZAYBVB.cjs → chunk-GRV4MOEO.cjs} +26 -26
  52. package/dist/{chunk-WNZAYBVB.cjs.map → chunk-GRV4MOEO.cjs.map} +1 -1
  53. package/dist/{chunk-4A3W4TQF.js → chunk-IBCCFWD4.js} +28 -3
  54. package/dist/chunk-IBCCFWD4.js.map +1 -0
  55. package/dist/{chunk-G3JX3UAU.cjs → chunk-IUQMOBFB.cjs} +5 -5
  56. package/dist/{chunk-G3JX3UAU.cjs.map → chunk-IUQMOBFB.cjs.map} +1 -1
  57. package/dist/{chunk-ZPSJ2UV6.cjs → chunk-JX4UZEBZ.cjs} +8 -8
  58. package/dist/{chunk-ZPSJ2UV6.cjs.map → chunk-JX4UZEBZ.cjs.map} +1 -1
  59. package/dist/{chunk-7ZXAQTV4.cjs → chunk-KM5OQQL5.cjs} +8 -8
  60. package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-KM5OQQL5.cjs.map} +1 -1
  61. package/dist/{chunk-AWJBOND5.js → chunk-LENW5YOC.js} +60 -3
  62. package/dist/chunk-LENW5YOC.js.map +1 -0
  63. package/dist/{chunk-KQUI4BGS.cjs → chunk-LGIQVSAE.cjs} +17 -17
  64. package/dist/{chunk-KQUI4BGS.cjs.map → chunk-LGIQVSAE.cjs.map} +1 -1
  65. package/dist/{chunk-FXO5ARBB.cjs → chunk-M5NYHH3Z.cjs} +4 -4
  66. package/dist/{chunk-FXO5ARBB.cjs.map → chunk-M5NYHH3Z.cjs.map} +1 -1
  67. package/dist/{chunk-URAQIF67.cjs → chunk-MB5KIIT4.cjs} +6 -6
  68. package/dist/{chunk-URAQIF67.cjs.map → chunk-MB5KIIT4.cjs.map} +1 -1
  69. package/dist/{chunk-ASSDGS4F.cjs → chunk-NEFBVO5W.cjs} +28 -3
  70. package/dist/chunk-NEFBVO5W.cjs.map +1 -0
  71. package/dist/{chunk-XZNN3S3S.cjs → chunk-O5A4GTTG.cjs} +4 -4
  72. package/dist/{chunk-XZNN3S3S.cjs.map → chunk-O5A4GTTG.cjs.map} +1 -1
  73. package/dist/{chunk-DZ5HFLRC.js → chunk-OWLWABAS.js} +3 -3
  74. package/dist/{chunk-DZ5HFLRC.js.map → chunk-OWLWABAS.js.map} +1 -1
  75. package/dist/{chunk-IX6KFB3K.cjs → chunk-OZ2LP2VQ.cjs} +9 -9
  76. package/dist/{chunk-IX6KFB3K.cjs.map → chunk-OZ2LP2VQ.cjs.map} +1 -1
  77. package/dist/{chunk-YQ2NQV5C.cjs → chunk-PEUCQ2YP.cjs} +73 -15
  78. package/dist/chunk-PEUCQ2YP.cjs.map +1 -0
  79. package/dist/{chunk-N6IY47YA.cjs → chunk-PLDJU623.cjs} +8 -8
  80. package/dist/{chunk-N6IY47YA.cjs.map → chunk-PLDJU623.cjs.map} +1 -1
  81. package/dist/{chunk-4CXGT3P7.js → chunk-QR7EG7YH.js} +73 -15
  82. package/dist/chunk-QR7EG7YH.js.map +1 -0
  83. package/dist/{chunk-WGPLUCBD.js → chunk-R47H3Y7J.js} +3 -3
  84. package/dist/{chunk-WGPLUCBD.js.map → chunk-R47H3Y7J.js.map} +1 -1
  85. package/dist/{chunk-OE5CKRUC.js → chunk-R5AFQWR5.js} +3 -3
  86. package/dist/{chunk-OE5CKRUC.js.map → chunk-R5AFQWR5.js.map} +1 -1
  87. package/dist/{chunk-2IZLKPUW.js → chunk-T7U5HHGK.js} +3 -3
  88. package/dist/{chunk-2IZLKPUW.js.map → chunk-T7U5HHGK.js.map} +1 -1
  89. package/dist/{chunk-OCSCBB52.cjs → chunk-TVSGJT6G.cjs} +6 -6
  90. package/dist/{chunk-OCSCBB52.cjs.map → chunk-TVSGJT6G.cjs.map} +1 -1
  91. package/dist/{chunk-3QEVGSFG.cjs → chunk-UKUKBUME.cjs} +5 -5
  92. package/dist/{chunk-3QEVGSFG.cjs.map → chunk-UKUKBUME.cjs.map} +1 -1
  93. package/dist/{chunk-GOALNQZ2.js → chunk-UV4IJNSN.js} +4 -83
  94. package/dist/chunk-UV4IJNSN.js.map +1 -0
  95. package/dist/{chunk-VOKVG3ER.js → chunk-UXI33QGR.js} +3 -3
  96. package/dist/{chunk-VOKVG3ER.js.map → chunk-UXI33QGR.js.map} +1 -1
  97. package/dist/{chunk-XEAT7XJG.cjs → chunk-VLBUT2QM.cjs} +4 -4
  98. package/dist/{chunk-XEAT7XJG.cjs.map → chunk-VLBUT2QM.cjs.map} +1 -1
  99. package/dist/chunk-VNCIIXGO.js +1924 -0
  100. package/dist/chunk-VNCIIXGO.js.map +1 -0
  101. package/dist/{chunk-5GUOOLPR.cjs → chunk-VPRKE2YU.cjs} +5 -5
  102. package/dist/{chunk-5GUOOLPR.cjs.map → chunk-VPRKE2YU.cjs.map} +1 -1
  103. package/dist/{chunk-KZFBQ7GY.js → chunk-VVZALGPI.js} +3 -3
  104. package/dist/{chunk-KZFBQ7GY.js.map → chunk-VVZALGPI.js.map} +1 -1
  105. package/dist/{chunk-V7D3YGUV.js → chunk-W5TPBCBM.js} +4 -4
  106. package/dist/{chunk-V7D3YGUV.js.map → chunk-W5TPBCBM.js.map} +1 -1
  107. package/dist/{chunk-H4ZXMQQW.js → chunk-WBBOH5QF.js} +3 -3
  108. package/dist/{chunk-H4ZXMQQW.js.map → chunk-WBBOH5QF.js.map} +1 -1
  109. package/dist/{chunk-3QGS6CXD.js → chunk-WC25GQZD.js} +3 -3
  110. package/dist/{chunk-3QGS6CXD.js.map → chunk-WC25GQZD.js.map} +1 -1
  111. package/dist/{chunk-VKELAMAZ.js → chunk-WN6A4QOF.js} +3 -3
  112. package/dist/{chunk-VKELAMAZ.js.map → chunk-WN6A4QOF.js.map} +1 -1
  113. package/dist/{chunk-AR7AKDM2.cjs → chunk-X2PPZJSL.cjs} +64 -2
  114. package/dist/chunk-X2PPZJSL.cjs.map +1 -0
  115. package/dist/chunk-XFLEW7AT.cjs +88 -0
  116. package/dist/chunk-XFLEW7AT.cjs.map +1 -0
  117. package/dist/{chunk-MNILXWVY.js → chunk-XU2E7MTG.js} +7 -7
  118. package/dist/{chunk-MNILXWVY.js.map → chunk-XU2E7MTG.js.map} +1 -1
  119. package/dist/{chunk-E4IBHYJ7.cjs → chunk-YEQLSYJO.cjs} +5 -5
  120. package/dist/{chunk-E4IBHYJ7.cjs.map → chunk-YEQLSYJO.cjs.map} +1 -1
  121. package/dist/chunk-YIWJTNR5.cjs +1967 -0
  122. package/dist/chunk-YIWJTNR5.cjs.map +1 -0
  123. package/dist/components/AlertDialog/index.cjs +4 -3
  124. package/dist/components/AlertDialog/index.js +3 -2
  125. package/dist/components/Button/index.cjs +4 -3
  126. package/dist/components/Button/index.d.cts +3 -2
  127. package/dist/components/Button/index.d.ts +3 -2
  128. package/dist/components/Button/index.js +2 -1
  129. package/dist/components/CalendarView/index.cjs +5 -4
  130. package/dist/components/CalendarView/index.d.cts +1 -1
  131. package/dist/components/CalendarView/index.d.ts +1 -1
  132. package/dist/components/CalendarView/index.js +3 -2
  133. package/dist/components/CustomizableDashboard/index.cjs +10 -9
  134. package/dist/components/CustomizableDashboard/index.js +3 -2
  135. package/dist/components/FloatingWindow/index.cjs +5 -4
  136. package/dist/components/FloatingWindow/index.js +3 -2
  137. package/dist/components/GanttView/index.d.cts +1 -1
  138. package/dist/components/GanttView/index.d.ts +1 -1
  139. package/dist/components/ListView/index.cjs +5 -4
  140. package/dist/components/ListView/index.d.cts +90 -2
  141. package/dist/components/ListView/index.d.ts +90 -2
  142. package/dist/components/ListView/index.js +3 -2
  143. package/dist/components/Markdown/index.cjs +20 -19
  144. package/dist/components/Markdown/index.js +8 -7
  145. package/dist/components/MediaEditor/index.cjs +9 -8
  146. package/dist/components/MediaEditor/index.js +4 -3
  147. package/dist/components/MediaPlayer/index.cjs +6 -5
  148. package/dist/components/MediaPlayer/index.js +3 -2
  149. package/dist/components/MegaMenu/index.cjs +6 -5
  150. package/dist/components/MegaMenu/index.js +3 -2
  151. package/dist/components/RadialExplorer/index.cjs +4 -3
  152. package/dist/components/RadialExplorer/index.js +3 -2
  153. package/dist/components/RichTextEditor/index.cjs +6 -5
  154. package/dist/components/RichTextEditor/index.js +3 -2
  155. package/dist/components/SectionSpyNav/index.cjs +4 -3
  156. package/dist/components/SectionSpyNav/index.js +3 -2
  157. package/dist/components/SuperChat/index.cjs +3 -3
  158. package/dist/components/SuperChat/index.js +1 -1
  159. package/dist/components/SuperChat/plugins/index.cjs +3 -3
  160. package/dist/components/SuperChat/plugins/index.js +2 -2
  161. package/dist/components/ViewSet/index.cjs +6 -5
  162. package/dist/components/ViewSet/index.d.cts +101 -1
  163. package/dist/components/ViewSet/index.d.ts +101 -1
  164. package/dist/components/ViewSet/index.js +5 -4
  165. package/dist/components/ViewSwitcher/index.d.cts +57 -4
  166. package/dist/components/ViewSwitcher/index.d.ts +57 -4
  167. package/dist/datavis.cjs +3 -2
  168. package/dist/datavis.cjs.map +1 -1
  169. package/dist/datavis.js +2 -1
  170. package/dist/datavis.js.map +1 -1
  171. package/dist/esheet.cjs +7 -6
  172. package/dist/esheet.cjs.map +1 -1
  173. package/dist/esheet.js +4 -3
  174. package/dist/esheet.js.map +1 -1
  175. package/dist/hooks/index.cjs +33 -13
  176. package/dist/hooks/index.d.cts +57 -1
  177. package/dist/hooks/index.d.ts +57 -1
  178. package/dist/hooks/index.js +1 -1
  179. package/dist/index.cjs +667 -557
  180. package/dist/index.cjs.map +1 -1
  181. package/dist/index.d.cts +624 -2
  182. package/dist/index.d.ts +624 -2
  183. package/dist/index.js +45 -42
  184. package/dist/index.js.map +1 -1
  185. package/dist/styles/effects.css +33 -0
  186. package/dist/styles.css +1 -1
  187. package/dist/tailwind-preset.cjs +4 -4
  188. package/dist/tailwind-preset.js +1 -1
  189. package/dist/templates.cjs +103 -0
  190. package/dist/templates.cjs.map +1 -0
  191. package/dist/templates.d.cts +560 -0
  192. package/dist/templates.d.ts +560 -0
  193. package/dist/templates.js +10 -0
  194. package/dist/templates.js.map +1 -0
  195. package/dist/{types-DsdZvEI1.d.ts → types-C3HQe74F.d.cts} +1 -7
  196. package/dist/{types-DsdZvEI1.d.cts → types-C3HQe74F.d.ts} +1 -7
  197. package/package.json +12 -1
  198. package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
  199. package/dist/CsvBlock-UWPMTLE2.js +0 -7
  200. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
  201. package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
  202. package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
  203. package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
  204. package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
  205. package/dist/SurveyBlock-4DO62RBT.js +0 -7
  206. package/dist/chunk-4A3W4TQF.js.map +0 -1
  207. package/dist/chunk-4CXGT3P7.js.map +0 -1
  208. package/dist/chunk-AR7AKDM2.cjs.map +0 -1
  209. package/dist/chunk-ASSDGS4F.cjs.map +0 -1
  210. package/dist/chunk-AWJBOND5.js.map +0 -1
  211. package/dist/chunk-GOALNQZ2.js.map +0 -1
  212. package/dist/chunk-VNYW4C4J.cjs.map +0 -1
  213. package/dist/chunk-YQ2NQV5C.cjs.map +0 -1
  214. package/dist/index-DoYYWsNc.d.cts +0 -127
  215. package/dist/index-DoYYWsNc.d.ts +0 -127
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/HealthSurveillance/ordersGridShared.tsx","../src/components/HealthSurveillance/OrdersGrid.tsx"],"names":["React2","jsx","jsxs"],"mappings":"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","file":"datavis.js","sourcesContent":["'use client';\n\n/**\n * Shared internals for the NITRO-backed orders grids\n * (ChartOrdersGrid / EncounterOrdersGrid).\n *\n * - {@link useOrderRowsUrl} — feeds in-memory {@link OrderRow}s to\n * `DataVisNitroSource` through a short-lived object-URL carrying the\n * `{ typeInfo, data }` payload the engine expects (its `local` source type\n * is not implemented yet; same pattern as SuperChat's NITRO table plugin).\n * - {@link OrderStatusBadge} / {@link formatOrderCell} — status chips in grid\n * cells.\n * - {@link OrdersGroupPresets} — one-click \"group by\" chips driving\n * `view.setGroup()` through {@link DataVisNitroContext}.\n *\n * Row selection and mass operations are native NITRO features:\n * `features.rowSelection: 'checkbox'` + the `operations` palette.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { DataVisNitroContext } from '../DataVisNITRO';\nimport type { OrderRow, OrderRowStatus } from './orderRows';\n\n// =============================================================================\n// Column + typeInfo metadata\n// =============================================================================\n\n/** Grid columns, in display order, with control-panel display names. */\nexport const ORDER_COLUMNS: {\n field: keyof OrderRow;\n header: string;\n type: 'string' | 'date';\n}[] = [\n { field: 'status', header: 'Status', type: 'string' },\n { field: 'order', header: 'Order', type: 'string' },\n { field: 'reason', header: 'Reason', type: 'string' },\n { field: 'kind', header: 'Kind', type: 'string' },\n { field: 'date', header: 'Date', type: 'date' },\n { field: 'dueDate', header: 'Due', type: 'date' },\n { field: 'provider', header: 'Provider', type: 'string' },\n { field: 'requisitionId', header: 'Requisition', type: 'string' },\n { field: 'encounterId', header: 'Encounter', type: 'string' },\n { field: 'blockedBy', header: 'Blocked by', type: 'string' },\n];\n\n/** Fields offered in the grid's Group/Filter control panel. */\nexport const ORDER_CONTROL_FIELDS = ORDER_COLUMNS.filter(\n (c) => c.field !== 'blockedBy'\n).map((c) => ({ field: c.field, displayName: c.header, type: c.type }));\n\n// =============================================================================\n// useOrderRowsUrl\n// =============================================================================\n\n/** Serialize rows into an object-URL `{ typeInfo, data }` source. */\nexport function useOrderRowsUrl(rows: OrderRow[]): string {\n const url = React.useMemo(() => {\n const payload = {\n typeInfo: ORDER_COLUMNS.map(({ field, type }) => ({ field, type })),\n data: rows,\n };\n const blob = new Blob([JSON.stringify(payload)], {\n type: 'application/json',\n });\n return URL.createObjectURL(blob);\n }, [rows]);\n\n React.useEffect(() => () => URL.revokeObjectURL(url), [url]);\n return url;\n}\n\n// =============================================================================\n// Status badge\n// =============================================================================\n\nconst STATUS_VARIANT: Record<\n OrderRowStatus,\n { label: string; variant: 'success' | 'secondary' | 'warning' | 'default' }\n> = {\n completed: { label: 'Completed', variant: 'success' },\n pending: { label: 'Pending', variant: 'secondary' },\n available: { label: 'Available', variant: 'warning' },\n blocked: { label: 'Blocked', variant: 'default' },\n};\n\nexport function OrderStatusBadge({ status }: { status: OrderRowStatus }) {\n const meta = STATUS_VARIANT[status];\n if (!meta) return <>{status}</>;\n return <Badge variant={meta.variant}>{meta.label}</Badge>;\n}\n\n/** `formatCell` for DataVisNitroGrid — renders the status column as a badge. */\nexport function formatOrderCell(\n value: unknown,\n _row: unknown,\n column: { field: string }\n): React.ReactNode {\n if (column.field === 'status' && typeof value === 'string') {\n return <OrderStatusBadge status={value as OrderRowStatus} />;\n }\n return value as React.ReactNode;\n}\n\n// =============================================================================\n// Group presets\n// =============================================================================\n\nexport interface GroupPreset {\n key: string;\n label: string;\n /** Field to group by; undefined = clear grouping */\n field?: keyof OrderRow;\n}\n\nexport const DEFAULT_GROUP_PRESETS: GroupPreset[] = [\n { key: 'none', label: 'Flat' },\n { key: 'reason', label: 'By reason', field: 'reason' },\n { key: 'provider', label: 'By provider', field: 'provider' },\n { key: 'requisition', label: 'By requisition', field: 'requisitionId' },\n { key: 'status', label: 'By status', field: 'status' },\n { key: 'date', label: 'By date', field: 'date' },\n];\n\n/**\n * One-click group-by chips. Must render inside `DataVisNitroSource` — drives\n * the shared view via `setGroup({ fieldNames: [{ field }] })`.\n */\nexport function OrdersGroupPresets({\n presets = DEFAULT_GROUP_PRESETS,\n className,\n}: {\n presets?: GroupPreset[];\n className?: string;\n}) {\n const view = React.useContext(DataVisNitroContext);\n const [active, setActive] = React.useState('none');\n\n const apply = (preset: GroupPreset) => {\n if (!view) return;\n setActive(preset.key);\n if (preset.field) {\n view.setGroup({ fieldNames: [{ field: preset.field }] });\n } else {\n view.clearGroup();\n }\n };\n\n return (\n <div\n data-slot=\"orders-group-presets\"\n role=\"group\"\n aria-label=\"Group orders by\"\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n <span className=\"text-muted-foreground text-xs font-medium\">Group:</span>\n {presets.map((p) => (\n <Button\n key={p.key}\n type=\"button\"\n size=\"sm\"\n variant={active === p.key ? 'primary' : 'outline'}\n aria-pressed={active === p.key}\n onClick={() => apply(p)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\n/**\n * NITRO-backed orders grids.\n *\n * - {@link ChartOrdersGrid} — chart-wide: every pending and past **encounter\n * order** across all encounters, plus the actionable due-list orders. Group\n * and filter by reason (program), provider, requisition, status, kind, and\n * date — via the one-click presets or the grid's own control panel.\n * - {@link EncounterOrdersGrid} — the current encounter's orders (its pending\n * unprocessed items are the mass-operation targets) plus the due-list\n * orders available to place this visit.\n *\n * Encounter orders get bundled into **requisitions** — documents routing a\n * batch of orders to a provider/referral. The grids only emit callbacks\n * (`onOrderRows`, `onRequisition`, `onCancel`); document generation is the\n * host application's job.\n *\n * Rendering is `@mieweb/ui/datavis` (`DataVisNitroSource` + `DataVisNitroGrid`)\n * fed through an object-URL source — see ordersGridShared.tsx.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { DataVisNitroGrid, DataVisNitroSource } from '../DataVisNITRO';\nimport {\n buildChartOrderRows,\n buildEncounterOrderRows,\n type OrderRow,\n type OrderRowsOptions,\n} from './orderRows';\nimport {\n ORDER_COLUMNS,\n ORDER_CONTROL_FIELDS,\n formatOrderCell,\n useOrderRowsUrl,\n OrdersGroupPresets,\n} from './ordersGridShared';\nimport type { PatientHistory } from './history';\nimport type { ProgramsMap } from './evaluate';\n\n// =============================================================================\n// Shared props + inner grid\n// =============================================================================\n\ninterface OrdersGridBaseProps {\n history: PatientHistory;\n /** Program metadata — programs.json contents (`programs` field) */\n programs: ProgramsMap;\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Evaluation clock (defaults to today; inject for deterministic stories) */\n now?: Date;\n /** Place the selected available orders */\n onOrderRows?: (rows: OrderRow[]) => void;\n /** Bundle selected pending unprocessed orders into a requisition */\n onRequisition?: (rows: OrderRow[]) => void;\n /** Cancel selected pending unprocessed orders */\n onCancel?: (rows: OrderRow[]) => void;\n /** Grid height (CSS value) */\n height?: string;\n /** Grid title */\n title?: string;\n className?: string;\n 'data-testid'?: string;\n}\n\nfunction OrdersGridInner({\n rows,\n title,\n height = '480px',\n onOrderRows,\n onRequisition,\n onCancel,\n className,\n 'data-testid': dataTestId,\n}: {\n rows: OrderRow[];\n title: string;\n height?: string;\n onOrderRows?: (rows: OrderRow[]) => void;\n onRequisition?: (rows: OrderRow[]) => void;\n onCancel?: (rows: OrderRow[]) => void;\n className?: string;\n 'data-testid'?: string;\n}) {\n const url = useOrderRowsUrl(rows);\n\n // Mass operations over the native checkbox selection. The palette hands\n // each callback the selected rows' data (OrderRow-shaped after the\n // object-URL round trip); each operation applies only to eligible rows:\n // 'available' can be ordered, pending unprocessed (no requisition yet)\n // can be bundled into a requisition or cancelled.\n const operations = React.useMemo(() => {\n const asOrderRows = (sel: unknown[]) => sel as OrderRow[];\n const ops: {\n label: string;\n callback: (ctx: { rows: unknown[] }) => void;\n }[] = [];\n if (onOrderRows) {\n ops.push({\n label: 'Order',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'available'\n );\n if (eligible.length > 0) onOrderRows(eligible);\n },\n });\n }\n if (onRequisition) {\n ops.push({\n label: 'Create requisition',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onRequisition(eligible);\n },\n });\n }\n if (onCancel) {\n ops.push({\n label: 'Cancel',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onCancel(eligible);\n },\n });\n }\n return ops;\n }, [onOrderRows, onRequisition, onCancel]);\n\n const columns = React.useMemo(\n () =>\n ORDER_COLUMNS.map(({ field, header }) => ({\n field: field as string,\n header,\n })),\n []\n );\n\n return (\n <div\n data-slot=\"orders-grid\"\n data-testid={dataTestId}\n className={cn('flex flex-col gap-2', className)}\n >\n <DataVisNitroSource type=\"http\" url={url}>\n <OrdersGroupPresets />\n <DataVisNitroGrid\n title={title}\n height={height}\n columns={columns}\n controlFields={ORDER_CONTROL_FIELDS}\n operations={operations}\n // 'checkbox' selection ships in @mieweb/datavis > 1.1.0 (native\n // leading checkbox column + tri-state select-all header); the\n // published typings still say `boolean`, hence the cast.\n features={\n {\n rowSelection: 'checkbox',\n stickyHeaders: true,\n } as unknown as React.ComponentProps<\n typeof DataVisNitroGrid\n >['features']\n }\n formatCell={formatOrderCell}\n />\n </DataVisNitroSource>\n </div>\n );\n}\n\n// =============================================================================\n// ChartOrdersGrid\n// =============================================================================\n\nexport interface ChartOrdersGridProps extends OrdersGridBaseProps {\n /** Include not-yet-placed due-list orders as available/blocked rows */\n includeDue?: boolean;\n}\n\n/** Chart-wide order history across all encounters. */\nexport function ChartOrdersGrid({\n history,\n programs,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n includeDue,\n title = 'Orders — chart',\n ...rest\n}: ChartOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n };\n return buildChartOrderRows(history, programs, opts);\n }, [\n history,\n programs,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nChartOrdersGrid.displayName = 'ChartOrdersGrid';\n\n// =============================================================================\n// EncounterOrdersGrid\n// =============================================================================\n\nexport interface EncounterOrdersGridProps extends OrdersGridBaseProps {\n /** The current encounter (visit) ID */\n encounterId: string;\n}\n\n/** The current encounter's orders + due-list orders placeable this visit. */\nexport function EncounterOrdersGrid({\n history,\n programs,\n encounterId,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n title = 'Encounter orders',\n ...rest\n}: EncounterOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n };\n return buildEncounterOrderRows(history, programs, encounterId, opts);\n }, [\n history,\n programs,\n encounterId,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nEncounterOrdersGrid.displayName = 'EncounterOrdersGrid';\n"]}
1
+ {"version":3,"sources":["../src/components/HealthSurveillance/ordersGridShared.tsx","../src/components/HealthSurveillance/OrdersGrid.tsx"],"names":["React2","jsx","jsxs"],"mappings":"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","file":"datavis.js","sourcesContent":["'use client';\n\n/**\n * Shared internals for the NITRO-backed orders grids\n * (ChartOrdersGrid / EncounterOrdersGrid).\n *\n * - {@link useOrderRowsUrl} — feeds in-memory {@link OrderRow}s to\n * `DataVisNitroSource` through a short-lived object-URL carrying the\n * `{ typeInfo, data }` payload the engine expects (its `local` source type\n * is not implemented yet; same pattern as SuperChat's NITRO table plugin).\n * - {@link OrderStatusBadge} / {@link formatOrderCell} — status chips in grid\n * cells.\n * - {@link OrdersGroupPresets} — one-click \"group by\" chips driving\n * `view.setGroup()` through {@link DataVisNitroContext}.\n *\n * Row selection and mass operations are native NITRO features:\n * `features.rowSelection: 'checkbox'` + the `operations` palette.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { DataVisNitroContext } from '../DataVisNITRO';\nimport type { OrderRow, OrderRowStatus } from './orderRows';\n\n// =============================================================================\n// Column + typeInfo metadata\n// =============================================================================\n\n/** Grid columns, in display order, with control-panel display names. */\nexport const ORDER_COLUMNS: {\n field: keyof OrderRow;\n header: string;\n type: 'string' | 'date';\n}[] = [\n { field: 'status', header: 'Status', type: 'string' },\n { field: 'order', header: 'Order', type: 'string' },\n { field: 'reason', header: 'Reason', type: 'string' },\n { field: 'kind', header: 'Kind', type: 'string' },\n { field: 'date', header: 'Date', type: 'date' },\n { field: 'dueDate', header: 'Due', type: 'date' },\n { field: 'provider', header: 'Provider', type: 'string' },\n { field: 'requisitionId', header: 'Requisition', type: 'string' },\n { field: 'encounterId', header: 'Encounter', type: 'string' },\n { field: 'blockedBy', header: 'Blocked by', type: 'string' },\n];\n\n/** Fields offered in the grid's Group/Filter control panel. */\nexport const ORDER_CONTROL_FIELDS = ORDER_COLUMNS.filter(\n (c) => c.field !== 'blockedBy'\n).map((c) => ({ field: c.field, displayName: c.header, type: c.type }));\n\n// =============================================================================\n// useOrderRowsUrl\n// =============================================================================\n\n/** Serialize rows into an object-URL `{ typeInfo, data }` source. */\nexport function useOrderRowsUrl(rows: OrderRow[]): string {\n const url = React.useMemo(() => {\n const payload = {\n typeInfo: ORDER_COLUMNS.map(({ field, type }) => ({ field, type })),\n data: rows,\n };\n const blob = new Blob([JSON.stringify(payload)], {\n type: 'application/json',\n });\n return URL.createObjectURL(blob);\n }, [rows]);\n\n React.useEffect(() => () => URL.revokeObjectURL(url), [url]);\n return url;\n}\n\n// =============================================================================\n// Status badge\n// =============================================================================\n\nconst STATUS_VARIANT: Record<\n OrderRowStatus,\n { label: string; variant: 'success' | 'secondary' | 'warning' | 'default' }\n> = {\n completed: { label: 'Completed', variant: 'success' },\n pending: { label: 'Pending', variant: 'secondary' },\n available: { label: 'Available', variant: 'warning' },\n blocked: { label: 'Blocked', variant: 'default' },\n};\n\nexport function OrderStatusBadge({ status }: { status: OrderRowStatus }) {\n const meta = STATUS_VARIANT[status];\n if (!meta) return <>{status}</>;\n return <Badge variant={meta.variant}>{meta.label}</Badge>;\n}\n\n/** `formatCell` for DataVisNitroGrid — renders the status column as a badge. */\nexport function formatOrderCell(\n value: unknown,\n _row: unknown,\n column: { field: string }\n): React.ReactNode {\n if (column.field === 'status' && typeof value === 'string') {\n return <OrderStatusBadge status={value as OrderRowStatus} />;\n }\n return value as React.ReactNode;\n}\n\n// =============================================================================\n// Group presets\n// =============================================================================\n\nexport interface GroupPreset {\n key: string;\n label: string;\n /** Field to group by; undefined = clear grouping */\n field?: keyof OrderRow;\n}\n\nexport const DEFAULT_GROUP_PRESETS: GroupPreset[] = [\n { key: 'none', label: 'Flat' },\n { key: 'reason', label: 'By reason', field: 'reason' },\n { key: 'provider', label: 'By provider', field: 'provider' },\n { key: 'requisition', label: 'By requisition', field: 'requisitionId' },\n { key: 'status', label: 'By status', field: 'status' },\n { key: 'date', label: 'By date', field: 'date' },\n];\n\n/**\n * One-click group-by chips. Must render inside `DataVisNitroSource` — drives\n * the shared view via `setGroup({ fieldNames: [{ field }] })`.\n */\nexport function OrdersGroupPresets({\n presets = DEFAULT_GROUP_PRESETS,\n className,\n}: {\n presets?: GroupPreset[];\n className?: string;\n}) {\n const view = React.useContext(DataVisNitroContext);\n const [active, setActive] = React.useState('none');\n\n const apply = (preset: GroupPreset) => {\n if (!view) return;\n setActive(preset.key);\n if (preset.field) {\n view.setGroup({ fieldNames: [{ field: preset.field }] });\n } else {\n view.clearGroup();\n }\n };\n\n return (\n <div\n data-slot=\"orders-group-presets\"\n role=\"group\"\n aria-label=\"Group orders by\"\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n <span className=\"text-muted-foreground text-xs font-medium\">Group:</span>\n {presets.map((p) => (\n <Button\n key={p.key}\n type=\"button\"\n size=\"sm\"\n variant={active === p.key ? 'primary' : 'outline'}\n aria-pressed={active === p.key}\n onClick={() => apply(p)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\n/**\n * NITRO-backed orders grids.\n *\n * - {@link ChartOrdersGrid} — chart-wide: every pending and past **encounter\n * order** across all encounters, plus the actionable due-list orders. Group\n * and filter by reason (program), provider, requisition, status, kind, and\n * date — via the one-click presets or the grid's own control panel.\n * - {@link EncounterOrdersGrid} — the current encounter's orders (its pending\n * unprocessed items are the mass-operation targets) plus the due-list\n * orders available to place this visit.\n *\n * Encounter orders get bundled into **requisitions** — documents routing a\n * batch of orders to a provider/referral. The grids only emit callbacks\n * (`onOrderRows`, `onRequisition`, `onCancel`); document generation is the\n * host application's job.\n *\n * Rendering is `@mieweb/ui/datavis` (`DataVisNitroSource` + `DataVisNitroGrid`)\n * fed through an object-URL source — see ordersGridShared.tsx.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { DataVisNitroGrid, DataVisNitroSource } from '../DataVisNITRO';\nimport {\n buildChartOrderRows,\n buildEncounterOrderRows,\n type OrderRow,\n type OrderRowsOptions,\n} from './orderRows';\nimport {\n ORDER_COLUMNS,\n ORDER_CONTROL_FIELDS,\n formatOrderCell,\n useOrderRowsUrl,\n OrdersGroupPresets,\n} from './ordersGridShared';\nimport type { PatientHistory } from './history';\nimport type { ProgramsMap } from './evaluate';\n\n// =============================================================================\n// Shared props + inner grid\n// =============================================================================\n\ninterface OrdersGridBaseProps {\n history: PatientHistory;\n /** Program metadata — programs.json contents (`programs` field) */\n programs: ProgramsMap;\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Evaluation clock (defaults to today; inject for deterministic stories) */\n now?: Date;\n /** Place the selected available orders */\n onOrderRows?: (rows: OrderRow[]) => void;\n /** Bundle selected pending unprocessed orders into a requisition */\n onRequisition?: (rows: OrderRow[]) => void;\n /** Cancel selected pending unprocessed orders */\n onCancel?: (rows: OrderRow[]) => void;\n /** Grid height (CSS value) */\n height?: string;\n /** Grid title */\n title?: string;\n className?: string;\n 'data-testid'?: string;\n}\n\nfunction OrdersGridInner({\n rows,\n title,\n height = '480px',\n onOrderRows,\n onRequisition,\n onCancel,\n className,\n 'data-testid': dataTestId,\n}: {\n rows: OrderRow[];\n title: string;\n height?: string;\n onOrderRows?: (rows: OrderRow[]) => void;\n onRequisition?: (rows: OrderRow[]) => void;\n onCancel?: (rows: OrderRow[]) => void;\n className?: string;\n 'data-testid'?: string;\n}) {\n const url = useOrderRowsUrl(rows);\n\n // Mass operations over the native checkbox selection. The palette hands\n // each callback the selected rows' data (OrderRow-shaped after the\n // object-URL round trip); each operation applies only to eligible rows:\n // 'available' can be ordered, pending unprocessed (no requisition yet)\n // can be bundled into a requisition or cancelled.\n const operations = React.useMemo(() => {\n const asOrderRows = (sel: unknown[]) => sel as OrderRow[];\n const ops: {\n label: string;\n callback: (ctx: { rows: unknown[] }) => void;\n }[] = [];\n if (onOrderRows) {\n ops.push({\n label: 'Order',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'available'\n );\n if (eligible.length > 0) onOrderRows(eligible);\n },\n });\n }\n if (onRequisition) {\n ops.push({\n label: 'Create requisition',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onRequisition(eligible);\n },\n });\n }\n if (onCancel) {\n ops.push({\n label: 'Cancel',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onCancel(eligible);\n },\n });\n }\n return ops;\n }, [onOrderRows, onRequisition, onCancel]);\n\n const columns = React.useMemo(\n () =>\n ORDER_COLUMNS.map(({ field, header }) => ({\n field: field as string,\n header,\n })),\n []\n );\n\n return (\n <div\n data-slot=\"orders-grid\"\n data-testid={dataTestId}\n className={cn('flex flex-col gap-2', className)}\n >\n <DataVisNitroSource type=\"http\" url={url}>\n <OrdersGroupPresets />\n <DataVisNitroGrid\n title={title}\n height={height}\n columns={columns}\n controlFields={ORDER_CONTROL_FIELDS}\n operations={operations}\n // 'checkbox' selection ships in @mieweb/datavis > 1.1.0 (native\n // leading checkbox column + tri-state select-all header); the\n // published typings still say `boolean`, hence the cast.\n features={\n {\n rowSelection: 'checkbox',\n stickyHeaders: true,\n } as unknown as React.ComponentProps<\n typeof DataVisNitroGrid\n >['features']\n }\n formatCell={formatOrderCell}\n />\n </DataVisNitroSource>\n </div>\n );\n}\n\n// =============================================================================\n// ChartOrdersGrid\n// =============================================================================\n\nexport interface ChartOrdersGridProps extends OrdersGridBaseProps {\n /** Include not-yet-placed due-list orders as available/blocked rows */\n includeDue?: boolean;\n}\n\n/** Chart-wide order history across all encounters. */\nexport function ChartOrdersGrid({\n history,\n programs,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n includeDue,\n title = 'Orders — chart',\n ...rest\n}: ChartOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n };\n return buildChartOrderRows(history, programs, opts);\n }, [\n history,\n programs,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nChartOrdersGrid.displayName = 'ChartOrdersGrid';\n\n// =============================================================================\n// EncounterOrdersGrid\n// =============================================================================\n\nexport interface EncounterOrdersGridProps extends OrdersGridBaseProps {\n /** The current encounter (visit) ID */\n encounterId: string;\n}\n\n/** The current encounter's orders + due-list orders placeable this visit. */\nexport function EncounterOrdersGrid({\n history,\n programs,\n encounterId,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n title = 'Encounter orders',\n ...rest\n}: EncounterOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n };\n return buildEncounterOrderRows(history, programs, encounterId, opts);\n }, [\n history,\n programs,\n encounterId,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nEncounterOrdersGrid.displayName = 'EncounterOrdersGrid';\n"]}
package/dist/esheet.cjs CHANGED
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkKQUI4BGS_cjs = require('./chunk-KQUI4BGS.cjs');
3
+ var chunkLGIQVSAE_cjs = require('./chunk-LGIQVSAE.cjs');
4
4
  require('./chunk-BSDBI6H7.cjs');
5
5
  require('./chunk-WWJIW2IH.cjs');
6
6
  require('./chunk-G7EQ3JPX.cjs');
7
7
  require('./chunk-AIJAFPGJ.cjs');
8
8
  require('./chunk-UQ3VVR6A.cjs');
9
9
  require('./chunk-ZSGEGISB.cjs');
10
+ require('./chunk-MJWFNV3L.cjs');
10
11
  require('./chunk-I44YNYI6.cjs');
11
12
  require('./chunk-Z5S5JEJD.cjs');
12
- require('./chunk-MJWFNV3L.cjs');
13
13
  require('./chunk-YVPC65ZJ.cjs');
14
14
  require('./chunk-FSGEDDF2.cjs');
15
15
  require('./chunk-AOHJILLU.cjs');
@@ -21,7 +21,8 @@ require('./chunk-SCV7C55E.cjs');
21
21
  require('./chunk-L7L5S2HO.cjs');
22
22
  require('./chunk-6HFFWEM3.cjs');
23
23
  require('./chunk-YVL3XATO.cjs');
24
- require('./chunk-VNYW4C4J.cjs');
24
+ require('./chunk-2BGS7RFM.cjs');
25
+ require('./chunk-XFLEW7AT.cjs');
25
26
  require('./chunk-NV2CWBI2.cjs');
26
27
  require('./chunk-S5RVSXDV.cjs');
27
28
  require('./chunk-EUAMEVVI.cjs');
@@ -80,7 +81,7 @@ function MedicationListField({
80
81
  return definition.medications ?? [];
81
82
  }, [response?.answer, definition.medications]);
82
83
  return /* @__PURE__ */ jsxRuntime.jsx(
83
- chunkKQUI4BGS_cjs.MedicationReconciliation,
84
+ chunkLGIQVSAE_cjs.MedicationReconciliation,
84
85
  {
85
86
  medications,
86
87
  onChange: (next) => onResponse({ answer: JSON.stringify({ medications: next }) }),
@@ -137,7 +138,7 @@ function AllergyListField({
137
138
  codeLookup
138
139
  }) {
139
140
  const definition = field.definition;
140
- const ambientCodeLookup = chunkKQUI4BGS_cjs.useCodeLookupConfig();
141
+ const ambientCodeLookup = chunkLGIQVSAE_cjs.useCodeLookupConfig();
141
142
  const effectiveCodeLookup = codeLookup === false ? void 0 : codeLookup ?? ambientCodeLookup ?? void 0;
142
143
  const value = React__namespace.useMemo(() => {
143
144
  if (response?.answer) return parseValue2(response.answer);
@@ -147,7 +148,7 @@ function AllergyListField({
147
148
  onResponse({ answer: JSON.stringify(next) });
148
149
  };
149
150
  return /* @__PURE__ */ jsxRuntime.jsx(
150
- chunkKQUI4BGS_cjs.AllergyManager,
151
+ chunkLGIQVSAE_cjs.AllergyManager,
151
152
  {
152
153
  allergies: value.allergies,
153
154
  onChange: (allergies) => commit({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/esheet-fields/MedicationListField.tsx","../src/esheet-fields/AllergyListField.tsx","../src/esheet-fields/registerAll.ts"],"names":["React","jsx","MedicationReconciliation","registerCustomFieldTypes","parseValue","useCodeLookupConfig","React2","AllergyManager"],"mappings":"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","file":"esheet.cjs","sourcesContent":["/**\n * MedicationListField — eSheet custom field wrapper around\n * MedicationReconciliation.\n *\n * Thin adapter: all reconciliation UI/behavior lives in the standalone\n * `MedicationReconciliation` component (main bundle). This file only maps the\n * eSheet field contract (definition, response, preview/enabled state) onto it.\n *\n * Exposed via the `@mieweb/ui/esheet` entry point (NOT the main bundle) so\n * that @esheet/* stays an optional dependency.\n *\n * The field stores its state as JSON in `response.answer`:\n * `{ medications: Medication[] }`.\n *\n * @example\n * ```tsx\n * import { registerMedicationListFieldType } from '@mieweb/ui/esheet';\n *\n * registerMedicationListFieldType(); // before rendering EsheetBuilder/Renderer\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport {\n MedicationReconciliation,\n type CodeLookupConfig,\n type Medication,\n} from '../components/MedicationList';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface MedicationListFieldValue {\n medications: Medication[];\n}\n\nfunction parseValue(answer: string | undefined): MedicationListFieldValue {\n if (!answer) return { medications: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { medications: [] };\n }\n const { medications } = parsed as { medications?: unknown };\n return {\n medications: Array.isArray(medications)\n ? (medications as Medication[])\n : [],\n };\n } catch {\n return { medications: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function MedicationListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerMedicationListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n medications?: Medication[];\n quickAddOptions?: string[];\n };\n\n // Response wins; otherwise seed from the field definition's medication list.\n const medications = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer).medications;\n return definition.medications ?? [];\n }, [response?.answer, definition.medications]);\n\n return (\n <MedicationReconciliation\n medications={medications}\n onChange={(next) =>\n onResponse({ answer: JSON.stringify({ medications: next }) })\n }\n title={definition.question ?? 'Presenting medications'}\n quickAddOptions={definition.quickAddOptions}\n codeLookup={codeLookup}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `medicationList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n *\n * @param options.codeLookup — wire the offline RxNorm/FDB CodeLookup into the\n * medication editor (Correct / Add Medication):\n * ```tsx\n * import { CodeLookup } from '…/CodeLookup';\n * registerMedicationListFieldType({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\nexport function registerMedicationListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <MedicationListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n medicationList: {\n label: 'Medication Reconciliation',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Presenting medications',\n quickAddOptions: [\n 'aspirin 81 mg tablet',\n 'atorvastatin 20 mg tablet',\n 'metformin 500 mg tablet',\n ],\n },\n component: Field,\n },\n });\n}\n","/**\n * AllergyListField — eSheet custom field wrapper around AllergyManager.\n *\n * Thin adapter, same pattern as MedicationListField. State persists as JSON\n * in `response.answer`: `{ allergies: Allergy[], noKnownAllergies?: boolean }`.\n *\n * @example\n * ```tsx\n * import { registerAllergyListFieldType } from '@mieweb/ui/esheet';\n *\n * registerAllergyListFieldType({ codeLookup: { component: CodeLookup, indexUrl: '/codify' } });\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport { AllergyManager, type Allergy } from '../components/AllergyList';\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { useCodeLookupConfig } from '../components/CodeLookup/context';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface AllergyListFieldValue {\n allergies: Allergy[];\n noKnownAllergies?: boolean;\n}\n\nfunction parseValue(answer: string | undefined): AllergyListFieldValue {\n if (!answer) return { allergies: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { allergies: [] };\n }\n const { allergies, noKnownAllergies } = parsed as Partial<\n Record<keyof AllergyListFieldValue, unknown>\n >;\n return {\n allergies: Array.isArray(allergies) ? (allergies as Allergy[]) : [],\n noKnownAllergies:\n typeof noKnownAllergies === 'boolean' ? noKnownAllergies : undefined,\n };\n } catch {\n return { allergies: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function AllergyListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerAllergyListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n allergies?: Allergy[];\n };\n\n // Default to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const value = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer);\n return { allergies: definition.allergies ?? [] };\n }, [response?.answer, definition.allergies]);\n\n const commit = (next: AllergyListFieldValue) => {\n onResponse({ answer: JSON.stringify(next) });\n };\n\n return (\n <AllergyManager\n allergies={value.allergies}\n onChange={(allergies) =>\n commit({\n allergies,\n // any recorded allergy clears NKA\n noKnownAllergies:\n allergies.length > 0 ? undefined : value.noKnownAllergies,\n })\n }\n noKnownAllergies={value.noKnownAllergies}\n onNoKnownAllergiesChange={(nka) =>\n commit({ allergies: value.allergies, noKnownAllergies: nka })\n }\n title={definition.question ?? 'Allergies'}\n codeLookup={codeLookup}\n inlineAddSearch={Boolean(effectiveCodeLookup)}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `allergyList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerAllergyListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <AllergyListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n allergyList: {\n label: 'Allergy List',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Allergies',\n },\n component: Field,\n },\n });\n}\n","/**\n * registerMieEsheetFields — one-call registration for every @mieweb/ui custom\n * eSheet field type (medication reconciliation + allergy list).\n *\n * The @esheet/* packages stay generic and free of medical dependencies; these\n * fields live in @mieweb/ui and opt in from the consumer side. This helper is\n * the \"batteries included\" entry point so an app can enable the full medical\n * field set with a single call instead of wiring each field type by hand.\n *\n * @example\n * ```tsx\n * import { registerMieEsheetFields } from '@mieweb/ui/esheet';\n * import { CodeLookup } from '…/CodeLookup';\n *\n * // once, before EsheetBuilder / EsheetRenderer mount\n * registerMieEsheetFields({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\n\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { registerMedicationListFieldType } from './MedicationListField';\nimport { registerAllergyListFieldType } from './AllergyListField';\n\nexport interface RegisterMieEsheetFieldsOptions {\n /**\n * Shared CodeLookup wiring applied to every field that supports offline\n * RxNorm/FDB coding (medication + allergy editors).\n */\n codeLookup?: CodeLookupConfig;\n}\n\n/**\n * Register all @mieweb/ui custom eSheet field types at once:\n * `medicationList` and `allergyList`.\n *\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerMieEsheetFields(\n options?: RegisterMieEsheetFieldsOptions\n): void {\n registerMedicationListFieldType({ codeLookup: options?.codeLookup });\n registerAllergyListFieldType({ codeLookup: options?.codeLookup });\n}\n"]}
1
+ {"version":3,"sources":["../src/esheet-fields/MedicationListField.tsx","../src/esheet-fields/AllergyListField.tsx","../src/esheet-fields/registerAll.ts"],"names":["React","jsx","MedicationReconciliation","registerCustomFieldTypes","parseValue","useCodeLookupConfig","React2","AllergyManager"],"mappings":"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","file":"esheet.cjs","sourcesContent":["/**\n * MedicationListField — eSheet custom field wrapper around\n * MedicationReconciliation.\n *\n * Thin adapter: all reconciliation UI/behavior lives in the standalone\n * `MedicationReconciliation` component (main bundle). This file only maps the\n * eSheet field contract (definition, response, preview/enabled state) onto it.\n *\n * Exposed via the `@mieweb/ui/esheet` entry point (NOT the main bundle) so\n * that @esheet/* stays an optional dependency.\n *\n * The field stores its state as JSON in `response.answer`:\n * `{ medications: Medication[] }`.\n *\n * @example\n * ```tsx\n * import { registerMedicationListFieldType } from '@mieweb/ui/esheet';\n *\n * registerMedicationListFieldType(); // before rendering EsheetBuilder/Renderer\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport {\n MedicationReconciliation,\n type CodeLookupConfig,\n type Medication,\n} from '../components/MedicationList';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface MedicationListFieldValue {\n medications: Medication[];\n}\n\nfunction parseValue(answer: string | undefined): MedicationListFieldValue {\n if (!answer) return { medications: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { medications: [] };\n }\n const { medications } = parsed as { medications?: unknown };\n return {\n medications: Array.isArray(medications)\n ? (medications as Medication[])\n : [],\n };\n } catch {\n return { medications: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function MedicationListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerMedicationListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n medications?: Medication[];\n quickAddOptions?: string[];\n };\n\n // Response wins; otherwise seed from the field definition's medication list.\n const medications = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer).medications;\n return definition.medications ?? [];\n }, [response?.answer, definition.medications]);\n\n return (\n <MedicationReconciliation\n medications={medications}\n onChange={(next) =>\n onResponse({ answer: JSON.stringify({ medications: next }) })\n }\n title={definition.question ?? 'Presenting medications'}\n quickAddOptions={definition.quickAddOptions}\n codeLookup={codeLookup}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `medicationList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n *\n * @param options.codeLookup — wire the offline RxNorm/FDB CodeLookup into the\n * medication editor (Correct / Add Medication):\n * ```tsx\n * import { CodeLookup } from '…/CodeLookup';\n * registerMedicationListFieldType({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\nexport function registerMedicationListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <MedicationListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n medicationList: {\n label: 'Medication Reconciliation',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Presenting medications',\n quickAddOptions: [\n 'aspirin 81 mg tablet',\n 'atorvastatin 20 mg tablet',\n 'metformin 500 mg tablet',\n ],\n },\n component: Field,\n },\n });\n}\n","/**\n * AllergyListField — eSheet custom field wrapper around AllergyManager.\n *\n * Thin adapter, same pattern as MedicationListField. State persists as JSON\n * in `response.answer`: `{ allergies: Allergy[], noKnownAllergies?: boolean }`.\n *\n * @example\n * ```tsx\n * import { registerAllergyListFieldType } from '@mieweb/ui/esheet';\n *\n * registerAllergyListFieldType({ codeLookup: { component: CodeLookup, indexUrl: '/codify' } });\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport { AllergyManager, type Allergy } from '../components/AllergyList';\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { useCodeLookupConfig } from '../components/CodeLookup/context';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface AllergyListFieldValue {\n allergies: Allergy[];\n noKnownAllergies?: boolean;\n}\n\nfunction parseValue(answer: string | undefined): AllergyListFieldValue {\n if (!answer) return { allergies: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { allergies: [] };\n }\n const { allergies, noKnownAllergies } = parsed as Partial<\n Record<keyof AllergyListFieldValue, unknown>\n >;\n return {\n allergies: Array.isArray(allergies) ? (allergies as Allergy[]) : [],\n noKnownAllergies:\n typeof noKnownAllergies === 'boolean' ? noKnownAllergies : undefined,\n };\n } catch {\n return { allergies: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function AllergyListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerAllergyListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n allergies?: Allergy[];\n };\n\n // Default to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const value = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer);\n return { allergies: definition.allergies ?? [] };\n }, [response?.answer, definition.allergies]);\n\n const commit = (next: AllergyListFieldValue) => {\n onResponse({ answer: JSON.stringify(next) });\n };\n\n return (\n <AllergyManager\n allergies={value.allergies}\n onChange={(allergies) =>\n commit({\n allergies,\n // any recorded allergy clears NKA\n noKnownAllergies:\n allergies.length > 0 ? undefined : value.noKnownAllergies,\n })\n }\n noKnownAllergies={value.noKnownAllergies}\n onNoKnownAllergiesChange={(nka) =>\n commit({ allergies: value.allergies, noKnownAllergies: nka })\n }\n title={definition.question ?? 'Allergies'}\n codeLookup={codeLookup}\n inlineAddSearch={Boolean(effectiveCodeLookup)}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `allergyList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerAllergyListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <AllergyListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n allergyList: {\n label: 'Allergy List',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Allergies',\n },\n component: Field,\n },\n });\n}\n","/**\n * registerMieEsheetFields — one-call registration for every @mieweb/ui custom\n * eSheet field type (medication reconciliation + allergy list).\n *\n * The @esheet/* packages stay generic and free of medical dependencies; these\n * fields live in @mieweb/ui and opt in from the consumer side. This helper is\n * the \"batteries included\" entry point so an app can enable the full medical\n * field set with a single call instead of wiring each field type by hand.\n *\n * @example\n * ```tsx\n * import { registerMieEsheetFields } from '@mieweb/ui/esheet';\n * import { CodeLookup } from '…/CodeLookup';\n *\n * // once, before EsheetBuilder / EsheetRenderer mount\n * registerMieEsheetFields({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\n\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { registerMedicationListFieldType } from './MedicationListField';\nimport { registerAllergyListFieldType } from './AllergyListField';\n\nexport interface RegisterMieEsheetFieldsOptions {\n /**\n * Shared CodeLookup wiring applied to every field that supports offline\n * RxNorm/FDB coding (medication + allergy editors).\n */\n codeLookup?: CodeLookupConfig;\n}\n\n/**\n * Register all @mieweb/ui custom eSheet field types at once:\n * `medicationList` and `allergyList`.\n *\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerMieEsheetFields(\n options?: RegisterMieEsheetFieldsOptions\n): void {\n registerMedicationListFieldType({ codeLookup: options?.codeLookup });\n registerAllergyListFieldType({ codeLookup: options?.codeLookup });\n}\n"]}
package/dist/esheet.js CHANGED
@@ -1,13 +1,13 @@
1
- import { MedicationReconciliation, useCodeLookupConfig, AllergyManager } from './chunk-TVTIGV7Q.js';
1
+ import { MedicationReconciliation, useCodeLookupConfig, AllergyManager } from './chunk-DXCATYEO.js';
2
2
  import './chunk-H3YO5GBM.js';
3
3
  import './chunk-FJ7YPVKV.js';
4
4
  import './chunk-EPSB4WTL.js';
5
5
  import './chunk-I3WGZPI6.js';
6
6
  import './chunk-S7WCHDBO.js';
7
7
  import './chunk-7IBZA7G6.js';
8
+ import './chunk-QYSUYB3S.js';
8
9
  import './chunk-6NZXWKUE.js';
9
10
  import './chunk-3IMM2PM4.js';
10
- import './chunk-QYSUYB3S.js';
11
11
  import './chunk-7ZVTLTJF.js';
12
12
  import './chunk-62ZOA6PX.js';
13
13
  import './chunk-WSNMQQ4P.js';
@@ -19,7 +19,8 @@ import './chunk-VSQF22GL.js';
19
19
  import './chunk-BKSPDTX4.js';
20
20
  import './chunk-HB7C7NB5.js';
21
21
  import './chunk-BMSG4NBH.js';
22
- import './chunk-GOALNQZ2.js';
22
+ import './chunk-UV4IJNSN.js';
23
+ import './chunk-AXRRBEER.js';
23
24
  import './chunk-XCP454Q6.js';
24
25
  import './chunk-TQONQSJO.js';
25
26
  import './chunk-PX6F3LHL.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/esheet-fields/MedicationListField.tsx","../src/esheet-fields/AllergyListField.tsx","../src/esheet-fields/registerAll.ts"],"names":["parseValue","React2","jsx","registerCustomFieldTypes"],"mappings":"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","file":"esheet.js","sourcesContent":["/**\n * MedicationListField — eSheet custom field wrapper around\n * MedicationReconciliation.\n *\n * Thin adapter: all reconciliation UI/behavior lives in the standalone\n * `MedicationReconciliation` component (main bundle). This file only maps the\n * eSheet field contract (definition, response, preview/enabled state) onto it.\n *\n * Exposed via the `@mieweb/ui/esheet` entry point (NOT the main bundle) so\n * that @esheet/* stays an optional dependency.\n *\n * The field stores its state as JSON in `response.answer`:\n * `{ medications: Medication[] }`.\n *\n * @example\n * ```tsx\n * import { registerMedicationListFieldType } from '@mieweb/ui/esheet';\n *\n * registerMedicationListFieldType(); // before rendering EsheetBuilder/Renderer\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport {\n MedicationReconciliation,\n type CodeLookupConfig,\n type Medication,\n} from '../components/MedicationList';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface MedicationListFieldValue {\n medications: Medication[];\n}\n\nfunction parseValue(answer: string | undefined): MedicationListFieldValue {\n if (!answer) return { medications: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { medications: [] };\n }\n const { medications } = parsed as { medications?: unknown };\n return {\n medications: Array.isArray(medications)\n ? (medications as Medication[])\n : [],\n };\n } catch {\n return { medications: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function MedicationListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerMedicationListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n medications?: Medication[];\n quickAddOptions?: string[];\n };\n\n // Response wins; otherwise seed from the field definition's medication list.\n const medications = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer).medications;\n return definition.medications ?? [];\n }, [response?.answer, definition.medications]);\n\n return (\n <MedicationReconciliation\n medications={medications}\n onChange={(next) =>\n onResponse({ answer: JSON.stringify({ medications: next }) })\n }\n title={definition.question ?? 'Presenting medications'}\n quickAddOptions={definition.quickAddOptions}\n codeLookup={codeLookup}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `medicationList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n *\n * @param options.codeLookup — wire the offline RxNorm/FDB CodeLookup into the\n * medication editor (Correct / Add Medication):\n * ```tsx\n * import { CodeLookup } from '…/CodeLookup';\n * registerMedicationListFieldType({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\nexport function registerMedicationListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <MedicationListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n medicationList: {\n label: 'Medication Reconciliation',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Presenting medications',\n quickAddOptions: [\n 'aspirin 81 mg tablet',\n 'atorvastatin 20 mg tablet',\n 'metformin 500 mg tablet',\n ],\n },\n component: Field,\n },\n });\n}\n","/**\n * AllergyListField — eSheet custom field wrapper around AllergyManager.\n *\n * Thin adapter, same pattern as MedicationListField. State persists as JSON\n * in `response.answer`: `{ allergies: Allergy[], noKnownAllergies?: boolean }`.\n *\n * @example\n * ```tsx\n * import { registerAllergyListFieldType } from '@mieweb/ui/esheet';\n *\n * registerAllergyListFieldType({ codeLookup: { component: CodeLookup, indexUrl: '/codify' } });\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport { AllergyManager, type Allergy } from '../components/AllergyList';\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { useCodeLookupConfig } from '../components/CodeLookup/context';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface AllergyListFieldValue {\n allergies: Allergy[];\n noKnownAllergies?: boolean;\n}\n\nfunction parseValue(answer: string | undefined): AllergyListFieldValue {\n if (!answer) return { allergies: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { allergies: [] };\n }\n const { allergies, noKnownAllergies } = parsed as Partial<\n Record<keyof AllergyListFieldValue, unknown>\n >;\n return {\n allergies: Array.isArray(allergies) ? (allergies as Allergy[]) : [],\n noKnownAllergies:\n typeof noKnownAllergies === 'boolean' ? noKnownAllergies : undefined,\n };\n } catch {\n return { allergies: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function AllergyListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerAllergyListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n allergies?: Allergy[];\n };\n\n // Default to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const value = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer);\n return { allergies: definition.allergies ?? [] };\n }, [response?.answer, definition.allergies]);\n\n const commit = (next: AllergyListFieldValue) => {\n onResponse({ answer: JSON.stringify(next) });\n };\n\n return (\n <AllergyManager\n allergies={value.allergies}\n onChange={(allergies) =>\n commit({\n allergies,\n // any recorded allergy clears NKA\n noKnownAllergies:\n allergies.length > 0 ? undefined : value.noKnownAllergies,\n })\n }\n noKnownAllergies={value.noKnownAllergies}\n onNoKnownAllergiesChange={(nka) =>\n commit({ allergies: value.allergies, noKnownAllergies: nka })\n }\n title={definition.question ?? 'Allergies'}\n codeLookup={codeLookup}\n inlineAddSearch={Boolean(effectiveCodeLookup)}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `allergyList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerAllergyListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <AllergyListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n allergyList: {\n label: 'Allergy List',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Allergies',\n },\n component: Field,\n },\n });\n}\n","/**\n * registerMieEsheetFields — one-call registration for every @mieweb/ui custom\n * eSheet field type (medication reconciliation + allergy list).\n *\n * The @esheet/* packages stay generic and free of medical dependencies; these\n * fields live in @mieweb/ui and opt in from the consumer side. This helper is\n * the \"batteries included\" entry point so an app can enable the full medical\n * field set with a single call instead of wiring each field type by hand.\n *\n * @example\n * ```tsx\n * import { registerMieEsheetFields } from '@mieweb/ui/esheet';\n * import { CodeLookup } from '…/CodeLookup';\n *\n * // once, before EsheetBuilder / EsheetRenderer mount\n * registerMieEsheetFields({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\n\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { registerMedicationListFieldType } from './MedicationListField';\nimport { registerAllergyListFieldType } from './AllergyListField';\n\nexport interface RegisterMieEsheetFieldsOptions {\n /**\n * Shared CodeLookup wiring applied to every field that supports offline\n * RxNorm/FDB coding (medication + allergy editors).\n */\n codeLookup?: CodeLookupConfig;\n}\n\n/**\n * Register all @mieweb/ui custom eSheet field types at once:\n * `medicationList` and `allergyList`.\n *\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerMieEsheetFields(\n options?: RegisterMieEsheetFieldsOptions\n): void {\n registerMedicationListFieldType({ codeLookup: options?.codeLookup });\n registerAllergyListFieldType({ codeLookup: options?.codeLookup });\n}\n"]}
1
+ {"version":3,"sources":["../src/esheet-fields/MedicationListField.tsx","../src/esheet-fields/AllergyListField.tsx","../src/esheet-fields/registerAll.ts"],"names":["parseValue","React2","jsx","registerCustomFieldTypes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAS,WAAW,MAAA,EAAsD;AACxE,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,WAAA,EAAa,EAAC,EAAE;AACtC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAE;AAAA,IAC3B;AACA,IAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AACxB,IAAA,OAAO;AAAA,MACL,aAAa,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GACjC,cACD;AAAC,KACP;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAE;AAAA,EAC3B;AACF;AAMO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAGsB;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AAOzB,EAAA,MAAM,WAAA,GAAoB,cAAQ,MAAM;AACtC,IAAA,IAAI,UAAU,MAAA,EAAQ,OAAO,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,CAAE,WAAA;AACzD,IAAA,OAAO,UAAA,CAAW,eAAe,EAAC;AAAA,EACpC,GAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAA,CAAW,WAAW,CAAC,CAAA;AAE7C,EAAA,uBACE,GAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,QAAA,EAAU,CAAC,IAAA,KACT,UAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,IAAA,EAAM,GAAG,CAAA;AAAA,MAE9D,KAAA,EAAO,WAAW,QAAA,IAAY,wBAAA;AAAA,MAC9B,iBAAiB,UAAA,CAAW,eAAA;AAAA,MAC5B,UAAA;AAAA,MACA,QAAA,EAAU,EAAE,SAAA,IAAa,SAAA;AAAA;AAAA,GAC3B;AAEJ;AAmBO,SAAS,gCAAgC,OAAA,EAEvC;AACP,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,qBACb,GAAA,CAAC,uBAAqB,GAAG,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,CAAA;AAEnE,EAAA,wBAAA,CAAyB;AAAA,IACvB,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,2BAAA;AAAA,MACP,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,YAAA,EAAc;AAAA,QACZ,QAAA,EAAU,wBAAA;AAAA,QACV,eAAA,EAAiB;AAAA,UACf,sBAAA;AAAA,UACA,2BAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;AC9GA,SAASA,YAAW,MAAA,EAAmD;AACrE,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AACpC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,IACzB;AACA,IAAA,MAAM,EAAE,SAAA,EAAW,gBAAA,EAAiB,GAAI,MAAA;AAGxC,IAAA,OAAO;AAAA,MACL,WAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAK,YAA0B,EAAC;AAAA,MAClE,gBAAA,EACE,OAAO,gBAAA,KAAqB,SAAA,GAAY,gBAAA,GAAmB,KAAA;AAAA,KAC/D;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AACF;AAMO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAGsB;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AAMzB,EAAA,MAAM,oBAAoB,mBAAA,EAAoB;AAC9C,EAAA,MAAM,mBAAA,GACJ,UAAA,KAAe,KAAA,GACX,MAAA,GACC,cAAc,iBAAA,IAAqB,MAAA;AAE1C,EAAA,MAAM,KAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,IAAI,QAAA,EAAU,MAAA,EAAQ,OAAOD,WAAAA,CAAW,SAAS,MAAM,CAAA;AACvD,IAAA,OAAO,EAAE,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,EAAC,EAAE;AAAA,EACjD,GAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAA,CAAW,SAAS,CAAC,CAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAgC;AAC9C,IAAA,UAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,uBACEE,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAA,EAAU,CAAC,SAAA,KACT,MAAA,CAAO;AAAA,QACL,SAAA;AAAA;AAAA,QAEA,gBAAA,EACE,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAY,KAAA,CAAM;AAAA,OAC5C,CAAA;AAAA,MAEH,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,wBAAA,EAA0B,CAAC,GAAA,KACzB,MAAA,CAAO,EAAE,WAAW,KAAA,CAAM,SAAA,EAAW,gBAAA,EAAkB,GAAA,EAAK,CAAA;AAAA,MAE9D,KAAA,EAAO,WAAW,QAAA,IAAY,WAAA;AAAA,MAC9B,UAAA;AAAA,MACA,eAAA,EAAiB,QAAQ,mBAAmB,CAAA;AAAA,MAC5C,QAAA,EAAU,EAAE,SAAA,IAAa,SAAA;AAAA;AAAA,GAC3B;AAEJ;AAUO,SAAS,6BAA6B,OAAA,EAEpC;AACP,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,qBACbA,GAAAA,CAAC,oBAAkB,GAAG,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,CAAA;AAEhE,EAAAC,wBAAAA,CAAyB;AAAA,IACvB,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,cAAA;AAAA,MACP,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,YAAA,EAAc;AAAA,QACZ,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;;;AClGO,SAAS,wBACd,OAAA,EACM;AACN,EAAA,+BAAA,CAAgC,EAAE,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,CAAA;AACnE,EAAA,4BAAA,CAA6B,EAAE,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,CAAA;AAClE","file":"esheet.js","sourcesContent":["/**\n * MedicationListField — eSheet custom field wrapper around\n * MedicationReconciliation.\n *\n * Thin adapter: all reconciliation UI/behavior lives in the standalone\n * `MedicationReconciliation` component (main bundle). This file only maps the\n * eSheet field contract (definition, response, preview/enabled state) onto it.\n *\n * Exposed via the `@mieweb/ui/esheet` entry point (NOT the main bundle) so\n * that @esheet/* stays an optional dependency.\n *\n * The field stores its state as JSON in `response.answer`:\n * `{ medications: Medication[] }`.\n *\n * @example\n * ```tsx\n * import { registerMedicationListFieldType } from '@mieweb/ui/esheet';\n *\n * registerMedicationListFieldType(); // before rendering EsheetBuilder/Renderer\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport {\n MedicationReconciliation,\n type CodeLookupConfig,\n type Medication,\n} from '../components/MedicationList';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface MedicationListFieldValue {\n medications: Medication[];\n}\n\nfunction parseValue(answer: string | undefined): MedicationListFieldValue {\n if (!answer) return { medications: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { medications: [] };\n }\n const { medications } = parsed as { medications?: unknown };\n return {\n medications: Array.isArray(medications)\n ? (medications as Medication[])\n : [],\n };\n } catch {\n return { medications: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function MedicationListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerMedicationListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n medications?: Medication[];\n quickAddOptions?: string[];\n };\n\n // Response wins; otherwise seed from the field definition's medication list.\n const medications = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer).medications;\n return definition.medications ?? [];\n }, [response?.answer, definition.medications]);\n\n return (\n <MedicationReconciliation\n medications={medications}\n onChange={(next) =>\n onResponse({ answer: JSON.stringify({ medications: next }) })\n }\n title={definition.question ?? 'Presenting medications'}\n quickAddOptions={definition.quickAddOptions}\n codeLookup={codeLookup}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `medicationList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n *\n * @param options.codeLookup — wire the offline RxNorm/FDB CodeLookup into the\n * medication editor (Correct / Add Medication):\n * ```tsx\n * import { CodeLookup } from '…/CodeLookup';\n * registerMedicationListFieldType({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\nexport function registerMedicationListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <MedicationListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n medicationList: {\n label: 'Medication Reconciliation',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Presenting medications',\n quickAddOptions: [\n 'aspirin 81 mg tablet',\n 'atorvastatin 20 mg tablet',\n 'metformin 500 mg tablet',\n ],\n },\n component: Field,\n },\n });\n}\n","/**\n * AllergyListField — eSheet custom field wrapper around AllergyManager.\n *\n * Thin adapter, same pattern as MedicationListField. State persists as JSON\n * in `response.answer`: `{ allergies: Allergy[], noKnownAllergies?: boolean }`.\n *\n * @example\n * ```tsx\n * import { registerAllergyListFieldType } from '@mieweb/ui/esheet';\n *\n * registerAllergyListFieldType({ codeLookup: { component: CodeLookup, indexUrl: '/codify' } });\n * ```\n */\n\nimport * as React from 'react';\nimport type { FieldComponentProps } from '@esheet/core';\nimport { registerCustomFieldTypes } from '@esheet/fields';\nimport { AllergyManager, type Allergy } from '../components/AllergyList';\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { useCodeLookupConfig } from '../components/CodeLookup/context';\n\n// =============================================================================\n// Response (de)serialization\n// =============================================================================\n\nexport interface AllergyListFieldValue {\n allergies: Allergy[];\n noKnownAllergies?: boolean;\n}\n\nfunction parseValue(answer: string | undefined): AllergyListFieldValue {\n if (!answer) return { allergies: [] };\n try {\n // shape-guarded: valid JSON like `null` or `[]` must degrade safely\n const parsed: unknown = JSON.parse(answer);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { allergies: [] };\n }\n const { allergies, noKnownAllergies } = parsed as Partial<\n Record<keyof AllergyListFieldValue, unknown>\n >;\n return {\n allergies: Array.isArray(allergies) ? (allergies as Allergy[]) : [],\n noKnownAllergies:\n typeof noKnownAllergies === 'boolean' ? noKnownAllergies : undefined,\n };\n } catch {\n return { allergies: [] };\n }\n}\n\n// =============================================================================\n// Field component\n// =============================================================================\n\nexport function AllergyListField({\n field,\n response,\n isPreview,\n isEnabled,\n onResponse,\n codeLookup,\n}: FieldComponentProps & {\n /** CodeLookup wiring — supplied via registerAllergyListFieldType() */\n codeLookup?: CodeLookupConfig | false;\n}): React.JSX.Element {\n const definition = field.definition as {\n question?: string;\n allergies?: Allergy[];\n };\n\n // Default to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const value = React.useMemo(() => {\n if (response?.answer) return parseValue(response.answer);\n return { allergies: definition.allergies ?? [] };\n }, [response?.answer, definition.allergies]);\n\n const commit = (next: AllergyListFieldValue) => {\n onResponse({ answer: JSON.stringify(next) });\n };\n\n return (\n <AllergyManager\n allergies={value.allergies}\n onChange={(allergies) =>\n commit({\n allergies,\n // any recorded allergy clears NKA\n noKnownAllergies:\n allergies.length > 0 ? undefined : value.noKnownAllergies,\n })\n }\n noKnownAllergies={value.noKnownAllergies}\n onNoKnownAllergiesChange={(nka) =>\n commit({ allergies: value.allergies, noKnownAllergies: nka })\n }\n title={definition.question ?? 'Allergies'}\n codeLookup={codeLookup}\n inlineAddSearch={Boolean(effectiveCodeLookup)}\n readOnly={!(isPreview && isEnabled)}\n />\n );\n}\n\n// =============================================================================\n// Registration\n// =============================================================================\n\n/**\n * Register the `allergyList` field type with eSheet.\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerAllergyListFieldType(options?: {\n codeLookup?: CodeLookupConfig | false;\n}): void {\n const Field = (props: FieldComponentProps) => (\n <AllergyListField {...props} codeLookup={options?.codeLookup} />\n );\n registerCustomFieldTypes({\n allergyList: {\n label: 'Allergy List',\n category: 'rich',\n answerType: 'text',\n hasOptions: false,\n hasMatrix: false,\n defaultProps: {\n question: 'Allergies',\n },\n component: Field,\n },\n });\n}\n","/**\n * registerMieEsheetFields — one-call registration for every @mieweb/ui custom\n * eSheet field type (medication reconciliation + allergy list).\n *\n * The @esheet/* packages stay generic and free of medical dependencies; these\n * fields live in @mieweb/ui and opt in from the consumer side. This helper is\n * the \"batteries included\" entry point so an app can enable the full medical\n * field set with a single call instead of wiring each field type by hand.\n *\n * @example\n * ```tsx\n * import { registerMieEsheetFields } from '@mieweb/ui/esheet';\n * import { CodeLookup } from '…/CodeLookup';\n *\n * // once, before EsheetBuilder / EsheetRenderer mount\n * registerMieEsheetFields({\n * codeLookup: { component: CodeLookup, indexUrl: '/codify' },\n * });\n * ```\n */\n\nimport type { CodeLookupConfig } from '../components/MedicationList';\nimport { registerMedicationListFieldType } from './MedicationListField';\nimport { registerAllergyListFieldType } from './AllergyListField';\n\nexport interface RegisterMieEsheetFieldsOptions {\n /**\n * Shared CodeLookup wiring applied to every field that supports offline\n * RxNorm/FDB coding (medication + allergy editors).\n */\n codeLookup?: CodeLookupConfig;\n}\n\n/**\n * Register all @mieweb/ui custom eSheet field types at once:\n * `medicationList` and `allergyList`.\n *\n * Call once before rendering EsheetBuilder or EsheetRenderer.\n */\nexport function registerMieEsheetFields(\n options?: RegisterMieEsheetFieldsOptions\n): void {\n registerMedicationListFieldType({ codeLookup: options?.codeLookup });\n registerAllergyListFieldType({ codeLookup: options?.codeLookup });\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkAR7AKDM2_cjs = require('../chunk-AR7AKDM2.cjs');
3
+ var chunkX2PPZJSL_cjs = require('../chunk-X2PPZJSL.cjs');
4
4
  var chunkIXFC7LK2_cjs = require('../chunk-IXFC7LK2.cjs');
5
5
  var chunk2O7D6F67_cjs = require('../chunk-2O7D6F67.cjs');
6
6
  var chunkVPTASZ2O_cjs = require('../chunk-VPTASZ2O.cjs');
@@ -20,53 +20,73 @@ require('../chunk-EUAMEVVI.cjs');
20
20
 
21
21
 
22
22
 
23
+ Object.defineProperty(exports, "KEYBOARD_INSET_VAR", {
24
+ enumerable: true,
25
+ get: function () { return chunkX2PPZJSL_cjs.KEYBOARD_INSET_VAR; }
26
+ });
27
+ Object.defineProperty(exports, "KEYBOARD_OPEN_ATTRIBUTE", {
28
+ enumerable: true,
29
+ get: function () { return chunkX2PPZJSL_cjs.KEYBOARD_OPEN_ATTRIBUTE; }
30
+ });
23
31
  Object.defineProperty(exports, "RTL_LOCALES", {
24
32
  enumerable: true,
25
- get: function () { return chunkAR7AKDM2_cjs.RTL_LOCALES; }
33
+ get: function () { return chunkX2PPZJSL_cjs.RTL_LOCALES; }
34
+ });
35
+ Object.defineProperty(exports, "VISUAL_VIEWPORT_HEIGHT_VAR", {
36
+ enumerable: true,
37
+ get: function () { return chunkX2PPZJSL_cjs.VISUAL_VIEWPORT_HEIGHT_VAR; }
38
+ });
39
+ Object.defineProperty(exports, "VISUAL_VIEWPORT_OFFSET_TOP_VAR", {
40
+ enumerable: true,
41
+ get: function () { return chunkX2PPZJSL_cjs.VISUAL_VIEWPORT_OFFSET_TOP_VAR; }
26
42
  });
27
43
  Object.defineProperty(exports, "isRtlLocale", {
28
44
  enumerable: true,
29
- get: function () { return chunkAR7AKDM2_cjs.isRtlLocale; }
45
+ get: function () { return chunkX2PPZJSL_cjs.isRtlLocale; }
30
46
  });
31
47
  Object.defineProperty(exports, "useCommandK", {
32
48
  enumerable: true,
33
- get: function () { return chunkAR7AKDM2_cjs.useCommandK; }
49
+ get: function () { return chunkX2PPZJSL_cjs.useCommandK; }
34
50
  });
35
51
  Object.defineProperty(exports, "useDirection", {
36
52
  enumerable: true,
37
- get: function () { return chunkAR7AKDM2_cjs.useDirection; }
53
+ get: function () { return chunkX2PPZJSL_cjs.useDirection; }
38
54
  });
39
55
  Object.defineProperty(exports, "useIsDesktop", {
40
56
  enumerable: true,
41
- get: function () { return chunkAR7AKDM2_cjs.useIsDesktop; }
57
+ get: function () { return chunkX2PPZJSL_cjs.useIsDesktop; }
42
58
  });
43
59
  Object.defineProperty(exports, "useIsLargeDesktop", {
44
60
  enumerable: true,
45
- get: function () { return chunkAR7AKDM2_cjs.useIsLargeDesktop; }
61
+ get: function () { return chunkX2PPZJSL_cjs.useIsLargeDesktop; }
46
62
  });
47
63
  Object.defineProperty(exports, "useIsMobile", {
48
64
  enumerable: true,
49
- get: function () { return chunkAR7AKDM2_cjs.useIsMobile; }
65
+ get: function () { return chunkX2PPZJSL_cjs.useIsMobile; }
50
66
  });
51
67
  Object.defineProperty(exports, "useIsMobileOrTablet", {
52
68
  enumerable: true,
53
- get: function () { return chunkAR7AKDM2_cjs.useIsMobileOrTablet; }
69
+ get: function () { return chunkX2PPZJSL_cjs.useIsMobileOrTablet; }
54
70
  });
55
71
  Object.defineProperty(exports, "useIsSmallTablet", {
56
72
  enumerable: true,
57
- get: function () { return chunkAR7AKDM2_cjs.useIsSmallTablet; }
73
+ get: function () { return chunkX2PPZJSL_cjs.useIsSmallTablet; }
58
74
  });
59
75
  Object.defineProperty(exports, "useIsTablet", {
60
76
  enumerable: true,
61
- get: function () { return chunkAR7AKDM2_cjs.useIsTablet; }
77
+ get: function () { return chunkX2PPZJSL_cjs.useIsTablet; }
78
+ });
79
+ Object.defineProperty(exports, "useKeyboardInset", {
80
+ enumerable: true,
81
+ get: function () { return chunkX2PPZJSL_cjs.useKeyboardInset; }
62
82
  });
63
83
  Object.defineProperty(exports, "useKeyboardShortcut", {
64
84
  enumerable: true,
65
- get: function () { return chunkAR7AKDM2_cjs.useKeyboardShortcut; }
85
+ get: function () { return chunkX2PPZJSL_cjs.useKeyboardShortcut; }
66
86
  });
67
87
  Object.defineProperty(exports, "useMediaQuery", {
68
88
  enumerable: true,
69
- get: function () { return chunkAR7AKDM2_cjs.useMediaQuery; }
89
+ get: function () { return chunkX2PPZJSL_cjs.useMediaQuery; }
70
90
  });
71
91
  Object.defineProperty(exports, "useYouTubeHoverPreview", {
72
92
  enumerable: true,
@@ -220,6 +220,62 @@ declare function useEscapeKey(callback: () => void, enabled?: boolean): void;
220
220
  */
221
221
  declare function useFocusTrap<T extends HTMLElement>(enabled?: boolean): RefObject<T | null>;
222
222
 
223
+ /** CSS custom properties written to `<html>` while the hook is mounted. */
224
+ declare const KEYBOARD_INSET_VAR = "--mieweb-keyboard-inset";
225
+ declare const VISUAL_VIEWPORT_HEIGHT_VAR = "--mieweb-visual-viewport-height";
226
+ declare const VISUAL_VIEWPORT_OFFSET_TOP_VAR = "--mieweb-visual-viewport-offset-top";
227
+ /** Boolean attribute set on `<html>` while an on-screen keyboard is open. */
228
+ declare const KEYBOARD_OPEN_ATTRIBUTE = "data-keyboard-open";
229
+ interface KeyboardInsetState {
230
+ /** Pixels of the layout viewport covered by the on-screen keyboard. */
231
+ keyboardInset: number;
232
+ /** Whether an on-screen keyboard currently covers part of the page. */
233
+ isKeyboardOpen: boolean;
234
+ }
235
+ interface UseKeyboardInsetOptions {
236
+ /** Track the keyboard; `false` stops tracking and clears the CSS variables. @default true */
237
+ enabled?: boolean;
238
+ }
239
+ /**
240
+ * Tracks the on-screen keyboard via the Visual Viewport API.
241
+ *
242
+ * iOS Safari and WKWebView (Cordova) ignore
243
+ * `interactive-widget=resizes-content`, and `dvh` does not shrink for the
244
+ * keyboard: the page keeps its full height and iOS pans the visual viewport
245
+ * to reveal the focused input, pushing headers off-screen. This hook
246
+ * measures what is actually visible and publishes it on `<html>` so an app
247
+ * shell can follow the visible area instead:
248
+ *
249
+ * - `--mieweb-keyboard-inset` — keyboard height in px (0 when closed)
250
+ * - `--mieweb-visual-viewport-height` — visible height in px
251
+ * - `--mieweb-visual-viewport-offset-top` — how far iOS panned the page
252
+ * - `data-keyboard-open` — present while the keyboard is open
253
+ *
254
+ * On browsers that already resize the layout for the keyboard (Chrome on
255
+ * Android with `interactive-widget=resizes-content`) the inset stays 0 and
256
+ * the variables simply mirror the layout viewport.
257
+ *
258
+ * Mount it once, near the app root.
259
+ *
260
+ * @example
261
+ * ```tsx
262
+ * function AppShell({ children }) {
263
+ * useKeyboardInset();
264
+ * return (
265
+ * <div
266
+ * style={{
267
+ * height: 'var(--mieweb-visual-viewport-height, 100dvh)',
268
+ * transform: 'translateY(var(--mieweb-visual-viewport-offset-top, 0px))',
269
+ * }}
270
+ * >
271
+ * {children}
272
+ * </div>
273
+ * );
274
+ * }
275
+ * ```
276
+ */
277
+ declare function useKeyboardInset(options?: UseKeyboardInsetOptions): KeyboardInsetState;
278
+
223
279
  /**
224
280
  * Options for keyboard shortcut hook
225
281
  */
@@ -896,4 +952,4 @@ interface UseTranscriptEditsResult {
896
952
  */
897
953
  declare function useTranscriptEdits(options: UseTranscriptEditsOptions): UseTranscriptEditsResult;
898
954
 
899
- export { type AnchoredPlacement, DEFAULT_FILLER_WORDS, DEFAULT_MIN_SILENCE_MS, DEFAULT_NL_SILENCE_MS, type Direction, type DragOverState, type FillerAnalysis, type HoverPreviewState, type KeyboardShortcutOptions, type MediaTransportState, RTL_LOCALES, type ResolvedTheme, type SilenceThresholdCount, type Theme, type TranscriptClipboard, type TranscriptEditStats, type UseAnchoredPositionOptions, type UseAnchoredPositionReturn, type UseDragReorderOptions, type UseDragReorderReturn, type UseMediaTransportOptions, type UseMediaTransportReturn, type UseScrollSpyOptions, type UseScrollSpyReturn, type UseStickToBottomOptions, type UseStickToBottomReturn, type UseTranscriptEditsOptions, type UseTranscriptEditsResult, type UseYouTubeHoverPreviewOptions, type UseYouTubeHoverPreviewReturn, buildPlaybackSegments, dragIndicatorClasses, getSpeedAtIndex, initEditableWords, insertSilences, isDarkMode, isRtlLocale, reorderIds, useAnchoredPosition, useClickOutside, useCommandK, useDirection, useDragReorder, useEscapeKey, useFocusTrap, useIsDarkMode, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useLiveAnnouncement, useMediaQuery, useMediaTransport, usePrefersReducedMotion, useScrollSpy, useStickToBottom, useStreamEndedBelowFold, useTheme, useTranscriptEdits, useYouTubeHoverPreview };
955
+ export { type AnchoredPlacement, DEFAULT_FILLER_WORDS, DEFAULT_MIN_SILENCE_MS, DEFAULT_NL_SILENCE_MS, type Direction, type DragOverState, type FillerAnalysis, type HoverPreviewState, KEYBOARD_INSET_VAR, KEYBOARD_OPEN_ATTRIBUTE, type KeyboardInsetState, type KeyboardShortcutOptions, type MediaTransportState, RTL_LOCALES, type ResolvedTheme, type SilenceThresholdCount, type Theme, type TranscriptClipboard, type TranscriptEditStats, type UseAnchoredPositionOptions, type UseAnchoredPositionReturn, type UseDragReorderOptions, type UseDragReorderReturn, type UseKeyboardInsetOptions, type UseMediaTransportOptions, type UseMediaTransportReturn, type UseScrollSpyOptions, type UseScrollSpyReturn, type UseStickToBottomOptions, type UseStickToBottomReturn, type UseTranscriptEditsOptions, type UseTranscriptEditsResult, type UseYouTubeHoverPreviewOptions, type UseYouTubeHoverPreviewReturn, VISUAL_VIEWPORT_HEIGHT_VAR, VISUAL_VIEWPORT_OFFSET_TOP_VAR, buildPlaybackSegments, dragIndicatorClasses, getSpeedAtIndex, initEditableWords, insertSilences, isDarkMode, isRtlLocale, reorderIds, useAnchoredPosition, useClickOutside, useCommandK, useDirection, useDragReorder, useEscapeKey, useFocusTrap, useIsDarkMode, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardInset, useKeyboardShortcut, useLiveAnnouncement, useMediaQuery, useMediaTransport, usePrefersReducedMotion, useScrollSpy, useStickToBottom, useStreamEndedBelowFold, useTheme, useTranscriptEdits, useYouTubeHoverPreview };
@@ -220,6 +220,62 @@ declare function useEscapeKey(callback: () => void, enabled?: boolean): void;
220
220
  */
221
221
  declare function useFocusTrap<T extends HTMLElement>(enabled?: boolean): RefObject<T | null>;
222
222
 
223
+ /** CSS custom properties written to `<html>` while the hook is mounted. */
224
+ declare const KEYBOARD_INSET_VAR = "--mieweb-keyboard-inset";
225
+ declare const VISUAL_VIEWPORT_HEIGHT_VAR = "--mieweb-visual-viewport-height";
226
+ declare const VISUAL_VIEWPORT_OFFSET_TOP_VAR = "--mieweb-visual-viewport-offset-top";
227
+ /** Boolean attribute set on `<html>` while an on-screen keyboard is open. */
228
+ declare const KEYBOARD_OPEN_ATTRIBUTE = "data-keyboard-open";
229
+ interface KeyboardInsetState {
230
+ /** Pixels of the layout viewport covered by the on-screen keyboard. */
231
+ keyboardInset: number;
232
+ /** Whether an on-screen keyboard currently covers part of the page. */
233
+ isKeyboardOpen: boolean;
234
+ }
235
+ interface UseKeyboardInsetOptions {
236
+ /** Track the keyboard; `false` stops tracking and clears the CSS variables. @default true */
237
+ enabled?: boolean;
238
+ }
239
+ /**
240
+ * Tracks the on-screen keyboard via the Visual Viewport API.
241
+ *
242
+ * iOS Safari and WKWebView (Cordova) ignore
243
+ * `interactive-widget=resizes-content`, and `dvh` does not shrink for the
244
+ * keyboard: the page keeps its full height and iOS pans the visual viewport
245
+ * to reveal the focused input, pushing headers off-screen. This hook
246
+ * measures what is actually visible and publishes it on `<html>` so an app
247
+ * shell can follow the visible area instead:
248
+ *
249
+ * - `--mieweb-keyboard-inset` — keyboard height in px (0 when closed)
250
+ * - `--mieweb-visual-viewport-height` — visible height in px
251
+ * - `--mieweb-visual-viewport-offset-top` — how far iOS panned the page
252
+ * - `data-keyboard-open` — present while the keyboard is open
253
+ *
254
+ * On browsers that already resize the layout for the keyboard (Chrome on
255
+ * Android with `interactive-widget=resizes-content`) the inset stays 0 and
256
+ * the variables simply mirror the layout viewport.
257
+ *
258
+ * Mount it once, near the app root.
259
+ *
260
+ * @example
261
+ * ```tsx
262
+ * function AppShell({ children }) {
263
+ * useKeyboardInset();
264
+ * return (
265
+ * <div
266
+ * style={{
267
+ * height: 'var(--mieweb-visual-viewport-height, 100dvh)',
268
+ * transform: 'translateY(var(--mieweb-visual-viewport-offset-top, 0px))',
269
+ * }}
270
+ * >
271
+ * {children}
272
+ * </div>
273
+ * );
274
+ * }
275
+ * ```
276
+ */
277
+ declare function useKeyboardInset(options?: UseKeyboardInsetOptions): KeyboardInsetState;
278
+
223
279
  /**
224
280
  * Options for keyboard shortcut hook
225
281
  */
@@ -896,4 +952,4 @@ interface UseTranscriptEditsResult {
896
952
  */
897
953
  declare function useTranscriptEdits(options: UseTranscriptEditsOptions): UseTranscriptEditsResult;
898
954
 
899
- export { type AnchoredPlacement, DEFAULT_FILLER_WORDS, DEFAULT_MIN_SILENCE_MS, DEFAULT_NL_SILENCE_MS, type Direction, type DragOverState, type FillerAnalysis, type HoverPreviewState, type KeyboardShortcutOptions, type MediaTransportState, RTL_LOCALES, type ResolvedTheme, type SilenceThresholdCount, type Theme, type TranscriptClipboard, type TranscriptEditStats, type UseAnchoredPositionOptions, type UseAnchoredPositionReturn, type UseDragReorderOptions, type UseDragReorderReturn, type UseMediaTransportOptions, type UseMediaTransportReturn, type UseScrollSpyOptions, type UseScrollSpyReturn, type UseStickToBottomOptions, type UseStickToBottomReturn, type UseTranscriptEditsOptions, type UseTranscriptEditsResult, type UseYouTubeHoverPreviewOptions, type UseYouTubeHoverPreviewReturn, buildPlaybackSegments, dragIndicatorClasses, getSpeedAtIndex, initEditableWords, insertSilences, isDarkMode, isRtlLocale, reorderIds, useAnchoredPosition, useClickOutside, useCommandK, useDirection, useDragReorder, useEscapeKey, useFocusTrap, useIsDarkMode, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useLiveAnnouncement, useMediaQuery, useMediaTransport, usePrefersReducedMotion, useScrollSpy, useStickToBottom, useStreamEndedBelowFold, useTheme, useTranscriptEdits, useYouTubeHoverPreview };
955
+ export { type AnchoredPlacement, DEFAULT_FILLER_WORDS, DEFAULT_MIN_SILENCE_MS, DEFAULT_NL_SILENCE_MS, type Direction, type DragOverState, type FillerAnalysis, type HoverPreviewState, KEYBOARD_INSET_VAR, KEYBOARD_OPEN_ATTRIBUTE, type KeyboardInsetState, type KeyboardShortcutOptions, type MediaTransportState, RTL_LOCALES, type ResolvedTheme, type SilenceThresholdCount, type Theme, type TranscriptClipboard, type TranscriptEditStats, type UseAnchoredPositionOptions, type UseAnchoredPositionReturn, type UseDragReorderOptions, type UseDragReorderReturn, type UseKeyboardInsetOptions, type UseMediaTransportOptions, type UseMediaTransportReturn, type UseScrollSpyOptions, type UseScrollSpyReturn, type UseStickToBottomOptions, type UseStickToBottomReturn, type UseTranscriptEditsOptions, type UseTranscriptEditsResult, type UseYouTubeHoverPreviewOptions, type UseYouTubeHoverPreviewReturn, VISUAL_VIEWPORT_HEIGHT_VAR, VISUAL_VIEWPORT_OFFSET_TOP_VAR, buildPlaybackSegments, dragIndicatorClasses, getSpeedAtIndex, initEditableWords, insertSilences, isDarkMode, isRtlLocale, reorderIds, useAnchoredPosition, useClickOutside, useCommandK, useDirection, useDragReorder, useEscapeKey, useFocusTrap, useIsDarkMode, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardInset, useKeyboardShortcut, useLiveAnnouncement, useMediaQuery, useMediaTransport, usePrefersReducedMotion, useScrollSpy, useStickToBottom, useStreamEndedBelowFold, useTheme, useTranscriptEdits, useYouTubeHoverPreview };
@@ -1,4 +1,4 @@
1
- export { RTL_LOCALES, isRtlLocale, useCommandK, useDirection, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useMediaQuery } from '../chunk-AWJBOND5.js';
1
+ export { KEYBOARD_INSET_VAR, KEYBOARD_OPEN_ATTRIBUTE, RTL_LOCALES, VISUAL_VIEWPORT_HEIGHT_VAR, VISUAL_VIEWPORT_OFFSET_TOP_VAR, isRtlLocale, useCommandK, useDirection, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardInset, useKeyboardShortcut, useMediaQuery } from '../chunk-LENW5YOC.js';
2
2
  export { useYouTubeHoverPreview } from '../chunk-POWS35OT.js';
3
3
  export { useTheme } from '../chunk-KJZNEVYM.js';
4
4
  export { useStickToBottom, useStreamEndedBelowFold } from '../chunk-BM35CACB.js';