@intlayer/design-system 8.9.1 → 8.9.3

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 (348) hide show
  1. package/dist/esm/components/Accordion/Accordion.mjs.map +1 -1
  2. package/dist/esm/components/Avatar/image.mjs.map +1 -1
  3. package/dist/esm/components/Avatar/index.mjs.map +1 -1
  4. package/dist/esm/components/Badge/index.mjs.map +1 -1
  5. package/dist/esm/components/Breadcrumb/index.mjs.map +1 -1
  6. package/dist/esm/components/Browser/Browser.mjs.map +1 -1
  7. package/dist/esm/components/Button/Button.mjs.map +1 -1
  8. package/dist/esm/components/Carousel/index.mjs.map +1 -1
  9. package/dist/esm/components/ClickOutsideDiv/index.mjs.map +1 -1
  10. package/dist/esm/components/CollapsibleTable/CollapsibleTable.mjs.map +1 -1
  11. package/dist/esm/components/Command/index.mjs.map +1 -1
  12. package/dist/esm/components/Container/index.mjs.map +1 -1
  13. package/dist/esm/components/ContentEditor/ContentEditor.mjs.map +1 -1
  14. package/dist/esm/components/ContentEditor/ContentEditorInput.mjs.map +1 -1
  15. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs +1 -1
  16. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs.map +1 -1
  17. package/dist/esm/components/CopyButton/index.mjs.map +1 -1
  18. package/dist/esm/components/CopyToClipboard/index.mjs.map +1 -1
  19. package/dist/esm/components/DictionaryEditor/DictionaryEditor.mjs.map +1 -1
  20. package/dist/esm/components/DictionaryEditor/NodeWrapper/ArrayWrapper.mjs.map +1 -1
  21. package/dist/esm/components/DictionaryEditor/NodeWrapper/BooleanWrapper.mjs.map +1 -1
  22. package/dist/esm/components/DictionaryEditor/NodeWrapper/ConditionWrapper.mjs.map +1 -1
  23. package/dist/esm/components/DictionaryEditor/NodeWrapper/EnumerationWrapper.mjs.map +1 -1
  24. package/dist/esm/components/DictionaryEditor/NodeWrapper/FileWrapper.mjs.map +1 -1
  25. package/dist/esm/components/DictionaryEditor/NodeWrapper/HtmlWrapper.mjs.map +1 -1
  26. package/dist/esm/components/DictionaryEditor/NodeWrapper/InsertionWrapper.mjs.map +1 -1
  27. package/dist/esm/components/DictionaryEditor/NodeWrapper/MarkdownWrapper.mjs.map +1 -1
  28. package/dist/esm/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.mjs.map +1 -1
  29. package/dist/esm/components/DictionaryEditor/NodeWrapper/NumberWrapper.mjs.map +1 -1
  30. package/dist/esm/components/DictionaryEditor/NodeWrapper/PluralWrapper.mjs.map +1 -1
  31. package/dist/esm/components/DictionaryEditor/NodeWrapper/StringWrapper.mjs.map +1 -1
  32. package/dist/esm/components/DictionaryEditor/NodeWrapper/TranslationWrapper.mjs.map +1 -1
  33. package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs.map +1 -1
  34. package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
  35. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +2 -2
  36. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
  37. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/object.mjs.map +1 -1
  38. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +1 -1
  39. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
  40. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs.map +1 -1
  41. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +40 -44
  42. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
  43. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/useDictionaryDetailsSchema.mjs.map +1 -1
  44. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +25 -18
  45. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
  46. package/dist/esm/components/DictionaryFieldEditor/EnumKeyInput.mjs.map +1 -1
  47. package/dist/esm/components/DictionaryFieldEditor/JSONEditor.mjs.map +1 -1
  48. package/dist/esm/components/DictionaryFieldEditor/KeyPathBreadcrumb.mjs.map +1 -1
  49. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
  50. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
  51. package/dist/esm/components/DictionaryFieldEditor/NodeTypeSelector.mjs.map +1 -1
  52. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +3 -3
  53. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  54. package/dist/esm/components/DictionaryFieldEditor/StructureEditor.mjs.map +1 -1
  55. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +1 -1
  56. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
  57. package/dist/esm/components/DictionaryFieldEditor/VersionSwitcherDropDown/VersionSwitcher.mjs.map +1 -1
  58. package/dist/esm/components/DictionaryFieldEditor/VersionSwitcherDropDown/VersionSwitcherContext.mjs.map +1 -1
  59. package/dist/esm/components/DictionaryFieldEditor/getIsEditableSection.mjs.map +1 -1
  60. package/dist/esm/components/DropDown/index.mjs.map +1 -1
  61. package/dist/esm/components/EditableField/EditableFieldInput.mjs.map +1 -1
  62. package/dist/esm/components/EditableField/EditableFieldLayout.mjs.map +1 -1
  63. package/dist/esm/components/EditableField/EditableFieldTextArea.mjs.map +1 -1
  64. package/dist/esm/components/ExpandCollapse/ExpandCollapse.mjs.map +1 -1
  65. package/dist/esm/components/Flags/Flag.mjs.map +1 -1
  66. package/dist/esm/components/Flags/ae.mjs.map +1 -1
  67. package/dist/esm/components/Flags/af.mjs.map +1 -1
  68. package/dist/esm/components/Flags/al.mjs.map +1 -1
  69. package/dist/esm/components/Flags/am.mjs.map +1 -1
  70. package/dist/esm/components/Flags/ar.mjs.map +1 -1
  71. package/dist/esm/components/Flags/at.mjs.map +1 -1
  72. package/dist/esm/components/Flags/au.mjs.map +1 -1
  73. package/dist/esm/components/Flags/az.mjs.map +1 -1
  74. package/dist/esm/components/Flags/ba.mjs.map +1 -1
  75. package/dist/esm/components/Flags/bd.mjs.map +1 -1
  76. package/dist/esm/components/Flags/be.mjs.map +1 -1
  77. package/dist/esm/components/Flags/bg.mjs.map +1 -1
  78. package/dist/esm/components/Flags/bh.mjs.map +1 -1
  79. package/dist/esm/components/Flags/bn.mjs.map +1 -1
  80. package/dist/esm/components/Flags/bo.mjs.map +1 -1
  81. package/dist/esm/components/Flags/br.mjs.map +1 -1
  82. package/dist/esm/components/Flags/bw.mjs.map +1 -1
  83. package/dist/esm/components/Flags/by.mjs.map +1 -1
  84. package/dist/esm/components/Flags/bz.mjs.map +1 -1
  85. package/dist/esm/components/Flags/ca.mjs.map +1 -1
  86. package/dist/esm/components/Flags/ch.mjs.map +1 -1
  87. package/dist/esm/components/Flags/cl.mjs.map +1 -1
  88. package/dist/esm/components/Flags/cn.mjs.map +1 -1
  89. package/dist/esm/components/Flags/co.mjs.map +1 -1
  90. package/dist/esm/components/Flags/cr.mjs.map +1 -1
  91. package/dist/esm/components/Flags/cu.mjs.map +1 -1
  92. package/dist/esm/components/Flags/cv.mjs.map +1 -1
  93. package/dist/esm/components/Flags/cz.mjs.map +1 -1
  94. package/dist/esm/components/Flags/de.mjs.map +1 -1
  95. package/dist/esm/components/Flags/dj.mjs.map +1 -1
  96. package/dist/esm/components/Flags/dk.mjs.map +1 -1
  97. package/dist/esm/components/Flags/do.mjs.map +1 -1
  98. package/dist/esm/components/Flags/dz.mjs.map +1 -1
  99. package/dist/esm/components/Flags/ec.mjs.map +1 -1
  100. package/dist/esm/components/Flags/ee.mjs.map +1 -1
  101. package/dist/esm/components/Flags/eg.mjs.map +1 -1
  102. package/dist/esm/components/Flags/es-ct.mjs.map +1 -1
  103. package/dist/esm/components/Flags/es-ga.mjs.map +1 -1
  104. package/dist/esm/components/Flags/es-pv.mjs.map +1 -1
  105. package/dist/esm/components/Flags/es.mjs.map +1 -1
  106. package/dist/esm/components/Flags/et.mjs.map +1 -1
  107. package/dist/esm/components/Flags/fi.mjs.map +1 -1
  108. package/dist/esm/components/Flags/fo.mjs.map +1 -1
  109. package/dist/esm/components/Flags/fr.mjs.map +1 -1
  110. package/dist/esm/components/Flags/gb-wls.mjs.map +1 -1
  111. package/dist/esm/components/Flags/gb.mjs.map +1 -1
  112. package/dist/esm/components/Flags/ge.mjs.map +1 -1
  113. package/dist/esm/components/Flags/gh.mjs.map +1 -1
  114. package/dist/esm/components/Flags/gr.mjs.map +1 -1
  115. package/dist/esm/components/Flags/gt.mjs.map +1 -1
  116. package/dist/esm/components/Flags/gw.mjs.map +1 -1
  117. package/dist/esm/components/Flags/hk.mjs.map +1 -1
  118. package/dist/esm/components/Flags/hn.mjs.map +1 -1
  119. package/dist/esm/components/Flags/hr.mjs.map +1 -1
  120. package/dist/esm/components/Flags/hu.mjs.map +1 -1
  121. package/dist/esm/components/Flags/id.mjs.map +1 -1
  122. package/dist/esm/components/Flags/ie.mjs.map +1 -1
  123. package/dist/esm/components/Flags/il.mjs.map +1 -1
  124. package/dist/esm/components/Flags/in.mjs.map +1 -1
  125. package/dist/esm/components/Flags/iq.mjs.map +1 -1
  126. package/dist/esm/components/Flags/ir.mjs.map +1 -1
  127. package/dist/esm/components/Flags/is.mjs.map +1 -1
  128. package/dist/esm/components/Flags/it.mjs.map +1 -1
  129. package/dist/esm/components/Flags/jm.mjs.map +1 -1
  130. package/dist/esm/components/Flags/jo.mjs.map +1 -1
  131. package/dist/esm/components/Flags/jp.mjs.map +1 -1
  132. package/dist/esm/components/Flags/ke.mjs.map +1 -1
  133. package/dist/esm/components/Flags/kg.mjs.map +1 -1
  134. package/dist/esm/components/Flags/kh.mjs.map +1 -1
  135. package/dist/esm/components/Flags/km.mjs.map +1 -1
  136. package/dist/esm/components/Flags/kr.mjs.map +1 -1
  137. package/dist/esm/components/Flags/kw.mjs.map +1 -1
  138. package/dist/esm/components/Flags/kz.mjs.map +1 -1
  139. package/dist/esm/components/Flags/la.mjs.map +1 -1
  140. package/dist/esm/components/Flags/lb.mjs.map +1 -1
  141. package/dist/esm/components/Flags/li.mjs.map +1 -1
  142. package/dist/esm/components/Flags/lk.mjs.map +1 -1
  143. package/dist/esm/components/Flags/lt.mjs.map +1 -1
  144. package/dist/esm/components/Flags/lu.mjs.map +1 -1
  145. package/dist/esm/components/Flags/lv.mjs.map +1 -1
  146. package/dist/esm/components/Flags/ly.mjs.map +1 -1
  147. package/dist/esm/components/Flags/ma.mjs.map +1 -1
  148. package/dist/esm/components/Flags/mc.mjs.map +1 -1
  149. package/dist/esm/components/Flags/md.mjs.map +1 -1
  150. package/dist/esm/components/Flags/mk.mjs.map +1 -1
  151. package/dist/esm/components/Flags/mm.mjs.map +1 -1
  152. package/dist/esm/components/Flags/mn.mjs.map +1 -1
  153. package/dist/esm/components/Flags/mo.mjs.map +1 -1
  154. package/dist/esm/components/Flags/mr.mjs.map +1 -1
  155. package/dist/esm/components/Flags/mt.mjs.map +1 -1
  156. package/dist/esm/components/Flags/mv.mjs.map +1 -1
  157. package/dist/esm/components/Flags/mx.mjs.map +1 -1
  158. package/dist/esm/components/Flags/my.mjs.map +1 -1
  159. package/dist/esm/components/Flags/mz.mjs.map +1 -1
  160. package/dist/esm/components/Flags/ng.mjs.map +1 -1
  161. package/dist/esm/components/Flags/ni.mjs.map +1 -1
  162. package/dist/esm/components/Flags/nl.mjs.map +1 -1
  163. package/dist/esm/components/Flags/no.mjs.map +1 -1
  164. package/dist/esm/components/Flags/np.mjs.map +1 -1
  165. package/dist/esm/components/Flags/nz.mjs.map +1 -1
  166. package/dist/esm/components/Flags/om.mjs.map +1 -1
  167. package/dist/esm/components/Flags/pa.mjs.map +1 -1
  168. package/dist/esm/components/Flags/pe.mjs.map +1 -1
  169. package/dist/esm/components/Flags/ph.mjs.map +1 -1
  170. package/dist/esm/components/Flags/pk.mjs.map +1 -1
  171. package/dist/esm/components/Flags/pl.mjs.map +1 -1
  172. package/dist/esm/components/Flags/pr.mjs.map +1 -1
  173. package/dist/esm/components/Flags/ps.mjs.map +1 -1
  174. package/dist/esm/components/Flags/pt.mjs.map +1 -1
  175. package/dist/esm/components/Flags/py.mjs.map +1 -1
  176. package/dist/esm/components/Flags/qa.mjs.map +1 -1
  177. package/dist/esm/components/Flags/ro.mjs.map +1 -1
  178. package/dist/esm/components/Flags/rs.mjs.map +1 -1
  179. package/dist/esm/components/Flags/ru.mjs.map +1 -1
  180. package/dist/esm/components/Flags/sa.mjs.map +1 -1
  181. package/dist/esm/components/Flags/sd.mjs.map +1 -1
  182. package/dist/esm/components/Flags/se.mjs.map +1 -1
  183. package/dist/esm/components/Flags/sg.mjs.map +1 -1
  184. package/dist/esm/components/Flags/si.mjs.map +1 -1
  185. package/dist/esm/components/Flags/sk.mjs.map +1 -1
  186. package/dist/esm/components/Flags/so.mjs.map +1 -1
  187. package/dist/esm/components/Flags/st.mjs.map +1 -1
  188. package/dist/esm/components/Flags/sv.mjs.map +1 -1
  189. package/dist/esm/components/Flags/sy.mjs.map +1 -1
  190. package/dist/esm/components/Flags/td.mjs.map +1 -1
  191. package/dist/esm/components/Flags/th.mjs.map +1 -1
  192. package/dist/esm/components/Flags/tl.mjs.map +1 -1
  193. package/dist/esm/components/Flags/tn.mjs.map +1 -1
  194. package/dist/esm/components/Flags/tr.mjs.map +1 -1
  195. package/dist/esm/components/Flags/tt.mjs.map +1 -1
  196. package/dist/esm/components/Flags/tw.mjs.map +1 -1
  197. package/dist/esm/components/Flags/tz.mjs.map +1 -1
  198. package/dist/esm/components/Flags/ua.mjs.map +1 -1
  199. package/dist/esm/components/Flags/ug.mjs.map +1 -1
  200. package/dist/esm/components/Flags/us.mjs.map +1 -1
  201. package/dist/esm/components/Flags/uy.mjs.map +1 -1
  202. package/dist/esm/components/Flags/uz.mjs.map +1 -1
  203. package/dist/esm/components/Flags/ve.mjs.map +1 -1
  204. package/dist/esm/components/Flags/vn.mjs.map +1 -1
  205. package/dist/esm/components/Flags/xx.mjs.map +1 -1
  206. package/dist/esm/components/Flags/ye.mjs.map +1 -1
  207. package/dist/esm/components/Flags/za.mjs.map +1 -1
  208. package/dist/esm/components/Flags/zw.mjs.map +1 -1
  209. package/dist/esm/components/Form/FormBase.mjs.map +1 -1
  210. package/dist/esm/components/Form/FormControl.mjs.map +1 -1
  211. package/dist/esm/components/Form/FormDescription.mjs.map +1 -1
  212. package/dist/esm/components/Form/FormField.mjs.map +1 -1
  213. package/dist/esm/components/Form/FormItem.mjs.map +1 -1
  214. package/dist/esm/components/Form/FormLabel.mjs.map +1 -1
  215. package/dist/esm/components/Form/FormMessage.mjs.map +1 -1
  216. package/dist/esm/components/Form/elements/FormElement.mjs.map +1 -1
  217. package/dist/esm/components/Form/elements/FormElementWrapper.mjs.map +1 -1
  218. package/dist/esm/components/Form/elements/MultiselectElement.mjs.map +1 -1
  219. package/dist/esm/components/Form/elements/OTPElement.mjs +1 -1
  220. package/dist/esm/components/Form/elements/OTPElement.mjs.map +1 -1
  221. package/dist/esm/components/Form/elements/SelectElement.mjs.map +1 -1
  222. package/dist/esm/components/Form/elements/SwitchSelectorElement.mjs.map +1 -1
  223. package/dist/esm/components/HTMLRender/HTMLRender.mjs.map +1 -1
  224. package/dist/esm/components/Headers/index.mjs.map +1 -1
  225. package/dist/esm/components/HeightResizer/index.mjs.map +1 -1
  226. package/dist/esm/components/HideShow/index.mjs.map +1 -1
  227. package/dist/esm/components/IDE/Code.mjs.map +1 -1
  228. package/dist/esm/components/IDE/CodeBlockHighlight.mjs.map +1 -1
  229. package/dist/esm/components/IDE/CodeBlockServer.mjs.map +1 -1
  230. package/dist/esm/components/IDE/CodeBlockShiki.mjs.map +1 -1
  231. package/dist/esm/components/IDE/CodeConditionalRenderer.mjs.map +1 -1
  232. package/dist/esm/components/IDE/CodeContext.mjs.map +1 -1
  233. package/dist/esm/components/IDE/CodeFormatSelector.mjs.map +1 -1
  234. package/dist/esm/components/IDE/ContentDeclarationFormatSelector.mjs.map +1 -1
  235. package/dist/esm/components/IDE/CopyCode.mjs.map +1 -1
  236. package/dist/esm/components/IDE/FileTree.mjs.map +1 -1
  237. package/dist/esm/components/IDE/IDE.mjs.map +1 -1
  238. package/dist/esm/components/IDE/MonacoCode.mjs.map +1 -1
  239. package/dist/esm/components/IDE/PackageManagerSelector.mjs.map +1 -1
  240. package/dist/esm/components/IDE/codeTransformer.mjs.map +1 -1
  241. package/dist/esm/components/IDE/createFileTree.mjs.map +1 -1
  242. package/dist/esm/components/Input/Checkbox.mjs +2 -0
  243. package/dist/esm/components/Input/Checkbox.mjs.map +1 -1
  244. package/dist/esm/components/Input/Input.mjs.map +1 -1
  245. package/dist/esm/components/Input/InputPassword.mjs.map +1 -1
  246. package/dist/esm/components/Input/OTPInput.mjs.map +1 -1
  247. package/dist/esm/components/KeyboardScreenAdapter/index.mjs.map +1 -1
  248. package/dist/esm/components/KeyboardShortcut/KeyboardShortcut.mjs.map +1 -1
  249. package/dist/esm/components/LanguageBackground/index.mjs.map +1 -1
  250. package/dist/esm/components/Link/Link.mjs.map +1 -1
  251. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +1 -1
  252. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs.map +1 -1
  253. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContentContext.mjs.map +1 -1
  254. package/dist/esm/components/LocaleSwitcherDropDown/LocaleSwitcher.mjs.map +1 -1
  255. package/dist/esm/components/MarkDownRender/MarkDownIframe.mjs.map +1 -1
  256. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs +5 -20
  257. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
  258. package/dist/esm/components/Modal/Modal.mjs +2 -2
  259. package/dist/esm/components/Modal/Modal.mjs.map +1 -1
  260. package/dist/esm/components/Navbar/MobileNavbar.mjs +1 -1
  261. package/dist/esm/components/Navbar/MobileNavbar.mjs.map +1 -1
  262. package/dist/esm/components/Navbar/index.mjs.map +1 -1
  263. package/dist/esm/components/Navbar/useNavigation.mjs.map +1 -1
  264. package/dist/esm/components/Pagination/NumberItemsSelector.mjs.map +1 -1
  265. package/dist/esm/components/Pagination/Pagination.mjs +1 -1
  266. package/dist/esm/components/Pagination/Pagination.mjs.map +1 -1
  267. package/dist/esm/components/Pagination/ShowingResultsNumberItems.mjs.map +1 -1
  268. package/dist/esm/components/Popover/dynamic.mjs.map +1 -1
  269. package/dist/esm/components/Popover/static.mjs.map +1 -1
  270. package/dist/esm/components/PressableSpan/PressableSpan.mjs.map +1 -1
  271. package/dist/esm/components/RightDrawer/RightDrawer.mjs +3 -3
  272. package/dist/esm/components/RightDrawer/RightDrawer.mjs.map +1 -1
  273. package/dist/esm/components/RightDrawer/isElementAtTopAndNotCovered.mjs.map +1 -1
  274. package/dist/esm/components/RightDrawer/useRightDrawer.mjs.map +1 -1
  275. package/dist/esm/components/Select/Multiselect.mjs.map +1 -1
  276. package/dist/esm/components/Select/Select.mjs.map +1 -1
  277. package/dist/esm/components/SwitchSelector/SwitchSelector.mjs.map +1 -1
  278. package/dist/esm/components/SwitchSelector/VerticalSwitchSelector.mjs.map +1 -1
  279. package/dist/esm/components/SwitchSelector/useSwitchSelector.mjs.map +1 -1
  280. package/dist/esm/components/Tab/Tab.mjs.map +1 -1
  281. package/dist/esm/components/Tab/TabContext.mjs.map +1 -1
  282. package/dist/esm/components/TabSelector/TabSelector.mjs.map +1 -1
  283. package/dist/esm/components/Table/ExpandButton.mjs.map +1 -1
  284. package/dist/esm/components/Table/SmartTable.mjs.map +1 -1
  285. package/dist/esm/components/Table/TableElements.mjs +24 -0
  286. package/dist/esm/components/Table/TableElements.mjs.map +1 -0
  287. package/dist/esm/components/Table/index.mjs +2 -1
  288. package/dist/esm/components/Table/useTableWidths.mjs.map +1 -1
  289. package/dist/esm/components/Tag/index.mjs.map +1 -1
  290. package/dist/esm/components/TechLogo/TechLogo.mjs.map +1 -1
  291. package/dist/esm/components/TechLogo/types.mjs.map +1 -1
  292. package/dist/esm/components/Terminal/Terminal.mjs.map +1 -1
  293. package/dist/esm/components/TextArea/AutoSizeTextArea.mjs.map +1 -1
  294. package/dist/esm/components/TextArea/AutocompleteTextArea.mjs.map +1 -1
  295. package/dist/esm/components/TextArea/ContentEditableTextArea.mjs.map +1 -1
  296. package/dist/esm/components/ThemeSwitcherDropDown/DesktopThemeSwitcher.mjs.map +1 -1
  297. package/dist/esm/components/ThemeSwitcherDropDown/MobileThemeSwitcher.mjs.map +1 -1
  298. package/dist/esm/components/ThemeSwitcherDropDown/types.mjs.map +1 -1
  299. package/dist/esm/components/Toaster/Toast.mjs.map +1 -1
  300. package/dist/esm/components/Toaster/Toaster.mjs.map +1 -1
  301. package/dist/esm/components/Toaster/useToast.mjs.map +1 -1
  302. package/dist/esm/components/WithResizer/index.mjs.map +1 -1
  303. package/dist/esm/components/index.mjs +2 -1
  304. package/dist/esm/hooks/index.mjs +9 -9
  305. package/dist/esm/hooks/reactQuery.mjs.map +1 -1
  306. package/dist/esm/hooks/useAuth/useAuth.mjs.map +1 -1
  307. package/dist/esm/hooks/useAuth/useOAuth2.mjs +1 -1
  308. package/dist/esm/hooks/useAuth/useOAuth2.mjs.map +1 -1
  309. package/dist/esm/hooks/useAuth/useSession.mjs +1 -1
  310. package/dist/esm/hooks/useAuth/useSession.mjs.map +1 -1
  311. package/dist/esm/hooks/useDevice.mjs.map +1 -1
  312. package/dist/esm/hooks/useGetElementById.mjs.map +1 -1
  313. package/dist/esm/hooks/useGetElementOrWindow.mjs.map +1 -1
  314. package/dist/esm/hooks/useHorizontalSwipe.mjs.map +1 -1
  315. package/dist/esm/hooks/useIntlayerAPI.mjs.map +1 -1
  316. package/dist/esm/hooks/useIsDarkMode.mjs.map +1 -1
  317. package/dist/esm/hooks/useIsMounted.mjs.map +1 -1
  318. package/dist/esm/hooks/useItemSelector.mjs.map +1 -1
  319. package/dist/esm/hooks/useKeyboardDetector.mjs.map +1 -1
  320. package/dist/esm/hooks/usePersistedStore.mjs.map +1 -1
  321. package/dist/esm/hooks/useScreenWidth.mjs.map +1 -1
  322. package/dist/esm/hooks/useScrollBlockage/index.mjs.map +1 -1
  323. package/dist/esm/hooks/useScrollBlockage/useScrollBlockageStore.mjs.map +1 -1
  324. package/dist/esm/hooks/useScrollDetection.mjs.map +1 -1
  325. package/dist/esm/hooks/useScrollY.mjs.map +1 -1
  326. package/dist/esm/hooks/useSearch.mjs.map +1 -1
  327. package/dist/esm/hooks/useUser/index.mjs.map +1 -1
  328. package/dist/esm/libs/auth.mjs +1 -1
  329. package/dist/esm/libs/auth.mjs.map +1 -1
  330. package/dist/esm/providers/ReactQueryProvider.mjs.map +1 -1
  331. package/dist/esm/tailwind.config.mjs.map +1 -1
  332. package/dist/types/components/Badge/index.d.ts +1 -1
  333. package/dist/types/components/Button/Button.d.ts +3 -3
  334. package/dist/types/components/Command/index.d.ts +1 -1
  335. package/dist/types/components/Container/index.d.ts +2 -2
  336. package/dist/types/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
  337. package/dist/types/components/Input/Checkbox.d.ts +2 -1
  338. package/dist/types/components/Input/Checkbox.d.ts.map +1 -1
  339. package/dist/types/components/Link/Link.d.ts +2 -2
  340. package/dist/types/components/MarkDownRender/MarkDownRender.d.ts.map +1 -1
  341. package/dist/types/components/Pagination/Pagination.d.ts +1 -1
  342. package/dist/types/components/Tab/Tab.d.ts +1 -1
  343. package/dist/types/components/Table/TableElements.d.ts +23 -0
  344. package/dist/types/components/Table/TableElements.d.ts.map +1 -0
  345. package/dist/types/components/Table/index.d.ts +2 -1
  346. package/dist/types/components/Tag/index.d.ts +1 -1
  347. package/dist/types/components/index.d.ts +2 -1
  348. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/HeightResizer/index.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport type React from 'react';\nimport {\n type DetailedHTMLProps,\n type FC,\n type HTMLAttributes,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nconst HANDLE_DOUBLE_CLICK_ZONE_PX = 16;\n\n/**\n * Props for the HeightResizer component\n *\n * @interface HeightResizerProps\n */\ntype HeightResizerProps = {\n /**\n * Initial height in pixels for the resizable container\n * Sets the default size when the component first loads\n * @example 200\n */\n initialHeight: number;\n\n /**\n * Maximum height in pixels that the user can resize to (optional)\n * When undefined, no maximum limit is enforced\n * @example 500\n */\n maxHeight?: number;\n\n /**\n * Minimum height in pixels that the user can resize to (optional)\n * Prevents the container from being resized below this threshold\n * @default 0\n * @example 50\n */\n minHeight?: number;\n} & DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n/**\n * HeightResizer Component\n *\n * A resizable container component that allows users to dynamically adjust the height\n * by dragging a visual handle at the top. Provides smooth resizing with optional\n * minimum and maximum height constraints.\n *\n * ## Key Features\n * - **Interactive Resizing**: Drag handle to resize container vertically\n * - **Touch Support**: Full support for touch devices and mobile interactions\n * - **Height Constraints**: Optional minimum and maximum height limits\n * - **Visual Feedback**: Handle with hover and active states for clear interaction\n * - **Accessibility**: ARIA slider role with value announcements for screen readers\n * - **Smooth Animation**: CSS transitions for polished user experience\n *\n * ## Use Cases\n * - Code editors with resizable panels\n * - Chat interfaces with adjustable message areas\n * - Dashboard widgets with user-customizable sizes\n * - Documentation viewers with resizable content panes\n * - Settings panels with expandable sections\n *\n * ## Interaction Model\n * The component uses a drag interaction model where users click and drag the visual\n * handle (rounded bar) at the top of the container. The resize calculation is based\n * on the difference between the current cursor position and the container's top edge.\n *\n * ## Accessibility Features\n * - **ARIA Slider**: Proper slider role for assistive technologies\n * - **Value Announcements**: Current, min, and max values announced to screen readers\n * - **Keyboard Navigation**: Focusable with standard slider keyboard support\n * - **Visual Indicators**: Clear visual handle for drag interaction\n *\n * @component\n * @example\n * ```tsx\n * // Basic usage\n * <HeightResizer initialHeight={200}>\n * <div>Your resizable content here</div>\n * </HeightResizer>\n *\n * // With height constraints\n * <HeightResizer\n * initialHeight={300}\n * minHeight={100}\n * maxHeight={600}\n * >\n * <div>Content with size limits</div>\n * </HeightResizer>\n *\n * // In a code editor context\n * <HeightResizer\n * initialHeight={400}\n * minHeight={150}\n * className=\"border rounded-lg\"\n * >\n * <CodeEditor />\n * </HeightResizer>\n * ```\n *\n * @param props - HeightResizer component props\n * @param props.initialHeight - Starting height in pixels\n * @param props.minHeight - Optional minimum height constraint\n * @param props.maxHeight - Optional maximum height constraint\n * @param props.children - Content to display in the resizable container\n * @param props.className - Additional CSS classes for styling\n * @returns Interactive resizable container component\n */\nexport const HeightResizer: FC<PropsWithChildren<HeightResizerProps>> = ({\n initialHeight,\n maxHeight,\n minHeight = 0,\n children,\n className,\n ...props\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState(initialHeight);\n const [isResizing, setIsResizing] = useState(false);\n const lastExpandedHeightRef = useRef(initialHeight);\n\n /**\n * Handler to initiate the resizing process\n * Prevents default browser behavior and sets the resizing state\n *\n * @param mouseDownEvent - Mouse or touch event from the drag handle\n */\n const startResizing = useCallback(\n (\n mouseDownEvent:\n | React.MouseEvent<HTMLDivElement>\n | React.TouchEvent<HTMLDivElement>\n ) => {\n setIsResizing(true);\n mouseDownEvent.preventDefault();\n },\n []\n );\n\n /**\n * Handler to stop the resizing process\n * Resets the resizing state when user releases the drag handle\n */\n const stopResizing = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n /**\n * Core resize logic that calculates new height based on cursor position\n * Handles both mouse and touch events with boundary checking\n *\n * @param mouseMoveEvent - Mouse or touch move event during drag\n */\n const resize = useCallback(\n (mouseMoveEvent: MouseEvent | TouchEvent) => {\n const container = containerRef.current;\n if (isResizing && container) {\n const { height: containerHeight, top: containerTop } =\n container.getBoundingClientRect();\n\n let clientY = 0;\n if (mouseMoveEvent instanceof MouseEvent) {\n clientY = mouseMoveEvent.clientY;\n } else if (mouseMoveEvent instanceof TouchEvent) {\n clientY = mouseMoveEvent.touches[0].clientY;\n }\n\n const resizeDifference = clientY - containerTop;\n const newHeight = containerHeight - resizeDifference;\n\n // Apply height constraints\n let correctedHeight = Math.max(newHeight, minHeight);\n if (maxHeight !== undefined) {\n correctedHeight = Math.min(correctedHeight, maxHeight);\n }\n\n setHeight(correctedHeight);\n }\n },\n [isResizing, minHeight, maxHeight]\n );\n\n /**\n * Effect to manage global event listeners for resize interactions\n * Handles both mouse and touch events with proper cleanup\n */\n useEffect(() => {\n window.addEventListener('mousemove', resize, { passive: true });\n window.addEventListener('mouseup', stopResizing);\n window.addEventListener('touchmove', resize, { passive: true });\n window.addEventListener('touchend', stopResizing);\n\n return () => {\n window.removeEventListener('mousemove', resize);\n window.removeEventListener('mouseup', stopResizing);\n window.removeEventListener('touchmove', resize);\n window.removeEventListener('touchend', stopResizing);\n };\n }, [resize, stopResizing]);\n\n useEffect(() => {\n if (height > minHeight) {\n lastExpandedHeightRef.current = height;\n }\n }, [height, minHeight]);\n\n const handleDoubleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const el = containerRef.current;\n if (!el) return;\n\n const { top } = el.getBoundingClientRect();\n if (event.clientY - top > HANDLE_DOUBLE_CLICK_ZONE_PX) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (height > minHeight) {\n setHeight(minHeight);\n return;\n }\n\n const capped =\n maxHeight !== undefined\n ? Math.min(lastExpandedHeightRef.current, maxHeight)\n : lastExpandedHeightRef.current;\n setHeight(Math.max(capped, minHeight));\n },\n [height, maxHeight, minHeight]\n );\n\n return (\n <div\n className={cn(\n 'relative h-full max-h-[80%] w-full cursor-ns-resize border-neutral-200 border-t-[2px] transition dark:border-neutral-950',\n 'before:absolute before:top-0 before:left-1/2 before:z-10 before:block before:h-2 before:w-10 before:-translate-x-1/2 before:-translate-y-1/2 before:transform before:cursor-ns-resize before:rounded-full before:bg-neutral-200 before:transition before:content-[\"\"] dark:before:bg-neutral-950',\n 'active:border-neutral-400 active:before:bg-neutral-400 dark:active:border-neutral-600 active:dark:before:bg-neutral-600',\n className\n )}\n style={{\n height: `${height}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n minHeight: `${minHeight}px`,\n }}\n ref={containerRef}\n onMouseDown={startResizing}\n onTouchStart={startResizing}\n onDoubleClick={handleDoubleClick}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight}\n aria-valuenow={height}\n aria-label=\"Resizable component - drag the handle to adjust height\"\n role=\"slider\"\n tabIndex={0}\n {...props}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Stops content clicks from triggering resize on the parent slider */}\n <div\n role=\"presentation\"\n className=\"absolute top-0 left-0 size-full cursor-default overflow-hidden\"\n onMouseDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAeA,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmGpC,MAAa,iBAA4D,EACvE,eACA,WACA,YAAY,GACZ,UACA,WACA,GAAG,YACC;CACJ,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,CAAC,QAAQ,aAAa,SAAS,cAAc;CACnD,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,wBAAwB,OAAO,cAAc;;;;;;;CAQnD,MAAM,gBAAgB,aAElB,mBAGG;AACH,gBAAc,KAAK;AACnB,iBAAe,gBAAgB;IAEjC,EAAE,CACH;;;;;CAMD,MAAM,eAAe,kBAAkB;AACrC,gBAAc,MAAM;IACnB,EAAE,CAAC;;;;;;;CAQN,MAAM,SAAS,aACZ,mBAA4C;EAC3C,MAAM,YAAY,aAAa;AAC/B,MAAI,cAAc,WAAW;GAC3B,MAAM,EAAE,QAAQ,iBAAiB,KAAK,iBACpC,UAAU,uBAAuB;GAEnC,IAAI,UAAU;AACd,OAAI,0BAA0B,WAC5B,WAAU,eAAe;YAChB,0BAA0B,WACnC,WAAU,eAAe,QAAQ,GAAG;GAItC,MAAM,YAAY,mBADO,UAAU;GAInC,IAAI,kBAAkB,KAAK,IAAI,WAAW,UAAU;AACpD,OAAI,cAAc,OAChB,mBAAkB,KAAK,IAAI,iBAAiB,UAAU;AAGxD,aAAU,gBAAgB;;IAG9B;EAAC;EAAY;EAAW;EAAU,CACnC;;;;;AAMD,iBAAgB;AACd,SAAO,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC/D,SAAO,iBAAiB,WAAW,aAAa;AAChD,SAAO,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC/D,SAAO,iBAAiB,YAAY,aAAa;AAEjD,eAAa;AACX,UAAO,oBAAoB,aAAa,OAAO;AAC/C,UAAO,oBAAoB,WAAW,aAAa;AACnD,UAAO,oBAAoB,aAAa,OAAO;AAC/C,UAAO,oBAAoB,YAAY,aAAa;;IAErD,CAAC,QAAQ,aAAa,CAAC;AAE1B,iBAAgB;AACd,MAAI,SAAS,UACX,uBAAsB,UAAU;IAEjC,CAAC,QAAQ,UAAU,CAAC;CAEvB,MAAM,oBAAoB,aACvB,UAA4C;EAC3C,MAAM,KAAK,aAAa;AACxB,MAAI,CAAC,GAAI;EAET,MAAM,EAAE,QAAQ,GAAG,uBAAuB;AAC1C,MAAI,MAAM,UAAU,MAAM,4BAA6B;AAEvD,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AAEvB,MAAI,SAAS,WAAW;AACtB,aAAU,UAAU;AACpB;;EAGF,MAAM,SACJ,cAAc,SACV,KAAK,IAAI,sBAAsB,SAAS,UAAU,GAClD,sBAAsB;AAC5B,YAAU,KAAK,IAAI,QAAQ,UAAU,CAAC;IAExC;EAAC;EAAQ;EAAW;EAAU,CAC/B;AAED,QACE,oBAAC,OAAD;EACE,WAAW,GACT,4HACA,sSACA,2HACA,UACD;EACD,OAAO;GACL,QAAQ,GAAG,OAAO;GAClB,WAAW,YAAY,GAAG,UAAU,MAAM;GAC1C,WAAW,GAAG,UAAU;GACzB;EACD,KAAK;EACL,aAAa;EACb,cAAc;EACd,eAAe;EACf,iBAAe;EACf,iBAAe;EACf,iBAAe;EACf,cAAW;EACX,MAAK;EACL,UAAU;EACV,GAAI;YAGJ,oBAAC,OAAD;GACE,MAAK;GACL,WAAU;GACV,cAAc,MAAM,EAAE,iBAAiB;GACvC,eAAe,MAAM,EAAE,iBAAiB;GAEvC;GACG;EACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/HeightResizer/index.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport type React from 'react';\nimport {\n type DetailedHTMLProps,\n type FC,\n type HTMLAttributes,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nconst HANDLE_DOUBLE_CLICK_ZONE_PX = 16;\n\n/**\n * Props for the HeightResizer component\n *\n * @interface HeightResizerProps\n */\ntype HeightResizerProps = {\n /**\n * Initial height in pixels for the resizable container\n * Sets the default size when the component first loads\n * @example 200\n */\n initialHeight: number;\n\n /**\n * Maximum height in pixels that the user can resize to (optional)\n * When undefined, no maximum limit is enforced\n * @example 500\n */\n maxHeight?: number;\n\n /**\n * Minimum height in pixels that the user can resize to (optional)\n * Prevents the container from being resized below this threshold\n * @default 0\n * @example 50\n */\n minHeight?: number;\n} & DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n/**\n * HeightResizer Component\n *\n * A resizable container component that allows users to dynamically adjust the height\n * by dragging a visual handle at the top. Provides smooth resizing with optional\n * minimum and maximum height constraints.\n *\n * ## Key Features\n * - **Interactive Resizing**: Drag handle to resize container vertically\n * - **Touch Support**: Full support for touch devices and mobile interactions\n * - **Height Constraints**: Optional minimum and maximum height limits\n * - **Visual Feedback**: Handle with hover and active states for clear interaction\n * - **Accessibility**: ARIA slider role with value announcements for screen readers\n * - **Smooth Animation**: CSS transitions for polished user experience\n *\n * ## Use Cases\n * - Code editors with resizable panels\n * - Chat interfaces with adjustable message areas\n * - Dashboard widgets with user-customizable sizes\n * - Documentation viewers with resizable content panes\n * - Settings panels with expandable sections\n *\n * ## Interaction Model\n * The component uses a drag interaction model where users click and drag the visual\n * handle (rounded bar) at the top of the container. The resize calculation is based\n * on the difference between the current cursor position and the container's top edge.\n *\n * ## Accessibility Features\n * - **ARIA Slider**: Proper slider role for assistive technologies\n * - **Value Announcements**: Current, min, and max values announced to screen readers\n * - **Keyboard Navigation**: Focusable with standard slider keyboard support\n * - **Visual Indicators**: Clear visual handle for drag interaction\n *\n * @component\n * @example\n * ```tsx\n * // Basic usage\n * <HeightResizer initialHeight={200}>\n * <div>Your resizable content here</div>\n * </HeightResizer>\n *\n * // With height constraints\n * <HeightResizer\n * initialHeight={300}\n * minHeight={100}\n * maxHeight={600}\n * >\n * <div>Content with size limits</div>\n * </HeightResizer>\n *\n * // In a code editor context\n * <HeightResizer\n * initialHeight={400}\n * minHeight={150}\n * className=\"border rounded-lg\"\n * >\n * <CodeEditor />\n * </HeightResizer>\n * ```\n *\n * @param props - HeightResizer component props\n * @param props.initialHeight - Starting height in pixels\n * @param props.minHeight - Optional minimum height constraint\n * @param props.maxHeight - Optional maximum height constraint\n * @param props.children - Content to display in the resizable container\n * @param props.className - Additional CSS classes for styling\n * @returns Interactive resizable container component\n */\nexport const HeightResizer: FC<PropsWithChildren<HeightResizerProps>> = ({\n initialHeight,\n maxHeight,\n minHeight = 0,\n children,\n className,\n ...props\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState(initialHeight);\n const [isResizing, setIsResizing] = useState(false);\n const lastExpandedHeightRef = useRef(initialHeight);\n\n /**\n * Handler to initiate the resizing process\n * Prevents default browser behavior and sets the resizing state\n *\n * @param mouseDownEvent - Mouse or touch event from the drag handle\n */\n const startResizing = useCallback(\n (\n mouseDownEvent:\n | React.MouseEvent<HTMLDivElement>\n | React.TouchEvent<HTMLDivElement>\n ) => {\n setIsResizing(true);\n mouseDownEvent.preventDefault();\n },\n []\n );\n\n /**\n * Handler to stop the resizing process\n * Resets the resizing state when user releases the drag handle\n */\n const stopResizing = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n /**\n * Core resize logic that calculates new height based on cursor position\n * Handles both mouse and touch events with boundary checking\n *\n * @param mouseMoveEvent - Mouse or touch move event during drag\n */\n const resize = useCallback(\n (mouseMoveEvent: MouseEvent | TouchEvent) => {\n const container = containerRef.current;\n if (isResizing && container) {\n const { height: containerHeight, top: containerTop } =\n container.getBoundingClientRect();\n\n let clientY = 0;\n if (mouseMoveEvent instanceof MouseEvent) {\n clientY = mouseMoveEvent.clientY;\n } else if (mouseMoveEvent instanceof TouchEvent) {\n clientY = mouseMoveEvent.touches[0].clientY;\n }\n\n const resizeDifference = clientY - containerTop;\n const newHeight = containerHeight - resizeDifference;\n\n // Apply height constraints\n let correctedHeight = Math.max(newHeight, minHeight);\n if (maxHeight !== undefined) {\n correctedHeight = Math.min(correctedHeight, maxHeight);\n }\n\n setHeight(correctedHeight);\n }\n },\n [isResizing, minHeight, maxHeight]\n );\n\n /**\n * Effect to manage global event listeners for resize interactions\n * Handles both mouse and touch events with proper cleanup\n */\n useEffect(() => {\n window.addEventListener('mousemove', resize, { passive: true });\n window.addEventListener('mouseup', stopResizing);\n window.addEventListener('touchmove', resize, { passive: true });\n window.addEventListener('touchend', stopResizing);\n\n return () => {\n window.removeEventListener('mousemove', resize);\n window.removeEventListener('mouseup', stopResizing);\n window.removeEventListener('touchmove', resize);\n window.removeEventListener('touchend', stopResizing);\n };\n }, [resize, stopResizing]);\n\n useEffect(() => {\n if (height > minHeight) {\n lastExpandedHeightRef.current = height;\n }\n }, [height, minHeight]);\n\n const handleDoubleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const el = containerRef.current;\n if (!el) return;\n\n const { top } = el.getBoundingClientRect();\n if (event.clientY - top > HANDLE_DOUBLE_CLICK_ZONE_PX) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (height > minHeight) {\n setHeight(minHeight);\n return;\n }\n\n const capped =\n maxHeight !== undefined\n ? Math.min(lastExpandedHeightRef.current, maxHeight)\n : lastExpandedHeightRef.current;\n setHeight(Math.max(capped, minHeight));\n },\n [height, maxHeight, minHeight]\n );\n\n return (\n <div\n className={cn(\n 'relative h-full max-h-[80%] w-full cursor-ns-resize border-neutral-200 border-t-[2px] transition dark:border-neutral-950',\n 'before:absolute before:top-0 before:left-1/2 before:z-10 before:block before:h-2 before:w-10 before:-translate-x-1/2 before:-translate-y-1/2 before:transform before:cursor-ns-resize before:rounded-full before:bg-neutral-200 before:transition before:content-[\"\"] dark:before:bg-neutral-950',\n 'active:border-neutral-400 active:before:bg-neutral-400 dark:active:border-neutral-600 active:dark:before:bg-neutral-600',\n className\n )}\n style={{\n height: `${height}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n minHeight: `${minHeight}px`,\n }}\n ref={containerRef}\n onMouseDown={startResizing}\n onTouchStart={startResizing}\n onDoubleClick={handleDoubleClick}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight}\n aria-valuenow={height}\n aria-label=\"Resizable component - drag the handle to adjust height\"\n role=\"slider\"\n tabIndex={0}\n {...props}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Stops content clicks from triggering resize on the parent slider */}\n <div\n role=\"presentation\"\n className=\"absolute top-0 left-0 size-full cursor-default overflow-hidden\"\n onMouseDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAeA,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmGpC,MAAa,iBAA4D,EACvE,eACA,WACA,YAAY,GACZ,UACA,WACA,GAAG,YACC;CACJ,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,CAAC,QAAQ,aAAa,SAAS,cAAc;CACnD,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,wBAAwB,OAAO,cAAc;;;;;;;CAQnD,MAAM,gBAAgB,aAElB,mBAGG;EACH,cAAc,KAAK;EACnB,eAAe,gBAAgB;IAEjC,EAAE,CACH;;;;;CAMD,MAAM,eAAe,kBAAkB;EACrC,cAAc,MAAM;IACnB,EAAE,CAAC;;;;;;;CAQN,MAAM,SAAS,aACZ,mBAA4C;EAC3C,MAAM,YAAY,aAAa;EAC/B,IAAI,cAAc,WAAW;GAC3B,MAAM,EAAE,QAAQ,iBAAiB,KAAK,iBACpC,UAAU,uBAAuB;GAEnC,IAAI,UAAU;GACd,IAAI,0BAA0B,YAC5B,UAAU,eAAe;QACpB,IAAI,0BAA0B,YACnC,UAAU,eAAe,QAAQ,GAAG;GAItC,MAAM,YAAY,mBADO,UAAU;GAInC,IAAI,kBAAkB,KAAK,IAAI,WAAW,UAAU;GACpD,IAAI,cAAc,QAChB,kBAAkB,KAAK,IAAI,iBAAiB,UAAU;GAGxD,UAAU,gBAAgB;;IAG9B;EAAC;EAAY;EAAW;EAAU,CACnC;;;;;CAMD,gBAAgB;EACd,OAAO,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;EAC/D,OAAO,iBAAiB,WAAW,aAAa;EAChD,OAAO,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;EAC/D,OAAO,iBAAiB,YAAY,aAAa;EAEjD,aAAa;GACX,OAAO,oBAAoB,aAAa,OAAO;GAC/C,OAAO,oBAAoB,WAAW,aAAa;GACnD,OAAO,oBAAoB,aAAa,OAAO;GAC/C,OAAO,oBAAoB,YAAY,aAAa;;IAErD,CAAC,QAAQ,aAAa,CAAC;CAE1B,gBAAgB;EACd,IAAI,SAAS,WACX,sBAAsB,UAAU;IAEjC,CAAC,QAAQ,UAAU,CAAC;CAEvB,MAAM,oBAAoB,aACvB,UAA4C;EAC3C,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,IAAI;EAET,MAAM,EAAE,QAAQ,GAAG,uBAAuB;EAC1C,IAAI,MAAM,UAAU,MAAM,6BAA6B;EAEvD,MAAM,gBAAgB;EACtB,MAAM,iBAAiB;EAEvB,IAAI,SAAS,WAAW;GACtB,UAAU,UAAU;GACpB;;EAGF,MAAM,SACJ,cAAc,SACV,KAAK,IAAI,sBAAsB,SAAS,UAAU,GAClD,sBAAsB;EAC5B,UAAU,KAAK,IAAI,QAAQ,UAAU,CAAC;IAExC;EAAC;EAAQ;EAAW;EAAU,CAC/B;CAED,OACE,oBAAC,OAAD;EACE,WAAW,GACT,4HACA,sSACA,2HACA,UACD;EACD,OAAO;GACL,QAAQ,GAAG,OAAO;GAClB,WAAW,YAAY,GAAG,UAAU,MAAM;GAC1C,WAAW,GAAG,UAAU;GACzB;EACD,KAAK;EACL,aAAa;EACb,cAAc;EACd,eAAe;EACf,iBAAe;EACf,iBAAe;EACf,iBAAe;EACf,cAAW;EACX,MAAK;EACL,UAAU;EACV,GAAI;YAGJ,oBAAC,OAAD;GACE,MAAK;GACL,WAAU;GACV,cAAc,MAAM,EAAE,iBAAiB;GACvC,eAAe,MAAM,EAAE,iBAAiB;GAEvC;GACG;EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/HideShow/index.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { Eye, EyeOff } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\n/**\n * Props for the HideShow component\n */\nexport interface HideShowProps {\n /**\n * Sensitive text to display masked. Copy is only allowed when revealed.\n */\n text: string;\n\n /** Wrapper classes */\n className?: string;\n\n /** Number of prefix characters to keep visible when masked. Default: 6 */\n visiblePrefixChars?: number;\n\n /** Character used to mask hidden portion. Default: '•' */\n maskChar?: string;\n\n /** Reveal duration in ms before auto-hiding. Default: 10000 (10s) */\n revealDurationMs?: number;\n\n /** Copy error callback */\n onCopyError?: (error: Error) => void;\n}\n\n// Insert zero-width spaces every N chars so Safari can wrap long runs\nconst insertBreaks = (str: string, groupSize = 6) =>\n str.replace(new RegExp(`.{1,${groupSize}}`, 'g'), '$&\\u200b');\n\nexport const HideShow: FC<HideShowProps> = ({\n text,\n className,\n visiblePrefixChars = 6,\n maskChar = '•',\n revealDurationMs = 10000,\n}) => {\n const [isRevealed, setIsRevealed] = useState(false);\n const hideTimerRef = useRef<number | null>(null);\n\n const maskedText = useMemo(() => {\n if (!text) return '';\n if (visiblePrefixChars <= 0) return maskChar.repeat(text.length);\n const prefix = text.slice(0, visiblePrefixChars);\n const remaining = Math.max(0, text.length - visiblePrefixChars);\n return insertBreaks(`${prefix}${maskChar.repeat(remaining)}`);\n }, [text, visiblePrefixChars, maskChar]);\n\n useEffect(() => {\n return () => {\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n }, []);\n\n const reveal = () => {\n if (isRevealed) return;\n setIsRevealed(true);\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n hideTimerRef.current = window.setTimeout(() => {\n setIsRevealed(false);\n }, revealDurationMs);\n };\n\n const hide = () => {\n setIsRevealed(false);\n\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n const IconComponent = isRevealed ? EyeOff : Eye;\n\n return (\n <span\n className={cn(\n 'inline-flex max-w-full items-center gap-2 rounded-md p-0.5 hover:cursor-pointer hover:bg-neutral/10',\n className\n )}\n onClick={isRevealed ? hide : reveal}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n isRevealed ? hide() : reveal();\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n <span className=\"min-w-0 break-all\">\n {isRevealed ? text : maskedText}\n </span>\n <IconComponent className=\"ml-1 ml-auto size-4 min-w-4 shrink-0\" />\n </span>\n );\n};\n"],"mappings":";;;;;;;;AAgCA,MAAM,gBAAgB,KAAa,YAAY,MAC7C,IAAI,QAAQ,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI,EAAE,MAAW;AAE/D,MAAa,YAA+B,EAC1C,MACA,WACA,qBAAqB,GACrB,WAAW,KACX,mBAAmB,UACf;CACJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,eAAe,OAAsB,KAAK;CAEhD,MAAM,aAAa,cAAc;AAC/B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,sBAAsB,EAAG,QAAO,SAAS,OAAO,KAAK,OAAO;EAChE,MAAM,SAAS,KAAK,MAAM,GAAG,mBAAmB;EAChD,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,SAAS,mBAAmB;AAC/D,SAAO,aAAa,GAAG,SAAS,SAAS,OAAO,UAAU,GAAG;IAC5D;EAAC;EAAM;EAAoB;EAAS,CAAC;AAExC,iBAAgB;AACd,eAAa;AACX,OAAI,aAAa,SAAS;AACxB,WAAO,aAAa,aAAa,QAAQ;AACzC,iBAAa,UAAU;;;IAG1B,EAAE,CAAC;CAEN,MAAM,eAAe;AACnB,MAAI,WAAY;AAChB,gBAAc,KAAK;AACnB,MAAI,aAAa,SAAS;AACxB,UAAO,aAAa,aAAa,QAAQ;AACzC,gBAAa,UAAU;;AAEzB,eAAa,UAAU,OAAO,iBAAiB;AAC7C,iBAAc,MAAM;KACnB,iBAAiB;;CAGtB,MAAM,aAAa;AACjB,gBAAc,MAAM;AAEpB,MAAI,aAAa,SAAS;AACxB,UAAO,aAAa,aAAa,QAAQ;AACzC,gBAAa,UAAU;;;CAI3B,MAAM,gBAAgB,aAAa,SAAS;AAE5C,QACE,qBAAC,QAAD;EACE,WAAW,GACT,uGACA,UACD;EACD,SAAS,aAAa,OAAO;EAC7B,YAAY,MAAM;AAChB,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,MAAE,gBAAgB;AAClB,iBAAa,MAAM,GAAG,QAAQ;;;EAGlC,MAAK;EACL,UAAU;YAbZ,CAeE,oBAAC,QAAD;GAAM,WAAU;aACb,aAAa,OAAO;GAChB,GACP,oBAAC,eAAD,EAAe,WAAU,wCAAyC,EAC7D"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/HideShow/index.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { Eye, EyeOff } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\n/**\n * Props for the HideShow component\n */\nexport interface HideShowProps {\n /**\n * Sensitive text to display masked. Copy is only allowed when revealed.\n */\n text: string;\n\n /** Wrapper classes */\n className?: string;\n\n /** Number of prefix characters to keep visible when masked. Default: 6 */\n visiblePrefixChars?: number;\n\n /** Character used to mask hidden portion. Default: '•' */\n maskChar?: string;\n\n /** Reveal duration in ms before auto-hiding. Default: 10000 (10s) */\n revealDurationMs?: number;\n\n /** Copy error callback */\n onCopyError?: (error: Error) => void;\n}\n\n// Insert zero-width spaces every N chars so Safari can wrap long runs\nconst insertBreaks = (str: string, groupSize = 6) =>\n str.replace(new RegExp(`.{1,${groupSize}}`, 'g'), '$&\\u200b');\n\nexport const HideShow: FC<HideShowProps> = ({\n text,\n className,\n visiblePrefixChars = 6,\n maskChar = '•',\n revealDurationMs = 10000,\n}) => {\n const [isRevealed, setIsRevealed] = useState(false);\n const hideTimerRef = useRef<number | null>(null);\n\n const maskedText = useMemo(() => {\n if (!text) return '';\n if (visiblePrefixChars <= 0) return maskChar.repeat(text.length);\n const prefix = text.slice(0, visiblePrefixChars);\n const remaining = Math.max(0, text.length - visiblePrefixChars);\n return insertBreaks(`${prefix}${maskChar.repeat(remaining)}`);\n }, [text, visiblePrefixChars, maskChar]);\n\n useEffect(() => {\n return () => {\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n }, []);\n\n const reveal = () => {\n if (isRevealed) return;\n setIsRevealed(true);\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n hideTimerRef.current = window.setTimeout(() => {\n setIsRevealed(false);\n }, revealDurationMs);\n };\n\n const hide = () => {\n setIsRevealed(false);\n\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n const IconComponent = isRevealed ? EyeOff : Eye;\n\n return (\n <span\n className={cn(\n 'inline-flex max-w-full items-center gap-2 rounded-md p-0.5 hover:cursor-pointer hover:bg-neutral/10',\n className\n )}\n onClick={isRevealed ? hide : reveal}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n isRevealed ? hide() : reveal();\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n <span className=\"min-w-0 break-all\">\n {isRevealed ? text : maskedText}\n </span>\n <IconComponent className=\"ml-1 ml-auto size-4 min-w-4 shrink-0\" />\n </span>\n );\n};\n"],"mappings":";;;;;;;;AAgCA,MAAM,gBAAgB,KAAa,YAAY,MAC7C,IAAI,QAAQ,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI,EAAE,MAAW;AAE/D,MAAa,YAA+B,EAC1C,MACA,WACA,qBAAqB,GACrB,WAAW,KACX,mBAAmB,UACf;CACJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,eAAe,OAAsB,KAAK;CAEhD,MAAM,aAAa,cAAc;EAC/B,IAAI,CAAC,MAAM,OAAO;EAClB,IAAI,sBAAsB,GAAG,OAAO,SAAS,OAAO,KAAK,OAAO;EAChE,MAAM,SAAS,KAAK,MAAM,GAAG,mBAAmB;EAChD,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,SAAS,mBAAmB;EAC/D,OAAO,aAAa,GAAG,SAAS,SAAS,OAAO,UAAU,GAAG;IAC5D;EAAC;EAAM;EAAoB;EAAS,CAAC;CAExC,gBAAgB;EACd,aAAa;GACX,IAAI,aAAa,SAAS;IACxB,OAAO,aAAa,aAAa,QAAQ;IACzC,aAAa,UAAU;;;IAG1B,EAAE,CAAC;CAEN,MAAM,eAAe;EACnB,IAAI,YAAY;EAChB,cAAc,KAAK;EACnB,IAAI,aAAa,SAAS;GACxB,OAAO,aAAa,aAAa,QAAQ;GACzC,aAAa,UAAU;;EAEzB,aAAa,UAAU,OAAO,iBAAiB;GAC7C,cAAc,MAAM;KACnB,iBAAiB;;CAGtB,MAAM,aAAa;EACjB,cAAc,MAAM;EAEpB,IAAI,aAAa,SAAS;GACxB,OAAO,aAAa,aAAa,QAAQ;GACzC,aAAa,UAAU;;;CAI3B,MAAM,gBAAgB,aAAa,SAAS;CAE5C,OACE,qBAAC,QAAD;EACE,WAAW,GACT,uGACA,UACD;EACD,SAAS,aAAa,OAAO;EAC7B,YAAY,MAAM;GAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;IACtC,EAAE,gBAAgB;IAClB,aAAa,MAAM,GAAG,QAAQ;;;EAGlC,MAAK;EACL,UAAU;YAbZ,CAeE,oBAAC,QAAD;GAAM,WAAU;aACb,aAAa,OAAO;GAChB,GACP,oBAAC,eAAD,EAAe,WAAU,wCAAyC,EAC7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"Code.mjs","names":[],"sources":["../../../../src/components/IDE/Code.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport type { FC, HTMLAttributes, ReactNode } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { Container } from '../Container';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { CodeBlock } from './CodeBlockClient';\nimport { CodeBlockHighlight } from './CodeBlockHighlight';\nimport { CodeConditionalRender } from './CodeConditionalRenderer';\nimport type {\n CodeFormat,\n ContentDeclarationFormat,\n PackageManager,\n} from './CodeContext';\nimport { useCodeContext } from './CodeContext';\nimport { CodeFormatSelector } from './CodeFormatSelector';\nimport { ContentDeclarationFormatSelector } from './ContentDeclarationFormatSelector';\nimport { CopyCode } from './CopyCode';\nimport { PackageManagerSelector } from './PackageManagerSelector';\n\nexport type CodeCompAttributes = {\n fileName?: string;\n packageManager?: PackageManager;\n /** Single format, a JSON-array string, or an array of formats. */\n codeFormat?: CodeFormat | string | string[];\n contentDeclarationFormat?: ContentDeclarationFormat | string | string[];\n};\n\ntype CodeCompProps = {\n children: ReactNode;\n fileName?: string;\n language: BundledLanguage;\n isDarkMode?: boolean;\n showHeader?: boolean;\n showLineNumbers?: boolean;\n isRollable?: boolean;\n} & CodeCompAttributes &\n HTMLAttributes<HTMLDivElement>;\n\nconst MIN_HEIGHT = 700;\n\n/** Languages that use JSX syntax — CommonJS doesn't make sense for these. */\nconst JSX_LANGUAGES = new Set(['tsx', 'jsx']);\n\n/** Parse a codeFormat prop that may be a single value, a JSON-array string, or already an array. */\nconst parseFormats = (\n raw: string | string[] | undefined\n): CodeFormat[] | undefined => {\n if (!raw) return undefined;\n if (Array.isArray(raw)) return raw as CodeFormat[];\n if (typeof raw === 'string' && raw.startsWith('[')) {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as CodeFormat[];\n } catch {\n /* ignore */\n }\n }\n return [raw as CodeFormat];\n};\n\nexport const Code: FC<CodeCompProps> = ({\n children,\n language,\n isDarkMode,\n showHeader = true,\n showLineNumbers = true,\n className,\n fileName,\n packageManager,\n codeFormat: rawCodeFormat,\n contentDeclarationFormat: rawContentDeclarationFormat,\n isRollable = true,\n ...props\n}) => {\n const {\n codeFormat: selectedCodeFormat,\n contentDeclarationFormat: selectedContentDeclarationFormat,\n } = useCodeContext();\n\n // Parse whichever attribute is present as an array of formats.\n const codeFormats = useMemo(\n () => parseFormats(rawCodeFormat as string | undefined),\n [rawCodeFormat]\n );\n const contentFormats = useMemo(\n () => parseFormats(rawContentDeclarationFormat as string | undefined),\n [rawContentDeclarationFormat]\n );\n\n // A block is \"multi-format\" when it has multiple formats including TypeScript\n // (the canonical source). Such blocks transform at runtime.\n const isMultiCodeFormat =\n codeFormats !== undefined &&\n codeFormats.length > 1 &&\n codeFormats.includes('typescript');\n\n const isMultiContentFormat =\n contentFormats !== undefined &&\n contentFormats.length > 1 &&\n contentFormats.includes('typescript');\n\n const isMultiFormat = isMultiCodeFormat || isMultiContentFormat;\n\n // Determine which context format drives this block's selection.\n // content declaration blocks use selectedContentDeclarationFormat;\n // regular code blocks use selectedCodeFormat.\n const selectedFormat: CodeFormat = isMultiContentFormat\n ? (selectedContentDeclarationFormat as CodeFormat)\n : selectedCodeFormat;\n\n // The formats actually relevant for transformation (no 'json', no 'commonjs' for JSX).\n const effectiveFormats = useMemo<CodeFormat[] | undefined>(() => {\n const base = isMultiContentFormat ? contentFormats : codeFormats;\n if (!base) return base;\n let filtered = base.filter((f) => f !== 'json') as CodeFormat[];\n if (JSX_LANGUAGES.has(language as string)) {\n filtered = filtered.filter((f) => f !== 'commonjs');\n }\n return filtered;\n }, [isMultiContentFormat, contentFormats, codeFormats, language]);\n\n // When the globally-selected format isn't valid for this block\n // (e.g. CJS selected but this is a JSX file), fall back to the last valid one.\n const resolvedFormat: Exclude<CodeFormat, 'json'> = useMemo(() => {\n if (!effectiveFormats || effectiveFormats.includes(selectedFormat)) {\n return selectedFormat as Exclude<CodeFormat, 'json'>;\n }\n return (effectiveFormats[effectiveFormats.length - 1] ??\n 'typescript') as Exclude<CodeFormat, 'json'>;\n }, [effectiveFormats, selectedFormat]);\n\n // ── Async filename derivation (dynamic import of transformer) ──────────────\n // We derive the displayed fileName so the header updates when format changes.\n // deriveFileName is tiny but it lives inside codeTransformer, which is only\n // imported when actually needed (non-TypeScript selection).\n const [displayedFileName, setDisplayedFileName] = useState<\n string | undefined\n >(fileName);\n\n useEffect(() => {\n if (!isMultiFormat || resolvedFormat === 'typescript') {\n setDisplayedFileName(fileName);\n return;\n }\n if (!fileName) return;\n\n let cancelled = false;\n (async () => {\n const { deriveFileName } = await import('./codeTransformer');\n if (!cancelled)\n setDisplayedFileName(deriveFileName(fileName, resolvedFormat));\n })();\n return () => {\n cancelled = true;\n };\n }, [fileName, isMultiFormat, resolvedFormat]);\n\n // ── Async copy text (transformed code for CopyCode) ───────────────────────\n const rawCode = useMemo(() => {\n const code = Array.isArray(children) ? children.join('') : String(children);\n return code.endsWith('\\n') ? code.slice(0, -1) : code;\n }, [children]);\n\n const [copyCode, setCopyCode] = useState<string>(rawCode);\n\n useEffect(() => {\n if (!isMultiFormat || resolvedFormat === 'typescript') {\n setCopyCode(rawCode);\n return;\n }\n let cancelled = false;\n (async () => {\n const { transformCode } = await import('./codeTransformer');\n if (!cancelled) setCopyCode(transformCode(rawCode, resolvedFormat));\n })();\n return () => {\n cancelled = true;\n };\n }, [rawCode, isMultiFormat, resolvedFormat]);\n\n const hadSelectInHeader =\n packageManager || rawCodeFormat || rawContentDeclarationFormat;\n\n return (\n <CodeConditionalRender\n packageManager={packageManager}\n codeFormat={rawCodeFormat as string | undefined}\n contentDeclarationFormat={\n rawContentDeclarationFormat as string | undefined\n }\n >\n <Container\n className={cn(\n 'relative min-w-0 max-w-full text-sm leading-6',\n showLineNumbers && 'with-line-number ml-0',\n className\n )}\n transparency=\"lg\"\n {...props}\n >\n {showHeader && (\n <>\n <div className=\"grid w-full grid-cols-[1fr_auto] items-center justify-between rounded-t-xl bg-card/50 py-1.5 pr-12 pl-4 text-neutral text-xs\">\n <span className=\"truncate\">{displayedFileName ?? language}</span>\n <div className=\"flex items-center gap-2\">\n {packageManager && <PackageManagerSelector />}\n {rawCodeFormat && (\n <CodeFormatSelector availableFormats={effectiveFormats} />\n )}\n {rawContentDeclarationFormat && (\n <ContentDeclarationFormatSelector />\n )}\n </div>\n </div>\n <div className=\"sticky top-46 z-20\">\n <div\n className={cn(\n 'absolute right-2 bottom-0 flex h-7 items-center',\n hadSelectInHeader && 'h-11'\n )}\n >\n <CopyCode code={copyCode} />\n </div>\n </div>\n </>\n )}\n <ExpandCollapse\n minHeight={MIN_HEIGHT}\n isRollable={isRollable}\n className=\"min-w-0 max-w-full overflow-x-auto p-2\"\n >\n {isMultiFormat ? (\n /*\n * Multi-format: CodeBlockHighlight manages both the transformation\n * (dynamic import of codeTransformer) and the Shiki highlighting in\n * a single useEffect. The previous highlighted output stays visible\n * while the new one loads — no white-text flash.\n */\n <CodeBlockHighlight\n originalLang={language}\n targetFormat={resolvedFormat}\n isDarkMode={isDarkMode}\n >\n {rawCode}\n </CodeBlockHighlight>\n ) : (\n /*\n * Single-format: use the original Suspense-based async Shiki renderer\n * (good for SSR / static content).\n */\n <CodeBlock lang={language} isDarkMode={isDarkMode}>\n {rawCode}\n </CodeBlock>\n )}\n </ExpandCollapse>\n </Container>\n </CodeConditionalRender>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Code.mjs","names":[],"sources":["../../../../src/components/IDE/Code.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport type { FC, HTMLAttributes, ReactNode } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { Container } from '../Container';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { CodeBlock } from './CodeBlockClient';\nimport { CodeBlockHighlight } from './CodeBlockHighlight';\nimport { CodeConditionalRender } from './CodeConditionalRenderer';\nimport type {\n CodeFormat,\n ContentDeclarationFormat,\n PackageManager,\n} from './CodeContext';\nimport { useCodeContext } from './CodeContext';\nimport { CodeFormatSelector } from './CodeFormatSelector';\nimport { ContentDeclarationFormatSelector } from './ContentDeclarationFormatSelector';\nimport { CopyCode } from './CopyCode';\nimport { PackageManagerSelector } from './PackageManagerSelector';\n\nexport type CodeCompAttributes = {\n fileName?: string;\n packageManager?: PackageManager;\n /** Single format, a JSON-array string, or an array of formats. */\n codeFormat?: CodeFormat | string | string[];\n contentDeclarationFormat?: ContentDeclarationFormat | string | string[];\n};\n\ntype CodeCompProps = {\n children: ReactNode;\n fileName?: string;\n language: BundledLanguage;\n isDarkMode?: boolean;\n showHeader?: boolean;\n showLineNumbers?: boolean;\n isRollable?: boolean;\n} & CodeCompAttributes &\n HTMLAttributes<HTMLDivElement>;\n\nconst MIN_HEIGHT = 700;\n\n/** Languages that use JSX syntax — CommonJS doesn't make sense for these. */\nconst JSX_LANGUAGES = new Set(['tsx', 'jsx']);\n\n/** Parse a codeFormat prop that may be a single value, a JSON-array string, or already an array. */\nconst parseFormats = (\n raw: string | string[] | undefined\n): CodeFormat[] | undefined => {\n if (!raw) return undefined;\n if (Array.isArray(raw)) return raw as CodeFormat[];\n if (typeof raw === 'string' && raw.startsWith('[')) {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as CodeFormat[];\n } catch {\n /* ignore */\n }\n }\n return [raw as CodeFormat];\n};\n\nexport const Code: FC<CodeCompProps> = ({\n children,\n language,\n isDarkMode,\n showHeader = true,\n showLineNumbers = true,\n className,\n fileName,\n packageManager,\n codeFormat: rawCodeFormat,\n contentDeclarationFormat: rawContentDeclarationFormat,\n isRollable = true,\n ...props\n}) => {\n const {\n codeFormat: selectedCodeFormat,\n contentDeclarationFormat: selectedContentDeclarationFormat,\n } = useCodeContext();\n\n // Parse whichever attribute is present as an array of formats.\n const codeFormats = useMemo(\n () => parseFormats(rawCodeFormat as string | undefined),\n [rawCodeFormat]\n );\n const contentFormats = useMemo(\n () => parseFormats(rawContentDeclarationFormat as string | undefined),\n [rawContentDeclarationFormat]\n );\n\n // A block is \"multi-format\" when it has multiple formats including TypeScript\n // (the canonical source). Such blocks transform at runtime.\n const isMultiCodeFormat =\n codeFormats !== undefined &&\n codeFormats.length > 1 &&\n codeFormats.includes('typescript');\n\n const isMultiContentFormat =\n contentFormats !== undefined &&\n contentFormats.length > 1 &&\n contentFormats.includes('typescript');\n\n const isMultiFormat = isMultiCodeFormat || isMultiContentFormat;\n\n // Determine which context format drives this block's selection.\n // content declaration blocks use selectedContentDeclarationFormat;\n // regular code blocks use selectedCodeFormat.\n const selectedFormat: CodeFormat = isMultiContentFormat\n ? (selectedContentDeclarationFormat as CodeFormat)\n : selectedCodeFormat;\n\n // The formats actually relevant for transformation (no 'json', no 'commonjs' for JSX).\n const effectiveFormats = useMemo<CodeFormat[] | undefined>(() => {\n const base = isMultiContentFormat ? contentFormats : codeFormats;\n if (!base) return base;\n let filtered = base.filter((f) => f !== 'json') as CodeFormat[];\n if (JSX_LANGUAGES.has(language as string)) {\n filtered = filtered.filter((f) => f !== 'commonjs');\n }\n return filtered;\n }, [isMultiContentFormat, contentFormats, codeFormats, language]);\n\n // When the globally-selected format isn't valid for this block\n // (e.g. CJS selected but this is a JSX file), fall back to the last valid one.\n const resolvedFormat: Exclude<CodeFormat, 'json'> = useMemo(() => {\n if (!effectiveFormats || effectiveFormats.includes(selectedFormat)) {\n return selectedFormat as Exclude<CodeFormat, 'json'>;\n }\n return (effectiveFormats[effectiveFormats.length - 1] ??\n 'typescript') as Exclude<CodeFormat, 'json'>;\n }, [effectiveFormats, selectedFormat]);\n\n // ── Async filename derivation (dynamic import of transformer) ──────────────\n // We derive the displayed fileName so the header updates when format changes.\n // deriveFileName is tiny but it lives inside codeTransformer, which is only\n // imported when actually needed (non-TypeScript selection).\n const [displayedFileName, setDisplayedFileName] = useState<\n string | undefined\n >(fileName);\n\n useEffect(() => {\n if (!isMultiFormat || resolvedFormat === 'typescript') {\n setDisplayedFileName(fileName);\n return;\n }\n if (!fileName) return;\n\n let cancelled = false;\n (async () => {\n const { deriveFileName } = await import('./codeTransformer');\n if (!cancelled)\n setDisplayedFileName(deriveFileName(fileName, resolvedFormat));\n })();\n return () => {\n cancelled = true;\n };\n }, [fileName, isMultiFormat, resolvedFormat]);\n\n // ── Async copy text (transformed code for CopyCode) ───────────────────────\n const rawCode = useMemo(() => {\n const code = Array.isArray(children) ? children.join('') : String(children);\n return code.endsWith('\\n') ? code.slice(0, -1) : code;\n }, [children]);\n\n const [copyCode, setCopyCode] = useState<string>(rawCode);\n\n useEffect(() => {\n if (!isMultiFormat || resolvedFormat === 'typescript') {\n setCopyCode(rawCode);\n return;\n }\n let cancelled = false;\n (async () => {\n const { transformCode } = await import('./codeTransformer');\n if (!cancelled) setCopyCode(transformCode(rawCode, resolvedFormat));\n })();\n return () => {\n cancelled = true;\n };\n }, [rawCode, isMultiFormat, resolvedFormat]);\n\n const hadSelectInHeader =\n packageManager || rawCodeFormat || rawContentDeclarationFormat;\n\n return (\n <CodeConditionalRender\n packageManager={packageManager}\n codeFormat={rawCodeFormat as string | undefined}\n contentDeclarationFormat={\n rawContentDeclarationFormat as string | undefined\n }\n >\n <Container\n className={cn(\n 'relative min-w-0 max-w-full text-sm leading-6',\n showLineNumbers && 'with-line-number ml-0',\n className\n )}\n transparency=\"lg\"\n {...props}\n >\n {showHeader && (\n <>\n <div className=\"grid w-full grid-cols-[1fr_auto] items-center justify-between rounded-t-xl bg-card/50 py-1.5 pr-12 pl-4 text-neutral text-xs\">\n <span className=\"truncate\">{displayedFileName ?? language}</span>\n <div className=\"flex items-center gap-2\">\n {packageManager && <PackageManagerSelector />}\n {rawCodeFormat && (\n <CodeFormatSelector availableFormats={effectiveFormats} />\n )}\n {rawContentDeclarationFormat && (\n <ContentDeclarationFormatSelector />\n )}\n </div>\n </div>\n <div className=\"sticky top-46 z-20\">\n <div\n className={cn(\n 'absolute right-2 bottom-0 flex h-7 items-center',\n hadSelectInHeader && 'h-11'\n )}\n >\n <CopyCode code={copyCode} />\n </div>\n </div>\n </>\n )}\n <ExpandCollapse\n minHeight={MIN_HEIGHT}\n isRollable={isRollable}\n className=\"min-w-0 max-w-full overflow-x-auto p-2\"\n >\n {isMultiFormat ? (\n /*\n * Multi-format: CodeBlockHighlight manages both the transformation\n * (dynamic import of codeTransformer) and the Shiki highlighting in\n * a single useEffect. The previous highlighted output stays visible\n * while the new one loads — no white-text flash.\n */\n <CodeBlockHighlight\n originalLang={language}\n targetFormat={resolvedFormat}\n isDarkMode={isDarkMode}\n >\n {rawCode}\n </CodeBlockHighlight>\n ) : (\n /*\n * Single-format: use the original Suspense-based async Shiki renderer\n * (good for SSR / static content).\n */\n <CodeBlock lang={language} isDarkMode={isDarkMode}>\n {rawCode}\n </CodeBlock>\n )}\n </ExpandCollapse>\n </Container>\n </CodeConditionalRender>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockHighlight.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockHighlight.tsx"],"sourcesContent":["'use client';\n\n/**\n * Client-side Shiki highlighter that also handles TypeScript→ESM/CJS transformation.\n *\n * Everything runs inside a single useEffect so that:\n * - The transformer is only dynamically imported when a non-TypeScript format is selected.\n * - The previous highlighted HTML stays visible while the new one loads (no white-text flash).\n */\n\nimport { type ReactNode, useEffect, useRef, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport type { CodeFormat } from './CodeContext';\n\ntype Props = {\n /** Raw TypeScript source code (the canonical \"source of truth\"). */\n children: ReactNode;\n /** Language of the source (e.g. 'tsx', 'typescript'). */\n originalLang: BundledLanguage;\n /** Currently selected format: 'typescript' | 'esm' | 'commonjs'. */\n targetFormat: Exclude<CodeFormat, 'json'>;\n isDarkMode?: boolean;\n};\n\n/**\n * Map display language names to Shiki grammar identifiers.\n * Shiki's web bundle does not ship a separate 'jsx' grammar — tsx handles both.\n */\nconst toShikiLang = (lang: string): string => {\n switch (lang) {\n case 'jsx':\n return 'tsx';\n case 'mjs':\n case 'cjs':\n return 'javascript';\n default:\n return lang;\n }\n};\n\nexport const CodeBlockHighlight = ({\n children,\n originalLang,\n targetFormat,\n isDarkMode,\n}: Props) => {\n const [html, setHtml] = useState<string | null>(null);\n const prevHtml = useRef<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n let code = children;\n let shikiLang = toShikiLang(originalLang);\n\n // Only import the transformer when we actually need it.\n if (targetFormat !== 'typescript') {\n const { transformCode, deriveLanguage } = await import(\n './codeTransformer'\n );\n if (cancelled) return;\n code = transformCode(String(children), targetFormat);\n shikiLang = toShikiLang(deriveLanguage(originalLang, targetFormat));\n }\n\n const { codeToHtml } = await import('shiki/bundle/web');\n if (cancelled) return;\n\n const out = await codeToHtml(String(code), {\n lang: shikiLang,\n theme: isDarkMode ? 'github-dark' : 'github-light',\n });\n\n if (!cancelled) {\n prevHtml.current = out;\n setHtml(out);\n }\n } catch {\n // Shiki failed (unknown language, etc.) — fall through to plain-text.\n if (!cancelled) setHtml('');\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [children, originalLang, targetFormat, isDarkMode]);\n\n // Keep the previous highlighted output visible while the new one is loading.\n // This prevents the white-text flash on format switches.\n const display = html ?? prevHtml.current;\n\n if (!display) {\n return (\n <pre className=\"min-w-0 max-w-full overflow-x-auto\">\n <code>{children}</code>\n </pre>\n );\n }\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: display }}\n style={{ backgroundColor: 'transparent' }}\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,MAAM,eAAe,SAAyB;AAC5C,SAAQ,MAAR;EACE,KAAK,MACH,QAAO;EACT,KAAK;EACL,KAAK,MACH,QAAO;EACT,QACE,QAAO;;;AAIb,MAAa,sBAAsB,EACjC,UACA,cACA,cACA,iBACW;CACX,MAAM,CAAC,MAAM,WAAW,SAAwB,KAAK;CACrD,MAAM,WAAW,OAAsB,KAAK;AAE5C,iBAAgB;EACd,IAAI,YAAY;AAEhB,GAAC,YAAY;AACX,OAAI;IACF,IAAI,OAAO;IACX,IAAI,YAAY,YAAY,aAAa;AAGzC,QAAI,iBAAiB,cAAc;KACjC,MAAM,EAAE,eAAe,mBAAmB,MAAM,OAC9C;AAEF,SAAI,UAAW;AACf,YAAO,cAAc,OAAO,SAAS,EAAE,aAAa;AACpD,iBAAY,YAAY,eAAe,cAAc,aAAa,CAAC;;IAGrE,MAAM,EAAE,eAAe,MAAM,OAAO;AACpC,QAAI,UAAW;IAEf,MAAM,MAAM,MAAM,WAAW,OAAO,KAAK,EAAE;KACzC,MAAM;KACN,OAAO,aAAa,gBAAgB;KACrC,CAAC;AAEF,QAAI,CAAC,WAAW;AACd,cAAS,UAAU;AACnB,aAAQ,IAAI;;WAER;AAEN,QAAI,CAAC,UAAW,SAAQ,GAAG;;MAE3B;AAEJ,eAAa;AACX,eAAY;;IAEb;EAAC;EAAU;EAAc;EAAc;EAAW,CAAC;CAItD,MAAM,UAAU,QAAQ,SAAS;AAEjC,KAAI,CAAC,QACH,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD,EAAO,UAAgB;EACnB;AAIV,QACE,oBAAC,OAAD;EACE,yBAAyB,EAAE,QAAQ,SAAS;EAC5C,OAAO,EAAE,iBAAiB,eAAe;EACzC"}
1
+ {"version":3,"file":"CodeBlockHighlight.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockHighlight.tsx"],"sourcesContent":["'use client';\n\n/**\n * Client-side Shiki highlighter that also handles TypeScript→ESM/CJS transformation.\n *\n * Everything runs inside a single useEffect so that:\n * - The transformer is only dynamically imported when a non-TypeScript format is selected.\n * - The previous highlighted HTML stays visible while the new one loads (no white-text flash).\n */\n\nimport { type ReactNode, useEffect, useRef, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport type { CodeFormat } from './CodeContext';\n\ntype Props = {\n /** Raw TypeScript source code (the canonical \"source of truth\"). */\n children: ReactNode;\n /** Language of the source (e.g. 'tsx', 'typescript'). */\n originalLang: BundledLanguage;\n /** Currently selected format: 'typescript' | 'esm' | 'commonjs'. */\n targetFormat: Exclude<CodeFormat, 'json'>;\n isDarkMode?: boolean;\n};\n\n/**\n * Map display language names to Shiki grammar identifiers.\n * Shiki's web bundle does not ship a separate 'jsx' grammar — tsx handles both.\n */\nconst toShikiLang = (lang: string): string => {\n switch (lang) {\n case 'jsx':\n return 'tsx';\n case 'mjs':\n case 'cjs':\n return 'javascript';\n default:\n return lang;\n }\n};\n\nexport const CodeBlockHighlight = ({\n children,\n originalLang,\n targetFormat,\n isDarkMode,\n}: Props) => {\n const [html, setHtml] = useState<string | null>(null);\n const prevHtml = useRef<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n let code = children;\n let shikiLang = toShikiLang(originalLang);\n\n // Only import the transformer when we actually need it.\n if (targetFormat !== 'typescript') {\n const { transformCode, deriveLanguage } = await import(\n './codeTransformer'\n );\n if (cancelled) return;\n code = transformCode(String(children), targetFormat);\n shikiLang = toShikiLang(deriveLanguage(originalLang, targetFormat));\n }\n\n const { codeToHtml } = await import('shiki/bundle/web');\n if (cancelled) return;\n\n const out = await codeToHtml(String(code), {\n lang: shikiLang,\n theme: isDarkMode ? 'github-dark' : 'github-light',\n });\n\n if (!cancelled) {\n prevHtml.current = out;\n setHtml(out);\n }\n } catch {\n // Shiki failed (unknown language, etc.) — fall through to plain-text.\n if (!cancelled) setHtml('');\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [children, originalLang, targetFormat, isDarkMode]);\n\n // Keep the previous highlighted output visible while the new one is loading.\n // This prevents the white-text flash on format switches.\n const display = html ?? prevHtml.current;\n\n if (!display) {\n return (\n <pre className=\"min-w-0 max-w-full overflow-x-auto\">\n <code>{children}</code>\n </pre>\n );\n }\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: display }}\n style={{ backgroundColor: 'transparent' }}\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,MAAM,eAAe,SAAyB;CAC5C,QAAQ,MAAR;EACE,KAAK,OACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;EACT,SACE,OAAO;;;AAIb,MAAa,sBAAsB,EACjC,UACA,cACA,cACA,iBACW;CACX,MAAM,CAAC,MAAM,WAAW,SAAwB,KAAK;CACrD,MAAM,WAAW,OAAsB,KAAK;CAE5C,gBAAgB;EACd,IAAI,YAAY;EAEhB,CAAC,YAAY;GACX,IAAI;IACF,IAAI,OAAO;IACX,IAAI,YAAY,YAAY,aAAa;IAGzC,IAAI,iBAAiB,cAAc;KACjC,MAAM,EAAE,eAAe,mBAAmB,MAAM,OAC9C;KAEF,IAAI,WAAW;KACf,OAAO,cAAc,OAAO,SAAS,EAAE,aAAa;KACpD,YAAY,YAAY,eAAe,cAAc,aAAa,CAAC;;IAGrE,MAAM,EAAE,eAAe,MAAM,OAAO;IACpC,IAAI,WAAW;IAEf,MAAM,MAAM,MAAM,WAAW,OAAO,KAAK,EAAE;KACzC,MAAM;KACN,OAAO,aAAa,gBAAgB;KACrC,CAAC;IAEF,IAAI,CAAC,WAAW;KACd,SAAS,UAAU;KACnB,QAAQ,IAAI;;WAER;IAEN,IAAI,CAAC,WAAW,QAAQ,GAAG;;MAE3B;EAEJ,aAAa;GACX,YAAY;;IAEb;EAAC;EAAU;EAAc;EAAc;EAAW,CAAC;CAItD,MAAM,UAAU,QAAQ,SAAS;CAEjC,IAAI,CAAC,SACH,OACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD,EAAO,UAAgB;EACnB;CAIV,OACE,oBAAC,OAAD;EACE,yBAAyB,EAAE,QAAQ,SAAS;EAC5C,OAAO,EAAE,iBAAiB,eAAe;EACzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockServer.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockServer.tsx"],"sourcesContent":["import {\n transformerMetaHighlight,\n transformerMetaWordHighlight,\n transformerNotationDiff,\n transformerNotationErrorLevel,\n transformerNotationHighlight,\n transformerNotationWordHighlight,\n} from '@shikijs/transformers';\nimport { cn } from '@utils/cn';\nimport { type FC, type HTMLAttributes, Suspense } from 'react';\nimport {\n type BundledLanguage,\n type BundledTheme,\n type CodeToHastOptions,\n codeToHtml,\n} from 'shiki/bundle/web';\n\nexport const CodeBlockShiki = (async ({\n children,\n lang,\n isDarkMode,\n onChange,\n ...props\n}: CodeBlockProps) => {\n const shikiOptions: CodeToHastOptions<BundledLanguage, BundledTheme> = {\n lang,\n theme: isDarkMode ? 'github-dark' : 'github-light',\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerNotationErrorLevel(),\n transformerMetaHighlight(),\n transformerMetaWordHighlight(),\n ],\n };\n\n const out = await codeToHtml(children, shikiOptions);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: out }}\n {...props}\n style={{ backgroundColor: 'transparent' }}\n />\n );\n}) as unknown as FC<CodeBlockProps>;\n\nconst CodeDefault: FC<CodeBlockProps> = ({\n children,\n isEditable,\n isDarkMode,\n onChange,\n ...props\n}) => (\n <div contentEditable={isEditable} {...props}>\n <pre>\n <code>\n {typeof children === 'string'\n ? children.split('\\n').map((line, index) => (\n <span className=\"line block w-full\" key={index}>\n {line}\n </span>\n ))\n : children}\n </code>\n </pre>\n </div>\n);\n\nexport type CodeBlockProps = {\n children: string;\n lang: BundledLanguage;\n isDarkMode?: boolean;\n isEditable?: boolean;\n onChange?: (content: string) => void;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeBlock: FC<CodeBlockProps> = ({\n className,\n onChange,\n isEditable,\n ...props\n}) => (\n <Suspense fallback={<CodeDefault {...props} />}>\n <CodeBlockShiki\n className={cn('flex w-full', className)}\n contentEditable={isEditable}\n onInput={(e) => onChange?.(e.currentTarget.textContent ?? '')}\n {...props}\n />\n </Suspense>\n);\n"],"mappings":";;;;;;;AAiBA,MAAa,kBAAkB,OAAO,EACpC,UACA,MACA,YACA,UACA,GAAG,YACiB;AAgBpB,QACE,oBAAC,OAAD;EACE,yBAAyB,EAAE,QAAQ,MAJrB,WAAW,UAAU;GAZrC;GACA,OAAO,aAAa,gBAAgB;GACpC,cAAc;IACZ,yBAAyB;IACzB,8BAA8B;IAC9B,kCAAkC;IAClC,+BAA+B;IAC/B,0BAA0B;IAC1B,8BAA8B;IAC/B;GAGgD,CAAC,EAIR;EACxC,GAAI;EACJ,OAAO,EAAE,iBAAiB,eAAe;EACzC;;AAIN,MAAM,eAAmC,EACvC,UACA,YACA,YACA,UACA,GAAG,YAEH,oBAAC,OAAD;CAAK,iBAAiB;CAAY,GAAI;WACpC,oBAAC,OAAD,YACE,oBAAC,QAAD,YACG,OAAO,aAAa,WACjB,SAAS,MAAM,KAAK,CAAC,KAAK,MAAM,UAC9B,oBAAC,QAAD;EAAM,WAAU;YACb;EACI,EAFkC,MAElC,CACP,GACF,UACC,GACH;CACF;AAWR,MAAa,aAAiC,EAC5C,WACA,UACA,YACA,GAAG,YAEH,oBAAC,UAAD;CAAU,UAAU,oBAAC,aAAD,EAAa,GAAI,OAAS;WAC5C,oBAAC,gBAAD;EACE,WAAW,GAAG,eAAe,UAAU;EACvC,iBAAiB;EACjB,UAAU,MAAM,WAAW,EAAE,cAAc,eAAe,GAAG;EAC7D,GAAI;EACJ;CACO"}
1
+ {"version":3,"file":"CodeBlockServer.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockServer.tsx"],"sourcesContent":["import {\n transformerMetaHighlight,\n transformerMetaWordHighlight,\n transformerNotationDiff,\n transformerNotationErrorLevel,\n transformerNotationHighlight,\n transformerNotationWordHighlight,\n} from '@shikijs/transformers';\nimport { cn } from '@utils/cn';\nimport { type FC, type HTMLAttributes, Suspense } from 'react';\nimport {\n type BundledLanguage,\n type BundledTheme,\n type CodeToHastOptions,\n codeToHtml,\n} from 'shiki/bundle/web';\n\nexport const CodeBlockShiki = (async ({\n children,\n lang,\n isDarkMode,\n onChange,\n ...props\n}: CodeBlockProps) => {\n const shikiOptions: CodeToHastOptions<BundledLanguage, BundledTheme> = {\n lang,\n theme: isDarkMode ? 'github-dark' : 'github-light',\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerNotationErrorLevel(),\n transformerMetaHighlight(),\n transformerMetaWordHighlight(),\n ],\n };\n\n const out = await codeToHtml(children, shikiOptions);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: out }}\n {...props}\n style={{ backgroundColor: 'transparent' }}\n />\n );\n}) as unknown as FC<CodeBlockProps>;\n\nconst CodeDefault: FC<CodeBlockProps> = ({\n children,\n isEditable,\n isDarkMode,\n onChange,\n ...props\n}) => (\n <div contentEditable={isEditable} {...props}>\n <pre>\n <code>\n {typeof children === 'string'\n ? children.split('\\n').map((line, index) => (\n <span className=\"line block w-full\" key={index}>\n {line}\n </span>\n ))\n : children}\n </code>\n </pre>\n </div>\n);\n\nexport type CodeBlockProps = {\n children: string;\n lang: BundledLanguage;\n isDarkMode?: boolean;\n isEditable?: boolean;\n onChange?: (content: string) => void;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeBlock: FC<CodeBlockProps> = ({\n className,\n onChange,\n isEditable,\n ...props\n}) => (\n <Suspense fallback={<CodeDefault {...props} />}>\n <CodeBlockShiki\n className={cn('flex w-full', className)}\n contentEditable={isEditable}\n onInput={(e) => onChange?.(e.currentTarget.textContent ?? '')}\n {...props}\n />\n </Suspense>\n);\n"],"mappings":";;;;;;;AAiBA,MAAa,kBAAkB,OAAO,EACpC,UACA,MACA,YACA,UACA,GAAG,YACiB;CAgBpB,OACE,oBAAC,OAAD;EACE,yBAAyB,EAAE,QAAQ,MAJrB,WAAW,UAAU;GAZrC;GACA,OAAO,aAAa,gBAAgB;GACpC,cAAc;IACZ,yBAAyB;IACzB,8BAA8B;IAC9B,kCAAkC;IAClC,+BAA+B;IAC/B,0BAA0B;IAC1B,8BAA8B;IAC/B;GAGgD,CAAC,EAIR;EACxC,GAAI;EACJ,OAAO,EAAE,iBAAiB,eAAe;EACzC;;AAIN,MAAM,eAAmC,EACvC,UACA,YACA,YACA,UACA,GAAG,YAEH,oBAAC,OAAD;CAAK,iBAAiB;CAAY,GAAI;WACpC,oBAAC,OAAD,YACE,oBAAC,QAAD,YACG,OAAO,aAAa,WACjB,SAAS,MAAM,KAAK,CAAC,KAAK,MAAM,UAC9B,oBAAC,QAAD;EAAM,WAAU;YACb;EACI,EAFkC,MAElC,CACP,GACF,UACC,GACH;CACF;AAWR,MAAa,aAAiC,EAC5C,WACA,UACA,YACA,GAAG,YAEH,oBAAC,UAAD;CAAU,UAAU,oBAAC,aAAD,EAAa,GAAI,OAAS;WAC5C,oBAAC,gBAAD;EACE,WAAW,GAAG,eAAe,UAAU;EACvC,iBAAiB;EACjB,UAAU,MAAM,WAAW,EAAE,cAAc,eAAe,GAAG;EAC7D,GAAI;EACJ;CACO"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockShiki.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockShiki.tsx"],"sourcesContent":["'use client';\n\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport type {\n BundledLanguage,\n BundledTheme,\n HighlighterGeneric,\n} from 'shiki/bundle/web';\nimport { CodeDefault } from './CodeBlockClient';\n\n// Map of loaded modules to avoid re-importing\nconst languageCache = new Map<BundledLanguage, any>();\nconst themeCache = new Map<BundledTheme, any>();\n\n// Lazy load language modules\nconst loadLanguage = async (lang: BundledLanguage): Promise<any> => {\n if (languageCache.has(lang)) return languageCache.get(lang);\n\n let languageModule: any;\n switch (lang) {\n case 'angular-html':\n languageModule = await import('shiki/langs/angular-html.mjs');\n break;\n case 'angular-ts':\n languageModule = await import('shiki/langs/angular-ts.mjs');\n break;\n case 'astro':\n languageModule = await import('shiki/langs/astro.mjs');\n break;\n case 'typescript':\n case 'ts':\n languageModule = await import('shiki/langs/typescript.mjs');\n break;\n case 'javascript':\n case 'js':\n case 'cjs':\n case 'mjs':\n languageModule = await import('shiki/langs/javascript.mjs');\n break;\n case 'bash':\n case 'sh':\n case 'shell':\n languageModule = await import('shiki/langs/bash.mjs');\n break;\n case 'json':\n languageModule = await import('shiki/langs/json.mjs');\n break;\n case 'jsonc':\n case 'json5':\n languageModule = await import('shiki/langs/json5.mjs');\n break;\n case 'tsx':\n case 'jsx':\n languageModule = await import('shiki/langs/tsx.mjs');\n break;\n case 'vue':\n languageModule = await import('shiki/langs/vue.mjs');\n break;\n case 'svelte':\n languageModule = await import('shiki/langs/svelte.mjs');\n break;\n case 'markdown':\n case 'md':\n case 'mdx':\n languageModule = await import('shiki/langs/markdown.mjs');\n break;\n case 'css':\n languageModule = await import('shiki/langs/css.mjs');\n break;\n case 'html':\n languageModule = await import('shiki/langs/html.mjs');\n break;\n case 'xml':\n languageModule = await import('shiki/langs/xml.mjs');\n break;\n case 'yml':\n case 'yaml':\n languageModule = await import('shiki/langs/yaml.mjs');\n break;\n default:\n languageModule = await import('shiki/langs/typescript.mjs');\n break;\n }\n\n const language = languageModule.default;\n languageCache.set(lang, language);\n return language;\n};\n\n// Lazy load theme modules\nconst loadTheme = async (themeName: BundledTheme): Promise<any> => {\n if (themeCache.has(themeName)) return themeCache.get(themeName);\n\n let themeModule: any;\n switch (themeName) {\n case 'github-dark':\n themeModule = await import('shiki/themes/github-dark.mjs');\n break;\n default:\n themeModule = await import('shiki/themes/github-light.mjs');\n break;\n }\n\n const theme = themeModule.default;\n themeCache.set(themeName, theme);\n return theme;\n};\n\n// Singleton Highlighter Instance\nlet highlighterPromise: Promise<HighlighterGeneric<any, any>> | null = null;\n\nconst getHighlighterInstance = async () => {\n if (!highlighterPromise) {\n highlighterPromise = import('shiki/bundle/web').then(\n ({ createHighlighter }) =>\n createHighlighter({\n langs: [],\n themes: [],\n })\n );\n }\n return highlighterPromise;\n};\n\n// Create a promise for highlighting\nconst highlightCode = async (\n code: any,\n lang: BundledLanguage,\n isDarkMode?: boolean\n): Promise<string> => {\n const themeName: BundledTheme = isDarkMode ? 'github-dark' : 'github-light';\n\n // Load highlighter, language, and theme in parallel\n const [highlighter, languageModule, themeModule] = await Promise.all([\n getHighlighterInstance(),\n loadLanguage(lang),\n loadTheme(themeName),\n ]);\n\n // Load into the singleton instance if not already loaded\n if (!highlighter.getLoadedLanguages().includes(lang)) {\n await highlighter.loadLanguage(languageModule);\n }\n if (!highlighter.getLoadedThemes().includes(themeName)) {\n await highlighter.loadTheme(themeModule);\n }\n\n return highlighter.codeToHtml(String(code), {\n lang,\n theme: themeName,\n });\n};\n\nexport type CodeBlockShikiProps = {\n children: ReactNode;\n lang: BundledLanguage;\n isDarkMode?: boolean;\n};\n\nexport const CodeBlockShiki: FC<CodeBlockShikiProps> = ({\n children,\n lang,\n isDarkMode,\n}) => {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n highlightCode(children, lang, isDarkMode)\n .then((result) => {\n if (!isCancelled) setHtml(result);\n })\n .catch((error) => {\n console.error('Failed to highlight code:', error);\n if (!isCancelled && html === null) setHtml('');\n });\n\n return () => {\n isCancelled = true;\n };\n }, [children, lang, isDarkMode]);\n\n return (\n <div className=\"min-w-0 max-w-full overflow-auto bg-transparent [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [&_pre::-webkit-scrollbar]:hidden [&_pre]:[-ms-overflow-style:none] [&_pre]:[scrollbar-width:none]\">\n {html ? (\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Shiki generates safe HTML for code highlighting\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <CodeDefault>{children}</CodeDefault>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeBlockShiki.mjs","names":[],"sources":["../../../../src/components/IDE/CodeBlockShiki.tsx"],"sourcesContent":["'use client';\n\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport type {\n BundledLanguage,\n BundledTheme,\n HighlighterGeneric,\n} from 'shiki/bundle/web';\nimport { CodeDefault } from './CodeBlockClient';\n\n// Map of loaded modules to avoid re-importing\nconst languageCache = new Map<BundledLanguage, any>();\nconst themeCache = new Map<BundledTheme, any>();\n\n// Lazy load language modules\nconst loadLanguage = async (lang: BundledLanguage): Promise<any> => {\n if (languageCache.has(lang)) return languageCache.get(lang);\n\n let languageModule: any;\n switch (lang) {\n case 'angular-html':\n languageModule = await import('shiki/langs/angular-html.mjs');\n break;\n case 'angular-ts':\n languageModule = await import('shiki/langs/angular-ts.mjs');\n break;\n case 'astro':\n languageModule = await import('shiki/langs/astro.mjs');\n break;\n case 'typescript':\n case 'ts':\n languageModule = await import('shiki/langs/typescript.mjs');\n break;\n case 'javascript':\n case 'js':\n case 'cjs':\n case 'mjs':\n languageModule = await import('shiki/langs/javascript.mjs');\n break;\n case 'bash':\n case 'sh':\n case 'shell':\n languageModule = await import('shiki/langs/bash.mjs');\n break;\n case 'json':\n languageModule = await import('shiki/langs/json.mjs');\n break;\n case 'jsonc':\n case 'json5':\n languageModule = await import('shiki/langs/json5.mjs');\n break;\n case 'tsx':\n case 'jsx':\n languageModule = await import('shiki/langs/tsx.mjs');\n break;\n case 'vue':\n languageModule = await import('shiki/langs/vue.mjs');\n break;\n case 'svelte':\n languageModule = await import('shiki/langs/svelte.mjs');\n break;\n case 'markdown':\n case 'md':\n case 'mdx':\n languageModule = await import('shiki/langs/markdown.mjs');\n break;\n case 'css':\n languageModule = await import('shiki/langs/css.mjs');\n break;\n case 'html':\n languageModule = await import('shiki/langs/html.mjs');\n break;\n case 'xml':\n languageModule = await import('shiki/langs/xml.mjs');\n break;\n case 'yml':\n case 'yaml':\n languageModule = await import('shiki/langs/yaml.mjs');\n break;\n default:\n languageModule = await import('shiki/langs/typescript.mjs');\n break;\n }\n\n const language = languageModule.default;\n languageCache.set(lang, language);\n return language;\n};\n\n// Lazy load theme modules\nconst loadTheme = async (themeName: BundledTheme): Promise<any> => {\n if (themeCache.has(themeName)) return themeCache.get(themeName);\n\n let themeModule: any;\n switch (themeName) {\n case 'github-dark':\n themeModule = await import('shiki/themes/github-dark.mjs');\n break;\n default:\n themeModule = await import('shiki/themes/github-light.mjs');\n break;\n }\n\n const theme = themeModule.default;\n themeCache.set(themeName, theme);\n return theme;\n};\n\n// Singleton Highlighter Instance\nlet highlighterPromise: Promise<HighlighterGeneric<any, any>> | null = null;\n\nconst getHighlighterInstance = async () => {\n if (!highlighterPromise) {\n highlighterPromise = import('shiki/bundle/web').then(\n ({ createHighlighter }) =>\n createHighlighter({\n langs: [],\n themes: [],\n })\n );\n }\n return highlighterPromise;\n};\n\n// Create a promise for highlighting\nconst highlightCode = async (\n code: any,\n lang: BundledLanguage,\n isDarkMode?: boolean\n): Promise<string> => {\n const themeName: BundledTheme = isDarkMode ? 'github-dark' : 'github-light';\n\n // Load highlighter, language, and theme in parallel\n const [highlighter, languageModule, themeModule] = await Promise.all([\n getHighlighterInstance(),\n loadLanguage(lang),\n loadTheme(themeName),\n ]);\n\n // Load into the singleton instance if not already loaded\n if (!highlighter.getLoadedLanguages().includes(lang)) {\n await highlighter.loadLanguage(languageModule);\n }\n if (!highlighter.getLoadedThemes().includes(themeName)) {\n await highlighter.loadTheme(themeModule);\n }\n\n return highlighter.codeToHtml(String(code), {\n lang,\n theme: themeName,\n });\n};\n\nexport type CodeBlockShikiProps = {\n children: ReactNode;\n lang: BundledLanguage;\n isDarkMode?: boolean;\n};\n\nexport const CodeBlockShiki: FC<CodeBlockShikiProps> = ({\n children,\n lang,\n isDarkMode,\n}) => {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n highlightCode(children, lang, isDarkMode)\n .then((result) => {\n if (!isCancelled) setHtml(result);\n })\n .catch((error) => {\n console.error('Failed to highlight code:', error);\n if (!isCancelled && html === null) setHtml('');\n });\n\n return () => {\n isCancelled = true;\n };\n }, [children, lang, isDarkMode]);\n\n return (\n <div className=\"min-w-0 max-w-full overflow-auto bg-transparent [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [&_pre::-webkit-scrollbar]:hidden [&_pre]:[-ms-overflow-style:none] [&_pre]:[scrollbar-width:none]\">\n {html ? (\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Shiki generates safe HTML for code highlighting\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <CodeDefault>{children}</CodeDefault>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeConditionalRenderer.mjs","names":[],"sources":["../../../../src/components/IDE/CodeConditionalRenderer.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, PropsWithChildren } from 'react';\nimport type { CodeCompAttributes } from './Code';\nimport type { CodeFormat } from './CodeContext';\nimport { useCodeContext } from './CodeContext';\n\n/** Parse a codeFormat prop that may be a single value or a JSON array string. */\nconst parseCodeFormats = (\n raw: string | string[] | undefined\n): CodeFormat[] | undefined => {\n if (typeof raw === 'undefined' || raw === null) return undefined;\n if (Array.isArray(raw)) return raw as CodeFormat[];\n\n // JSON array string: `[\"typescript\",\"esm\",\"commonjs\"]`\n if (typeof raw === 'string' && raw.startsWith('[')) {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as CodeFormat[];\n } catch {\n // fall through\n }\n }\n return [raw as CodeFormat];\n};\n\nexport const CodeConditionalRender: FC<\n PropsWithChildren<CodeCompAttributes>\n> = ({ children, ...props }) => {\n const { packageManager, codeFormat, contentDeclarationFormat } =\n useCodeContext();\n\n const isPackageManagerUndefined = typeof props.packageManager === 'undefined';\n const isPackageManagerSelected = packageManager === props.packageManager;\n\n const formats = parseCodeFormats(props.codeFormat as string | undefined);\n const isCodeFormatUndefined = formats === undefined;\n const isCodeFormatSelected = formats ? formats.includes(codeFormat) : false;\n\n const contentFormats = parseCodeFormats(\n props.contentDeclarationFormat as string | undefined\n );\n const isContentDeclarationFormatUndefined = contentFormats === undefined;\n const isContentDeclarationFormatSelected = contentFormats\n ? contentFormats.includes(contentDeclarationFormat as CodeFormat)\n : false;\n\n if (\n (isPackageManagerUndefined || isPackageManagerSelected) &&\n (isCodeFormatUndefined || isCodeFormatSelected) &&\n (isContentDeclarationFormatUndefined || isContentDeclarationFormatSelected)\n ) {\n return children;\n }\n\n return <></>;\n};\n"],"mappings":";;;;;;;AAQA,MAAM,oBACJ,QAC6B;AAC7B,KAAI,OAAO,QAAQ,eAAe,QAAQ,KAAM,QAAO;AACvD,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO;AAG/B,KAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,CAChD,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,MAAM,QAAQ,OAAO,CAAE,QAAO;SAC5B;AAIV,QAAO,CAAC,IAAkB;;AAG5B,MAAa,yBAER,EAAE,UAAU,GAAG,YAAY;CAC9B,MAAM,EAAE,gBAAgB,YAAY,6BAClC,gBAAgB;CAElB,MAAM,4BAA4B,OAAO,MAAM,mBAAmB;CAClE,MAAM,2BAA2B,mBAAmB,MAAM;CAE1D,MAAM,UAAU,iBAAiB,MAAM,WAAiC;CACxE,MAAM,wBAAwB,YAAY;CAC1C,MAAM,uBAAuB,UAAU,QAAQ,SAAS,WAAW,GAAG;CAEtE,MAAM,iBAAiB,iBACrB,MAAM,yBACP;CACD,MAAM,sCAAsC,mBAAmB;CAC/D,MAAM,qCAAqC,iBACvC,eAAe,SAAS,yBAAuC,GAC/D;AAEJ,MACG,6BAA6B,8BAC7B,yBAAyB,0BACzB,uCAAuC,oCAExC,QAAO;AAGT,QAAO,gCAAK"}
1
+ {"version":3,"file":"CodeConditionalRenderer.mjs","names":[],"sources":["../../../../src/components/IDE/CodeConditionalRenderer.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, PropsWithChildren } from 'react';\nimport type { CodeCompAttributes } from './Code';\nimport type { CodeFormat } from './CodeContext';\nimport { useCodeContext } from './CodeContext';\n\n/** Parse a codeFormat prop that may be a single value or a JSON array string. */\nconst parseCodeFormats = (\n raw: string | string[] | undefined\n): CodeFormat[] | undefined => {\n if (typeof raw === 'undefined' || raw === null) return undefined;\n if (Array.isArray(raw)) return raw as CodeFormat[];\n\n // JSON array string: `[\"typescript\",\"esm\",\"commonjs\"]`\n if (typeof raw === 'string' && raw.startsWith('[')) {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as CodeFormat[];\n } catch {\n // fall through\n }\n }\n return [raw as CodeFormat];\n};\n\nexport const CodeConditionalRender: FC<\n PropsWithChildren<CodeCompAttributes>\n> = ({ children, ...props }) => {\n const { packageManager, codeFormat, contentDeclarationFormat } =\n useCodeContext();\n\n const isPackageManagerUndefined = typeof props.packageManager === 'undefined';\n const isPackageManagerSelected = packageManager === props.packageManager;\n\n const formats = parseCodeFormats(props.codeFormat as string | undefined);\n const isCodeFormatUndefined = formats === undefined;\n const isCodeFormatSelected = formats ? formats.includes(codeFormat) : false;\n\n const contentFormats = parseCodeFormats(\n props.contentDeclarationFormat as string | undefined\n );\n const isContentDeclarationFormatUndefined = contentFormats === undefined;\n const isContentDeclarationFormatSelected = contentFormats\n ? contentFormats.includes(contentDeclarationFormat as CodeFormat)\n : false;\n\n if (\n (isPackageManagerUndefined || isPackageManagerSelected) &&\n (isCodeFormatUndefined || isCodeFormatSelected) &&\n (isContentDeclarationFormatUndefined || isContentDeclarationFormatSelected)\n ) {\n return children;\n }\n\n return <></>;\n};\n"],"mappings":";;;;;;;AAQA,MAAM,oBACJ,QAC6B;CAC7B,IAAI,OAAO,QAAQ,eAAe,QAAQ,MAAM,OAAO;CACvD,IAAI,MAAM,QAAQ,IAAI,EAAE,OAAO;CAG/B,IAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,EAChD,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;EAC9B,IAAI,MAAM,QAAQ,OAAO,EAAE,OAAO;SAC5B;CAIV,OAAO,CAAC,IAAkB;;AAG5B,MAAa,yBAER,EAAE,UAAU,GAAG,YAAY;CAC9B,MAAM,EAAE,gBAAgB,YAAY,6BAClC,gBAAgB;CAElB,MAAM,4BAA4B,OAAO,MAAM,mBAAmB;CAClE,MAAM,2BAA2B,mBAAmB,MAAM;CAE1D,MAAM,UAAU,iBAAiB,MAAM,WAAiC;CACxE,MAAM,wBAAwB,YAAY;CAC1C,MAAM,uBAAuB,UAAU,QAAQ,SAAS,WAAW,GAAG;CAEtE,MAAM,iBAAiB,iBACrB,MAAM,yBACP;CACD,MAAM,sCAAsC,mBAAmB;CAC/D,MAAM,qCAAqC,iBACvC,eAAe,SAAS,yBAAuC,GAC/D;CAEJ,KACG,6BAA6B,8BAC7B,yBAAyB,0BACzB,uCAAuC,qCAExC,OAAO;CAGT,OAAO,gCAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeContext.mjs","names":[],"sources":["../../../../src/components/IDE/CodeContext.tsx"],"sourcesContent":["'use client';\n\nimport { usePersistedStore } from '@hooks/usePersistedStore';\nimport {\n createContext,\n type FC,\n type PropsWithChildren,\n useContext,\n} from 'react';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\nexport type CodeFormat = 'typescript' | 'commonjs' | 'esm';\nexport type ContentDeclarationFormat =\n | 'typescript'\n | 'commonjs'\n | 'esm'\n | 'json';\n\ntype CodeContextValue = {\n packageManager: PackageManager;\n setPackageManager: (packageManager: PackageManager) => void;\n codeFormat: CodeFormat;\n setCodeFormat: (codeFormat: CodeFormat) => void;\n contentDeclarationFormat: ContentDeclarationFormat;\n setContentDeclarationFormat: (\n contentDeclarationFormat: ContentDeclarationFormat\n ) => void;\n};\n\n/**\n * Context that store the current locale on the client side\n */\nexport const CodeContext = createContext<CodeContextValue>({\n packageManager: 'npm',\n setPackageManager: () => {},\n codeFormat: 'typescript',\n setCodeFormat: () => {},\n contentDeclarationFormat: 'typescript',\n setContentDeclarationFormat: () => {},\n});\n\n/**\n * Hook that provides the current locale\n */\nexport const useCodeContext = () => useContext(CodeContext);\n\n/**\n * Provider that store the current locale on the client side\n */\nexport const CodeProvider: FC<PropsWithChildren> = ({ children }) => {\n const [packageManager, setPackageManager] = usePersistedStore<PackageManager>(\n 'packageManager',\n 'npm'\n );\n const [codeFormat, setCodeFormat] = usePersistedStore<CodeFormat>(\n 'codeFormat',\n 'typescript'\n );\n const [contentDeclarationFormat, setContentDeclarationFormat] =\n usePersistedStore<ContentDeclarationFormat>(\n 'contentDeclarationFormat',\n 'typescript'\n );\n\n return (\n <CodeContext\n value={{\n packageManager,\n setPackageManager,\n codeFormat,\n setCodeFormat,\n contentDeclarationFormat,\n setContentDeclarationFormat,\n }}\n >\n {children}\n </CodeContext>\n );\n};\n"],"mappings":";;;;;;;;;;AAgCA,MAAa,cAAc,cAAgC;CACzD,gBAAgB;CAChB,yBAAyB;CACzB,YAAY;CACZ,qBAAqB;CACrB,0BAA0B;CAC1B,mCAAmC;CACpC,CAAC;;;;AAKF,MAAa,uBAAuB,WAAW,YAAY;;;;AAK3D,MAAa,gBAAuC,EAAE,eAAe;CACnE,MAAM,CAAC,gBAAgB,qBAAqB,kBAC1C,kBACA,MACD;CACD,MAAM,CAAC,YAAY,iBAAiB,kBAClC,cACA,aACD;CACD,MAAM,CAAC,0BAA0B,+BAC/B,kBACE,4BACA,aACD;AAEH,QACE,oBAAC,aAAD;EACE,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACD;EAEA;EACW"}
1
+ {"version":3,"file":"CodeContext.mjs","names":[],"sources":["../../../../src/components/IDE/CodeContext.tsx"],"sourcesContent":["'use client';\n\nimport { usePersistedStore } from '@hooks/usePersistedStore';\nimport {\n createContext,\n type FC,\n type PropsWithChildren,\n useContext,\n} from 'react';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\nexport type CodeFormat = 'typescript' | 'commonjs' | 'esm';\nexport type ContentDeclarationFormat =\n | 'typescript'\n | 'commonjs'\n | 'esm'\n | 'json';\n\ntype CodeContextValue = {\n packageManager: PackageManager;\n setPackageManager: (packageManager: PackageManager) => void;\n codeFormat: CodeFormat;\n setCodeFormat: (codeFormat: CodeFormat) => void;\n contentDeclarationFormat: ContentDeclarationFormat;\n setContentDeclarationFormat: (\n contentDeclarationFormat: ContentDeclarationFormat\n ) => void;\n};\n\n/**\n * Context that store the current locale on the client side\n */\nexport const CodeContext = createContext<CodeContextValue>({\n packageManager: 'npm',\n setPackageManager: () => {},\n codeFormat: 'typescript',\n setCodeFormat: () => {},\n contentDeclarationFormat: 'typescript',\n setContentDeclarationFormat: () => {},\n});\n\n/**\n * Hook that provides the current locale\n */\nexport const useCodeContext = () => useContext(CodeContext);\n\n/**\n * Provider that store the current locale on the client side\n */\nexport const CodeProvider: FC<PropsWithChildren> = ({ children }) => {\n const [packageManager, setPackageManager] = usePersistedStore<PackageManager>(\n 'packageManager',\n 'npm'\n );\n const [codeFormat, setCodeFormat] = usePersistedStore<CodeFormat>(\n 'codeFormat',\n 'typescript'\n );\n const [contentDeclarationFormat, setContentDeclarationFormat] =\n usePersistedStore<ContentDeclarationFormat>(\n 'contentDeclarationFormat',\n 'typescript'\n );\n\n return (\n <CodeContext\n value={{\n packageManager,\n setPackageManager,\n codeFormat,\n setCodeFormat,\n contentDeclarationFormat,\n setContentDeclarationFormat,\n }}\n >\n {children}\n </CodeContext>\n );\n};\n"],"mappings":";;;;;;;;;;AAgCA,MAAa,cAAc,cAAgC;CACzD,gBAAgB;CAChB,yBAAyB;CACzB,YAAY;CACZ,qBAAqB;CACrB,0BAA0B;CAC1B,mCAAmC;CACpC,CAAC;;;;AAKF,MAAa,uBAAuB,WAAW,YAAY;;;;AAK3D,MAAa,gBAAuC,EAAE,eAAe;CACnE,MAAM,CAAC,gBAAgB,qBAAqB,kBAC1C,kBACA,MACD;CACD,MAAM,CAAC,YAAY,iBAAiB,kBAClC,cACA,aACD;CACD,MAAM,CAAC,0BAA0B,+BAC/B,kBACE,4BACA,aACD;CAEH,OACE,oBAAC,aAAD;EACE,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACD;EAEA;EACW"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeFormatSelector.mjs","names":[],"sources":["../../../../src/components/IDE/CodeFormatSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport type { CodeFormat } from './CodeContext';\nimport { useCodeContext } from './CodeContext';\n\ntype CodeFormatSelectorProps = {\n /** When provided, only the listed formats are shown as options. */\n availableFormats?: CodeFormat[];\n};\n\nexport const CodeFormatSelector: FC<CodeFormatSelectorProps> = ({\n availableFormats,\n}) => {\n const { codeFormat, setCodeFormat, setContentDeclarationFormat } =\n useCodeContext();\n const content = useIntlayer('code-selectors');\n\n const show = (format: CodeFormat) =>\n !availableFormats || availableFormats.includes(format);\n\n return (\n <Select\n value={codeFormat}\n onValueChange={(value) => {\n setCodeFormat(value as typeof codeFormat);\n setContentDeclarationFormat(value as typeof codeFormat);\n }}\n >\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.codeFormat.label.value}\n >\n <Select.Value placeholder={content.codeFormat.placeholder.value} />\n </Select.Trigger>\n <Select.Content>\n {show('typescript') && (\n <Select.Item value=\"typescript\">TypeScript</Select.Item>\n )}\n {show('esm') && <Select.Item value=\"esm\">ESM</Select.Item>}\n {show('commonjs') && (\n <Select.Item value=\"commonjs\">CommonJS</Select.Item>\n )}\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAaA,MAAa,sBAAmD,EAC9D,uBACI;CACJ,MAAM,EAAE,YAAY,eAAe,gCACjC,gBAAgB;CAClB,MAAM,UAAU,YAAY,iBAAiB;CAE7C,MAAM,QAAQ,WACZ,CAAC,oBAAoB,iBAAiB,SAAS,OAAO;AAExD,QACE,qBAAC,QAAD;EACE,OAAO;EACP,gBAAgB,UAAU;AACxB,iBAAc,MAA2B;AACzC,+BAA4B,MAA2B;;YAJ3D,CAOE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,WAAW,MAAM;aAErC,oBAAC,OAAO,OAAR,EAAc,aAAa,QAAQ,WAAW,YAAY,OAAS;GACpD,GACjB,qBAAC,OAAO,SAAR;GACG,KAAK,aAAa,IACjB,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAa;IAAwB;GAEzD,KAAK,MAAM,IAAI,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GACzD,KAAK,WAAW,IACf,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAW;IAAsB;GAEvC,IACV"}
1
+ {"version":3,"file":"CodeFormatSelector.mjs","names":[],"sources":["../../../../src/components/IDE/CodeFormatSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport type { CodeFormat } from './CodeContext';\nimport { useCodeContext } from './CodeContext';\n\ntype CodeFormatSelectorProps = {\n /** When provided, only the listed formats are shown as options. */\n availableFormats?: CodeFormat[];\n};\n\nexport const CodeFormatSelector: FC<CodeFormatSelectorProps> = ({\n availableFormats,\n}) => {\n const { codeFormat, setCodeFormat, setContentDeclarationFormat } =\n useCodeContext();\n const content = useIntlayer('code-selectors');\n\n const show = (format: CodeFormat) =>\n !availableFormats || availableFormats.includes(format);\n\n return (\n <Select\n value={codeFormat}\n onValueChange={(value) => {\n setCodeFormat(value as typeof codeFormat);\n setContentDeclarationFormat(value as typeof codeFormat);\n }}\n >\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.codeFormat.label.value}\n >\n <Select.Value placeholder={content.codeFormat.placeholder.value} />\n </Select.Trigger>\n <Select.Content>\n {show('typescript') && (\n <Select.Item value=\"typescript\">TypeScript</Select.Item>\n )}\n {show('esm') && <Select.Item value=\"esm\">ESM</Select.Item>}\n {show('commonjs') && (\n <Select.Item value=\"commonjs\">CommonJS</Select.Item>\n )}\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAaA,MAAa,sBAAmD,EAC9D,uBACI;CACJ,MAAM,EAAE,YAAY,eAAe,gCACjC,gBAAgB;CAClB,MAAM,UAAU,YAAY,iBAAiB;CAE7C,MAAM,QAAQ,WACZ,CAAC,oBAAoB,iBAAiB,SAAS,OAAO;CAExD,OACE,qBAAC,QAAD;EACE,OAAO;EACP,gBAAgB,UAAU;GACxB,cAAc,MAA2B;GACzC,4BAA4B,MAA2B;;YAJ3D,CAOE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,WAAW,MAAM;aAErC,oBAAC,OAAO,OAAR,EAAc,aAAa,QAAQ,WAAW,YAAY,OAAS;GACpD,GACjB,qBAAC,OAAO,SAAR;GACG,KAAK,aAAa,IACjB,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAa;IAAwB;GAEzD,KAAK,MAAM,IAAI,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GACzD,KAAK,WAAW,IACf,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAW;IAAsB;GAEvC,IACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContentDeclarationFormatSelector.mjs","names":[],"sources":["../../../../src/components/IDE/ContentDeclarationFormatSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport { useCodeContext } from './CodeContext';\n\nexport const ContentDeclarationFormatSelector: FC = () => {\n const { contentDeclarationFormat, setContentDeclarationFormat } =\n useCodeContext();\n const content = useIntlayer('code-selectors');\n\n return (\n <Select\n value={contentDeclarationFormat}\n onValueChange={setContentDeclarationFormat}\n >\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.contentDeclarationFormat.label.value}\n >\n <Select.Value\n placeholder={content.contentDeclarationFormat.placeholder.value}\n />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"typescript\">TypeScript</Select.Item>\n <Select.Item value=\"commonjs\">CommonJS</Select.Item>\n <Select.Item value=\"esm\">ESM</Select.Item>\n <Select.Item value=\"json\">JSON</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,yCAA6C;CACxD,MAAM,EAAE,0BAA0B,gCAChC,gBAAgB;CAClB,MAAM,UAAU,YAAY,iBAAiB;AAE7C,QACE,qBAAC,QAAD;EACE,OAAO;EACP,eAAe;YAFjB,CAIE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,yBAAyB,MAAM;aAEnD,oBAAC,OAAO,OAAR,EACE,aAAa,QAAQ,yBAAyB,YAAY,OAC1D;GACa,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAa;IAAwB;GACxD,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAW;IAAsB;GACpD,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC1C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC7B,IACV"}
1
+ {"version":3,"file":"ContentDeclarationFormatSelector.mjs","names":[],"sources":["../../../../src/components/IDE/ContentDeclarationFormatSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport { useCodeContext } from './CodeContext';\n\nexport const ContentDeclarationFormatSelector: FC = () => {\n const { contentDeclarationFormat, setContentDeclarationFormat } =\n useCodeContext();\n const content = useIntlayer('code-selectors');\n\n return (\n <Select\n value={contentDeclarationFormat}\n onValueChange={setContentDeclarationFormat}\n >\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.contentDeclarationFormat.label.value}\n >\n <Select.Value\n placeholder={content.contentDeclarationFormat.placeholder.value}\n />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"typescript\">TypeScript</Select.Item>\n <Select.Item value=\"commonjs\">CommonJS</Select.Item>\n <Select.Item value=\"esm\">ESM</Select.Item>\n <Select.Item value=\"json\">JSON</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,yCAA6C;CACxD,MAAM,EAAE,0BAA0B,gCAChC,gBAAgB;CAClB,MAAM,UAAU,YAAY,iBAAiB;CAE7C,OACE,qBAAC,QAAD;EACE,OAAO;EACP,eAAe;YAFjB,CAIE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,yBAAyB,MAAM;aAEnD,oBAAC,OAAO,OAAR,EACE,aAAa,QAAQ,yBAAyB,YAAY,OAC1D;GACa,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAa;IAAwB;GACxD,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAW;IAAsB;GACpD,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC1C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC7B,IACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"CopyCode.mjs","names":[],"sources":["../../../../src/components/IDE/CopyCode.tsx"],"sourcesContent":["'use client';\n\nimport type { ButtonProps } from '@components/Button';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { CopyButton } from '../CopyButton';\nimport { Popover, PopoverXAlign } from '../Popover';\n\ntype CopyCodeProps = {\n code: string;\n} & Partial<Omit<ButtonProps, 'children'>>;\n\nexport const CopyCode: FC<CopyCodeProps> = ({ code, ...props }) => {\n const { title, description } = useIntlayer('code');\n\n return (\n <Popover identifier=\"copy\">\n <CopyButton content={code} {...props} />\n\n <Popover.Detail\n identifier=\"copy\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign={PopoverXAlign.END}\n >\n <strong>{title}</strong>\n <p className=\"text-neutral\">{description}</p>\n </Popover.Detail>\n </Popover>\n );\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,YAA+B,EAAE,MAAM,GAAG,YAAY;CACjE,MAAM,EAAE,OAAO,gBAAgB,YAAY,OAAO;AAElD,QACE,qBAAC,SAAD;EAAS,YAAW;YAApB,CACE,oBAAC,YAAD;GAAY,SAAS;GAAM,GAAI;GAAS,GAExC,qBAAC,QAAQ,QAAT;GACE,YAAW;GACX,WAAU;GACV;aAHF,CAKE,oBAAC,UAAD,YAAS,OAAe,GACxB,oBAAC,KAAD;IAAG,WAAU;cAAgB;IAAgB,EAC9B;KACT"}
1
+ {"version":3,"file":"CopyCode.mjs","names":[],"sources":["../../../../src/components/IDE/CopyCode.tsx"],"sourcesContent":["'use client';\n\nimport type { ButtonProps } from '@components/Button';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { CopyButton } from '../CopyButton';\nimport { Popover, PopoverXAlign } from '../Popover';\n\ntype CopyCodeProps = {\n code: string;\n} & Partial<Omit<ButtonProps, 'children'>>;\n\nexport const CopyCode: FC<CopyCodeProps> = ({ code, ...props }) => {\n const { title, description } = useIntlayer('code');\n\n return (\n <Popover identifier=\"copy\">\n <CopyButton content={code} {...props} />\n\n <Popover.Detail\n identifier=\"copy\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign={PopoverXAlign.END}\n >\n <strong>{title}</strong>\n <p className=\"text-neutral\">{description}</p>\n </Popover.Detail>\n </Popover>\n );\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,YAA+B,EAAE,MAAM,GAAG,YAAY;CACjE,MAAM,EAAE,OAAO,gBAAgB,YAAY,OAAO;CAElD,OACE,qBAAC,SAAD;EAAS,YAAW;YAApB,CACE,oBAAC,YAAD;GAAY,SAAS;GAAM,GAAI;GAAS,GAExC,qBAAC,QAAQ,QAAT;GACE,YAAW;GACX,WAAU;GACV;aAHF,CAKE,oBAAC,UAAD,YAAS,OAAe,GACxB,oBAAC,KAAD;IAAG,WAAU;cAAgB;IAAgB,EAC9B;KACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileTree.mjs","names":[],"sources":["../../../../src/components/IDE/FileTree.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { ChevronRight } from 'lucide-react';\nimport { type FC, useState } from 'react';\nimport { MaxHeightSmoother } from '../MaxHeightSmoother';\nimport { createFileTree, type FilePath } from './createFileTree';\n\ntype FileTreeProps = {\n filesPaths: string[];\n activeFile?: string;\n onClickFile?: (filePath: string) => void;\n prePaths?: string[];\n};\n\nconst concatFilePath = (paths: string[]) => paths.join('/');\n\ntype FileItemProps = {\n filesPaths: string[];\n subPath?: FilePath[];\n path: string;\n onClickFile?: (title: string) => void;\n activeFile?: string;\n prePaths: string[];\n isFile: boolean;\n};\n\nconst FileItem: FC<FileItemProps> = ({\n filesPaths,\n path,\n subPath,\n onClickFile,\n activeFile,\n prePaths,\n isFile,\n}) => {\n const [subPathOpen, setSubPathOpen] = useState(true);\n\n const level = prePaths.length + 1;\n const currentPath = concatFilePath([\n ...prePaths.slice(level - 1, level),\n path,\n ]);\n const totalPath = concatFilePath([...prePaths, path]);\n\n const filteredFilePaths = filesPaths\n .map(\n (path) => path.replace(/^\\/?/, '') // This regex matches the first slash, if it exists, at the start of the string)\n )\n .filter((filePath) => filePath.startsWith(currentPath));\n\n const newPath = filteredFilePaths.map((path) =>\n path.replace(currentPath, '').replace(/^\\/?/, '')\n );\n\n const isActive = totalPath === activeFile;\n\n const indentation = new Array(level).fill(' ').join('');\n\n return (\n <>\n <button\n className={cn(\n 'flex w-full items-start justify-start whitespace-pre text-nowrap px-2 py-1 text-xs transition',\n isActive\n ? 'bg-neutral-200 dark:bg-neutral-700'\n : 'cursor-pointer hover:bg-neutral-300 dark:hover:bg-neutral-900'\n )}\n key={path}\n onClick={() => {\n if (isFile) {\n onClickFile?.(totalPath);\n } else {\n setSubPathOpen(!subPathOpen);\n }\n }}\n >\n <span className={cn('whitespace-pre', isFile && 'ml-2')}>\n {indentation}\n </span>\n\n {!isFile && (\n <ChevronRight\n className={cn(`transition`, subPathOpen && `rotate-90 transform`)}\n size={16}\n />\n )}\n {path}\n </button>\n {subPath && (\n <MaxHeightSmoother\n isHidden={!subPathOpen}\n className=\"overflow-x-hidden\"\n >\n <FileTree\n filesPaths={newPath}\n activeFile={activeFile}\n onClickFile={onClickFile}\n prePaths={[...prePaths, path]}\n />\n </MaxHeightSmoother>\n )}\n </>\n );\n};\n\nexport const FileTree: FC<FileTreeProps> = ({\n filesPaths,\n activeFile,\n onClickFile,\n prePaths = [],\n}) => {\n const fileTree = createFileTree(filesPaths);\n\n return (\n <div className=\"flex size-full flex-col items-start justify-start py-1 text-neutral\">\n {fileTree.map(({ path, subPath, isFile }) => (\n <FileItem\n key={path}\n isFile={isFile}\n subPath={subPath}\n path={path}\n onClickFile={onClickFile}\n activeFile={activeFile}\n prePaths={prePaths}\n filesPaths={filesPaths}\n />\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAM,kBAAkB,UAAoB,MAAM,KAAK,IAAI;AAY3D,MAAM,YAA+B,EACnC,YACA,MACA,SACA,aACA,YACA,UACA,aACI;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAEpD,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,cAAc,eAAe,CACjC,GAAG,SAAS,MAAM,QAAQ,GAAG,MAAM,EACnC,KACD,CAAC;CACF,MAAM,YAAY,eAAe,CAAC,GAAG,UAAU,KAAK,CAAC;CAQrD,MAAM,UANoB,WACvB,KACE,SAAS,KAAK,QAAQ,QAAQ,GAAG,CACnC,CACA,QAAQ,aAAa,SAAS,WAAW,YAAY,CAEvB,CAAC,KAAK,SACrC,KAAK,QAAQ,aAAa,GAAG,CAAC,QAAQ,QAAQ,GAAG,CAClD;CAED,MAAM,WAAW,cAAc;CAE/B,MAAM,cAAc,IAAI,MAAM,MAAM,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG;AAExD,QACE,8CACE,qBAAC,UAAD;EACE,WAAW,GACT,iGACA,WACI,uCACA,gEACL;EAED,eAAe;AACb,OAAI,OACF,eAAc,UAAU;OAExB,gBAAe,CAAC,YAAY;;YAZlC;GAgBE,oBAAC,QAAD;IAAM,WAAW,GAAG,kBAAkB,UAAU,OAAO;cACpD;IACI;GAEN,CAAC,UACA,oBAAC,cAAD;IACE,WAAW,GAAG,cAAc,eAAe,sBAAsB;IACjE,MAAM;IACN;GAEH;GACM;IApBF,KAoBE,EACR,WACC,oBAAC,mBAAD;EACE,UAAU,CAAC;EACX,WAAU;YAEV,oBAAC,UAAD;GACE,YAAY;GACA;GACC;GACb,UAAU,CAAC,GAAG,UAAU,KAAK;GAC7B;EACgB,EAErB;;AAIP,MAAa,YAA+B,EAC1C,YACA,YACA,aACA,WAAW,EAAE,OACT;AAGJ,QACE,oBAAC,OAAD;EAAK,WAAU;YAHA,eAAe,WAInB,CAAC,KAAK,EAAE,MAAM,SAAS,aAC9B,oBAAC,UAAD;GAEU;GACC;GACH;GACO;GACD;GACF;GACE;GACZ,EARK,KAQL,CACF;EACE"}
1
+ {"version":3,"file":"FileTree.mjs","names":[],"sources":["../../../../src/components/IDE/FileTree.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { ChevronRight } from 'lucide-react';\nimport { type FC, useState } from 'react';\nimport { MaxHeightSmoother } from '../MaxHeightSmoother';\nimport { createFileTree, type FilePath } from './createFileTree';\n\ntype FileTreeProps = {\n filesPaths: string[];\n activeFile?: string;\n onClickFile?: (filePath: string) => void;\n prePaths?: string[];\n};\n\nconst concatFilePath = (paths: string[]) => paths.join('/');\n\ntype FileItemProps = {\n filesPaths: string[];\n subPath?: FilePath[];\n path: string;\n onClickFile?: (title: string) => void;\n activeFile?: string;\n prePaths: string[];\n isFile: boolean;\n};\n\nconst FileItem: FC<FileItemProps> = ({\n filesPaths,\n path,\n subPath,\n onClickFile,\n activeFile,\n prePaths,\n isFile,\n}) => {\n const [subPathOpen, setSubPathOpen] = useState(true);\n\n const level = prePaths.length + 1;\n const currentPath = concatFilePath([\n ...prePaths.slice(level - 1, level),\n path,\n ]);\n const totalPath = concatFilePath([...prePaths, path]);\n\n const filteredFilePaths = filesPaths\n .map(\n (path) => path.replace(/^\\/?/, '') // This regex matches the first slash, if it exists, at the start of the string)\n )\n .filter((filePath) => filePath.startsWith(currentPath));\n\n const newPath = filteredFilePaths.map((path) =>\n path.replace(currentPath, '').replace(/^\\/?/, '')\n );\n\n const isActive = totalPath === activeFile;\n\n const indentation = new Array(level).fill(' ').join('');\n\n return (\n <>\n <button\n className={cn(\n 'flex w-full items-start justify-start whitespace-pre text-nowrap px-2 py-1 text-xs transition',\n isActive\n ? 'bg-neutral-200 dark:bg-neutral-700'\n : 'cursor-pointer hover:bg-neutral-300 dark:hover:bg-neutral-900'\n )}\n key={path}\n onClick={() => {\n if (isFile) {\n onClickFile?.(totalPath);\n } else {\n setSubPathOpen(!subPathOpen);\n }\n }}\n >\n <span className={cn('whitespace-pre', isFile && 'ml-2')}>\n {indentation}\n </span>\n\n {!isFile && (\n <ChevronRight\n className={cn(`transition`, subPathOpen && `rotate-90 transform`)}\n size={16}\n />\n )}\n {path}\n </button>\n {subPath && (\n <MaxHeightSmoother\n isHidden={!subPathOpen}\n className=\"overflow-x-hidden\"\n >\n <FileTree\n filesPaths={newPath}\n activeFile={activeFile}\n onClickFile={onClickFile}\n prePaths={[...prePaths, path]}\n />\n </MaxHeightSmoother>\n )}\n </>\n );\n};\n\nexport const FileTree: FC<FileTreeProps> = ({\n filesPaths,\n activeFile,\n onClickFile,\n prePaths = [],\n}) => {\n const fileTree = createFileTree(filesPaths);\n\n return (\n <div className=\"flex size-full flex-col items-start justify-start py-1 text-neutral\">\n {fileTree.map(({ path, subPath, isFile }) => (\n <FileItem\n key={path}\n isFile={isFile}\n subPath={subPath}\n path={path}\n onClickFile={onClickFile}\n activeFile={activeFile}\n prePaths={prePaths}\n filesPaths={filesPaths}\n />\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAM,kBAAkB,UAAoB,MAAM,KAAK,IAAI;AAY3D,MAAM,YAA+B,EACnC,YACA,MACA,SACA,aACA,YACA,UACA,aACI;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAEpD,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,cAAc,eAAe,CACjC,GAAG,SAAS,MAAM,QAAQ,GAAG,MAAM,EACnC,KACD,CAAC;CACF,MAAM,YAAY,eAAe,CAAC,GAAG,UAAU,KAAK,CAAC;CAQrD,MAAM,UANoB,WACvB,KACE,SAAS,KAAK,QAAQ,QAAQ,GAAG,CACnC,CACA,QAAQ,aAAa,SAAS,WAAW,YAAY,CAEvB,CAAC,KAAK,SACrC,KAAK,QAAQ,aAAa,GAAG,CAAC,QAAQ,QAAQ,GAAG,CAClD;CAED,MAAM,WAAW,cAAc;CAE/B,MAAM,cAAc,IAAI,MAAM,MAAM,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG;CAExD,OACE,8CACE,qBAAC,UAAD;EACE,WAAW,GACT,iGACA,WACI,uCACA,gEACL;EAED,eAAe;GACb,IAAI,QACF,cAAc,UAAU;QAExB,eAAe,CAAC,YAAY;;YAZlC;GAgBE,oBAAC,QAAD;IAAM,WAAW,GAAG,kBAAkB,UAAU,OAAO;cACpD;IACI;GAEN,CAAC,UACA,oBAAC,cAAD;IACE,WAAW,GAAG,cAAc,eAAe,sBAAsB;IACjE,MAAM;IACN;GAEH;GACM;IApBF,KAoBE,EACR,WACC,oBAAC,mBAAD;EACE,UAAU,CAAC;EACX,WAAU;YAEV,oBAAC,UAAD;GACE,YAAY;GACA;GACC;GACb,UAAU,CAAC,GAAG,UAAU,KAAK;GAC7B;EACgB,EAErB;;AAIP,MAAa,YAA+B,EAC1C,YACA,YACA,aACA,WAAW,EAAE,OACT;CAGJ,OACE,oBAAC,OAAD;EAAK,WAAU;YAHA,eAAe,WAInB,CAAC,KAAK,EAAE,MAAM,SAAS,aAC9B,oBAAC,UAAD;GAEU;GACC;GACH;GACO;GACD;GACF;GACE;GACZ,EARK,KAQL,CACF;EACE"}
@@ -1 +1 @@
1
- {"version":3,"file":"IDE.mjs","names":[],"sources":["../../../../src/components/IDE/IDE.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { type FC, type HTMLAttributes, useEffect, useState } from 'react';\nimport { Container } from '../Container';\nimport { WithResizer } from '../WithResizer';\nimport { FileTree } from './FileTree';\nimport { MarkdownRenderer } from './MarkDownRender';\n\nexport type IDEProps = {\n pages: {\n path: string;\n content: string;\n isOpen?: boolean;\n }[];\n isDarkMode?: boolean;\n activeTab?: number;\n} & HTMLAttributes<HTMLDivElement>;\n\nexport const IDE: FC<IDEProps> = ({\n pages: initialPages,\n isDarkMode,\n className,\n activeTab: defaultActiveTab,\n ...props\n}) => {\n const [pages, setPages] = useState(initialPages);\n const tabs = pages.filter(({ isOpen }) => isOpen);\n\n const firstTabIndex = tabs.findIndex(({ isOpen }) => isOpen);\n const [activeTab, setActiveTab] = useState(defaultActiveTab ?? firstTabIndex);\n\n useEffect(() => {\n setActiveTab(defaultActiveTab ?? firstTabIndex);\n }, [initialPages, defaultActiveTab]);\n\n const { content, path } = pages[activeTab] ?? {};\n const filePaths = initialPages.map(({ path: title }) => title);\n\n const handleClickFile = (title: string) => {\n const page = pages.find(({ path: tabTitle }) => tabTitle === title);\n if (!page) return;\n\n const newPages = pages.map((page) => {\n if (page.path === title) {\n return { ...page, isOpen: true };\n }\n return page;\n });\n\n setPages(newPages);\n\n const newPageIndex = newPages.findIndex(\n ({ path: tabTitle }) => tabTitle === title\n );\n\n setActiveTab(newPageIndex);\n };\n\n return (\n <Container\n className={cn(\n 'flex size-full flex-col justify-start overflow-hidden shadow-lg',\n className\n )}\n roundedSize=\"3xl\"\n transparency=\"none\"\n {...props}\n >\n <div className=\"flex w-auto flex-row items-center justify-start gap-1 bg-neutral-200 text-neutral text-xs dark:bg-neutral-950\">\n <div className=\"mx-2 flex items-center justify-start gap-2 p-1\">\n <div className=\"size-3 rounded-full bg-red-500\" />\n <div className=\"size-3 rounded-full bg-yellow-500\" />\n <div className=\"size-3 rounded-full bg-green-500\" />\n </div>\n <div className=\"flex size-full overflow-y-auto\">\n {tabs.map(({ path }, index) => {\n const fullPath = path.split('/');\n const title = fullPath[fullPath.length - 1];\n const isActive = index === activeTab;\n\n return (\n <button\n className={cn(\n 'flex h-8 min-w-20 max-w-30 items-center justify-start truncate text-nowrap px-3 py-1 transition',\n isActive\n ? 'bg-card'\n : 'cursor-pointer bg-neutral-200 hover:bg-neutral-300 dark:bg-neutral-950'\n )}\n key={title}\n onClick={() => setActiveTab(index)}\n >\n {title}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"relative flex size-full flex-1 flex-row justify-start\">\n <div className=\"absolute top-0 left-0 size-full\">\n <div className=\"flex size-full\">\n <WithResizer initialWidth={150}>\n <div className=\"max-h-full flex-1 overflow-y-auto\">\n <FileTree\n filesPaths={filePaths}\n activeFile={path}\n onClickFile={handleClickFile}\n />\n </div>\n </WithResizer>\n\n <div className=\"size-full flex-1 overflow-auto pt-2 text-xs\">\n <MarkdownRenderer isDarkMode={isDarkMode}>\n {content}\n </MarkdownRenderer>\n </div>\n </div>\n </div>\n </div>\n </Container>\n );\n};\n"],"mappings":";;;;;;;;;;;AAmBA,MAAa,OAAqB,EAChC,OAAO,cACP,YACA,WACA,WAAW,kBACX,GAAG,YACC;CACJ,MAAM,CAAC,OAAO,YAAY,SAAS,aAAa;CAChD,MAAM,OAAO,MAAM,QAAQ,EAAE,aAAa,OAAO;CAEjD,MAAM,gBAAgB,KAAK,WAAW,EAAE,aAAa,OAAO;CAC5D,MAAM,CAAC,WAAW,gBAAgB,SAAS,oBAAoB,cAAc;AAE7E,iBAAgB;AACd,eAAa,oBAAoB,cAAc;IAC9C,CAAC,cAAc,iBAAiB,CAAC;CAEpC,MAAM,EAAE,SAAS,SAAS,MAAM,cAAc,EAAE;CAChD,MAAM,YAAY,aAAa,KAAK,EAAE,MAAM,YAAY,MAAM;CAE9D,MAAM,mBAAmB,UAAkB;AAEzC,MAAI,CADS,MAAM,MAAM,EAAE,MAAM,eAAe,aAAa,MACpD,CAAE;EAEX,MAAM,WAAW,MAAM,KAAK,SAAS;AACnC,OAAI,KAAK,SAAS,MAChB,QAAO;IAAE,GAAG;IAAM,QAAQ;IAAM;AAElC,UAAO;IACP;AAEF,WAAS,SAAS;AAMlB,eAJqB,SAAS,WAC3B,EAAE,MAAM,eAAe,aAAa,MAGd,CAAC;;AAG5B,QACE,qBAAC,WAAD;EACE,WAAW,GACT,mEACA,UACD;EACD,aAAY;EACZ,cAAa;EACb,GAAI;YAPN,CASE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,OAAD,EAAK,WAAU,kCAAmC;KAClD,oBAAC,OAAD,EAAK,WAAU,qCAAsC;KACrD,oBAAC,OAAD,EAAK,WAAU,oCAAqC;KAChD;OACN,oBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,KAAK,EAAE,QAAQ,UAAU;KAC7B,MAAM,WAAW,KAAK,MAAM,IAAI;KAChC,MAAM,QAAQ,SAAS,SAAS,SAAS;AAGzC,YACE,oBAAC,UAAD;MACE,WAAW,GACT,mGALW,UAAU,YAOjB,YACA,yEACL;MAED,eAAe,aAAa,MAAM;gBAEjC;MACM,EAJF,MAIE;MAEX;IACE,EACF;MACN,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,aAAD;MAAa,cAAc;gBACzB,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,UAAD;QACE,YAAY;QACZ,YAAY;QACZ,aAAa;QACb;OACE;MACM,GAEd,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,kBAAD;OAA8B;iBAC3B;OACgB;MACf,EACF;;IACF;GACF,EACI"}
1
+ {"version":3,"file":"IDE.mjs","names":[],"sources":["../../../../src/components/IDE/IDE.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { type FC, type HTMLAttributes, useEffect, useState } from 'react';\nimport { Container } from '../Container';\nimport { WithResizer } from '../WithResizer';\nimport { FileTree } from './FileTree';\nimport { MarkdownRenderer } from './MarkDownRender';\n\nexport type IDEProps = {\n pages: {\n path: string;\n content: string;\n isOpen?: boolean;\n }[];\n isDarkMode?: boolean;\n activeTab?: number;\n} & HTMLAttributes<HTMLDivElement>;\n\nexport const IDE: FC<IDEProps> = ({\n pages: initialPages,\n isDarkMode,\n className,\n activeTab: defaultActiveTab,\n ...props\n}) => {\n const [pages, setPages] = useState(initialPages);\n const tabs = pages.filter(({ isOpen }) => isOpen);\n\n const firstTabIndex = tabs.findIndex(({ isOpen }) => isOpen);\n const [activeTab, setActiveTab] = useState(defaultActiveTab ?? firstTabIndex);\n\n useEffect(() => {\n setActiveTab(defaultActiveTab ?? firstTabIndex);\n }, [initialPages, defaultActiveTab]);\n\n const { content, path } = pages[activeTab] ?? {};\n const filePaths = initialPages.map(({ path: title }) => title);\n\n const handleClickFile = (title: string) => {\n const page = pages.find(({ path: tabTitle }) => tabTitle === title);\n if (!page) return;\n\n const newPages = pages.map((page) => {\n if (page.path === title) {\n return { ...page, isOpen: true };\n }\n return page;\n });\n\n setPages(newPages);\n\n const newPageIndex = newPages.findIndex(\n ({ path: tabTitle }) => tabTitle === title\n );\n\n setActiveTab(newPageIndex);\n };\n\n return (\n <Container\n className={cn(\n 'flex size-full flex-col justify-start overflow-hidden shadow-lg',\n className\n )}\n roundedSize=\"3xl\"\n transparency=\"none\"\n {...props}\n >\n <div className=\"flex w-auto flex-row items-center justify-start gap-1 bg-neutral-200 text-neutral text-xs dark:bg-neutral-950\">\n <div className=\"mx-2 flex items-center justify-start gap-2 p-1\">\n <div className=\"size-3 rounded-full bg-red-500\" />\n <div className=\"size-3 rounded-full bg-yellow-500\" />\n <div className=\"size-3 rounded-full bg-green-500\" />\n </div>\n <div className=\"flex size-full overflow-y-auto\">\n {tabs.map(({ path }, index) => {\n const fullPath = path.split('/');\n const title = fullPath[fullPath.length - 1];\n const isActive = index === activeTab;\n\n return (\n <button\n className={cn(\n 'flex h-8 min-w-20 max-w-30 items-center justify-start truncate text-nowrap px-3 py-1 transition',\n isActive\n ? 'bg-card'\n : 'cursor-pointer bg-neutral-200 hover:bg-neutral-300 dark:bg-neutral-950'\n )}\n key={title}\n onClick={() => setActiveTab(index)}\n >\n {title}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"relative flex size-full flex-1 flex-row justify-start\">\n <div className=\"absolute top-0 left-0 size-full\">\n <div className=\"flex size-full\">\n <WithResizer initialWidth={150}>\n <div className=\"max-h-full flex-1 overflow-y-auto\">\n <FileTree\n filesPaths={filePaths}\n activeFile={path}\n onClickFile={handleClickFile}\n />\n </div>\n </WithResizer>\n\n <div className=\"size-full flex-1 overflow-auto pt-2 text-xs\">\n <MarkdownRenderer isDarkMode={isDarkMode}>\n {content}\n </MarkdownRenderer>\n </div>\n </div>\n </div>\n </div>\n </Container>\n );\n};\n"],"mappings":";;;;;;;;;;;AAmBA,MAAa,OAAqB,EAChC,OAAO,cACP,YACA,WACA,WAAW,kBACX,GAAG,YACC;CACJ,MAAM,CAAC,OAAO,YAAY,SAAS,aAAa;CAChD,MAAM,OAAO,MAAM,QAAQ,EAAE,aAAa,OAAO;CAEjD,MAAM,gBAAgB,KAAK,WAAW,EAAE,aAAa,OAAO;CAC5D,MAAM,CAAC,WAAW,gBAAgB,SAAS,oBAAoB,cAAc;CAE7E,gBAAgB;EACd,aAAa,oBAAoB,cAAc;IAC9C,CAAC,cAAc,iBAAiB,CAAC;CAEpC,MAAM,EAAE,SAAS,SAAS,MAAM,cAAc,EAAE;CAChD,MAAM,YAAY,aAAa,KAAK,EAAE,MAAM,YAAY,MAAM;CAE9D,MAAM,mBAAmB,UAAkB;EAEzC,IAAI,CADS,MAAM,MAAM,EAAE,MAAM,eAAe,aAAa,MACpD,EAAE;EAEX,MAAM,WAAW,MAAM,KAAK,SAAS;GACnC,IAAI,KAAK,SAAS,OAChB,OAAO;IAAE,GAAG;IAAM,QAAQ;IAAM;GAElC,OAAO;IACP;EAEF,SAAS,SAAS;EAMlB,aAJqB,SAAS,WAC3B,EAAE,MAAM,eAAe,aAAa,MAGd,CAAC;;CAG5B,OACE,qBAAC,WAAD;EACE,WAAW,GACT,mEACA,UACD;EACD,aAAY;EACZ,cAAa;EACb,GAAI;YAPN,CASE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,OAAD,EAAK,WAAU,kCAAmC;KAClD,oBAAC,OAAD,EAAK,WAAU,qCAAsC;KACrD,oBAAC,OAAD,EAAK,WAAU,oCAAqC;KAChD;OACN,oBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,KAAK,EAAE,QAAQ,UAAU;KAC7B,MAAM,WAAW,KAAK,MAAM,IAAI;KAChC,MAAM,QAAQ,SAAS,SAAS,SAAS;KAGzC,OACE,oBAAC,UAAD;MACE,WAAW,GACT,mGALW,UAAU,YAOjB,YACA,yEACL;MAED,eAAe,aAAa,MAAM;gBAEjC;MACM,EAJF,MAIE;MAEX;IACE,EACF;MACN,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,aAAD;MAAa,cAAc;gBACzB,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,UAAD;QACE,YAAY;QACZ,YAAY;QACZ,aAAa;QACb;OACE;MACM,GAEd,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,kBAAD;OAA8B;iBAC3B;OACgB;MACf,EACF;;IACF;GACF,EACI"}
@@ -1 +1 @@
1
- {"version":3,"file":"MonacoCode.mjs","names":[],"sources":["../../../../src/components/IDE/MonacoCode.tsx"],"sourcesContent":["'use client';\n\nimport type { OnChange, OnMount } from '@monaco-editor/react';\nimport { cn } from '@utils/cn';\nimport { type FC, lazy, Suspense, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton';\nimport { Loader } from '../Loader';\n\nconst Editor = lazy(() =>\n import('@monaco-editor/react').then((mod) => ({ default: mod.Editor }))\n);\n\ntype CodeCompProps = {\n children: string;\n language: string;\n isDarkMode?: boolean;\n showLineNumbers?: boolean;\n showCopyButton?: boolean;\n isReadOnly?: boolean;\n onChange?: OnChange;\n};\n\nexport const MonacoCode: FC<CodeCompProps> = ({\n children,\n language,\n isDarkMode,\n showLineNumbers,\n showCopyButton = true,\n isReadOnly = false,\n onChange,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const ideRef = useRef(null);\n const [editorSize, setEditorSize] = useState<{\n height: number;\n width: number;\n }>({ height: 0, width: 0 });\n\n const theme = isDarkMode ? 'vs-dark-transparent' : 'hc-light-theme';\n\n const handleMountIde: OnMount = (editor, monaco) => {\n // first time you set the height based on content Height\n\n ideRef.current = editor as any;\n const contentHeight = (editor.getContentHeight() ?? 0) + 25;\n\n monaco.editor.defineTheme('vs-dark-transparent', {\n base: 'vs-dark',\n inherit: true,\n rules: [],\n colors: {\n 'editor.background': '#00000000',\n },\n });\n monaco.editor.defineTheme('hc-light-theme', {\n base: 'vs',\n inherit: true,\n rules: [],\n colors: {\n 'editor.background': '#00000000',\n },\n });\n\n monaco.editor.setTheme(theme);\n\n // Disable TypeScript diagnostics\n monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true, // Disables type checking\n noSyntaxValidation: true, // Disables syntax errors\n });\n\n // Disable JavaScript diagnostics\n monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true,\n noSyntaxValidation: true,\n });\n\n // Disable unnecessary language features (e.g., suggestions, quick fixes)\n monaco.languages.typescript.typescriptDefaults.setCompilerOptions({\n noLib: true,\n allowNonTsExtensions: true,\n });\n\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({\n noLib: true,\n allowNonTsExtensions: true,\n });\n\n setEditorSize({\n height: contentHeight,\n width: containerRef.current?.clientWidth ?? 0,\n });\n };\n\n const isShowLineNumbers =\n showLineNumbers ??\n (typeof children === 'string' ? children.split('\\n').length > 1 : false);\n\n return (\n <div\n className={cn(\n 'relative h-full w-full text-sm',\n showLineNumbers && 'ml-0'\n )}\n >\n {showCopyButton && (\n <div className=\"sticky top-5 z-10\">\n <div\n className={cn('absolute right-2 bottom-0 flex h-7 items-center')}\n >\n <CopyButton content={children} />\n </div>\n </div>\n )}\n <div\n className=\"z-0 grid size-full grid-cols-[0px] overflow-auto\"\n ref={containerRef}\n >\n <Suspense fallback={<Loader />}>\n <Editor\n {...editorSize}\n defaultLanguage=\"typescript\"\n language={language}\n loading={<Loader />}\n defaultValue={String(children).replace(/\\n$/, '')}\n onMount={handleMountIde}\n onChange={onChange}\n options={{\n contextmenu: false,\n readOnly: isReadOnly,\n cursorStyle: 'line',\n minimap: { enabled: false },\n scrollbar: {\n vertical: 'hidden',\n verticalScrollbarSize: 0,\n alwaysConsumeMouseWheel: false,\n },\n folding: false, // Disable code folding\n renderValidationDecorations: 'off', // Disable error/warning decorations\n quickSuggestions: false, // Disable IntelliSense\n parameterHints: { enabled: false }, // Disable parameter hints\n suggestOnTriggerCharacters: false, // Disable suggestions on typing\n\n mouseWheelScrollSensitivity: 0,\n fastScrollSensitivity: 0,\n scrollBeyondLastLine: false,\n lineNumbers: isShowLineNumbers ? 'on' : 'off',\n }}\n theme={theme}\n className=\"my-2 rounded-md\"\n />\n </Suspense>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,SAAS,WACb,OAAO,wBAAwB,MAAM,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,CACxE;AAYD,MAAa,cAAiC,EAC5C,UACA,UACA,YACA,iBACA,iBAAiB,MACjB,aAAa,OACb,eACI;CACJ,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,SAAS,OAAO,KAAK;CAC3B,MAAM,CAAC,YAAY,iBAAiB,SAGjC;EAAE,QAAQ;EAAG,OAAO;EAAG,CAAC;CAE3B,MAAM,QAAQ,aAAa,wBAAwB;CAEnD,MAAM,kBAA2B,QAAQ,WAAW;AAGlD,SAAO,UAAU;EACjB,MAAM,iBAAiB,OAAO,kBAAkB,IAAI,KAAK;AAEzD,SAAO,OAAO,YAAY,uBAAuB;GAC/C,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ,EACN,qBAAqB,aACtB;GACF,CAAC;AACF,SAAO,OAAO,YAAY,kBAAkB;GAC1C,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ,EACN,qBAAqB,aACtB;GACF,CAAC;AAEF,SAAO,OAAO,SAAS,MAAM;AAG7B,SAAO,UAAU,WAAW,mBAAmB,sBAAsB;GACnE,sBAAsB;GACtB,oBAAoB;GACrB,CAAC;AAGF,SAAO,UAAU,WAAW,mBAAmB,sBAAsB;GACnE,sBAAsB;GACtB,oBAAoB;GACrB,CAAC;AAGF,SAAO,UAAU,WAAW,mBAAmB,mBAAmB;GAChE,OAAO;GACP,sBAAsB;GACvB,CAAC;AAEF,SAAO,UAAU,WAAW,mBAAmB,mBAAmB;GAChE,OAAO;GACP,sBAAsB;GACvB,CAAC;AAEF,gBAAc;GACZ,QAAQ;GACR,OAAO,aAAa,SAAS,eAAe;GAC7C,CAAC;;CAGJ,MAAM,oBACJ,oBACC,OAAO,aAAa,WAAW,SAAS,MAAM,KAAK,CAAC,SAAS,IAAI;AAEpE,QACE,qBAAC,OAAD;EACE,WAAW,GACT,kCACA,mBAAmB,OACpB;YAJH,CAMG,kBACC,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,OAAD;IACE,WAAW,GAAG,kDAAkD;cAEhE,oBAAC,YAAD,EAAY,SAAS,UAAY;IAC7B;GACF,GAER,oBAAC,OAAD;GACE,WAAU;GACV,KAAK;aAEL,oBAAC,UAAD;IAAU,UAAU,oBAAC,QAAD,EAAU;cAC5B,oBAAC,QAAD;KACE,GAAI;KACJ,iBAAgB;KACN;KACV,SAAS,oBAAC,QAAD,EAAU;KACnB,cAAc,OAAO,SAAS,CAAC,QAAQ,OAAO,GAAG;KACjD,SAAS;KACC;KACV,SAAS;MACP,aAAa;MACb,UAAU;MACV,aAAa;MACb,SAAS,EAAE,SAAS,OAAO;MAC3B,WAAW;OACT,UAAU;OACV,uBAAuB;OACvB,yBAAyB;OAC1B;MACD,SAAS;MACT,6BAA6B;MAC7B,kBAAkB;MAClB,gBAAgB,EAAE,SAAS,OAAO;MAClC,4BAA4B;MAE5B,6BAA6B;MAC7B,uBAAuB;MACvB,sBAAsB;MACtB,aAAa,oBAAoB,OAAO;MACzC;KACM;KACP,WAAU;KACV;IACO;GACP,EACF"}
1
+ {"version":3,"file":"MonacoCode.mjs","names":[],"sources":["../../../../src/components/IDE/MonacoCode.tsx"],"sourcesContent":["'use client';\n\nimport type { OnChange, OnMount } from '@monaco-editor/react';\nimport { cn } from '@utils/cn';\nimport { type FC, lazy, Suspense, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton';\nimport { Loader } from '../Loader';\n\nconst Editor = lazy(() =>\n import('@monaco-editor/react').then((mod) => ({ default: mod.Editor }))\n);\n\ntype CodeCompProps = {\n children: string;\n language: string;\n isDarkMode?: boolean;\n showLineNumbers?: boolean;\n showCopyButton?: boolean;\n isReadOnly?: boolean;\n onChange?: OnChange;\n};\n\nexport const MonacoCode: FC<CodeCompProps> = ({\n children,\n language,\n isDarkMode,\n showLineNumbers,\n showCopyButton = true,\n isReadOnly = false,\n onChange,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const ideRef = useRef(null);\n const [editorSize, setEditorSize] = useState<{\n height: number;\n width: number;\n }>({ height: 0, width: 0 });\n\n const theme = isDarkMode ? 'vs-dark-transparent' : 'hc-light-theme';\n\n const handleMountIde: OnMount = (editor, monaco) => {\n // first time you set the height based on content Height\n\n ideRef.current = editor as any;\n const contentHeight = (editor.getContentHeight() ?? 0) + 25;\n\n monaco.editor.defineTheme('vs-dark-transparent', {\n base: 'vs-dark',\n inherit: true,\n rules: [],\n colors: {\n 'editor.background': '#00000000',\n },\n });\n monaco.editor.defineTheme('hc-light-theme', {\n base: 'vs',\n inherit: true,\n rules: [],\n colors: {\n 'editor.background': '#00000000',\n },\n });\n\n monaco.editor.setTheme(theme);\n\n // Disable TypeScript diagnostics\n monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true, // Disables type checking\n noSyntaxValidation: true, // Disables syntax errors\n });\n\n // Disable JavaScript diagnostics\n monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true,\n noSyntaxValidation: true,\n });\n\n // Disable unnecessary language features (e.g., suggestions, quick fixes)\n monaco.languages.typescript.typescriptDefaults.setCompilerOptions({\n noLib: true,\n allowNonTsExtensions: true,\n });\n\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({\n noLib: true,\n allowNonTsExtensions: true,\n });\n\n setEditorSize({\n height: contentHeight,\n width: containerRef.current?.clientWidth ?? 0,\n });\n };\n\n const isShowLineNumbers =\n showLineNumbers ??\n (typeof children === 'string' ? children.split('\\n').length > 1 : false);\n\n return (\n <div\n className={cn(\n 'relative h-full w-full text-sm',\n showLineNumbers && 'ml-0'\n )}\n >\n {showCopyButton && (\n <div className=\"sticky top-5 z-10\">\n <div\n className={cn('absolute right-2 bottom-0 flex h-7 items-center')}\n >\n <CopyButton content={children} />\n </div>\n </div>\n )}\n <div\n className=\"z-0 grid size-full grid-cols-[0px] overflow-auto\"\n ref={containerRef}\n >\n <Suspense fallback={<Loader />}>\n <Editor\n {...editorSize}\n defaultLanguage=\"typescript\"\n language={language}\n loading={<Loader />}\n defaultValue={String(children).replace(/\\n$/, '')}\n onMount={handleMountIde}\n onChange={onChange}\n options={{\n contextmenu: false,\n readOnly: isReadOnly,\n cursorStyle: 'line',\n minimap: { enabled: false },\n scrollbar: {\n vertical: 'hidden',\n verticalScrollbarSize: 0,\n alwaysConsumeMouseWheel: false,\n },\n folding: false, // Disable code folding\n renderValidationDecorations: 'off', // Disable error/warning decorations\n quickSuggestions: false, // Disable IntelliSense\n parameterHints: { enabled: false }, // Disable parameter hints\n suggestOnTriggerCharacters: false, // Disable suggestions on typing\n\n mouseWheelScrollSensitivity: 0,\n fastScrollSensitivity: 0,\n scrollBeyondLastLine: false,\n lineNumbers: isShowLineNumbers ? 'on' : 'off',\n }}\n theme={theme}\n className=\"my-2 rounded-md\"\n />\n </Suspense>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,SAAS,WACb,OAAO,wBAAwB,MAAM,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,CACxE;AAYD,MAAa,cAAiC,EAC5C,UACA,UACA,YACA,iBACA,iBAAiB,MACjB,aAAa,OACb,eACI;CACJ,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,SAAS,OAAO,KAAK;CAC3B,MAAM,CAAC,YAAY,iBAAiB,SAGjC;EAAE,QAAQ;EAAG,OAAO;EAAG,CAAC;CAE3B,MAAM,QAAQ,aAAa,wBAAwB;CAEnD,MAAM,kBAA2B,QAAQ,WAAW;EAGlD,OAAO,UAAU;EACjB,MAAM,iBAAiB,OAAO,kBAAkB,IAAI,KAAK;EAEzD,OAAO,OAAO,YAAY,uBAAuB;GAC/C,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ,EACN,qBAAqB,aACtB;GACF,CAAC;EACF,OAAO,OAAO,YAAY,kBAAkB;GAC1C,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ,EACN,qBAAqB,aACtB;GACF,CAAC;EAEF,OAAO,OAAO,SAAS,MAAM;EAG7B,OAAO,UAAU,WAAW,mBAAmB,sBAAsB;GACnE,sBAAsB;GACtB,oBAAoB;GACrB,CAAC;EAGF,OAAO,UAAU,WAAW,mBAAmB,sBAAsB;GACnE,sBAAsB;GACtB,oBAAoB;GACrB,CAAC;EAGF,OAAO,UAAU,WAAW,mBAAmB,mBAAmB;GAChE,OAAO;GACP,sBAAsB;GACvB,CAAC;EAEF,OAAO,UAAU,WAAW,mBAAmB,mBAAmB;GAChE,OAAO;GACP,sBAAsB;GACvB,CAAC;EAEF,cAAc;GACZ,QAAQ;GACR,OAAO,aAAa,SAAS,eAAe;GAC7C,CAAC;;CAGJ,MAAM,oBACJ,oBACC,OAAO,aAAa,WAAW,SAAS,MAAM,KAAK,CAAC,SAAS,IAAI;CAEpE,OACE,qBAAC,OAAD;EACE,WAAW,GACT,kCACA,mBAAmB,OACpB;YAJH,CAMG,kBACC,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,OAAD;IACE,WAAW,GAAG,kDAAkD;cAEhE,oBAAC,YAAD,EAAY,SAAS,UAAY;IAC7B;GACF,GAER,oBAAC,OAAD;GACE,WAAU;GACV,KAAK;aAEL,oBAAC,UAAD;IAAU,UAAU,oBAAC,QAAD,EAAU;cAC5B,oBAAC,QAAD;KACE,GAAI;KACJ,iBAAgB;KACN;KACV,SAAS,oBAAC,QAAD,EAAU;KACnB,cAAc,OAAO,SAAS,CAAC,QAAQ,OAAO,GAAG;KACjD,SAAS;KACC;KACV,SAAS;MACP,aAAa;MACb,UAAU;MACV,aAAa;MACb,SAAS,EAAE,SAAS,OAAO;MAC3B,WAAW;OACT,UAAU;OACV,uBAAuB;OACvB,yBAAyB;OAC1B;MACD,SAAS;MACT,6BAA6B;MAC7B,kBAAkB;MAClB,gBAAgB,EAAE,SAAS,OAAO;MAClC,4BAA4B;MAE5B,6BAA6B;MAC7B,uBAAuB;MACvB,sBAAsB;MACtB,aAAa,oBAAoB,OAAO;MACzC;KACM;KACP,WAAU;KACV;IACO;GACP,EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PackageManagerSelector.mjs","names":[],"sources":["../../../../src/components/IDE/PackageManagerSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport { useCodeContext } from './CodeContext';\n\nexport const PackageManagerSelector: FC = () => {\n const { packageManager, setPackageManager } = useCodeContext();\n const content = useIntlayer('code-selectors');\n useIntlayer('code-selectors');\n\n return (\n <Select value={packageManager} onValueChange={setPackageManager}>\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.packageManager.label.value}\n >\n <Select.Value placeholder={content.packageManager.placeholder.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"npm\">npm</Select.Item>\n <Select.Item value=\"pnpm\">pnpm</Select.Item>\n <Select.Item value=\"yarn\">yarn</Select.Item>\n <Select.Item value=\"bun\">bun</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,+BAAmC;CAC9C,MAAM,EAAE,gBAAgB,sBAAsB,gBAAgB;CAC9D,MAAM,UAAU,YAAY,iBAAiB;AAC7C,aAAY,iBAAiB;AAE7B,QACE,qBAAC,QAAD;EAAQ,OAAO;EAAgB,eAAe;YAA9C,CACE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,eAAe,MAAM;aAEzC,oBAAC,OAAO,OAAR,EAAc,aAAa,QAAQ,eAAe,YAAY,OAAS;GACxD,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC1C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC5C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC5C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC3B,IACV"}
1
+ {"version":3,"file":"PackageManagerSelector.mjs","names":[],"sources":["../../../../src/components/IDE/PackageManagerSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\nimport { useCodeContext } from './CodeContext';\n\nexport const PackageManagerSelector: FC = () => {\n const { packageManager, setPackageManager } = useCodeContext();\n const content = useIntlayer('code-selectors');\n useIntlayer('code-selectors');\n\n return (\n <Select value={packageManager} onValueChange={setPackageManager}>\n <Select.Trigger\n className=\"py-1!\"\n aria-label={content.packageManager.label.value}\n >\n <Select.Value placeholder={content.packageManager.placeholder.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"npm\">npm</Select.Item>\n <Select.Item value=\"pnpm\">pnpm</Select.Item>\n <Select.Item value=\"yarn\">yarn</Select.Item>\n <Select.Item value=\"bun\">bun</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,+BAAmC;CAC9C,MAAM,EAAE,gBAAgB,sBAAsB,gBAAgB;CAC9D,MAAM,UAAU,YAAY,iBAAiB;CAC7C,YAAY,iBAAiB;CAE7B,OACE,qBAAC,QAAD;EAAQ,OAAO;EAAgB,eAAe;YAA9C,CACE,oBAAC,OAAO,SAAR;GACE,WAAU;GACV,cAAY,QAAQ,eAAe,MAAM;aAEzC,oBAAC,OAAO,OAAR,EAAc,aAAa,QAAQ,eAAe,YAAY,OAAS;GACxD,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC1C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC5C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAO;IAAkB;GAC5C,oBAAC,OAAO,MAAR;IAAa,OAAM;cAAM;IAAiB;GAC3B,IACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"codeTransformer.mjs","names":[],"sources":["../../../../src/components/IDE/codeTransformer.ts"],"sourcesContent":["/**\n * Runtime transformer: converts TypeScript source code to ESM or CommonJS format.\n *\n * Design constraints:\n * - Regex/string based (no AST) — runs in the browser\n * - Handles patterns that actually appear in the Intlayer docs\n * - Intentionally limited: exotic TypeScript features may not transform perfectly\n */\n\nexport type TargetCodeFormat = 'esm' | 'commonjs' | 'typescript';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nconst trim = (text: string) => text.trim();\n\n/**\n * Given a string like `{ A, type B, C as D }`, return the non-type named\n * members preserving aliases: `[{ name:'A', alias:undefined }, { name:'C', alias:'D' }]`.\n */\nconst parseNamedImports = (\n inner: string\n): Array<{ name: string; alias?: string; isType: boolean }> =>\n inner\n .split(',')\n .map(trim)\n .filter(Boolean)\n .map((member) => {\n const isType = /^type\\s+/.test(member);\n const clean = member.replace(/^type\\s+/, '').trim();\n const asParts = clean.split(/\\s+as\\s+/);\n return {\n name: trim(asParts[0]),\n alias: asParts[1] ? trim(asParts[1]) : undefined,\n isType,\n };\n });\n\n/** Render a named imports list back to `{ A, B as C }` style. */\nconst renderNamedImports = (\n members: Array<{ name: string; alias?: string }>\n) => {\n return `{ ${members.map((member) => (member.alias ? `${member.name} as ${member.alias}` : member.name)).join(', ')} }`;\n};\n\n// ── Import parser ────────────────────────────────────────────────────────────\n\ninterface ParsedImport {\n raw: string; // original source lines (may be multi-line)\n source: string;\n defaultImport?: string;\n named: Array<{ name: string; alias?: string; isType: boolean }>;\n isSideEffect: boolean; // `import 'mod'`\n isTypeOnly: boolean; // `import type { ... }`\n}\n\n/**\n * Parse all import statements from `code`.\n * Returns them in order together with their start/end char positions.\n */\nconst parseImports = (\n code: string\n): Array<ParsedImport & { start: number; end: number }> => {\n const result: Array<ParsedImport & { start: number; end: number }> = [];\n // Match the full import statement (possibly multi-line), stopping at the semicolon.\n // Do NOT consume trailing whitespace/newlines — those belong to the surrounding code.\n const importStatementRegex =\n /^import\\s+(type\\s+)?(?:([^\\s{,;\"'`]+)\\s*,?\\s*)?(?:\\{([^}]*)\\}\\s*,?\\s*)?(?:from\\s+[\"']([^\"']+)[\"'])?(?:\\s*[\"']([^\"']+)[\"'])?;?/gm;\n\n let importMatch: RegExpExecArray | null = importStatementRegex.exec(code);\n while (importMatch !== null) {\n const isTypeOnly = !!importMatch[1];\n const defaultPart = importMatch[2] ? trim(importMatch[2]) : undefined;\n const namedPart = importMatch[3] ?? '';\n const fromModule = importMatch[4] ?? importMatch[5] ?? '';\n\n const isSideEffect =\n !defaultPart && !namedPart && !isTypeOnly && !!fromModule;\n\n const named = namedPart ? parseNamedImports(namedPart) : [];\n\n result.push({\n raw: importMatch[0],\n start: importMatch.index,\n end: importMatch.index + importMatch[0].length,\n source: fromModule,\n defaultImport: defaultPart,\n named,\n isSideEffect,\n isTypeOnly,\n });\n importMatch = importStatementRegex.exec(code);\n }\n return result;\n};\n\n// ── Type map ─────────────────────────────────────────────────────────────────\n\n/** Build map: typeName → module path, from parsed imports. */\nconst buildTypeMap = (imports: ParsedImport[]): Map<string, string> => {\n const map = new Map<string, string>();\n for (const parsedImport of imports) {\n if (parsedImport.isTypeOnly) {\n for (const namedMember of parsedImport.named) {\n if (!map.has(namedMember.name))\n map.set(namedMember.name, parsedImport.source);\n }\n } else {\n for (const namedMember of parsedImport.named) {\n if (namedMember.isType && !map.has(namedMember.name))\n map.set(namedMember.name, parsedImport.source);\n }\n }\n }\n return map;\n};\n\n// ── Import renderers ─────────────────────────────────────────────────────────\n\nconst renderImportESM = (parsedImport: ParsedImport): string | null => {\n if (parsedImport.isTypeOnly) return null; // remove entirely\n const valueNamed = parsedImport.named.filter(\n (namedMember) => !namedMember.isType\n );\n if (\n !valueNamed.length &&\n !parsedImport.defaultImport &&\n !parsedImport.isSideEffect\n )\n return null;\n if (parsedImport.isSideEffect) return `import '${parsedImport.source}';`;\n\n if (parsedImport.defaultImport && valueNamed.length) {\n return `import ${parsedImport.defaultImport}, ${renderNamedImports(valueNamed)} from '${parsedImport.source}';`;\n }\n if (parsedImport.defaultImport)\n return `import ${parsedImport.defaultImport} from '${parsedImport.source}';`;\n return `import ${renderNamedImports(valueNamed)} from '${parsedImport.source}';`;\n};\n\nconst renderImportCJS = (parsedImport: ParsedImport): string | null => {\n if (parsedImport.isTypeOnly) return null;\n const valueNamed = parsedImport.named.filter(\n (namedMember) => !namedMember.isType\n );\n const hasDefault = !!parsedImport.defaultImport;\n const hasNamed = valueNamed.length > 0;\n\n if (parsedImport.isSideEffect) return `require('${parsedImport.source}');`;\n\n if (hasDefault && hasNamed) {\n // e.g. import express, { Router } from 'express'\n // → const { default: express, Router } = require('express') OR two lines\n const allMembers = [\n { name: 'default', alias: parsedImport.defaultImport },\n ...valueNamed,\n ];\n return `const ${renderNamedImports(allMembers)} = require('${parsedImport.source}');`;\n }\n if (hasDefault && !hasNamed) {\n return `const ${parsedImport.defaultImport} = require('${parsedImport.source}');`;\n }\n if (!hasDefault && hasNamed) {\n return `const ${renderNamedImports(valueNamed)} = require('${parsedImport.source}');`;\n }\n return null;\n};\n\n// ── Type annotation stripping ────────────────────────────────────────────────\n\n/**\n * Strip TypeScript type annotations from a code string (line by line with\n * some multi-line awareness). Returns the stripped code and a list of JSDoc\n * comments to insert before specific lines (indexed by original line number).\n */\nconst stripTypeAnnotations = (\n code: string,\n typeMap: Map<string, string>\n): { code: string; jsdocInserts: Map<number, string> } => {\n const lines = code.split('\\n');\n const jsdocInserts = new Map<number, string>();\n const out: string[] = [];\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n let line = lines[lineIndex];\n\n // 1. `const/let/var name: SimpleType =` — simple variable type annotation\n // Add JSDoc if the type resolves to a known import module.\n const varTypeMatch = line.match(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*([A-Z]\\w*)\\s*=/\n );\n if (varTypeMatch) {\n const typeName = varTypeMatch[2];\n const modulePath = typeMap.get(typeName);\n if (modulePath) {\n jsdocInserts.set(\n out.length,\n `/** @type {import('${modulePath}').${typeName}} */`\n );\n }\n line = line.replace(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*[A-Z][\\w<>, ]*?\\s*=/,\n '$1 ='\n );\n }\n\n // 2. `const/let/var name: FC<Props> =` — generic type annotation (no JSDoc)\n line = line.replace(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*\\w+<[^>]*>\\s*=/,\n '$1 ='\n );\n\n // 3. Destructured parameter with type: `}: TypeName):` → `}):`\n // Also handles return type: `): ReturnType =>` → `) =>`\n line = line.replace(/\\}\\s*:\\s*\\w[\\w<>, .]*\\s*\\)/, '})');\n\n // 4. Return type after `)`: `): Promise<X> =>` or `): Type {`\n line = line.replace(/\\)\\s*:\\s*\\w[\\w<>, .]*\\s*(=>|\\{)/, ') $1');\n\n // 5. `satisfies TypeName` at end of expression\n line = line.replace(/\\s+satisfies\\s+\\w[\\w<>, .]*\\s*;/, ';');\n\n // 6. `as TypeName` type casts (excluding `as const`)\n line = line.replace(/\\s+as\\s+(?!const\\b)\\w[\\w<>, .]*/, '');\n\n // 7. Generic type parameter in arrow function: `<T>(` at start of arrow fn\n // e.g. `const t = <T>(content: IConfigLocales<T>) =>`\n line = line.replace(/(<\\w+>)\\(/, '(');\n\n // 8. Generic calls: `fn<Type>(` → `fn(`\n // Only strip when angle brackets look like type params, not JSX\n line = line.replace(/(\\w+)<[A-Z]\\w*(?:,\\s*[A-Z]\\w*)*>\\(/g, '$1(');\n\n // 9. Remove typed function parameters: `(param: Type)`, `param: Type,`\n // Simple single-param-with-type: `: TypeName)` → `)`\n // Avoid breaking object spread or return annotation already handled\n line = line.replace(/(\\w)\\s*:\\s*[A-Z]\\w*(\\))/g, '$1$2');\n\n out.push(line);\n }\n\n // Insert JSDoc lines (reverse order so indices stay valid)\n const insertPositions = [...jsdocInserts.entries()].sort(\n (first, second) => second[0] - first[0]\n );\n for (const [pos, jsdoc] of insertPositions) {\n // Preserve indent of the following line\n const indent = (out[pos] ?? '').match(/^(\\s*)/)?.[1] ?? '';\n out.splice(pos, 0, indent + jsdoc);\n }\n\n return { code: out.join('\\n'), jsdocInserts };\n};\n\n// ── Export processing (CJS) ──────────────────────────────────────────────────\n\ninterface CollectedExport {\n localName: string;\n exportedName: string;\n}\n\nconst processExportsCJS = (code: string): string => {\n const lines = code.split('\\n');\n const collected: CollectedExport[] = [];\n let defaultExport: string | null = null;\n const requireLines: string[] = []; // for re-exports\n const out: string[] = [];\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n\n // `export default X;` or `export default X`\n const defMatch = line.match(/^(\\s*)export\\s+default\\s+(.+?);?\\s*$/);\n if (defMatch) {\n defaultExport = trim(defMatch[2]);\n continue; // skip line, emit module.exports later\n }\n\n // `export const/let/var name = ...`\n const exportConstMatch = line.match(\n /^(\\s*)export\\s+(const|let|var)\\s+(\\w+)/\n );\n if (exportConstMatch) {\n const name = exportConstMatch[3];\n collected.push({ localName: name, exportedName: name });\n out.push(line.replace(/^(\\s*)export\\s+/, '$1'));\n continue;\n }\n\n // `export function name(...)` or `export async function name(...)`\n const exportFnMatch = line.match(\n /^(\\s*)export\\s+(?:async\\s+)?function\\s+(\\w+)/\n );\n if (exportFnMatch) {\n const name = exportFnMatch[2];\n collected.push({ localName: name, exportedName: name });\n out.push(line.replace(/^(\\s*)export\\s+/, '$1'));\n continue;\n }\n\n // `export { A, B as C } from 'mod'` — re-export\n const reexportFromMatch = line.match(\n /^(\\s*)export\\s+\\{([^}]+)\\}\\s+from\\s+[\"']([^\"']+)[\"'];?\\s*$/\n );\n if (reexportFromMatch) {\n const members = parseNamedImports(reexportFromMatch[2]);\n const modulePath = reexportFromMatch[3];\n // Only value members (no types)\n const valueMembers = members.filter((namedMember) => !namedMember.isType);\n if (valueMembers.length) {\n // require the original names\n const origNames = valueMembers.map((namedMember) => namedMember.name);\n requireLines.push(\n `const ${renderNamedImports(origNames.map((name) => ({ name })))} = require('${modulePath}');`\n );\n for (const namedMember of valueMembers) {\n collected.push({\n localName: namedMember.name,\n exportedName: namedMember.alias ?? namedMember.name,\n });\n }\n }\n continue;\n }\n\n // `export { A, B as C }` — named re-export (same module)\n const namedExportMatch = line.match(/^(\\s*)export\\s+\\{([^}]+)\\};?\\s*$/);\n if (namedExportMatch) {\n const members = parseNamedImports(namedExportMatch[2]).filter(\n (namedMember) => !namedMember.isType\n );\n for (const namedMember of members) {\n collected.push({\n localName: namedMember.name,\n exportedName: namedMember.alias ?? namedMember.name,\n });\n }\n continue;\n }\n\n out.push(line);\n }\n\n // Prepend any require lines for re-exports\n const finalLines = requireLines.length ? [...requireLines, '', ...out] : out;\n\n // Append module.exports\n if (defaultExport !== null && collected.length === 0) {\n finalLines.push(`module.exports = ${defaultExport};`);\n } else if (defaultExport !== null && collected.length > 0) {\n const parts = collected.map((exportEntry) =>\n exportEntry.localName === exportEntry.exportedName\n ? exportEntry.localName\n : `${exportEntry.exportedName}: ${exportEntry.localName}`\n );\n finalLines.push(\n `module.exports = { default: ${defaultExport}, ${parts.join(', ')} };`\n );\n } else if (collected.length > 0) {\n const parts = collected.map((exportEntry) =>\n exportEntry.localName === exportEntry.exportedName\n ? exportEntry.localName\n : `${exportEntry.exportedName}: ${exportEntry.localName}`\n );\n finalLines.push(`module.exports = { ${parts.join(', ')} };`);\n }\n\n return finalLines.join('\\n');\n};\n\n// ── Main transform entry point ────────────────────────────────────────────────\n\nexport const transformCode = (\n code: string,\n target: TargetCodeFormat\n): string => {\n // 1. Parse all imports\n const imports = parseImports(code);\n const typeMap = buildTypeMap(imports);\n\n // 2. Replace import statements in the code\n let result = code;\n // Process in reverse order so string offsets stay valid\n const sorted = [...imports].sort(\n (firstImport, secondImport) => secondImport.start - firstImport.start\n );\n for (const parsedImport of sorted) {\n const rendered =\n target === 'esm'\n ? renderImportESM(parsedImport)\n : renderImportCJS(parsedImport);\n // rendered === null means remove the import\n const replacement = rendered ?? '';\n result =\n result.slice(0, parsedImport.start) +\n replacement +\n result.slice(parsedImport.end);\n }\n\n // 3. Collapse consecutive blank lines that may result from removed imports\n result = result.replace(/\\n{3,}/g, '\\n\\n');\n\n // 4. Strip TypeScript type annotations\n const stripped = stripTypeAnnotations(result, typeMap);\n result = stripped.code;\n\n // 5. Process exports (CJS only)\n if (target === 'commonjs') {\n result = processExportsCJS(result);\n }\n\n // 6. Final cleanup: collapse any triple+ blank lines introduced by export processing,\n // then trim leading/trailing blank lines.\n result = result.replace(/\\n{3,}/g, '\\n\\n');\n result = result.replace(/^\\n+/, '').replace(/\\n+$/, '');\n\n return result;\n};\n\n/**\n * Derive the file name for a transformed format.\n * `next.config.ts` → `next.config.mjs` (ESM) / `next.config.cjs` (CJS)\n * `layout.tsx` → `layout.jsx` (ESM or CJS — JSX always stays .jsx)\n */\nexport const deriveFileName = (\n fileName: string,\n target: TargetCodeFormat\n): string => {\n if (target === 'esm') {\n // TSX → .jsx (standard ESM JSX), TS → .mjs (standard ESM module)\n return fileName.replace(/\\.tsx$/, '.jsx').replace(/\\.ts$/, '.mjs');\n }\n // CJS: TSX → .jsx (JSX stays .jsx), TS → .cjs\n return fileName.replace(/\\.tsx$/, '.jsx').replace(/\\.ts$/, '.cjs');\n};\n\n/**\n * Derive the syntax-highlighting language for a transformed format.\n * `typescript` → `javascript`; `tsx` → `jsx`\n */\nexport const deriveLanguage = (\n language: string,\n target: TargetCodeFormat\n): string => {\n if (target === 'typescript') return language;\n return language === 'tsx'\n ? 'jsx'\n : language === 'typescript'\n ? 'javascript'\n : language;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"codeTransformer.mjs","names":[],"sources":["../../../../src/components/IDE/codeTransformer.ts"],"sourcesContent":["/**\n * Runtime transformer: converts TypeScript source code to ESM or CommonJS format.\n *\n * Design constraints:\n * - Regex/string based (no AST) — runs in the browser\n * - Handles patterns that actually appear in the Intlayer docs\n * - Intentionally limited: exotic TypeScript features may not transform perfectly\n */\n\nexport type TargetCodeFormat = 'esm' | 'commonjs' | 'typescript';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nconst trim = (text: string) => text.trim();\n\n/**\n * Given a string like `{ A, type B, C as D }`, return the non-type named\n * members preserving aliases: `[{ name:'A', alias:undefined }, { name:'C', alias:'D' }]`.\n */\nconst parseNamedImports = (\n inner: string\n): Array<{ name: string; alias?: string; isType: boolean }> =>\n inner\n .split(',')\n .map(trim)\n .filter(Boolean)\n .map((member) => {\n const isType = /^type\\s+/.test(member);\n const clean = member.replace(/^type\\s+/, '').trim();\n const asParts = clean.split(/\\s+as\\s+/);\n return {\n name: trim(asParts[0]),\n alias: asParts[1] ? trim(asParts[1]) : undefined,\n isType,\n };\n });\n\n/** Render a named imports list back to `{ A, B as C }` style. */\nconst renderNamedImports = (\n members: Array<{ name: string; alias?: string }>\n) => {\n return `{ ${members.map((member) => (member.alias ? `${member.name} as ${member.alias}` : member.name)).join(', ')} }`;\n};\n\n// ── Import parser ────────────────────────────────────────────────────────────\n\ninterface ParsedImport {\n raw: string; // original source lines (may be multi-line)\n source: string;\n defaultImport?: string;\n named: Array<{ name: string; alias?: string; isType: boolean }>;\n isSideEffect: boolean; // `import 'mod'`\n isTypeOnly: boolean; // `import type { ... }`\n}\n\n/**\n * Parse all import statements from `code`.\n * Returns them in order together with their start/end char positions.\n */\nconst parseImports = (\n code: string\n): Array<ParsedImport & { start: number; end: number }> => {\n const result: Array<ParsedImport & { start: number; end: number }> = [];\n // Match the full import statement (possibly multi-line), stopping at the semicolon.\n // Do NOT consume trailing whitespace/newlines — those belong to the surrounding code.\n const importStatementRegex =\n /^import\\s+(type\\s+)?(?:([^\\s{,;\"'`]+)\\s*,?\\s*)?(?:\\{([^}]*)\\}\\s*,?\\s*)?(?:from\\s+[\"']([^\"']+)[\"'])?(?:\\s*[\"']([^\"']+)[\"'])?;?/gm;\n\n let importMatch: RegExpExecArray | null = importStatementRegex.exec(code);\n while (importMatch !== null) {\n const isTypeOnly = !!importMatch[1];\n const defaultPart = importMatch[2] ? trim(importMatch[2]) : undefined;\n const namedPart = importMatch[3] ?? '';\n const fromModule = importMatch[4] ?? importMatch[5] ?? '';\n\n const isSideEffect =\n !defaultPart && !namedPart && !isTypeOnly && !!fromModule;\n\n const named = namedPart ? parseNamedImports(namedPart) : [];\n\n result.push({\n raw: importMatch[0],\n start: importMatch.index,\n end: importMatch.index + importMatch[0].length,\n source: fromModule,\n defaultImport: defaultPart,\n named,\n isSideEffect,\n isTypeOnly,\n });\n importMatch = importStatementRegex.exec(code);\n }\n return result;\n};\n\n// ── Type map ─────────────────────────────────────────────────────────────────\n\n/** Build map: typeName → module path, from parsed imports. */\nconst buildTypeMap = (imports: ParsedImport[]): Map<string, string> => {\n const map = new Map<string, string>();\n for (const parsedImport of imports) {\n if (parsedImport.isTypeOnly) {\n for (const namedMember of parsedImport.named) {\n if (!map.has(namedMember.name))\n map.set(namedMember.name, parsedImport.source);\n }\n } else {\n for (const namedMember of parsedImport.named) {\n if (namedMember.isType && !map.has(namedMember.name))\n map.set(namedMember.name, parsedImport.source);\n }\n }\n }\n return map;\n};\n\n// ── Import renderers ─────────────────────────────────────────────────────────\n\nconst renderImportESM = (parsedImport: ParsedImport): string | null => {\n if (parsedImport.isTypeOnly) return null; // remove entirely\n const valueNamed = parsedImport.named.filter(\n (namedMember) => !namedMember.isType\n );\n if (\n !valueNamed.length &&\n !parsedImport.defaultImport &&\n !parsedImport.isSideEffect\n )\n return null;\n if (parsedImport.isSideEffect) return `import '${parsedImport.source}';`;\n\n if (parsedImport.defaultImport && valueNamed.length) {\n return `import ${parsedImport.defaultImport}, ${renderNamedImports(valueNamed)} from '${parsedImport.source}';`;\n }\n if (parsedImport.defaultImport)\n return `import ${parsedImport.defaultImport} from '${parsedImport.source}';`;\n return `import ${renderNamedImports(valueNamed)} from '${parsedImport.source}';`;\n};\n\nconst renderImportCJS = (parsedImport: ParsedImport): string | null => {\n if (parsedImport.isTypeOnly) return null;\n const valueNamed = parsedImport.named.filter(\n (namedMember) => !namedMember.isType\n );\n const hasDefault = !!parsedImport.defaultImport;\n const hasNamed = valueNamed.length > 0;\n\n if (parsedImport.isSideEffect) return `require('${parsedImport.source}');`;\n\n if (hasDefault && hasNamed) {\n // e.g. import express, { Router } from 'express'\n // → const { default: express, Router } = require('express') OR two lines\n const allMembers = [\n { name: 'default', alias: parsedImport.defaultImport },\n ...valueNamed,\n ];\n return `const ${renderNamedImports(allMembers)} = require('${parsedImport.source}');`;\n }\n if (hasDefault && !hasNamed) {\n return `const ${parsedImport.defaultImport} = require('${parsedImport.source}');`;\n }\n if (!hasDefault && hasNamed) {\n return `const ${renderNamedImports(valueNamed)} = require('${parsedImport.source}');`;\n }\n return null;\n};\n\n// ── Type annotation stripping ────────────────────────────────────────────────\n\n/**\n * Strip TypeScript type annotations from a code string (line by line with\n * some multi-line awareness). Returns the stripped code and a list of JSDoc\n * comments to insert before specific lines (indexed by original line number).\n */\nconst stripTypeAnnotations = (\n code: string,\n typeMap: Map<string, string>\n): { code: string; jsdocInserts: Map<number, string> } => {\n const lines = code.split('\\n');\n const jsdocInserts = new Map<number, string>();\n const out: string[] = [];\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n let line = lines[lineIndex];\n\n // 1. `const/let/var name: SimpleType =` — simple variable type annotation\n // Add JSDoc if the type resolves to a known import module.\n const varTypeMatch = line.match(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*([A-Z]\\w*)\\s*=/\n );\n if (varTypeMatch) {\n const typeName = varTypeMatch[2];\n const modulePath = typeMap.get(typeName);\n if (modulePath) {\n jsdocInserts.set(\n out.length,\n `/** @type {import('${modulePath}').${typeName}} */`\n );\n }\n line = line.replace(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*[A-Z][\\w<>, ]*?\\s*=/,\n '$1 ='\n );\n }\n\n // 2. `const/let/var name: FC<Props> =` — generic type annotation (no JSDoc)\n line = line.replace(\n /^(\\s*(?:export\\s+)?(?:const|let|var)\\s+\\w+)\\s*:\\s*\\w+<[^>]*>\\s*=/,\n '$1 ='\n );\n\n // 3. Destructured parameter with type: `}: TypeName):` → `}):`\n // Also handles return type: `): ReturnType =>` → `) =>`\n line = line.replace(/\\}\\s*:\\s*\\w[\\w<>, .]*\\s*\\)/, '})');\n\n // 4. Return type after `)`: `): Promise<X> =>` or `): Type {`\n line = line.replace(/\\)\\s*:\\s*\\w[\\w<>, .]*\\s*(=>|\\{)/, ') $1');\n\n // 5. `satisfies TypeName` at end of expression\n line = line.replace(/\\s+satisfies\\s+\\w[\\w<>, .]*\\s*;/, ';');\n\n // 6. `as TypeName` type casts (excluding `as const`)\n line = line.replace(/\\s+as\\s+(?!const\\b)\\w[\\w<>, .]*/, '');\n\n // 7. Generic type parameter in arrow function: `<T>(` at start of arrow fn\n // e.g. `const t = <T>(content: IConfigLocales<T>) =>`\n line = line.replace(/(<\\w+>)\\(/, '(');\n\n // 8. Generic calls: `fn<Type>(` → `fn(`\n // Only strip when angle brackets look like type params, not JSX\n line = line.replace(/(\\w+)<[A-Z]\\w*(?:,\\s*[A-Z]\\w*)*>\\(/g, '$1(');\n\n // 9. Remove typed function parameters: `(param: Type)`, `param: Type,`\n // Simple single-param-with-type: `: TypeName)` → `)`\n // Avoid breaking object spread or return annotation already handled\n line = line.replace(/(\\w)\\s*:\\s*[A-Z]\\w*(\\))/g, '$1$2');\n\n out.push(line);\n }\n\n // Insert JSDoc lines (reverse order so indices stay valid)\n const insertPositions = [...jsdocInserts.entries()].sort(\n (first, second) => second[0] - first[0]\n );\n for (const [pos, jsdoc] of insertPositions) {\n // Preserve indent of the following line\n const indent = (out[pos] ?? '').match(/^(\\s*)/)?.[1] ?? '';\n out.splice(pos, 0, indent + jsdoc);\n }\n\n return { code: out.join('\\n'), jsdocInserts };\n};\n\n// ── Export processing (CJS) ──────────────────────────────────────────────────\n\ninterface CollectedExport {\n localName: string;\n exportedName: string;\n}\n\nconst processExportsCJS = (code: string): string => {\n const lines = code.split('\\n');\n const collected: CollectedExport[] = [];\n let defaultExport: string | null = null;\n const requireLines: string[] = []; // for re-exports\n const out: string[] = [];\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n\n // `export default X;` or `export default X`\n const defMatch = line.match(/^(\\s*)export\\s+default\\s+(.+?);?\\s*$/);\n if (defMatch) {\n defaultExport = trim(defMatch[2]);\n continue; // skip line, emit module.exports later\n }\n\n // `export const/let/var name = ...`\n const exportConstMatch = line.match(\n /^(\\s*)export\\s+(const|let|var)\\s+(\\w+)/\n );\n if (exportConstMatch) {\n const name = exportConstMatch[3];\n collected.push({ localName: name, exportedName: name });\n out.push(line.replace(/^(\\s*)export\\s+/, '$1'));\n continue;\n }\n\n // `export function name(...)` or `export async function name(...)`\n const exportFnMatch = line.match(\n /^(\\s*)export\\s+(?:async\\s+)?function\\s+(\\w+)/\n );\n if (exportFnMatch) {\n const name = exportFnMatch[2];\n collected.push({ localName: name, exportedName: name });\n out.push(line.replace(/^(\\s*)export\\s+/, '$1'));\n continue;\n }\n\n // `export { A, B as C } from 'mod'` — re-export\n const reexportFromMatch = line.match(\n /^(\\s*)export\\s+\\{([^}]+)\\}\\s+from\\s+[\"']([^\"']+)[\"'];?\\s*$/\n );\n if (reexportFromMatch) {\n const members = parseNamedImports(reexportFromMatch[2]);\n const modulePath = reexportFromMatch[3];\n // Only value members (no types)\n const valueMembers = members.filter((namedMember) => !namedMember.isType);\n if (valueMembers.length) {\n // require the original names\n const origNames = valueMembers.map((namedMember) => namedMember.name);\n requireLines.push(\n `const ${renderNamedImports(origNames.map((name) => ({ name })))} = require('${modulePath}');`\n );\n for (const namedMember of valueMembers) {\n collected.push({\n localName: namedMember.name,\n exportedName: namedMember.alias ?? namedMember.name,\n });\n }\n }\n continue;\n }\n\n // `export { A, B as C }` — named re-export (same module)\n const namedExportMatch = line.match(/^(\\s*)export\\s+\\{([^}]+)\\};?\\s*$/);\n if (namedExportMatch) {\n const members = parseNamedImports(namedExportMatch[2]).filter(\n (namedMember) => !namedMember.isType\n );\n for (const namedMember of members) {\n collected.push({\n localName: namedMember.name,\n exportedName: namedMember.alias ?? namedMember.name,\n });\n }\n continue;\n }\n\n out.push(line);\n }\n\n // Prepend any require lines for re-exports\n const finalLines = requireLines.length ? [...requireLines, '', ...out] : out;\n\n // Append module.exports\n if (defaultExport !== null && collected.length === 0) {\n finalLines.push(`module.exports = ${defaultExport};`);\n } else if (defaultExport !== null && collected.length > 0) {\n const parts = collected.map((exportEntry) =>\n exportEntry.localName === exportEntry.exportedName\n ? exportEntry.localName\n : `${exportEntry.exportedName}: ${exportEntry.localName}`\n );\n finalLines.push(\n `module.exports = { default: ${defaultExport}, ${parts.join(', ')} };`\n );\n } else if (collected.length > 0) {\n const parts = collected.map((exportEntry) =>\n exportEntry.localName === exportEntry.exportedName\n ? exportEntry.localName\n : `${exportEntry.exportedName}: ${exportEntry.localName}`\n );\n finalLines.push(`module.exports = { ${parts.join(', ')} };`);\n }\n\n return finalLines.join('\\n');\n};\n\n// ── Main transform entry point ────────────────────────────────────────────────\n\nexport const transformCode = (\n code: string,\n target: TargetCodeFormat\n): string => {\n // 1. Parse all imports\n const imports = parseImports(code);\n const typeMap = buildTypeMap(imports);\n\n // 2. Replace import statements in the code\n let result = code;\n // Process in reverse order so string offsets stay valid\n const sorted = [...imports].sort(\n (firstImport, secondImport) => secondImport.start - firstImport.start\n );\n for (const parsedImport of sorted) {\n const rendered =\n target === 'esm'\n ? renderImportESM(parsedImport)\n : renderImportCJS(parsedImport);\n // rendered === null means remove the import\n const replacement = rendered ?? '';\n result =\n result.slice(0, parsedImport.start) +\n replacement +\n result.slice(parsedImport.end);\n }\n\n // 3. Collapse consecutive blank lines that may result from removed imports\n result = result.replace(/\\n{3,}/g, '\\n\\n');\n\n // 4. Strip TypeScript type annotations\n const stripped = stripTypeAnnotations(result, typeMap);\n result = stripped.code;\n\n // 5. Process exports (CJS only)\n if (target === 'commonjs') {\n result = processExportsCJS(result);\n }\n\n // 6. Final cleanup: collapse any triple+ blank lines introduced by export processing,\n // then trim leading/trailing blank lines.\n result = result.replace(/\\n{3,}/g, '\\n\\n');\n result = result.replace(/^\\n+/, '').replace(/\\n+$/, '');\n\n return result;\n};\n\n/**\n * Derive the file name for a transformed format.\n * `next.config.ts` → `next.config.mjs` (ESM) / `next.config.cjs` (CJS)\n * `layout.tsx` → `layout.jsx` (ESM or CJS — JSX always stays .jsx)\n */\nexport const deriveFileName = (\n fileName: string,\n target: TargetCodeFormat\n): string => {\n if (target === 'esm') {\n // TSX → .jsx (standard ESM JSX), TS → .mjs (standard ESM module)\n return fileName.replace(/\\.tsx$/, '.jsx').replace(/\\.ts$/, '.mjs');\n }\n // CJS: TSX → .jsx (JSX stays .jsx), TS → .cjs\n return fileName.replace(/\\.tsx$/, '.jsx').replace(/\\.ts$/, '.cjs');\n};\n\n/**\n * Derive the syntax-highlighting language for a transformed format.\n * `typescript` → `javascript`; `tsx` → `jsx`\n */\nexport const deriveLanguage = (\n language: string,\n target: TargetCodeFormat\n): string => {\n if (target === 'typescript') return language;\n return language === 'tsx'\n ? 'jsx'\n : language === 'typescript'\n ? 'javascript'\n : language;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createFileTree.mjs","names":[],"sources":["../../../../src/components/IDE/createFileTree.ts"],"sourcesContent":["export type FilePath = {\n path: string;\n subPath?: FilePath[];\n isFile: boolean;\n};\n\nexport const createFileTree = (paths: string[]): FilePath[] => {\n const root: FilePath = { path: '', subPath: [], isFile: false };\n\n paths.forEach((path) => {\n const parts = path.split('/').filter((part) => part !== ''); // Remove empty strings due to leading slash\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isFile = i === parts.length - 1; // Last part of the path is a file\n\n if (!current.subPath) {\n current.subPath = [];\n }\n\n let next = current.subPath.find((sub) => sub.path === part);\n\n if (!next) {\n next = { path: part, isFile, subPath: isFile ? undefined : [] };\n current.subPath.push(next);\n }\n\n current = next;\n }\n });\n\n return root.subPath ?? [];\n};\n"],"mappings":";AAMA,MAAa,kBAAkB,UAAgC;CAC7D,MAAM,OAAiB;EAAE,MAAM;EAAI,SAAS,EAAE;EAAE,QAAQ;EAAO;AAE/D,OAAM,SAAS,SAAS;EACtB,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAS,SAAS,GAAG;EAC3D,IAAI,UAAU;AAEd,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,OAAO,MAAM;GACnB,MAAM,SAAS,MAAM,MAAM,SAAS;AAEpC,OAAI,CAAC,QAAQ,QACX,SAAQ,UAAU,EAAE;GAGtB,IAAI,OAAO,QAAQ,QAAQ,MAAM,QAAQ,IAAI,SAAS,KAAK;AAE3D,OAAI,CAAC,MAAM;AACT,WAAO;KAAE,MAAM;KAAM;KAAQ,SAAS,SAAS,SAAY,EAAE;KAAE;AAC/D,YAAQ,QAAQ,KAAK,KAAK;;AAG5B,aAAU;;GAEZ;AAEF,QAAO,KAAK,WAAW,EAAE"}
1
+ {"version":3,"file":"createFileTree.mjs","names":[],"sources":["../../../../src/components/IDE/createFileTree.ts"],"sourcesContent":["export type FilePath = {\n path: string;\n subPath?: FilePath[];\n isFile: boolean;\n};\n\nexport const createFileTree = (paths: string[]): FilePath[] => {\n const root: FilePath = { path: '', subPath: [], isFile: false };\n\n paths.forEach((path) => {\n const parts = path.split('/').filter((part) => part !== ''); // Remove empty strings due to leading slash\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isFile = i === parts.length - 1; // Last part of the path is a file\n\n if (!current.subPath) {\n current.subPath = [];\n }\n\n let next = current.subPath.find((sub) => sub.path === part);\n\n if (!next) {\n next = { path: part, isFile, subPath: isFile ? undefined : [] };\n current.subPath.push(next);\n }\n\n current = next;\n }\n });\n\n return root.subPath ?? [];\n};\n"],"mappings":";AAMA,MAAa,kBAAkB,UAAgC;CAC7D,MAAM,OAAiB;EAAE,MAAM;EAAI,SAAS,EAAE;EAAE,QAAQ;EAAO;CAE/D,MAAM,SAAS,SAAS;EACtB,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAS,SAAS,GAAG;EAC3D,IAAI,UAAU;EAEd,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,OAAO,MAAM;GACnB,MAAM,SAAS,MAAM,MAAM,SAAS;GAEpC,IAAI,CAAC,QAAQ,SACX,QAAQ,UAAU,EAAE;GAGtB,IAAI,OAAO,QAAQ,QAAQ,MAAM,QAAQ,IAAI,SAAS,KAAK;GAE3D,IAAI,CAAC,MAAM;IACT,OAAO;KAAE,MAAM;KAAM;KAAQ,SAAS,SAAS,SAAY,EAAE;KAAE;IAC/D,QAAQ,QAAQ,KAAK,KAAK;;GAG5B,UAAU;;GAEZ;CAEF,OAAO,KAAK,WAAW,EAAE"}