@agimon-ai/po-web-components 0.0.0-alpha.2 → 0.0.0-alpha.21

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 (511) hide show
  1. package/LICENSE +191 -1
  2. package/README.md +7 -7
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.mts +3 -2
  5. package/dist/index.mjs +1 -1
  6. package/dist/node_modules/.pnpm/{@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CfX6zgs1.d.mts → @modelcontextprotocol_server@2.3.1/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts} +5 -6
  7. package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.3.1/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts.map +1 -0
  8. package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.3.1/node_modules/@modelcontextprotocol/server/dist/index.d.mts +2 -0
  9. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/compat.d.mts +8 -0
  10. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/compat.d.mts.map +1 -0
  11. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/errors.d.mts +21 -0
  12. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/errors.d.mts.map +1 -0
  13. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/parse.d.mts +15 -0
  14. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/parse.d.mts.map +1 -0
  15. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/schemas.d.mts +169 -0
  16. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/classic/schemas.d.mts.map +1 -0
  17. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/api.d.mts +38 -0
  18. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/api.d.mts.map +1 -0
  19. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/checks.d.mts +63 -0
  20. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/checks.d.mts.map +1 -0
  21. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/core.d.mts +50 -0
  22. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/core.d.mts.map +1 -0
  23. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/errors.d.mts +3 -87
  24. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/errors.d.mts.map +1 -0
  25. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/json-schema.d.mts +1 -26
  26. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/json-schema.d.mts.map +1 -0
  27. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/registries.d.mts +3 -7
  28. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/registries.d.mts.map +1 -0
  29. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/schemas.d.mts +10 -405
  30. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/schemas.d.mts.map +1 -0
  31. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/standard-schema.d.mts +1 -1
  32. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/standard-schema.d.mts.map +1 -0
  33. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/to-json-schema.d.mts +4 -33
  34. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/to-json-schema.d.mts.map +1 -0
  35. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/util.d.mts +38 -0
  36. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/util.d.mts.map +1 -0
  37. package/dist/node_modules/.pnpm/{zod@4.6.5 → zod@4.6.6}/node_modules/zod/v4/core/versions.d.mts +1 -1
  38. package/dist/node_modules/.pnpm/zod@4.6.6/node_modules/zod/v4/core/versions.d.mts.map +1 -0
  39. package/dist/packages/core/po-core/dist/mcpWidget.d.mts +2 -2
  40. package/dist/packages/core/po-core/dist/src/web/types/mcpWidget.d.mts +3 -3
  41. package/dist/packages/core/po-core/dist/web.d.mts +2 -2
  42. package/dist/packages/core/po-web-components/src/components/Accordion.mjs +1 -1
  43. package/dist/packages/core/po-web-components/src/components/Accordion.mjs.map +1 -1
  44. package/dist/packages/core/po-web-components/src/components/AgentAvatar.d.mts +14 -0
  45. package/dist/packages/core/po-web-components/src/components/AgentAvatar.d.mts.map +1 -0
  46. package/dist/packages/core/po-web-components/src/components/AgentAvatar.mjs +2 -0
  47. package/dist/packages/core/po-web-components/src/components/AgentAvatar.mjs.map +1 -0
  48. package/dist/packages/core/po-web-components/src/components/AnsiText.mjs +1 -1
  49. package/dist/packages/core/po-web-components/src/components/AnsiText.mjs.map +1 -1
  50. package/dist/packages/core/po-web-components/src/components/Avatar.mjs +1 -1
  51. package/dist/packages/core/po-web-components/src/components/Avatar.mjs.map +1 -1
  52. package/dist/packages/core/po-web-components/src/components/Badge.mjs +1 -1
  53. package/dist/packages/core/po-web-components/src/components/Badge.mjs.map +1 -1
  54. package/dist/packages/core/po-web-components/src/components/Breadcrumb.mjs +1 -1
  55. package/dist/packages/core/po-web-components/src/components/Breadcrumb.mjs.map +1 -1
  56. package/dist/packages/core/po-web-components/src/components/Button.d.mts.map +1 -1
  57. package/dist/packages/core/po-web-components/src/components/Button.mjs +1 -1
  58. package/dist/packages/core/po-web-components/src/components/Button.mjs.map +1 -1
  59. package/dist/packages/core/po-web-components/src/components/Checkbox.mjs +1 -1
  60. package/dist/packages/core/po-web-components/src/components/Checkbox.mjs.map +1 -1
  61. package/dist/packages/core/po-web-components/src/components/CodeBlock.mjs +1 -1
  62. package/dist/packages/core/po-web-components/src/components/CodeBlock.mjs.map +1 -1
  63. package/dist/packages/core/po-web-components/src/components/CodeEditorView.mjs +1 -1
  64. package/dist/packages/core/po-web-components/src/components/CodeEditorView.mjs.map +1 -1
  65. package/dist/packages/core/po-web-components/src/components/Command.mjs +1 -1
  66. package/dist/packages/core/po-web-components/src/components/Command.mjs.map +1 -1
  67. package/dist/packages/core/po-web-components/src/components/CopyButton.mjs +1 -1
  68. package/dist/packages/core/po-web-components/src/components/CopyButton.mjs.map +1 -1
  69. package/dist/packages/core/po-web-components/src/components/Dialog.d.mts +1 -1
  70. package/dist/packages/core/po-web-components/src/components/Dialog.mjs +1 -1
  71. package/dist/packages/core/po-web-components/src/components/Dialog.mjs.map +1 -1
  72. package/dist/packages/core/po-web-components/src/components/DiffView.mjs +1 -1
  73. package/dist/packages/core/po-web-components/src/components/DiffView.mjs.map +1 -1
  74. package/dist/packages/core/po-web-components/src/components/Dot.mjs +1 -1
  75. package/dist/packages/core/po-web-components/src/components/Dot.mjs.map +1 -1
  76. package/dist/packages/core/po-web-components/src/components/Drawer.mjs +1 -1
  77. package/dist/packages/core/po-web-components/src/components/Drawer.mjs.map +1 -1
  78. package/dist/packages/core/po-web-components/src/components/DropdownMenu.mjs +1 -1
  79. package/dist/packages/core/po-web-components/src/components/DropdownMenu.mjs.map +1 -1
  80. package/dist/packages/core/po-web-components/src/components/EmptyState.mjs +1 -1
  81. package/dist/packages/core/po-web-components/src/components/EmptyState.mjs.map +1 -1
  82. package/dist/packages/core/po-web-components/src/components/HashlineLines.mjs +1 -1
  83. package/dist/packages/core/po-web-components/src/components/HashlineLines.mjs.map +1 -1
  84. package/dist/packages/core/po-web-components/src/components/Input.mjs +1 -1
  85. package/dist/packages/core/po-web-components/src/components/Input.mjs.map +1 -1
  86. package/dist/packages/core/po-web-components/src/components/Kbd.mjs +1 -1
  87. package/dist/packages/core/po-web-components/src/components/Kbd.mjs.map +1 -1
  88. package/dist/packages/core/po-web-components/src/components/Label.mjs +1 -1
  89. package/dist/packages/core/po-web-components/src/components/Label.mjs.map +1 -1
  90. package/dist/packages/core/po-web-components/src/components/Markdown.d.mts +1 -0
  91. package/dist/packages/core/po-web-components/src/components/Markdown.d.mts.map +1 -1
  92. package/dist/packages/core/po-web-components/src/components/Markdown.mjs +2 -2
  93. package/dist/packages/core/po-web-components/src/components/Markdown.mjs.map +1 -1
  94. package/dist/packages/core/po-web-components/src/components/McpApp.d.mts +5 -4
  95. package/dist/packages/core/po-web-components/src/components/McpApp.d.mts.map +1 -1
  96. package/dist/packages/core/po-web-components/src/components/McpApp.mjs.map +1 -1
  97. package/dist/packages/core/po-web-components/src/components/McpToolWidget.d.mts +3 -3
  98. package/dist/packages/core/po-web-components/src/components/McpToolWidget.d.mts.map +1 -1
  99. package/dist/packages/core/po-web-components/src/components/McpToolWidget.mjs +2 -2
  100. package/dist/packages/core/po-web-components/src/components/McpToolWidget.mjs.map +1 -1
  101. package/dist/packages/core/po-web-components/src/components/MediaPreview.mjs +1 -1
  102. package/dist/packages/core/po-web-components/src/components/MediaPreview.mjs.map +1 -1
  103. package/dist/packages/core/po-web-components/src/components/MermaidDiagram.mjs +1 -1
  104. package/dist/packages/core/po-web-components/src/components/MermaidDiagram.mjs.map +1 -1
  105. package/dist/packages/core/po-web-components/src/components/MessageItem.mjs +1 -1
  106. package/dist/packages/core/po-web-components/src/components/MessageItem.mjs.map +1 -1
  107. package/dist/packages/core/po-web-components/src/components/MessageLines.mjs +1 -1
  108. package/dist/packages/core/po-web-components/src/components/MessageLines.mjs.map +1 -1
  109. package/dist/packages/core/po-web-components/src/components/OptionList.mjs +1 -1
  110. package/dist/packages/core/po-web-components/src/components/OptionList.mjs.map +1 -1
  111. package/dist/packages/core/po-web-components/src/components/Panel.mjs +1 -1
  112. package/dist/packages/core/po-web-components/src/components/Panel.mjs.map +1 -1
  113. package/dist/packages/core/po-web-components/src/components/PdfPreview.mjs +1 -1
  114. package/dist/packages/core/po-web-components/src/components/PdfPreview.mjs.map +1 -1
  115. package/dist/packages/core/po-web-components/src/components/Picker.mjs +1 -1
  116. package/dist/packages/core/po-web-components/src/components/Picker.mjs.map +1 -1
  117. package/dist/packages/core/po-web-components/src/components/Popover.mjs +1 -1
  118. package/dist/packages/core/po-web-components/src/components/Popover.mjs.map +1 -1
  119. package/dist/packages/core/po-web-components/src/components/Progress.mjs +1 -1
  120. package/dist/packages/core/po-web-components/src/components/Progress.mjs.map +1 -1
  121. package/dist/packages/core/po-web-components/src/components/RadioGroup.mjs +1 -1
  122. package/dist/packages/core/po-web-components/src/components/RadioGroup.mjs.map +1 -1
  123. package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.mjs +1 -1
  124. package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.mjs.map +1 -1
  125. package/dist/packages/core/po-web-components/src/components/ScrollArea.mjs +1 -1
  126. package/dist/packages/core/po-web-components/src/components/ScrollArea.mjs.map +1 -1
  127. package/dist/packages/core/po-web-components/src/components/SectionLabel.mjs +1 -1
  128. package/dist/packages/core/po-web-components/src/components/SectionLabel.mjs.map +1 -1
  129. package/dist/packages/core/po-web-components/src/components/Select.mjs +1 -1
  130. package/dist/packages/core/po-web-components/src/components/Select.mjs.map +1 -1
  131. package/dist/packages/core/po-web-components/src/components/Separator.mjs +1 -1
  132. package/dist/packages/core/po-web-components/src/components/Separator.mjs.map +1 -1
  133. package/dist/packages/core/po-web-components/src/components/Settings.mjs +1 -1
  134. package/dist/packages/core/po-web-components/src/components/Settings.mjs.map +1 -1
  135. package/dist/packages/core/po-web-components/src/components/Sheet.mjs +1 -1
  136. package/dist/packages/core/po-web-components/src/components/Sheet.mjs.map +1 -1
  137. package/dist/packages/core/po-web-components/src/components/Skeleton.mjs +1 -1
  138. package/dist/packages/core/po-web-components/src/components/Skeleton.mjs.map +1 -1
  139. package/dist/packages/core/po-web-components/src/components/StatusBadge.mjs +1 -1
  140. package/dist/packages/core/po-web-components/src/components/StatusBadge.mjs.map +1 -1
  141. package/dist/packages/core/po-web-components/src/components/StreamCursor.mjs +1 -1
  142. package/dist/packages/core/po-web-components/src/components/StreamCursor.mjs.map +1 -1
  143. package/dist/packages/core/po-web-components/src/components/Switch.mjs +1 -1
  144. package/dist/packages/core/po-web-components/src/components/Switch.mjs.map +1 -1
  145. package/dist/packages/core/po-web-components/src/components/Tabs.mjs +1 -1
  146. package/dist/packages/core/po-web-components/src/components/Tabs.mjs.map +1 -1
  147. package/dist/packages/core/po-web-components/src/components/Toast.mjs +1 -1
  148. package/dist/packages/core/po-web-components/src/components/Toast.mjs.map +1 -1
  149. package/dist/packages/core/po-web-components/src/components/ToolPathLink.mjs +1 -1
  150. package/dist/packages/core/po-web-components/src/components/ToolPathLink.mjs.map +1 -1
  151. package/dist/packages/core/po-web-components/src/components/Tooltip.mjs +1 -1
  152. package/dist/packages/core/po-web-components/src/components/Tooltip.mjs.map +1 -1
  153. package/dist/packages/core/po-web-components/src/icons/icons.d.mts +2 -2
  154. package/dist/packages/core/po-web-components/src/icons/icons.mjs +1 -1
  155. package/dist/packages/core/po-web-components/src/lib/ansiSpans.mjs +1 -1
  156. package/dist/packages/core/po-web-components/src/lib/ansiSpans.mjs.map +1 -1
  157. package/dist/packages/core/po-web-components/src/lib/editorTheme.d.mts +19 -19
  158. package/dist/packages/core/po-web-components/src/lib/editorTheme.d.mts.map +1 -1
  159. package/dist/packages/core/po-web-components/src/lib/editorTheme.mjs +1 -1
  160. package/dist/packages/core/po-web-components/src/lib/editorTheme.mjs.map +1 -1
  161. package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.mjs +1 -1
  162. package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.mjs.map +1 -1
  163. package/dist/packages/core/po-web-components/src/lib/hashlineView.mjs +1 -1
  164. package/dist/packages/core/po-web-components/src/lib/hashlineView.mjs.map +1 -1
  165. package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.d.mts +2 -2
  166. package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.mjs +1 -1
  167. package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.mjs.map +1 -1
  168. package/dist/packages/core/po-web-components/src/theme/builtinThemes.d.mts +1 -1
  169. package/dist/packages/core/po-web-components/src/theme/builtinThemes.d.mts.map +1 -1
  170. package/dist/packages/core/po-web-components/src/theme/builtinThemes.mjs +1 -1
  171. package/dist/packages/core/po-web-components/src/theme/builtinThemes.mjs.map +1 -1
  172. package/dist/packages/core/po-web-components/src/theme/derive.mjs +1 -1
  173. package/dist/packages/core/po-web-components/src/theme/derive.mjs.map +1 -1
  174. package/dist/packages/core/po-web-components/src/theme/nativeTheme.d.mts +2 -2
  175. package/dist/packages/core/po-web-components/src/theme/nativeTheme.mjs +1 -1
  176. package/dist/packages/core/po-web-components/src/theme/nativeTheme.mjs.map +1 -1
  177. package/dist/packages/core/po-web-components/src/types/theme.d.mts +1 -1
  178. package/dist/packages/core/po-web-components/src/types/theme.d.mts.map +1 -1
  179. package/dist/packages/core/po-web-components/src/types/theme.mjs +1 -1
  180. package/dist/packages/core/po-web-components/src/types/theme.mjs.map +1 -1
  181. package/dist/packages/core/po-web-components/themes/po-nord-dark.mjs +2 -0
  182. package/dist/packages/core/po-web-components/themes/po-nord-dark.mjs.map +1 -0
  183. package/dist/packages/core/po-web-components/themes/po-one-light.mjs +2 -0
  184. package/dist/packages/core/po-web-components/themes/po-one-light.mjs.map +1 -0
  185. package/dist/src/components/Accordion.cjs +1 -1
  186. package/dist/src/components/Accordion.cjs.map +1 -1
  187. package/dist/src/components/AgentAvatar.cjs +2 -0
  188. package/dist/src/components/AgentAvatar.cjs.map +1 -0
  189. package/dist/src/components/AnsiText.cjs +1 -1
  190. package/dist/src/components/AnsiText.cjs.map +1 -1
  191. package/dist/src/components/Avatar.cjs +1 -1
  192. package/dist/src/components/Avatar.cjs.map +1 -1
  193. package/dist/src/components/Badge.cjs +1 -1
  194. package/dist/src/components/Badge.cjs.map +1 -1
  195. package/dist/src/components/Breadcrumb.cjs +1 -1
  196. package/dist/src/components/Breadcrumb.cjs.map +1 -1
  197. package/dist/src/components/Button.cjs +1 -1
  198. package/dist/src/components/Button.cjs.map +1 -1
  199. package/dist/src/components/Checkbox.cjs +1 -1
  200. package/dist/src/components/Checkbox.cjs.map +1 -1
  201. package/dist/src/components/CodeBlock.cjs +1 -1
  202. package/dist/src/components/CodeBlock.cjs.map +1 -1
  203. package/dist/src/components/CodeEditorView.cjs +1 -1
  204. package/dist/src/components/CodeEditorView.cjs.map +1 -1
  205. package/dist/src/components/Command.cjs +1 -1
  206. package/dist/src/components/Command.cjs.map +1 -1
  207. package/dist/src/components/CopyButton.cjs +1 -1
  208. package/dist/src/components/CopyButton.cjs.map +1 -1
  209. package/dist/src/components/Dialog.cjs +1 -1
  210. package/dist/src/components/Dialog.cjs.map +1 -1
  211. package/dist/src/components/DiffView.cjs +1 -1
  212. package/dist/src/components/DiffView.cjs.map +1 -1
  213. package/dist/src/components/Dot.cjs +1 -1
  214. package/dist/src/components/Dot.cjs.map +1 -1
  215. package/dist/src/components/Drawer.cjs +1 -1
  216. package/dist/src/components/Drawer.cjs.map +1 -1
  217. package/dist/src/components/DropdownMenu.cjs +1 -1
  218. package/dist/src/components/DropdownMenu.cjs.map +1 -1
  219. package/dist/src/components/EmptyState.cjs +1 -1
  220. package/dist/src/components/EmptyState.cjs.map +1 -1
  221. package/dist/src/components/HashlineLines.cjs +1 -1
  222. package/dist/src/components/HashlineLines.cjs.map +1 -1
  223. package/dist/src/components/Input.cjs +1 -1
  224. package/dist/src/components/Input.cjs.map +1 -1
  225. package/dist/src/components/Kbd.cjs +1 -1
  226. package/dist/src/components/Kbd.cjs.map +1 -1
  227. package/dist/src/components/Label.cjs +1 -1
  228. package/dist/src/components/Label.cjs.map +1 -1
  229. package/dist/src/components/Markdown.cjs +2 -2
  230. package/dist/src/components/Markdown.cjs.map +1 -1
  231. package/dist/src/components/McpApp.cjs.map +1 -1
  232. package/dist/src/components/McpToolWidget.cjs +2 -2
  233. package/dist/src/components/McpToolWidget.cjs.map +1 -1
  234. package/dist/src/components/MediaPreview.cjs +1 -1
  235. package/dist/src/components/MediaPreview.cjs.map +1 -1
  236. package/dist/src/components/MermaidDiagram.cjs +1 -1
  237. package/dist/src/components/MermaidDiagram.cjs.map +1 -1
  238. package/dist/src/components/MessageItem.cjs +1 -1
  239. package/dist/src/components/MessageItem.cjs.map +1 -1
  240. package/dist/src/components/MessageLines.cjs +1 -1
  241. package/dist/src/components/MessageLines.cjs.map +1 -1
  242. package/dist/src/components/OptionList.cjs +1 -1
  243. package/dist/src/components/OptionList.cjs.map +1 -1
  244. package/dist/src/components/Panel.cjs +1 -1
  245. package/dist/src/components/Panel.cjs.map +1 -1
  246. package/dist/src/components/PdfPreview.cjs +1 -1
  247. package/dist/src/components/PdfPreview.cjs.map +1 -1
  248. package/dist/src/components/Picker.cjs +1 -1
  249. package/dist/src/components/Picker.cjs.map +1 -1
  250. package/dist/src/components/Popover.cjs +1 -1
  251. package/dist/src/components/Popover.cjs.map +1 -1
  252. package/dist/src/components/Progress.cjs +1 -1
  253. package/dist/src/components/Progress.cjs.map +1 -1
  254. package/dist/src/components/RadioGroup.cjs +1 -1
  255. package/dist/src/components/RadioGroup.cjs.map +1 -1
  256. package/dist/src/components/ReviewCommentDraft.cjs +1 -1
  257. package/dist/src/components/ReviewCommentDraft.cjs.map +1 -1
  258. package/dist/src/components/ScrollArea.cjs +1 -1
  259. package/dist/src/components/ScrollArea.cjs.map +1 -1
  260. package/dist/src/components/SectionLabel.cjs +1 -1
  261. package/dist/src/components/SectionLabel.cjs.map +1 -1
  262. package/dist/src/components/Select.cjs +1 -1
  263. package/dist/src/components/Select.cjs.map +1 -1
  264. package/dist/src/components/Separator.cjs +1 -1
  265. package/dist/src/components/Separator.cjs.map +1 -1
  266. package/dist/src/components/Settings.cjs +1 -1
  267. package/dist/src/components/Settings.cjs.map +1 -1
  268. package/dist/src/components/Sheet.cjs +1 -1
  269. package/dist/src/components/Sheet.cjs.map +1 -1
  270. package/dist/src/components/Skeleton.cjs +1 -1
  271. package/dist/src/components/Skeleton.cjs.map +1 -1
  272. package/dist/src/components/StatusBadge.cjs +1 -1
  273. package/dist/src/components/StatusBadge.cjs.map +1 -1
  274. package/dist/src/components/StreamCursor.cjs +1 -1
  275. package/dist/src/components/StreamCursor.cjs.map +1 -1
  276. package/dist/src/components/Switch.cjs +1 -1
  277. package/dist/src/components/Switch.cjs.map +1 -1
  278. package/dist/src/components/Tabs.cjs +1 -1
  279. package/dist/src/components/Tabs.cjs.map +1 -1
  280. package/dist/src/components/Toast.cjs +1 -1
  281. package/dist/src/components/Toast.cjs.map +1 -1
  282. package/dist/src/components/ToolPathLink.cjs +1 -1
  283. package/dist/src/components/ToolPathLink.cjs.map +1 -1
  284. package/dist/src/components/Tooltip.cjs +1 -1
  285. package/dist/src/components/Tooltip.cjs.map +1 -1
  286. package/dist/src/icons/icons.cjs +1 -1
  287. package/dist/src/lib/ansiSpans.cjs +1 -1
  288. package/dist/src/lib/ansiSpans.cjs.map +1 -1
  289. package/dist/src/lib/editorTheme.cjs +1 -1
  290. package/dist/src/lib/editorTheme.cjs.map +1 -1
  291. package/dist/src/lib/hashlineHighlight.cjs +1 -1
  292. package/dist/src/lib/hashlineHighlight.cjs.map +1 -1
  293. package/dist/src/lib/hashlineView.cjs +1 -1
  294. package/dist/src/lib/hashlineView.cjs.map +1 -1
  295. package/dist/src/lib/syntaxHighlight.cjs +1 -1
  296. package/dist/src/lib/syntaxHighlight.cjs.map +1 -1
  297. package/dist/src/theme/builtinThemes.cjs +1 -1
  298. package/dist/src/theme/builtinThemes.cjs.map +1 -1
  299. package/dist/src/theme/derive.cjs +1 -1
  300. package/dist/src/theme/derive.cjs.map +1 -1
  301. package/dist/src/theme/nativeTheme.cjs +1 -1
  302. package/dist/src/theme/nativeTheme.cjs.map +1 -1
  303. package/dist/src/types/theme.cjs +1 -1
  304. package/dist/src/types/theme.cjs.map +1 -1
  305. package/dist/themes/po-nord-dark.cjs +2 -0
  306. package/dist/themes/po-nord-dark.cjs.map +1 -0
  307. package/dist/themes/po-one-light.cjs +2 -0
  308. package/dist/themes/po-one-light.cjs.map +1 -0
  309. package/package.json +18 -18
  310. package/styles/mcp.css +11 -11
  311. package/styles/preview.css +1 -1
  312. package/styles/theme.css +118 -119
  313. package/themes/{doom-nord-dark.json → po-nord-dark.json} +1 -1
  314. package/themes/{doom-one-light.json → po-one-light.json} +1 -1
  315. package/dist/_virtual/_rolldown/runtime.mjs +0 -1
  316. package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CfX6zgs1.d.mts.map +0 -1
  317. package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/index.d.mts +0 -2
  318. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/coerce.d.mts +0 -20
  319. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/coerce.d.mts.map +0 -1
  320. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/compat.d.mts +0 -50
  321. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/compat.d.mts.map +0 -1
  322. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/deep-partial.d.mts +0 -10
  323. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/deep-partial.d.mts.map +0 -1
  324. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/errors.d.mts +0 -33
  325. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/errors.d.mts.map +0 -1
  326. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.d.mts +0 -28
  327. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.d.mts.map +0 -1
  328. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/from-json-schema.d.mts +0 -14
  329. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/from-json-schema.d.mts.map +0 -1
  330. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/in-out.d.mts +0 -13
  331. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/in-out.d.mts.map +0 -1
  332. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/iso.d.mts +0 -13
  333. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/iso.d.mts.map +0 -1
  334. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/parse.d.mts +0 -54
  335. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/parse.d.mts.map +0 -1
  336. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.d.mts +0 -775
  337. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.d.mts.map +0 -1
  338. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/api.d.mts +0 -331
  339. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/api.d.mts.map +0 -1
  340. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/checks.d.mts +0 -296
  341. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/checks.d.mts.map +0 -1
  342. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/compile.d.mts +0 -67
  343. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/compile.d.mts.map +0 -1
  344. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/core.d.mts +0 -85
  345. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/core.d.mts.map +0 -1
  346. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/doc.d.mts +0 -18
  347. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/doc.d.mts.map +0 -1
  348. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/errors.d.mts.map +0 -1
  349. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/index.d.mts +0 -24
  350. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/index.d.mts.map +0 -1
  351. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-generator.d.mts +0 -67
  352. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-generator.d.mts.map +0 -1
  353. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.d.mts +0 -12
  354. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.d.mts.map +0 -1
  355. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema.d.mts.map +0 -1
  356. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/memoizer.d.mts +0 -18
  357. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/memoizer.d.mts.map +0 -1
  358. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/parse.d.mts +0 -54
  359. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/parse.d.mts.map +0 -1
  360. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/regexes.d.mts +0 -94
  361. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/regexes.d.mts.map +0 -1
  362. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/registries.d.mts.map +0 -1
  363. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/schemas.d.mts.map +0 -1
  364. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/standard-schema.d.mts.map +0 -1
  365. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/to-json-schema.d.mts.map +0 -1
  366. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/util.d.mts +0 -237
  367. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/util.d.mts.map +0 -1
  368. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/versions.d.mts.map +0 -1
  369. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/index.d.mts +0 -29
  370. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/index.d.mts.map +0 -1
  371. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ar.d.mts +0 -8
  372. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ar.d.mts.map +0 -1
  373. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/az.d.mts +0 -8
  374. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/az.d.mts.map +0 -1
  375. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/be.d.mts +0 -8
  376. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/be.d.mts.map +0 -1
  377. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bg.d.mts +0 -8
  378. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bg.d.mts.map +0 -1
  379. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bn.d.mts +0 -8
  380. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bn.d.mts.map +0 -1
  381. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ca.d.mts +0 -8
  382. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ca.d.mts.map +0 -1
  383. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ckb.d.mts +0 -8
  384. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ckb.d.mts.map +0 -1
  385. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/cs.d.mts +0 -8
  386. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/cs.d.mts.map +0 -1
  387. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/da.d.mts +0 -8
  388. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/da.d.mts.map +0 -1
  389. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/de.d.mts +0 -8
  390. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/de.d.mts.map +0 -1
  391. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/el.d.mts +0 -8
  392. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/el.d.mts.map +0 -1
  393. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/en.d.mts +0 -8
  394. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/en.d.mts.map +0 -1
  395. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/eo.d.mts +0 -8
  396. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/eo.d.mts.map +0 -1
  397. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/es.d.mts +0 -8
  398. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/es.d.mts.map +0 -1
  399. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fa.d.mts +0 -8
  400. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fa.d.mts.map +0 -1
  401. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fi.d.mts +0 -8
  402. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fi.d.mts.map +0 -1
  403. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr-CA.d.mts +0 -8
  404. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr-CA.d.mts.map +0 -1
  405. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr.d.mts +0 -8
  406. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr.d.mts.map +0 -1
  407. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/gu.d.mts +0 -8
  408. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/gu.d.mts.map +0 -1
  409. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/he.d.mts +0 -8
  410. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/he.d.mts.map +0 -1
  411. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hi.d.mts +0 -8
  412. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hi.d.mts.map +0 -1
  413. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hr.d.mts +0 -8
  414. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hr.d.mts.map +0 -1
  415. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hu.d.mts +0 -8
  416. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hu.d.mts.map +0 -1
  417. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hy.d.mts +0 -8
  418. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hy.d.mts.map +0 -1
  419. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/id.d.mts +0 -8
  420. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/id.d.mts.map +0 -1
  421. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/index.d.mts +0 -69
  422. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/index.d.mts.map +0 -1
  423. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/is.d.mts +0 -8
  424. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/is.d.mts.map +0 -1
  425. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/it.d.mts +0 -8
  426. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/it.d.mts.map +0 -1
  427. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ja.d.mts +0 -8
  428. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ja.d.mts.map +0 -1
  429. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ka.d.mts +0 -8
  430. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ka.d.mts.map +0 -1
  431. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kh.d.mts +0 -8
  432. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kh.d.mts.map +0 -1
  433. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/km.d.mts +0 -8
  434. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/km.d.mts.map +0 -1
  435. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kn.d.mts +0 -8
  436. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kn.d.mts.map +0 -1
  437. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ko.d.mts +0 -8
  438. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ko.d.mts.map +0 -1
  439. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/lt.d.mts +0 -8
  440. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/lt.d.mts.map +0 -1
  441. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/mk.d.mts +0 -8
  442. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/mk.d.mts.map +0 -1
  443. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ms.d.mts +0 -8
  444. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ms.d.mts.map +0 -1
  445. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ne.d.mts +0 -8
  446. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ne.d.mts.map +0 -1
  447. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nl.d.mts +0 -8
  448. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nl.d.mts.map +0 -1
  449. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nn.d.mts +0 -8
  450. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nn.d.mts.map +0 -1
  451. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/no.d.mts +0 -8
  452. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/no.d.mts.map +0 -1
  453. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ota.d.mts +0 -8
  454. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ota.d.mts.map +0 -1
  455. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pl.d.mts +0 -8
  456. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pl.d.mts.map +0 -1
  457. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ps.d.mts +0 -8
  458. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ps.d.mts.map +0 -1
  459. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt-BR.d.mts +0 -8
  460. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt-BR.d.mts.map +0 -1
  461. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt.d.mts +0 -8
  462. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt.d.mts.map +0 -1
  463. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ro.d.mts +0 -8
  464. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ro.d.mts.map +0 -1
  465. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ru.d.mts +0 -8
  466. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ru.d.mts.map +0 -1
  467. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sk.d.mts +0 -8
  468. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sk.d.mts.map +0 -1
  469. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sl.d.mts +0 -8
  470. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sl.d.mts.map +0 -1
  471. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sv.d.mts +0 -8
  472. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sv.d.mts.map +0 -1
  473. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ta.d.mts +0 -8
  474. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ta.d.mts.map +0 -1
  475. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tg.d.mts +0 -8
  476. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tg.d.mts.map +0 -1
  477. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/th.d.mts +0 -8
  478. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/th.d.mts.map +0 -1
  479. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tk.d.mts +0 -8
  480. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tk.d.mts.map +0 -1
  481. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tr.d.mts +0 -8
  482. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tr.d.mts.map +0 -1
  483. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ua.d.mts +0 -8
  484. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ua.d.mts.map +0 -1
  485. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uk.d.mts +0 -8
  486. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uk.d.mts.map +0 -1
  487. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ur.d.mts +0 -8
  488. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ur.d.mts.map +0 -1
  489. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uz.d.mts +0 -8
  490. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uz.d.mts.map +0 -1
  491. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/vi.d.mts +0 -8
  492. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/vi.d.mts.map +0 -1
  493. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/yo.d.mts +0 -8
  494. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/yo.d.mts.map +0 -1
  495. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-CN.d.mts +0 -8
  496. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-CN.d.mts.map +0 -1
  497. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-TW.d.mts +0 -8
  498. package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-TW.d.mts.map +0 -1
  499. package/dist/packages/core/po-web-components/themes/doom-nord-dark.mjs +0 -2
  500. package/dist/packages/core/po-web-components/themes/doom-nord-dark.mjs.map +0 -1
  501. package/dist/packages/core/po-web-components/themes/doom-one-dark.mjs +0 -2
  502. package/dist/packages/core/po-web-components/themes/doom-one-dark.mjs.map +0 -1
  503. package/dist/packages/core/po-web-components/themes/doom-one-light.mjs +0 -2
  504. package/dist/packages/core/po-web-components/themes/doom-one-light.mjs.map +0 -1
  505. package/dist/themes/doom-nord-dark.cjs +0 -2
  506. package/dist/themes/doom-nord-dark.cjs.map +0 -1
  507. package/dist/themes/doom-one-dark.cjs +0 -2
  508. package/dist/themes/doom-one-dark.cjs.map +0 -1
  509. package/dist/themes/doom-one-light.cjs +0 -2
  510. package/dist/themes/doom-one-light.cjs.map +0 -1
  511. package/themes/doom-one-dark.json +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.cjs","names":["cva","Slot","cn","require_cn","radix_ui","react_jsx_runtime","badgeVariants","Badge","props","Component","asChild","className"],"sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport type { ChipTone } from '../types/tone';\n\nexport const badgeVariants = cva('inline-flex items-center gap-1.5 whitespace-nowrap rounded border', {\n variants: {\n tone: {\n neutral: 'border-doom-border text-doom-dim',\n blue: 'border-doom-blue/40 text-doom-blue',\n green: 'border-doom-green/40 text-doom-green',\n yellow: 'border-doom-yellow/40 text-doom-yellow',\n red: 'border-doom-red/40 text-doom-red',\n magenta: 'border-doom-magenta/40 text-doom-magenta',\n violet: 'border-doom-violet/40 text-doom-violet',\n cyan: 'border-doom-cyan/40 text-doom-cyan',\n orange: 'border-doom-orange/40 text-doom-orange',\n teal: 'border-doom-teal/40 text-doom-teal',\n } satisfies Record<ChipTone, string>,\n /** The same rungs Button names, so a chip can sit beside a button of any size. */\n size: {\n xs: 'px-1.5 py-px text-sm font-semibold',\n sm: 'px-2 py-0.5 text-sm',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'sm' },\n});\n\nexport type BadgeTone = ChipTone;\n\nexport interface BadgeProps extends ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n /** Render the child element instead of a <span>, so a link can look like a chip. */\n asChild?: boolean;\n}\n\n/** An outlined chip in one of the accent tones; the Chip the cockpit mockup draws. */\nexport function Badge({ className, tone, size, asChild = false, ...props }: BadgeProps) {\n const Component = asChild ? Slot.Root : 'span';\n return <Component data-slot=\"badge\" className={cn(badgeVariants({ tone, size }), className)} {...props} />;\n}\n"],"mappings":"0FAOA,MAAaM,GAAA,oCAAgBN,CAAAA,CAAAA,IAAAA,CAAI,oEAAqE,CACpG,SAAU,CACR,KAAM,CACJ,QAAS,mCACT,KAAM,qCACN,MAAO,uCACP,OAAQ,yCACR,IAAK,mCACL,QAAS,2CACT,OAAQ,yCACR,KAAM,qCACN,OAAQ,yCACR,KAAM,oCACR,EAEA,KAAM,CACJ,GAAI,qCACJ,GAAI,sBACJ,GAAI,sBACJ,GAAI,uBACN,CACF,EACA,gBAAiB,CAAE,KAAM,UAAW,KAAM,IAAK,CACjD,CAAC,EAUD,SAAgBO,EAAM,CAAE,YAAW,OAAM,OAAM,UAAU,GAAO,GAAGC,GAAqB,CACtF,IAAMC,EAAYC,EAAUT,EAAAA,KAAK,KAAO,OACxC,MAAO,iBAAA,EAAAI,EAAA,IAAA,CAACI,EAAD,CAAW,YAAU,QAAQ,UAAWP,EAAAA,GAAGI,EAAc,CAAE,OAAM,MAAK,CAAC,EAAGK,CAAS,EAAG,GAAIH,CAAQ,CAAA,CAC3G"}
1
+ {"version":3,"file":"Badge.cjs","names":["cva","Slot","cn","require_cn","radix_ui","react_jsx_runtime","badgeVariants","Badge","props","Component","asChild","className"],"sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport type { ChipTone } from '../types/tone';\n\nexport const badgeVariants = cva('inline-flex items-center gap-1.5 whitespace-nowrap rounded border', {\n variants: {\n tone: {\n neutral: 'border-po-border text-po-dim',\n blue: 'border-po-blue/40 text-po-blue',\n green: 'border-po-green/40 text-po-green',\n yellow: 'border-po-yellow/40 text-po-yellow',\n red: 'border-po-red/40 text-po-red',\n magenta: 'border-po-magenta/40 text-po-magenta',\n violet: 'border-po-violet/40 text-po-violet',\n cyan: 'border-po-cyan/40 text-po-cyan',\n orange: 'border-po-orange/40 text-po-orange',\n teal: 'border-po-teal/40 text-po-teal',\n } satisfies Record<ChipTone, string>,\n /** The same rungs Button names, so a chip can sit beside a button of any size. */\n size: {\n xs: 'px-1.5 py-px text-sm font-semibold',\n sm: 'px-2 py-0.5 text-sm',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'sm' },\n});\n\nexport type BadgeTone = ChipTone;\n\nexport interface BadgeProps extends ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n /** Render the child element instead of a <span>, so a link can look like a chip. */\n asChild?: boolean;\n}\n\n/** An outlined chip in one of the accent tones; the Chip the cockpit mockup draws. */\nexport function Badge({ className, tone, size, asChild = false, ...props }: BadgeProps) {\n const Component = asChild ? Slot.Root : 'span';\n return <Component data-slot=\"badge\" className={cn(badgeVariants({ tone, size }), className)} {...props} />;\n}\n"],"mappings":"0FAOA,MAAaM,GAAA,oCAAgBN,CAAAA,CAAAA,IAAAA,CAAI,oEAAqE,CACpG,SAAU,CACR,KAAM,CACJ,QAAS,+BACT,KAAM,iCACN,MAAO,mCACP,OAAQ,qCACR,IAAK,+BACL,QAAS,uCACT,OAAQ,qCACR,KAAM,iCACN,OAAQ,qCACR,KAAM,gCACR,EAEA,KAAM,CACJ,GAAI,qCACJ,GAAI,sBACJ,GAAI,sBACJ,GAAI,uBACN,CACF,EACA,gBAAiB,CAAE,KAAM,UAAW,KAAM,IAAK,CACjD,CAAC,EAUD,SAAgBO,EAAM,CAAE,YAAW,OAAM,OAAM,UAAU,GAAO,GAAGC,GAAqB,CACtF,IAAMC,EAAYC,EAAUT,EAAAA,KAAK,KAAO,OACxC,MAAO,iBAAA,EAAAI,EAAA,IAAA,CAACI,EAAD,CAAW,YAAU,QAAQ,UAAWP,EAAAA,GAAGI,EAAc,CAAE,OAAM,MAAK,CAAC,EAAGK,CAAS,EAAG,GAAIH,CAAQ,CAAA,CAC3G"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs"),t=require("./Tooltip.cjs");let n=require("react/jsx-runtime");function r(e,t=4){let n=e.split(`/`).filter(e=>e!==``);if(n.length===0)return[e];let r=Math.max(3,t);return n.length<=r?n:[n[0]??``,`…`,...n.slice(n.length-(r-2))]}function i({path:i,keep:a,className:o,"data-testid":s}){let c=r(i,a),l=c.length-1;return/* @__PURE__ */ (0,n.jsx)(t.TooltipProvider,{children:/* @__PURE__ */ (0,n.jsxs)(t.Tooltip,{children:[/* @__PURE__ */ (0,n.jsx)(t.TooltipTrigger,{asChild:!0,children:/* @__PURE__ */ (0,n.jsx)(`span`,{"data-slot":`breadcrumb`,"data-testid":s,title:void 0,className:e.cn(`flex min-w-0 items-baseline gap-1 truncate font-mono text-sm`,o),children:c.map((e,t)=>/* @__PURE__ */ (0,n.jsxs)(`span`,{className:`flex min-w-0 items-baseline gap-1`,children:[t>0?/* @__PURE__ */ (0,n.jsx)(`span`,{className:`shrink-0 text-doom-faint`,children:`/`}):null,/* @__PURE__ */ (0,n.jsx)(`span`,{className:t===l?`truncate font-semibold text-doom-hi`:`min-w-0 truncate text-doom-dim`,children:e})]},`${e}-${String(t)}`))})}),/* @__PURE__ */ (0,n.jsx)(t.TooltipContent,{className:`max-w-[32rem] break-all whitespace-normal`,children:i})]})})}exports.BREADCRUMB_ELLIPSIS=`…`,exports.Breadcrumb=i,exports.breadcrumbSegments=r;
1
+ const e=require("../lib/cn.cjs"),t=require("./Tooltip.cjs");let n=require("react/jsx-runtime");function r(e,t=4){let n=e.split(`/`).filter(e=>e!==``);if(n.length===0)return[e];let r=Math.max(3,t);return n.length<=r?n:[n[0]??``,`…`,...n.slice(n.length-(r-2))]}function i({path:i,keep:a,className:o,"data-testid":s}){let c=r(i,a),l=c.length-1;return/* @__PURE__ */ (0,n.jsx)(t.TooltipProvider,{children:/* @__PURE__ */ (0,n.jsxs)(t.Tooltip,{children:[/* @__PURE__ */ (0,n.jsx)(t.TooltipTrigger,{asChild:!0,children:/* @__PURE__ */ (0,n.jsx)(`span`,{"data-slot":`breadcrumb`,"data-testid":s,title:void 0,className:e.cn(`flex min-w-0 items-baseline gap-1 truncate font-mono text-sm`,o),children:c.map((e,t)=>/* @__PURE__ */ (0,n.jsxs)(`span`,{className:`flex min-w-0 items-baseline gap-1`,children:[t>0?/* @__PURE__ */ (0,n.jsx)(`span`,{className:`shrink-0 text-po-faint`,children:`/`}):null,/* @__PURE__ */ (0,n.jsx)(`span`,{className:t===l?`truncate font-semibold text-po-hi`:`min-w-0 truncate text-po-dim`,children:e})]},`${e}-${String(t)}`))})}),/* @__PURE__ */ (0,n.jsx)(t.TooltipContent,{className:`max-w-[32rem] break-all whitespace-normal`,children:i})]})})}exports.BREADCRUMB_ELLIPSIS=`…`,exports.Breadcrumb=i,exports.breadcrumbSegments=r;
2
2
  //# sourceMappingURL=Breadcrumb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.cjs","names":["TooltipProvider","Tooltip","TooltipTrigger","cn","TooltipContent","require_cn","require_Tooltip","react_jsx_runtime","breadcrumbSegments","segments","path","segment","limit","keep","Breadcrumb","testId","lastIndex","className","index"],"sources":["../../../src/components/Breadcrumb.tsx"],"sourcesContent":["import { cn } from '../lib/cn';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './Tooltip';\n\n/** The marker a collapsed run of segments is shown as. */\nexport const BREADCRUMB_ELLIPSIS = '…';\n\n/**\n * A path as breadcrumb segments, with the middle collapsed when it is deeper\n * than `keep` allows.\n *\n * The first segment and the last few are what place a leaf; the ones between\n * are what a reader skims past, so those are the ones that go. The leaf is\n * always the final segment and is never collapsed.\n */\nexport function breadcrumbSegments(path: string, keep = 4): string[] {\n const segments = path.split('/').filter((segment) => segment !== '');\n if (segments.length === 0) return [path];\n const limit = Math.max(3, keep);\n if (segments.length <= limit) return segments;\n // Keep room for the first segment, the collapse marker, and the leaf.\n return [segments[0] ?? '', BREADCRUMB_ELLIPSIS, ...segments.slice(segments.length - (limit - 2))];\n}\n\nexport interface BreadcrumbProps {\n /** The path to show, separated by forward slashes. */\n path: string;\n /** How many segments survive, with a minimum of three to retain the leaf. */\n keep?: number;\n /** Marks the trail so a test can find it. */\n 'data-testid'?: string;\n className?: string;\n}\n\n/**\n * A slash-separated path, shortened to fit and readable in full on hover.\n *\n * Two things shorten it, because they solve different problems. Collapsing the\n * middle keeps a deep path legible at any width, and truncation handles what is\n * left when the container is narrower than even that. Either one hides\n * something, so the whole path is always one hover away, wrapped rather than\n * clipped: a tooltip that truncates too would defeat the point of having one.\n *\n * The leaf carries the emphasis. A reader scanning a header is looking for the\n * file, and the directories are context for it.\n */\nexport function Breadcrumb({ path, keep, className, 'data-testid': testId }: BreadcrumbProps) {\n const segments = breadcrumbSegments(path, keep);\n const lastIndex = segments.length - 1;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n data-slot=\"breadcrumb\"\n data-testid={testId}\n title={undefined}\n className={cn('flex min-w-0 items-baseline gap-1 truncate font-mono text-sm', className)}\n >\n {segments.map((segment, index) => (\n // Segments repeat in a path (src/app/src), so the index is what\n // keeps two of the same name apart.\n <span key={`${segment}-${String(index)}`} className=\"flex min-w-0 items-baseline gap-1\">\n {index > 0 ? <span className=\"shrink-0 text-doom-faint\">/</span> : null}\n <span\n className={\n index === lastIndex ? 'truncate font-semibold text-doom-hi' : 'min-w-0 truncate text-doom-dim'\n }\n >\n {segment}\n </span>\n </span>\n ))}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-[32rem] break-all whitespace-normal\">{path}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"],"mappings":"+FAcA,SAAgBQ,EAAmB,EAAc,EAAO,EAAa,CACnE,IAAMC,EAAWC,EAAK,MAAM,GAAG,CAAC,CAAC,OAAQ,GAAYC,IAAY,EAAE,EACnE,GAAIF,EAAS,SAAW,EAAG,MAAO,CAACC,CAAI,EACvC,IAAME,EAAQ,KAAK,IAAI,EAAGC,CAAI,EAG9B,OAFIJ,EAAS,QAAUG,EAAcH,EAE9B,CAACA,EAAS,IAAM,OAAyB,GAAGA,EAAS,MAAMA,EAAS,QAAUG,EAAQ,EAAE,CAAC,CAClG,CAwBA,SAAgBE,EAAW,CAAE,OAAM,OAAM,YAAW,cAAeC,GAA2B,CAC5F,IAAMN,EAAWD,EAAmBE,EAAMG,CAAI,EACxCG,EAAYP,EAAS,OAAS,EAEpC,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACP,EAAAA,gBAAD,CAAA,SACE,iBAAA,EAAAO,EAAA,KAAA,CAACN,EAAAA,QAAD,CAAA,SAAA,CACE,iBAAA,EAAAM,EAAA,IAAA,CAACL,EAAAA,eAAD,CAAgB,QAAA,GACd,SAAA,iBAAA,EAAAK,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,aACV,cAAaQ,EACb,MAAO,IAAA,GACP,UAAWZ,EAAAA,GAAG,+DAAgEc,CAAS,EAEtF,SAAAR,EAAS,KAAK,EAAS,IAGtB,iBAAA,EAAAF,EAAA,KAAA,CAAC,OAAD,CAA0C,UAAU,oCAApD,SAAA,CACGW,EAAQ,EAAI,iBAAA,EAAAX,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2BAA2B,SAAA,GAAO,CAAA,EAAI,KACnE,iBAAA,EAAAA,EAAA,IAAA,CAAC,OAAD,CACE,UACEW,IAAUF,EAAY,sCAAwC,iCAG/D,SAAAL,CACG,CAAA,CACF,CATK,EAAA,GAAGA,EAAQ,GAAG,OAAOO,CAAK,GAS/B,CACP,CACG,CAAA,CACQ,CAAA,EAChB,iBAAA,EAAAX,EAAA,IAAA,CAACH,EAAAA,eAAD,CAAgB,UAAU,4CAA6C,SAAAM,CAAqB,CAAA,CACrF,CAAA,CAAA,CACM,CAAA,CAErB"}
1
+ {"version":3,"file":"Breadcrumb.cjs","names":["TooltipProvider","Tooltip","TooltipTrigger","cn","TooltipContent","require_cn","require_Tooltip","react_jsx_runtime","breadcrumbSegments","segments","path","segment","limit","keep","Breadcrumb","testId","lastIndex","className","index"],"sources":["../../../src/components/Breadcrumb.tsx"],"sourcesContent":["import { cn } from '../lib/cn';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './Tooltip';\n\n/** The marker a collapsed run of segments is shown as. */\nexport const BREADCRUMB_ELLIPSIS = '…';\n\n/**\n * A path as breadcrumb segments, with the middle collapsed when it is deeper\n * than `keep` allows.\n *\n * The first segment and the last few are what place a leaf; the ones between\n * are what a reader skims past, so those are the ones that go. The leaf is\n * always the final segment and is never collapsed.\n */\nexport function breadcrumbSegments(path: string, keep = 4): string[] {\n const segments = path.split('/').filter((segment) => segment !== '');\n if (segments.length === 0) return [path];\n const limit = Math.max(3, keep);\n if (segments.length <= limit) return segments;\n // Keep room for the first segment, the collapse marker, and the leaf.\n return [segments[0] ?? '', BREADCRUMB_ELLIPSIS, ...segments.slice(segments.length - (limit - 2))];\n}\n\nexport interface BreadcrumbProps {\n /** The path to show, separated by forward slashes. */\n path: string;\n /** How many segments survive, with a minimum of three to retain the leaf. */\n keep?: number;\n /** Marks the trail so a test can find it. */\n 'data-testid'?: string;\n className?: string;\n}\n\n/**\n * A slash-separated path, shortened to fit and readable in full on hover.\n *\n * Two things shorten it, because they solve different problems. Collapsing the\n * middle keeps a deep path legible at any width, and truncation handles what is\n * left when the container is narrower than even that. Either one hides\n * something, so the whole path is always one hover away, wrapped rather than\n * clipped: a tooltip that truncates too would defeat the point of having one.\n *\n * The leaf carries the emphasis. A reader scanning a header is looking for the\n * file, and the directories are context for it.\n */\nexport function Breadcrumb({ path, keep, className, 'data-testid': testId }: BreadcrumbProps) {\n const segments = breadcrumbSegments(path, keep);\n const lastIndex = segments.length - 1;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n data-slot=\"breadcrumb\"\n data-testid={testId}\n title={undefined}\n className={cn('flex min-w-0 items-baseline gap-1 truncate font-mono text-sm', className)}\n >\n {segments.map((segment, index) => (\n // Segments repeat in a path (src/app/src), so the index is what\n // keeps two of the same name apart.\n <span key={`${segment}-${String(index)}`} className=\"flex min-w-0 items-baseline gap-1\">\n {index > 0 ? <span className=\"shrink-0 text-po-faint\">/</span> : null}\n <span\n className={index === lastIndex ? 'truncate font-semibold text-po-hi' : 'min-w-0 truncate text-po-dim'}\n >\n {segment}\n </span>\n </span>\n ))}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-[32rem] break-all whitespace-normal\">{path}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"],"mappings":"+FAcA,SAAgBQ,EAAmB,EAAc,EAAO,EAAa,CACnE,IAAMC,EAAWC,EAAK,MAAM,GAAG,CAAC,CAAC,OAAQ,GAAYC,IAAY,EAAE,EACnE,GAAIF,EAAS,SAAW,EAAG,MAAO,CAACC,CAAI,EACvC,IAAME,EAAQ,KAAK,IAAI,EAAGC,CAAI,EAG9B,OAFIJ,EAAS,QAAUG,EAAcH,EAE9B,CAACA,EAAS,IAAM,OAAyB,GAAGA,EAAS,MAAMA,EAAS,QAAUG,EAAQ,EAAE,CAAC,CAClG,CAwBA,SAAgBE,EAAW,CAAE,OAAM,OAAM,YAAW,cAAeC,GAA2B,CAC5F,IAAMN,EAAWD,EAAmBE,EAAMG,CAAI,EACxCG,EAAYP,EAAS,OAAS,EAEpC,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACP,EAAAA,gBAAD,CAAA,SACE,iBAAA,EAAAO,EAAA,KAAA,CAACN,EAAAA,QAAD,CAAA,SAAA,CACE,iBAAA,EAAAM,EAAA,IAAA,CAACL,EAAAA,eAAD,CAAgB,QAAA,GACd,SAAA,iBAAA,EAAAK,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,aACV,cAAaQ,EACb,MAAO,IAAA,GACP,UAAWZ,EAAAA,GAAG,+DAAgEc,CAAS,EAEtF,SAAAR,EAAS,KAAK,EAAS,IAGtB,iBAAA,EAAAF,EAAA,KAAA,CAAC,OAAD,CAA0C,UAAU,oCAApD,SAAA,CACGW,EAAQ,EAAI,iBAAA,EAAAX,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,yBAAyB,SAAA,GAAO,CAAA,EAAI,KACjE,iBAAA,EAAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAWW,IAAUF,EAAY,oCAAsC,+BAEtE,SAAAL,CACG,CAAA,CACF,CAPK,EAAA,GAAGA,EAAQ,GAAG,OAAOO,CAAK,GAO/B,CACP,CACG,CAAA,CACQ,CAAA,EAChB,iBAAA,EAAAX,EAAA,IAAA,CAACH,EAAAA,eAAD,CAAgB,UAAU,4CAA6C,SAAAM,CAAqB,CAAA,CACrF,CAAA,CAAA,CACM,CAAA,CAErB"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs"),t=require("./Spinner.cjs");let n=require("radix-ui"),r=require("react/jsx-runtime");const i=(0,require("class-variance-authority").cva)(`inline-flex min-h-6 min-w-6 shrink-0 cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-md font-medium transition-[color,background-color,border-color,filter] outline-none focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 [&_svg]:pointer-events-none [&_svg]:shrink-0`,{variants:{variant:{primary:`bg-doom-selected font-semibold text-doom-on-selected hover:brightness-110`,secondary:`border border-doom-edge-magenta bg-doom-tint-magenta font-semibold text-doom-magenta hover:brightness-110`,outline:`border border-doom-border text-doom-dim hover:border-doom-green/50 hover:text-doom-hi`,ghost:`text-doom-dim hover:bg-doom-panel hover:text-doom-hi`,subtle:`bg-doom-panel text-doom-dim hover:bg-doom-deep hover:text-doom-hi`,danger:`bg-doom-red font-semibold text-doom-rail hover:brightness-110`,"danger-outline":`border border-doom-edge-red bg-doom-tint-red font-semibold text-doom-red hover:brightness-110`,success:`bg-doom-green font-semibold text-doom-rail hover:brightness-110`,link:`text-doom-blue hover:underline`},size:{xs:`h-6 rounded px-1.5 text-sm`,sm:`h-7 px-2.5 text-sm`,md:`h-8 px-3 text-base`,lg:`h-9 px-3.5 text-base`,icon:`h-6 w-6 rounded p-0`,"icon-md":`h-8 w-8 p-0`,card:`h-auto w-full flex-col items-stretch justify-start gap-1 px-[11px] py-2.5 text-left whitespace-normal`}},defaultVariants:{variant:`outline`,size:`md`}});function a({className:a,variant:o,size:s,asChild:c=!1,loading:l=!1,loadingLabel:u,disabled:d,type:f,children:p,...m}){let h=c?n.Slot.Root:`button`,g=!c&&l;return/* @__PURE__ */ (0,r.jsx)(h,{"data-slot":`button`,type:c?void 0:f??`button`,"aria-busy":g?!0:void 0,disabled:c?void 0:d??g,className:e.cn(i({variant:o,size:s}),a),...m,children:c?p:/* @__PURE__ */ (0,r.jsxs)(r.Fragment,{children:[g?/* @__PURE__ */ (0,r.jsx)(t.Spinner,{label:u}):null,p]})})}exports.Button=a,exports.buttonVariants=i;
1
+ const e=require("../lib/cn.cjs"),t=require("./Spinner.cjs");let n=require("radix-ui"),r=require("react/jsx-runtime");const i=(0,require("class-variance-authority").cva)(`inline-flex min-h-6 min-w-6 shrink-0 cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-md font-medium transition-[color,background-color,border-color,filter] outline-none focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 [&_svg]:pointer-events-none [&_svg]:shrink-0`,{variants:{variant:{primary:`bg-po-selected font-semibold text-po-on-selected hover:brightness-110`,secondary:`border border-po-edge-magenta bg-po-tint-magenta font-semibold text-po-magenta hover:brightness-110`,outline:`border border-po-border text-po-dim hover:border-po-green/50 hover:text-po-hi`,ghost:`text-po-dim hover:bg-po-panel hover:text-po-hi`,subtle:`bg-po-panel text-po-dim hover:bg-po-deep hover:text-po-hi`,danger:`bg-po-red font-semibold text-po-rail hover:brightness-110`,"danger-outline":`border border-po-edge-red bg-po-tint-red font-semibold text-po-red hover:brightness-110`,success:`bg-po-green font-semibold text-po-rail hover:brightness-110`,link:`text-po-blue hover:underline`},size:{xs:`h-6 rounded px-1.5 text-sm`,sm:`h-7 px-2.5 text-sm`,md:`h-8 px-3 text-base`,lg:`h-9 px-3.5 text-base`,icon:`h-6 w-6 rounded p-0`,"icon-md":`h-8 w-8 p-0`,card:`h-auto w-full flex-col items-stretch justify-start gap-1 px-[11px] py-2.5 text-left whitespace-normal`}},defaultVariants:{variant:`outline`,size:`md`}});function a({className:a,variant:o,size:s,asChild:c=!1,loading:l=!1,loadingLabel:u,disabled:d,type:f,children:p,...m}){let h=c?n.Slot.Root:`button`,g=!c&&l;return/* @__PURE__ */ (0,r.jsx)(h,{"data-slot":`button`,type:c?void 0:f??`button`,"aria-busy":g?!0:void 0,disabled:c?void 0:d??g,className:e.cn(i({variant:o,size:s}),a),...m,children:c?p:/* @__PURE__ */ (0,r.jsxs)(r.Fragment,{children:[g?/* @__PURE__ */ (0,r.jsx)(t.Spinner,{label:u}):null,p]})})}exports.Button=a,exports.buttonVariants=i;
2
2
  //# sourceMappingURL=Button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","names":["cva","Slot","cn","Spinner","require_cn","require_Spinner","radix_ui","react_jsx_runtime","buttonVariants","Button","props","Component","asChild","busy","loading","type","disabled","className","children","loadingLabel"],"sources":["../../../src/components/Button.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Spinner } from './Spinner';\n\nexport const buttonVariants = cva(\n 'inline-flex min-h-6 min-w-6 shrink-0 cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-md font-medium transition-[color,background-color,border-color,filter] outline-none focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 [&_svg]:pointer-events-none [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n primary: 'bg-doom-selected font-semibold text-doom-on-selected hover:brightness-110',\n /** Rose: the caring second choice (review, adjust a preference), never urgency. */\n secondary:\n 'border border-doom-edge-magenta bg-doom-tint-magenta font-semibold text-doom-magenta hover:brightness-110',\n outline: 'border border-doom-border text-doom-dim hover:border-doom-green/50 hover:text-doom-hi',\n ghost: 'text-doom-dim hover:bg-doom-panel hover:text-doom-hi',\n subtle: 'bg-doom-panel text-doom-dim hover:bg-doom-deep hover:text-doom-hi',\n danger: 'bg-doom-red font-semibold text-doom-rail hover:brightness-110',\n 'danger-outline':\n 'border border-doom-edge-red bg-doom-tint-red font-semibold text-doom-red hover:brightness-110',\n success: 'bg-doom-green font-semibold text-doom-rail hover:brightness-110',\n link: 'text-doom-blue hover:underline',\n },\n size: {\n xs: 'h-6 rounded px-1.5 text-sm',\n sm: 'h-7 px-2.5 text-sm',\n md: 'h-8 px-3 text-base',\n lg: 'h-9 px-3.5 text-base',\n icon: 'h-6 w-6 rounded p-0',\n 'icon-md': 'h-8 w-8 p-0',\n /**\n * A whole card that is one click target: a session in the rail, a run\n * in a panel. It keeps the button's focus ring and cursor and gives up\n * the button's single-line box, which is what a card-shaped <button>\n * would otherwise have to restate.\n */\n card: 'h-auto w-full flex-col items-stretch justify-start gap-1 px-[11px] py-2.5 text-left whitespace-normal',\n },\n },\n defaultVariants: { variant: 'outline', size: 'md' },\n },\n);\n\nexport type ButtonVariant = NonNullable<VariantProps<typeof buttonVariants>['variant']>;\nexport type ButtonSize = NonNullable<VariantProps<typeof buttonVariants>['size']>;\n\nexport interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {\n /** Render the child element instead of a <button>, passing the classes down (shadcn's asChild). */\n asChild?: boolean;\n /**\n * Work is in flight: the button shows a spinner and stops accepting clicks.\n * Ignored under asChild, where the child owns its own content.\n */\n loading?: boolean;\n /** What the spinner announces while loading; omit it and the wait is silent. */\n loadingLabel?: string;\n}\n\n/** The one button: every variant is a theme token, so it recolours with the theme. */\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n loadingLabel,\n disabled,\n type,\n children,\n ...props\n}: ButtonProps) {\n const Component = asChild ? Slot.Root : 'button';\n const busy = !asChild && loading;\n return (\n <Component\n data-slot=\"button\"\n type={asChild ? undefined : (type ?? 'button')}\n aria-busy={busy ? true : undefined}\n disabled={asChild ? undefined : (disabled ?? busy)}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n >\n {/* Slot takes exactly one child, so asChild hands its element straight through. */}\n {asChild ? (\n children\n ) : (\n <>\n {busy ? <Spinner label={loadingLabel} /> : null}\n {children}\n </>\n )}\n </Component>\n );\n}\n"],"mappings":"qHAOA,MAAaQ,GAAA,oCAAiBR,CAAAA,CAAAA,IAAAA,CAC5B,4VACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,4EAET,UACE,4GACF,QAAS,wFACT,MAAO,uDACP,OAAQ,oEACR,OAAQ,gEACR,iBACE,gGACF,QAAS,kEACT,KAAM,gCACR,EACA,KAAM,CACJ,GAAI,6BACJ,GAAI,qBACJ,GAAI,qBACJ,GAAI,uBACJ,KAAM,sBACN,UAAW,cAOX,KAAM,uGACR,CACF,EACA,gBAAiB,CAAE,QAAS,UAAW,KAAM,IAAK,CACpD,CACF,EAkBA,SAAgBS,EAAO,CACrB,YACA,UACA,OACA,UAAU,GACV,UAAU,GACV,eACA,WACA,OACA,WACA,GAAGC,GACW,CACd,IAAMC,EAAYC,EAAUX,EAAAA,KAAK,KAAO,SAClCY,EAAO,CAACD,GAAWE,EACzB,MACE,iBAAA,EAAAP,EAAA,IAAA,CAACI,EAAD,CACE,YAAU,SACV,KAAMC,EAAU,IAAA,GAAaG,GAAQ,SACrC,YAAWF,EAAO,GAAO,IAAA,GACzB,SAAUD,EAAU,IAAA,GAAaI,GAAYH,EAC7C,UAAWX,EAAAA,GAAGM,EAAe,CAAE,UAAS,MAAK,CAAC,EAAGS,CAAS,EAC1D,GAAIP,EAGH,SAAAE,EACCM,EAEA,iBAAA,EAAAX,EAAA,KAAA,CAAAA,EAAA,SAAA,CAAA,SAAA,CACGM,EAAO,iBAAA,EAAAN,EAAA,IAAA,CAACJ,EAAAA,QAAD,CAAS,MAAOgB,CAAe,CAAA,EAAI,KAC1CD,CACD,CAAA,CAAA,CAEK,CAAA,CAEf"}
1
+ {"version":3,"file":"Button.cjs","names":["cva","Slot","cn","Spinner","require_cn","require_Spinner","radix_ui","react_jsx_runtime","buttonVariants","Button","props","Component","asChild","busy","loading","type","disabled","className","children","loadingLabel"],"sources":["../../../src/components/Button.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Spinner } from './Spinner';\n\nexport const buttonVariants = cva(\n 'inline-flex min-h-6 min-w-6 shrink-0 cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-md font-medium transition-[color,background-color,border-color,filter] outline-none focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 [&_svg]:pointer-events-none [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n primary: 'bg-po-selected font-semibold text-po-on-selected hover:brightness-110',\n /** Rose: the caring second choice (review, adjust a preference), never urgency. */\n secondary:\n 'border border-po-edge-magenta bg-po-tint-magenta font-semibold text-po-magenta hover:brightness-110',\n outline: 'border border-po-border text-po-dim hover:border-po-green/50 hover:text-po-hi',\n ghost: 'text-po-dim hover:bg-po-panel hover:text-po-hi',\n subtle: 'bg-po-panel text-po-dim hover:bg-po-deep hover:text-po-hi',\n danger: 'bg-po-red font-semibold text-po-rail hover:brightness-110',\n 'danger-outline': 'border border-po-edge-red bg-po-tint-red font-semibold text-po-red hover:brightness-110',\n success: 'bg-po-green font-semibold text-po-rail hover:brightness-110',\n link: 'text-po-blue hover:underline',\n },\n size: {\n xs: 'h-6 rounded px-1.5 text-sm',\n sm: 'h-7 px-2.5 text-sm',\n md: 'h-8 px-3 text-base',\n lg: 'h-9 px-3.5 text-base',\n icon: 'h-6 w-6 rounded p-0',\n 'icon-md': 'h-8 w-8 p-0',\n /**\n * A whole card that is one click target: a session in the rail, a run\n * in a panel. It keeps the button's focus ring and cursor and gives up\n * the button's single-line box, which is what a card-shaped <button>\n * would otherwise have to restate.\n */\n card: 'h-auto w-full flex-col items-stretch justify-start gap-1 px-[11px] py-2.5 text-left whitespace-normal',\n },\n },\n defaultVariants: { variant: 'outline', size: 'md' },\n },\n);\n\nexport type ButtonVariant = NonNullable<VariantProps<typeof buttonVariants>['variant']>;\nexport type ButtonSize = NonNullable<VariantProps<typeof buttonVariants>['size']>;\n\nexport interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {\n /** Render the child element instead of a <button>, passing the classes down (shadcn's asChild). */\n asChild?: boolean;\n /**\n * Work is in flight: the button shows a spinner and stops accepting clicks.\n * Ignored under asChild, where the child owns its own content.\n */\n loading?: boolean;\n /** What the spinner announces while loading; omit it and the wait is silent. */\n loadingLabel?: string;\n}\n\n/** The one button: every variant is a theme token, so it recolours with the theme. */\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n loadingLabel,\n disabled,\n type,\n children,\n ...props\n}: ButtonProps) {\n const Component = asChild ? Slot.Root : 'button';\n const busy = !asChild && loading;\n return (\n <Component\n data-slot=\"button\"\n type={asChild ? undefined : (type ?? 'button')}\n aria-busy={busy ? true : undefined}\n disabled={asChild ? undefined : (disabled ?? busy)}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n >\n {/* Slot takes exactly one child, so asChild hands its element straight through. */}\n {asChild ? (\n children\n ) : (\n <>\n {busy ? <Spinner label={loadingLabel} /> : null}\n {children}\n </>\n )}\n </Component>\n );\n}\n"],"mappings":"qHAOA,MAAaQ,GAAA,oCAAiBR,CAAAA,CAAAA,IAAAA,CAC5B,0VACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,wEAET,UACE,sGACF,QAAS,gFACT,MAAO,iDACP,OAAQ,4DACR,OAAQ,4DACR,iBAAkB,0FAClB,QAAS,8DACT,KAAM,8BACR,EACA,KAAM,CACJ,GAAI,6BACJ,GAAI,qBACJ,GAAI,qBACJ,GAAI,uBACJ,KAAM,sBACN,UAAW,cAOX,KAAM,uGACR,CACF,EACA,gBAAiB,CAAE,QAAS,UAAW,KAAM,IAAK,CACpD,CACF,EAkBA,SAAgBS,EAAO,CACrB,YACA,UACA,OACA,UAAU,GACV,UAAU,GACV,eACA,WACA,OACA,WACA,GAAGC,GACW,CACd,IAAMC,EAAYC,EAAUX,EAAAA,KAAK,KAAO,SAClCY,EAAO,CAACD,GAAWE,EACzB,MACE,iBAAA,EAAAP,EAAA,IAAA,CAACI,EAAD,CACE,YAAU,SACV,KAAMC,EAAU,IAAA,GAAaG,GAAQ,SACrC,YAAWF,EAAO,GAAO,IAAA,GACzB,SAAUD,EAAU,IAAA,GAAaI,GAAYH,EAC7C,UAAWX,EAAAA,GAAGM,EAAe,CAAE,UAAS,MAAK,CAAC,EAAGS,CAAS,EAC1D,GAAIP,EAGH,SAAAE,EACCM,EAEA,iBAAA,EAAAX,EAAA,KAAA,CAAAA,EAAA,SAAA,CAAA,SAAA,CACGM,EAAO,iBAAA,EAAAN,EAAA,IAAA,CAACJ,EAAAA,QAAD,CAAS,MAAOgB,CAAe,CAAA,EAAI,KAC1CD,CACD,CAAA,CAAA,CAEK,CAAA,CAEf"}
@@ -1,2 +1,2 @@
1
- require("../icons/icons.cjs");const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime"),r=require("lucide-react");function i({className:i,...a}){return/* @__PURE__ */ (0,n.jsx)(t.Checkbox.Root,{"data-slot":`checkbox`,className:e.cn(`flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-sm border border-doom-border bg-doom-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-doom-green data-[state=indeterminate]:border-doom-green`,i),...a,children:/* @__PURE__ */ (0,n.jsx)(t.Checkbox.Indicator,{"data-slot":`checkbox-indicator`,className:`text-doom-green`,children:/* @__PURE__ */ (0,n.jsx)(r.Check,{className:`h-2.5 w-2.5`})})})}exports.Checkbox=i;
1
+ require("../icons/icons.cjs");const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime"),r=require("lucide-react");function i({className:i,...a}){return/* @__PURE__ */ (0,n.jsx)(t.Checkbox.Root,{"data-slot":`checkbox`,className:e.cn(`flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-sm border border-po-border bg-po-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-po-green data-[state=indeterminate]:border-po-green`,i),...a,children:/* @__PURE__ */ (0,n.jsx)(t.Checkbox.Indicator,{"data-slot":`checkbox-indicator`,className:`text-po-green`,children:/* @__PURE__ */ (0,n.jsx)(r.Check,{className:`h-2.5 w-2.5`})})})}exports.Checkbox=i;
2
2
  //# sourceMappingURL=Checkbox.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.cjs","names":["CheckboxPrimitive","cn","CheckIcon","require_cn","radix_ui","react_jsx_runtime","lucide_react","Checkbox","props","className"],"sources":["../../../src/components/Checkbox.tsx"],"sourcesContent":["import { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { CheckIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/** A box that is on, off, or indeterminate; the tick is the accent on the deep well. */\nexport function Checkbox({ className, ...props }: ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-sm border border-doom-border bg-doom-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-doom-green data-[state=indeterminate]:border-doom-green',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator data-slot=\"checkbox-indicator\" className=\"text-doom-green\">\n <CheckIcon className=\"h-2.5 w-2.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n"],"mappings":"kJAOA,SAAgBO,EAAS,CAAE,YAAW,GAAGC,GAAwD,CAC/F,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,SAAkB,KAAnB,CACE,YAAU,WACV,UAAWC,EAAAA,GACT,mVACAQ,CACF,EACA,GAAID,EAEJ,SAAA,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,SAAkB,UAAnB,CAA6B,YAAU,qBAAqB,UAAU,kBACpE,SAAA,iBAAA,EAAAK,EAAA,IAAA,CAACH,EAAAA,MAAD,CAAW,UAAU,aAAe,CAAA,CACT,CAAA,CACP,CAAA,CAE5B"}
1
+ {"version":3,"file":"Checkbox.cjs","names":["CheckboxPrimitive","cn","CheckIcon","require_cn","radix_ui","react_jsx_runtime","lucide_react","Checkbox","props","className"],"sources":["../../../src/components/Checkbox.tsx"],"sourcesContent":["import { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { CheckIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/** A box that is on, off, or indeterminate; the tick is the accent on the deep well. */\nexport function Checkbox({ className, ...props }: ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-sm border border-po-border bg-po-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-po-green data-[state=indeterminate]:border-po-green',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator data-slot=\"checkbox-indicator\" className=\"text-po-green\">\n <CheckIcon className=\"h-2.5 w-2.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n"],"mappings":"kJAOA,SAAgBO,EAAS,CAAE,YAAW,GAAGC,GAAwD,CAC/F,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,SAAkB,KAAnB,CACE,YAAU,WACV,UAAWC,EAAAA,GACT,yUACAQ,CACF,EACA,GAAID,EAEJ,SAAA,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,SAAkB,UAAnB,CAA6B,YAAU,qBAAqB,UAAU,gBACpE,SAAA,iBAAA,EAAAK,EAAA,IAAA,CAACH,EAAAA,MAAD,CAAW,UAAU,aAAe,CAAA,CACT,CAAA,CACP,CAAA,CAE5B"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/fenceGrammar.cjs"),t=require("./CopyButton.cjs"),n=require("./SyntaxText.cjs"),r=require("./MermaidDiagram.cjs");let i=require("react/jsx-runtime");function a({text:a,className:o}){let s=e.fenceLanguageOf(o),c=s===`mermaid`?/* @__PURE__ */ (0,i.jsx)(r.MermaidDiagram,{code:a}):/* @__PURE__ */ (0,i.jsx)(n.SyntaxText,{text:a,grammar:e.fenceGrammarOf(s),className:`overflow-x-auto text-sm leading-relaxed text-doom-text`});return/* @__PURE__ */ (0,i.jsxs)(`div`,{"data-slot":`code-block`,"data-language":s??``,className:`relative rounded border border-doom-border bg-doom-deep p-2.5`,children:[c,/* @__PURE__ */ (0,i.jsx)(t.CopyButton,{text:a,className:`absolute top-1.5 right-1.5`})]})}exports.CodeBlock=a;
1
+ const e=require("../lib/fenceGrammar.cjs"),t=require("./CopyButton.cjs"),n=require("./SyntaxText.cjs"),r=require("./MermaidDiagram.cjs");let i=require("react/jsx-runtime");function a({text:a,className:o}){let s=e.fenceLanguageOf(o),c=s===`mermaid`?/* @__PURE__ */ (0,i.jsx)(r.MermaidDiagram,{code:a}):/* @__PURE__ */ (0,i.jsx)(n.SyntaxText,{text:a,grammar:e.fenceGrammarOf(s),className:`overflow-x-auto text-sm leading-relaxed text-po-text`});return/* @__PURE__ */ (0,i.jsxs)(`div`,{"data-slot":`code-block`,"data-language":s??``,className:`relative rounded border border-po-border bg-po-deep p-2.5`,children:[c,/* @__PURE__ */ (0,i.jsx)(t.CopyButton,{text:a,className:`absolute top-1.5 right-1.5`})]})}exports.CodeBlock=a;
2
2
  //# sourceMappingURL=CodeBlock.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.cjs","names":["fenceLanguageOf","MermaidDiagram","SyntaxText","fenceGrammarOf","CopyButton","require_fenceGrammar","require_CopyButton","require_SyntaxText","require_MermaidDiagram","react_jsx_runtime","CodeBlock","language","className","body","text"],"sources":["../../../src/components/CodeBlock.tsx"],"sourcesContent":["import { fenceGrammarOf, fenceLanguageOf, MERMAID_LANGUAGE } from '../lib/fenceGrammar';\nimport { CopyButton } from './CopyButton';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { SyntaxText } from './SyntaxText';\n\n/**\n * A fenced code block: coloured, copyable, and a picture when it is mermaid.\n *\n * DESIGN PATTERNS:\n * - The fence's own word picks the grammar, and an unknown word means plain\n * text rather than a guess at the wrong language.\n * - Colour and the diagram both arrive asynchronously, so the block always has\n * the source on screen from the first frame of a streaming reply.\n *\n * AVOID:\n * - Reading the language anywhere but the fence. A block in a message has no\n * path, and guessing from the body colours prose as code.\n */\n\nexport interface CodeBlockProps {\n /** The block's source, without the fence lines. */\n text: string;\n /** The `language-*` class react-markdown puts on the inner <code>. */\n className?: string | undefined;\n}\n\nexport function CodeBlock({ text, className }: CodeBlockProps) {\n const language = fenceLanguageOf(className);\n const body =\n language === MERMAID_LANGUAGE ? (\n <MermaidDiagram code={text} />\n ) : (\n <SyntaxText\n text={text}\n grammar={fenceGrammarOf(language)}\n className=\"overflow-x-auto text-sm leading-relaxed text-doom-text\"\n />\n );\n return (\n <div\n data-slot=\"code-block\"\n data-language={language ?? ''}\n className=\"relative rounded border border-doom-border bg-doom-deep p-2.5\"\n >\n {body}\n <CopyButton text={text} className=\"absolute top-1.5 right-1.5\" />\n </div>\n );\n}\n"],"mappings":"4KA0BA,SAAgBU,EAAU,CAAE,OAAM,aAA6B,CAC7D,IAAMC,EAAWX,EAAAA,gBAAgBY,CAAS,EACpCC,EACJF,IAAA,UACE,iBAAA,EAAAF,EAAA,IAAA,CAACR,EAAAA,eAAD,CAAgB,KAAMa,CAAO,CAAA,EAE7B,iBAAA,EAAAL,EAAA,IAAA,CAACP,EAAAA,WAAD,CACQ,OACN,QAASC,EAAAA,eAAeQ,CAAQ,EAChC,UAAU,wDACX,CAAA,EAEL,MACE,iBAAA,EAAAF,EAAA,KAAA,CAAC,MAAD,CACE,YAAU,aACV,gBAAeE,GAAY,GAC3B,UAAU,gEAHZ,SAAA,CAKGE,EACD,iBAAA,EAAAJ,EAAA,IAAA,CAACL,EAAAA,WAAD,CAAkB,OAAM,UAAU,4BAA8B,CAAA,CAC7D,GAET"}
1
+ {"version":3,"file":"CodeBlock.cjs","names":["fenceLanguageOf","MermaidDiagram","SyntaxText","fenceGrammarOf","CopyButton","require_fenceGrammar","require_CopyButton","require_SyntaxText","require_MermaidDiagram","react_jsx_runtime","CodeBlock","language","className","body","text"],"sources":["../../../src/components/CodeBlock.tsx"],"sourcesContent":["import { fenceGrammarOf, fenceLanguageOf, MERMAID_LANGUAGE } from '../lib/fenceGrammar';\nimport { CopyButton } from './CopyButton';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { SyntaxText } from './SyntaxText';\n\n/**\n * A fenced code block: coloured, copyable, and a picture when it is mermaid.\n *\n * DESIGN PATTERNS:\n * - The fence's own word picks the grammar, and an unknown word means plain\n * text rather than a guess at the wrong language.\n * - Colour and the diagram both arrive asynchronously, so the block always has\n * the source on screen from the first frame of a streaming reply.\n *\n * AVOID:\n * - Reading the language anywhere but the fence. A block in a message has no\n * path, and guessing from the body colours prose as code.\n */\n\nexport interface CodeBlockProps {\n /** The block's source, without the fence lines. */\n text: string;\n /** The `language-*` class react-markdown puts on the inner <code>. */\n className?: string | undefined;\n}\n\nexport function CodeBlock({ text, className }: CodeBlockProps) {\n const language = fenceLanguageOf(className);\n const body =\n language === MERMAID_LANGUAGE ? (\n <MermaidDiagram code={text} />\n ) : (\n <SyntaxText\n text={text}\n grammar={fenceGrammarOf(language)}\n className=\"overflow-x-auto text-sm leading-relaxed text-po-text\"\n />\n );\n return (\n <div\n data-slot=\"code-block\"\n data-language={language ?? ''}\n className=\"relative rounded border border-po-border bg-po-deep p-2.5\"\n >\n {body}\n <CopyButton text={text} className=\"absolute top-1.5 right-1.5\" />\n </div>\n );\n}\n"],"mappings":"4KA0BA,SAAgBU,EAAU,CAAE,OAAM,aAA6B,CAC7D,IAAMC,EAAWX,EAAAA,gBAAgBY,CAAS,EACpCC,EACJF,IAAA,UACE,iBAAA,EAAAF,EAAA,IAAA,CAACR,EAAAA,eAAD,CAAgB,KAAMa,CAAO,CAAA,EAE7B,iBAAA,EAAAL,EAAA,IAAA,CAACP,EAAAA,WAAD,CACQ,OACN,QAASC,EAAAA,eAAeQ,CAAQ,EAChC,UAAU,sDACX,CAAA,EAEL,MACE,iBAAA,EAAAF,EAAA,KAAA,CAAC,MAAD,CACE,YAAU,aACV,gBAAeE,GAAY,GAC3B,UAAU,4DAHZ,SAAA,CAKGE,EACD,iBAAA,EAAAJ,EAAA,IAAA,CAACL,EAAAA,WAAD,CAAkB,OAAM,UAAU,4BAA8B,CAAA,CAC7D,GAET"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs"),t=require("../lib/editorLanguage.cjs"),n=require("../lib/editorTheme.cjs"),r=require("../lib/editorController.cjs");let i=require("react/jsx-runtime"),a=require("react"),o=require("@codemirror/commands"),s=require("@codemirror/language"),c=require("@codemirror/search"),l=require("@codemirror/state"),u=require("@codemirror/view"),d=require("@lezer/highlight");function f(e,t,n){let r=Math.min(t,n),i=Math.max(t,n);return{text:e.state.sliceDoc(r,i),from:r,to:i,startLine:e.state.doc.lineAt(r).number,endLine:e.state.doc.lineAt(i).number}}function p(e,t){let n=e.posAtCoords({x:t.left,y:t.top}),r=e.posAtCoords({x:t.right,y:t.bottom});return n===null||r===null?null:f(e,n,r)}const m=u.EditorView.theme(n.DOOM_EDITOR_STYLES),h=s.HighlightStyle.define([{tag:d.tags.comment,...n.DOOM_SYNTAX_STYLES.comment},{tag:d.tags.keyword,...n.DOOM_SYNTAX_STYLES.keyword},{tag:[d.tags.atom,d.tags.bool,d.tags.null,d.tags.self],...n.DOOM_SYNTAX_STYLES.constant},{tag:d.tags.number,...n.DOOM_SYNTAX_STYLES.literal},{tag:[d.tags.string,d.tags.special(d.tags.string),d.tags.character],...n.DOOM_SYNTAX_STYLES.string},{tag:d.tags.regexp,...n.DOOM_SYNTAX_STYLES.regexp},{tag:d.tags.operator,...n.DOOM_SYNTAX_STYLES.operator},{tag:d.tags.punctuation,...n.DOOM_SYNTAX_STYLES.punctuation},{tag:d.tags.variableName,...n.DOOM_SYNTAX_STYLES.variable},{tag:d.tags.propertyName,...n.DOOM_SYNTAX_STYLES.property},{tag:[d.tags.function(d.tags.variableName),d.tags.function(d.tags.propertyName)],...n.DOOM_SYNTAX_STYLES.callable},{tag:[d.tags.typeName,d.tags.className,d.tags.namespace],...n.DOOM_SYNTAX_STYLES.type},{tag:d.tags.tagName,...n.DOOM_SYNTAX_STYLES.tag},{tag:d.tags.attributeName,...n.DOOM_SYNTAX_STYLES.attribute},{tag:[d.tags.meta,d.tags.processingInstruction],...n.DOOM_SYNTAX_STYLES.meta},{tag:d.tags.heading,...n.DOOM_SYNTAX_STYLES.heading},{tag:[d.tags.link,d.tags.url],...n.DOOM_SYNTAX_STYLES.link},{tag:d.tags.emphasis,...n.DOOM_SYNTAX_STYLES.emphasis},{tag:d.tags.strong,...n.DOOM_SYNTAX_STYLES.strong},{tag:d.tags.strikethrough,...n.DOOM_SYNTAX_STYLES.strikethrough},{tag:d.tags.invalid,...n.DOOM_SYNTAX_STYLES.invalid}]),g=l.StateEffect.define(),_=l.StateField.define({create:()=>u.Decoration.none,update:(e,t)=>{let n=e.map(t.changes);for(let e of t.effects)e.is(g)&&(n=e.value);return n},provide:e=>u.EditorView.decorations.from(e)}),v=l.StateEffect.define(),y=l.StateField.define({create:()=>u.Decoration.none,update:(e,t)=>{let n=e.map(t.changes);for(let e of t.effects)e.is(v)&&(n=e.value);return n},provide:e=>u.EditorView.decorations.from(e)});var b=class extends u.WidgetType{label;constructor(e){super(),this.label=e}eq(e){return e.label===this.label}toDOM(){let e=document.createElement(`span`);return e.className=`cm-marked-region-label`,e.dataset.authorRegionLabel=this.label,e.textContent=this.label,e}};const x=u.EditorView.baseTheme({".cm-marked-region":{backgroundColor:`var(--doom-tint-yellow)`,borderBottom:`1px solid var(--doom-edge-yellow)`},".cm-marked-region-label":{display:`inline-flex`,alignItems:`center`,justifyContent:`center`,minWidth:`16px`,height:`16px`,marginRight:`4px`,borderRadius:`999px`,backgroundColor:`var(--doom-yellow)`,color:`var(--doom-deep)`,fontSize:`9px`,fontWeight:`700`,lineHeight:`1`,verticalAlign:`text-bottom`}}),S=[(0,u.lineNumbers)(),(0,u.highlightActiveLineGutter)(),(0,s.foldGutter)(),(0,u.highlightActiveLine)(),(0,u.drawSelection)(),(0,u.rectangularSelection)(),(0,s.indentOnInput)(),(0,s.bracketMatching)(),(0,o.history)(),(0,c.search)({top:!0}),(0,c.highlightSelectionMatches)(),u.keymap.of([...o.defaultKeymap,...o.historyKeymap,...c.searchKeymap,...s.foldKeymap,o.indentWithTab]),(0,s.syntaxHighlighting)(h),_,y,x,m];function C({value:n,path:o,readOnly:s=!1,lineWrapping:c=!0,className:d,onChange:m,onSelect:h,controllerRef:_,"data-testid":y}){let x=(0,a.useRef)(null),C=(0,a.useRef)(null),w=(0,a.useRef)({onChange:m,onSelect:h}),T=(0,a.useRef)(n),E=(0,a.useRef)({language:new l.Compartment,readOnly:new l.Compartment,wrapping:new l.Compartment});return(0,a.useEffect)(()=>{w.current={onChange:m,onSelect:h}}),(0,a.useLayoutEffect)(()=>{let e=x.current;if(e===null)return;let{language:t,readOnly:n,wrapping:r}=E.current,i=new u.EditorView({parent:e,state:l.EditorState.create({doc:T.current,extensions:[...S,t.of([]),n.of([]),r.of([]),u.EditorView.updateListener.of(e=>{if(e.docChanged&&w.current.onChange?.(e.state.doc.toString()),!e.selectionSet&&!e.docChanged)return;let t=w.current.onSelect;if(t===void 0)return;let n=e.state.selection.main;t(f(e.view,n.from,n.to))})]})});return C.current=i,()=>{i.destroy(),C.current=null}},[]),(0,a.useImperativeHandle)(_,()=>({focus:()=>C.current?.focus(),revealAndSelect:e=>{let t=C.current;if(t===null)return;let[n]=r.boundedEditorRanges(t.state.doc.length,[e]);n!==void 0&&t.dispatch({selection:{anchor:n.from,head:n.to},effects:u.EditorView.scrollIntoView(n.from,{y:`center`})})},applyEdits:e=>{let t=C.current;t!==null&&e.length!==0&&t.dispatch({changes:r.boundedEditorEdits(t.state.doc.length,e)})},setClosedRanges:e=>{let t=C.current;if(t===null)return;let n=r.boundedEditorRanges(t.state.doc.length,e).map(e=>e.from===e.to?u.Decoration.line({attributes:{class:`cm-closed-tone`,"data-tone":`closed`}}).range(t.state.doc.lineAt(e.from).from):u.Decoration.mark({class:`cm-closed-tone`,attributes:{"data-tone":`closed`}}).range(e.from,e.to));t.dispatch({effects:g.of(u.Decoration.set(n))})},setMarkedRanges:e=>{let t=C.current;if(t===null)return;let n=e.flatMap(e=>{let[n]=r.boundedEditorRanges(t.state.doc.length,[e]);return n===void 0||n.from===n.to?[]:[u.Decoration.widget({widget:new b(e.label),side:-1}).range(n.from),u.Decoration.mark({class:`cm-marked-region`,attributes:{"data-author-region":e.label}}).range(n.from,n.to)]});t.dispatch({effects:v.of(u.Decoration.set(n,!0))})},resolveViewportRegion:e=>{let t=C.current;return t===null?null:p(t,e)}}),[]),(0,a.useEffect)(()=>{let e=C.current;e!==null&&e.state.doc.toString()!==n&&e.dispatch({changes:{from:0,to:e.state.doc.length,insert:n}})},[n]),(0,a.useEffect)(()=>{C.current?.dispatch({effects:E.current.readOnly.reconfigure([l.EditorState.readOnly.of(s),u.EditorView.editable.of(!s)])})},[s]),(0,a.useEffect)(()=>{C.current?.dispatch({effects:E.current.wrapping.reconfigure(c?u.EditorView.lineWrapping:[])})},[c]),(0,a.useEffect)(()=>{let e=o===void 0?void 0:t.grammarKeyOf(o),{language:n}=E.current;if(e===void 0){C.current?.dispatch({effects:n.reconfigure([])});return}let r=!1;return t.loadGrammar(e).then(e=>{r||C.current?.dispatch({effects:n.reconfigure(e)})}).catch(()=>{r||C.current?.dispatch({effects:n.reconfigure([])})}),()=>{r=!0}},[o]),/* @__PURE__ */ (0,i.jsx)(`div`,{ref:x,"data-testid":y,className:e.cn(`min-h-0 overflow-hidden`,d)})}exports.CodeEditorView=C,exports.resolveEditorViewportRegion=p;
1
+ const e=require("../lib/cn.cjs"),t=require("../lib/editorLanguage.cjs"),n=require("../lib/editorTheme.cjs"),r=require("../lib/editorController.cjs");let i=require("react/jsx-runtime"),a=require("react"),o=require("@codemirror/commands"),s=require("@codemirror/language"),c=require("@codemirror/search"),l=require("@codemirror/state"),u=require("@codemirror/view"),d=require("@lezer/highlight");function f(e,t,n){let r=Math.min(t,n),i=Math.max(t,n);return{text:e.state.sliceDoc(r,i),from:r,to:i,startLine:e.state.doc.lineAt(r).number,endLine:e.state.doc.lineAt(i).number}}function p(e,t){let n=e.posAtCoords({x:t.left,y:t.top}),r=e.posAtCoords({x:t.right,y:t.bottom});return n===null||r===null?null:f(e,n,r)}const m=u.EditorView.theme(n.PO_EDITOR_STYLES),h=s.HighlightStyle.define([{tag:d.tags.comment,...n.PO_SYNTAX_STYLES.comment},{tag:d.tags.keyword,...n.PO_SYNTAX_STYLES.keyword},{tag:[d.tags.atom,d.tags.bool,d.tags.null,d.tags.self],...n.PO_SYNTAX_STYLES.constant},{tag:d.tags.number,...n.PO_SYNTAX_STYLES.literal},{tag:[d.tags.string,d.tags.special(d.tags.string),d.tags.character],...n.PO_SYNTAX_STYLES.string},{tag:d.tags.regexp,...n.PO_SYNTAX_STYLES.regexp},{tag:d.tags.operator,...n.PO_SYNTAX_STYLES.operator},{tag:d.tags.punctuation,...n.PO_SYNTAX_STYLES.punctuation},{tag:d.tags.variableName,...n.PO_SYNTAX_STYLES.variable},{tag:d.tags.propertyName,...n.PO_SYNTAX_STYLES.property},{tag:[d.tags.function(d.tags.variableName),d.tags.function(d.tags.propertyName)],...n.PO_SYNTAX_STYLES.callable},{tag:[d.tags.typeName,d.tags.className,d.tags.namespace],...n.PO_SYNTAX_STYLES.type},{tag:d.tags.tagName,...n.PO_SYNTAX_STYLES.tag},{tag:d.tags.attributeName,...n.PO_SYNTAX_STYLES.attribute},{tag:[d.tags.meta,d.tags.processingInstruction],...n.PO_SYNTAX_STYLES.meta},{tag:d.tags.heading,...n.PO_SYNTAX_STYLES.heading},{tag:[d.tags.link,d.tags.url],...n.PO_SYNTAX_STYLES.link},{tag:d.tags.emphasis,...n.PO_SYNTAX_STYLES.emphasis},{tag:d.tags.strong,...n.PO_SYNTAX_STYLES.strong},{tag:d.tags.strikethrough,...n.PO_SYNTAX_STYLES.strikethrough},{tag:d.tags.invalid,...n.PO_SYNTAX_STYLES.invalid}]),g=l.StateEffect.define(),_=l.StateField.define({create:()=>u.Decoration.none,update:(e,t)=>{let n=e.map(t.changes);for(let e of t.effects)e.is(g)&&(n=e.value);return n},provide:e=>u.EditorView.decorations.from(e)}),v=l.StateEffect.define(),y=l.StateField.define({create:()=>u.Decoration.none,update:(e,t)=>{let n=e.map(t.changes);for(let e of t.effects)e.is(v)&&(n=e.value);return n},provide:e=>u.EditorView.decorations.from(e)});var b=class extends u.WidgetType{label;constructor(e){super(),this.label=e}eq(e){return e.label===this.label}toDOM(){let e=document.createElement(`span`);return e.className=`cm-marked-region-label`,e.dataset.authorRegionLabel=this.label,e.textContent=this.label,e}};const x=u.EditorView.baseTheme({".cm-marked-region":{backgroundColor:`var(--po-tint-yellow)`,borderBottom:`1px solid var(--po-edge-yellow)`},".cm-marked-region-label":{display:`inline-flex`,alignItems:`center`,justifyContent:`center`,minWidth:`16px`,height:`16px`,marginRight:`4px`,borderRadius:`999px`,backgroundColor:`var(--po-yellow)`,color:`var(--po-deep)`,fontSize:`9px`,fontWeight:`700`,lineHeight:`1`,verticalAlign:`text-bottom`}}),S=[(0,u.lineNumbers)(),(0,u.highlightActiveLineGutter)(),(0,s.foldGutter)(),(0,u.highlightActiveLine)(),(0,u.drawSelection)(),(0,u.rectangularSelection)(),(0,s.indentOnInput)(),(0,s.bracketMatching)(),(0,o.history)(),(0,c.search)({top:!0}),(0,c.highlightSelectionMatches)(),u.keymap.of([...o.defaultKeymap,...o.historyKeymap,...c.searchKeymap,...s.foldKeymap,o.indentWithTab]),(0,s.syntaxHighlighting)(h),_,y,x,m];function C({value:n,path:o,readOnly:s=!1,lineWrapping:c=!0,className:d,onChange:m,onSelect:h,controllerRef:_,"data-testid":y}){let x=(0,a.useRef)(null),C=(0,a.useRef)(null),w=(0,a.useRef)({onChange:m,onSelect:h}),T=(0,a.useRef)(n),E=(0,a.useRef)({language:new l.Compartment,readOnly:new l.Compartment,wrapping:new l.Compartment});return(0,a.useEffect)(()=>{w.current={onChange:m,onSelect:h}}),(0,a.useLayoutEffect)(()=>{let e=x.current;if(e===null)return;let{language:t,readOnly:n,wrapping:r}=E.current,i=new u.EditorView({parent:e,state:l.EditorState.create({doc:T.current,extensions:[...S,t.of([]),n.of([]),r.of([]),u.EditorView.updateListener.of(e=>{if(e.docChanged&&w.current.onChange?.(e.state.doc.toString()),!e.selectionSet&&!e.docChanged)return;let t=w.current.onSelect;if(t===void 0)return;let n=e.state.selection.main;t(f(e.view,n.from,n.to))})]})});return C.current=i,()=>{i.destroy(),C.current=null}},[]),(0,a.useImperativeHandle)(_,()=>({focus:()=>C.current?.focus(),revealAndSelect:e=>{let t=C.current;if(t===null)return;let[n]=r.boundedEditorRanges(t.state.doc.length,[e]);n!==void 0&&t.dispatch({selection:{anchor:n.from,head:n.to},effects:u.EditorView.scrollIntoView(n.from,{y:`center`})})},applyEdits:e=>{let t=C.current;t!==null&&e.length!==0&&t.dispatch({changes:r.boundedEditorEdits(t.state.doc.length,e)})},setClosedRanges:e=>{let t=C.current;if(t===null)return;let n=r.boundedEditorRanges(t.state.doc.length,e).map(e=>e.from===e.to?u.Decoration.line({attributes:{class:`cm-closed-tone`,"data-tone":`closed`}}).range(t.state.doc.lineAt(e.from).from):u.Decoration.mark({class:`cm-closed-tone`,attributes:{"data-tone":`closed`}}).range(e.from,e.to));t.dispatch({effects:g.of(u.Decoration.set(n))})},setMarkedRanges:e=>{let t=C.current;if(t===null)return;let n=e.flatMap(e=>{let[n]=r.boundedEditorRanges(t.state.doc.length,[e]);return n===void 0||n.from===n.to?[]:[u.Decoration.widget({widget:new b(e.label),side:-1}).range(n.from),u.Decoration.mark({class:`cm-marked-region`,attributes:{"data-author-region":e.label}}).range(n.from,n.to)]});t.dispatch({effects:v.of(u.Decoration.set(n,!0))})},resolveViewportRegion:e=>{let t=C.current;return t===null?null:p(t,e)}}),[]),(0,a.useEffect)(()=>{let e=C.current;e!==null&&e.state.doc.toString()!==n&&e.dispatch({changes:{from:0,to:e.state.doc.length,insert:n}})},[n]),(0,a.useEffect)(()=>{C.current?.dispatch({effects:E.current.readOnly.reconfigure([l.EditorState.readOnly.of(s),u.EditorView.editable.of(!s)])})},[s]),(0,a.useEffect)(()=>{C.current?.dispatch({effects:E.current.wrapping.reconfigure(c?u.EditorView.lineWrapping:[])})},[c]),(0,a.useEffect)(()=>{let e=o===void 0?void 0:t.grammarKeyOf(o),{language:n}=E.current;if(e===void 0){C.current?.dispatch({effects:n.reconfigure([])});return}let r=!1;return t.loadGrammar(e).then(e=>{r||C.current?.dispatch({effects:n.reconfigure(e)})}).catch(()=>{r||C.current?.dispatch({effects:n.reconfigure([])})}),()=>{r=!0}},[o]),/* @__PURE__ */ (0,i.jsx)(`div`,{ref:x,"data-testid":y,className:e.cn(`min-h-0 overflow-hidden`,d)})}exports.CodeEditorView=C,exports.resolveEditorViewportRegion=p;
2
2
  //# sourceMappingURL=CodeEditorView.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditorView.cjs","names":["EditorView","DOOM_EDITOR_STYLES","HighlightStyle","tags","DOOM_SYNTAX_STYLES","StateEffect","StateField","Decoration","WidgetType","lineNumbers","highlightActiveLineGutter","foldGutter","highlightActiveLine","drawSelection","rectangularSelection","indentOnInput","bracketMatching","history","search","highlightSelectionMatches","keymap","defaultKeymap","historyKeymap","searchKeymap","foldKeymap","indentWithTab","syntaxHighlighting","useRef","Compartment","EditorState","boundedEditorRanges","boundedEditorEdits","grammarKeyOf","loadGrammar","cn","require_cn","require_editorLanguage","require_editorTheme","require_editorController","react_jsx_runtime","react","_codemirror_commands","_codemirror_language","_codemirror_search","_codemirror_state","_codemirror_view","_lezer_highlight","selectionRange","start","from","to","end","editor","resolveEditorViewportRegion","rectangle","DOOM_THEME","DOOM_HIGHLIGHT","setClosedDecorations","closedDecorations","next","decorations","transaction","effect","field","setMarkedDecorations","markedDecorations","MarkedRangeLabel","label","other","MARKED_REGION_THEME","FIXED_EXTENSIONS","CodeEditorView","testId","host","view","handlers","initialValue","value","compartments","parent","readOnlyPart","language","wrapping","update","report","range","controllerRef","bounded","edits","ranges","readOnly","lineWrapping","key","path","cancelled","grammar","className"],"sources":["../../../src/components/CodeEditorView.tsx"],"sourcesContent":["import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport {\n bracketMatching,\n foldGutter,\n foldKeymap,\n HighlightStyle,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language';\nimport { highlightSelectionMatches, search, searchKeymap } from '@codemirror/search';\nimport { Compartment, EditorState, StateEffect, StateField } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n drawSelection,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n keymap,\n lineNumbers,\n rectangularSelection,\n WidgetType,\n} from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { boundedEditorEdits, boundedEditorRanges } from '../lib/editorController';\nimport { grammarKeyOf, loadGrammar } from '../lib/editorLanguage';\nimport { DOOM_EDITOR_STYLES, DOOM_SYNTAX_STYLES } from '../lib/editorTheme';\nimport type { CodeEditorProps, EditorSelectionRange, EditorViewportRectangle } from '../types/editor';\n\nfunction selectionRange(editor: { readonly state: EditorState }, from: number, to: number): EditorSelectionRange {\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n return {\n text: editor.state.sliceDoc(start, end),\n from: start,\n to: end,\n startLine: editor.state.doc.lineAt(start).number,\n endLine: editor.state.doc.lineAt(end).number,\n };\n}\n\nexport function resolveEditorViewportRegion(\n editor: {\n readonly state: EditorState;\n posAtCoords(coords: { x: number; y: number }): number | null;\n },\n rectangle: EditorViewportRectangle,\n): EditorSelectionRange | null {\n const start = editor.posAtCoords({ x: rectangle.left, y: rectangle.top });\n const end = editor.posAtCoords({ x: rectangle.right, y: rectangle.bottom });\n if (start === null || end === null) return null;\n return selectionRange(editor, start, end);\n}\n/**\n * The editor itself, mounted on a real CodeMirror view.\n *\n * Nothing imports this module directly: `CodeEditor` reaches it through a lazy\n * import so the whole editor, and every grammar under it, stays out of the\n * cockpit's first load. Behaviour lives here rather than in that wrapper so\n * the split costs one file and no indirection.\n *\n * The three things a caller can change after mount each sit in their own\n * compartment. Reconfiguring one is a transaction; rebuilding the editor would\n * throw away the undo history, the scroll position and the cursor, which is\n * what a reader loses if a parent re-render is allowed to remount this.\n */\n\n/** Not a colour or a layout choice: how CodeMirror is told to draw the doom palette. */\nconst DOOM_THEME = EditorView.theme(DOOM_EDITOR_STYLES);\n\nconst DOOM_HIGHLIGHT = HighlightStyle.define([\n { tag: tags.comment, ...DOOM_SYNTAX_STYLES.comment },\n { tag: tags.keyword, ...DOOM_SYNTAX_STYLES.keyword },\n { tag: [tags.atom, tags.bool, tags.null, tags.self], ...DOOM_SYNTAX_STYLES.constant },\n { tag: tags.number, ...DOOM_SYNTAX_STYLES.literal },\n { tag: [tags.string, tags.special(tags.string), tags.character], ...DOOM_SYNTAX_STYLES.string },\n { tag: tags.regexp, ...DOOM_SYNTAX_STYLES.regexp },\n { tag: tags.operator, ...DOOM_SYNTAX_STYLES.operator },\n { tag: tags.punctuation, ...DOOM_SYNTAX_STYLES.punctuation },\n { tag: tags.variableName, ...DOOM_SYNTAX_STYLES.variable },\n { tag: tags.propertyName, ...DOOM_SYNTAX_STYLES.property },\n { tag: [tags.function(tags.variableName), tags.function(tags.propertyName)], ...DOOM_SYNTAX_STYLES.callable },\n { tag: [tags.typeName, tags.className, tags.namespace], ...DOOM_SYNTAX_STYLES.type },\n { tag: tags.tagName, ...DOOM_SYNTAX_STYLES.tag },\n { tag: tags.attributeName, ...DOOM_SYNTAX_STYLES.attribute },\n { tag: [tags.meta, tags.processingInstruction], ...DOOM_SYNTAX_STYLES.meta },\n { tag: tags.heading, ...DOOM_SYNTAX_STYLES.heading },\n { tag: [tags.link, tags.url], ...DOOM_SYNTAX_STYLES.link },\n { tag: tags.emphasis, ...DOOM_SYNTAX_STYLES.emphasis },\n { tag: tags.strong, ...DOOM_SYNTAX_STYLES.strong },\n { tag: tags.strikethrough, ...DOOM_SYNTAX_STYLES.strikethrough },\n { tag: tags.invalid, ...DOOM_SYNTAX_STYLES.invalid },\n]);\n\nconst setClosedDecorations = StateEffect.define<DecorationSet>();\nconst closedDecorations = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update: (decorations, transaction) => {\n let next = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (effect.is(setClosedDecorations)) next = effect.value;\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nconst setMarkedDecorations = StateEffect.define<DecorationSet>();\nconst markedDecorations = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update: (decorations, transaction) => {\n let next = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (effect.is(setMarkedDecorations)) next = effect.value;\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nclass MarkedRangeLabel extends WidgetType {\n constructor(private readonly label: string) {\n super();\n }\n\n eq(other: MarkedRangeLabel): boolean {\n return other.label === this.label;\n }\n\n toDOM(): HTMLElement {\n const label = document.createElement('span');\n label.className = 'cm-marked-region-label';\n label.dataset.authorRegionLabel = this.label;\n label.textContent = this.label;\n return label;\n }\n}\n\nconst MARKED_REGION_THEME = EditorView.baseTheme({\n '.cm-marked-region': {\n backgroundColor: 'var(--doom-tint-yellow)',\n borderBottom: '1px solid var(--doom-edge-yellow)',\n },\n '.cm-marked-region-label': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '16px',\n height: '16px',\n marginRight: '4px',\n borderRadius: '999px',\n backgroundColor: 'var(--doom-yellow)',\n color: 'var(--doom-deep)',\n fontSize: '9px',\n fontWeight: '700',\n lineHeight: '1',\n verticalAlign: 'text-bottom',\n },\n});\n\n/** Everything that never changes for the life of an editor. */\nconst FIXED_EXTENSIONS = [\n lineNumbers(),\n highlightActiveLineGutter(),\n foldGutter(),\n highlightActiveLine(),\n drawSelection(),\n rectangularSelection(),\n indentOnInput(),\n bracketMatching(),\n history(),\n search({ top: true }),\n highlightSelectionMatches(),\n // Tab indents rather than leaving the editor. That trades a keyboard user's\n // escape route for the behaviour every other editor has, so it is last in\n // the keymap and Escape then Tab still moves focus out.\n keymap.of([...defaultKeymap, ...historyKeymap, ...searchKeymap, ...foldKeymap, indentWithTab]),\n syntaxHighlighting(DOOM_HIGHLIGHT),\n closedDecorations,\n markedDecorations,\n MARKED_REGION_THEME,\n DOOM_THEME,\n];\n\nexport function CodeEditorView({\n value,\n path,\n readOnly = false,\n lineWrapping = true,\n className,\n onChange,\n onSelect,\n controllerRef,\n 'data-testid': testId,\n}: CodeEditorProps) {\n const host = useRef<HTMLDivElement>(null);\n const view = useRef<EditorView | null>(null);\n // The callbacks are new objects on every parent render. Reading them through\n // a ref is what lets the editor be built once and still call the current\n // pair, rather than being rebuilt whenever the parent re-renders.\n const handlers = useRef({ onChange, onSelect });\n // The document is seeded once from the value of the first render; the sync effect\n // below owns every later change.\n const initialValue = useRef(value);\n const compartments = useRef({\n language: new Compartment(),\n readOnly: new Compartment(),\n wrapping: new Compartment(),\n });\n\n useEffect(() => {\n handlers.current = { onChange, onSelect };\n });\n\n useLayoutEffect(() => {\n const parent = host.current;\n if (parent === null) return;\n const { language, readOnly: readOnlyPart, wrapping } = compartments.current;\n const editor = new EditorView({\n parent,\n state: EditorState.create({\n // The initial document only; every later change arrives as a\n // transaction from the effect below.\n doc: initialValue.current,\n extensions: [\n ...FIXED_EXTENSIONS,\n language.of([]),\n readOnlyPart.of([]),\n wrapping.of([]),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) handlers.current.onChange?.(update.state.doc.toString());\n if (!update.selectionSet && !update.docChanged) return;\n const report = handlers.current.onSelect;\n if (report === undefined) return;\n const range = update.state.selection.main;\n report(selectionRange(update.view, range.from, range.to));\n }),\n ],\n }),\n });\n view.current = editor;\n return () => {\n editor.destroy();\n view.current = null;\n };\n // Built once.\n }, []);\n\n useImperativeHandle(\n controllerRef,\n () => ({\n focus: () => view.current?.focus(),\n revealAndSelect: (range) => {\n const editor = view.current;\n if (editor === null) return;\n const [bounded] = boundedEditorRanges(editor.state.doc.length, [range]);\n if (bounded === undefined) return;\n editor.dispatch({\n selection: { anchor: bounded.from, head: bounded.to },\n effects: EditorView.scrollIntoView(bounded.from, { y: 'center' }),\n });\n },\n applyEdits: (edits) => {\n const editor = view.current;\n if (editor === null || edits.length === 0) return;\n editor.dispatch({ changes: boundedEditorEdits(editor.state.doc.length, edits) });\n },\n setClosedRanges: (ranges) => {\n const editor = view.current;\n if (editor === null) return;\n const bounded = boundedEditorRanges(editor.state.doc.length, ranges);\n const decorations = bounded.map((range) =>\n range.from === range.to\n ? Decoration.line({ attributes: { class: 'cm-closed-tone', 'data-tone': 'closed' } }).range(\n editor.state.doc.lineAt(range.from).from,\n )\n : Decoration.mark({ class: 'cm-closed-tone', attributes: { 'data-tone': 'closed' } }).range(\n range.from,\n range.to,\n ),\n );\n editor.dispatch({ effects: setClosedDecorations.of(Decoration.set(decorations)) });\n },\n setMarkedRanges: (ranges) => {\n const editor = view.current;\n if (editor === null) return;\n const decorations = ranges.flatMap((range) => {\n const [bounded] = boundedEditorRanges(editor.state.doc.length, [range]);\n if (bounded === undefined || bounded.from === bounded.to) return [];\n return [\n Decoration.widget({ widget: new MarkedRangeLabel(range.label), side: -1 }).range(bounded.from),\n Decoration.mark({\n class: 'cm-marked-region',\n attributes: { 'data-author-region': range.label },\n }).range(bounded.from, bounded.to),\n ];\n });\n editor.dispatch({ effects: setMarkedDecorations.of(Decoration.set(decorations, true)) });\n },\n resolveViewportRegion: (rectangle) => {\n const editor = view.current;\n return editor === null ? null : resolveEditorViewportRegion(editor, rectangle);\n },\n }),\n [],\n );\n\n useEffect(() => {\n const editor = view.current;\n // A caller that echoes onChange back into `value` would otherwise replace\n // the document on every keystroke and drop the cursor to the end.\n if (editor === null || editor.state.doc.toString() === value) return;\n editor.dispatch({ changes: { from: 0, to: editor.state.doc.length, insert: value } });\n }, [value]);\n\n useEffect(() => {\n view.current?.dispatch({\n effects: compartments.current.readOnly.reconfigure([\n EditorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n }, [readOnly]);\n\n useEffect(() => {\n view.current?.dispatch({\n effects: compartments.current.wrapping.reconfigure(lineWrapping ? EditorView.lineWrapping : []),\n });\n }, [lineWrapping]);\n\n useEffect(() => {\n const key = path === undefined ? undefined : grammarKeyOf(path);\n const { language } = compartments.current;\n if (key === undefined) {\n view.current?.dispatch({ effects: language.reconfigure([]) });\n return;\n }\n let cancelled = false;\n void loadGrammar(key)\n .then((grammar) => {\n if (!cancelled) view.current?.dispatch({ effects: language.reconfigure(grammar) });\n })\n .catch(() => {\n // A grammar is a separate chunk over the network, and the cockpit is\n // often read through a tunnel. Losing it costs syntax colour, not the\n // file, so fall back to plain text rather than failing the pane.\n if (!cancelled) view.current?.dispatch({ effects: language.reconfigure([]) });\n });\n return () => {\n cancelled = true;\n };\n }, [path]);\n\n return <div ref={host} data-testid={testId} className={cn('min-h-0 overflow-hidden', className)} />;\n}\n"],"mappings":"0YAgCA,SAAS+C,EAAe,EAAyC,EAAc,EAAkC,CAC/G,IAAMC,EAAQ,KAAK,IAAIC,EAAMC,CAAE,EACzBC,EAAM,KAAK,IAAIF,EAAMC,CAAE,EAC7B,MAAO,CACL,KAAME,EAAO,MAAM,SAASJ,EAAOG,CAAG,EACtC,KAAMH,EACN,GAAIG,EACJ,UAAWC,EAAO,MAAM,IAAI,OAAOJ,CAAK,CAAC,CAAC,OAC1C,QAASI,EAAO,MAAM,IAAI,OAAOD,CAAG,CAAC,CAAC,MACxC,CACF,CAEA,SAAgBE,EACd,EAIA,EAC6B,CAC7B,IAAML,EAAQI,EAAO,YAAY,CAAE,EAAGE,EAAU,KAAM,EAAGA,EAAU,GAAI,CAAC,EAClEH,EAAMC,EAAO,YAAY,CAAE,EAAGE,EAAU,MAAO,EAAGA,EAAU,MAAO,CAAC,EAE1E,OADIN,IAAU,MAAQG,IAAQ,KAAa,KACpCJ,EAAeK,EAAQJ,EAAOG,CAAG,CAC1C,CAgBA,MAAMI,EAAavD,EAAAA,WAAW,MAAMC,EAAAA,kBAAkB,EAEhDuD,EAAiBtD,EAAAA,eAAe,OAAO,CAC3C,CAAE,IAAKC,EAAAA,KAAK,QAAS,GAAGC,EAAAA,mBAAmB,OAAQ,EACnD,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,mBAAmB,OAAQ,EACnD,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,KAAMA,EAAAA,KAAK,KAAMA,EAAAA,KAAK,IAAI,EAAG,GAAGC,EAAAA,mBAAmB,QAAS,EACpF,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,mBAAmB,OAAQ,EAClD,CAAE,IAAK,CAACD,EAAAA,KAAK,OAAQA,EAAAA,KAAK,QAAQA,EAAAA,KAAK,MAAM,EAAGA,EAAAA,KAAK,SAAS,EAAG,GAAGC,EAAAA,mBAAmB,MAAO,EAC9F,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,mBAAmB,MAAO,EACjD,CAAE,IAAKD,EAAAA,KAAK,SAAU,GAAGC,EAAAA,mBAAmB,QAAS,EACrD,CAAE,IAAKD,EAAAA,KAAK,YAAa,GAAGC,EAAAA,mBAAmB,WAAY,EAC3D,CAAE,IAAKD,EAAAA,KAAK,aAAc,GAAGC,EAAAA,mBAAmB,QAAS,EACzD,CAAE,IAAKD,EAAAA,KAAK,aAAc,GAAGC,EAAAA,mBAAmB,QAAS,EACzD,CAAE,IAAK,CAACD,EAAAA,KAAK,SAASA,EAAAA,KAAK,YAAY,EAAGA,EAAAA,KAAK,SAASA,EAAAA,KAAK,YAAY,CAAC,EAAG,GAAGC,EAAAA,mBAAmB,QAAS,EAC5G,CAAE,IAAK,CAACD,EAAAA,KAAK,SAAUA,EAAAA,KAAK,UAAWA,EAAAA,KAAK,SAAS,EAAG,GAAGC,EAAAA,mBAAmB,IAAK,EACnF,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,mBAAmB,GAAI,EAC/C,CAAE,IAAKD,EAAAA,KAAK,cAAe,GAAGC,EAAAA,mBAAmB,SAAU,EAC3D,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,qBAAqB,EAAG,GAAGC,EAAAA,mBAAmB,IAAK,EAC3E,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,mBAAmB,OAAQ,EACnD,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,GAAG,EAAG,GAAGC,EAAAA,mBAAmB,IAAK,EACzD,CAAE,IAAKD,EAAAA,KAAK,SAAU,GAAGC,EAAAA,mBAAmB,QAAS,EACrD,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,mBAAmB,MAAO,EACjD,CAAE,IAAKD,EAAAA,KAAK,cAAe,GAAGC,EAAAA,mBAAmB,aAAc,EAC/D,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,mBAAmB,OAAQ,CACrD,CAAC,EAEKqD,EAAuBpD,EAAAA,YAAY,OAAsB,EACzDqD,EAAoBpD,EAAAA,WAAW,OAAsB,CACzD,WAAcC,EAAAA,WAAW,KACzB,QAAS,EAAa,IAAgB,CACpC,IAAIoD,EAAOC,EAAY,IAAIC,EAAY,OAAO,EAC9C,IAAK,IAAMC,KAAUD,EAAY,QAC3BC,EAAO,GAAGL,CAAoB,IAAG,EAAOK,EAAO,OAErD,OAAOH,CACT,EACA,QAAU,GAAU3D,EAAAA,WAAW,YAAY,KAAK+D,CAAK,CACvD,CAAC,EAEKC,EAAuB3D,EAAAA,YAAY,OAAsB,EACzD4D,EAAoB3D,EAAAA,WAAW,OAAsB,CACzD,WAAcC,EAAAA,WAAW,KACzB,QAAS,EAAa,IAAgB,CACpC,IAAIoD,EAAOC,EAAY,IAAIC,EAAY,OAAO,EAC9C,IAAK,IAAMC,KAAUD,EAAY,QAC3BC,EAAO,GAAGE,CAAoB,IAAG,EAAOF,EAAO,OAErD,OAAOH,CACT,EACA,QAAU,GAAU3D,EAAAA,WAAW,YAAY,KAAK+D,CAAK,CACvD,CAAC,EAED,IAAMG,EAAN,cAA+B1D,EAAAA,UAAW,CACX,MAA7B,YAAY,EAAgC,CAC1C,MAAM,EADqB,KAAA,MAAA2D,CAE7B,CAEA,GAAG,EAAkC,CACnC,OAAOC,EAAM,QAAU,KAAK,KAC9B,CAEA,OAAqB,CACnB,IAAMD,EAAQ,SAAS,cAAc,MAAM,EAI3C,MAHA,GAAM,UAAY,yBAClB,EAAM,QAAQ,kBAAoB,KAAK,MACvC,EAAM,YAAc,KAAK,MAClBA,CACT,CACF,EAEA,MAAME,EAAsBrE,EAAAA,WAAW,UAAU,CAC/C,oBAAqB,CACnB,gBAAiB,0BACjB,aAAc,mCAChB,EACA,0BAA2B,CACzB,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,SAAU,OACV,OAAQ,OACR,YAAa,MACb,aAAc,QACd,gBAAiB,qBACjB,MAAO,mBACP,SAAU,MACV,WAAY,MACZ,WAAY,IACZ,cAAe,aACjB,CACF,CAAC,EAGKsE,EAAmB,EACvB7D,EAAAA,EAAAA,YAAAA,CAAY,GACZC,EAAAA,EAAAA,0BAAAA,CAA0B,GAC1BC,EAAAA,EAAAA,WAAAA,CAAW,GACXC,EAAAA,EAAAA,oBAAAA,CAAoB,GACpBC,EAAAA,EAAAA,cAAAA,CAAc,GACdC,EAAAA,EAAAA,qBAAAA,CAAqB,GACrBC,EAAAA,EAAAA,cAAAA,CAAc,GACdC,EAAAA,EAAAA,gBAAAA,CAAgB,GAChBC,EAAAA,EAAAA,QAAAA,CAAQ,GACRC,EAAAA,EAAAA,OAAAA,CAAO,CAAE,IAAK,EAAK,CAAC,GACpBC,EAAAA,EAAAA,0BAAAA,CAA0B,EAI1BC,EAAAA,OAAO,GAAG,CAAC,GAAGC,EAAAA,cAAe,GAAGC,EAAAA,cAAe,GAAGC,EAAAA,aAAc,GAAGC,EAAAA,WAAYC,EAAAA,aAAa,CAAC,GAC7FC,EAAAA,EAAAA,mBAAAA,CAAmB8B,CAAc,EACjCE,EACAO,EACAI,EACAd,CACF,EAEA,SAAgBgB,EAAe,CAC7B,QACA,OACA,WAAW,GACX,eAAe,GACf,YACA,WACA,WACA,gBACA,cAAeC,GACG,CAClB,IAAMC,GAAA,EAAO9C,EAAAA,OAAAA,CAAuB,IAAI,EAClC+C,GAAA,EAAO/C,EAAAA,OAAAA,CAA0B,IAAI,EAIrCgD,GAAA,EAAWhD,EAAAA,OAAAA,CAAO,CAAE,WAAU,UAAS,CAAC,EAGxCiD,GAAA,EAAejD,EAAAA,OAAAA,CAAOkD,CAAK,EAC3BC,GAAA,EAAenD,EAAAA,OAAAA,CAAO,CAC1B,SAAU,IAAIC,EAAAA,YACd,SAAU,IAAIA,EAAAA,YACd,SAAU,IAAIA,EAAAA,WAChB,CAAC,EAiJD,OA/IA,EAAAY,EAAA,UAAA,KAAgB,CACd,EAAS,QAAU,CAAE,WAAU,UAAS,CAC1C,CAAC,GAED,EAAAA,EAAA,gBAAA,KAAsB,CACpB,IAAMuC,EAASN,EAAK,QACpB,GAAIM,IAAW,KAAM,OACrB,GAAM,CAAE,WAAU,SAAUC,EAAc,YAAaF,EAAa,QAC9D1B,EAAS,IAAIpD,EAAAA,WAAW,CAC5B,SACA,MAAO6B,EAAAA,YAAY,OAAO,CAGxB,IAAK+C,EAAa,QAClB,WAAY,CACV,GAAGN,EACHW,EAAS,GAAG,CAAC,CAAC,EACdD,EAAa,GAAG,CAAC,CAAC,EAClBE,EAAS,GAAG,CAAC,CAAC,EACdlF,EAAAA,WAAW,eAAe,GAAI,GAAW,CAEvC,GADImF,EAAO,YAAYR,EAAS,QAAQ,WAAWQ,EAAO,MAAM,IAAI,SAAS,CAAC,EAC1E,CAACA,EAAO,cAAgB,CAACA,EAAO,WAAY,OAChD,IAAMC,EAAST,EAAS,QAAQ,SAChC,GAAIS,IAAW,IAAA,GAAW,OAC1B,IAAMC,EAAQF,EAAO,MAAM,UAAU,KACrCC,EAAOrC,EAAeoC,EAAO,KAAME,EAAM,KAAMA,EAAM,EAAE,CAAC,CAC1D,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,MADA,GAAK,QAAUjC,MACF,CACXA,EAAO,QAAQ,EACf,EAAK,QAAU,IACjB,CAEF,EAAG,CAAC,CAAC,GAEL,EAAAZ,EAAA,oBAAA,CACE8C,OACO,CACL,UAAaZ,EAAK,SAAS,MAAM,EACjC,gBAAkB,GAAU,CAC1B,IAAMtB,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OACrB,GAAM,CAACmC,GAAWzD,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQ,CAACiC,CAAK,CAAC,EAClEE,IAAY,IAAA,IAChBnC,EAAO,SAAS,CACd,UAAW,CAAE,OAAQmC,EAAQ,KAAM,KAAMA,EAAQ,EAAG,EACpD,QAASvF,EAAAA,WAAW,eAAeuF,EAAQ,KAAM,CAAE,EAAG,QAAS,CAAC,CAClE,CAAC,CACH,EACA,WAAa,GAAU,CACrB,IAAMnC,EAASsB,EAAK,QAChBtB,IAAW,MAAQoC,EAAM,SAAW,GACxCpC,EAAO,SAAS,CAAE,QAASrB,EAAAA,mBAAmBqB,EAAO,MAAM,IAAI,OAAQoC,CAAK,CAAE,CAAC,CACjF,EACA,gBAAkB,GAAW,CAC3B,IAAMpC,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OAErB,IAAMQ,EADU9B,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQqC,CACnC,CAAC,CAAC,IAAK,GAC/BJ,EAAM,OAASA,EAAM,GACjB9E,EAAAA,WAAW,KAAK,CAAE,WAAY,CAAE,MAAO,iBAAkB,YAAa,QAAS,CAAE,CAAC,CAAC,CAAC,MAClF6C,EAAO,MAAM,IAAI,OAAOiC,EAAM,IAAI,CAAC,CAAC,IACtC,EACA9E,EAAAA,WAAW,KAAK,CAAE,MAAO,iBAAkB,WAAY,CAAE,YAAa,QAAS,CAAE,CAAC,CAAC,CAAC,MAClF8E,EAAM,KACNA,EAAM,EACR,CACN,EACAjC,EAAO,SAAS,CAAE,QAASK,EAAqB,GAAGlD,EAAAA,WAAW,IAAIqD,CAAW,CAAC,CAAE,CAAC,CACnF,EACA,gBAAkB,GAAW,CAC3B,IAAMR,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OACrB,IAAMQ,EAAc6B,EAAO,QAAS,GAAU,CAC5C,GAAM,CAACF,GAAWzD,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQ,CAACiC,CAAK,CAAC,EAEtE,OADIE,IAAY,IAAA,IAAaA,EAAQ,OAASA,EAAQ,GAAW,CAAC,EAC3D,CACLhF,EAAAA,WAAW,OAAO,CAAE,OAAQ,IAAI2D,EAAiBmB,EAAM,KAAK,EAAG,KAAM,EAAG,CAAC,CAAC,CAAC,MAAME,EAAQ,IAAI,EAC7FhF,EAAAA,WAAW,KAAK,CACd,MAAO,mBACP,WAAY,CAAE,qBAAsB8E,EAAM,KAAM,CAClD,CAAC,CAAC,CAAC,MAAME,EAAQ,KAAMA,EAAQ,EAAE,CACnC,CACF,CAAC,EACDnC,EAAO,SAAS,CAAE,QAASY,EAAqB,GAAGzD,EAAAA,WAAW,IAAIqD,EAAa,EAAI,CAAC,CAAE,CAAC,CACzF,EACA,sBAAwB,GAAc,CACpC,IAAMR,EAASsB,EAAK,QACpB,OAAOtB,IAAW,KAAO,KAAOC,EAA4BD,EAAQE,CAAS,CAC/E,CACF,GACA,CAAC,CACH,GAEA,EAAAd,EAAA,UAAA,KAAgB,CACd,IAAMY,EAASsB,EAAK,QAGhBtB,IAAW,MAAQA,EAAO,MAAM,IAAI,SAAS,IAAMyB,GACvDzB,EAAO,SAAS,CAAE,QAAS,CAAE,KAAM,EAAG,GAAIA,EAAO,MAAM,IAAI,OAAQ,OAAQyB,CAAM,CAAE,CAAC,CACtF,EAAG,CAACA,CAAK,CAAC,GAEV,EAAArC,EAAA,UAAA,KAAgB,CACdkC,EAAK,SAAS,SAAS,CACrB,QAASI,EAAa,QAAQ,SAAS,YAAY,CACjDjD,EAAAA,YAAY,SAAS,GAAG6D,CAAQ,EAChC1F,EAAAA,WAAW,SAAS,GAAG,CAAC0F,CAAQ,CAClC,CAAC,CACH,CAAC,CACH,EAAG,CAACA,CAAQ,CAAC,GAEb,EAAAlD,EAAA,UAAA,KAAgB,CACdkC,EAAK,SAAS,SAAS,CACrB,QAASI,EAAa,QAAQ,SAAS,YAAYa,EAAe3F,EAAAA,WAAW,aAAe,CAAC,CAAC,CAChG,CAAC,CACH,EAAG,CAAC2F,CAAY,CAAC,GAEjB,EAAAnD,EAAA,UAAA,KAAgB,CACd,IAAMoD,EAAMC,IAAS,IAAA,GAAY,IAAA,GAAY7D,EAAAA,aAAa6D,CAAI,EACxD,CAAE,YAAaf,EAAa,QAClC,GAAIc,IAAQ,IAAA,GAAW,CACrBlB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAY,CAAC,CAAC,CAAE,CAAC,EAC5D,MACF,CACA,IAAIa,EAAY,GAWhB,OAVA1D,EAAKH,YAAY2D,CAAG,CAAC,CAClB,KAAM,GAAY,CACZE,GAAWpB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAYc,CAAO,CAAE,CAAC,CACnF,CAAC,CAAC,CACD,UAAY,CAIND,GAAWpB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAY,CAAC,CAAC,CAAE,CAAC,CAC9E,CAAC,MACU,CACX,EAAY,EACd,CACF,EAAG,CAACY,CAAI,CAAC,EAEF,iBAAA,EAAAtD,EAAA,IAAA,CAAC,MAAD,CAAK,IAAKkC,EAAM,cAAaD,EAAQ,UAAWtC,EAAAA,GAAG,0BAA2B8D,CAAS,CAAI,CAAA,CACpG"}
1
+ {"version":3,"file":"CodeEditorView.cjs","names":["EditorView","PO_EDITOR_STYLES","HighlightStyle","tags","PO_SYNTAX_STYLES","StateEffect","StateField","Decoration","WidgetType","lineNumbers","highlightActiveLineGutter","foldGutter","highlightActiveLine","drawSelection","rectangularSelection","indentOnInput","bracketMatching","history","search","highlightSelectionMatches","keymap","defaultKeymap","historyKeymap","searchKeymap","foldKeymap","indentWithTab","syntaxHighlighting","useRef","Compartment","EditorState","boundedEditorRanges","boundedEditorEdits","grammarKeyOf","loadGrammar","cn","require_cn","require_editorLanguage","require_editorTheme","require_editorController","react_jsx_runtime","react","_codemirror_commands","_codemirror_language","_codemirror_search","_codemirror_state","_codemirror_view","_lezer_highlight","selectionRange","start","from","to","end","editor","resolveEditorViewportRegion","rectangle","PO_THEME","PO_HIGHLIGHT","setClosedDecorations","closedDecorations","next","decorations","transaction","effect","field","setMarkedDecorations","markedDecorations","MarkedRangeLabel","label","other","MARKED_REGION_THEME","FIXED_EXTENSIONS","CodeEditorView","testId","host","view","handlers","initialValue","value","compartments","parent","readOnlyPart","language","wrapping","update","report","range","controllerRef","bounded","edits","ranges","readOnly","lineWrapping","key","path","cancelled","grammar","className"],"sources":["../../../src/components/CodeEditorView.tsx"],"sourcesContent":["import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport {\n bracketMatching,\n foldGutter,\n foldKeymap,\n HighlightStyle,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language';\nimport { highlightSelectionMatches, search, searchKeymap } from '@codemirror/search';\nimport { Compartment, EditorState, StateEffect, StateField } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n drawSelection,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n keymap,\n lineNumbers,\n rectangularSelection,\n WidgetType,\n} from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { boundedEditorEdits, boundedEditorRanges } from '../lib/editorController';\nimport { grammarKeyOf, loadGrammar } from '../lib/editorLanguage';\nimport { PO_EDITOR_STYLES, PO_SYNTAX_STYLES } from '../lib/editorTheme';\nimport type { CodeEditorProps, EditorSelectionRange, EditorViewportRectangle } from '../types/editor';\n\nfunction selectionRange(editor: { readonly state: EditorState }, from: number, to: number): EditorSelectionRange {\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n return {\n text: editor.state.sliceDoc(start, end),\n from: start,\n to: end,\n startLine: editor.state.doc.lineAt(start).number,\n endLine: editor.state.doc.lineAt(end).number,\n };\n}\n\nexport function resolveEditorViewportRegion(\n editor: {\n readonly state: EditorState;\n posAtCoords(coords: { x: number; y: number }): number | null;\n },\n rectangle: EditorViewportRectangle,\n): EditorSelectionRange | null {\n const start = editor.posAtCoords({ x: rectangle.left, y: rectangle.top });\n const end = editor.posAtCoords({ x: rectangle.right, y: rectangle.bottom });\n if (start === null || end === null) return null;\n return selectionRange(editor, start, end);\n}\n/**\n * The editor itself, mounted on a real CodeMirror view.\n *\n * Nothing imports this module directly: `CodeEditor` reaches it through a lazy\n * import so the whole editor, and every grammar under it, stays out of the\n * cockpit's first load. Behaviour lives here rather than in that wrapper so\n * the split costs one file and no indirection.\n *\n * The three things a caller can change after mount each sit in their own\n * compartment. Reconfiguring one is a transaction; rebuilding the editor would\n * throw away the undo history, the scroll position and the cursor, which is\n * what a reader loses if a parent re-render is allowed to remount this.\n */\n\n/** Not a colour or a layout choice: how CodeMirror is told to draw the po palette. */\nconst PO_THEME = EditorView.theme(PO_EDITOR_STYLES);\n\nconst PO_HIGHLIGHT = HighlightStyle.define([\n { tag: tags.comment, ...PO_SYNTAX_STYLES.comment },\n { tag: tags.keyword, ...PO_SYNTAX_STYLES.keyword },\n { tag: [tags.atom, tags.bool, tags.null, tags.self], ...PO_SYNTAX_STYLES.constant },\n { tag: tags.number, ...PO_SYNTAX_STYLES.literal },\n { tag: [tags.string, tags.special(tags.string), tags.character], ...PO_SYNTAX_STYLES.string },\n { tag: tags.regexp, ...PO_SYNTAX_STYLES.regexp },\n { tag: tags.operator, ...PO_SYNTAX_STYLES.operator },\n { tag: tags.punctuation, ...PO_SYNTAX_STYLES.punctuation },\n { tag: tags.variableName, ...PO_SYNTAX_STYLES.variable },\n { tag: tags.propertyName, ...PO_SYNTAX_STYLES.property },\n { tag: [tags.function(tags.variableName), tags.function(tags.propertyName)], ...PO_SYNTAX_STYLES.callable },\n { tag: [tags.typeName, tags.className, tags.namespace], ...PO_SYNTAX_STYLES.type },\n { tag: tags.tagName, ...PO_SYNTAX_STYLES.tag },\n { tag: tags.attributeName, ...PO_SYNTAX_STYLES.attribute },\n { tag: [tags.meta, tags.processingInstruction], ...PO_SYNTAX_STYLES.meta },\n { tag: tags.heading, ...PO_SYNTAX_STYLES.heading },\n { tag: [tags.link, tags.url], ...PO_SYNTAX_STYLES.link },\n { tag: tags.emphasis, ...PO_SYNTAX_STYLES.emphasis },\n { tag: tags.strong, ...PO_SYNTAX_STYLES.strong },\n { tag: tags.strikethrough, ...PO_SYNTAX_STYLES.strikethrough },\n { tag: tags.invalid, ...PO_SYNTAX_STYLES.invalid },\n]);\n\nconst setClosedDecorations = StateEffect.define<DecorationSet>();\nconst closedDecorations = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update: (decorations, transaction) => {\n let next = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (effect.is(setClosedDecorations)) next = effect.value;\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nconst setMarkedDecorations = StateEffect.define<DecorationSet>();\nconst markedDecorations = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update: (decorations, transaction) => {\n let next = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (effect.is(setMarkedDecorations)) next = effect.value;\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nclass MarkedRangeLabel extends WidgetType {\n constructor(private readonly label: string) {\n super();\n }\n\n eq(other: MarkedRangeLabel): boolean {\n return other.label === this.label;\n }\n\n toDOM(): HTMLElement {\n const label = document.createElement('span');\n label.className = 'cm-marked-region-label';\n label.dataset.authorRegionLabel = this.label;\n label.textContent = this.label;\n return label;\n }\n}\n\nconst MARKED_REGION_THEME = EditorView.baseTheme({\n '.cm-marked-region': {\n backgroundColor: 'var(--po-tint-yellow)',\n borderBottom: '1px solid var(--po-edge-yellow)',\n },\n '.cm-marked-region-label': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '16px',\n height: '16px',\n marginRight: '4px',\n borderRadius: '999px',\n backgroundColor: 'var(--po-yellow)',\n color: 'var(--po-deep)',\n fontSize: '9px',\n fontWeight: '700',\n lineHeight: '1',\n verticalAlign: 'text-bottom',\n },\n});\n\n/** Everything that never changes for the life of an editor. */\nconst FIXED_EXTENSIONS = [\n lineNumbers(),\n highlightActiveLineGutter(),\n foldGutter(),\n highlightActiveLine(),\n drawSelection(),\n rectangularSelection(),\n indentOnInput(),\n bracketMatching(),\n history(),\n search({ top: true }),\n highlightSelectionMatches(),\n // Tab indents rather than leaving the editor. That trades a keyboard user's\n // escape route for the behaviour every other editor has, so it is last in\n // the keymap and Escape then Tab still moves focus out.\n keymap.of([...defaultKeymap, ...historyKeymap, ...searchKeymap, ...foldKeymap, indentWithTab]),\n syntaxHighlighting(PO_HIGHLIGHT),\n closedDecorations,\n markedDecorations,\n MARKED_REGION_THEME,\n PO_THEME,\n];\n\nexport function CodeEditorView({\n value,\n path,\n readOnly = false,\n lineWrapping = true,\n className,\n onChange,\n onSelect,\n controllerRef,\n 'data-testid': testId,\n}: CodeEditorProps) {\n const host = useRef<HTMLDivElement>(null);\n const view = useRef<EditorView | null>(null);\n // The callbacks are new objects on every parent render. Reading them through\n // a ref is what lets the editor be built once and still call the current\n // pair, rather than being rebuilt whenever the parent re-renders.\n const handlers = useRef({ onChange, onSelect });\n // The document is seeded once from the value of the first render; the sync effect\n // below owns every later change.\n const initialValue = useRef(value);\n const compartments = useRef({\n language: new Compartment(),\n readOnly: new Compartment(),\n wrapping: new Compartment(),\n });\n\n useEffect(() => {\n handlers.current = { onChange, onSelect };\n });\n\n useLayoutEffect(() => {\n const parent = host.current;\n if (parent === null) return;\n const { language, readOnly: readOnlyPart, wrapping } = compartments.current;\n const editor = new EditorView({\n parent,\n state: EditorState.create({\n // The initial document only; every later change arrives as a\n // transaction from the effect below.\n doc: initialValue.current,\n extensions: [\n ...FIXED_EXTENSIONS,\n language.of([]),\n readOnlyPart.of([]),\n wrapping.of([]),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) handlers.current.onChange?.(update.state.doc.toString());\n if (!update.selectionSet && !update.docChanged) return;\n const report = handlers.current.onSelect;\n if (report === undefined) return;\n const range = update.state.selection.main;\n report(selectionRange(update.view, range.from, range.to));\n }),\n ],\n }),\n });\n view.current = editor;\n return () => {\n editor.destroy();\n view.current = null;\n };\n // Built once.\n }, []);\n\n useImperativeHandle(\n controllerRef,\n () => ({\n focus: () => view.current?.focus(),\n revealAndSelect: (range) => {\n const editor = view.current;\n if (editor === null) return;\n const [bounded] = boundedEditorRanges(editor.state.doc.length, [range]);\n if (bounded === undefined) return;\n editor.dispatch({\n selection: { anchor: bounded.from, head: bounded.to },\n effects: EditorView.scrollIntoView(bounded.from, { y: 'center' }),\n });\n },\n applyEdits: (edits) => {\n const editor = view.current;\n if (editor === null || edits.length === 0) return;\n editor.dispatch({ changes: boundedEditorEdits(editor.state.doc.length, edits) });\n },\n setClosedRanges: (ranges) => {\n const editor = view.current;\n if (editor === null) return;\n const bounded = boundedEditorRanges(editor.state.doc.length, ranges);\n const decorations = bounded.map((range) =>\n range.from === range.to\n ? Decoration.line({ attributes: { class: 'cm-closed-tone', 'data-tone': 'closed' } }).range(\n editor.state.doc.lineAt(range.from).from,\n )\n : Decoration.mark({ class: 'cm-closed-tone', attributes: { 'data-tone': 'closed' } }).range(\n range.from,\n range.to,\n ),\n );\n editor.dispatch({ effects: setClosedDecorations.of(Decoration.set(decorations)) });\n },\n setMarkedRanges: (ranges) => {\n const editor = view.current;\n if (editor === null) return;\n const decorations = ranges.flatMap((range) => {\n const [bounded] = boundedEditorRanges(editor.state.doc.length, [range]);\n if (bounded === undefined || bounded.from === bounded.to) return [];\n return [\n Decoration.widget({ widget: new MarkedRangeLabel(range.label), side: -1 }).range(bounded.from),\n Decoration.mark({\n class: 'cm-marked-region',\n attributes: { 'data-author-region': range.label },\n }).range(bounded.from, bounded.to),\n ];\n });\n editor.dispatch({ effects: setMarkedDecorations.of(Decoration.set(decorations, true)) });\n },\n resolveViewportRegion: (rectangle) => {\n const editor = view.current;\n return editor === null ? null : resolveEditorViewportRegion(editor, rectangle);\n },\n }),\n [],\n );\n\n useEffect(() => {\n const editor = view.current;\n // A caller that echoes onChange back into `value` would otherwise replace\n // the document on every keystroke and drop the cursor to the end.\n if (editor === null || editor.state.doc.toString() === value) return;\n editor.dispatch({ changes: { from: 0, to: editor.state.doc.length, insert: value } });\n }, [value]);\n\n useEffect(() => {\n view.current?.dispatch({\n effects: compartments.current.readOnly.reconfigure([\n EditorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n }, [readOnly]);\n\n useEffect(() => {\n view.current?.dispatch({\n effects: compartments.current.wrapping.reconfigure(lineWrapping ? EditorView.lineWrapping : []),\n });\n }, [lineWrapping]);\n\n useEffect(() => {\n const key = path === undefined ? undefined : grammarKeyOf(path);\n const { language } = compartments.current;\n if (key === undefined) {\n view.current?.dispatch({ effects: language.reconfigure([]) });\n return;\n }\n let cancelled = false;\n void loadGrammar(key)\n .then((grammar) => {\n if (!cancelled) view.current?.dispatch({ effects: language.reconfigure(grammar) });\n })\n .catch(() => {\n // A grammar is a separate chunk over the network, and the cockpit is\n // often read through a tunnel. Losing it costs syntax colour, not the\n // file, so fall back to plain text rather than failing the pane.\n if (!cancelled) view.current?.dispatch({ effects: language.reconfigure([]) });\n });\n return () => {\n cancelled = true;\n };\n }, [path]);\n\n return <div ref={host} data-testid={testId} className={cn('min-h-0 overflow-hidden', className)} />;\n}\n"],"mappings":"0YAgCA,SAAS+C,EAAe,EAAyC,EAAc,EAAkC,CAC/G,IAAMC,EAAQ,KAAK,IAAIC,EAAMC,CAAE,EACzBC,EAAM,KAAK,IAAIF,EAAMC,CAAE,EAC7B,MAAO,CACL,KAAME,EAAO,MAAM,SAASJ,EAAOG,CAAG,EACtC,KAAMH,EACN,GAAIG,EACJ,UAAWC,EAAO,MAAM,IAAI,OAAOJ,CAAK,CAAC,CAAC,OAC1C,QAASI,EAAO,MAAM,IAAI,OAAOD,CAAG,CAAC,CAAC,MACxC,CACF,CAEA,SAAgBE,EACd,EAIA,EAC6B,CAC7B,IAAML,EAAQI,EAAO,YAAY,CAAE,EAAGE,EAAU,KAAM,EAAGA,EAAU,GAAI,CAAC,EAClEH,EAAMC,EAAO,YAAY,CAAE,EAAGE,EAAU,MAAO,EAAGA,EAAU,MAAO,CAAC,EAE1E,OADIN,IAAU,MAAQG,IAAQ,KAAa,KACpCJ,EAAeK,EAAQJ,EAAOG,CAAG,CAC1C,CAgBA,MAAMI,EAAWvD,EAAAA,WAAW,MAAMC,EAAAA,gBAAgB,EAE5CuD,EAAetD,EAAAA,eAAe,OAAO,CACzC,CAAE,IAAKC,EAAAA,KAAK,QAAS,GAAGC,EAAAA,iBAAiB,OAAQ,EACjD,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,iBAAiB,OAAQ,EACjD,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,KAAMA,EAAAA,KAAK,KAAMA,EAAAA,KAAK,IAAI,EAAG,GAAGC,EAAAA,iBAAiB,QAAS,EAClF,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,iBAAiB,OAAQ,EAChD,CAAE,IAAK,CAACD,EAAAA,KAAK,OAAQA,EAAAA,KAAK,QAAQA,EAAAA,KAAK,MAAM,EAAGA,EAAAA,KAAK,SAAS,EAAG,GAAGC,EAAAA,iBAAiB,MAAO,EAC5F,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,iBAAiB,MAAO,EAC/C,CAAE,IAAKD,EAAAA,KAAK,SAAU,GAAGC,EAAAA,iBAAiB,QAAS,EACnD,CAAE,IAAKD,EAAAA,KAAK,YAAa,GAAGC,EAAAA,iBAAiB,WAAY,EACzD,CAAE,IAAKD,EAAAA,KAAK,aAAc,GAAGC,EAAAA,iBAAiB,QAAS,EACvD,CAAE,IAAKD,EAAAA,KAAK,aAAc,GAAGC,EAAAA,iBAAiB,QAAS,EACvD,CAAE,IAAK,CAACD,EAAAA,KAAK,SAASA,EAAAA,KAAK,YAAY,EAAGA,EAAAA,KAAK,SAASA,EAAAA,KAAK,YAAY,CAAC,EAAG,GAAGC,EAAAA,iBAAiB,QAAS,EAC1G,CAAE,IAAK,CAACD,EAAAA,KAAK,SAAUA,EAAAA,KAAK,UAAWA,EAAAA,KAAK,SAAS,EAAG,GAAGC,EAAAA,iBAAiB,IAAK,EACjF,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,iBAAiB,GAAI,EAC7C,CAAE,IAAKD,EAAAA,KAAK,cAAe,GAAGC,EAAAA,iBAAiB,SAAU,EACzD,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,qBAAqB,EAAG,GAAGC,EAAAA,iBAAiB,IAAK,EACzE,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,iBAAiB,OAAQ,EACjD,CAAE,IAAK,CAACD,EAAAA,KAAK,KAAMA,EAAAA,KAAK,GAAG,EAAG,GAAGC,EAAAA,iBAAiB,IAAK,EACvD,CAAE,IAAKD,EAAAA,KAAK,SAAU,GAAGC,EAAAA,iBAAiB,QAAS,EACnD,CAAE,IAAKD,EAAAA,KAAK,OAAQ,GAAGC,EAAAA,iBAAiB,MAAO,EAC/C,CAAE,IAAKD,EAAAA,KAAK,cAAe,GAAGC,EAAAA,iBAAiB,aAAc,EAC7D,CAAE,IAAKD,EAAAA,KAAK,QAAS,GAAGC,EAAAA,iBAAiB,OAAQ,CACnD,CAAC,EAEKqD,EAAuBpD,EAAAA,YAAY,OAAsB,EACzDqD,EAAoBpD,EAAAA,WAAW,OAAsB,CACzD,WAAcC,EAAAA,WAAW,KACzB,QAAS,EAAa,IAAgB,CACpC,IAAIoD,EAAOC,EAAY,IAAIC,EAAY,OAAO,EAC9C,IAAK,IAAMC,KAAUD,EAAY,QAC3BC,EAAO,GAAGL,CAAoB,IAAG,EAAOK,EAAO,OAErD,OAAOH,CACT,EACA,QAAU,GAAU3D,EAAAA,WAAW,YAAY,KAAK+D,CAAK,CACvD,CAAC,EAEKC,EAAuB3D,EAAAA,YAAY,OAAsB,EACzD4D,EAAoB3D,EAAAA,WAAW,OAAsB,CACzD,WAAcC,EAAAA,WAAW,KACzB,QAAS,EAAa,IAAgB,CACpC,IAAIoD,EAAOC,EAAY,IAAIC,EAAY,OAAO,EAC9C,IAAK,IAAMC,KAAUD,EAAY,QAC3BC,EAAO,GAAGE,CAAoB,IAAG,EAAOF,EAAO,OAErD,OAAOH,CACT,EACA,QAAU,GAAU3D,EAAAA,WAAW,YAAY,KAAK+D,CAAK,CACvD,CAAC,EAED,IAAMG,EAAN,cAA+B1D,EAAAA,UAAW,CACX,MAA7B,YAAY,EAAgC,CAC1C,MAAM,EADqB,KAAA,MAAA2D,CAE7B,CAEA,GAAG,EAAkC,CACnC,OAAOC,EAAM,QAAU,KAAK,KAC9B,CAEA,OAAqB,CACnB,IAAMD,EAAQ,SAAS,cAAc,MAAM,EAI3C,MAHA,GAAM,UAAY,yBAClB,EAAM,QAAQ,kBAAoB,KAAK,MACvC,EAAM,YAAc,KAAK,MAClBA,CACT,CACF,EAEA,MAAME,EAAsBrE,EAAAA,WAAW,UAAU,CAC/C,oBAAqB,CACnB,gBAAiB,wBACjB,aAAc,iCAChB,EACA,0BAA2B,CACzB,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,SAAU,OACV,OAAQ,OACR,YAAa,MACb,aAAc,QACd,gBAAiB,mBACjB,MAAO,iBACP,SAAU,MACV,WAAY,MACZ,WAAY,IACZ,cAAe,aACjB,CACF,CAAC,EAGKsE,EAAmB,EACvB7D,EAAAA,EAAAA,YAAAA,CAAY,GACZC,EAAAA,EAAAA,0BAAAA,CAA0B,GAC1BC,EAAAA,EAAAA,WAAAA,CAAW,GACXC,EAAAA,EAAAA,oBAAAA,CAAoB,GACpBC,EAAAA,EAAAA,cAAAA,CAAc,GACdC,EAAAA,EAAAA,qBAAAA,CAAqB,GACrBC,EAAAA,EAAAA,cAAAA,CAAc,GACdC,EAAAA,EAAAA,gBAAAA,CAAgB,GAChBC,EAAAA,EAAAA,QAAAA,CAAQ,GACRC,EAAAA,EAAAA,OAAAA,CAAO,CAAE,IAAK,EAAK,CAAC,GACpBC,EAAAA,EAAAA,0BAAAA,CAA0B,EAI1BC,EAAAA,OAAO,GAAG,CAAC,GAAGC,EAAAA,cAAe,GAAGC,EAAAA,cAAe,GAAGC,EAAAA,aAAc,GAAGC,EAAAA,WAAYC,EAAAA,aAAa,CAAC,GAC7FC,EAAAA,EAAAA,mBAAAA,CAAmB8B,CAAY,EAC/BE,EACAO,EACAI,EACAd,CACF,EAEA,SAAgBgB,EAAe,CAC7B,QACA,OACA,WAAW,GACX,eAAe,GACf,YACA,WACA,WACA,gBACA,cAAeC,GACG,CAClB,IAAMC,GAAA,EAAO9C,EAAAA,OAAAA,CAAuB,IAAI,EAClC+C,GAAA,EAAO/C,EAAAA,OAAAA,CAA0B,IAAI,EAIrCgD,GAAA,EAAWhD,EAAAA,OAAAA,CAAO,CAAE,WAAU,UAAS,CAAC,EAGxCiD,GAAA,EAAejD,EAAAA,OAAAA,CAAOkD,CAAK,EAC3BC,GAAA,EAAenD,EAAAA,OAAAA,CAAO,CAC1B,SAAU,IAAIC,EAAAA,YACd,SAAU,IAAIA,EAAAA,YACd,SAAU,IAAIA,EAAAA,WAChB,CAAC,EAiJD,OA/IA,EAAAY,EAAA,UAAA,KAAgB,CACd,EAAS,QAAU,CAAE,WAAU,UAAS,CAC1C,CAAC,GAED,EAAAA,EAAA,gBAAA,KAAsB,CACpB,IAAMuC,EAASN,EAAK,QACpB,GAAIM,IAAW,KAAM,OACrB,GAAM,CAAE,WAAU,SAAUC,EAAc,YAAaF,EAAa,QAC9D1B,EAAS,IAAIpD,EAAAA,WAAW,CAC5B,SACA,MAAO6B,EAAAA,YAAY,OAAO,CAGxB,IAAK+C,EAAa,QAClB,WAAY,CACV,GAAGN,EACHW,EAAS,GAAG,CAAC,CAAC,EACdD,EAAa,GAAG,CAAC,CAAC,EAClBE,EAAS,GAAG,CAAC,CAAC,EACdlF,EAAAA,WAAW,eAAe,GAAI,GAAW,CAEvC,GADImF,EAAO,YAAYR,EAAS,QAAQ,WAAWQ,EAAO,MAAM,IAAI,SAAS,CAAC,EAC1E,CAACA,EAAO,cAAgB,CAACA,EAAO,WAAY,OAChD,IAAMC,EAAST,EAAS,QAAQ,SAChC,GAAIS,IAAW,IAAA,GAAW,OAC1B,IAAMC,EAAQF,EAAO,MAAM,UAAU,KACrCC,EAAOrC,EAAeoC,EAAO,KAAME,EAAM,KAAMA,EAAM,EAAE,CAAC,CAC1D,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,MADA,GAAK,QAAUjC,MACF,CACXA,EAAO,QAAQ,EACf,EAAK,QAAU,IACjB,CAEF,EAAG,CAAC,CAAC,GAEL,EAAAZ,EAAA,oBAAA,CACE8C,OACO,CACL,UAAaZ,EAAK,SAAS,MAAM,EACjC,gBAAkB,GAAU,CAC1B,IAAMtB,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OACrB,GAAM,CAACmC,GAAWzD,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQ,CAACiC,CAAK,CAAC,EAClEE,IAAY,IAAA,IAChBnC,EAAO,SAAS,CACd,UAAW,CAAE,OAAQmC,EAAQ,KAAM,KAAMA,EAAQ,EAAG,EACpD,QAASvF,EAAAA,WAAW,eAAeuF,EAAQ,KAAM,CAAE,EAAG,QAAS,CAAC,CAClE,CAAC,CACH,EACA,WAAa,GAAU,CACrB,IAAMnC,EAASsB,EAAK,QAChBtB,IAAW,MAAQoC,EAAM,SAAW,GACxCpC,EAAO,SAAS,CAAE,QAASrB,EAAAA,mBAAmBqB,EAAO,MAAM,IAAI,OAAQoC,CAAK,CAAE,CAAC,CACjF,EACA,gBAAkB,GAAW,CAC3B,IAAMpC,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OAErB,IAAMQ,EADU9B,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQqC,CACnC,CAAC,CAAC,IAAK,GAC/BJ,EAAM,OAASA,EAAM,GACjB9E,EAAAA,WAAW,KAAK,CAAE,WAAY,CAAE,MAAO,iBAAkB,YAAa,QAAS,CAAE,CAAC,CAAC,CAAC,MAClF6C,EAAO,MAAM,IAAI,OAAOiC,EAAM,IAAI,CAAC,CAAC,IACtC,EACA9E,EAAAA,WAAW,KAAK,CAAE,MAAO,iBAAkB,WAAY,CAAE,YAAa,QAAS,CAAE,CAAC,CAAC,CAAC,MAClF8E,EAAM,KACNA,EAAM,EACR,CACN,EACAjC,EAAO,SAAS,CAAE,QAASK,EAAqB,GAAGlD,EAAAA,WAAW,IAAIqD,CAAW,CAAC,CAAE,CAAC,CACnF,EACA,gBAAkB,GAAW,CAC3B,IAAMR,EAASsB,EAAK,QACpB,GAAItB,IAAW,KAAM,OACrB,IAAMQ,EAAc6B,EAAO,QAAS,GAAU,CAC5C,GAAM,CAACF,GAAWzD,EAAAA,oBAAoBsB,EAAO,MAAM,IAAI,OAAQ,CAACiC,CAAK,CAAC,EAEtE,OADIE,IAAY,IAAA,IAAaA,EAAQ,OAASA,EAAQ,GAAW,CAAC,EAC3D,CACLhF,EAAAA,WAAW,OAAO,CAAE,OAAQ,IAAI2D,EAAiBmB,EAAM,KAAK,EAAG,KAAM,EAAG,CAAC,CAAC,CAAC,MAAME,EAAQ,IAAI,EAC7FhF,EAAAA,WAAW,KAAK,CACd,MAAO,mBACP,WAAY,CAAE,qBAAsB8E,EAAM,KAAM,CAClD,CAAC,CAAC,CAAC,MAAME,EAAQ,KAAMA,EAAQ,EAAE,CACnC,CACF,CAAC,EACDnC,EAAO,SAAS,CAAE,QAASY,EAAqB,GAAGzD,EAAAA,WAAW,IAAIqD,EAAa,EAAI,CAAC,CAAE,CAAC,CACzF,EACA,sBAAwB,GAAc,CACpC,IAAMR,EAASsB,EAAK,QACpB,OAAOtB,IAAW,KAAO,KAAOC,EAA4BD,EAAQE,CAAS,CAC/E,CACF,GACA,CAAC,CACH,GAEA,EAAAd,EAAA,UAAA,KAAgB,CACd,IAAMY,EAASsB,EAAK,QAGhBtB,IAAW,MAAQA,EAAO,MAAM,IAAI,SAAS,IAAMyB,GACvDzB,EAAO,SAAS,CAAE,QAAS,CAAE,KAAM,EAAG,GAAIA,EAAO,MAAM,IAAI,OAAQ,OAAQyB,CAAM,CAAE,CAAC,CACtF,EAAG,CAACA,CAAK,CAAC,GAEV,EAAArC,EAAA,UAAA,KAAgB,CACdkC,EAAK,SAAS,SAAS,CACrB,QAASI,EAAa,QAAQ,SAAS,YAAY,CACjDjD,EAAAA,YAAY,SAAS,GAAG6D,CAAQ,EAChC1F,EAAAA,WAAW,SAAS,GAAG,CAAC0F,CAAQ,CAClC,CAAC,CACH,CAAC,CACH,EAAG,CAACA,CAAQ,CAAC,GAEb,EAAAlD,EAAA,UAAA,KAAgB,CACdkC,EAAK,SAAS,SAAS,CACrB,QAASI,EAAa,QAAQ,SAAS,YAAYa,EAAe3F,EAAAA,WAAW,aAAe,CAAC,CAAC,CAChG,CAAC,CACH,EAAG,CAAC2F,CAAY,CAAC,GAEjB,EAAAnD,EAAA,UAAA,KAAgB,CACd,IAAMoD,EAAMC,IAAS,IAAA,GAAY,IAAA,GAAY7D,EAAAA,aAAa6D,CAAI,EACxD,CAAE,YAAaf,EAAa,QAClC,GAAIc,IAAQ,IAAA,GAAW,CACrBlB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAY,CAAC,CAAC,CAAE,CAAC,EAC5D,MACF,CACA,IAAIa,EAAY,GAWhB,OAVA1D,EAAKH,YAAY2D,CAAG,CAAC,CAClB,KAAM,GAAY,CACZE,GAAWpB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAYc,CAAO,CAAE,CAAC,CACnF,CAAC,CAAC,CACD,UAAY,CAIND,GAAWpB,EAAK,SAAS,SAAS,CAAE,QAASO,EAAS,YAAY,CAAC,CAAC,CAAE,CAAC,CAC9E,CAAC,MACU,CACX,EAAY,EACd,CACF,EAAG,CAACY,CAAI,CAAC,EAEF,iBAAA,EAAAtD,EAAA,IAAA,CAAC,MAAD,CAAK,IAAKkC,EAAM,cAAaD,EAAQ,UAAWtC,EAAAA,GAAG,0BAA2B8D,CAAS,CAAI,CAAA,CACpG"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs"),t=require("./Dialog.cjs"),n=require("./Input.cjs"),r=require("./OptionList.cjs");let i=require("react/jsx-runtime");function a({open:n,onOpenChange:r,title:a,titleVisible:o=!1,className:s,children:c,width:l=`lg`,...u}){return/* @__PURE__ */ (0,i.jsx)(t.Dialog,{open:n,onOpenChange:r,children:/* @__PURE__ */ (0,i.jsxs)(t.DialogContent,{"data-slot":`command-dialog`,width:l,className:e.cn(`max-h-[70vh]`,s),...u,children:[/* @__PURE__ */ (0,i.jsx)(t.DialogTitle,{className:o?void 0:`sr-only`,children:a}),c]})})}function o({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-header`,className:e.cn(`flex shrink-0 items-center gap-2 border-b border-doom-border px-3 py-2.5`,t),...n})}function s({className:t,...r}){return/* @__PURE__ */ (0,i.jsx)(n.Input,{"data-slot":`command-input`,variant:`bare`,autoFocus:!0,autoComplete:`off`,className:e.cn(`flex-1`,t),...r})}function c({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{role:`listbox`,"data-slot":`command-list`,className:e.cn(`flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto p-1.5`,t),...n})}function l({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-group`,className:e.cn(`flex flex-col gap-0.5`,t),...n})}function u({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-group-label`,className:e.cn(`px-2 pt-2 pb-1 text-sm font-semibold text-doom-dim first-letter:uppercase`,t),...n})}function d({density:e=`compact`,...t}){return/* @__PURE__ */ (0,i.jsx)(r.OptionRow,{"data-slot":`command-item`,density:e,...t})}function f(e){return/* @__PURE__ */ (0,i.jsx)(r.OptionLabel,{"data-slot":`command-item-label`,density:`compact`,...e})}function p({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-empty`,className:e.cn(`px-2 py-6 text-center text-base text-doom-dim`,t),...n})}function m({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-footer`,className:e.cn(`flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-doom-border-soft bg-doom-deep px-3 text-sm text-doom-dim`,t),...n})}exports.CommandDialog=a,exports.CommandEmpty=p,exports.CommandFooter=m,exports.CommandGroup=l,exports.CommandGroupLabel=u,exports.CommandHeader=o,exports.CommandInput=s,exports.CommandItem=d,exports.CommandItemLabel=f,exports.CommandList=c;
1
+ const e=require("../lib/cn.cjs"),t=require("./Dialog.cjs"),n=require("./Input.cjs"),r=require("./OptionList.cjs");let i=require("react/jsx-runtime");function a({open:n,onOpenChange:r,title:a,titleVisible:o=!1,className:s,children:c,width:l=`lg`,...u}){return/* @__PURE__ */ (0,i.jsx)(t.Dialog,{open:n,onOpenChange:r,children:/* @__PURE__ */ (0,i.jsxs)(t.DialogContent,{"data-slot":`command-dialog`,width:l,className:e.cn(`max-h-[70vh]`,s),...u,children:[/* @__PURE__ */ (0,i.jsx)(t.DialogTitle,{className:o?void 0:`sr-only`,children:a}),c]})})}function o({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-header`,className:e.cn(`flex shrink-0 items-center gap-2 border-b border-po-border px-3 py-2.5`,t),...n})}function s({className:t,...r}){return/* @__PURE__ */ (0,i.jsx)(n.Input,{"data-slot":`command-input`,variant:`bare`,autoFocus:!0,autoComplete:`off`,className:e.cn(`flex-1`,t),...r})}function c({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{role:`listbox`,"data-slot":`command-list`,className:e.cn(`flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto p-1.5`,t),...n})}function l({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-group`,className:e.cn(`flex flex-col gap-0.5`,t),...n})}function u({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-group-label`,className:e.cn(`px-2 pt-2 pb-1 text-sm font-semibold text-po-dim first-letter:uppercase`,t),...n})}function d({density:e=`compact`,...t}){return/* @__PURE__ */ (0,i.jsx)(r.OptionRow,{"data-slot":`command-item`,density:e,...t})}function f(e){return/* @__PURE__ */ (0,i.jsx)(r.OptionLabel,{"data-slot":`command-item-label`,density:`compact`,...e})}function p({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-empty`,className:e.cn(`px-2 py-6 text-center text-base text-po-dim`,t),...n})}function m({className:t,...n}){return/* @__PURE__ */ (0,i.jsx)(`div`,{"data-slot":`command-footer`,className:e.cn(`flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-po-border-soft bg-po-deep px-3 text-sm text-po-dim`,t),...n})}exports.CommandDialog=a,exports.CommandEmpty=p,exports.CommandFooter=m,exports.CommandGroup=l,exports.CommandGroupLabel=u,exports.CommandHeader=o,exports.CommandInput=s,exports.CommandItem=d,exports.CommandItemLabel=f,exports.CommandList=c;
2
2
  //# sourceMappingURL=Command.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Command.cjs","names":["Dialog","DialogContent","cn","DialogTitle","Input","OptionRow","OptionLabel","require_cn","require_Dialog","require_Input","require_OptionList","react_jsx_runtime","CommandDialog","props","className","titleVisible","title","children","CommandHeader","CommandInput","CommandList","CommandGroup","CommandGroupLabel","CommandItem","CommandItemLabel","CommandEmpty","CommandFooter"],"sources":["../../../src/components/Command.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Dialog, DialogContent, type DialogContentProps, DialogTitle } from './Dialog';\nimport { Input, type InputProps } from './Input';\nimport { OptionLabel, OptionRow, type OptionRowProps } from './OptionList';\n\n/**\n * The command palette's frame, its search strip, its rows, and its hint.\n *\n * It has no Radix counterpart and it deliberately does no filtering: the\n * surface that opens a palette already knows how to rank its own commands,\n * and a matcher baked in here would be a second, worse one. Built on Dialog,\n * Input, and the option row so a palette and a select popover cannot drift\n * apart, rather than on a new dependency.\n */\n\nexport interface CommandDialogProps extends Omit<DialogContentProps, 'title'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Names the dialog for assistive tech; visually hidden unless the palette draws its own heading. */\n title: ReactNode;\n titleVisible?: boolean;\n}\n\nexport function CommandDialog({\n open,\n onOpenChange,\n title,\n titleVisible = false,\n className,\n children,\n width = 'lg',\n ...props\n}: CommandDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent data-slot=\"command-dialog\" width={width} className={cn('max-h-[70vh]', className)} {...props}>\n <DialogTitle className={titleVisible ? undefined : 'sr-only'}>{title}</DialogTitle>\n {children}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** The strip the search field sits in. */\nexport function CommandHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-header\"\n className={cn('flex shrink-0 items-center gap-2 border-b border-doom-border px-3 py-2.5', className)}\n {...props}\n />\n );\n}\n\n/** The search field: bare, because the header already draws the surface. */\nexport function CommandInput({ className, ...props }: InputProps) {\n return (\n <Input\n data-slot=\"command-input\"\n variant=\"bare\"\n autoFocus\n autoComplete=\"off\"\n className={cn('flex-1', className)}\n {...props}\n />\n );\n}\n\n/** The scrolling body. It is the listbox, so its rows are the options. */\nexport function CommandList({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n role=\"listbox\"\n data-slot=\"command-list\"\n className={cn('flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto p-1.5', className)}\n {...props}\n />\n );\n}\n\n/** A labelled run of rows. */\nexport function CommandGroup({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"command-group\" className={cn('flex flex-col gap-0.5', className)} {...props} />;\n}\n\nexport function CommandGroupLabel({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-group-label\"\n className={cn('px-2 pt-2 pb-1 text-sm font-semibold text-doom-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n\n/** One command. Compact by default, since a palette shows many at once. */\nexport function CommandItem({ density = 'compact', ...props }: OptionRowProps) {\n return <OptionRow data-slot=\"command-item\" density={density} {...props} />;\n}\n\n/** A command's name, taking the width the row has left. */\nexport function CommandItemLabel(props: ComponentProps<'span'>) {\n return <OptionLabel data-slot=\"command-item-label\" density=\"compact\" {...props} />;\n}\n\n/** What the palette says when nothing matches. */\nexport function CommandEmpty({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-empty\"\n className={cn('px-2 py-6 text-center text-base text-doom-dim', className)}\n {...props}\n />\n );\n}\n\n/** The hint strip along the bottom: what the keys do. */\nexport function CommandFooter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-footer\"\n className={cn(\n 'flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-doom-border-soft bg-doom-deep px-3 text-sm text-doom-dim',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"qJAyBA,SAAgBY,EAAc,CAC5B,OACA,eACA,QACA,eAAe,GACf,YACA,WACA,QAAQ,KACR,GAAGC,GACkB,CACrB,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACX,EAAAA,OAAD,CAAc,OAAoB,eAChC,SAAA,iBAAA,EAAAW,EAAA,KAAA,CAACV,EAAAA,cAAD,CAAe,YAAU,iBAAwB,QAAO,UAAWC,EAAAA,GAAG,eAAgBY,CAAS,EAAG,GAAID,EAAtG,SAAA,CACE,iBAAA,EAAAF,EAAA,IAAA,CAACR,EAAAA,YAAD,CAAa,UAAWY,EAAe,IAAA,GAAY,UAAY,SAAAC,CAAmB,CAAA,EACjFC,CACY,GACT,CAAA,CAEZ,CAGA,SAAgBC,EAAc,CAAE,YAAW,GAAGL,GAAgC,CAC5E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,iBACV,UAAWT,EAAAA,GAAG,2EAA4EY,CAAS,EACnG,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBM,EAAa,CAAE,YAAW,GAAGN,GAAqB,CAChE,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACP,EAAAA,MAAD,CACE,YAAU,gBACV,QAAQ,OACR,UAAA,GACA,aAAa,MACb,UAAWF,EAAAA,GAAG,SAAUY,CAAS,EACjC,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBO,EAAY,CAAE,YAAW,GAAGP,GAAgC,CAC1E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,KAAK,UACL,YAAU,eACV,UAAWT,EAAAA,GAAG,6DAA8DY,CAAS,EACrF,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBQ,EAAa,CAAE,YAAW,GAAGR,GAAgC,CAC3E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,gBAAgB,UAAWT,EAAAA,GAAG,wBAAyBY,CAAS,EAAG,GAAID,CAAQ,CAAA,CACvG,CAEA,SAAgBS,EAAkB,CAAE,YAAW,GAAGT,GAAgC,CAChF,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,sBACV,UAAWT,EAAAA,GAAG,4EAA6EY,CAAS,EACpG,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBU,EAAY,CAAE,UAAU,UAAW,GAAGV,GAAyB,CAC7E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAACN,EAAAA,UAAD,CAAW,YAAU,eAAwB,UAAS,GAAIQ,CAAQ,CAAA,CAC3E,CAGA,SAAgBW,EAAiB,EAA+B,CAC9D,MAAO,iBAAA,EAAAb,EAAA,IAAA,CAACL,EAAAA,YAAD,CAAa,YAAU,qBAAqB,QAAQ,UAAU,GAAIO,CAAQ,CAAA,CACnF,CAGA,SAAgBY,EAAa,CAAE,YAAW,GAAGZ,GAAgC,CAC3E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,gBACV,UAAWT,EAAAA,GAAG,gDAAiDY,CAAS,EACxE,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBa,EAAc,CAAE,YAAW,GAAGb,GAAgC,CAC5E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,iBACV,UAAWT,EAAAA,GACT,yIACAY,CACF,EACA,GAAID,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Command.cjs","names":["Dialog","DialogContent","cn","DialogTitle","Input","OptionRow","OptionLabel","require_cn","require_Dialog","require_Input","require_OptionList","react_jsx_runtime","CommandDialog","props","className","titleVisible","title","children","CommandHeader","CommandInput","CommandList","CommandGroup","CommandGroupLabel","CommandItem","CommandItemLabel","CommandEmpty","CommandFooter"],"sources":["../../../src/components/Command.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Dialog, DialogContent, type DialogContentProps, DialogTitle } from './Dialog';\nimport { Input, type InputProps } from './Input';\nimport { OptionLabel, OptionRow, type OptionRowProps } from './OptionList';\n\n/**\n * The command palette's frame, its search strip, its rows, and its hint.\n *\n * It has no Radix counterpart and it deliberately does no filtering: the\n * surface that opens a palette already knows how to rank its own commands,\n * and a matcher baked in here would be a second, worse one. Built on Dialog,\n * Input, and the option row so a palette and a select popover cannot drift\n * apart, rather than on a new dependency.\n */\n\nexport interface CommandDialogProps extends Omit<DialogContentProps, 'title'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Names the dialog for assistive tech; visually hidden unless the palette draws its own heading. */\n title: ReactNode;\n titleVisible?: boolean;\n}\n\nexport function CommandDialog({\n open,\n onOpenChange,\n title,\n titleVisible = false,\n className,\n children,\n width = 'lg',\n ...props\n}: CommandDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent data-slot=\"command-dialog\" width={width} className={cn('max-h-[70vh]', className)} {...props}>\n <DialogTitle className={titleVisible ? undefined : 'sr-only'}>{title}</DialogTitle>\n {children}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** The strip the search field sits in. */\nexport function CommandHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-header\"\n className={cn('flex shrink-0 items-center gap-2 border-b border-po-border px-3 py-2.5', className)}\n {...props}\n />\n );\n}\n\n/** The search field: bare, because the header already draws the surface. */\nexport function CommandInput({ className, ...props }: InputProps) {\n return (\n <Input\n data-slot=\"command-input\"\n variant=\"bare\"\n autoFocus\n autoComplete=\"off\"\n className={cn('flex-1', className)}\n {...props}\n />\n );\n}\n\n/** The scrolling body. It is the listbox, so its rows are the options. */\nexport function CommandList({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n role=\"listbox\"\n data-slot=\"command-list\"\n className={cn('flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto p-1.5', className)}\n {...props}\n />\n );\n}\n\n/** A labelled run of rows. */\nexport function CommandGroup({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"command-group\" className={cn('flex flex-col gap-0.5', className)} {...props} />;\n}\n\nexport function CommandGroupLabel({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-group-label\"\n className={cn('px-2 pt-2 pb-1 text-sm font-semibold text-po-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n\n/** One command. Compact by default, since a palette shows many at once. */\nexport function CommandItem({ density = 'compact', ...props }: OptionRowProps) {\n return <OptionRow data-slot=\"command-item\" density={density} {...props} />;\n}\n\n/** A command's name, taking the width the row has left. */\nexport function CommandItemLabel(props: ComponentProps<'span'>) {\n return <OptionLabel data-slot=\"command-item-label\" density=\"compact\" {...props} />;\n}\n\n/** What the palette says when nothing matches. */\nexport function CommandEmpty({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-empty\"\n className={cn('px-2 py-6 text-center text-base text-po-dim', className)}\n {...props}\n />\n );\n}\n\n/** The hint strip along the bottom: what the keys do. */\nexport function CommandFooter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"command-footer\"\n className={cn(\n 'flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-po-border-soft bg-po-deep px-3 text-sm text-po-dim',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"qJAyBA,SAAgBY,EAAc,CAC5B,OACA,eACA,QACA,eAAe,GACf,YACA,WACA,QAAQ,KACR,GAAGC,GACkB,CACrB,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACX,EAAAA,OAAD,CAAc,OAAoB,eAChC,SAAA,iBAAA,EAAAW,EAAA,KAAA,CAACV,EAAAA,cAAD,CAAe,YAAU,iBAAwB,QAAO,UAAWC,EAAAA,GAAG,eAAgBY,CAAS,EAAG,GAAID,EAAtG,SAAA,CACE,iBAAA,EAAAF,EAAA,IAAA,CAACR,EAAAA,YAAD,CAAa,UAAWY,EAAe,IAAA,GAAY,UAAY,SAAAC,CAAmB,CAAA,EACjFC,CACY,GACT,CAAA,CAEZ,CAGA,SAAgBC,EAAc,CAAE,YAAW,GAAGL,GAAgC,CAC5E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,iBACV,UAAWT,EAAAA,GAAG,yEAA0EY,CAAS,EACjG,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBM,EAAa,CAAE,YAAW,GAAGN,GAAqB,CAChE,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACP,EAAAA,MAAD,CACE,YAAU,gBACV,QAAQ,OACR,UAAA,GACA,aAAa,MACb,UAAWF,EAAAA,GAAG,SAAUY,CAAS,EACjC,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBO,EAAY,CAAE,YAAW,GAAGP,GAAgC,CAC1E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,KAAK,UACL,YAAU,eACV,UAAWT,EAAAA,GAAG,6DAA8DY,CAAS,EACrF,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBQ,EAAa,CAAE,YAAW,GAAGR,GAAgC,CAC3E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,gBAAgB,UAAWT,EAAAA,GAAG,wBAAyBY,CAAS,EAAG,GAAID,CAAQ,CAAA,CACvG,CAEA,SAAgBS,EAAkB,CAAE,YAAW,GAAGT,GAAgC,CAChF,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,sBACV,UAAWT,EAAAA,GAAG,0EAA2EY,CAAS,EAClG,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBU,EAAY,CAAE,UAAU,UAAW,GAAGV,GAAyB,CAC7E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAACN,EAAAA,UAAD,CAAW,YAAU,eAAwB,UAAS,GAAIQ,CAAQ,CAAA,CAC3E,CAGA,SAAgBW,EAAiB,EAA+B,CAC9D,MAAO,iBAAA,EAAAb,EAAA,IAAA,CAACL,EAAAA,YAAD,CAAa,YAAU,qBAAqB,QAAQ,UAAU,GAAIO,CAAQ,CAAA,CACnF,CAGA,SAAgBY,EAAa,CAAE,YAAW,GAAGZ,GAAgC,CAC3E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,gBACV,UAAWT,EAAAA,GAAG,8CAA+CY,CAAS,EACtE,GAAID,CACL,CAAA,CAEL,CAGA,SAAgBa,EAAc,CAAE,YAAW,GAAGb,GAAgC,CAC5E,MACE,iBAAA,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,iBACV,UAAWT,EAAAA,GACT,mIACAY,CACF,EACA,GAAID,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- require("../icons/icons.cjs");const e=require("../lib/cn.cjs"),t=require("./Button.cjs");let n=require("react/jsx-runtime"),r=require("react"),i=require("lucide-react");const a={idle:`copy`,copied:`copied`,failed:`copying was blocked by the browser`};function o({text:o,className:s}){let[c,l]=(0,r.useState)(`idle`);(0,r.useEffect)(()=>{if(c===`idle`)return;let e=setTimeout(()=>l(`idle`),1500);return()=>clearTimeout(e)},[c]);let u=(0,r.useCallback)(()=>{navigator.clipboard.writeText(o).then(()=>l(`copied`),()=>l(`failed`))},[o]),d=a[c];return/* @__PURE__ */ (0,n.jsx)(t.Button,{type:`button`,variant:`ghost`,size:`icon`,"data-testid":`copy-button`,"data-state":c,title:d,"aria-label":d,onClick:u,className:e.cn(`opacity-60 hover:opacity-100`,s),children:c===`copied`?/* @__PURE__ */ (0,n.jsx)(i.Check,{className:`size-3 text-doom-green`}):/* @__PURE__ */ (0,n.jsx)(i.Copy,{className:`size-3`})})}exports.CopyButton=o;
1
+ require("../icons/icons.cjs");const e=require("../lib/cn.cjs"),t=require("./Button.cjs");let n=require("react/jsx-runtime"),r=require("react"),i=require("lucide-react");const a={idle:`copy`,copied:`copied`,failed:`copying was blocked by the browser`};function o({text:o,className:s}){let[c,l]=(0,r.useState)(`idle`);(0,r.useEffect)(()=>{if(c===`idle`)return;let e=setTimeout(()=>l(`idle`),1500);return()=>clearTimeout(e)},[c]);let u=(0,r.useCallback)(()=>{navigator.clipboard.writeText(o).then(()=>l(`copied`),()=>l(`failed`))},[o]),d=a[c];return/* @__PURE__ */ (0,n.jsx)(t.Button,{type:`button`,variant:`ghost`,size:`icon`,"data-testid":`copy-button`,"data-state":c,title:d,"aria-label":d,onClick:u,className:e.cn(`opacity-60 hover:opacity-100`,s),children:c===`copied`?/* @__PURE__ */ (0,n.jsx)(i.Check,{className:`size-3 text-po-green`}):/* @__PURE__ */ (0,n.jsx)(i.Copy,{className:`size-3`})})}exports.CopyButton=o;
2
2
  //# sourceMappingURL=CopyButton.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CopyButton.cjs","names":["useState","useCallback","Button","cn","CheckIcon","CopyIcon","require_cn","require_Button","react_jsx_runtime","react","lucide_react","LABELS","CopyButton","state","setState","timer","copy","text","label","className"],"sources":["../../../src/components/CopyButton.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { CheckIcon, CopyIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\n/**\n * Puts a piece of text on the clipboard and says so.\n *\n * DESIGN PATTERNS:\n * - Always visible, dimmed. Half the cockpit's surfaces are touched rather\n * than pointed at, and a control revealed by hover does not exist there.\n * - A refused clipboard is a state, not a crash: the label says the browser\n * blocked it and the text is still there to select by hand.\n */\n\n/** How long the control stays acknowledged before returning to its icon. */\nconst FEEDBACK_MS = 1500;\n\ntype CopyState = 'idle' | 'copied' | 'failed';\n\nconst LABELS: Readonly<Record<CopyState, string>> = {\n idle: 'copy',\n copied: 'copied',\n failed: 'copying was blocked by the browser',\n};\n\nexport interface CopyButtonProps {\n /** What lands on the clipboard. */\n text: string;\n className?: string | undefined;\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [state, setState] = useState<CopyState>('idle');\n\n useEffect(() => {\n if (state === 'idle') return;\n const timer = setTimeout(() => setState('idle'), FEEDBACK_MS);\n return () => clearTimeout(timer);\n }, [state]);\n\n const copy = useCallback(() => {\n void navigator.clipboard.writeText(text).then(\n () => setState('copied'),\n () => setState('failed'),\n );\n }, [text]);\n\n const label = LABELS[state];\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"copy-button\"\n data-state={state}\n title={label}\n aria-label={label}\n onClick={copy}\n className={cn('opacity-60 hover:opacity-100', className)}\n >\n {state === 'copied' ? <CheckIcon className=\"size-3 text-doom-green\" /> : <CopyIcon className=\"size-3\" />}\n </Button>\n );\n}\n"],"mappings":"yKAiBA,MAIMW,EAA8C,CAClD,KAAM,OACN,OAAQ,SACR,OAAQ,oCACV,EAQA,SAAgBC,EAAW,CAAE,OAAM,aAA8B,CAC/D,GAAM,CAACC,EAAOC,IAAA,EAAYd,EAAAA,SAAAA,CAAoB,MAAM,GAEpD,EAAAS,EAAA,UAAA,KAAgB,CACd,GAAII,IAAU,OAAQ,OACtB,IAAME,EAAQ,eAAiBD,EAAS,MAAM,EAAG,IAAW,EAC5D,UAAa,aAAaC,CAAK,CACjC,EAAG,CAACF,CAAK,CAAC,EAEV,IAAMG,GAAA,EAAOf,EAAAA,YAAAA,KAAkB,CAC7B,UAAe,UAAU,UAAUgB,CAAI,CAAC,CAAC,SACjCH,EAAS,QAAQ,MACjBA,EAAS,QAAQ,CACzB,CACF,EAAG,CAACG,CAAI,CAAC,EAEHC,EAAQP,EAAOE,GACrB,MACE,iBAAA,EAAAL,EAAA,IAAA,CAACN,EAAAA,OAAD,CACE,KAAK,SACL,QAAQ,QACR,KAAK,OACL,cAAY,cACZ,aAAYW,EACZ,MAAOK,EACP,aAAYA,EACZ,QAASF,EACT,UAAWb,EAAAA,GAAG,+BAAgCgB,CAAS,EAEtD,SAAAN,IAAU,SAAW,iBAAA,EAAAL,EAAA,IAAA,CAACJ,EAAAA,MAAD,CAAW,UAAU,wBAA0B,CAAA,EAAI,iBAAA,EAAAI,EAAA,IAAA,CAACH,EAAAA,KAAD,CAAU,UAAU,QAAU,CAAA,CACjG,CAAA,CAEZ"}
1
+ {"version":3,"file":"CopyButton.cjs","names":["useState","useCallback","Button","cn","CheckIcon","CopyIcon","require_cn","require_Button","react_jsx_runtime","react","lucide_react","LABELS","CopyButton","state","setState","timer","copy","text","label","className"],"sources":["../../../src/components/CopyButton.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { CheckIcon, CopyIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\n/**\n * Puts a piece of text on the clipboard and says so.\n *\n * DESIGN PATTERNS:\n * - Always visible, dimmed. Half the cockpit's surfaces are touched rather\n * than pointed at, and a control revealed by hover does not exist there.\n * - A refused clipboard is a state, not a crash: the label says the browser\n * blocked it and the text is still there to select by hand.\n */\n\n/** How long the control stays acknowledged before returning to its icon. */\nconst FEEDBACK_MS = 1500;\n\ntype CopyState = 'idle' | 'copied' | 'failed';\n\nconst LABELS: Readonly<Record<CopyState, string>> = {\n idle: 'copy',\n copied: 'copied',\n failed: 'copying was blocked by the browser',\n};\n\nexport interface CopyButtonProps {\n /** What lands on the clipboard. */\n text: string;\n className?: string | undefined;\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [state, setState] = useState<CopyState>('idle');\n\n useEffect(() => {\n if (state === 'idle') return;\n const timer = setTimeout(() => setState('idle'), FEEDBACK_MS);\n return () => clearTimeout(timer);\n }, [state]);\n\n const copy = useCallback(() => {\n void navigator.clipboard.writeText(text).then(\n () => setState('copied'),\n () => setState('failed'),\n );\n }, [text]);\n\n const label = LABELS[state];\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"copy-button\"\n data-state={state}\n title={label}\n aria-label={label}\n onClick={copy}\n className={cn('opacity-60 hover:opacity-100', className)}\n >\n {state === 'copied' ? <CheckIcon className=\"size-3 text-po-green\" /> : <CopyIcon className=\"size-3\" />}\n </Button>\n );\n}\n"],"mappings":"yKAiBA,MAIMW,EAA8C,CAClD,KAAM,OACN,OAAQ,SACR,OAAQ,oCACV,EAQA,SAAgBC,EAAW,CAAE,OAAM,aAA8B,CAC/D,GAAM,CAACC,EAAOC,IAAA,EAAYd,EAAAA,SAAAA,CAAoB,MAAM,GAEpD,EAAAS,EAAA,UAAA,KAAgB,CACd,GAAII,IAAU,OAAQ,OACtB,IAAME,EAAQ,eAAiBD,EAAS,MAAM,EAAG,IAAW,EAC5D,UAAa,aAAaC,CAAK,CACjC,EAAG,CAACF,CAAK,CAAC,EAEV,IAAMG,GAAA,EAAOf,EAAAA,YAAAA,KAAkB,CAC7B,UAAe,UAAU,UAAUgB,CAAI,CAAC,CAAC,SACjCH,EAAS,QAAQ,MACjBA,EAAS,QAAQ,CACzB,CACF,EAAG,CAACG,CAAI,CAAC,EAEHC,EAAQP,EAAOE,GACrB,MACE,iBAAA,EAAAL,EAAA,IAAA,CAACN,EAAAA,OAAD,CACE,KAAK,SACL,QAAQ,QACR,KAAK,OACL,cAAY,cACZ,aAAYW,EACZ,MAAOK,EACP,aAAYA,EACZ,QAASF,EACT,UAAWb,EAAAA,GAAG,+BAAgCgB,CAAS,EAEtD,SAAAN,IAAU,SAAW,iBAAA,EAAAL,EAAA,IAAA,CAACJ,EAAAA,MAAD,CAAW,UAAU,sBAAwB,CAAA,EAAI,iBAAA,EAAAI,EAAA,IAAA,CAACH,EAAAA,KAAD,CAAU,UAAU,QAAU,CAAA,CAC/F,CAAA,CAEZ"}
@@ -1,2 +1,2 @@
1
- require("../icons/icons.cjs");const e=require("../lib/cn.cjs"),t=require("./Button.cjs");let n=require("radix-ui"),r=require("react/jsx-runtime"),i=require("react"),a=require("class-variance-authority"),o=require("lucide-react");const s=(0,i.createContext)(void 0);function c(e){let t=e.onOpenChange===void 0?void 0:t=>e.onOpenChange?.(t);return/* @__PURE__ */ (0,r.jsx)(s.Provider,{value:t,children:/* @__PURE__ */ (0,r.jsx)(n.Dialog.Root,{"data-slot":`dialog`,...e,onOpenChange:t})})}function l(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Trigger,{"data-slot":`dialog-trigger`,...e})}function u(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Portal,{"data-slot":`dialog-portal`,...e})}function d(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Close,{"data-slot":`dialog-close`,...e})}function f({className:t,onPointerDownCapture:a,...o}){let c=(0,i.useContext)(s);return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Overlay,{"data-slot":`dialog-overlay`,className:e.cn(`fixed inset-0 z-40 bg-doom-deep/70 data-[state=open]:animate-doom-fade`,t),onPointerDownCapture:e=>{if(a?.(e),e.defaultPrevented||c===void 0)return;let t=e.currentTarget.nextElementSibling;if(t?.querySelector(`[data-slot="select-trigger"][data-state="open"]`)==null)return;let n=t?.getBoundingClientRect();n&&e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom||(e.stopPropagation(),c(!1))},...o})}const p={sm:`w-[360px]`,md:`w-[480px]`,lg:`w-[620px]`};function m({className:t,children:i,width:a=`md`,...o}){return/* @__PURE__ */ (0,r.jsxs)(u,{children:[/* @__PURE__ */ (0,r.jsx)(f,{}),/* @__PURE__ */ (0,r.jsx)(n.Dialog.Content,{"data-slot":`dialog-content`,className:e.cn(`fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-24px)] max-w-[calc(100vw-24px)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border border-doom-border bg-doom-panel shadow-2xl outline-none data-[state=open]:animate-doom-pop`,p[a],t),...o,children:i})]})}function h({className:i,dismissible:a=!1,closeLabel:s=`close`,children:c,...l}){return/* @__PURE__ */ (0,r.jsxs)(`div`,{"data-slot":`dialog-header`,className:e.cn(`flex min-w-0 items-center justify-between gap-3 border-b border-doom-border px-3 py-3 sm:px-4`,i),...l,children:[c,a?/* @__PURE__ */ (0,r.jsx)(n.Dialog.Close,{asChild:!0,children:/* @__PURE__ */ (0,r.jsx)(t.Button,{variant:`ghost`,size:`icon`,"aria-label":s,className:`text-doom-faint hover:text-doom-hi`,children:/* @__PURE__ */ (0,r.jsx)(o.X,{className:`h-3 w-3`})})}):null]})}function g({className:t,...i}){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Title,{"data-slot":`dialog-title`,className:e.cn(`text-xl font-semibold text-doom-hi`,t),...i})}function _({className:t,...i}){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Description,{"data-slot":`dialog-description`,className:e.cn(`text-sm leading-relaxed text-doom-dim`,t),...i})}function v({className:t,...n}){return/* @__PURE__ */ (0,r.jsx)(`div`,{"data-slot":`dialog-body`,className:e.cn(`flex min-h-0 flex-col gap-3 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4`,t),...n})}const y=(0,a.cva)(`flex shrink-0 items-center gap-2`,{variants:{variant:{plain:`justify-end`,bar:`min-h-[34px] flex-wrap justify-between border-t border-doom-border-soft bg-doom-deep px-3 py-1.5 sm:flex-nowrap sm:px-4 sm:py-0`}},defaultVariants:{variant:`plain`}});function b({className:t,variant:n,...i}){return/* @__PURE__ */ (0,r.jsx)(`div`,{"data-slot":`dialog-footer`,className:e.cn(y({variant:n}),t),...i})}exports.Dialog=c,exports.DialogBody=v,exports.DialogClose=d,exports.DialogContent=m,exports.DialogDescription=_,exports.DialogFooter=b,exports.DialogHeader=h,exports.DialogOverlay=f,exports.DialogPortal=u,exports.DialogTitle=g,exports.DialogTrigger=l,exports.dialogFooterVariants=y;
1
+ require("../icons/icons.cjs");const e=require("../lib/cn.cjs"),t=require("./Button.cjs");let n=require("radix-ui"),r=require("react/jsx-runtime"),i=require("react"),a=require("class-variance-authority"),o=require("lucide-react");const s=(0,i.createContext)(void 0);function c(e){let t=e.onOpenChange===void 0?void 0:t=>e.onOpenChange?.(t);return/* @__PURE__ */ (0,r.jsx)(s.Provider,{value:t,children:/* @__PURE__ */ (0,r.jsx)(n.Dialog.Root,{"data-slot":`dialog`,...e,onOpenChange:t})})}function l(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Trigger,{"data-slot":`dialog-trigger`,...e})}function u(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Portal,{"data-slot":`dialog-portal`,...e})}function d(e){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Close,{"data-slot":`dialog-close`,...e})}function f({className:t,onPointerDownCapture:a,...o}){let c=(0,i.useContext)(s);return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Overlay,{"data-slot":`dialog-overlay`,className:e.cn(`fixed inset-0 z-40 bg-po-deep/70 data-[state=open]:animate-po-fade`,t),onPointerDownCapture:e=>{if(a?.(e),e.defaultPrevented||c===void 0)return;let t=e.currentTarget.nextElementSibling;if(t?.querySelector(`[data-slot="select-trigger"][data-state="open"]`)==null)return;let n=t?.getBoundingClientRect();n&&e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom||(e.stopPropagation(),c(!1))},...o})}const p={sm:`w-[360px]`,md:`w-[480px]`,lg:`w-[620px]`};function m({className:t,children:i,width:a=`md`,...o}){return/* @__PURE__ */ (0,r.jsxs)(u,{children:[/* @__PURE__ */ (0,r.jsx)(f,{}),/* @__PURE__ */ (0,r.jsx)(n.Dialog.Content,{"data-slot":`dialog-content`,className:e.cn(`fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-24px)] max-w-[calc(100vw-24px)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border border-po-border bg-po-panel shadow-2xl outline-none data-[state=open]:animate-po-pop`,p[a],t),...o,children:i})]})}function h({className:i,dismissible:a=!1,closeLabel:s=`close`,children:c,...l}){return/* @__PURE__ */ (0,r.jsxs)(`div`,{"data-slot":`dialog-header`,className:e.cn(`flex min-w-0 items-center justify-between gap-3 border-b border-po-border px-3 py-3 sm:px-4`,i),...l,children:[c,a?/* @__PURE__ */ (0,r.jsx)(n.Dialog.Close,{asChild:!0,children:/* @__PURE__ */ (0,r.jsx)(t.Button,{variant:`ghost`,size:`icon`,"aria-label":s,className:`text-po-faint hover:text-po-hi`,children:/* @__PURE__ */ (0,r.jsx)(o.X,{className:`h-3 w-3`})})}):null]})}function g({className:t,...i}){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Title,{"data-slot":`dialog-title`,className:e.cn(`text-xl font-semibold text-po-hi`,t),...i})}function _({className:t,...i}){return/* @__PURE__ */ (0,r.jsx)(n.Dialog.Description,{"data-slot":`dialog-description`,className:e.cn(`text-sm leading-relaxed text-po-dim`,t),...i})}function v({className:t,...n}){return/* @__PURE__ */ (0,r.jsx)(`div`,{"data-slot":`dialog-body`,className:e.cn(`flex min-h-0 flex-col gap-3 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4`,t),...n})}const y=(0,a.cva)(`flex shrink-0 items-center gap-2`,{variants:{variant:{plain:`justify-end`,bar:`min-h-[34px] flex-wrap justify-between border-t border-po-border-soft bg-po-deep px-3 py-1.5 sm:flex-nowrap sm:px-4 sm:py-0`}},defaultVariants:{variant:`plain`}});function b({className:t,variant:n,...i}){return/* @__PURE__ */ (0,r.jsx)(`div`,{"data-slot":`dialog-footer`,className:e.cn(y({variant:n}),t),...i})}exports.Dialog=c,exports.DialogBody=v,exports.DialogClose=d,exports.DialogContent=m,exports.DialogDescription=_,exports.DialogFooter=b,exports.DialogHeader=h,exports.DialogOverlay=f,exports.DialogPortal=u,exports.DialogTitle=g,exports.DialogTrigger=l,exports.dialogFooterVariants=y;
2
2
  //# sourceMappingURL=Dialog.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.cjs","names":["createContext","DialogPrimitive","useContext","cn","Button","CloseIcon","cva","require_cn","require_Button","radix_ui","react_jsx_runtime","react","class_variance_authority","lucide_react","DialogOpenChangeContext","Dialog","onOpenChange","props","open","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","className","onPointerDownCapture","event","dialogContent","bounds","CONTENT_WIDTH","DialogContent","width","DialogHeader","children","dismissible","closeLabel","DialogTitle","DialogDescription","DialogBody","dialogFooterVariants","DialogFooter"],"sources":["../../../src/components/Dialog.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { createContext, type ComponentProps, useContext } from 'react';\n\nimport { CloseIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\nconst DialogOpenChangeContext = createContext<((open: boolean) => void) | undefined>(undefined);\n/**\n * shadcn's Dialog on Radix: focus trap, Escape, outside click, scroll lock,\n * and focus restored to the trigger on close. The frame is the Doom panel.\n */\nexport function Dialog(props: ComponentProps<typeof DialogPrimitive.Root>) {\n const onOpenChange = props.onOpenChange === undefined ? undefined : (open: boolean) => props.onOpenChange?.(open);\n return (\n <DialogOpenChangeContext.Provider value={onOpenChange}>\n <DialogPrimitive.Root data-slot=\"dialog\" {...props} onOpenChange={onOpenChange} />\n </DialogOpenChangeContext.Provider>\n );\n}\n\nexport function DialogTrigger(props: ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nexport function DialogPortal(props: ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nexport function DialogClose(props: ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nexport function DialogOverlay({\n className,\n onPointerDownCapture,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Overlay>) {\n const onOpenChange = useContext(DialogOpenChangeContext);\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn('fixed inset-0 z-40 bg-doom-deep/70 data-[state=open]:animate-doom-fade', className)}\n onPointerDownCapture={(event) => {\n onPointerDownCapture?.(event);\n if (event.defaultPrevented || onOpenChange === undefined) return;\n const dialogContent = event.currentTarget.nextElementSibling;\n const openSelectTrigger = dialogContent?.querySelector('[data-slot=\"select-trigger\"][data-state=\"open\"]');\n if (openSelectTrigger === null || openSelectTrigger === undefined) return;\n // An open Select disables pointer events on the dialog; an inside press falls through to this overlay.\n const bounds = dialogContent?.getBoundingClientRect();\n if (\n bounds &&\n event.clientX >= bounds.left &&\n event.clientX <= bounds.right &&\n event.clientY >= bounds.top &&\n event.clientY <= bounds.bottom\n )\n return;\n\n // Radix's parent outside listener can lag one render behind a nested\n // modal Select. Own this backdrop press so the complete stack closes.\n event.stopPropagation();\n onOpenChange(false);\n }}\n {...props}\n />\n );\n}\n\nexport interface DialogContentProps extends ComponentProps<typeof DialogPrimitive.Content> {\n /** Width preset; `className` may still override. */\n width?: 'sm' | 'md' | 'lg';\n}\n\nconst CONTENT_WIDTH = { sm: 'w-[360px]', md: 'w-[480px]', lg: 'w-[620px]' } as const;\n\nexport function DialogContent({ className, children, width = 'md', ...props }: DialogContentProps) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-24px)] max-w-[calc(100vw-24px)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border border-doom-border bg-doom-panel shadow-2xl outline-none data-[state=open]:animate-doom-pop',\n CONTENT_WIDTH[width],\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nexport interface DialogHeaderProps extends ComponentProps<'div'> {\n /**\n * Show the close control at the right of the strip. Off by default: most\n * headers already put something there (a spinner, a method label) and every\n * dialog closes on Escape, so an X that fights the existing content is worse\n * than none. Turn it on for a dialog whose only way out is the mouse.\n */\n dismissible?: boolean;\n /** What the close control announces. */\n closeLabel?: string;\n}\n\nexport function DialogHeader({\n className,\n dismissible = false,\n closeLabel = 'close',\n children,\n ...props\n}: DialogHeaderProps) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\n 'flex min-w-0 items-center justify-between gap-3 border-b border-doom-border px-3 py-3 sm:px-4',\n className,\n )}\n {...props}\n >\n {children}\n {dismissible ? (\n <DialogPrimitive.Close asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label={closeLabel} className=\"text-doom-faint hover:text-doom-hi\">\n <CloseIcon className=\"h-3 w-3\" />\n </Button>\n </DialogPrimitive.Close>\n ) : null}\n </div>\n );\n}\n\nexport function DialogTitle({ className, ...props }: ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-xl font-semibold text-doom-hi', className)}\n {...props}\n />\n );\n}\n\nexport function DialogDescription({ className, ...props }: ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-sm leading-relaxed text-doom-dim', className)}\n {...props}\n />\n );\n}\n\nexport function DialogBody({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-body\"\n className={cn('flex min-h-0 flex-col gap-3 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4', className)}\n {...props}\n />\n );\n}\n\nexport const dialogFooterVariants = cva('flex shrink-0 items-center gap-2', {\n variants: {\n variant: {\n /** Buttons alone, sitting inside the body's padding. */\n plain: 'justify-end',\n /**\n * The full-width strip: a hint on the left, the buttons on the right,\n * recessed and ruled off from the body. The same shape PopoverFooter\n * draws, because a dialog and a popover promise their keys the same way.\n */\n bar: 'min-h-[34px] flex-wrap justify-between border-t border-doom-border-soft bg-doom-deep px-3 py-1.5 sm:flex-nowrap sm:px-4 sm:py-0',\n },\n },\n defaultVariants: { variant: 'plain' },\n});\n\nexport interface DialogFooterProps extends ComponentProps<'div'>, VariantProps<typeof dialogFooterVariants> {}\n\nexport function DialogFooter({ className, variant, ...props }: DialogFooterProps) {\n return <div data-slot=\"dialog-footer\" className={cn(dialogFooterVariants({ variant }), className)} {...props} />;\n}\n"],"mappings":"qOAQA,MAAMc,GAAA,EAA0Bd,EAAAA,cAAAA,CAAqD,IAAA,EAAS,EAK9F,SAAgBe,EAAO,EAAoD,CACzE,IAAMC,EAAeC,EAAM,eAAiB,IAAA,GAAY,IAAA,GAAa,GAAkBA,EAAM,eAAeC,CAAI,EAChH,MACE,iBAAA,EAAAR,EAAA,IAAA,CAACI,EAAwB,SAAzB,CAAkC,MAAOE,EACvC,SAAA,iBAAA,EAAAN,EAAA,IAAA,CAACT,EAAAA,OAAgB,KAAjB,CAAsB,YAAU,SAAS,GAAIgB,EAAqB,cAAe,CAAA,CACjD,CAAA,CAEtC,CAEA,SAAgBE,EAAc,EAAuD,CACnF,MAAO,iBAAA,EAAAT,EAAA,IAAA,CAACT,EAAAA,OAAgB,QAAjB,CAAyB,YAAU,iBAAiB,GAAIgB,CAAQ,CAAA,CACzE,CAEA,SAAgBG,EAAa,EAAsD,CACjF,MAAO,iBAAA,EAAAV,EAAA,IAAA,CAACT,EAAAA,OAAgB,OAAjB,CAAwB,YAAU,gBAAgB,GAAIgB,CAAQ,CAAA,CACvE,CAEA,SAAgBI,EAAY,EAAqD,CAC/E,MAAO,iBAAA,EAAAX,EAAA,IAAA,CAACT,EAAAA,OAAgB,MAAjB,CAAuB,YAAU,eAAe,GAAIgB,CAAQ,CAAA,CACrE,CAEA,SAAgBK,EAAc,CAC5B,YACA,uBACA,GAAGL,GAC8C,CACjD,IAAMD,GAAA,EAAed,EAAAA,WAAAA,CAAWY,CAAuB,EACvD,MACE,iBAAA,EAAAJ,EAAA,IAAA,CAACT,EAAAA,OAAgB,QAAjB,CACE,YAAU,iBACV,UAAWE,EAAAA,GAAG,yEAA0EoB,CAAS,EACjG,qBAAuB,GAAU,CAE/B,GADAC,IAAuBC,CAAK,EACxBA,EAAM,kBAAoBT,IAAiB,IAAA,GAAW,OAC1D,IAAMU,EAAgBD,EAAM,cAAc,mBAE1C,GAD0BC,GAAe,cAAc,iDAAiD,GAC9E,KAAyC,OAEnE,IAAMC,EAASD,GAAe,sBAAsB,EAElDC,GACAF,EAAM,SAAWE,EAAO,MACxBF,EAAM,SAAWE,EAAO,OACxBF,EAAM,SAAWE,EAAO,KACxBF,EAAM,SAAWE,EAAO,SAM1BF,EAAM,gBAAgB,EACtBT,EAAa,EAAK,EACpB,EACA,GAAIC,CACL,CAAA,CAEL,CAOA,MAAMW,EAAgB,CAAE,GAAI,YAAa,GAAI,YAAa,GAAI,WAAY,EAE1E,SAAgBC,EAAc,CAAE,YAAW,WAAU,QAAQ,KAAM,GAAGZ,GAA6B,CACjG,MACE,iBAAA,EAAAP,EAAA,KAAA,CAACU,EAAD,CAAA,SAAA,CACE,iBAAA,EAAAV,EAAA,IAAA,CAACY,EAAD,CAAgB,CAAA,EAChB,iBAAA,EAAAZ,EAAA,IAAA,CAACT,EAAAA,OAAgB,QAAjB,CACE,YAAU,iBACV,UAAWE,EAAAA,GACT,+PACAyB,EAAcE,GACdP,CACF,EACA,GAAIN,EAEH,UACsB,CAAA,CACb,CAAA,CAAA,CAElB,CAcA,SAAgBc,EAAa,CAC3B,YACA,cAAc,GACd,aAAa,QACb,WACA,GAAGd,GACiB,CACpB,MACE,iBAAA,EAAAP,EAAA,KAAA,CAAC,MAAD,CACE,YAAU,gBACV,UAAWP,EAAAA,GACT,gGACAoB,CACF,EACA,GAAIN,EANN,SAAA,CAQGe,EACAC,EACC,iBAAA,EAAAvB,EAAA,IAAA,CAACT,EAAAA,OAAgB,MAAjB,CAAuB,QAAA,GACrB,SAAA,iBAAA,EAAAS,EAAA,IAAA,CAACN,EAAAA,OAAD,CAAQ,QAAQ,QAAQ,KAAK,OAAO,aAAY8B,EAAY,UAAU,qCACpE,SAAA,iBAAA,EAAAxB,EAAA,IAAA,CAACL,EAAAA,EAAD,CAAW,UAAU,SAAW,CAAA,CAC1B,CAAA,CACa,CAAA,EACrB,IACD,GAET,CAEA,SAAgB8B,EAAY,CAAE,YAAW,GAAGlB,GAAuD,CACjG,MACE,iBAAA,EAAAP,EAAA,IAAA,CAACT,EAAAA,OAAgB,MAAjB,CACE,YAAU,eACV,UAAWE,EAAAA,GAAG,qCAAsCoB,CAAS,EAC7D,GAAIN,CACL,CAAA,CAEL,CAEA,SAAgBmB,EAAkB,CAAE,YAAW,GAAGnB,GAA6D,CAC7G,MACE,iBAAA,EAAAP,EAAA,IAAA,CAACT,EAAAA,OAAgB,YAAjB,CACE,YAAU,qBACV,UAAWE,EAAAA,GAAG,wCAAyCoB,CAAS,EAChE,GAAIN,CACL,CAAA,CAEL,CAEA,SAAgBoB,EAAW,CAAE,YAAW,GAAGpB,GAAgC,CACzE,MACE,iBAAA,EAAAP,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,cACV,UAAWP,EAAAA,GAAG,wEAAyEoB,CAAS,EAChG,GAAIN,CACL,CAAA,CAEL,CAEA,MAAaqB,GAAA,EAAuBhC,EAAAA,IAAAA,CAAI,mCAAoC,CAC1E,SAAU,CACR,QAAS,CAEP,MAAO,cAMP,IAAK,iIACP,CACF,EACA,gBAAiB,CAAE,QAAS,OAAQ,CACtC,CAAC,EAID,SAAgBiC,EAAa,CAAE,YAAW,UAAS,GAAGtB,GAA4B,CAChF,MAAO,iBAAA,EAAAP,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,gBAAgB,UAAWP,EAAAA,GAAGmC,EAAqB,CAAE,SAAQ,CAAC,EAAGf,CAAS,EAAG,GAAIN,CAAQ,CAAA,CACjH"}
1
+ {"version":3,"file":"Dialog.cjs","names":["createContext","DialogPrimitive","useContext","cn","Button","CloseIcon","cva","require_cn","require_Button","radix_ui","react_jsx_runtime","react","class_variance_authority","lucide_react","DialogOpenChangeContext","Dialog","onOpenChange","props","open","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","className","onPointerDownCapture","event","dialogContent","bounds","CONTENT_WIDTH","DialogContent","width","DialogHeader","children","dismissible","closeLabel","DialogTitle","DialogDescription","DialogBody","dialogFooterVariants","DialogFooter"],"sources":["../../../src/components/Dialog.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { createContext, type ComponentProps, useContext } from 'react';\n\nimport { CloseIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\nconst DialogOpenChangeContext = createContext<((open: boolean) => void) | undefined>(undefined);\n/**\n * shadcn's Dialog on Radix: focus trap, Escape, outside click, scroll lock,\n * and focus restored to the trigger on close. The frame is the Po panel.\n */\nexport function Dialog(props: ComponentProps<typeof DialogPrimitive.Root>) {\n const onOpenChange = props.onOpenChange === undefined ? undefined : (open: boolean) => props.onOpenChange?.(open);\n return (\n <DialogOpenChangeContext.Provider value={onOpenChange}>\n <DialogPrimitive.Root data-slot=\"dialog\" {...props} onOpenChange={onOpenChange} />\n </DialogOpenChangeContext.Provider>\n );\n}\n\nexport function DialogTrigger(props: ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nexport function DialogPortal(props: ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nexport function DialogClose(props: ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nexport function DialogOverlay({\n className,\n onPointerDownCapture,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Overlay>) {\n const onOpenChange = useContext(DialogOpenChangeContext);\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn('fixed inset-0 z-40 bg-po-deep/70 data-[state=open]:animate-po-fade', className)}\n onPointerDownCapture={(event) => {\n onPointerDownCapture?.(event);\n if (event.defaultPrevented || onOpenChange === undefined) return;\n const dialogContent = event.currentTarget.nextElementSibling;\n const openSelectTrigger = dialogContent?.querySelector('[data-slot=\"select-trigger\"][data-state=\"open\"]');\n if (openSelectTrigger === null || openSelectTrigger === undefined) return;\n // An open Select disables pointer events on the dialog; an inside press falls through to this overlay.\n const bounds = dialogContent?.getBoundingClientRect();\n if (\n bounds &&\n event.clientX >= bounds.left &&\n event.clientX <= bounds.right &&\n event.clientY >= bounds.top &&\n event.clientY <= bounds.bottom\n )\n return;\n\n // Radix's parent outside listener can lag one render behind a nested\n // modal Select. Own this backdrop press so the complete stack closes.\n event.stopPropagation();\n onOpenChange(false);\n }}\n {...props}\n />\n );\n}\n\nexport interface DialogContentProps extends ComponentProps<typeof DialogPrimitive.Content> {\n /** Width preset; `className` may still override. */\n width?: 'sm' | 'md' | 'lg';\n}\n\nconst CONTENT_WIDTH = { sm: 'w-[360px]', md: 'w-[480px]', lg: 'w-[620px]' } as const;\n\nexport function DialogContent({ className, children, width = 'md', ...props }: DialogContentProps) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-24px)] max-w-[calc(100vw-24px)] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border border-po-border bg-po-panel shadow-2xl outline-none data-[state=open]:animate-po-pop',\n CONTENT_WIDTH[width],\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nexport interface DialogHeaderProps extends ComponentProps<'div'> {\n /**\n * Show the close control at the right of the strip. Off by default: most\n * headers already put something there (a spinner, a method label) and every\n * dialog closes on Escape, so an X that fights the existing content is worse\n * than none. Turn it on for a dialog whose only way out is the mouse.\n */\n dismissible?: boolean;\n /** What the close control announces. */\n closeLabel?: string;\n}\n\nexport function DialogHeader({\n className,\n dismissible = false,\n closeLabel = 'close',\n children,\n ...props\n}: DialogHeaderProps) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\n 'flex min-w-0 items-center justify-between gap-3 border-b border-po-border px-3 py-3 sm:px-4',\n className,\n )}\n {...props}\n >\n {children}\n {dismissible ? (\n <DialogPrimitive.Close asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label={closeLabel} className=\"text-po-faint hover:text-po-hi\">\n <CloseIcon className=\"h-3 w-3\" />\n </Button>\n </DialogPrimitive.Close>\n ) : null}\n </div>\n );\n}\n\nexport function DialogTitle({ className, ...props }: ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-xl font-semibold text-po-hi', className)}\n {...props}\n />\n );\n}\n\nexport function DialogDescription({ className, ...props }: ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-sm leading-relaxed text-po-dim', className)}\n {...props}\n />\n );\n}\n\nexport function DialogBody({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-body\"\n className={cn('flex min-h-0 flex-col gap-3 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4', className)}\n {...props}\n />\n );\n}\n\nexport const dialogFooterVariants = cva('flex shrink-0 items-center gap-2', {\n variants: {\n variant: {\n /** Buttons alone, sitting inside the body's padding. */\n plain: 'justify-end',\n /**\n * The full-width strip: a hint on the left, the buttons on the right,\n * recessed and ruled off from the body. The same shape PopoverFooter\n * draws, because a dialog and a popover promise their keys the same way.\n */\n bar: 'min-h-[34px] flex-wrap justify-between border-t border-po-border-soft bg-po-deep px-3 py-1.5 sm:flex-nowrap sm:px-4 sm:py-0',\n },\n },\n defaultVariants: { variant: 'plain' },\n});\n\nexport interface DialogFooterProps extends ComponentProps<'div'>, VariantProps<typeof dialogFooterVariants> {}\n\nexport function DialogFooter({ className, variant, ...props }: DialogFooterProps) {\n return <div data-slot=\"dialog-footer\" className={cn(dialogFooterVariants({ variant }), className)} {...props} />;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs"),t=require("./Button.cjs"),n=require("../lib/review.cjs");let r=require("react/jsx-runtime"),i=require("react");const a={"+":`bg-doom-tint-green text-doom-green`,"-":`bg-doom-tint-red text-doom-red`," ":`text-doom-dim`};function o(e){return e===`+`||e===`-`||e===` `}function s({hunks:s,testId:c,onSelect:l,renderAfterRow:u,className:d}){let f=n.diffGutterWidth(s);return s.length===0?/* @__PURE__ */ (0,r.jsx)(`p`,{"data-testid":`${c}-empty`,className:`px-2 py-1 text-sm text-doom-dim`,children:`no lines changed`}):/* @__PURE__ */ (0,r.jsx)(`div`,{"data-testid":c,"data-diff-surface":c,onMouseUp:()=>{if(l===void 0)return;let e=globalThis.getSelection?.(),t=e?.toString()??``;if(t.trim()===``)return;let r=[...document.querySelectorAll(`[data-diff-surface="${c}"] [data-diff-line]`)].filter(t=>e?.containsNode(t,!0)===!0).map(e=>({marker:e.dataset.diffMarker,line:Number(e.dataset.diffLine)})).filter(e=>o(e.marker)),i=n.diffRangeOf(r);i!==void 0&&l({...i,snippet:t})},className:e.cn(`overflow-x-auto font-mono text-sm leading-normal`,d),children:s.map((n,o)=>/* @__PURE__ */ (0,r.jsxs)(`div`,{children:[o>0?/* @__PURE__ */ (0,r.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-0.5 text-2xs text-doom-faint`,children:[/* @__PURE__ */ (0,r.jsx)(`span`,{className:`h-px flex-1 bg-doom-border-soft`}),/* @__PURE__ */ (0,r.jsx)(`span`,{children:`⋯`}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`h-px flex-1 bg-doom-border-soft`})]}):null,n.rows.map((n,o)=>/* @__PURE__ */ (0,r.jsxs)(i.Fragment,{children:[/* @__PURE__ */ (0,r.jsxs)(`div`,{"data-diff-line":n.line,"data-diff-marker":n.marker,className:e.cn(`flex whitespace-pre`,a[n.marker]),children:[l===void 0?/* @__PURE__ */ (0,r.jsx)(`span`,{"aria-hidden":!0,className:`shrink-0 select-none pr-2 pl-2 text-right text-doom-faint`,style:{width:`${f+2}ch`},children:n.line}):/* @__PURE__ */ (0,r.jsx)(t.Button,{variant:`ghost`,size:`xs`,"data-diff-gutter":n.line,"aria-label":`comment on ${n.marker===`-`?`removed `:``}line ${n.line}`,onClick:()=>l({side:n.marker===`-`?`old`:`new`,startLine:n.line,endLine:n.line,snippet:n.content}),className:`h-auto min-h-0 min-w-0 shrink-0 select-none justify-end rounded-none py-0 pr-2 pl-2 font-normal text-sm text-doom-faint hover:bg-transparent hover:text-doom-blue`,style:{width:`${f+2}ch`},children:n.line}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`shrink-0 select-none pr-1`,children:n.marker}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`min-w-0`,children:n.content})]}),u?.(n)]},`${n.marker}-${n.line}-${o}`))]},`${n.start}-${o}`))})}exports.DiffView=s;
1
+ const e=require("../lib/cn.cjs"),t=require("./Button.cjs"),n=require("../lib/review.cjs");let r=require("react/jsx-runtime"),i=require("react");const a={"+":`bg-po-tint-green text-po-green`,"-":`bg-po-tint-red text-po-red`," ":`text-po-dim`};function o(e){return e===`+`||e===`-`||e===` `}function s({hunks:s,testId:c,onSelect:l,renderAfterRow:u,className:d}){let f=n.diffGutterWidth(s);return s.length===0?/* @__PURE__ */ (0,r.jsx)(`p`,{"data-testid":`${c}-empty`,className:`px-2 py-1 text-sm text-po-dim`,children:`no lines changed`}):/* @__PURE__ */ (0,r.jsx)(`div`,{"data-testid":c,"data-diff-surface":c,onMouseUp:()=>{if(l===void 0)return;let e=globalThis.getSelection?.(),t=e?.toString()??``;if(t.trim()===``)return;let r=[...document.querySelectorAll(`[data-diff-surface="${c}"] [data-diff-line]`)].filter(t=>e?.containsNode(t,!0)===!0).map(e=>({marker:e.dataset.diffMarker,line:Number(e.dataset.diffLine)})).filter(e=>o(e.marker)),i=n.diffRangeOf(r);i!==void 0&&l({...i,snippet:t})},className:e.cn(`overflow-x-auto font-mono text-sm leading-normal`,d),children:s.map((n,o)=>/* @__PURE__ */ (0,r.jsxs)(`div`,{children:[o>0?/* @__PURE__ */ (0,r.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-0.5 text-2xs text-po-faint`,children:[/* @__PURE__ */ (0,r.jsx)(`span`,{className:`h-px flex-1 bg-po-border-soft`}),/* @__PURE__ */ (0,r.jsx)(`span`,{children:`⋯`}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`h-px flex-1 bg-po-border-soft`})]}):null,n.rows.map((n,o)=>/* @__PURE__ */ (0,r.jsxs)(i.Fragment,{children:[/* @__PURE__ */ (0,r.jsxs)(`div`,{"data-diff-line":n.line,"data-diff-marker":n.marker,className:e.cn(`flex whitespace-pre`,a[n.marker]),children:[l===void 0?/* @__PURE__ */ (0,r.jsx)(`span`,{"aria-hidden":!0,className:`shrink-0 select-none pr-2 pl-2 text-right text-po-faint`,style:{width:`${f+2}ch`},children:n.line}):/* @__PURE__ */ (0,r.jsx)(t.Button,{variant:`ghost`,size:`xs`,"data-diff-gutter":n.line,"aria-label":`comment on ${n.marker===`-`?`removed `:``}line ${n.line}`,onClick:()=>l({side:n.marker===`-`?`old`:`new`,startLine:n.line,endLine:n.line,snippet:n.content}),className:`h-auto min-h-0 min-w-0 shrink-0 select-none justify-end rounded-none py-0 pr-2 pl-2 font-normal text-sm text-po-faint hover:bg-transparent hover:text-po-blue`,style:{width:`${f+2}ch`},children:n.line}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`shrink-0 select-none pr-1`,children:n.marker}),/* @__PURE__ */ (0,r.jsx)(`span`,{className:`min-w-0`,children:n.content})]}),u?.(n)]},`${n.marker}-${n.line}-${o}`))]},`${n.start}-${o}`))})}exports.DiffView=s;
2
2
  //# sourceMappingURL=DiffView.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiffView.cjs","names":["diffGutterWidth","diffRangeOf","cn","Fragment","Button","require_cn","require_Button","require_review","react_jsx_runtime","react","ROW_TONE","isMarker","value","DiffView","gutter","hunks","testId","onSelect","selection","text","touched","row","range","className","position","hunk","renderAfterRow","offset"],"sources":["../../../src/components/DiffView.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { diffGutterWidth, diffRangeOf } from '../lib/review';\nimport type { DiffHunk, DiffMarker, DiffRow, DiffSelection } from '../types/diff';\nimport { Button } from './Button';\n\n/**\n * A diff, drawn the way this cockpit draws every other one: a numbered gutter\n * and a background wash per row, so a change reads at a glance rather than by\n * hunting for leading punctuation.\n *\n * Hunks arrive apart rather than joined by an elision marker, so the gap\n * between two of them is a rule the component draws, not a line it has to\n * recognise in a string.\n *\n * A reader comments two ways: by highlighting text, which reports the lines the\n * highlight touches, or by clicking a line number, which reports that one line.\n * Either way the selection names its side, so a note on a removed line points\n * at the old file rather than at whatever the new file has on that number.\n */\n\nconst ROW_TONE: Readonly<Record<DiffMarker, string>> = {\n '+': 'bg-doom-tint-green text-doom-green',\n '-': 'bg-doom-tint-red text-doom-red',\n ' ': 'text-doom-dim',\n};\n\nexport interface DiffViewProps {\n hunks: readonly DiffHunk[];\n /** Marks the surface so a test and a selection handler can find it. Unique per diff on a page. */\n testId: string;\n /** Called with the selected text, the lines it covers, and their side. Enables line-number clicks. */\n onSelect?: (selection: DiffSelection) => void;\n /** Drawn under one row, full width: inline comments and an open draft go here. */\n renderAfterRow?: (row: DiffRow) => ReactNode;\n className?: string;\n}\n\nfunction isMarker(value: string | undefined): value is DiffMarker {\n return value === '+' || value === '-' || value === ' ';\n}\n\nexport function DiffView({ hunks, testId, onSelect, renderAfterRow, className }: DiffViewProps) {\n const gutter = diffGutterWidth(hunks);\n\n /**\n * Turns whatever the reader highlighted into a line range. The rows carry\n * their own numbers and markers, so the range comes from the rows the\n * selection touches rather than from counting newlines in the rendered text.\n */\n const handleSelect = (): void => {\n if (onSelect === undefined) return;\n const selection = globalThis.getSelection?.();\n const text = selection?.toString() ?? '';\n if (text.trim() === '') return;\n const rows = [...document.querySelectorAll<HTMLElement>(`[data-diff-surface=\"${testId}\"] [data-diff-line]`)];\n const touched = rows\n .filter((row) => selection?.containsNode(row, true) === true)\n .map((row) => ({ marker: row.dataset.diffMarker, line: Number(row.dataset.diffLine) }))\n .filter((row): row is { marker: DiffMarker; line: number } => isMarker(row.marker));\n const range = diffRangeOf(touched);\n if (range !== undefined) onSelect({ ...range, snippet: text });\n };\n\n if (hunks.length === 0) {\n return (\n <p data-testid={`${testId}-empty`} className=\"px-2 py-1 text-sm text-doom-dim\">\n no lines changed\n </p>\n );\n }\n\n return (\n <div\n data-testid={testId}\n data-diff-surface={testId}\n onMouseUp={handleSelect}\n className={cn('overflow-x-auto font-mono text-sm leading-normal', className)}\n >\n {hunks.map((hunk, position) => (\n <div key={`${hunk.start}-${position}`}>\n {position > 0 ? (\n <div className=\"flex items-center gap-2 px-2 py-0.5 text-2xs text-doom-faint\">\n <span className=\"h-px flex-1 bg-doom-border-soft\" />\n <span>⋯</span>\n <span className=\"h-px flex-1 bg-doom-border-soft\" />\n </div>\n ) : null}\n {hunk.rows.map((row, offset) => (\n <Fragment key={`${row.marker}-${row.line}-${offset}`}>\n <div\n data-diff-line={row.line}\n data-diff-marker={row.marker}\n className={cn('flex whitespace-pre', ROW_TONE[row.marker])}\n >\n {onSelect === undefined ? (\n <span\n aria-hidden\n className=\"shrink-0 select-none pr-2 pl-2 text-right text-doom-faint\"\n style={{ width: `${gutter + 2}ch` }}\n >\n {row.line}\n </span>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-diff-gutter={row.line}\n aria-label={`comment on ${row.marker === '-' ? 'removed ' : ''}line ${row.line}`}\n onClick={() =>\n onSelect({\n side: row.marker === '-' ? 'old' : 'new',\n startLine: row.line,\n endLine: row.line,\n snippet: row.content,\n })\n }\n className=\"h-auto min-h-0 min-w-0 shrink-0 select-none justify-end rounded-none py-0 pr-2 pl-2 font-normal text-sm text-doom-faint hover:bg-transparent hover:text-doom-blue\"\n style={{ width: `${gutter + 2}ch` }}\n >\n {row.line}\n </Button>\n )}\n <span className=\"shrink-0 select-none pr-1\">{row.marker}</span>\n <span className=\"min-w-0\">{row.content}</span>\n </div>\n {renderAfterRow?.(row)}\n </Fragment>\n ))}\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiffView.cjs","names":["diffGutterWidth","diffRangeOf","cn","Fragment","Button","require_cn","require_Button","require_review","react_jsx_runtime","react","ROW_TONE","isMarker","value","DiffView","gutter","hunks","testId","onSelect","selection","text","touched","row","range","className","position","hunk","renderAfterRow","offset"],"sources":["../../../src/components/DiffView.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { diffGutterWidth, diffRangeOf } from '../lib/review';\nimport type { DiffHunk, DiffMarker, DiffRow, DiffSelection } from '../types/diff';\nimport { Button } from './Button';\n\n/**\n * A diff, drawn the way this cockpit draws every other one: a numbered gutter\n * and a background wash per row, so a change reads at a glance rather than by\n * hunting for leading punctuation.\n *\n * Hunks arrive apart rather than joined by an elision marker, so the gap\n * between two of them is a rule the component draws, not a line it has to\n * recognise in a string.\n *\n * A reader comments two ways: by highlighting text, which reports the lines the\n * highlight touches, or by clicking a line number, which reports that one line.\n * Either way the selection names its side, so a note on a removed line points\n * at the old file rather than at whatever the new file has on that number.\n */\n\nconst ROW_TONE: Readonly<Record<DiffMarker, string>> = {\n '+': 'bg-po-tint-green text-po-green',\n '-': 'bg-po-tint-red text-po-red',\n ' ': 'text-po-dim',\n};\n\nexport interface DiffViewProps {\n hunks: readonly DiffHunk[];\n /** Marks the surface so a test and a selection handler can find it. Unique per diff on a page. */\n testId: string;\n /** Called with the selected text, the lines it covers, and their side. Enables line-number clicks. */\n onSelect?: (selection: DiffSelection) => void;\n /** Drawn under one row, full width: inline comments and an open draft go here. */\n renderAfterRow?: (row: DiffRow) => ReactNode;\n className?: string;\n}\n\nfunction isMarker(value: string | undefined): value is DiffMarker {\n return value === '+' || value === '-' || value === ' ';\n}\n\nexport function DiffView({ hunks, testId, onSelect, renderAfterRow, className }: DiffViewProps) {\n const gutter = diffGutterWidth(hunks);\n\n /**\n * Turns whatever the reader highlighted into a line range. The rows carry\n * their own numbers and markers, so the range comes from the rows the\n * selection touches rather than from counting newlines in the rendered text.\n */\n const handleSelect = (): void => {\n if (onSelect === undefined) return;\n const selection = globalThis.getSelection?.();\n const text = selection?.toString() ?? '';\n if (text.trim() === '') return;\n const rows = [...document.querySelectorAll<HTMLElement>(`[data-diff-surface=\"${testId}\"] [data-diff-line]`)];\n const touched = rows\n .filter((row) => selection?.containsNode(row, true) === true)\n .map((row) => ({ marker: row.dataset.diffMarker, line: Number(row.dataset.diffLine) }))\n .filter((row): row is { marker: DiffMarker; line: number } => isMarker(row.marker));\n const range = diffRangeOf(touched);\n if (range !== undefined) onSelect({ ...range, snippet: text });\n };\n\n if (hunks.length === 0) {\n return (\n <p data-testid={`${testId}-empty`} className=\"px-2 py-1 text-sm text-po-dim\">\n no lines changed\n </p>\n );\n }\n\n return (\n <div\n data-testid={testId}\n data-diff-surface={testId}\n onMouseUp={handleSelect}\n className={cn('overflow-x-auto font-mono text-sm leading-normal', className)}\n >\n {hunks.map((hunk, position) => (\n <div key={`${hunk.start}-${position}`}>\n {position > 0 ? (\n <div className=\"flex items-center gap-2 px-2 py-0.5 text-2xs text-po-faint\">\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n <span>⋯</span>\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n </div>\n ) : null}\n {hunk.rows.map((row, offset) => (\n <Fragment key={`${row.marker}-${row.line}-${offset}`}>\n <div\n data-diff-line={row.line}\n data-diff-marker={row.marker}\n className={cn('flex whitespace-pre', ROW_TONE[row.marker])}\n >\n {onSelect === undefined ? (\n <span\n aria-hidden\n className=\"shrink-0 select-none pr-2 pl-2 text-right text-po-faint\"\n style={{ width: `${gutter + 2}ch` }}\n >\n {row.line}\n </span>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-diff-gutter={row.line}\n aria-label={`comment on ${row.marker === '-' ? 'removed ' : ''}line ${row.line}`}\n onClick={() =>\n onSelect({\n side: row.marker === '-' ? 'old' : 'new',\n startLine: row.line,\n endLine: row.line,\n snippet: row.content,\n })\n }\n className=\"h-auto min-h-0 min-w-0 shrink-0 select-none justify-end rounded-none py-0 pr-2 pl-2 font-normal text-sm text-po-faint hover:bg-transparent hover:text-po-blue\"\n style={{ width: `${gutter + 2}ch` }}\n >\n {row.line}\n </Button>\n )}\n <span className=\"shrink-0 select-none pr-1\">{row.marker}</span>\n <span className=\"min-w-0\">{row.content}</span>\n </div>\n {renderAfterRow?.(row)}\n </Fragment>\n ))}\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs");let t=require("react/jsx-runtime");const n=(0,require("class-variance-authority").cva)(`inline-block shrink-0 rounded-full`,{variants:{tone:{neutral:`bg-doom-faint`,muted:`bg-doom-faint/40`,blue:`bg-doom-blue`,green:`bg-doom-green`,yellow:`bg-doom-yellow`,red:`bg-doom-red`,magenta:`bg-doom-magenta`,violet:`bg-doom-violet`,cyan:`bg-doom-cyan`,orange:`bg-doom-orange`,teal:`bg-doom-teal`},size:{xs:`h-1 w-1`,sm:`h-1.5 w-1.5`,md:`h-2 w-2`,lg:`h-2.5 w-2.5`},pulse:{true:`animate-pulse`,false:``}},defaultVariants:{tone:`neutral`,size:`sm`,pulse:!1}});function r({className:r,tone:i,size:a,pulse:o,...s}){return/* @__PURE__ */ (0,t.jsx)(`span`,{"data-slot":`dot`,"aria-hidden":!0,className:e.cn(n({tone:i,size:a,pulse:o}),r),...s})}exports.Dot=r,exports.dotVariants=n;
1
+ const e=require("../lib/cn.cjs");let t=require("react/jsx-runtime");const n=(0,require("class-variance-authority").cva)(`inline-block shrink-0 rounded-full`,{variants:{tone:{neutral:`bg-po-faint`,muted:`bg-po-faint/40`,blue:`bg-po-blue`,green:`bg-po-green`,yellow:`bg-po-yellow`,red:`bg-po-red`,magenta:`bg-po-magenta`,violet:`bg-po-violet`,cyan:`bg-po-cyan`,orange:`bg-po-orange`,teal:`bg-po-teal`},size:{xs:`h-1 w-1`,sm:`h-1.5 w-1.5`,md:`h-2 w-2`,lg:`h-2.5 w-2.5`},pulse:{true:`animate-pulse`,false:``}},defaultVariants:{tone:`neutral`,size:`sm`,pulse:!1}});function r({className:r,tone:i,size:a,pulse:o,...s}){return/* @__PURE__ */ (0,t.jsx)(`span`,{"data-slot":`dot`,"aria-hidden":!0,className:e.cn(n({tone:i,size:a,pulse:o}),r),...s})}exports.Dot=r,exports.dotVariants=n;
2
2
  //# sourceMappingURL=Dot.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dot.cjs","names":["cva","cn","require_cn","react_jsx_runtime","dotVariants","Dot","props","className"],"sources":["../../../src/components/Dot.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport type { DotTone as Tone } from '../types/tone';\n\nexport const dotVariants = cva('inline-block shrink-0 rounded-full', {\n variants: {\n tone: {\n neutral: 'bg-doom-faint',\n muted: 'bg-doom-faint/40',\n blue: 'bg-doom-blue',\n green: 'bg-doom-green',\n yellow: 'bg-doom-yellow',\n red: 'bg-doom-red',\n magenta: 'bg-doom-magenta',\n violet: 'bg-doom-violet',\n cyan: 'bg-doom-cyan',\n orange: 'bg-doom-orange',\n teal: 'bg-doom-teal',\n } satisfies Record<Tone, string>,\n size: {\n xs: 'h-1 w-1',\n sm: 'h-1.5 w-1.5',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n },\n pulse: {\n true: 'animate-pulse',\n false: '',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'sm', pulse: false },\n});\n\nexport type DotTone = Tone;\n\nexport interface DotProps extends ComponentProps<'span'>, VariantProps<typeof dotVariants> {}\n\n/** The status dot: a colour and, while something is live, a pulse. */\nexport function Dot({ className, tone, size, pulse, ...props }: DotProps) {\n return <span data-slot=\"dot\" aria-hidden className={cn(dotVariants({ tone, size, pulse }), className)} {...props} />;\n}\n"],"mappings":"oEAMA,MAAaI,GAAA,oCAAcJ,CAAAA,CAAAA,IAAAA,CAAI,qCAAsC,CACnE,SAAU,CACR,KAAM,CACJ,QAAS,gBACT,MAAO,mBACP,KAAM,eACN,MAAO,gBACP,OAAQ,iBACR,IAAK,cACL,QAAS,kBACT,OAAQ,iBACR,KAAM,eACN,OAAQ,iBACR,KAAM,cACR,EACA,KAAM,CACJ,GAAI,UACJ,GAAI,cACJ,GAAI,UACJ,GAAI,aACN,EACA,MAAO,CACL,KAAM,gBACN,MAAO,EACT,CACF,EACA,gBAAiB,CAAE,KAAM,UAAW,KAAM,KAAM,MAAO,EAAM,CAC/D,CAAC,EAOD,SAAgBK,EAAI,CAAE,YAAW,OAAM,OAAM,QAAO,GAAGC,GAAmB,CACxE,MAAO,iBAAA,EAAAH,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,MAAM,cAAA,GAAY,UAAWF,EAAAA,GAAGG,EAAY,CAAE,OAAM,OAAM,OAAM,CAAC,EAAGG,CAAS,EAAG,GAAID,CAAQ,CAAA,CACrH"}
1
+ {"version":3,"file":"Dot.cjs","names":["cva","cn","require_cn","react_jsx_runtime","dotVariants","Dot","props","className"],"sources":["../../../src/components/Dot.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\nimport type { DotTone as Tone } from '../types/tone';\n\nexport const dotVariants = cva('inline-block shrink-0 rounded-full', {\n variants: {\n tone: {\n neutral: 'bg-po-faint',\n muted: 'bg-po-faint/40',\n blue: 'bg-po-blue',\n green: 'bg-po-green',\n yellow: 'bg-po-yellow',\n red: 'bg-po-red',\n magenta: 'bg-po-magenta',\n violet: 'bg-po-violet',\n cyan: 'bg-po-cyan',\n orange: 'bg-po-orange',\n teal: 'bg-po-teal',\n } satisfies Record<Tone, string>,\n size: {\n xs: 'h-1 w-1',\n sm: 'h-1.5 w-1.5',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n },\n pulse: {\n true: 'animate-pulse',\n false: '',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'sm', pulse: false },\n});\n\nexport type DotTone = Tone;\n\nexport interface DotProps extends ComponentProps<'span'>, VariantProps<typeof dotVariants> {}\n\n/** The status dot: a colour and, while something is live, a pulse. */\nexport function Dot({ className, tone, size, pulse, ...props }: DotProps) {\n return <span data-slot=\"dot\" aria-hidden className={cn(dotVariants({ tone, size, pulse }), className)} {...props} />;\n}\n"],"mappings":"oEAMA,MAAaI,GAAA,oCAAcJ,CAAAA,CAAAA,IAAAA,CAAI,qCAAsC,CACnE,SAAU,CACR,KAAM,CACJ,QAAS,cACT,MAAO,iBACP,KAAM,aACN,MAAO,cACP,OAAQ,eACR,IAAK,YACL,QAAS,gBACT,OAAQ,eACR,KAAM,aACN,OAAQ,eACR,KAAM,YACR,EACA,KAAM,CACJ,GAAI,UACJ,GAAI,cACJ,GAAI,UACJ,GAAI,aACN,EACA,MAAO,CACL,KAAM,gBACN,MAAO,EACT,CACF,EACA,gBAAiB,CAAE,KAAM,UAAW,KAAM,KAAM,MAAO,EAAM,CAC/D,CAAC,EAOD,SAAgBK,EAAI,CAAE,YAAW,OAAM,OAAM,QAAO,GAAGC,GAAmB,CACxE,MAAO,iBAAA,EAAAH,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,MAAM,cAAA,GAAY,UAAWF,EAAAA,GAAGG,EAAY,CAAE,OAAM,OAAM,OAAM,CAAC,EAAGG,CAAS,EAAG,GAAID,CAAQ,CAAA,CACrH"}