@mieweb/ui 0.8.0-dev.0 → 0.8.0-dev.10

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 (227) hide show
  1. package/README.md +162 -739
  2. package/agent/mieweb-ui.instructions.md +34 -16
  3. package/dist/CsvBlock-HMAZ7YK5.cjs +15 -0
  4. package/dist/{CsvBlock-OTFG3PYZ.cjs.map → CsvBlock-HMAZ7YK5.cjs.map} +1 -1
  5. package/dist/CsvBlock-RPGHFTVD.js +6 -0
  6. package/dist/{CsvBlock-PUSTBQ5B.js.map → CsvBlock-RPGHFTVD.js.map} +1 -1
  7. package/dist/SurveyBlock-ID55AT3R.js +6 -0
  8. package/dist/{SurveyBlock-JLHS3YQD.js.map → SurveyBlock-ID55AT3R.js.map} +1 -1
  9. package/dist/SurveyBlock-K6HKI7AD.cjs +15 -0
  10. package/dist/{SurveyBlock-M2ZRTGVJ.cjs.map → SurveyBlock-K6HKI7AD.cjs.map} +1 -1
  11. package/dist/{chunk-RZJXCI53.js → chunk-22CYDCXA.js} +3 -3
  12. package/dist/{chunk-RZJXCI53.js.map → chunk-22CYDCXA.js.map} +1 -1
  13. package/dist/{chunk-OTQ72WX3.js → chunk-2BPIVWAK.js} +3 -3
  14. package/dist/{chunk-OTQ72WX3.js.map → chunk-2BPIVWAK.js.map} +1 -1
  15. package/dist/{chunk-6EWJGRC3.js → chunk-3JWAABYI.js} +6 -6
  16. package/dist/chunk-3JWAABYI.js.map +1 -0
  17. package/dist/{chunk-5J5PEUUA.js → chunk-4KFVGIY6.js} +4 -4
  18. package/dist/{chunk-5J5PEUUA.js.map → chunk-4KFVGIY6.js.map} +1 -1
  19. package/dist/{chunk-A5YOIJKL.js → chunk-4KZIXV2J.js} +12 -12
  20. package/dist/{chunk-A5YOIJKL.js.map → chunk-4KZIXV2J.js.map} +1 -1
  21. package/dist/{chunk-WIYQI35R.cjs → chunk-4SIGL6QC.cjs} +4 -4
  22. package/dist/{chunk-WIYQI35R.cjs.map → chunk-4SIGL6QC.cjs.map} +1 -1
  23. package/dist/{chunk-4AE2L6AO.cjs → chunk-7FTBPLA6.cjs} +8 -8
  24. package/dist/chunk-7FTBPLA6.cjs.map +1 -0
  25. package/dist/{chunk-IILJGFI5.js → chunk-7IBZA7G6.js} +7 -5
  26. package/dist/chunk-7IBZA7G6.js.map +1 -0
  27. package/dist/{chunk-LQHI44OZ.cjs → chunk-7SFGEE4M.cjs} +16 -16
  28. package/dist/{chunk-LQHI44OZ.cjs.map → chunk-7SFGEE4M.cjs.map} +1 -1
  29. package/dist/{chunk-JHZW3Y62.js → chunk-7ZP3NNII.js} +3 -3
  30. package/dist/chunk-7ZP3NNII.js.map +1 -0
  31. package/dist/{chunk-SPWVKDGC.cjs → chunk-ABTO4RD6.cjs} +5 -5
  32. package/dist/{chunk-SPWVKDGC.cjs.map → chunk-ABTO4RD6.cjs.map} +1 -1
  33. package/dist/{chunk-ELYGV32O.cjs → chunk-AHHFFXJR.cjs} +4 -4
  34. package/dist/{chunk-ELYGV32O.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
  35. package/dist/{chunk-MYFZYUPR.cjs → chunk-AOHJILLU.cjs} +38 -3
  36. package/dist/chunk-AOHJILLU.cjs.map +1 -0
  37. package/dist/{chunk-XBKOZRDO.js → chunk-ATOWMVZH.js} +3 -3
  38. package/dist/{chunk-XBKOZRDO.js.map → chunk-ATOWMVZH.js.map} +1 -1
  39. package/dist/{chunk-BOW7ZGI2.cjs → chunk-BT7SXNZU.cjs} +169 -9
  40. package/dist/chunk-BT7SXNZU.cjs.map +1 -0
  41. package/dist/{chunk-DX64KLSN.js → chunk-CLQUCPV6.js} +4 -4
  42. package/dist/{chunk-DX64KLSN.js.map → chunk-CLQUCPV6.js.map} +1 -1
  43. package/dist/{chunk-4PIW3Y5M.js → chunk-CLRWVJOD.js} +4 -4
  44. package/dist/{chunk-4PIW3Y5M.js.map → chunk-CLRWVJOD.js.map} +1 -1
  45. package/dist/{chunk-RYQ3S3KO.cjs → chunk-D6UXVOPS.cjs} +23 -20
  46. package/dist/chunk-D6UXVOPS.cjs.map +1 -0
  47. package/dist/{chunk-5JZIDILK.cjs → chunk-FK4ZV5VO.cjs} +3 -3
  48. package/dist/chunk-FK4ZV5VO.cjs.map +1 -0
  49. package/dist/{chunk-SK7H3Z67.cjs → chunk-FTDNNKHE.cjs} +14 -14
  50. package/dist/chunk-FTDNNKHE.cjs.map +1 -0
  51. package/dist/{chunk-FDV7EQWH.js → chunk-GPZDP2IA.js} +21 -18
  52. package/dist/chunk-GPZDP2IA.js.map +1 -0
  53. package/dist/{chunk-I2ECTLON.cjs → chunk-HXSA6QC5.cjs} +3 -3
  54. package/dist/{chunk-I2ECTLON.cjs.map → chunk-HXSA6QC5.cjs.map} +1 -1
  55. package/dist/{chunk-DCBMTFLE.js → chunk-HZ4MBUC3.js} +3 -3
  56. package/dist/{chunk-DCBMTFLE.js.map → chunk-HZ4MBUC3.js.map} +1 -1
  57. package/dist/{chunk-U3JU6BI5.cjs → chunk-JEIW7BSV.cjs} +3 -3
  58. package/dist/{chunk-U3JU6BI5.cjs.map → chunk-JEIW7BSV.cjs.map} +1 -1
  59. package/dist/{chunk-4CUFXCC5.cjs → chunk-JIU6CVPF.cjs} +3 -3
  60. package/dist/{chunk-4CUFXCC5.cjs.map → chunk-JIU6CVPF.cjs.map} +1 -1
  61. package/dist/{chunk-56QJHQ5C.cjs → chunk-K5GQPTTA.cjs} +4 -4
  62. package/dist/{chunk-56QJHQ5C.cjs.map → chunk-K5GQPTTA.cjs.map} +1 -1
  63. package/dist/{chunk-XMECP2MD.js → chunk-KFEN2SRZ.js} +3 -3
  64. package/dist/{chunk-XMECP2MD.js.map → chunk-KFEN2SRZ.js.map} +1 -1
  65. package/dist/{chunk-EKRT7K2K.js → chunk-KLLRTTC5.js} +11 -11
  66. package/dist/chunk-KLLRTTC5.js.map +1 -0
  67. package/dist/{chunk-L6D4CKLV.cjs → chunk-KOISIOUB.cjs} +103 -3
  68. package/dist/chunk-KOISIOUB.cjs.map +1 -0
  69. package/dist/{chunk-IYXCFIMP.js → chunk-LCCJIEPO.js} +10 -10
  70. package/dist/chunk-LCCJIEPO.js.map +1 -0
  71. package/dist/{chunk-LZU7YBXG.js → chunk-LZVPVY5P.js} +168 -9
  72. package/dist/chunk-LZVPVY5P.js.map +1 -0
  73. package/dist/{chunk-YMHOF6WA.cjs → chunk-MYAU2ZUC.cjs} +3 -3
  74. package/dist/{chunk-YMHOF6WA.cjs.map → chunk-MYAU2ZUC.cjs.map} +1 -1
  75. package/dist/{chunk-JHGMZX4I.cjs → chunk-NFKX6QJP.cjs} +5 -5
  76. package/dist/{chunk-JHGMZX4I.cjs.map → chunk-NFKX6QJP.cjs.map} +1 -1
  77. package/dist/{chunk-KVE7PQ5P.cjs → chunk-NPW226H5.cjs} +8 -8
  78. package/dist/{chunk-KVE7PQ5P.cjs.map → chunk-NPW226H5.cjs.map} +1 -1
  79. package/dist/{chunk-EPQPUFS6.cjs → chunk-NYJIXR4Y.cjs} +6 -6
  80. package/dist/chunk-NYJIXR4Y.cjs.map +1 -0
  81. package/dist/{chunk-FDUA6OGN.js → chunk-PFKRHNYV.js} +8 -8
  82. package/dist/chunk-PFKRHNYV.js.map +1 -0
  83. package/dist/{chunk-ZZJ4ZVYR.cjs → chunk-PJ6CC53R.cjs} +3 -3
  84. package/dist/{chunk-ZZJ4ZVYR.cjs.map → chunk-PJ6CC53R.cjs.map} +1 -1
  85. package/dist/{chunk-N3Y43KOB.js → chunk-Q4NRKKIW.js} +11 -4
  86. package/dist/chunk-Q4NRKKIW.js.map +1 -0
  87. package/dist/{chunk-SEPYBAML.js → chunk-RVGTI4F6.js} +3 -3
  88. package/dist/{chunk-SEPYBAML.js.map → chunk-RVGTI4F6.js.map} +1 -1
  89. package/dist/{chunk-5Y5FSR4N.js → chunk-SCXELRRZ.js} +3 -3
  90. package/dist/{chunk-5Y5FSR4N.js.map → chunk-SCXELRRZ.js.map} +1 -1
  91. package/dist/{chunk-K4S4FAYX.cjs → chunk-SNSA6NWD.cjs} +4 -4
  92. package/dist/{chunk-K4S4FAYX.cjs.map → chunk-SNSA6NWD.cjs.map} +1 -1
  93. package/dist/{chunk-XWYKLEKG.js → chunk-SRMTRD7F.js} +10 -4
  94. package/dist/chunk-SRMTRD7F.js.map +1 -0
  95. package/dist/{chunk-AESFOMSH.js → chunk-SZ6H4RJG.js} +103 -3
  96. package/dist/chunk-SZ6H4RJG.js.map +1 -0
  97. package/dist/{chunk-5U6GETAW.js → chunk-TQDZLRIE.js} +3 -3
  98. package/dist/chunk-TQDZLRIE.js.map +1 -0
  99. package/dist/{chunk-QGZC43L7.js → chunk-UBOVDAD7.js} +4 -4
  100. package/dist/{chunk-QGZC43L7.js.map → chunk-UBOVDAD7.js.map} +1 -1
  101. package/dist/{chunk-7L7OPISJ.cjs → chunk-UEDTZYGI.cjs} +11 -5
  102. package/dist/chunk-UEDTZYGI.cjs.map +1 -0
  103. package/dist/{chunk-DG7KE4YJ.cjs → chunk-VA3WQ5KJ.cjs} +3 -3
  104. package/dist/{chunk-DG7KE4YJ.cjs.map → chunk-VA3WQ5KJ.cjs.map} +1 -1
  105. package/dist/{chunk-H7QSGFMZ.cjs → chunk-VKNCQIVN.cjs} +11 -4
  106. package/dist/chunk-VKNCQIVN.cjs.map +1 -0
  107. package/dist/{chunk-XO3WLK65.js → chunk-VVDE4CHU.js} +3 -3
  108. package/dist/{chunk-XO3WLK65.js.map → chunk-VVDE4CHU.js.map} +1 -1
  109. package/dist/{chunk-XS35KPBZ.cjs → chunk-WIAQQNFU.cjs} +4 -4
  110. package/dist/{chunk-XS35KPBZ.cjs.map → chunk-WIAQQNFU.cjs.map} +1 -1
  111. package/dist/{chunk-QHTDWIED.js → chunk-WKUDITGD.js} +4 -4
  112. package/dist/{chunk-QHTDWIED.js.map → chunk-WKUDITGD.js.map} +1 -1
  113. package/dist/{chunk-BOOJDRJO.js → chunk-WSNMQQ4P.js} +38 -3
  114. package/dist/chunk-WSNMQQ4P.js.map +1 -0
  115. package/dist/{chunk-DWCYEPTT.js → chunk-XNU4NTVE.js} +3 -3
  116. package/dist/{chunk-DWCYEPTT.js.map → chunk-XNU4NTVE.js.map} +1 -1
  117. package/dist/{chunk-FF235PKY.cjs → chunk-XWZEECEX.cjs} +3 -3
  118. package/dist/chunk-XWZEECEX.cjs.map +1 -0
  119. package/dist/{chunk-26DPQUSB.cjs → chunk-ZONEAWPR.cjs} +12 -12
  120. package/dist/chunk-ZONEAWPR.cjs.map +1 -0
  121. package/dist/{chunk-U5TTXN45.cjs → chunk-ZSGEGISB.cjs} +8 -6
  122. package/dist/chunk-ZSGEGISB.cjs.map +1 -0
  123. package/dist/components/Alert/index.cjs +5 -5
  124. package/dist/components/Alert/index.js +1 -1
  125. package/dist/components/AudioPlayer/index.cjs +6 -6
  126. package/dist/components/AudioPlayer/index.js +1 -1
  127. package/dist/components/Autocomplete/index.cjs +3 -3
  128. package/dist/components/Autocomplete/index.js +2 -2
  129. package/dist/components/Avatar/index.cjs +5 -5
  130. package/dist/components/Avatar/index.js +1 -1
  131. package/dist/components/Breadcrumb/index.cjs +3 -3
  132. package/dist/components/Breadcrumb/index.js +1 -1
  133. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  134. package/dist/components/CountryCodeDropdown/index.js +2 -2
  135. package/dist/components/DateInput/index.cjs +3 -3
  136. package/dist/components/DateInput/index.js +2 -2
  137. package/dist/components/Dropdown/index.cjs +12 -8
  138. package/dist/components/Dropdown/index.d.cts +38 -2
  139. package/dist/components/Dropdown/index.d.ts +38 -2
  140. package/dist/components/Dropdown/index.js +2 -2
  141. package/dist/components/FloatingWindow/index.cjs +3 -3
  142. package/dist/components/FloatingWindow/index.js +1 -1
  143. package/dist/components/GlossaryTooltip/index.cjs +3 -3
  144. package/dist/components/GlossaryTooltip/index.js +2 -2
  145. package/dist/components/Markdown/index.cjs +9 -9
  146. package/dist/components/Markdown/index.js +3 -3
  147. package/dist/components/MediaEditor/index.cjs +9 -9
  148. package/dist/components/MediaEditor/index.js +4 -4
  149. package/dist/components/Pagination/index.cjs +4 -4
  150. package/dist/components/Pagination/index.js +1 -1
  151. package/dist/components/QuickAction/index.cjs +6 -6
  152. package/dist/components/QuickAction/index.js +1 -1
  153. package/dist/components/RichTextEditor/index.cjs +6 -6
  154. package/dist/components/RichTextEditor/index.js +3 -3
  155. package/dist/components/SectionSpyNav/index.cjs +2 -2
  156. package/dist/components/SectionSpyNav/index.js +1 -1
  157. package/dist/components/Select/index.cjs +4 -4
  158. package/dist/components/Select/index.js +2 -2
  159. package/dist/components/Slider/index.cjs +5 -5
  160. package/dist/components/Slider/index.js +1 -1
  161. package/dist/components/SourceTip/index.cjs +3 -3
  162. package/dist/components/SourceTip/index.js +2 -2
  163. package/dist/components/SuperChat/index.cjs +263 -105
  164. package/dist/components/SuperChat/index.cjs.map +1 -1
  165. package/dist/components/SuperChat/index.d.cts +13 -5
  166. package/dist/components/SuperChat/index.d.ts +13 -5
  167. package/dist/components/SuperChat/index.js +254 -96
  168. package/dist/components/SuperChat/index.js.map +1 -1
  169. package/dist/components/SuperChat/plugins/index.cjs +6 -6
  170. package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
  171. package/dist/components/SuperChat/plugins/index.d.cts +2 -2
  172. package/dist/components/SuperChat/plugins/index.d.ts +2 -2
  173. package/dist/components/SuperChat/plugins/index.js +5 -5
  174. package/dist/components/SuperChat/plugins/index.js.map +1 -1
  175. package/dist/components/TranscriptView/index.cjs +3 -3
  176. package/dist/components/TranscriptView/index.js +1 -1
  177. package/dist/esheet.cjs +7 -7
  178. package/dist/esheet.js +4 -4
  179. package/dist/hooks/index.cjs +2 -2
  180. package/dist/hooks/index.d.cts +1 -1
  181. package/dist/hooks/index.d.ts +1 -1
  182. package/dist/hooks/index.js +1 -1
  183. package/dist/index.cjs +772 -734
  184. package/dist/index.cjs.map +1 -1
  185. package/dist/index.d.cts +52 -15
  186. package/dist/index.d.ts +52 -15
  187. package/dist/index.js +527 -494
  188. package/dist/index.js.map +1 -1
  189. package/dist/styles/init.css +25 -0
  190. package/dist/styles.css +1 -1
  191. package/dist/tailwind-preset.cjs +4 -4
  192. package/dist/tailwind-preset.js +1 -1
  193. package/dist/{types-BoTeTPdH.d.ts → types-9vK_YdEb.d.ts} +12 -1
  194. package/dist/{types-DyIB9HYT.d.cts → types-DZDroUW8.d.cts} +12 -1
  195. package/dist/{useAnchoredPosition-C7PNglzD.d.ts → useAnchoredPosition-CKwLSQW8.d.cts} +10 -3
  196. package/dist/{useAnchoredPosition-C7PNglzD.d.cts → useAnchoredPosition-CKwLSQW8.d.ts} +10 -3
  197. package/package.json +5 -2
  198. package/dist/CsvBlock-OTFG3PYZ.cjs +0 -15
  199. package/dist/CsvBlock-PUSTBQ5B.js +0 -6
  200. package/dist/SurveyBlock-JLHS3YQD.js +0 -6
  201. package/dist/SurveyBlock-M2ZRTGVJ.cjs +0 -15
  202. package/dist/chunk-26DPQUSB.cjs.map +0 -1
  203. package/dist/chunk-4AE2L6AO.cjs.map +0 -1
  204. package/dist/chunk-5JZIDILK.cjs.map +0 -1
  205. package/dist/chunk-5U6GETAW.js.map +0 -1
  206. package/dist/chunk-6EWJGRC3.js.map +0 -1
  207. package/dist/chunk-7L7OPISJ.cjs.map +0 -1
  208. package/dist/chunk-AESFOMSH.js.map +0 -1
  209. package/dist/chunk-BOOJDRJO.js.map +0 -1
  210. package/dist/chunk-BOW7ZGI2.cjs.map +0 -1
  211. package/dist/chunk-EKRT7K2K.js.map +0 -1
  212. package/dist/chunk-EPQPUFS6.cjs.map +0 -1
  213. package/dist/chunk-FDUA6OGN.js.map +0 -1
  214. package/dist/chunk-FDV7EQWH.js.map +0 -1
  215. package/dist/chunk-FF235PKY.cjs.map +0 -1
  216. package/dist/chunk-H7QSGFMZ.cjs.map +0 -1
  217. package/dist/chunk-IILJGFI5.js.map +0 -1
  218. package/dist/chunk-IYXCFIMP.js.map +0 -1
  219. package/dist/chunk-JHZW3Y62.js.map +0 -1
  220. package/dist/chunk-L6D4CKLV.cjs.map +0 -1
  221. package/dist/chunk-LZU7YBXG.js.map +0 -1
  222. package/dist/chunk-MYFZYUPR.cjs.map +0 -1
  223. package/dist/chunk-N3Y43KOB.js.map +0 -1
  224. package/dist/chunk-RYQ3S3KO.cjs.map +0 -1
  225. package/dist/chunk-SK7H3Z67.cjs.map +0 -1
  226. package/dist/chunk-U5TTXN45.cjs.map +0 -1
  227. package/dist/chunk-XWYKLEKG.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Markdown/SurveyBlock.tsx"],"names":["useState","useEffect","jsx","FenceBlock","jsxs"],"mappings":"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","file":"chunk-4CUFXCC5.cjs","sourcesContent":["/** Survey/questionnaire preview from JSON or YAML. Requires `js-yaml` for YAML input. */\nimport React, { useEffect, useState } from 'react';\n\nimport { FenceBlock } from './FenceBlock';\n\ninterface SurveyBlockProps {\n code: string;\n id: string;\n}\n\ninterface SurveyField {\n type: string;\n name: string;\n title?: string;\n label?: string;\n choices?: Array<string | { value: string; text: string }>;\n isRequired?: boolean;\n}\n\ninterface ParsedSurvey {\n fields: SurveyField[];\n error: string | null;\n}\n\ntype YamlLoadFn = (input: string) => unknown;\nlet yamlPromise: Promise<YamlLoadFn> | null = null;\nfunction loadYaml(): Promise<YamlLoadFn> {\n if (!yamlPromise) {\n yamlPromise = import(/* @vite-ignore */ 'js-yaml')\n .then((mod) => {\n const api =\n (mod as { default?: { load?: YamlLoadFn }; load?: YamlLoadFn })\n .default ?? mod;\n const load = (api as { load?: YamlLoadFn }).load;\n if (typeof load !== 'function')\n throw new Error('js-yaml load not found');\n return load;\n })\n .catch((err) => {\n yamlPromise = null;\n throw err;\n });\n }\n return yamlPromise;\n}\n\nfunction tryParseJson(\n code: string\n): { ok: true; data: unknown } | { ok: false } {\n try {\n return { ok: true, data: JSON.parse(code) };\n } catch {\n return { ok: false };\n }\n}\n\nfunction elementsToParsed(data: unknown): ParsedSurvey {\n if (!data || typeof data !== 'object') {\n return { fields: [], error: 'Invalid survey data format' };\n }\n const obj = data as Record<string, unknown>;\n\n let elements: unknown[] = [];\n if (Array.isArray(obj.pages)) {\n for (const page of obj.pages as Array<Record<string, unknown>>) {\n if (Array.isArray(page.elements)) {\n elements = elements.concat(page.elements);\n }\n }\n } else if (Array.isArray(obj.elements)) {\n elements = obj.elements;\n } else if (Array.isArray(obj.questions)) {\n elements = obj.questions;\n } else if (Array.isArray(obj.fields)) {\n elements = obj.fields;\n } else {\n return { fields: [], error: 'No survey questions found in data' };\n }\n\n return { fields: elements as SurveyField[], error: null };\n}\n\nexport const SurveyBlock: React.FC<SurveyBlockProps> = ({ code, id }) => {\n const [parsed, setParsed] = useState<ParsedSurvey | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const jsonResult = tryParseJson(code);\n if (jsonResult.ok) {\n setParsed(elementsToParsed(jsonResult.data));\n return;\n }\n\n loadYaml()\n .then((load) => {\n try {\n const data = load(code);\n if (!cancelled) setParsed(elementsToParsed(data));\n } catch (err) {\n if (!cancelled)\n setParsed({\n fields: [],\n error: `Failed to parse survey data: ${(err as Error).message}`,\n });\n }\n })\n .catch(() => {\n if (!cancelled)\n setParsed({\n fields: [],\n error:\n 'Survey preview requires the `js-yaml` package for YAML input. Install it with `npm install js-yaml`.',\n });\n });\n return () => {\n cancelled = true;\n };\n }, [code]);\n\n if (!parsed) {\n return (\n <FenceBlock code={code} language=\"survey\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading survey…\n </div>\n </FenceBlock>\n );\n }\n\n const { fields, error } = parsed;\n\n return (\n <FenceBlock\n code={code}\n language=\"survey\"\n supportsRawView\n error={error ?? undefined}\n >\n <div className=\"space-y-4 p-4\">\n <h4 className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\">\n Survey Preview\n </h4>\n {fields.map((field, i) => {\n const fieldId = `${id}-field-${field.name ?? i}`;\n return (\n <div key={field.name ?? i} className=\"space-y-1.5\">\n <label\n htmlFor={fieldId}\n className=\"block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {field.title ?? field.label ?? field.name}\n {field.isRequired && (\n <span className=\"ml-1 text-red-500\">*</span>\n )}\n </label>\n\n {(field.type === 'radiogroup' || field.type === 'radio') &&\n field.choices && (\n <div className=\"space-y-1\">\n {field.choices.map((choice, ci) => {\n const value =\n typeof choice === 'string' ? choice : choice.value;\n const text =\n typeof choice === 'string' ? choice : choice.text;\n return (\n <label\n key={ci}\n className=\"flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400\"\n >\n <input\n type=\"radio\"\n name={`${id}-${field.name}`}\n value={value}\n disabled\n className=\"accent-primary-500\"\n />\n {text}\n </label>\n );\n })}\n </div>\n )}\n\n {(field.type === 'checkbox' || field.type === 'boolean') && (\n <input\n id={fieldId}\n type=\"checkbox\"\n disabled\n className=\"accent-primary-500\"\n />\n )}\n\n {(field.type === 'text' || field.type === 'comment') && (\n <input\n id={fieldId}\n type=\"text\"\n disabled\n placeholder={field.title ?? field.name}\n className=\"w-full rounded-md border border-neutral-300 bg-neutral-100 px-3 py-1.5 text-sm dark:border-neutral-600 dark:bg-neutral-800\"\n />\n )}\n\n {field.type === 'rating' && (\n <div\n role=\"img\"\n className=\"flex gap-1\"\n aria-label=\"Rating: 0 out of 5\"\n >\n {[1, 2, 3, 4, 5].map((n) => (\n <span\n key={n}\n aria-hidden=\"true\"\n className=\"text-lg text-neutral-500 dark:text-neutral-500\"\n >\n ★\n </span>\n ))}\n </div>\n )}\n\n {field.type === 'dropdown' && field.choices && (\n <select\n id={fieldId}\n name={fieldId}\n disabled\n className=\"w-full rounded-md border border-neutral-300 bg-neutral-100 px-3 py-1.5 text-sm dark:border-neutral-600 dark:bg-neutral-800\"\n >\n {field.choices.map((choice, ci) => {\n const value =\n typeof choice === 'string' ? choice : choice.value;\n const text =\n typeof choice === 'string' ? choice : choice.text;\n return (\n <option key={ci} value={value}>\n {text}\n </option>\n );\n })}\n </select>\n )}\n </div>\n );\n })}\n <p className=\"text-xs text-neutral-600 dark:text-neutral-400\">\n This is a preview. Interactive survey support coming soon.\n </p>\n </div>\n </FenceBlock>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Markdown/SurveyBlock.tsx"],"names":["useState","useEffect","jsx","FenceBlock","jsxs"],"mappings":"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","file":"chunk-JIU6CVPF.cjs","sourcesContent":["/** Survey/questionnaire preview from JSON or YAML. Requires `js-yaml` for YAML input. */\nimport React, { useEffect, useState } from 'react';\n\nimport { FenceBlock } from './FenceBlock';\n\ninterface SurveyBlockProps {\n code: string;\n id: string;\n}\n\ninterface SurveyField {\n type: string;\n name: string;\n title?: string;\n label?: string;\n choices?: Array<string | { value: string; text: string }>;\n isRequired?: boolean;\n}\n\ninterface ParsedSurvey {\n fields: SurveyField[];\n error: string | null;\n}\n\ntype YamlLoadFn = (input: string) => unknown;\nlet yamlPromise: Promise<YamlLoadFn> | null = null;\nfunction loadYaml(): Promise<YamlLoadFn> {\n if (!yamlPromise) {\n yamlPromise = import(/* @vite-ignore */ 'js-yaml')\n .then((mod) => {\n const api =\n (mod as { default?: { load?: YamlLoadFn }; load?: YamlLoadFn })\n .default ?? mod;\n const load = (api as { load?: YamlLoadFn }).load;\n if (typeof load !== 'function')\n throw new Error('js-yaml load not found');\n return load;\n })\n .catch((err) => {\n yamlPromise = null;\n throw err;\n });\n }\n return yamlPromise;\n}\n\nfunction tryParseJson(\n code: string\n): { ok: true; data: unknown } | { ok: false } {\n try {\n return { ok: true, data: JSON.parse(code) };\n } catch {\n return { ok: false };\n }\n}\n\nfunction elementsToParsed(data: unknown): ParsedSurvey {\n if (!data || typeof data !== 'object') {\n return { fields: [], error: 'Invalid survey data format' };\n }\n const obj = data as Record<string, unknown>;\n\n let elements: unknown[] = [];\n if (Array.isArray(obj.pages)) {\n for (const page of obj.pages as Array<Record<string, unknown>>) {\n if (Array.isArray(page.elements)) {\n elements = elements.concat(page.elements);\n }\n }\n } else if (Array.isArray(obj.elements)) {\n elements = obj.elements;\n } else if (Array.isArray(obj.questions)) {\n elements = obj.questions;\n } else if (Array.isArray(obj.fields)) {\n elements = obj.fields;\n } else {\n return { fields: [], error: 'No survey questions found in data' };\n }\n\n return { fields: elements as SurveyField[], error: null };\n}\n\nexport const SurveyBlock: React.FC<SurveyBlockProps> = ({ code, id }) => {\n const [parsed, setParsed] = useState<ParsedSurvey | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const jsonResult = tryParseJson(code);\n if (jsonResult.ok) {\n setParsed(elementsToParsed(jsonResult.data));\n return;\n }\n\n loadYaml()\n .then((load) => {\n try {\n const data = load(code);\n if (!cancelled) setParsed(elementsToParsed(data));\n } catch (err) {\n if (!cancelled)\n setParsed({\n fields: [],\n error: `Failed to parse survey data: ${(err as Error).message}`,\n });\n }\n })\n .catch(() => {\n if (!cancelled)\n setParsed({\n fields: [],\n error:\n 'Survey preview requires the `js-yaml` package for YAML input. Install it with `npm install js-yaml`.',\n });\n });\n return () => {\n cancelled = true;\n };\n }, [code]);\n\n if (!parsed) {\n return (\n <FenceBlock code={code} language=\"survey\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading survey…\n </div>\n </FenceBlock>\n );\n }\n\n const { fields, error } = parsed;\n\n return (\n <FenceBlock\n code={code}\n language=\"survey\"\n supportsRawView\n error={error ?? undefined}\n >\n <div className=\"space-y-4 p-4\">\n <h4 className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\">\n Survey Preview\n </h4>\n {fields.map((field, i) => {\n const fieldId = `${id}-field-${field.name ?? i}`;\n return (\n <div key={field.name ?? i} className=\"space-y-1.5\">\n <label\n htmlFor={fieldId}\n className=\"block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {field.title ?? field.label ?? field.name}\n {field.isRequired && (\n <span className=\"ms-1 text-red-500\">*</span>\n )}\n </label>\n\n {(field.type === 'radiogroup' || field.type === 'radio') &&\n field.choices && (\n <div className=\"space-y-1\">\n {field.choices.map((choice, ci) => {\n const value =\n typeof choice === 'string' ? choice : choice.value;\n const text =\n typeof choice === 'string' ? choice : choice.text;\n return (\n <label\n key={ci}\n className=\"flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400\"\n >\n <input\n type=\"radio\"\n name={`${id}-${field.name}`}\n value={value}\n disabled\n className=\"accent-primary-500\"\n />\n {text}\n </label>\n );\n })}\n </div>\n )}\n\n {(field.type === 'checkbox' || field.type === 'boolean') && (\n <input\n id={fieldId}\n type=\"checkbox\"\n disabled\n className=\"accent-primary-500\"\n />\n )}\n\n {(field.type === 'text' || field.type === 'comment') && (\n <input\n id={fieldId}\n type=\"text\"\n disabled\n placeholder={field.title ?? field.name}\n className=\"w-full rounded-md border border-neutral-300 bg-neutral-100 px-3 py-1.5 text-sm dark:border-neutral-600 dark:bg-neutral-800\"\n />\n )}\n\n {field.type === 'rating' && (\n <div\n role=\"img\"\n className=\"flex gap-1\"\n aria-label=\"Rating: 0 out of 5\"\n >\n {[1, 2, 3, 4, 5].map((n) => (\n <span\n key={n}\n aria-hidden=\"true\"\n className=\"text-lg text-neutral-500 dark:text-neutral-500\"\n >\n ★\n </span>\n ))}\n </div>\n )}\n\n {field.type === 'dropdown' && field.choices && (\n <select\n id={fieldId}\n name={fieldId}\n disabled\n className=\"w-full rounded-md border border-neutral-300 bg-neutral-100 px-3 py-1.5 text-sm dark:border-neutral-600 dark:bg-neutral-800\"\n >\n {field.choices.map((choice, ci) => {\n const value =\n typeof choice === 'string' ? choice : choice.value;\n const text =\n typeof choice === 'string' ? choice : choice.text;\n return (\n <option key={ci} value={value}>\n {text}\n </option>\n );\n })}\n </select>\n )}\n </div>\n );\n })}\n <p className=\"text-xs text-neutral-600 dark:text-neutral-400\">\n This is a preview. Interactive survey support coming soon.\n </p>\n </div>\n </FenceBlock>\n );\n};\n"]}
@@ -3,7 +3,7 @@
3
3
  var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
4
4
  var chunkFHY3K6PL_cjs = require('./chunk-FHY3K6PL.cjs');
5
5
  var chunkFSGEDDF2_cjs = require('./chunk-FSGEDDF2.cjs');
6
- var chunkMYFZYUPR_cjs = require('./chunk-MYFZYUPR.cjs');
6
+ var chunkAOHJILLU_cjs = require('./chunk-AOHJILLU.cjs');
7
7
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
8
8
  var React = require('react');
9
9
  var reactDom = require('react-dom');
@@ -221,7 +221,7 @@ function Select(props) {
221
221
  anchorRef,
222
222
  floatingRef,
223
223
  style: dropdownStyle
224
- } = chunkMYFZYUPR_cjs.useAnchoredPosition({
224
+ } = chunkAOHJILLU_cjs.useAnchoredPosition({
225
225
  open: isOpen,
226
226
  matchWidth: true,
227
227
  maxHeight: 300
@@ -681,5 +681,5 @@ function CheckIcon({ className }) {
681
681
 
682
682
  exports.Select = Select;
683
683
  exports.selectTriggerVariants = selectTriggerVariants;
684
- //# sourceMappingURL=chunk-56QJHQ5C.cjs.map
685
- //# sourceMappingURL=chunk-56QJHQ5C.cjs.map
684
+ //# sourceMappingURL=chunk-K5GQPTTA.cjs.map
685
+ //# sourceMappingURL=chunk-K5GQPTTA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Select/Select.tsx"],"names":["cva","React","useClickOutside","useEscapeKey","useAnchoredPosition","jsx","RequiredMark","jsxs","cn","createPortal"],"mappings":"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","file":"chunk-56QJHQ5C.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { RequiredMark, type RequiredMarkVariant } from '../Input';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectOption {\n /** Unique value for the option */\n value: string;\n /** Display label for the option */\n label: string;\n /** Whether the option is disabled */\n disabled?: boolean;\n /** Optional group this option belongs to */\n group?: string;\n}\n\nexport interface SelectGroup {\n /** Group label */\n label: string;\n /** Options in this group */\n options: SelectOption[];\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst selectTriggerVariants = cva(\n [\n 'flex w-full items-center justify-between gap-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-3 text-base',\n lg: 'h-12 px-4 text-lg',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer',\n },\n },\n compoundVariants: [\n { labelVariant: 'floating', size: 'sm', className: 'h-11' },\n { labelVariant: 'floating', size: 'md', className: 'h-14' },\n { labelVariant: 'floating', size: 'lg', className: 'h-16' },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n labelVariant: 'stacked',\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n size: {\n sm: [\n 'peer-focus:top-0.5 peer-focus:translate-y-0 peer-focus:text-[0.65rem]',\n ],\n md: ['peer-focus:top-1 peer-focus:translate-y-0 peer-focus:text-xs'],\n lg: ['peer-focus:top-1.5 peer-focus:translate-y-0 peer-focus:text-sm'],\n },\n floated: {\n true: '',\n false: 'top-1/2 -translate-y-1/2',\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n compoundVariants: [\n { size: 'sm', floated: false, className: 'text-sm' },\n { size: 'md', floated: false, className: 'text-base' },\n { size: 'lg', floated: false, className: 'text-lg' },\n {\n size: 'sm',\n floated: true,\n className: 'top-0.5 translate-y-0 text-[0.65rem]',\n },\n { size: 'md', floated: true, className: 'top-1 translate-y-0 text-xs' },\n { size: 'lg', floated: true, className: 'top-1.5 translate-y-0 text-sm' },\n ],\n defaultVariants: {\n size: 'md',\n floated: false,\n hasError: false,\n },\n }\n);\n\nconst floatingValuePadding = {\n sm: 'pt-4 pb-1',\n md: 'pt-5 pb-1.5',\n lg: 'pt-6 pb-2',\n} as const;\n\n// ============================================================================\n// Select Component\n// ============================================================================\n\n/**\n * Props shared by both single- and multiple-selection modes. Exported so\n * wrapper components can extend the common shape (`SelectProps` itself is a\n * discriminated union, which interfaces cannot extend).\n */\nexport interface SelectBaseProps extends Omit<\n VariantProps<typeof selectTriggerVariants>,\n 'labelVariant'\n> {\n /** Array of options or groups */\n options: (SelectOption | SelectGroup)[];\n /** Placeholder text */\n placeholder?: string;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Label for the select */\n label?: string;\n /** Hide the label visually */\n hideLabel?: boolean;\n /**\n * Visual style of the label.\n * - `stacked` (default): label sits above the trigger.\n * - `floating`: label rests inside the trigger like a placeholder and\n * floats up (staying inside the trigger) when open or a value is\n * selected. The `placeholder` prop is ignored in this mode.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Error message */\n error?: string;\n /** Helper text */\n helperText?: string;\n /** Whether a selection is required (shows an asterisk next to the label) */\n required?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n /** Enable search/filter */\n searchable?: boolean;\n /** Search placeholder */\n searchPlaceholder?: string;\n /** No results text */\n noResultsText?: string;\n /** Accessible label for the trigger (used when no `label` prop is provided) */\n 'aria-label'?: string;\n /** Additional class name */\n className?: string;\n /** ID for the select */\n id?: string;\n}\n\nexport interface SelectSingleProps extends SelectBaseProps {\n /** Single-selection mode (default). */\n multiple?: false;\n /** Controlled value */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string) => void;\n}\n\nexport interface SelectMultipleProps extends SelectBaseProps {\n /** Multiple-selection mode: selecting an option toggles it and keeps the dropdown open. */\n multiple: true;\n /** Controlled values */\n value?: string[];\n /** Default values (uncontrolled) */\n defaultValue?: string[];\n /** Callback when values change */\n onValueChange?: (value: string[]) => void;\n}\n\nexport type SelectProps = SelectSingleProps | SelectMultipleProps;\n\n/**\n * An accessible select/dropdown component with search support.\n *\n * @example\n * ```tsx\n * <Select\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'uk', label: 'United Kingdom' },\n * ]}\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Multiple selection — value/onValueChange use string[]\n * <Select\n * multiple\n * label=\"Symptoms\"\n * options={options}\n * onValueChange={(values) => console.log(values)}\n * />\n * ```\n */\nfunction Select(props: SelectProps) {\n const {\n options,\n placeholder = 'Select an option',\n disabled = false,\n label,\n hideLabel = false,\n labelVariant = 'stacked',\n error,\n helperText,\n required = false,\n requiredVariant,\n size,\n hasError,\n 'aria-label': ariaLabel,\n searchable = false,\n searchPlaceholder = 'Search...',\n noResultsText = 'No results found',\n className,\n id,\n } = props;\n const multiple = props.multiple === true;\n // The discriminated union types onValueChange as either a string or string[]\n // callback; widen it once here so handlers can use it without referencing\n // the whole `props` object. Runtime calls stay consistent with `multiple`.\n const onValueChange = props.onValueChange as\n | ((value: string | string[]) => void)\n | undefined;\n const [isOpen, setIsOpen] = React.useState(false);\n const [uncontrolledValues, setUncontrolledValues] = React.useState<string[]>(\n () => toValueArray(props.defaultValue)\n );\n const [searchQuery, setSearchQuery] = React.useState('');\n const [highlightedIndex, setHighlightedIndex] = React.useState(-1);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement>(null);\n const typeaheadRef = React.useRef<{ query: string; timer: number | null }>({\n query: '',\n timer: null,\n });\n\n const generatedId = React.useId();\n const selectId = id || generatedId;\n const listboxId = `${selectId}-listbox`;\n const errorId = `${selectId}-error`;\n const helperId = `${selectId}-helper`;\n\n const isControlled = props.value !== undefined;\n const controlledValue = props.value;\n // Memoize the controlled normalization: toValueArray allocates a fresh\n // array when value is a string, which would otherwise churn callback\n // identities (handleValueChange depends on selectedValues) every render.\n const controlledValues = React.useMemo(\n () => toValueArray(controlledValue),\n [controlledValue]\n );\n const selectedValues = isControlled ? controlledValues : uncontrolledValues;\n\n // Flatten options for easy access\n const flatOptions = React.useMemo(() => {\n const result: SelectOption[] = [];\n for (const item of options) {\n if ('options' in item) {\n result.push(...item.options);\n } else {\n result.push(item);\n }\n }\n return result;\n }, [options]);\n\n // Filter options based on search query\n const filteredOptions = React.useMemo(() => {\n if (!searchQuery) return options;\n\n const query = searchQuery.toLowerCase();\n const result: (SelectOption | SelectGroup)[] = [];\n\n for (const item of options) {\n if ('options' in item) {\n const filteredGroupOptions = item.options.filter((opt) =>\n opt.label.toLowerCase().includes(query)\n );\n if (filteredGroupOptions.length > 0) {\n result.push({ ...item, options: filteredGroupOptions });\n }\n } else {\n if (item.label.toLowerCase().includes(query)) {\n result.push(item);\n }\n }\n }\n\n return result;\n }, [options, searchQuery]);\n\n // Get filtered flat options for keyboard navigation\n const filteredFlatOptions = React.useMemo(() => {\n const result: SelectOption[] = [];\n for (const item of filteredOptions) {\n if ('options' in item) {\n result.push(...item.options.filter((opt) => !opt.disabled));\n } else if (!item.disabled) {\n result.push(item);\n }\n }\n return result;\n }, [filteredOptions]);\n\n // Get selected options (in selection order)\n const selectedOptions = selectedValues\n .map((v) => flatOptions.find((opt) => opt.value === v))\n .filter((opt): opt is SelectOption => opt !== undefined);\n const hasSelection = selectedOptions.length > 0;\n const displayLabel = selectedOptions.map((opt) => opt.label).join(', ');\n\n // Close dropdown on click outside (handles both container and portaled dropdown)\n const outsideRefs = React.useMemo(() => [containerRef, dropdownRef], []);\n useClickOutside(outsideRefs, () => setIsOpen(false), isOpen);\n\n useEscapeKey(() => {\n if (isOpen) {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n }, isOpen);\n\n // Track trigger position for portal dropdown\n const {\n anchorRef,\n floatingRef,\n style: dropdownStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open: isOpen,\n matchWidth: true,\n maxHeight: 300,\n });\n\n // Handle option selection: single mode replaces and closes; multiple mode\n // toggles the option and keeps the dropdown open.\n const handleValueChange = React.useCallback(\n (optionValue: string) => {\n if (multiple) {\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n if (!isControlled) {\n setUncontrolledValues(next);\n }\n onValueChange?.(next);\n // The dropdown stays open; a mouse click focuses the option <li>,\n // which only handles Enter/Space. Restore focus so arrow-key\n // navigation and typeahead keep working.\n if (searchable) {\n searchInputRef.current?.focus();\n } else {\n triggerRef.current?.focus();\n }\n return;\n }\n if (!isControlled) {\n setUncontrolledValues([optionValue]);\n }\n onValueChange?.(optionValue);\n setIsOpen(false);\n setSearchQuery('');\n triggerRef.current?.focus();\n },\n [isControlled, multiple, onValueChange, searchable, selectedValues]\n );\n\n // Handle keyboard navigation\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n // Typeahead (native-select style): when not using the dedicated search\n // input, typing printable characters jumps to the first option whose\n // label starts with the typed string. Repeating the same key cycles\n // through matches. The buffer clears after a short pause.\n if (\n !searchable &&\n e.key.length === 1 &&\n e.key !== ' ' &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.altKey\n ) {\n e.preventDefault();\n if (!isOpen) setIsOpen(true);\n\n const hadPendingQuery = typeaheadRef.current.query !== '';\n if (typeaheadRef.current.timer !== null) {\n window.clearTimeout(typeaheadRef.current.timer);\n }\n const query = (typeaheadRef.current.query + e.key).toLowerCase();\n typeaheadRef.current.query = query;\n typeaheadRef.current.timer = window.setTimeout(() => {\n typeaheadRef.current.query = '';\n typeaheadRef.current.timer = null;\n }, 600);\n\n const len = filteredFlatOptions.length;\n if (len > 0) {\n const allSameChar = query.split('').every((c) => c === query[0]);\n const needle = allSameChar ? query[0] : query;\n const matches = (opt: SelectOption) =>\n opt.label.toLowerCase().startsWith(needle);\n\n // A fresh keystroke (or refining a multi-char query) searches from\n // the current option inclusive so typing \"car\" stays on \"Cardiology\";\n // repeating the same key cycles to the next match.\n const startInclusive = !hadPendingQuery || !allSameChar;\n const base = startInclusive\n ? Math.max(highlightedIndex, 0)\n : highlightedIndex + 1;\n\n for (let i = 0; i < len; i++) {\n const idx = (base + i) % len;\n if (matches(filteredFlatOptions[idx])) {\n setHighlightedIndex(idx);\n break;\n }\n }\n }\n return;\n }\n\n // Let Space type normally in the search input (e.g. \"new york\")\n // instead of being captured by the open/select handler below.\n if (e.key === ' ' && e.target === searchInputRef.current) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setHighlightedIndex((prev) =>\n prev < filteredFlatOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredFlatOptions.length - 1\n );\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && highlightedIndex >= 0) {\n handleValueChange(filteredFlatOptions[highlightedIndex].value);\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n case 'Home':\n e.preventDefault();\n setHighlightedIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setHighlightedIndex(filteredFlatOptions.length - 1);\n break;\n }\n },\n [\n isOpen,\n highlightedIndex,\n filteredFlatOptions,\n handleValueChange,\n searchable,\n ]\n );\n\n // Focus search input when dropdown opens\n React.useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n // Reset highlighted index when search changes\n React.useEffect(() => {\n setHighlightedIndex(filteredFlatOptions.length > 0 ? 0 : -1);\n }, [searchQuery, filteredFlatOptions.length]);\n\n // Keep the highlighted option visible within the listbox during keyboard\n // navigation. We adjust only the list's own scrollTop instead of calling the\n // native scrollIntoView: the dropdown is portaled to <body> with\n // position: fixed, and scrollIntoView would also scroll ancestor/window,\n // yanking the whole page.\n React.useEffect(() => {\n if (!isOpen || highlightedIndex < 0) return;\n const list = listRef.current;\n const el = list?.querySelector<HTMLElement>('[data-highlighted=\"true\"]');\n if (!list || !el) return;\n const listRect = list.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n if (elRect.top < listRect.top) {\n list.scrollTop -= listRect.top - elRect.top;\n } else if (elRect.bottom > listRect.bottom) {\n list.scrollTop += elRect.bottom - listRect.bottom;\n }\n }, [highlightedIndex, isOpen]);\n\n // Reset the typeahead buffer whenever the dropdown closes (Escape, click\n // outside, selection) so a stale query doesn't carry over on a quick reopen,\n // and clear any pending timer on unmount.\n const resetTypeahead = React.useCallback(() => {\n if (typeaheadRef.current.timer !== null) {\n window.clearTimeout(typeaheadRef.current.timer);\n typeaheadRef.current.timer = null;\n }\n typeaheadRef.current.query = '';\n }, []);\n\n React.useEffect(() => {\n if (!isOpen) resetTypeahead();\n }, [isOpen, resetTypeahead]);\n\n React.useEffect(() => resetTypeahead, [resetTypeahead]);\n\n // Build aria-describedby\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n const isFloated = isOpen || hasSelection;\n const resolvedSize = size ?? 'md';\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n return (\n <div\n data-slot=\"select-wrapper\"\n className={cn('flex flex-col gap-1.5', className)}\n >\n {label && !isFloating && (\n <label\n data-slot=\"select-label\"\n htmlFor={selectId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n\n <div ref={containerRef} className=\"relative\">\n {/* Trigger Button */}\n <button\n data-slot=\"select-trigger\"\n ref={(node) => {\n triggerRef.current = node;\n anchorRef.current = node;\n }}\n id={selectId}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n // Only reference the listbox while it exists in the DOM (it is\n // portaled and unmounted when closed) so the ID is always valid.\n aria-controls={isOpen ? listboxId : undefined}\n aria-invalid={hasError || !!error}\n aria-required={required || undefined}\n aria-label={!label ? ariaLabel : undefined}\n aria-describedby={describedByIds || undefined}\n disabled={disabled}\n onClick={() => setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n className={cn(\n selectTriggerVariants({\n size,\n hasError: hasError || !!error,\n labelVariant: isFloating ? 'floating' : 'stacked',\n })\n )}\n >\n <span\n className={cn(\n 'truncate',\n !hasSelection && 'text-muted-foreground',\n isFloating && floatingValuePadding[resolvedSize]\n )}\n >\n {isFloating\n ? hasSelection\n ? displayLabel\n : '\\u00A0'\n : hasSelection\n ? displayLabel\n : placeholder}\n </span>\n <ChevronDownIcon\n className={cn(\n 'text-muted-foreground h-4 w-4 shrink-0 transition-transform',\n isOpen && 'rotate-180'\n )}\n />\n </button>\n\n {/* Floating label (rendered after the trigger so `peer-focus` applies) */}\n {isFloating && (\n <label\n data-slot=\"select-label\"\n htmlFor={selectId}\n className={floatingLabelVariants({\n size: resolvedSize,\n floated: isFloated,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n )}\n\n {/* Dropdown (portaled to body to avoid overflow clipping) */}\n {isOpen &&\n createPortal(\n <div\n data-slot=\"select-dropdown\"\n ref={(node) => {\n dropdownRef.current = node;\n floatingRef.current = node;\n }}\n style={dropdownStyle}\n className={cn(\n 'border-border bg-card rounded-lg border shadow-lg',\n 'flex flex-col overflow-hidden',\n 'animate-in fade-in zoom-in-95 duration-100'\n )}\n >\n {/* Search Input */}\n {searchable && (\n <div\n data-slot=\"select-search\"\n className=\"border-border border-b p-2\"\n >\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={searchPlaceholder}\n className={cn(\n 'border-input bg-background w-full rounded-md border px-3 py-2 text-sm',\n 'placeholder:text-muted-foreground',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n aria-label=\"Search options\"\n />\n </div>\n )}\n\n {/* Options List */}\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={label || 'Options'}\n aria-multiselectable={multiple || undefined}\n data-slot=\"select-listbox\"\n className=\"flex-1 overflow-auto p-1\"\n >\n {filteredFlatOptions.length === 0 ? (\n <li className=\"text-muted-foreground px-3 py-2 text-center text-sm\">\n {noResultsText}\n </li>\n ) : (\n filteredOptions.map((item) => {\n if ('options' in item) {\n // Render group\n return (\n <li key={`group-${item.label}`} role=\"presentation\">\n <div\n data-slot=\"select-group-label\"\n className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold tracking-wider uppercase\"\n >\n {item.label}\n </div>\n <ul role=\"group\" aria-label={item.label}>\n {item.options.map((option) => (\n <SelectOptionItem\n key={option.value}\n option={option}\n isSelected={selectedValues.includes(\n option.value\n )}\n isHighlighted={\n filteredFlatOptions[highlightedIndex]\n ?.value === option.value\n }\n onSelect={() => handleValueChange(option.value)}\n onMouseEnter={() => {\n const idx = filteredFlatOptions.findIndex(\n (o) => o.value === option.value\n );\n setHighlightedIndex(idx);\n }}\n />\n ))}\n </ul>\n </li>\n );\n }\n\n // Render single option\n return (\n <SelectOptionItem\n key={item.value}\n option={item}\n isSelected={selectedValues.includes(item.value)}\n isHighlighted={\n filteredFlatOptions[highlightedIndex]?.value ===\n item.value\n }\n onSelect={() => handleValueChange(item.value)}\n onMouseEnter={() => {\n const idx = filteredFlatOptions.findIndex(\n (o) => o.value === item.value\n );\n setHighlightedIndex(idx);\n }}\n />\n );\n })\n )}\n </ul>\n </div>,\n document.body\n )}\n </div>\n\n {/* Error Message */}\n {error && (\n <p\n id={errorId}\n data-slot=\"select-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n\n {/* Helper Text */}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"select-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n );\n}\n\nSelect.displayName = 'Select';\n\n/** Normalize a single/multiple value prop into an array of selected values. */\nfunction toValueArray(value: string | string[] | undefined): string[] {\n if (value === undefined || value === '') return [];\n return Array.isArray(value) ? value : [value];\n}\n\n// ============================================================================\n// Select Option Item (Internal)\n// ============================================================================\n\ninterface SelectOptionItemProps {\n option: SelectOption;\n isSelected: boolean;\n isHighlighted: boolean;\n onSelect: () => void;\n onMouseEnter: () => void;\n}\n\nfunction SelectOptionItem({\n option,\n isSelected,\n isHighlighted,\n onSelect,\n onMouseEnter,\n}: SelectOptionItemProps) {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!option.disabled) {\n onSelect();\n }\n }\n };\n\n return (\n <li\n data-slot=\"select-option\"\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-highlighted={isHighlighted}\n data-disabled={option.disabled}\n tabIndex={isHighlighted ? 0 : -1}\n onClick={option.disabled ? undefined : onSelect}\n onKeyDown={handleKeyDown}\n onMouseEnter={option.disabled ? undefined : onMouseEnter}\n className={cn(\n 'flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm',\n 'transition-colors outline-none',\n isHighlighted && 'bg-muted',\n isSelected &&\n 'bg-primary-50 text-primary-900 dark:bg-primary-950 dark:text-primary-100',\n option.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <span className=\"flex-1 truncate\">{option.label}</span>\n {isSelected && (\n <CheckIcon className=\"text-primary-800 h-4 w-4 shrink-0\" />\n )}\n </li>\n );\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport { Select, selectTriggerVariants };\n"]}
1
+ {"version":3,"sources":["../src/components/Select/Select.tsx"],"names":["cva","React","useClickOutside","useEscapeKey","useAnchoredPosition","jsx","RequiredMark","jsxs","cn","createPortal"],"mappings":"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","file":"chunk-K5GQPTTA.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { RequiredMark, type RequiredMarkVariant } from '../Input';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectOption {\n /** Unique value for the option */\n value: string;\n /** Display label for the option */\n label: string;\n /** Whether the option is disabled */\n disabled?: boolean;\n /** Optional group this option belongs to */\n group?: string;\n}\n\nexport interface SelectGroup {\n /** Group label */\n label: string;\n /** Options in this group */\n options: SelectOption[];\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst selectTriggerVariants = cva(\n [\n 'flex w-full items-center justify-between gap-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-3 text-base',\n lg: 'h-12 px-4 text-lg',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer',\n },\n },\n compoundVariants: [\n { labelVariant: 'floating', size: 'sm', className: 'h-11' },\n { labelVariant: 'floating', size: 'md', className: 'h-14' },\n { labelVariant: 'floating', size: 'lg', className: 'h-16' },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n labelVariant: 'stacked',\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n size: {\n sm: [\n 'peer-focus:top-0.5 peer-focus:translate-y-0 peer-focus:text-[0.65rem]',\n ],\n md: ['peer-focus:top-1 peer-focus:translate-y-0 peer-focus:text-xs'],\n lg: ['peer-focus:top-1.5 peer-focus:translate-y-0 peer-focus:text-sm'],\n },\n floated: {\n true: '',\n false: 'top-1/2 -translate-y-1/2',\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n compoundVariants: [\n { size: 'sm', floated: false, className: 'text-sm' },\n { size: 'md', floated: false, className: 'text-base' },\n { size: 'lg', floated: false, className: 'text-lg' },\n {\n size: 'sm',\n floated: true,\n className: 'top-0.5 translate-y-0 text-[0.65rem]',\n },\n { size: 'md', floated: true, className: 'top-1 translate-y-0 text-xs' },\n { size: 'lg', floated: true, className: 'top-1.5 translate-y-0 text-sm' },\n ],\n defaultVariants: {\n size: 'md',\n floated: false,\n hasError: false,\n },\n }\n);\n\nconst floatingValuePadding = {\n sm: 'pt-4 pb-1',\n md: 'pt-5 pb-1.5',\n lg: 'pt-6 pb-2',\n} as const;\n\n// ============================================================================\n// Select Component\n// ============================================================================\n\n/**\n * Props shared by both single- and multiple-selection modes. Exported so\n * wrapper components can extend the common shape (`SelectProps` itself is a\n * discriminated union, which interfaces cannot extend).\n */\nexport interface SelectBaseProps extends Omit<\n VariantProps<typeof selectTriggerVariants>,\n 'labelVariant'\n> {\n /** Array of options or groups */\n options: (SelectOption | SelectGroup)[];\n /** Placeholder text */\n placeholder?: string;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Label for the select */\n label?: string;\n /** Hide the label visually */\n hideLabel?: boolean;\n /**\n * Visual style of the label.\n * - `stacked` (default): label sits above the trigger.\n * - `floating`: label rests inside the trigger like a placeholder and\n * floats up (staying inside the trigger) when open or a value is\n * selected. The `placeholder` prop is ignored in this mode.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Error message */\n error?: string;\n /** Helper text */\n helperText?: string;\n /** Whether a selection is required (shows an asterisk next to the label) */\n required?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n /** Enable search/filter */\n searchable?: boolean;\n /** Search placeholder */\n searchPlaceholder?: string;\n /** No results text */\n noResultsText?: string;\n /** Accessible label for the trigger (used when no `label` prop is provided) */\n 'aria-label'?: string;\n /** Additional class name */\n className?: string;\n /** ID for the select */\n id?: string;\n}\n\nexport interface SelectSingleProps extends SelectBaseProps {\n /** Single-selection mode (default). */\n multiple?: false;\n /** Controlled value */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string) => void;\n}\n\nexport interface SelectMultipleProps extends SelectBaseProps {\n /** Multiple-selection mode: selecting an option toggles it and keeps the dropdown open. */\n multiple: true;\n /** Controlled values */\n value?: string[];\n /** Default values (uncontrolled) */\n defaultValue?: string[];\n /** Callback when values change */\n onValueChange?: (value: string[]) => void;\n}\n\nexport type SelectProps = SelectSingleProps | SelectMultipleProps;\n\n/**\n * An accessible select/dropdown component with search support.\n *\n * @example\n * ```tsx\n * <Select\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'uk', label: 'United Kingdom' },\n * ]}\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Multiple selection — value/onValueChange use string[]\n * <Select\n * multiple\n * label=\"Symptoms\"\n * options={options}\n * onValueChange={(values) => console.log(values)}\n * />\n * ```\n */\nfunction Select(props: SelectProps) {\n const {\n options,\n placeholder = 'Select an option',\n disabled = false,\n label,\n hideLabel = false,\n labelVariant = 'stacked',\n error,\n helperText,\n required = false,\n requiredVariant,\n size,\n hasError,\n 'aria-label': ariaLabel,\n searchable = false,\n searchPlaceholder = 'Search...',\n noResultsText = 'No results found',\n className,\n id,\n } = props;\n const multiple = props.multiple === true;\n // The discriminated union types onValueChange as either a string or string[]\n // callback; widen it once here so handlers can use it without referencing\n // the whole `props` object. Runtime calls stay consistent with `multiple`.\n const onValueChange = props.onValueChange as\n | ((value: string | string[]) => void)\n | undefined;\n const [isOpen, setIsOpen] = React.useState(false);\n const [uncontrolledValues, setUncontrolledValues] = React.useState<string[]>(\n () => toValueArray(props.defaultValue)\n );\n const [searchQuery, setSearchQuery] = React.useState('');\n const [highlightedIndex, setHighlightedIndex] = React.useState(-1);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement>(null);\n const typeaheadRef = React.useRef<{ query: string; timer: number | null }>({\n query: '',\n timer: null,\n });\n\n const generatedId = React.useId();\n const selectId = id || generatedId;\n const listboxId = `${selectId}-listbox`;\n const errorId = `${selectId}-error`;\n const helperId = `${selectId}-helper`;\n\n const isControlled = props.value !== undefined;\n const controlledValue = props.value;\n // Memoize the controlled normalization: toValueArray allocates a fresh\n // array when value is a string, which would otherwise churn callback\n // identities (handleValueChange depends on selectedValues) every render.\n const controlledValues = React.useMemo(\n () => toValueArray(controlledValue),\n [controlledValue]\n );\n const selectedValues = isControlled ? controlledValues : uncontrolledValues;\n\n // Flatten options for easy access\n const flatOptions = React.useMemo(() => {\n const result: SelectOption[] = [];\n for (const item of options) {\n if ('options' in item) {\n result.push(...item.options);\n } else {\n result.push(item);\n }\n }\n return result;\n }, [options]);\n\n // Filter options based on search query\n const filteredOptions = React.useMemo(() => {\n if (!searchQuery) return options;\n\n const query = searchQuery.toLowerCase();\n const result: (SelectOption | SelectGroup)[] = [];\n\n for (const item of options) {\n if ('options' in item) {\n const filteredGroupOptions = item.options.filter((opt) =>\n opt.label.toLowerCase().includes(query)\n );\n if (filteredGroupOptions.length > 0) {\n result.push({ ...item, options: filteredGroupOptions });\n }\n } else {\n if (item.label.toLowerCase().includes(query)) {\n result.push(item);\n }\n }\n }\n\n return result;\n }, [options, searchQuery]);\n\n // Get filtered flat options for keyboard navigation\n const filteredFlatOptions = React.useMemo(() => {\n const result: SelectOption[] = [];\n for (const item of filteredOptions) {\n if ('options' in item) {\n result.push(...item.options.filter((opt) => !opt.disabled));\n } else if (!item.disabled) {\n result.push(item);\n }\n }\n return result;\n }, [filteredOptions]);\n\n // Get selected options (in selection order)\n const selectedOptions = selectedValues\n .map((v) => flatOptions.find((opt) => opt.value === v))\n .filter((opt): opt is SelectOption => opt !== undefined);\n const hasSelection = selectedOptions.length > 0;\n const displayLabel = selectedOptions.map((opt) => opt.label).join(', ');\n\n // Close dropdown on click outside (handles both container and portaled dropdown)\n const outsideRefs = React.useMemo(() => [containerRef, dropdownRef], []);\n useClickOutside(outsideRefs, () => setIsOpen(false), isOpen);\n\n useEscapeKey(() => {\n if (isOpen) {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n }, isOpen);\n\n // Track trigger position for portal dropdown\n const {\n anchorRef,\n floatingRef,\n style: dropdownStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open: isOpen,\n matchWidth: true,\n maxHeight: 300,\n });\n\n // Handle option selection: single mode replaces and closes; multiple mode\n // toggles the option and keeps the dropdown open.\n const handleValueChange = React.useCallback(\n (optionValue: string) => {\n if (multiple) {\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n if (!isControlled) {\n setUncontrolledValues(next);\n }\n onValueChange?.(next);\n // The dropdown stays open; a mouse click focuses the option <li>,\n // which only handles Enter/Space. Restore focus so arrow-key\n // navigation and typeahead keep working.\n if (searchable) {\n searchInputRef.current?.focus();\n } else {\n triggerRef.current?.focus();\n }\n return;\n }\n if (!isControlled) {\n setUncontrolledValues([optionValue]);\n }\n onValueChange?.(optionValue);\n setIsOpen(false);\n setSearchQuery('');\n triggerRef.current?.focus();\n },\n [isControlled, multiple, onValueChange, searchable, selectedValues]\n );\n\n // Handle keyboard navigation\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n // Typeahead (native-select style): when not using the dedicated search\n // input, typing printable characters jumps to the first option whose\n // label starts with the typed string. Repeating the same key cycles\n // through matches. The buffer clears after a short pause.\n if (\n !searchable &&\n e.key.length === 1 &&\n e.key !== ' ' &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.altKey\n ) {\n e.preventDefault();\n if (!isOpen) setIsOpen(true);\n\n const hadPendingQuery = typeaheadRef.current.query !== '';\n if (typeaheadRef.current.timer !== null) {\n window.clearTimeout(typeaheadRef.current.timer);\n }\n const query = (typeaheadRef.current.query + e.key).toLowerCase();\n typeaheadRef.current.query = query;\n typeaheadRef.current.timer = window.setTimeout(() => {\n typeaheadRef.current.query = '';\n typeaheadRef.current.timer = null;\n }, 600);\n\n const len = filteredFlatOptions.length;\n if (len > 0) {\n const allSameChar = query.split('').every((c) => c === query[0]);\n const needle = allSameChar ? query[0] : query;\n const matches = (opt: SelectOption) =>\n opt.label.toLowerCase().startsWith(needle);\n\n // A fresh keystroke (or refining a multi-char query) searches from\n // the current option inclusive so typing \"car\" stays on \"Cardiology\";\n // repeating the same key cycles to the next match.\n const startInclusive = !hadPendingQuery || !allSameChar;\n const base = startInclusive\n ? Math.max(highlightedIndex, 0)\n : highlightedIndex + 1;\n\n for (let i = 0; i < len; i++) {\n const idx = (base + i) % len;\n if (matches(filteredFlatOptions[idx])) {\n setHighlightedIndex(idx);\n break;\n }\n }\n }\n return;\n }\n\n // Let Space type normally in the search input (e.g. \"new york\")\n // instead of being captured by the open/select handler below.\n if (e.key === ' ' && e.target === searchInputRef.current) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setHighlightedIndex((prev) =>\n prev < filteredFlatOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredFlatOptions.length - 1\n );\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && highlightedIndex >= 0) {\n handleValueChange(filteredFlatOptions[highlightedIndex].value);\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n case 'Home':\n e.preventDefault();\n setHighlightedIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setHighlightedIndex(filteredFlatOptions.length - 1);\n break;\n }\n },\n [\n isOpen,\n highlightedIndex,\n filteredFlatOptions,\n handleValueChange,\n searchable,\n ]\n );\n\n // Focus search input when dropdown opens\n React.useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n // Reset highlighted index when search changes\n React.useEffect(() => {\n setHighlightedIndex(filteredFlatOptions.length > 0 ? 0 : -1);\n }, [searchQuery, filteredFlatOptions.length]);\n\n // Keep the highlighted option visible within the listbox during keyboard\n // navigation. We adjust only the list's own scrollTop instead of calling the\n // native scrollIntoView: the dropdown is portaled to <body> with\n // position: fixed, and scrollIntoView would also scroll ancestor/window,\n // yanking the whole page.\n React.useEffect(() => {\n if (!isOpen || highlightedIndex < 0) return;\n const list = listRef.current;\n const el = list?.querySelector<HTMLElement>('[data-highlighted=\"true\"]');\n if (!list || !el) return;\n const listRect = list.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n if (elRect.top < listRect.top) {\n list.scrollTop -= listRect.top - elRect.top;\n } else if (elRect.bottom > listRect.bottom) {\n list.scrollTop += elRect.bottom - listRect.bottom;\n }\n }, [highlightedIndex, isOpen]);\n\n // Reset the typeahead buffer whenever the dropdown closes (Escape, click\n // outside, selection) so a stale query doesn't carry over on a quick reopen,\n // and clear any pending timer on unmount.\n const resetTypeahead = React.useCallback(() => {\n if (typeaheadRef.current.timer !== null) {\n window.clearTimeout(typeaheadRef.current.timer);\n typeaheadRef.current.timer = null;\n }\n typeaheadRef.current.query = '';\n }, []);\n\n React.useEffect(() => {\n if (!isOpen) resetTypeahead();\n }, [isOpen, resetTypeahead]);\n\n React.useEffect(() => resetTypeahead, [resetTypeahead]);\n\n // Build aria-describedby\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n const isFloated = isOpen || hasSelection;\n const resolvedSize = size ?? 'md';\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n return (\n <div\n data-slot=\"select-wrapper\"\n className={cn('flex flex-col gap-1.5', className)}\n >\n {label && !isFloating && (\n <label\n data-slot=\"select-label\"\n htmlFor={selectId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n\n <div ref={containerRef} className=\"relative\">\n {/* Trigger Button */}\n <button\n data-slot=\"select-trigger\"\n ref={(node) => {\n triggerRef.current = node;\n anchorRef.current = node;\n }}\n id={selectId}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n // Only reference the listbox while it exists in the DOM (it is\n // portaled and unmounted when closed) so the ID is always valid.\n aria-controls={isOpen ? listboxId : undefined}\n aria-invalid={hasError || !!error}\n aria-required={required || undefined}\n aria-label={!label ? ariaLabel : undefined}\n aria-describedby={describedByIds || undefined}\n disabled={disabled}\n onClick={() => setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n className={cn(\n selectTriggerVariants({\n size,\n hasError: hasError || !!error,\n labelVariant: isFloating ? 'floating' : 'stacked',\n })\n )}\n >\n <span\n className={cn(\n 'truncate',\n !hasSelection && 'text-muted-foreground',\n isFloating && floatingValuePadding[resolvedSize]\n )}\n >\n {isFloating\n ? hasSelection\n ? displayLabel\n : '\\u00A0'\n : hasSelection\n ? displayLabel\n : placeholder}\n </span>\n <ChevronDownIcon\n className={cn(\n 'text-muted-foreground h-4 w-4 shrink-0 transition-transform',\n isOpen && 'rotate-180'\n )}\n />\n </button>\n\n {/* Floating label (rendered after the trigger so `peer-focus` applies) */}\n {isFloating && (\n <label\n data-slot=\"select-label\"\n htmlFor={selectId}\n className={floatingLabelVariants({\n size: resolvedSize,\n floated: isFloated,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n )}\n\n {/* Dropdown (portaled to body to avoid overflow clipping) */}\n {isOpen &&\n createPortal(\n <div\n data-slot=\"select-dropdown\"\n ref={(node) => {\n dropdownRef.current = node;\n floatingRef.current = node;\n }}\n style={dropdownStyle}\n className={cn(\n 'border-border bg-card rounded-lg border shadow-lg',\n 'flex flex-col overflow-hidden',\n 'animate-in fade-in zoom-in-95 duration-100'\n )}\n >\n {/* Search Input */}\n {searchable && (\n <div\n data-slot=\"select-search\"\n className=\"border-border border-b p-2\"\n >\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={searchPlaceholder}\n className={cn(\n 'border-input bg-background w-full rounded-md border px-3 py-2 text-sm',\n 'placeholder:text-muted-foreground',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n aria-label=\"Search options\"\n />\n </div>\n )}\n\n {/* Options List */}\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={label || 'Options'}\n aria-multiselectable={multiple || undefined}\n data-slot=\"select-listbox\"\n className=\"flex-1 overflow-auto p-1\"\n >\n {filteredFlatOptions.length === 0 ? (\n <li className=\"text-muted-foreground px-3 py-2 text-center text-sm\">\n {noResultsText}\n </li>\n ) : (\n filteredOptions.map((item) => {\n if ('options' in item) {\n // Render group\n return (\n <li key={`group-${item.label}`} role=\"presentation\">\n <div\n data-slot=\"select-group-label\"\n className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold tracking-wider uppercase\"\n >\n {item.label}\n </div>\n <ul role=\"group\" aria-label={item.label}>\n {item.options.map((option) => (\n <SelectOptionItem\n key={option.value}\n option={option}\n isSelected={selectedValues.includes(\n option.value\n )}\n isHighlighted={\n filteredFlatOptions[highlightedIndex]\n ?.value === option.value\n }\n onSelect={() => handleValueChange(option.value)}\n onMouseEnter={() => {\n const idx = filteredFlatOptions.findIndex(\n (o) => o.value === option.value\n );\n setHighlightedIndex(idx);\n }}\n />\n ))}\n </ul>\n </li>\n );\n }\n\n // Render single option\n return (\n <SelectOptionItem\n key={item.value}\n option={item}\n isSelected={selectedValues.includes(item.value)}\n isHighlighted={\n filteredFlatOptions[highlightedIndex]?.value ===\n item.value\n }\n onSelect={() => handleValueChange(item.value)}\n onMouseEnter={() => {\n const idx = filteredFlatOptions.findIndex(\n (o) => o.value === item.value\n );\n setHighlightedIndex(idx);\n }}\n />\n );\n })\n )}\n </ul>\n </div>,\n document.body\n )}\n </div>\n\n {/* Error Message */}\n {error && (\n <p\n id={errorId}\n data-slot=\"select-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n\n {/* Helper Text */}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"select-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n );\n}\n\nSelect.displayName = 'Select';\n\n/** Normalize a single/multiple value prop into an array of selected values. */\nfunction toValueArray(value: string | string[] | undefined): string[] {\n if (value === undefined || value === '') return [];\n return Array.isArray(value) ? value : [value];\n}\n\n// ============================================================================\n// Select Option Item (Internal)\n// ============================================================================\n\ninterface SelectOptionItemProps {\n option: SelectOption;\n isSelected: boolean;\n isHighlighted: boolean;\n onSelect: () => void;\n onMouseEnter: () => void;\n}\n\nfunction SelectOptionItem({\n option,\n isSelected,\n isHighlighted,\n onSelect,\n onMouseEnter,\n}: SelectOptionItemProps) {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!option.disabled) {\n onSelect();\n }\n }\n };\n\n return (\n <li\n data-slot=\"select-option\"\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-highlighted={isHighlighted}\n data-disabled={option.disabled}\n tabIndex={isHighlighted ? 0 : -1}\n onClick={option.disabled ? undefined : onSelect}\n onKeyDown={handleKeyDown}\n onMouseEnter={option.disabled ? undefined : onMouseEnter}\n className={cn(\n 'flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm',\n 'transition-colors outline-none',\n isHighlighted && 'bg-muted',\n isSelected &&\n 'bg-primary-50 text-primary-900 dark:bg-primary-950 dark:text-primary-100',\n option.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <span className=\"flex-1 truncate\">{option.label}</span>\n {isSelected && (\n <CheckIcon className=\"text-primary-800 h-4 w-4 shrink-0\" />\n )}\n </li>\n );\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport { Select, selectTriggerVariants };\n"]}
@@ -1,5 +1,5 @@
1
1
  import { useEscapeKey } from './chunk-T4ME7QCT.js';
2
- import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
2
+ import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
3
3
  import { cn } from './chunk-TQONQSJO.js';
4
4
  import * as React from 'react';
5
5
  import { createPortal } from 'react-dom';
@@ -204,5 +204,5 @@ function SourceTip({
204
204
  }
205
205
 
206
206
  export { SourceTip };
207
- //# sourceMappingURL=chunk-XMECP2MD.js.map
208
- //# sourceMappingURL=chunk-XMECP2MD.js.map
207
+ //# sourceMappingURL=chunk-KFEN2SRZ.js.map
208
+ //# sourceMappingURL=chunk-KFEN2SRZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SourceTip/SourceTip.tsx"],"names":[],"mappings":"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","file":"chunk-XMECP2MD.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One line of provenance shown in the card. */\nexport interface TipSource {\n /** One-line label — statute name or source title. Truncated on render. */\n label: string;\n /** Source URL. Omit for a provenance line that isn't linkable. */\n url?: string;\n /** Secondary label shown at the end (publisher / host / year). */\n sub?: string;\n}\n\nexport interface SourceTipProps {\n /** The claim this card explains — the card's heading. */\n heading: string;\n /** Free-text provenance, for facts no public URL can verify. */\n note?: string;\n /** Linked (or unlinked) one-line sources. */\n sources?: TipSource[];\n /** Eyebrow above the heading. Defaults to \"Source\". */\n eyebrow?: string;\n /** The visible trigger. */\n children: React.ReactNode;\n className?: string;\n /**\n * Underline the trigger with a dashed rule marking a hoverable claim.\n * Leave off in table cells, which signal hoverability by their own\n * treatment rather than by underlining every cell.\n */\n underline?: boolean;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// SourceTip\n// =============================================================================\n\n/**\n * A hover card answering \"what backs this claim?\" — an eyebrow + heading,\n * optional free-text provenance, and a list of one-line source links.\n * Suits stat tiles, table cells, and inline facts where a numbered footnote\n * would be overkill.\n *\n * The trigger and card are phrasing content (`span`/`a` only), so it is\n * valid inside `<p>` prose and table cells. The card portals to `body` with\n * fixed positioning, flipping and clamping to stay in the viewport. On\n * touch, a tap pins the card; Escape or an outside tap closes it. A pinned\n * card behaves as a non-modal dialog — focus moves into it so its source\n * links are keyboard-reachable, and returns to the trigger on close.\n *\n * @example\n * ```tsx\n * <SourceTip\n * heading=\"OSHA recordable rate\"\n * sources={[{ label: 'BLS SOII 2023', url: 'https://www.bls.gov/iif/', sub: 'BLS' }]}\n * underline\n * >\n * 2.4 per 100 FTE\n * </SourceTip>\n * ```\n */\nexport function SourceTip({\n heading,\n note,\n sources,\n eyebrow = 'Source',\n children,\n className,\n underline = false,\n}: SourceTipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n anchorRef.current?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n // Touch has no hover: tap pins the card instead of falling through.\n const onTriggerClick = () => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (!coarse) return;\n togglePin();\n };\n\n const togglePin = () => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link inside) must also unpin — the trigger no longer has focus.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const hasSources = Boolean(sources && sources.length > 0);\n\n return (\n <span\n ref={anchorRef}\n className={cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n )}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${heading} — show source`}\n >\n {children}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={heading}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase\">\n {eyebrow}\n </span>\n <span className=\"mt-0.5 block text-sm leading-snug font-semibold text-white\">\n {heading}\n </span>\n </span>\n\n {(note || hasSources) && (\n <span className=\"block px-3.5 py-2.5\">\n {note && (\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {note}\n </span>\n )}\n {hasSources && (\n <span\n className={cn(\n 'block',\n note &&\n 'border-border mt-2.5 border-t border-dashed pt-2.5'\n )}\n >\n <span className=\"text-muted-foreground block text-[10px] font-bold tracking-wide uppercase\">\n {sources!.length === 1\n ? 'Source'\n : `${sources!.length} sources`}\n </span>\n <span className=\"block max-h-52 overflow-y-auto\">\n {sources!.map((s, i) => (\n <span\n key={`${s.label}-${i}`}\n className=\"mt-1.5 flex items-center gap-2\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {s.url ? (\n <a\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold\"\n >\n {s.label}\n </a>\n ) : (\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate text-xs\">\n {s.label}\n </span>\n )}\n {s.sub && (\n <span className=\"text-muted-foreground/70 shrink-0 text-[11px]\">\n {s.sub}\n </span>\n )}\n </span>\n ))}\n </span>\n </span>\n )}\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/SourceTip/SourceTip.tsx"],"names":[],"mappings":"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","file":"chunk-KFEN2SRZ.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One line of provenance shown in the card. */\nexport interface TipSource {\n /** One-line label — statute name or source title. Truncated on render. */\n label: string;\n /** Source URL. Omit for a provenance line that isn't linkable. */\n url?: string;\n /** Secondary label shown at the end (publisher / host / year). */\n sub?: string;\n}\n\nexport interface SourceTipProps {\n /** The claim this card explains — the card's heading. */\n heading: string;\n /** Free-text provenance, for facts no public URL can verify. */\n note?: string;\n /** Linked (or unlinked) one-line sources. */\n sources?: TipSource[];\n /** Eyebrow above the heading. Defaults to \"Source\". */\n eyebrow?: string;\n /** The visible trigger. */\n children: React.ReactNode;\n className?: string;\n /**\n * Underline the trigger with a dashed rule marking a hoverable claim.\n * Leave off in table cells, which signal hoverability by their own\n * treatment rather than by underlining every cell.\n */\n underline?: boolean;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// SourceTip\n// =============================================================================\n\n/**\n * A hover card answering \"what backs this claim?\" — an eyebrow + heading,\n * optional free-text provenance, and a list of one-line source links.\n * Suits stat tiles, table cells, and inline facts where a numbered footnote\n * would be overkill.\n *\n * The trigger and card are phrasing content (`span`/`a` only), so it is\n * valid inside `<p>` prose and table cells. The card portals to `body` with\n * fixed positioning, flipping and clamping to stay in the viewport. On\n * touch, a tap pins the card; Escape or an outside tap closes it. A pinned\n * card behaves as a non-modal dialog — focus moves into it so its source\n * links are keyboard-reachable, and returns to the trigger on close.\n *\n * @example\n * ```tsx\n * <SourceTip\n * heading=\"OSHA recordable rate\"\n * sources={[{ label: 'BLS SOII 2023', url: 'https://www.bls.gov/iif/', sub: 'BLS' }]}\n * underline\n * >\n * 2.4 per 100 FTE\n * </SourceTip>\n * ```\n */\nexport function SourceTip({\n heading,\n note,\n sources,\n eyebrow = 'Source',\n children,\n className,\n underline = false,\n}: SourceTipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n anchorRef.current?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n // Touch has no hover: tap pins the card instead of falling through.\n const onTriggerClick = () => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (!coarse) return;\n togglePin();\n };\n\n const togglePin = () => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link inside) must also unpin — the trigger no longer has focus.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const hasSources = Boolean(sources && sources.length > 0);\n\n return (\n <span\n ref={anchorRef}\n className={cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n )}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${heading} — show source`}\n >\n {children}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={heading}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase\">\n {eyebrow}\n </span>\n <span className=\"mt-0.5 block text-sm leading-snug font-semibold text-white\">\n {heading}\n </span>\n </span>\n\n {(note || hasSources) && (\n <span className=\"block px-3.5 py-2.5\">\n {note && (\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {note}\n </span>\n )}\n {hasSources && (\n <span\n className={cn(\n 'block',\n note &&\n 'border-border mt-2.5 border-t border-dashed pt-2.5'\n )}\n >\n <span className=\"text-muted-foreground block text-[10px] font-bold tracking-wide uppercase\">\n {sources!.length === 1\n ? 'Source'\n : `${sources!.length} sources`}\n </span>\n <span className=\"block max-h-52 overflow-y-auto\">\n {sources!.map((s, i) => (\n <span\n key={`${s.label}-${i}`}\n className=\"mt-1.5 flex items-center gap-2\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {s.url ? (\n <a\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold\"\n >\n {s.label}\n </a>\n ) : (\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate text-xs\">\n {s.label}\n </span>\n )}\n {s.sub && (\n <span className=\"text-muted-foreground/70 shrink-0 text-[11px]\">\n {s.sub}\n </span>\n )}\n </span>\n ))}\n </span>\n </span>\n )}\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
1
+ import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
2
2
  import { cn } from './chunk-TQONQSJO.js';
3
3
  import * as React2 from 'react';
4
4
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -186,7 +186,7 @@ function AttachmentPreviewItem({
186
186
  type: "button",
187
187
  onClick: onRemove,
188
188
  className: cn(
189
- "absolute -top-1 -right-1 z-10",
189
+ "absolute -end-1 -top-1 z-10",
190
190
  "rounded-full p-1",
191
191
  "bg-neutral-900 text-white",
192
192
  "opacity-0 group-hover:opacity-100",
@@ -219,7 +219,7 @@ function AttachmentPreviewItem({
219
219
  "div",
220
220
  {
221
221
  className: cn(
222
- "absolute right-0 bottom-0 left-0",
222
+ "absolute start-0 end-0 bottom-0",
223
223
  "bg-black/70 px-1 py-0.5",
224
224
  "opacity-0 group-hover:opacity-100",
225
225
  "transition-opacity"
@@ -918,7 +918,7 @@ var MessageComposer = React2.forwardRef(
918
918
  className: cn(
919
919
  "flex items-center gap-2 px-4 py-2",
920
920
  "bg-neutral-50 dark:bg-neutral-800/50",
921
- "border-primary-500 border-l-4"
921
+ "border-primary-500 border-s-4"
922
922
  ),
923
923
  children: [
924
924
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -1041,14 +1041,14 @@ var MessageComposer = React2.forwardRef(
1041
1041
  },
1042
1042
  onMouseEnter: () => setMentionHighlight(i),
1043
1043
  className: cn(
1044
- "flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm",
1044
+ "flex w-full items-center gap-2 px-3 py-1.5 text-start text-sm",
1045
1045
  i === clampedMentionHighlight ? "bg-primary-100 text-primary-900 dark:bg-primary-900/40 dark:text-primary-100" : "text-neutral-700 dark:text-neutral-200"
1046
1046
  ),
1047
1047
  children: [
1048
1048
  option.icon,
1049
1049
  /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1 truncate", children: [
1050
1050
  /* @__PURE__ */ jsx("span", { className: "font-medium", children: option.label }),
1051
- option.description && /* @__PURE__ */ jsx("span", { className: "ml-1 text-xs text-neutral-400", children: option.description })
1051
+ option.description && /* @__PURE__ */ jsx("span", { className: "ms-1 text-xs text-neutral-400", children: option.description })
1052
1052
  ] }),
1053
1053
  option.meta && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-neutral-400", children: option.meta })
1054
1054
  ]
@@ -1082,7 +1082,7 @@ var MessageComposer = React2.forwardRef(
1082
1082
  rows: 1,
1083
1083
  className: cn(
1084
1084
  "w-full resize-none rounded-2xl py-2.5",
1085
- inputTrailing ? "pr-10 pl-4" : "px-4",
1085
+ inputTrailing ? "ps-4 pe-10" : "px-4",
1086
1086
  "bg-neutral-100 dark:bg-neutral-800",
1087
1087
  "text-neutral-900 dark:text-neutral-100",
1088
1088
  "placeholder:text-neutral-400 dark:placeholder:text-neutral-500",
@@ -1104,7 +1104,7 @@ var MessageComposer = React2.forwardRef(
1104
1104
  "div",
1105
1105
  {
1106
1106
  "data-slot": "composer-input-trailing",
1107
- className: "pointer-events-none absolute top-0 right-1 flex h-[44px] items-center [&>*]:pointer-events-auto",
1107
+ className: "pointer-events-none absolute end-1 top-0 flex h-[44px] items-center [&>*]:pointer-events-auto",
1108
1108
  children: inputTrailing
1109
1109
  }
1110
1110
  ),
@@ -1113,7 +1113,7 @@ var MessageComposer = React2.forwardRef(
1113
1113
  {
1114
1114
  "data-slot": "composer-char-count",
1115
1115
  id: "char-count",
1116
- className: "absolute right-3 bottom-1.5",
1116
+ className: "absolute end-3 bottom-1.5",
1117
1117
  children: /* @__PURE__ */ jsx(CharacterCounter, { current: content.length, max: maxLength })
1118
1118
  }
1119
1119
  )
@@ -1141,5 +1141,5 @@ var MessageComposer = React2.forwardRef(
1141
1141
  MessageComposer.displayName = "MessageComposer";
1142
1142
 
1143
1143
  export { AttachmentPicker, AttachmentPreviewItem, CameraButton, CharacterCounter, DragDropZone, MessageComposer, SendButton, generateAttachmentId, getFileType, sendButtonVariants, validateFile };
1144
- //# sourceMappingURL=chunk-EKRT7K2K.js.map
1145
- //# sourceMappingURL=chunk-EKRT7K2K.js.map
1144
+ //# sourceMappingURL=chunk-KLLRTTC5.js.map
1145
+ //# sourceMappingURL=chunk-KLLRTTC5.js.map