@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":"editorTheme.mjs","names":["DOOM_EDITOR_STYLES","DOOM_SYNTAX_STYLES"],"sources":["../../../../../../src/lib/editorTheme.ts"],"sourcesContent":["/**\n * The editor's colours, as plain data.\n *\n * Every value is a CSS custom property rather than a resolved colour, which is\n * what lets a theme swap recolour a mounted editor by rewriting `:root`\n * instead of tearing the editor down and rebuilding it. It is also why this is\n * data and not a built CodeMirror extension: nothing here imports an editor,\n * so a caller pays for the styles only inside the chunk that draws them.\n */\n\n/** The chrome: the surface, the gutter, the cursor, the selection, and the search panel. */\nexport const DOOM_EDITOR_STYLES: Readonly<Record<string, Readonly<Record<string, string>>>> = {\n '&': {\n color: 'var(--doom-text)',\n backgroundColor: 'var(--doom-deep)',\n fontSize: '12px',\n height: '100%',\n },\n '.cm-scroller': {\n fontFamily: 'var(--doom-font-mono)',\n lineHeight: '1.5',\n },\n '.cm-content': {\n caretColor: 'var(--doom-blue)',\n padding: '8px 0',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--doom-blue)',\n borderLeftWidth: '2px',\n },\n // CodeMirror draws its own selection layer when the editor has focus and\n // leans on the native one when it does not, so both need saying or a\n // selection vanishes the moment a reader clicks the comment box.\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'var(--doom-selected)',\n },\n '.cm-gutters': {\n backgroundColor: 'var(--doom-deep)',\n color: 'var(--doom-faint)',\n borderRight: '1px solid var(--doom-border-soft)',\n },\n '.cm-activeLine': {\n backgroundColor: 'var(--doom-panel)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'var(--doom-panel)',\n color: 'var(--doom-dim)',\n },\n '.cm-foldPlaceholder': {\n backgroundColor: 'var(--doom-panel)',\n border: '1px solid var(--doom-border)',\n color: 'var(--doom-dim)',\n },\n '.cm-searchMatch': {\n backgroundColor: 'var(--doom-tint-yellow)',\n outline: '1px solid var(--doom-edge-yellow)',\n },\n '.cm-searchMatch.cm-searchMatch-selected': {\n backgroundColor: 'var(--doom-tint-orange)',\n },\n '.cm-selectionMatch': {\n backgroundColor: 'var(--doom-tint-blue)',\n },\n '.cm-closed-tone': {\n backgroundColor: 'var(--doom-tint-green)',\n textDecoration: 'line-through',\n textDecorationColor: 'var(--doom-edge-green)',\n },\n '.cm-matchingBracket, &.cm-focused .cm-matchingBracket': {\n backgroundColor: 'var(--doom-tint-green)',\n outline: '1px solid var(--doom-edge-green)',\n },\n '.cm-nonmatchingBracket, &.cm-focused .cm-nonmatchingBracket': {\n backgroundColor: 'var(--doom-tint-red)',\n },\n // Search and replace chrome reads as UI; only what is typed into it is literal.\n '.cm-panels': {\n backgroundColor: 'var(--doom-panel)',\n color: 'var(--doom-text)',\n fontFamily: 'var(--font-sans)',\n fontSize: '12px',\n },\n '.cm-panels.cm-panels-bottom': {\n borderTop: '1px solid var(--doom-border)',\n },\n '.cm-panels.cm-panels-top': {\n borderBottom: '1px solid var(--doom-border)',\n },\n '.cm-panel input, .cm-panel button, .cm-panel select': {\n backgroundColor: 'var(--doom-deep)',\n color: 'var(--doom-text)',\n border: '1px solid var(--doom-border)',\n borderRadius: '2px',\n fontSize: '12px',\n },\n '.cm-panel input': {\n fontFamily: 'var(--doom-font-mono)',\n },\n '.cm-tooltip': {\n backgroundColor: 'var(--doom-panel)',\n border: '1px solid var(--doom-border)',\n color: 'var(--doom-text)',\n },\n};\n\n/**\n * The syntax colours, named by what they mark rather than by tag, so the\n * pairing with Lezer's tags stays next to the editor that imports them and\n * this table can be read as a palette.\n */\nexport const DOOM_SYNTAX_STYLES = {\n comment: { color: 'var(--doom-faint)', fontStyle: 'italic' },\n keyword: { color: 'var(--doom-magenta)' },\n constant: { color: 'var(--doom-violet)' },\n literal: { color: 'var(--doom-orange)' },\n string: { color: 'var(--doom-green)' },\n regexp: { color: 'var(--doom-teal)' },\n operator: { color: 'var(--doom-blue)' },\n punctuation: { color: 'var(--doom-dim)' },\n variable: { color: 'var(--doom-text)' },\n property: { color: 'var(--doom-cyan)' },\n callable: { color: 'var(--doom-blue)' },\n type: { color: 'var(--doom-yellow)' },\n tag: { color: 'var(--doom-red)' },\n attribute: { color: 'var(--doom-yellow)' },\n meta: { color: 'var(--doom-faint)' },\n heading: { color: 'var(--doom-hi)', fontWeight: 'bold' },\n link: { color: 'var(--doom-cyan)', textDecoration: 'underline' },\n emphasis: { fontStyle: 'italic' },\n strong: { fontWeight: 'bold' },\n strikethrough: { textDecoration: 'line-through' },\n invalid: { color: 'var(--doom-red)' },\n} as const;\n"],"mappings":"AAWA,MAAaA,EAAiF,CAC5F,IAAK,CACH,MAAO,mBACP,gBAAiB,mBACjB,SAAU,OACV,OAAQ,MACV,EACA,eAAgB,CACd,WAAY,wBACZ,WAAY,KACd,EACA,cAAe,CACb,WAAY,mBACZ,QAAS,OACX,EACA,6BAA8B,CAC5B,gBAAiB,mBACjB,gBAAiB,KACnB,EAIA,yFAA0F,CACxF,gBAAiB,sBACnB,EACA,cAAe,CACb,gBAAiB,mBACjB,MAAO,oBACP,YAAa,mCACf,EACA,iBAAkB,CAChB,gBAAiB,mBACnB,EACA,uBAAwB,CACtB,gBAAiB,oBACjB,MAAO,iBACT,EACA,sBAAuB,CACrB,gBAAiB,oBACjB,OAAQ,+BACR,MAAO,iBACT,EACA,kBAAmB,CACjB,gBAAiB,0BACjB,QAAS,mCACX,EACA,0CAA2C,CACzC,gBAAiB,yBACnB,EACA,qBAAsB,CACpB,gBAAiB,uBACnB,EACA,kBAAmB,CACjB,gBAAiB,yBACjB,eAAgB,eAChB,oBAAqB,wBACvB,EACA,wDAAyD,CACvD,gBAAiB,yBACjB,QAAS,kCACX,EACA,8DAA+D,CAC7D,gBAAiB,sBACnB,EAEA,aAAc,CACZ,gBAAiB,oBACjB,MAAO,mBACP,WAAY,mBACZ,SAAU,MACZ,EACA,8BAA+B,CAC7B,UAAW,8BACb,EACA,2BAA4B,CAC1B,aAAc,8BAChB,EACA,sDAAuD,CACrD,gBAAiB,mBACjB,MAAO,mBACP,OAAQ,+BACR,aAAc,MACd,SAAU,MACZ,EACA,kBAAmB,CACjB,WAAY,uBACd,EACA,cAAe,CACb,gBAAiB,oBACjB,OAAQ,+BACR,MAAO,kBACT,CACF,EAOaC,EAAqB,CAChC,QAAS,CAAE,MAAO,oBAAqB,UAAW,QAAS,EAC3D,QAAS,CAAE,MAAO,qBAAsB,EACxC,SAAU,CAAE,MAAO,oBAAqB,EACxC,QAAS,CAAE,MAAO,oBAAqB,EACvC,OAAQ,CAAE,MAAO,mBAAoB,EACrC,OAAQ,CAAE,MAAO,kBAAmB,EACpC,SAAU,CAAE,MAAO,kBAAmB,EACtC,YAAa,CAAE,MAAO,iBAAkB,EACxC,SAAU,CAAE,MAAO,kBAAmB,EACtC,SAAU,CAAE,MAAO,kBAAmB,EACtC,SAAU,CAAE,MAAO,kBAAmB,EACtC,KAAM,CAAE,MAAO,oBAAqB,EACpC,IAAK,CAAE,MAAO,iBAAkB,EAChC,UAAW,CAAE,MAAO,oBAAqB,EACzC,KAAM,CAAE,MAAO,mBAAoB,EACnC,QAAS,CAAE,MAAO,iBAAkB,WAAY,MAAO,EACvD,KAAM,CAAE,MAAO,mBAAoB,eAAgB,WAAY,EAC/D,SAAU,CAAE,UAAW,QAAS,EAChC,OAAQ,CAAE,WAAY,MAAO,EAC7B,cAAe,CAAE,eAAgB,cAAe,EAChD,QAAS,CAAE,MAAO,iBAAkB,CACtC"}
1
+ {"version":3,"file":"editorTheme.mjs","names":["PO_EDITOR_STYLES","PO_SYNTAX_STYLES"],"sources":["../../../../../../src/lib/editorTheme.ts"],"sourcesContent":["/**\n * The editor's colours, as plain data.\n *\n * Every value is a CSS custom property rather than a resolved colour, which is\n * what lets a theme swap recolour a mounted editor by rewriting `:root`\n * instead of tearing the editor down and rebuilding it. It is also why this is\n * data and not a built CodeMirror extension: nothing here imports an editor,\n * so a caller pays for the styles only inside the chunk that draws them.\n */\n\n/** The chrome: the surface, the gutter, the cursor, the selection, and the search panel. */\nexport const PO_EDITOR_STYLES: Readonly<Record<string, Readonly<Record<string, string>>>> = {\n '&': {\n color: 'var(--po-text)',\n backgroundColor: 'var(--po-deep)',\n fontSize: '12px',\n height: '100%',\n },\n '.cm-scroller': {\n fontFamily: 'var(--po-font-mono)',\n lineHeight: '1.5',\n },\n '.cm-content': {\n caretColor: 'var(--po-blue)',\n padding: '8px 0',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--po-blue)',\n borderLeftWidth: '2px',\n },\n // CodeMirror draws its own selection layer when the editor has focus and\n // leans on the native one when it does not, so both need saying or a\n // selection vanishes the moment a reader clicks the comment box.\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'var(--po-selected)',\n },\n '.cm-gutters': {\n backgroundColor: 'var(--po-deep)',\n color: 'var(--po-faint)',\n borderRight: '1px solid var(--po-border-soft)',\n },\n '.cm-activeLine': {\n backgroundColor: 'var(--po-panel)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'var(--po-panel)',\n color: 'var(--po-dim)',\n },\n '.cm-foldPlaceholder': {\n backgroundColor: 'var(--po-panel)',\n border: '1px solid var(--po-border)',\n color: 'var(--po-dim)',\n },\n '.cm-searchMatch': {\n backgroundColor: 'var(--po-tint-yellow)',\n outline: '1px solid var(--po-edge-yellow)',\n },\n '.cm-searchMatch.cm-searchMatch-selected': {\n backgroundColor: 'var(--po-tint-orange)',\n },\n '.cm-selectionMatch': {\n backgroundColor: 'var(--po-tint-blue)',\n },\n '.cm-closed-tone': {\n backgroundColor: 'var(--po-tint-green)',\n textDecoration: 'line-through',\n textDecorationColor: 'var(--po-edge-green)',\n },\n '.cm-matchingBracket, &.cm-focused .cm-matchingBracket': {\n backgroundColor: 'var(--po-tint-green)',\n outline: '1px solid var(--po-edge-green)',\n },\n '.cm-nonmatchingBracket, &.cm-focused .cm-nonmatchingBracket': {\n backgroundColor: 'var(--po-tint-red)',\n },\n // Search and replace chrome reads as UI; only what is typed into it is literal.\n '.cm-panels': {\n backgroundColor: 'var(--po-panel)',\n color: 'var(--po-text)',\n fontFamily: 'var(--font-sans)',\n fontSize: '12px',\n },\n '.cm-panels.cm-panels-bottom': {\n borderTop: '1px solid var(--po-border)',\n },\n '.cm-panels.cm-panels-top': {\n borderBottom: '1px solid var(--po-border)',\n },\n '.cm-panel input, .cm-panel button, .cm-panel select': {\n backgroundColor: 'var(--po-deep)',\n color: 'var(--po-text)',\n border: '1px solid var(--po-border)',\n borderRadius: '2px',\n fontSize: '12px',\n },\n '.cm-panel input': {\n fontFamily: 'var(--po-font-mono)',\n },\n '.cm-tooltip': {\n backgroundColor: 'var(--po-panel)',\n border: '1px solid var(--po-border)',\n color: 'var(--po-text)',\n },\n};\n\n/**\n * The syntax colours, named by what they mark rather than by tag, so the\n * pairing with Lezer's tags stays next to the editor that imports them and\n * this table can be read as a palette.\n */\nexport const PO_SYNTAX_STYLES = {\n comment: { color: 'var(--po-faint)', fontStyle: 'italic' },\n keyword: { color: 'var(--po-magenta)' },\n constant: { color: 'var(--po-violet)' },\n literal: { color: 'var(--po-orange)' },\n string: { color: 'var(--po-green)' },\n regexp: { color: 'var(--po-teal)' },\n operator: { color: 'var(--po-blue)' },\n punctuation: { color: 'var(--po-dim)' },\n variable: { color: 'var(--po-text)' },\n property: { color: 'var(--po-cyan)' },\n callable: { color: 'var(--po-blue)' },\n type: { color: 'var(--po-yellow)' },\n tag: { color: 'var(--po-red)' },\n attribute: { color: 'var(--po-yellow)' },\n meta: { color: 'var(--po-faint)' },\n heading: { color: 'var(--po-hi)', fontWeight: 'bold' },\n link: { color: 'var(--po-cyan)', textDecoration: 'underline' },\n emphasis: { fontStyle: 'italic' },\n strong: { fontWeight: 'bold' },\n strikethrough: { textDecoration: 'line-through' },\n invalid: { color: 'var(--po-red)' },\n} as const;\n"],"mappings":"AAWA,MAAaA,EAA+E,CAC1F,IAAK,CACH,MAAO,iBACP,gBAAiB,iBACjB,SAAU,OACV,OAAQ,MACV,EACA,eAAgB,CACd,WAAY,sBACZ,WAAY,KACd,EACA,cAAe,CACb,WAAY,iBACZ,QAAS,OACX,EACA,6BAA8B,CAC5B,gBAAiB,iBACjB,gBAAiB,KACnB,EAIA,yFAA0F,CACxF,gBAAiB,oBACnB,EACA,cAAe,CACb,gBAAiB,iBACjB,MAAO,kBACP,YAAa,iCACf,EACA,iBAAkB,CAChB,gBAAiB,iBACnB,EACA,uBAAwB,CACtB,gBAAiB,kBACjB,MAAO,eACT,EACA,sBAAuB,CACrB,gBAAiB,kBACjB,OAAQ,6BACR,MAAO,eACT,EACA,kBAAmB,CACjB,gBAAiB,wBACjB,QAAS,iCACX,EACA,0CAA2C,CACzC,gBAAiB,uBACnB,EACA,qBAAsB,CACpB,gBAAiB,qBACnB,EACA,kBAAmB,CACjB,gBAAiB,uBACjB,eAAgB,eAChB,oBAAqB,sBACvB,EACA,wDAAyD,CACvD,gBAAiB,uBACjB,QAAS,gCACX,EACA,8DAA+D,CAC7D,gBAAiB,oBACnB,EAEA,aAAc,CACZ,gBAAiB,kBACjB,MAAO,iBACP,WAAY,mBACZ,SAAU,MACZ,EACA,8BAA+B,CAC7B,UAAW,4BACb,EACA,2BAA4B,CAC1B,aAAc,4BAChB,EACA,sDAAuD,CACrD,gBAAiB,iBACjB,MAAO,iBACP,OAAQ,6BACR,aAAc,MACd,SAAU,MACZ,EACA,kBAAmB,CACjB,WAAY,qBACd,EACA,cAAe,CACb,gBAAiB,kBACjB,OAAQ,6BACR,MAAO,gBACT,CACF,EAOaC,EAAmB,CAC9B,QAAS,CAAE,MAAO,kBAAmB,UAAW,QAAS,EACzD,QAAS,CAAE,MAAO,mBAAoB,EACtC,SAAU,CAAE,MAAO,kBAAmB,EACtC,QAAS,CAAE,MAAO,kBAAmB,EACrC,OAAQ,CAAE,MAAO,iBAAkB,EACnC,OAAQ,CAAE,MAAO,gBAAiB,EAClC,SAAU,CAAE,MAAO,gBAAiB,EACpC,YAAa,CAAE,MAAO,eAAgB,EACtC,SAAU,CAAE,MAAO,gBAAiB,EACpC,SAAU,CAAE,MAAO,gBAAiB,EACpC,SAAU,CAAE,MAAO,gBAAiB,EACpC,KAAM,CAAE,MAAO,kBAAmB,EAClC,IAAK,CAAE,MAAO,eAAgB,EAC9B,UAAW,CAAE,MAAO,kBAAmB,EACvC,KAAM,CAAE,MAAO,iBAAkB,EACjC,QAAS,CAAE,MAAO,eAAgB,WAAY,MAAO,EACrD,KAAM,CAAE,MAAO,iBAAkB,eAAgB,WAAY,EAC7D,SAAU,CAAE,UAAW,QAAS,EAChC,OAAQ,CAAE,WAAY,MAAO,EAC7B,cAAe,CAAE,eAAgB,cAAe,EAChD,QAAS,CAAE,MAAO,eAAgB,CACpC"}
@@ -1,3 +1,3 @@
1
1
  function e(e,t){let n=[],r=t,i=[],a=[],o=()=>{i.length>0&&n.push({path:r,indices:i,text:a.join(`
2
- `)}),i=[],a=[]};for(let[t,n]of e.entries()){if(n.type===`tagged`){i.push(t),a.push(n.value.content);continue}o(),n.type===`file`&&(r=n.path)}return o(),n}function t(e){return e.map(e=>`${e.path??``}\u0000${e.text}`).join(``)}export{e as hashlineGroups,t as hashlineGroupsKey};
2
+ `)}),i=[],a=[]};for(let[t,n]of e.entries())n.type===`tagged`?(i.push(t),a.push(n.value.content)):(o(),n.type===`file`&&(r=n.path));return o(),n}function t(e){return e.map(e=>`${e.path??``}\u0000${e.text}`).join(``)}export{e as hashlineGroups,t as hashlineGroupsKey};
3
3
  //# sourceMappingURL=hashlineHighlight.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hashlineHighlight.mjs","names":["hashlineGroups","groups","path","fallbackPath","indices","texts","flush","index","line","lines","hashlineGroupsKey","group"],"sources":["../../../../../../src/lib/hashlineHighlight.ts"],"sourcesContent":["import type { PresentedLine } from './hashlineView';\n\n/**\n * Grouping for highlighted hashline bodies.\n *\n * A read result is one file and a grep result is many, so the lines a card\n * shows have to be cut into runs that belong to the same file before any of\n * them can be parsed. A run is parsed whole because a string or a comment\n * spans lines, and grep's gaps between context blocks are accepted: an excerpt\n * is not the file, and colouring it as if it were is close enough to be worth\n * far more than colouring nothing.\n */\n\nexport interface HashlineGroup {\n /** The file the run came from, when the body named one. */\n readonly path: string | undefined;\n /** Indices into the presented lines, in order, that this run covers. */\n readonly indices: readonly number[];\n /** The run's content, newline-joined, ready to parse. */\n readonly text: string;\n}\n\n/**\n * Consecutive anchored lines, cut at every file heading and at anything that\n * is not code. `fallbackPath` names the file for a body that never states one,\n * which is how a read result arrives.\n */\nexport function hashlineGroups(\n lines: readonly PresentedLine[],\n fallbackPath: string | undefined,\n): readonly HashlineGroup[] {\n const groups: HashlineGroup[] = [];\n let path = fallbackPath;\n let indices: number[] = [];\n let texts: string[] = [];\n\n const flush = (): void => {\n if (indices.length > 0) groups.push({ path, indices, text: texts.join('\\n') });\n indices = [];\n texts = [];\n };\n\n for (const [index, line] of lines.entries()) {\n if (line.type === 'tagged') {\n indices.push(index);\n texts.push(line.value.content);\n continue;\n }\n flush();\n // A heading opens the next file; a plain line is prose between runs.\n if (line.type === 'file') path = line.path;\n }\n flush();\n return groups;\n}\n\n/** One string that changes whenever the groups would highlight differently. */\nexport function hashlineGroupsKey(groups: readonly HashlineGroup[]): string {\n return groups.map((group) => `${group.path ?? ''}\\u0000${group.text}`).join('\\u0001');\n}\n"],"mappings":"AA2BA,SAAgBA,EACd,EACA,EAC0B,CAC1B,IAAMC,EAA0B,CAAC,EAC7BC,EAAOC,EACPC,EAAoB,CAAC,EACrBC,EAAkB,CAAC,EAEjBC,MAAoB,CACpBF,EAAQ,OAAS,GAAGH,EAAO,KAAK,CAAE,OAAM,UAAS,KAAMI,EAAM,KAAK;CAAI,CAAE,CAAC,EAC7E,EAAU,CAAC,EACX,EAAQ,CAAC,CACX,EAEA,IAAK,GAAM,CAACE,EAAOC,KAASC,EAAM,QAAQ,EAAG,CAC3C,GAAID,EAAK,OAAS,SAAU,CAC1BJ,EAAQ,KAAKG,CAAK,EAClBF,EAAM,KAAKG,EAAK,MAAM,OAAO,EAC7B,QACF,CACAF,EAAM,EAEFE,EAAK,OAAS,SAAQ,EAAOA,EAAK,KACxC,CAEA,OADAF,EAAM,EACCL,CACT,CAGA,SAAgBS,EAAkB,EAA0C,CAC1E,OAAOT,EAAO,IAAK,GAAU,GAAGU,EAAM,MAAQ,GAAG,QAAQA,EAAM,MAAM,CAAC,CAAC,KAAK,GAAQ,CACtF"}
1
+ {"version":3,"file":"hashlineHighlight.mjs","names":["hashlineGroups","groups","path","fallbackPath","indices","texts","flush","index","line","lines","hashlineGroupsKey","group"],"sources":["../../../../../../src/lib/hashlineHighlight.ts"],"sourcesContent":["import type { PresentedLine } from './hashlineView';\n\n/**\n * Grouping for highlighted hashline bodies.\n *\n * A read result is one file and a grep result is many, so the lines a card\n * shows have to be cut into runs that belong to the same file before any of\n * them can be parsed. A run is parsed whole because a string or a comment\n * spans lines, and grep's gaps between context blocks are accepted: an excerpt\n * is not the file, and colouring it as if it were is close enough to be worth\n * far more than colouring nothing.\n */\n\nexport interface HashlineGroup {\n /** The file the run came from, when the body named one. */\n readonly path: string | undefined;\n /** Indices into the presented lines, in order, that this run covers. */\n readonly indices: readonly number[];\n /** The run's content, newline-joined, ready to parse. */\n readonly text: string;\n}\n\n/**\n * Consecutive anchored lines, cut at every file heading and at anything that\n * is not code. `fallbackPath` names the file for a body that never states one,\n * which is how a read result arrives.\n */\nexport function hashlineGroups(\n lines: readonly PresentedLine[],\n fallbackPath: string | undefined,\n): readonly HashlineGroup[] {\n const groups: HashlineGroup[] = [];\n let path = fallbackPath;\n let indices: number[] = [];\n let texts: string[] = [];\n\n const flush = (): void => {\n if (indices.length > 0) groups.push({ path, indices, text: texts.join('\\n') });\n indices = [];\n texts = [];\n };\n\n for (const [index, line] of lines.entries()) {\n if (line.type === 'tagged') {\n indices.push(index);\n texts.push(line.value.content);\n continue;\n }\n flush();\n // A heading opens the next file; a plain line is prose between runs.\n if (line.type === 'file') path = line.path;\n }\n flush();\n return groups;\n}\n\n/** One string that changes whenever the groups would highlight differently. */\nexport function hashlineGroupsKey(groups: readonly HashlineGroup[]): string {\n return groups.map((group) => `${group.path ?? ''}\\u0000${group.text}`).join('\\u0001');\n}\n"],"mappings":"AA2BA,SAAgBA,EACd,EACA,EAC0B,CAC1B,IAAMC,EAA0B,CAAC,EAC7BC,EAAOC,EACPC,EAAoB,CAAC,EACrBC,EAAkB,CAAC,EAEjBC,MAAoB,CACpBF,EAAQ,OAAS,GAAGH,EAAO,KAAK,CAAE,OAAM,UAAS,KAAMI,EAAM,KAAK;CAAI,CAAE,CAAC,EAC7E,EAAU,CAAC,EACX,EAAQ,CAAC,CACX,EAEA,IAAK,GAAM,CAACE,EAAOC,KAASC,EAAM,QAAQ,EACpCD,EAAK,OAAS,UAChBJ,EAAQ,KAAKG,CAAK,EAClBF,EAAM,KAAKG,EAAK,MAAM,OAAO,IAG/BF,EAAM,EAEFE,EAAK,OAAS,SAAQ,EAAOA,EAAK,OAGxC,OADAF,EAAM,EACCL,CACT,CAGA,SAAgBS,EAAkB,EAA0C,CAC1E,OAAOT,EAAO,IAAK,GAAU,GAAGU,EAAM,MAAQ,GAAG,QAAQA,EAAM,MAAM,CAAC,CAAC,KAAK,GAAQ,CACtF"}
@@ -2,5 +2,5 @@ import{collapseLines as e}from"./collapse.mjs";const t=/^@file (.+)#([A-Za-z0-9_
2
2
  `);if(r.length===0)return n.some(e=>e.type===`image`)?[`[Image attached]`]:[];let i=r.replaceAll(` `,` `).replaceAll(`\r
3
3
  `,`
4
4
  `).split(`
5
- `);for(;i.at(-1)===``;)i.pop();return i}function s(e){let t=e.at(-1);if(t!==void 0&&t.startsWith(`[`)&&t.endsWith(`]`)){for(e.pop();e.at(-1)===``;)e.pop();return t}}function c(e){let t=n.exec(e),r=t?.[2],i=t?.[3];if(r===void 0||i===void 0)return;let a=Number.parseInt(r,10);if(!Number.isSafeInteger(a)||a<1)return;let o=t?.[1];return{line:a,content:i,marker:o===`>> `?`match`:o===` `?`context`:void 0}}function l(e){return t.exec(e)?.[1]}function u(e,t){let n=[];for(let r of e){let e=l(r);if(e!==void 0){t!==`read`&&n.push({type:`file`,path:e});continue}let i=c(r);if(i!==void 0){n.push({type:`tagged`,value:i});continue}n.push({type:`plain`,text:r})}return n}function d(t,n,r,i){let a=o(t,n),c=s(a),l=u(a,r),{shown:d,hidden:f}=e(l,r===`read`?10:15,i);return{shown:d,hidden:f,notice:c,gutter:d.reduce((e,t)=>t.type===`tagged`?Math.max(e,String(t.value.line).length):e,1)}}function f(e){return e.filter(e=>e!==void 0&&e.length>0)}export{i as GREP_COLLAPSED_LINES,r as READ_COLLAPSED_LINES,f as compactDetails,d as hashlineBody,l as parseFileHeader,c as parseTaggedLine,u as presentHashlineLines,o as resultTextLines,s as takeTrailingNotice};
5
+ `);for(;i.at(-1)===``;)i.pop();return i}function s(e){let t=e.at(-1);if(t!==void 0&&t.startsWith(`[`)&&t.endsWith(`]`)){for(e.pop();e.at(-1)===``;)e.pop();return t}}function c(e){let t=n.exec(e),r=t?.[2],i=t?.[3];if(r===void 0||i===void 0)return;let a=Number.parseInt(r,10);if(!Number.isSafeInteger(a)||a<1)return;let o=t?.[1];return{line:a,content:i,marker:o===`>> `?`match`:o===` `?`context`:void 0}}function l(e){return t.exec(e)?.[1]}function u(e,t){let n=[];for(let r of e){let e=l(r);if(e!==void 0){t!==`read`&&n.push({type:`file`,path:e});continue}let i=c(r);i===void 0?n.push({type:`plain`,text:r}):n.push({type:`tagged`,value:i})}return n}function d(t,n,r,i){let a=o(t,n),c=s(a),l=u(a,r),{shown:d,hidden:f}=e(l,r===`read`?10:15,i);return{shown:d,hidden:f,notice:c,gutter:d.reduce((e,t)=>t.type===`tagged`?Math.max(e,String(t.value.line).length):e,1)}}function f(e){return e.filter(e=>e!==void 0&&e.length>0)}export{i as GREP_COLLAPSED_LINES,r as READ_COLLAPSED_LINES,f as compactDetails,d as hashlineBody,l as parseFileHeader,c as parseTaggedLine,u as presentHashlineLines,o as resultTextLines,s as takeTrailingNotice};
6
6
  //# sourceMappingURL=hashlineView.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hashlineView.mjs","names":["FILE_HEADER_PATTERN","TAGGED_LINE_PATTERN","READ_COLLAPSED_LINES","GREP_COLLAPSED_LINES","isTextBlock","block","resultTextLines","blocks","result","text","output","lines","takeTrailingNotice","last","parseTaggedLine","match","value","lineText","content","line","prefix","parseFileHeader","presentHashlineLines","presented","path","kind","tagged","hashlineBody","notice","collapseLines","expanded","shown","widest","compactDetails","values"],"sources":["../../../../../../src/lib/hashlineView.ts"],"sourcesContent":["import { collapseLines } from './collapse';\n\n/**\n * The hashline wire format, parsed the way the TUI's hashlineRendering does:\n * `@file path#tag` opens a file, `N#abc|content` is an anchored line, and a\n * `>> ` or three-space prefix marks grep matches and their context.\n *\n * It lives here rather than in each tool package because the read and grep\n * cards render the same bytes and had drifted into byte-identical copies of\n * this module. The patterns are still a transcription of po-hashline: a\n * cockpit plugin may import this library and the web contract, but not a\n * runtime package, so the format is stated twice on purpose and only once per\n * side of that line.\n */\nconst FILE_HEADER_PATTERN = /^@file (.+)#([A-Za-z0-9_-]{8})$/u;\nconst TAGGED_LINE_PATTERN = /^(>> | {3})?(\\d+)#[a-z]{3}\\|(.*)$/u;\nconst MATCH_PREFIX = '>> ';\nconst CONTEXT_PREFIX = ' ';\nconst IMAGE_PLACEHOLDER = '[Image attached]';\n\nexport const READ_COLLAPSED_LINES = 10;\nexport const GREP_COLLAPSED_LINES = 15;\n\nexport type HashlineResultKind = 'read' | 'grep';\nexport type TaggedLineMarker = 'match' | 'context';\n\n/**\n * The part of a tool result this parser reads.\n *\n * Named structurally rather than imported: the component library sits below\n * the web contract and must not depend on it, so it states the shape it needs\n * and any `ToolResultView` satisfies it.\n */\nexport interface HashlineResult {\n readonly content: readonly unknown[];\n}\n\nexport interface TaggedLine {\n readonly line: number;\n readonly content: string;\n readonly marker: TaggedLineMarker | undefined;\n}\n\nexport type PresentedLine =\n | { readonly type: 'file'; readonly path: string }\n | { readonly type: 'tagged'; readonly value: TaggedLine }\n | { readonly type: 'plain'; readonly text: string };\n\nexport interface HashlineBody {\n readonly shown: readonly PresentedLine[];\n /** Lines the collapsed view holds back; zero once expanded. */\n readonly hidden: number;\n /** The bracketed pagination or compaction note the tool appends after its lines. */\n readonly notice: string | undefined;\n /** Widest line number among the shown anchored lines, in characters. */\n readonly gutter: number;\n}\n\ninterface TextBlock {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction isTextBlock(block: unknown): block is TextBlock {\n return typeof block === 'object' && block !== null && typeof (block as TextBlock).type === 'string';\n}\n\n/**\n * The result's text as lines: tabs widened, CRLF folded, trailing blanks\n * dropped. A result with no text but an image block reads as the TUI's\n * placeholder. The joined `output` stands in when no result view exists.\n */\nexport function resultTextLines(result: HashlineResult | null, output: string): string[] {\n const blocks = result?.content.filter(isTextBlock) ?? [];\n const text =\n result === null ? output : blocks.flatMap((block) => (block.type === 'text' ? [block.text ?? ''] : [])).join('\\n');\n if (text.length === 0) {\n return blocks.some((block) => block.type === 'image') ? [IMAGE_PLACEHOLDER] : [];\n }\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n\n/** Detaches the tool's trailing `[...]` note so the body numbers file content only. */\nexport function takeTrailingNotice(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nexport function parseTaggedLine(value: string): TaggedLine | undefined {\n const match = TAGGED_LINE_PATTERN.exec(value);\n const lineText = match?.[2];\n const content = match?.[3];\n if (lineText === undefined || content === undefined) return undefined;\n const line = Number.parseInt(lineText, 10);\n if (!Number.isSafeInteger(line) || line < 1) return undefined;\n const prefix = match?.[1];\n const marker = prefix === MATCH_PREFIX ? 'match' : prefix === CONTEXT_PREFIX ? 'context' : undefined;\n return { line, content, marker };\n}\n\nexport function parseFileHeader(value: string): string | undefined {\n return FILE_HEADER_PATTERN.exec(value)?.[1];\n}\n\n/**\n * Lines as the card presents them. A read shows one file, so its header is\n * dropped; a grep groups anchored matches under each file's path.\n */\nexport function presentHashlineLines(lines: readonly string[], kind: HashlineResultKind): PresentedLine[] {\n const presented: PresentedLine[] = [];\n for (const line of lines) {\n const path = parseFileHeader(line);\n if (path !== undefined) {\n if (kind !== 'read') presented.push({ type: 'file', path });\n continue;\n }\n const tagged = parseTaggedLine(line);\n if (tagged !== undefined) {\n presented.push({ type: 'tagged', value: tagged });\n continue;\n }\n presented.push({ type: 'plain', text: line });\n }\n return presented;\n}\n\n/** The body a card shows for one result, collapsed to the kind's line budget unless expanded. */\nexport function hashlineBody(\n result: HashlineResult | null,\n output: string,\n kind: HashlineResultKind,\n expanded: boolean,\n): HashlineBody {\n const lines = resultTextLines(result, output);\n const notice = takeTrailingNotice(lines);\n const presented = presentHashlineLines(lines, kind);\n const budget = kind === 'read' ? READ_COLLAPSED_LINES : GREP_COLLAPSED_LINES;\n const { shown, hidden } = collapseLines(presented, budget, expanded);\n const gutter = shown.reduce(\n (widest, line) => (line.type === 'tagged' ? Math.max(widest, String(line.value.line).length) : widest),\n 1,\n );\n return { shown, hidden, notice, gutter };\n}\n\n/** The `key · key` detail list beside a call's primary argument, with absent values dropped. */\nexport function compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hashlineView.mjs","names":["FILE_HEADER_PATTERN","TAGGED_LINE_PATTERN","READ_COLLAPSED_LINES","GREP_COLLAPSED_LINES","isTextBlock","block","resultTextLines","blocks","result","text","output","lines","takeTrailingNotice","last","parseTaggedLine","match","value","lineText","content","line","prefix","parseFileHeader","presentHashlineLines","presented","path","kind","tagged","hashlineBody","notice","collapseLines","expanded","shown","widest","compactDetails","values"],"sources":["../../../../../../src/lib/hashlineView.ts"],"sourcesContent":["import { collapseLines } from './collapse';\n\n/**\n * The hashline wire format, parsed the way the TUI's hashlineRendering does:\n * `@file path#tag` opens a file, `N#abc|content` is an anchored line, and a\n * `>> ` or three-space prefix marks grep matches and their context.\n *\n * It lives here rather than in each tool package because the read and grep\n * cards render the same bytes and had drifted into byte-identical copies of\n * this module. The patterns are still a transcription of po-hashline: a\n * cockpit plugin may import this library and the web contract, but not a\n * runtime package, so the format is stated twice on purpose and only once per\n * side of that line.\n */\nconst FILE_HEADER_PATTERN = /^@file (.+)#([A-Za-z0-9_-]{8})$/u;\nconst TAGGED_LINE_PATTERN = /^(>> | {3})?(\\d+)#[a-z]{3}\\|(.*)$/u;\nconst MATCH_PREFIX = '>> ';\nconst CONTEXT_PREFIX = ' ';\nconst IMAGE_PLACEHOLDER = '[Image attached]';\n\nexport const READ_COLLAPSED_LINES = 10;\nexport const GREP_COLLAPSED_LINES = 15;\n\nexport type HashlineResultKind = 'read' | 'grep';\nexport type TaggedLineMarker = 'match' | 'context';\n\n/**\n * The part of a tool result this parser reads.\n *\n * Named structurally rather than imported: the component library sits below\n * the web contract and must not depend on it, so it states the shape it needs\n * and any `ToolResultView` satisfies it.\n */\nexport interface HashlineResult {\n readonly content: readonly unknown[];\n}\n\nexport interface TaggedLine {\n readonly line: number;\n readonly content: string;\n readonly marker: TaggedLineMarker | undefined;\n}\n\nexport type PresentedLine =\n | { readonly type: 'file'; readonly path: string }\n | { readonly type: 'tagged'; readonly value: TaggedLine }\n | { readonly type: 'plain'; readonly text: string };\n\nexport interface HashlineBody {\n readonly shown: readonly PresentedLine[];\n /** Lines the collapsed view holds back; zero once expanded. */\n readonly hidden: number;\n /** The bracketed pagination or compaction note the tool appends after its lines. */\n readonly notice: string | undefined;\n /** Widest line number among the shown anchored lines, in characters. */\n readonly gutter: number;\n}\n\ninterface TextBlock {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction isTextBlock(block: unknown): block is TextBlock {\n return typeof block === 'object' && block !== null && typeof (block as TextBlock).type === 'string';\n}\n\n/**\n * The result's text as lines: tabs widened, CRLF folded, trailing blanks\n * dropped. A result with no text but an image block reads as the TUI's\n * placeholder. The joined `output` stands in when no result view exists.\n */\nexport function resultTextLines(result: HashlineResult | null, output: string): string[] {\n const blocks = result?.content.filter(isTextBlock) ?? [];\n const text =\n result === null ? output : blocks.flatMap((block) => (block.type === 'text' ? [block.text ?? ''] : [])).join('\\n');\n if (text.length === 0) {\n return blocks.some((block) => block.type === 'image') ? [IMAGE_PLACEHOLDER] : [];\n }\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n\n/** Detaches the tool's trailing `[...]` note so the body numbers file content only. */\nexport function takeTrailingNotice(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nexport function parseTaggedLine(value: string): TaggedLine | undefined {\n const match = TAGGED_LINE_PATTERN.exec(value);\n const lineText = match?.[2];\n const content = match?.[3];\n if (lineText === undefined || content === undefined) return undefined;\n const line = Number.parseInt(lineText, 10);\n if (!Number.isSafeInteger(line) || line < 1) return undefined;\n const prefix = match?.[1];\n const marker = prefix === MATCH_PREFIX ? 'match' : prefix === CONTEXT_PREFIX ? 'context' : undefined;\n return { line, content, marker };\n}\n\nexport function parseFileHeader(value: string): string | undefined {\n return FILE_HEADER_PATTERN.exec(value)?.[1];\n}\n\n/**\n * Lines as the card presents them. A read shows one file, so its header is\n * dropped; a grep groups anchored matches under each file's path.\n */\nexport function presentHashlineLines(lines: readonly string[], kind: HashlineResultKind): PresentedLine[] {\n const presented: PresentedLine[] = [];\n for (const line of lines) {\n const path = parseFileHeader(line);\n if (path !== undefined) {\n if (kind !== 'read') presented.push({ type: 'file', path });\n continue;\n }\n const tagged = parseTaggedLine(line);\n if (tagged !== undefined) {\n presented.push({ type: 'tagged', value: tagged });\n continue;\n }\n presented.push({ type: 'plain', text: line });\n }\n return presented;\n}\n\n/** The body a card shows for one result, collapsed to the kind's line budget unless expanded. */\nexport function hashlineBody(\n result: HashlineResult | null,\n output: string,\n kind: HashlineResultKind,\n expanded: boolean,\n): HashlineBody {\n const lines = resultTextLines(result, output);\n const notice = takeTrailingNotice(lines);\n const presented = presentHashlineLines(lines, kind);\n const budget = kind === 'read' ? READ_COLLAPSED_LINES : GREP_COLLAPSED_LINES;\n const { shown, hidden } = collapseLines(presented, budget, expanded);\n const gutter = shown.reduce(\n (widest, line) => (line.type === 'tagged' ? Math.max(widest, String(line.value.line).length) : widest),\n 1,\n );\n return { shown, hidden, notice, gutter };\n}\n\n/** The `key · key` detail list beside a call's primary argument, with absent values dropped. */\nexport function compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n"],"mappings":"+CAcA,MAAMA,EAAsB,mCACtBC,EAAsB,qCAKfC,EAAuB,GACvBC,EAAuB,GA0CpC,SAASC,EAAY,EAAoC,CACvD,OAAO,OAAOC,GAAU,YAAYA,GAAkB,OAAQA,EAAoB,MAAS,QAC7F,CAOA,SAAgBC,EAAgB,EAA+B,EAA0B,CACvF,IAAMC,EAASC,GAAQ,QAAQ,OAAOJ,CAAW,GAAK,CAAC,EACjDK,EACJD,IAAW,KAAOE,EAASH,EAAO,QAAS,GAAWF,EAAM,OAAS,OAAS,CAACA,EAAM,MAAQ,EAAE,EAAI,CAAC,CAAE,CAAC,CAAC,KAAK;CAAI,EACnH,GAAII,EAAK,SAAW,EAClB,OAAOF,EAAO,KAAM,GAAUF,EAAM,OAAS,OAAO,EAAI,CAAC,kBAAiB,EAAI,CAAC,EAEjF,IAAMM,EAAQF,EAAK,WAAW,IAAM,IAAI,CAAC,CAAC,WAAW;EAAQ;CAAI,CAAC,CAAC,MAAM;CAAI,EAC7E,KAAOE,EAAM,GAAG,EAAE,IAAM,IAAIA,EAAM,IAAI,EACtC,OAAOA,CACT,CAGA,SAAgBC,EAAmB,EAAqC,CACtE,IAAMC,EAAOF,EAAM,GAAG,EAAE,EACxB,GAAIE,IAAS,IAAA,IAAcA,EAAK,WAAW,GAAG,GAAMA,EAAK,SAAS,GAAG,EACrE,CACA,IADAF,EAAM,IAAI,EACHA,EAAM,GAAG,EAAE,IAAM,IAAIA,EAAM,IAAI,EACtC,OAAOE,CAFG,CAGZ,CAEA,SAAgBC,EAAgB,EAAuC,CACrE,IAAMC,EAAQd,EAAoB,KAAKe,CAAK,EACtCC,EAAWF,IAAQ,GACnBG,EAAUH,IAAQ,GACxB,GAAIE,IAAa,IAAA,IAAaC,IAAY,IAAA,GAAW,OACrD,IAAMC,EAAO,OAAO,SAASF,EAAU,EAAE,EACzC,GAAI,CAAC,OAAO,cAAcE,CAAI,GAAKA,EAAO,EAAG,OAC7C,IAAMC,EAASL,IAAQ,GAEvB,MAAO,CAAE,OAAM,UAAS,OADTK,IAAW,MAAe,QAAUA,IAAW,MAAiB,UAAY,IAAA,EAC5D,CACjC,CAEA,SAAgBC,EAAgB,EAAmC,CACjE,OAAOrB,EAAoB,KAAKgB,CAAK,CAAC,GAAG,EAC3C,CAMA,SAAgBM,EAAqB,EAA0B,EAA2C,CACxG,IAAMC,EAA6B,CAAC,EACpC,IAAK,IAAMJ,KAAQR,EAAO,CACxB,IAAMa,EAAOH,EAAgBF,CAAI,EACjC,GAAIK,IAAS,IAAA,GAAW,CAClBC,IAAS,QAAQF,EAAU,KAAK,CAAE,KAAM,OAAQ,MAAK,CAAC,EAC1D,QACF,CACA,IAAMG,EAASZ,EAAgBK,CAAI,EAC/BO,IAAW,IAAA,GAIfH,EAAU,KAAK,CAAE,KAAM,QAAS,KAAMJ,CAAK,CAAC,EAH1CI,EAAU,KAAK,CAAE,KAAM,SAAU,MAAOG,CAAO,CAAC,CAIpD,CACA,OAAOH,CACT,CAGA,SAAgBI,EACd,EACA,EACA,EACA,EACc,CACd,IAAMhB,EAAQL,EAAgBE,EAAQE,CAAM,EACtCkB,EAAShB,EAAmBD,CAAK,EACjCY,EAAYD,EAAqBX,EAAOc,CAAI,EAE5C,CAAE,QAAO,UAAWI,EAAcN,EADzBE,IAAS,OAAA,GAAA,GACmCK,CAAQ,EAKnE,MAAO,CAAE,QAAO,SAAQ,SAAQ,OAJjBC,EAAM,QAClB,EAAQ,IAAUZ,EAAK,OAAS,SAAW,KAAK,IAAIa,EAAQ,OAAOb,EAAK,MAAM,IAAI,CAAC,CAAC,MAAM,EAAIa,EAC/F,CAEmC,CAAE,CACzC,CAGA,SAAgBC,EAAe,EAAqD,CAClF,OAAOC,EAAO,OAAQ,GAA2BlB,IAAU,IAAA,IAAaA,EAAM,OAAS,CAAC,CAC1F"}
@@ -1,5 +1,5 @@
1
1
  import { GrammarKey } from "./editorLanguage.mjs";
2
- import { DOOM_SYNTAX_STYLES } from "./editorTheme.mjs";
2
+ import { PO_SYNTAX_STYLES } from "./editorTheme.mjs";
3
3
  import { CSSProperties } from "react";
4
4
  //#region src/lib/syntaxHighlight.d.ts
5
5
  /**
@@ -14,7 +14,7 @@ import { CSSProperties } from "react";
14
14
  * always has plain text to show first.
15
15
  */
16
16
  /** The palette keys a token can land on; the styles themselves are the editor's. */
17
- export type SyntaxToken = keyof typeof DOOM_SYNTAX_STYLES;
17
+ export type SyntaxToken = keyof typeof PO_SYNTAX_STYLES;
18
18
  /** One run of same-styled text inside a line. `token` absent means unstyled. */
19
19
  export interface SyntaxSpan {
20
20
  text: string;
@@ -1,3 +1,3 @@
1
- import{grammarKeyOf as e,loadGrammar as t}from"./editorLanguage.mjs";import{DOOM_SYNTAX_STYLES as n}from"./editorTheme.mjs";const r=[{pattern:/^#!.*\b(?:bash|sh|zsh|dash|ksh)\b/,grammar:`shell`},{pattern:/^#!.*\bpython[\d.]*\b/,grammar:`python`},{pattern:/^#!.*\b(?:node|bun|deno)\b/,grammar:`javascript`}],i=/^\s*[[{][\s\S]*[\]}]\s*$/;function a(t){let n=t.path===void 0||t.path.length===0?void 0:e(t.path);if(n!==void 0)return n;let a=t.text??``;if(a.length===0)return;let o=a.slice(0,200);if(o.startsWith(`#!`)){let e=o.split(`
1
+ import{grammarKeyOf as e,loadGrammar as t}from"./editorLanguage.mjs";import{PO_SYNTAX_STYLES as n}from"./editorTheme.mjs";const r=[{pattern:/^#!.*\b(?:bash|sh|zsh|dash|ksh)\b/,grammar:`shell`},{pattern:/^#!.*\bpython[\d.]*\b/,grammar:`python`},{pattern:/^#!.*\b(?:node|bun|deno)\b/,grammar:`javascript`}],i=/^\s*[[{][\s\S]*[\]}]\s*$/;function a(t){let n=t.path===void 0||t.path.length===0?void 0:e(t.path);if(n!==void 0)return n;let a=t.text??``;if(a.length===0)return;let o=a.slice(0,200);if(o.startsWith(`#!`)){let e=o.split(`
2
2
  `,1)[0]??``;for(let t of r)if(t.pattern.test(e))return t.grammar;return`shell`}return i.test(a)?`json`:void 0}function o(e){return e===void 0?void 0:n[e]}async function s(){let{tagHighlighter:e,tags:t}=await import(`@lezer/highlight`);return e([{tag:t.comment,class:`comment`},{tag:t.keyword,class:`keyword`},{tag:[t.atom,t.bool,t.null,t.self],class:`constant`},{tag:t.number,class:`literal`},{tag:[t.string,t.special(t.string)],class:`string`},{tag:t.regexp,class:`regexp`},{tag:[t.operator,t.operatorKeyword],class:`operator`},{tag:[t.punctuation,t.separator,t.bracket],class:`punctuation`},{tag:[t.variableName,t.definition(t.variableName)],class:`variable`},{tag:[t.propertyName,t.definition(t.propertyName)],class:`property`},{tag:[t.function(t.variableName),t.function(t.propertyName)],class:`callable`},{tag:[t.typeName,t.className,t.namespace],class:`type`},{tag:[t.tagName,t.angleBracket],class:`tag`},{tag:t.attributeName,class:`attribute`},{tag:[t.meta,t.processingInstruction,t.documentMeta],class:`meta`},{tag:t.heading,class:`heading`},{tag:[t.link,t.url],class:`link`},{tag:t.emphasis,class:`emphasis`},{tag:t.strong,class:`strong`},{tag:t.strikethrough,class:`strikethrough`},{tag:t.invalid,class:`invalid`}])}async function c(e){let[{Language:n,LanguageSupport:r},i]=await Promise.all([import(`@codemirror/language`),t(e)]);if(i instanceof r)return i.language.parser;if(i instanceof n)return i.parser}async function l(e,t){if(e.length===0||e.length>2e5)return;let[{highlightCode:n},r,i]=await Promise.all([import(`@lezer/highlight`),s(),c(t)]);if(i===void 0)return;let a=[[]];return n(e,i.parse(e),r,(e,t)=>{a[a.length-1]?.push(t===``?{text:e}:{text:e,token:t})},()=>a.push([])),a}export{a as detectGrammar,l as highlightToLines,o as syntaxStyleOf};
3
3
  //# sourceMappingURL=syntaxHighlight.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"syntaxHighlight.mjs","names":["SHEBANG_GRAMMARS","JSON_SHAPE","detectGrammar","byPath","query","grammarKeyOf","text","head","firstLine","entry","syntaxStyleOf","token","DOOM_SYNTAX_STYLES","doomHighlighter","tagHighlighter","tags","parserFor","extension","loadGrammar","grammar","LanguageSupport","Language","highlightToLines","highlighter","parser","lines","highlightCode","classes","code"],"sources":["../../../../../../src/lib/syntaxHighlight.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport { type GrammarKey, grammarKeyOf, loadGrammar } from './editorLanguage';\nimport { DOOM_SYNTAX_STYLES } from './editorTheme';\n\n/**\n * Static syntax highlighting for read-only code, the timeline's half of the\n * editor's `syntaxHighlighting`.\n *\n * A tool card shows code it cannot edit, so it needs the colours without the\n * editor: the same grammars `editorLanguage.ts` loads and the same token\n * palette `editorTheme.ts` names, run once over a string and handed back as\n * spans. Everything CodeMirror-shaped is behind a dynamic import, so a session\n * that never opens a code result never downloads a parser, and the caller\n * always has plain text to show first.\n */\n\n/** The palette keys a token can land on; the styles themselves are the editor's. */\nexport type SyntaxToken = keyof typeof DOOM_SYNTAX_STYLES;\n\n/** One run of same-styled text inside a line. `token` absent means unstyled. */\nexport interface SyntaxSpan {\n text: string;\n token?: SyntaxToken;\n}\n\n/** Lines of spans, one array per source line, so a gutter can pair with them. */\nexport type SyntaxLines = readonly (readonly SyntaxSpan[])[];\n\n/**\n * Above this the parse costs more than the colour is worth. Tool results are\n * bounded well below it; a pasted file is not, and blocking the frame to paint\n * a wall of text nobody reads is the worse outcome.\n */\nconst MAX_HIGHLIGHT_CHARS = 200_000;\n\n/** Only the first line is needed to spot a shebang, and reading more of a big string is waste. */\nconst SNIFF_CHARS = 200;\n\nconst SHEBANG_GRAMMARS: ReadonlyArray<{ readonly pattern: RegExp; readonly grammar: GrammarKey }> = [\n { pattern: /^#!.*\\b(?:bash|sh|zsh|dash|ksh)\\b/, grammar: 'shell' },\n { pattern: /^#!.*\\bpython[\\d.]*\\b/, grammar: 'python' },\n { pattern: /^#!.*\\b(?:node|bun|deno)\\b/, grammar: 'javascript' },\n];\n\n/** JSON is the one shape worth guessing from the body: a document is an object or an array. */\nconst JSON_SHAPE = /^\\s*[[{][\\s\\S]*[\\]}]\\s*$/;\n\nexport interface GrammarQuery {\n /** The file the text came from, when the tool knows one. */\n path?: string | undefined;\n /** The text itself, used only when the path settles nothing. */\n text?: string | undefined;\n}\n\n/**\n * Which grammar to colour a result with.\n *\n * The path decides whenever it can, because a name is evidence and a body is a\n * guess. Sniffing only answers for text that arrived without a usable name: a\n * shebang says what runs the script, and a document that opens and closes with\n * brackets is treated as JSON. Anything else stays plain rather than being\n * coloured as the wrong language.\n */\nexport function detectGrammar(query: GrammarQuery): GrammarKey | undefined {\n const byPath = query.path === undefined || query.path.length === 0 ? undefined : grammarKeyOf(query.path);\n if (byPath !== undefined) return byPath;\n const text = query.text ?? '';\n if (text.length === 0) return undefined;\n const head = text.slice(0, SNIFF_CHARS);\n if (head.startsWith('#!')) {\n const firstLine = head.split('\\n', 1)[0] ?? '';\n for (const entry of SHEBANG_GRAMMARS) {\n if (entry.pattern.test(firstLine)) return entry.grammar;\n }\n // A shebang naming something with no grammar here is still a script.\n return 'shell';\n }\n return JSON_SHAPE.test(text) ? 'json' : undefined;\n}\n\n/** The inline style a token wears. Colours come from the editor palette, which names theme tokens. */\nexport function syntaxStyleOf(token: SyntaxToken | undefined): CSSProperties | undefined {\n return token === undefined ? undefined : DOOM_SYNTAX_STYLES[token];\n}\n\n/**\n * Every tag the palette answers for, in the order the editor lists them. The\n * class each entry carries is a palette key rather than a CSS class: the\n * result is rendered as inline styles, so nothing has to be mounted in the\n * document for a card to show colour.\n */\nasync function doomHighlighter() {\n const { tagHighlighter, tags } = await import('@lezer/highlight');\n return tagHighlighter([\n { tag: tags.comment, class: 'comment' satisfies SyntaxToken },\n { tag: tags.keyword, class: 'keyword' satisfies SyntaxToken },\n { tag: [tags.atom, tags.bool, tags.null, tags.self], class: 'constant' satisfies SyntaxToken },\n { tag: tags.number, class: 'literal' satisfies SyntaxToken },\n { tag: [tags.string, tags.special(tags.string)], class: 'string' satisfies SyntaxToken },\n { tag: tags.regexp, class: 'regexp' satisfies SyntaxToken },\n { tag: [tags.operator, tags.operatorKeyword], class: 'operator' satisfies SyntaxToken },\n { tag: [tags.punctuation, tags.separator, tags.bracket], class: 'punctuation' satisfies SyntaxToken },\n { tag: [tags.variableName, tags.definition(tags.variableName)], class: 'variable' satisfies SyntaxToken },\n { tag: [tags.propertyName, tags.definition(tags.propertyName)], class: 'property' satisfies SyntaxToken },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n class: 'callable' satisfies SyntaxToken,\n },\n { tag: [tags.typeName, tags.className, tags.namespace], class: 'type' satisfies SyntaxToken },\n { tag: [tags.tagName, tags.angleBracket], class: 'tag' satisfies SyntaxToken },\n { tag: tags.attributeName, class: 'attribute' satisfies SyntaxToken },\n { tag: [tags.meta, tags.processingInstruction, tags.documentMeta], class: 'meta' satisfies SyntaxToken },\n { tag: tags.heading, class: 'heading' satisfies SyntaxToken },\n { tag: [tags.link, tags.url], class: 'link' satisfies SyntaxToken },\n { tag: tags.emphasis, class: 'emphasis' satisfies SyntaxToken },\n { tag: tags.strong, class: 'strong' satisfies SyntaxToken },\n { tag: tags.strikethrough, class: 'strikethrough' satisfies SyntaxToken },\n { tag: tags.invalid, class: 'invalid' satisfies SyntaxToken },\n ]);\n}\n\n/** The parser behind a grammar. `loadGrammar` hands back an editor extension, which wraps one. */\nasync function parserFor(grammar: GrammarKey) {\n const [{ Language, LanguageSupport }, extension] = await Promise.all([\n import('@codemirror/language'),\n loadGrammar(grammar),\n ]);\n if (extension instanceof LanguageSupport) return extension.language.parser;\n if (extension instanceof Language) return extension.parser;\n return undefined;\n}\n\n/**\n * Colours `text` as `grammar`, as lines of spans.\n *\n * The whole text is parsed at once even though the caller may render it line\n * by line, because a template literal or a block comment only makes sense with\n * its neighbours. Text past the size cap, and a grammar whose extension turns\n * out to carry no parser, come back unhighlighted rather than throwing: colour\n * is decoration, and the caller already has the plain text on screen.\n */\nexport async function highlightToLines(text: string, grammar: GrammarKey): Promise<SyntaxLines | undefined> {\n if (text.length === 0 || text.length > MAX_HIGHLIGHT_CHARS) return undefined;\n const [{ highlightCode }, highlighter, parser] = await Promise.all([\n import('@lezer/highlight'),\n doomHighlighter(),\n parserFor(grammar),\n ]);\n if (parser === undefined) return undefined;\n\n const lines: SyntaxSpan[][] = [[]];\n highlightCode(\n text,\n parser.parse(text),\n highlighter,\n (code, classes) => {\n const current = lines[lines.length - 1];\n // `classes` is the palette key this module handed the tag highlighter,\n // or empty for text no tag claimed.\n current?.push(classes === '' ? { text: code } : { text: code, token: classes as SyntaxToken });\n },\n () => lines.push([]),\n );\n return lines;\n}\n"],"mappings":"4HAkCA,MAKMA,EAA8F,CAClG,CAAE,QAAS,oCAAqC,QAAS,OAAQ,EACjE,CAAE,QAAS,wBAAyB,QAAS,QAAS,EACtD,CAAE,QAAS,6BAA8B,QAAS,YAAa,CACjE,EAGMC,EAAa,2BAkBnB,SAAgBC,EAAc,EAA6C,CACzE,IAAMC,EAASC,EAAM,OAAS,IAAA,IAAaA,EAAM,KAAK,SAAW,EAAI,IAAA,GAAYC,EAAaD,EAAM,IAAI,EACxG,GAAID,IAAW,IAAA,GAAW,OAAOA,EACjC,IAAMG,EAAOF,EAAM,MAAQ,GAC3B,GAAIE,EAAK,SAAW,EAAG,OACvB,IAAMC,EAAOD,EAAK,MAAM,EAAG,GAAW,EACtC,GAAIC,EAAK,WAAW,IAAI,EAAG,CACzB,IAAMC,EAAYD,EAAK,MAAM;EAAM,CAAC,CAAC,CAAC,IAAM,GAC5C,IAAK,IAAME,KAAST,EAClB,GAAIS,EAAM,QAAQ,KAAKD,CAAS,EAAG,OAAOC,EAAM,QAGlD,MAAO,OACT,CACA,OAAOR,EAAW,KAAKK,CAAI,EAAI,OAAS,IAAA,EAC1C,CAGA,SAAgBI,EAAc,EAA2D,CACvF,OAAOC,IAAU,IAAA,GAAY,IAAA,GAAYC,EAAmBD,EAC9D,CAQA,eAAeE,GAAkB,CAC/B,GAAM,CAAE,iBAAgB,QAAS,MAAM,OAAO,oBAC9C,OAAOC,EAAe,CACpB,CAAE,IAAKC,EAAK,QAAS,MAAO,SAAgC,EAC5D,CAAE,IAAKA,EAAK,QAAS,MAAO,SAAgC,EAC5D,CAAE,IAAK,CAACA,EAAK,KAAMA,EAAK,KAAMA,EAAK,KAAMA,EAAK,IAAI,EAAG,MAAO,UAAiC,EAC7F,CAAE,IAAKA,EAAK,OAAQ,MAAO,SAAgC,EAC3D,CAAE,IAAK,CAACA,EAAK,OAAQA,EAAK,QAAQA,EAAK,MAAM,CAAC,EAAG,MAAO,QAA+B,EACvF,CAAE,IAAKA,EAAK,OAAQ,MAAO,QAA+B,EAC1D,CAAE,IAAK,CAACA,EAAK,SAAUA,EAAK,eAAe,EAAG,MAAO,UAAiC,EACtF,CAAE,IAAK,CAACA,EAAK,YAAaA,EAAK,UAAWA,EAAK,OAAO,EAAG,MAAO,aAAoC,EACpG,CAAE,IAAK,CAACA,EAAK,aAAcA,EAAK,WAAWA,EAAK,YAAY,CAAC,EAAG,MAAO,UAAiC,EACxG,CAAE,IAAK,CAACA,EAAK,aAAcA,EAAK,WAAWA,EAAK,YAAY,CAAC,EAAG,MAAO,UAAiC,EACxG,CACE,IAAK,CAACA,EAAK,SAASA,EAAK,YAAY,EAAGA,EAAK,SAASA,EAAK,YAAY,CAAC,EACxE,MAAO,UACT,EACA,CAAE,IAAK,CAACA,EAAK,SAAUA,EAAK,UAAWA,EAAK,SAAS,EAAG,MAAO,MAA6B,EAC5F,CAAE,IAAK,CAACA,EAAK,QAASA,EAAK,YAAY,EAAG,MAAO,KAA4B,EAC7E,CAAE,IAAKA,EAAK,cAAe,MAAO,WAAkC,EACpE,CAAE,IAAK,CAACA,EAAK,KAAMA,EAAK,sBAAuBA,EAAK,YAAY,EAAG,MAAO,MAA6B,EACvG,CAAE,IAAKA,EAAK,QAAS,MAAO,SAAgC,EAC5D,CAAE,IAAK,CAACA,EAAK,KAAMA,EAAK,GAAG,EAAG,MAAO,MAA6B,EAClE,CAAE,IAAKA,EAAK,SAAU,MAAO,UAAiC,EAC9D,CAAE,IAAKA,EAAK,OAAQ,MAAO,QAA+B,EAC1D,CAAE,IAAKA,EAAK,cAAe,MAAO,eAAsC,EACxE,CAAE,IAAKA,EAAK,QAAS,MAAO,SAAgC,CAC9D,CAAC,CACH,CAGA,eAAeC,EAAU,EAAqB,CAC5C,GAAM,CAAC,CAAE,WAAU,mBAAmBC,GAAa,MAAM,QAAQ,IAAI,CACnE,OAAO,wBACPC,EAAYC,CAAO,CACrB,CAAC,EACD,GAAIF,aAAqBG,EAAiB,OAAOH,EAAU,SAAS,OACpE,GAAIA,aAAqBI,EAAU,OAAOJ,EAAU,MAEtD,CAWA,eAAsBK,EAAiB,EAAc,EAAuD,CAC1G,GAAIhB,EAAK,SAAW,GAAKA,EAAK,OAAS,IAAqB,OAC5D,GAAM,CAAC,CAAE,iBAAiBiB,EAAaC,GAAU,MAAM,QAAQ,IAAI,CACjE,OAAO,oBACPX,EAAgB,EAChBG,EAAUG,CAAO,CACnB,CAAC,EACD,GAAIK,IAAW,IAAA,GAAW,OAE1B,IAAMC,EAAwB,CAAC,CAAC,CAAC,EAajC,OAZAC,EACEpB,EACAkB,EAAO,MAAMlB,CAAI,EACjBiB,GACC,EAAM,IAAY,CAIjBE,EAHsBA,EAAM,OAAS,EAG9B,EAAE,KAAKE,IAAY,GAAK,CAAE,KAAMC,CAAK,EAAI,CAAE,KAAMA,EAAM,MAAOD,CAAuB,CAAC,CAC/F,MACMF,EAAM,KAAK,CAAC,CAAC,CACrB,EACOA,CACT"}
1
+ {"version":3,"file":"syntaxHighlight.mjs","names":["SHEBANG_GRAMMARS","JSON_SHAPE","detectGrammar","byPath","query","grammarKeyOf","text","head","firstLine","entry","syntaxStyleOf","token","PO_SYNTAX_STYLES","poHighlighter","tagHighlighter","tags","parserFor","extension","loadGrammar","grammar","LanguageSupport","Language","highlightToLines","highlighter","parser","lines","highlightCode","classes","code"],"sources":["../../../../../../src/lib/syntaxHighlight.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport { type GrammarKey, grammarKeyOf, loadGrammar } from './editorLanguage';\nimport { PO_SYNTAX_STYLES } from './editorTheme';\n\n/**\n * Static syntax highlighting for read-only code, the timeline's half of the\n * editor's `syntaxHighlighting`.\n *\n * A tool card shows code it cannot edit, so it needs the colours without the\n * editor: the same grammars `editorLanguage.ts` loads and the same token\n * palette `editorTheme.ts` names, run once over a string and handed back as\n * spans. Everything CodeMirror-shaped is behind a dynamic import, so a session\n * that never opens a code result never downloads a parser, and the caller\n * always has plain text to show first.\n */\n\n/** The palette keys a token can land on; the styles themselves are the editor's. */\nexport type SyntaxToken = keyof typeof PO_SYNTAX_STYLES;\n\n/** One run of same-styled text inside a line. `token` absent means unstyled. */\nexport interface SyntaxSpan {\n text: string;\n token?: SyntaxToken;\n}\n\n/** Lines of spans, one array per source line, so a gutter can pair with them. */\nexport type SyntaxLines = readonly (readonly SyntaxSpan[])[];\n\n/**\n * Above this the parse costs more than the colour is worth. Tool results are\n * bounded well below it; a pasted file is not, and blocking the frame to paint\n * a wall of text nobody reads is the worse outcome.\n */\nconst MAX_HIGHLIGHT_CHARS = 200_000;\n\n/** Only the first line is needed to spot a shebang, and reading more of a big string is waste. */\nconst SNIFF_CHARS = 200;\n\nconst SHEBANG_GRAMMARS: ReadonlyArray<{ readonly pattern: RegExp; readonly grammar: GrammarKey }> = [\n { pattern: /^#!.*\\b(?:bash|sh|zsh|dash|ksh)\\b/, grammar: 'shell' },\n { pattern: /^#!.*\\bpython[\\d.]*\\b/, grammar: 'python' },\n { pattern: /^#!.*\\b(?:node|bun|deno)\\b/, grammar: 'javascript' },\n];\n\n/** JSON is the one shape worth guessing from the body: a document is an object or an array. */\nconst JSON_SHAPE = /^\\s*[[{][\\s\\S]*[\\]}]\\s*$/;\n\nexport interface GrammarQuery {\n /** The file the text came from, when the tool knows one. */\n path?: string | undefined;\n /** The text itself, used only when the path settles nothing. */\n text?: string | undefined;\n}\n\n/**\n * Which grammar to colour a result with.\n *\n * The path decides whenever it can, because a name is evidence and a body is a\n * guess. Sniffing only answers for text that arrived without a usable name: a\n * shebang says what runs the script, and a document that opens and closes with\n * brackets is treated as JSON. Anything else stays plain rather than being\n * coloured as the wrong language.\n */\nexport function detectGrammar(query: GrammarQuery): GrammarKey | undefined {\n const byPath = query.path === undefined || query.path.length === 0 ? undefined : grammarKeyOf(query.path);\n if (byPath !== undefined) return byPath;\n const text = query.text ?? '';\n if (text.length === 0) return undefined;\n const head = text.slice(0, SNIFF_CHARS);\n if (head.startsWith('#!')) {\n const firstLine = head.split('\\n', 1)[0] ?? '';\n for (const entry of SHEBANG_GRAMMARS) {\n if (entry.pattern.test(firstLine)) return entry.grammar;\n }\n // A shebang naming something with no grammar here is still a script.\n return 'shell';\n }\n return JSON_SHAPE.test(text) ? 'json' : undefined;\n}\n\n/** The inline style a token wears. Colours come from the editor palette, which names theme tokens. */\nexport function syntaxStyleOf(token: SyntaxToken | undefined): CSSProperties | undefined {\n return token === undefined ? undefined : PO_SYNTAX_STYLES[token];\n}\n\n/**\n * Every tag the palette answers for, in the order the editor lists them. The\n * class each entry carries is a palette key rather than a CSS class: the\n * result is rendered as inline styles, so nothing has to be mounted in the\n * document for a card to show colour.\n */\nasync function poHighlighter() {\n const { tagHighlighter, tags } = await import('@lezer/highlight');\n return tagHighlighter([\n { tag: tags.comment, class: 'comment' satisfies SyntaxToken },\n { tag: tags.keyword, class: 'keyword' satisfies SyntaxToken },\n { tag: [tags.atom, tags.bool, tags.null, tags.self], class: 'constant' satisfies SyntaxToken },\n { tag: tags.number, class: 'literal' satisfies SyntaxToken },\n { tag: [tags.string, tags.special(tags.string)], class: 'string' satisfies SyntaxToken },\n { tag: tags.regexp, class: 'regexp' satisfies SyntaxToken },\n { tag: [tags.operator, tags.operatorKeyword], class: 'operator' satisfies SyntaxToken },\n { tag: [tags.punctuation, tags.separator, tags.bracket], class: 'punctuation' satisfies SyntaxToken },\n { tag: [tags.variableName, tags.definition(tags.variableName)], class: 'variable' satisfies SyntaxToken },\n { tag: [tags.propertyName, tags.definition(tags.propertyName)], class: 'property' satisfies SyntaxToken },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n class: 'callable' satisfies SyntaxToken,\n },\n { tag: [tags.typeName, tags.className, tags.namespace], class: 'type' satisfies SyntaxToken },\n { tag: [tags.tagName, tags.angleBracket], class: 'tag' satisfies SyntaxToken },\n { tag: tags.attributeName, class: 'attribute' satisfies SyntaxToken },\n { tag: [tags.meta, tags.processingInstruction, tags.documentMeta], class: 'meta' satisfies SyntaxToken },\n { tag: tags.heading, class: 'heading' satisfies SyntaxToken },\n { tag: [tags.link, tags.url], class: 'link' satisfies SyntaxToken },\n { tag: tags.emphasis, class: 'emphasis' satisfies SyntaxToken },\n { tag: tags.strong, class: 'strong' satisfies SyntaxToken },\n { tag: tags.strikethrough, class: 'strikethrough' satisfies SyntaxToken },\n { tag: tags.invalid, class: 'invalid' satisfies SyntaxToken },\n ]);\n}\n\n/** The parser behind a grammar. `loadGrammar` hands back an editor extension, which wraps one. */\nasync function parserFor(grammar: GrammarKey) {\n const [{ Language, LanguageSupport }, extension] = await Promise.all([\n import('@codemirror/language'),\n loadGrammar(grammar),\n ]);\n if (extension instanceof LanguageSupport) return extension.language.parser;\n if (extension instanceof Language) return extension.parser;\n return undefined;\n}\n\n/**\n * Colours `text` as `grammar`, as lines of spans.\n *\n * The whole text is parsed at once even though the caller may render it line\n * by line, because a template literal or a block comment only makes sense with\n * its neighbours. Text past the size cap, and a grammar whose extension turns\n * out to carry no parser, come back unhighlighted rather than throwing: colour\n * is decoration, and the caller already has the plain text on screen.\n */\nexport async function highlightToLines(text: string, grammar: GrammarKey): Promise<SyntaxLines | undefined> {\n if (text.length === 0 || text.length > MAX_HIGHLIGHT_CHARS) return undefined;\n const [{ highlightCode }, highlighter, parser] = await Promise.all([\n import('@lezer/highlight'),\n poHighlighter(),\n parserFor(grammar),\n ]);\n if (parser === undefined) return undefined;\n\n const lines: SyntaxSpan[][] = [[]];\n highlightCode(\n text,\n parser.parse(text),\n highlighter,\n (code, classes) => {\n const current = lines[lines.length - 1];\n // `classes` is the palette key this module handed the tag highlighter,\n // or empty for text no tag claimed.\n current?.push(classes === '' ? { text: code } : { text: code, token: classes as SyntaxToken });\n },\n () => lines.push([]),\n );\n return lines;\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ThemeConfig } from "../types/theme.mjs";
2
2
  //#region src/theme/builtinThemes.d.ts
3
3
  /** The theme the cockpit renders with until a preference says otherwise. */
4
- export declare const DEFAULT_THEME_NAME = "doom-one-dark";
4
+ export declare const DEFAULT_THEME_NAME = "po-one-light";
5
5
  /** The themes this package ships, default first. */
6
6
  export declare const BUILTIN_THEMES: readonly ThemeConfig[];
7
7
  export declare const DEFAULT_THEME: ThemeConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"builtinThemes.d.mts","names":[],"sources":["../../../../../../src/theme/builtinThemes.ts"],"mappings":";;;qBAaa;;qBAGA,yBAAyB;qBAMzB,eAAe;;wBAGZ,aAAa,eAAe"}
1
+ {"version":3,"file":"builtinThemes.d.mts","names":[],"sources":["../../../../../../src/theme/builtinThemes.ts"],"mappings":";;;qBAYa;;qBAGA,yBAAyB;qBAKzB,eAAe;;wBAGZ,aAAa,eAAe"}
@@ -1,2 +1,2 @@
1
- import e from"../../themes/doom-nord-dark.mjs";import t from"../../themes/doom-one-dark.mjs";import n from"../../themes/doom-one-light.mjs";import{parseThemeConfig as r}from"./parse.mjs";function i(e,t){let n=r(e);if(n===null)throw Error(`The shipped theme ${t} is malformed.`);return n}const a=`doom-one-dark`,o=[i(t,`doom-one-dark.json`),i(n,`doom-one-light.json`),i(e,`doom-nord-dark.json`)],s=o[0];function c(e){return o.find(t=>t.name===e)}export{o as BUILTIN_THEMES,s as DEFAULT_THEME,a as DEFAULT_THEME_NAME,c as builtinTheme};
1
+ import e from"../../themes/po-nord-dark.mjs";import t from"../../themes/po-one-light.mjs";import{parseThemeConfig as n}from"./parse.mjs";function r(e,t){let r=n(e);if(r===null)throw Error(`The shipped theme ${t} is malformed.`);return r}const i=`po-one-light`,a=[r(t,`po-one-light.json`),r(e,`po-nord-dark.json`)],o=a[0];function s(e){return a.find(t=>t.name===e)}export{a as BUILTIN_THEMES,o as DEFAULT_THEME,i as DEFAULT_THEME_NAME,s as builtinTheme};
2
2
  //# sourceMappingURL=builtinThemes.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtinThemes.mjs","names":["doomOneDark","doomOneLight","doomNordDark","doom_nord_dark_default","doom_one_dark_default","doom_one_light_default","shipped","theme","parseThemeConfig","input","file","DEFAULT_THEME_NAME","BUILTIN_THEMES","DEFAULT_THEME","builtinTheme","name"],"sources":["../../../../../../src/theme/builtinThemes.ts"],"sourcesContent":["import doomNordDark from '../../themes/doom-nord-dark.json' with { type: 'json' };\nimport doomOneDark from '../../themes/doom-one-dark.json' with { type: 'json' };\nimport doomOneLight from '../../themes/doom-one-light.json' with { type: 'json' };\nimport type { ThemeConfig } from '../types/theme';\nimport { parseThemeConfig } from './parse';\n\nfunction shipped(input: unknown, file: string): ThemeConfig {\n const theme = parseThemeConfig(input);\n if (theme === null) throw new Error(`The shipped theme ${file} is malformed.`);\n return theme;\n}\n\n/** The theme the cockpit renders with until a preference says otherwise. */\nexport const DEFAULT_THEME_NAME = 'doom-one-dark';\n\n/** The themes this package ships, default first. */\nexport const BUILTIN_THEMES: readonly ThemeConfig[] = [\n shipped(doomOneDark, 'doom-one-dark.json'),\n shipped(doomOneLight, 'doom-one-light.json'),\n shipped(doomNordDark, 'doom-nord-dark.json'),\n];\n\nexport const DEFAULT_THEME: ThemeConfig = BUILTIN_THEMES[0];\n\n/** A shipped theme by name, or undefined for a name nothing shipped under. */\nexport function builtinTheme(name: string): ThemeConfig | undefined {\n return BUILTIN_THEMES.find((theme) => theme.name === name);\n}\n"],"mappings":"2LAMA,SAASM,EAAQ,EAAgB,EAA2B,CAC1D,IAAMC,EAAQC,EAAiBC,CAAK,EACpC,GAAIF,IAAU,KAAM,MAAU,MAAM,qBAAqBG,EAAK,eAAe,EAC7E,OAAOH,CACT,CAGA,MAAaI,EAAqB,gBAGrBC,EAAyC,CACpDN,EAAQN,EAAa,oBAAoB,EACzCM,EAAQL,EAAc,qBAAqB,EAC3CK,EAAQJ,EAAc,qBAAqB,CAC7C,EAEaW,EAA6BD,EAAe,GAGzD,SAAgBE,EAAa,EAAuC,CAClE,OAAOF,EAAe,KAAM,GAAUL,EAAM,OAASQ,CAAI,CAC3D"}
1
+ {"version":3,"file":"builtinThemes.mjs","names":["poOneLight","poNordDark","po_nord_dark_default","po_one_light_default","shipped","theme","parseThemeConfig","input","file","DEFAULT_THEME_NAME","BUILTIN_THEMES","DEFAULT_THEME","builtinTheme","name"],"sources":["../../../../../../src/theme/builtinThemes.ts"],"sourcesContent":["import poNordDark from '../../themes/po-nord-dark.json' with { type: 'json' };\nimport poOneLight from '../../themes/po-one-light.json' with { type: 'json' };\nimport type { ThemeConfig } from '../types/theme';\nimport { parseThemeConfig } from './parse';\n\nfunction shipped(input: unknown, file: string): ThemeConfig {\n const theme = parseThemeConfig(input);\n if (theme === null) throw new Error(`The shipped theme ${file} is malformed.`);\n return theme;\n}\n\n/** The theme the cockpit renders with until a preference says otherwise. */\nexport const DEFAULT_THEME_NAME = 'po-one-light';\n\n/** The themes this package ships, default first. */\nexport const BUILTIN_THEMES: readonly ThemeConfig[] = [\n shipped(poOneLight, 'po-one-light.json'),\n shipped(poNordDark, 'po-nord-dark.json'),\n];\n\nexport const DEFAULT_THEME: ThemeConfig = BUILTIN_THEMES[0];\n\n/** A shipped theme by name, or undefined for a name nothing shipped under. */\nexport function builtinTheme(name: string): ThemeConfig | undefined {\n return BUILTIN_THEMES.find((theme) => theme.name === name);\n}\n"],"mappings":"yIAKA,SAASI,EAAQ,EAAgB,EAA2B,CAC1D,IAAMC,EAAQC,EAAiBC,CAAK,EACpC,GAAIF,IAAU,KAAM,MAAU,MAAM,qBAAqBG,EAAK,eAAe,EAC7E,OAAOH,CACT,CAGA,MAAaI,EAAqB,eAGrBC,EAAyC,CACpDN,EAAQJ,EAAY,mBAAmB,EACvCI,EAAQH,EAAY,mBAAmB,CACzC,EAEaU,EAA6BD,EAAe,GAGzD,SAAgBE,EAAa,EAAuC,CAClE,OAAOF,EAAe,KAAM,GAAUL,EAAM,OAASQ,CAAI,CAC3D"}
@@ -1,2 +1,2 @@
1
- import{ACCENT_TOKENS as e}from"../types/theme.mjs";const t=`'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace`;function n(e){if(e===`font-mono`)return t;if(e===`on-selected`)return`color-mix(in srgb, var(--doom-selected) 12%, white)`;let[n,r]=e.split(`-`);return n===`tint`?`color-mix(in srgb, var(--doom-${r}) 16%, var(--doom-panel))`:`color-mix(in srgb, var(--doom-${r}) 40%, var(--doom-border))`}function r(){let t=[];for(let n of e)t.push(`tint-${n}`);for(let n of e)t.push(`edge-${n}`);return t.push(`on-selected`,`font-mono`),t}function i(e,t){let r=e.tokens[t];return r===void 0?n(t):r}export{t as DEFAULT_FONT_MONO,n as derivedFallback,r as derivedTokens,i as tokenValue};
1
+ import{ACCENT_TOKENS as e}from"../types/theme.mjs";const t=`'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace`;function n(e){if(e===`font-mono`)return t;if(e===`on-selected`)return`color-mix(in srgb, var(--po-selected) 12%, white)`;let[n,r]=e.split(`-`);return n===`tint`?`color-mix(in srgb, var(--po-${r}) 16%, var(--po-panel))`:`color-mix(in srgb, var(--po-${r}) 40%, var(--po-border))`}function r(){let t=[];for(let n of e)t.push(`tint-${n}`);for(let n of e)t.push(`edge-${n}`);return t.push(`on-selected`,`font-mono`),t}function i(e,t){let r=e.tokens[t];return r===void 0?n(t):r}export{t as DEFAULT_FONT_MONO,n as derivedFallback,r as derivedTokens,i as tokenValue};
2
2
  //# sourceMappingURL=derive.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"derive.mjs","names":["DEFAULT_FONT_MONO","derivedFallback","token","kind","accent","derivedTokens","tokens","ACCENT_TOKENS","tokenValue","own","theme"],"sources":["../../../../../../src/theme/derive.ts"],"sourcesContent":["import { ACCENT_TOKENS, type AccentToken, type DerivedToken, type ThemeConfig, type ThemeToken } from '../types/theme';\n\n/** How much of an accent goes into its tinted background; the rest is the panel. */\nexport const TINT_MIX_PERCENT = 16;\n/** How much of an accent goes into its accented border; the rest is the border. */\nexport const EDGE_MIX_PERCENT = 40;\n/** How much of the selection tints its foreground; the rest is white, so the label stays legible on it. */\nexport const ON_SELECTED_MIX_PERCENT = 12;\n\nexport const DEFAULT_FONT_MONO =\n \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\";\n\n/**\n * A derived token's fallback: a CSS colour expression over the palette, so a\n * theme that supplies only its palette still gets coherent tints and edges.\n */\nexport function derivedFallback(token: DerivedToken): string {\n if (token === 'font-mono') return DEFAULT_FONT_MONO;\n if (token === 'on-selected')\n return `color-mix(in srgb, var(--doom-selected) ${String(ON_SELECTED_MIX_PERCENT)}%, white)`;\n const [kind, accent] = token.split('-') as ['tint' | 'edge', AccentToken];\n return kind === 'tint'\n ? `color-mix(in srgb, var(--doom-${accent}) ${String(TINT_MIX_PERCENT)}%, var(--doom-panel))`\n : `color-mix(in srgb, var(--doom-${accent}) ${String(EDGE_MIX_PERCENT)}%, var(--doom-border))`;\n}\n\n/** Every derived token, in a stable order. */\nexport function derivedTokens(): DerivedToken[] {\n const tokens: DerivedToken[] = [];\n for (const accent of ACCENT_TOKENS) tokens.push(`tint-${accent}`);\n for (const accent of ACCENT_TOKENS) tokens.push(`edge-${accent}`);\n tokens.push('on-selected', 'font-mono');\n return tokens;\n}\n\n/** The value a theme publishes for a token: its own, or the derived fallback. */\nexport function tokenValue(theme: ThemeConfig, token: ThemeToken): string {\n const own = (theme.tokens as Partial<Record<ThemeToken, string>>)[token];\n if (own !== undefined) return own;\n return derivedFallback(token as DerivedToken);\n}\n"],"mappings":"mDASA,MAAaA,EACX,mHAMF,SAAgBC,EAAgB,EAA6B,CAC3D,GAAIC,IAAU,YAAa,OAAOF,EAClC,GAAIE,IAAU,cACZ,MAAO,sDACT,GAAM,CAACC,EAAMC,GAAUF,EAAM,MAAM,GAAG,EACtC,OAAOC,IAAS,OACZ,iCAAiCC,EAAO,2BACxC,iCAAiCA,EAAO,2BAC9C,CAGA,SAAgBC,GAAgC,CAC9C,IAAMC,EAAyB,CAAC,EAChC,IAAK,IAAMF,KAAUG,EAAeD,EAAO,KAAK,QAAQF,GAAQ,EAChE,IAAK,IAAMA,KAAUG,EAAeD,EAAO,KAAK,QAAQF,GAAQ,EAEhE,OADAE,EAAO,KAAK,cAAe,WAAW,EAC/BA,CACT,CAGA,SAAgBE,EAAW,EAAoB,EAA2B,CACxE,IAAMC,EAAOC,EAAM,OAA+CR,GAElE,OADIO,IAAQ,IAAA,GACLR,EAAgBC,CAAqB,EADdO,CAEhC"}
1
+ {"version":3,"file":"derive.mjs","names":["DEFAULT_FONT_MONO","derivedFallback","token","kind","accent","derivedTokens","tokens","ACCENT_TOKENS","tokenValue","own","theme"],"sources":["../../../../../../src/theme/derive.ts"],"sourcesContent":["import { ACCENT_TOKENS, type AccentToken, type DerivedToken, type ThemeConfig, type ThemeToken } from '../types/theme';\n\n/** How much of an accent goes into its tinted background; the rest is the panel. */\nexport const TINT_MIX_PERCENT = 16;\n/** How much of an accent goes into its accented border; the rest is the border. */\nexport const EDGE_MIX_PERCENT = 40;\n/** How much of the selection tints its foreground; the rest is white, so the label stays legible on it. */\nexport const ON_SELECTED_MIX_PERCENT = 12;\n\nexport const DEFAULT_FONT_MONO =\n \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\";\n\n/**\n * A derived token's fallback: a CSS colour expression over the palette, so a\n * theme that supplies only its palette still gets coherent tints and edges.\n */\nexport function derivedFallback(token: DerivedToken): string {\n if (token === 'font-mono') return DEFAULT_FONT_MONO;\n if (token === 'on-selected')\n return `color-mix(in srgb, var(--po-selected) ${String(ON_SELECTED_MIX_PERCENT)}%, white)`;\n const [kind, accent] = token.split('-') as ['tint' | 'edge', AccentToken];\n return kind === 'tint'\n ? `color-mix(in srgb, var(--po-${accent}) ${String(TINT_MIX_PERCENT)}%, var(--po-panel))`\n : `color-mix(in srgb, var(--po-${accent}) ${String(EDGE_MIX_PERCENT)}%, var(--po-border))`;\n}\n\n/** Every derived token, in a stable order. */\nexport function derivedTokens(): DerivedToken[] {\n const tokens: DerivedToken[] = [];\n for (const accent of ACCENT_TOKENS) tokens.push(`tint-${accent}`);\n for (const accent of ACCENT_TOKENS) tokens.push(`edge-${accent}`);\n tokens.push('on-selected', 'font-mono');\n return tokens;\n}\n\n/** The value a theme publishes for a token: its own, or the derived fallback. */\nexport function tokenValue(theme: ThemeConfig, token: ThemeToken): string {\n const own = (theme.tokens as Partial<Record<ThemeToken, string>>)[token];\n if (own !== undefined) return own;\n return derivedFallback(token as DerivedToken);\n}\n"],"mappings":"mDASA,MAAaA,EACX,mHAMF,SAAgBC,EAAgB,EAA6B,CAC3D,GAAIC,IAAU,YAAa,OAAOF,EAClC,GAAIE,IAAU,cACZ,MAAO,oDACT,GAAM,CAACC,EAAMC,GAAUF,EAAM,MAAM,GAAG,EACtC,OAAOC,IAAS,OACZ,+BAA+BC,EAAO,yBACtC,+BAA+BA,EAAO,yBAC5C,CAGA,SAAgBC,GAAgC,CAC9C,IAAMC,EAAyB,CAAC,EAChC,IAAK,IAAMF,KAAUG,EAAeD,EAAO,KAAK,QAAQF,GAAQ,EAChE,IAAK,IAAMA,KAAUG,EAAeD,EAAO,KAAK,QAAQF,GAAQ,EAEhE,OADAE,EAAO,KAAK,cAAe,WAAW,EAC/BA,CACT,CAGA,SAAgBE,EAAW,EAAoB,EAA2B,CACxE,IAAMC,EAAOC,EAAM,OAA+CR,GAElE,OADIO,IAAQ,IAAA,GACLR,EAAgBC,CAAqB,EADdO,CAEhC"}
@@ -71,7 +71,7 @@ export declare const NATIVE_FONT_WEIGHT: {
71
71
  readonly semibold: '600';
72
72
  };
73
73
  /**
74
- * Durations in ms and the shared easing curve of `--animate-doom-*`. `slide`
74
+ * Durations in ms and the shared easing curve of `--animate-po-*`. `slide`
75
75
  * covers both slide directions; `easing` is the `cubic-bezier()` control points
76
76
  * for Reanimated's `Easing.bezier`.
77
77
  */
@@ -88,7 +88,7 @@ export interface NativeFontStack {
88
88
  ios: string;
89
89
  android: string;
90
90
  }
91
- /** The sans and mono families of `--font-sans` and `--doom-font-mono`, with system fallbacks. */
91
+ /** The sans and mono families of `--font-sans` and `--po-font-mono`, with system fallbacks. */
92
92
  export declare const NATIVE_FONT_FAMILY: {
93
93
  readonly sans: NativeFontStack;
94
94
  readonly mono: NativeFontStack;
@@ -1,2 +1,2 @@
1
- import{ACCENT_TOKENS as e,PALETTE_TOKENS as t}from"../types/theme.mjs";import{builtinTheme as n}from"./builtinThemes.mjs";import"./derive.mjs";const r=4,i={xs:2,sm:3,md:5,lg:10},a={...i,DEFAULT:4,full:9999},o={"2xs":{size:9,leading:1.45},xs:{size:10,leading:1.45},sm:{size:12,leading:1.45},base:{size:13,leading:1.5},lg:{size:15,leading:1.4},xl:{size:18,leading:1.3},"2xl":{size:22,leading:1.25},"3xl":{size:28,leading:1.2}},s={xl:-.01,"2xl":-.01,"3xl":-.01},c=1.625,l={regular:`400`,medium:`500`,semibold:`600`},u={fade:140,pop:160,rise:160,slide:180,easing:[.16,1,.3,1]},d={sans:{family:`IBM Plex Sans`,ios:`System`,android:`sans-serif`},mono:{family:`JetBrains Mono`,ios:`Menlo`,android:`monospace`}},f=/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;function p(e){if(!f.test(e))throw Error(`Native themes need hex colours; got "${e}".`);let t=e.length===4?e.slice(1).split(``).map(e=>e+e).join(``):e.slice(1);return[0,2,4].map(e=>Number.parseInt(t.slice(e,e+2),16))}function m(e,t,n){let r=t/100,i=p(e),a=p(n);return`#${i.map((e,t)=>{let n=Math.round(e*r+a[t]*(1-r));return Math.min(255,Math.max(0,n)).toString(16).padStart(2,`0`)}).join(``)}`}function h(e,t){let n=Math.min(255,Math.max(0,Math.round(t/100*255)));return`#${[...p(e),n].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function g(e){let t={};for(let n of Object.keys(o))t[n]=e(n);return t}function _(n){let r=n.tokens,i={};for(let e of t)i[e]=n.tokens[e];let f=(e,t)=>{i[e]=r[e]??t()};for(let t of e)f(`tint-${t}`,()=>m(i[t],16,i.panel));for(let t of e)f(`edge-${t}`,()=>m(i[t],40,i.border));return f(`on-selected`,()=>m(i.selected,12,`#ffffff`)),{scheme:n.scheme,colors:i,spacing:e=>e*4,borderRadius:a,fontSize:g(e=>o[e].size),lineHeight:g(e=>Math.round(o[e].size*o[e].leading)),lineHeightRelaxed:g(e=>Math.round(o[e].size*c)),letterSpacing:g(e=>{let t=s[e]??0;return Math.round(o[e].size*t*100)/100}),fontWeight:l,fontFamily:d,motion:u}}function v(e){let t=n(e);if(t===void 0)throw Error(`The shipped theme ${e} is missing.`);return _(t)}const y={dark:v(`doom-one-dark`),light:v(`doom-one-light`)};export{a as NATIVE_BORDER_RADIUS,d as NATIVE_FONT_FAMILY,l as NATIVE_FONT_WEIGHT,c as NATIVE_LEADING_RELAXED,s as NATIVE_LETTER_SPACING_EM,u as NATIVE_MOTION,i as NATIVE_RADII,r as NATIVE_SPACING_BASE,y as NATIVE_THEMES,o as NATIVE_TYPE_RAMP,m as mixHex,_ as nativeTheme,h as withAlpha};
1
+ import{ACCENT_TOKENS as e,PALETTE_TOKENS as t}from"../types/theme.mjs";import{builtinTheme as n}from"./builtinThemes.mjs";import"./derive.mjs";const r=4,i={xs:2,sm:3,md:5,lg:10},a={...i,DEFAULT:4,full:9999},o={"2xs":{size:9,leading:1.45},xs:{size:10,leading:1.45},sm:{size:12,leading:1.45},base:{size:13,leading:1.5},lg:{size:15,leading:1.4},xl:{size:18,leading:1.3},"2xl":{size:22,leading:1.25},"3xl":{size:28,leading:1.2}},s={xl:-.01,"2xl":-.01,"3xl":-.01},c=1.625,l={regular:`400`,medium:`500`,semibold:`600`},u={fade:140,pop:160,rise:160,slide:180,easing:[.16,1,.3,1]},d={sans:{family:`IBM Plex Sans`,ios:`System`,android:`sans-serif`},mono:{family:`JetBrains Mono`,ios:`Menlo`,android:`monospace`}},f=/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;function p(e){if(!f.test(e))throw Error(`Native themes need hex colours; got "${e}".`);let t=e.length===4?e.slice(1).split(``).map(e=>e+e).join(``):e.slice(1);return[0,2,4].map(e=>Number.parseInt(t.slice(e,e+2),16))}function m(e,t,n){let r=t/100,i=p(e),a=p(n);return`#${i.map((e,t)=>{let n=Math.round(e*r+a[t]*(1-r));return Math.min(255,Math.max(0,n)).toString(16).padStart(2,`0`)}).join(``)}`}function h(e,t){let n=Math.min(255,Math.max(0,Math.round(t/100*255)));return`#${[...p(e),n].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function g(e){let t={};for(let n of Object.keys(o))t[n]=e(n);return t}function _(n){let r=n.tokens,i={};for(let e of t)i[e]=n.tokens[e];let f=(e,t)=>{i[e]=r[e]??t()};for(let t of e)f(`tint-${t}`,()=>m(i[t],16,i.panel));for(let t of e)f(`edge-${t}`,()=>m(i[t],40,i.border));return f(`on-selected`,()=>m(i.selected,12,`#ffffff`)),{scheme:n.scheme,colors:i,spacing:e=>e*4,borderRadius:a,fontSize:g(e=>o[e].size),lineHeight:g(e=>Math.round(o[e].size*o[e].leading)),lineHeightRelaxed:g(e=>Math.round(o[e].size*c)),letterSpacing:g(e=>{let t=s[e]??0;return Math.round(o[e].size*t*100)/100}),fontWeight:l,fontFamily:d,motion:u}}function v(e){let t=n(e);if(t===void 0)throw Error(`The shipped theme ${e} is missing.`);return _(t)}const y={dark:v(`po-nord-dark`),light:v(`po-one-light`)};export{a as NATIVE_BORDER_RADIUS,d as NATIVE_FONT_FAMILY,l as NATIVE_FONT_WEIGHT,c as NATIVE_LEADING_RELAXED,s as NATIVE_LETTER_SPACING_EM,u as NATIVE_MOTION,i as NATIVE_RADII,r as NATIVE_SPACING_BASE,y as NATIVE_THEMES,o as NATIVE_TYPE_RAMP,m as mixHex,_ as nativeTheme,h as withAlpha};
2
2
  //# sourceMappingURL=nativeTheme.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"nativeTheme.mjs","names":["NATIVE_SPACING_BASE","NATIVE_RADII","NATIVE_BORDER_RADIUS","NATIVE_TYPE_RAMP","NATIVE_LETTER_SPACING_EM","NATIVE_LEADING_RELAXED","NATIVE_FONT_WEIGHT","NATIVE_MOTION","NATIVE_FONT_FAMILY","HEX_COLOR","hexChannels","hex","digits","digit","offset","mixHex","weight","percent","a","first","b","second","mixed","channel","index","withAlpha","alpha","rampValues","values","step","pick","nativeTheme","pinned","config","colors","token","PALETTE_TOKENS","resolve","fallback","accent","ACCENT_TOKENS","steps","em","shippedNative","theme","builtinTheme","name","NATIVE_THEMES"],"sources":["../../../../../../src/theme/nativeTheme.ts"],"sourcesContent":["import { ACCENT_TOKENS, PALETTE_TOKENS, type ThemeConfig, type ThemeScheme, type ThemeToken } from '../types/theme';\nimport { builtinTheme } from './builtinThemes';\nimport { EDGE_MIX_PERCENT, ON_SELECTED_MIX_PERCENT, TINT_MIX_PERCENT } from './derive';\n\n/*\n * The React Native copy of the web theme. Native styles cannot read CSS\n * custom properties or evaluate color-mix(), so this module resolves the same\n * tokens to plain values. The scales below mirror styles/theme.css by hand\n * (CSS cannot import TypeScript); tests/nativeTheme.test.ts fails when the two\n * drift.\n *\n * ponytail: bundle IBM Plex Sans and JetBrains Mono through expo-font when the\n * native visual review starts; until then the named families fall back to the\n * platform fonts below.\n * ponytail: add a native theme picker later; the shell follows the system\n * scheme between `light` and `dark` for now.\n * ponytail: `--tracking-*` (tracked uppercase micro-labels) is not ported;\n * docs/design.md bans tracked uppercase on new surfaces.\n * ponytail: `shadow-2xl` is not ported; native surfaces (sheets, modals,\n * headers) draw their own platform shadows.\n */\n\n/** The spacing unit, matching `--spacing: 0.25rem` at a 16px root. */\nexport const NATIVE_SPACING_BASE = 4;\n\n/** Corner radii in px, matching `--radius-*`. */\nexport const NATIVE_RADII = { xs: 2, sm: 3, md: 5, lg: 10 } as const;\n\n/**\n * Every radius a native style may name: the retunable `--radius-*` steps, plus\n * Tailwind's hardcoded bare `rounded` (4px) and `rounded-full`.\n */\nexport const NATIVE_BORDER_RADIUS = { ...NATIVE_RADII, DEFAULT: 4, full: 9999 } as const;\n\n/** The type ramp, matching `--text-*` (px) and `--text-*--line-height` (a multiple of the size). */\nexport const NATIVE_TYPE_RAMP = {\n '2xs': { size: 9, leading: 1.45 },\n xs: { size: 10, leading: 1.45 },\n sm: { size: 12, leading: 1.45 },\n base: { size: 13, leading: 1.5 },\n lg: { size: 15, leading: 1.4 },\n xl: { size: 18, leading: 1.3 },\n '2xl': { size: 22, leading: 1.25 },\n '3xl': { size: 28, leading: 1.2 },\n} as const;\n\n/** Title tracking in em, matching `--text-*--letter-spacing`; steps not listed track at 0. */\nexport const NATIVE_LETTER_SPACING_EM = { xl: -0.01, '2xl': -0.01, '3xl': -0.01 } as const;\n\n/** Tailwind's `leading-relaxed` multiple, which theme.css does not override. */\nexport const NATIVE_LEADING_RELAXED = 1.625;\n\n/** Font weights as React Native takes them, matching `font-normal`, `font-medium` and `font-semibold`. */\nexport const NATIVE_FONT_WEIGHT = { regular: '400', medium: '500', semibold: '600' } as const;\n\n/**\n * Durations in ms and the shared easing curve of `--animate-doom-*`. `slide`\n * covers both slide directions; `easing` is the `cubic-bezier()` control points\n * for Reanimated's `Easing.bezier`.\n */\nexport const NATIVE_MOTION = {\n fade: 140,\n pop: 160,\n rise: 160,\n slide: 180,\n easing: [0.16, 1, 0.3, 1],\n} as const;\n\n/** A font as native styles name it: one family, plus the platform font to use until it is bundled. */\nexport interface NativeFontStack {\n family: string;\n ios: string;\n android: string;\n}\n\n/** The sans and mono families of `--font-sans` and `--doom-font-mono`, with system fallbacks. */\nexport const NATIVE_FONT_FAMILY: { readonly sans: NativeFontStack; readonly mono: NativeFontStack } = {\n sans: { family: 'IBM Plex Sans', ios: 'System', android: 'sans-serif' },\n mono: { family: 'JetBrains Mono', ios: 'Menlo', android: 'monospace' },\n};\n\n/** The foreground `on-selected` mixes toward, as `white` in derive.ts. */\nconst ON_SELECTED_BASE = '#ffffff';\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst PERCENT = 100;\nconst CHANNEL_MAX = 255;\n/** Rounds px values to hundredths so `18 * -0.01` reads -0.18, not a float tail. */\nconst PX_PRECISION = 100;\n\nexport type NativeColorToken = Exclude<ThemeToken, 'font-mono'>;\nexport type NativeTypeStep = keyof typeof NATIVE_TYPE_RAMP;\nexport type NativeNamedTheme = 'dark' | 'light';\n\nexport interface PoNativeTheme {\n scheme: ThemeScheme;\n colors: Record<NativeColorToken, string>;\n /** `spacing(n)` is n steps of the 4px base, as Tailwind's `p-n`. */\n spacing: (steps: number) => number;\n borderRadius: typeof NATIVE_BORDER_RADIUS;\n fontSize: Record<NativeTypeStep, number>;\n /** Absolute line heights in px, since native styles take no unitless multiple. */\n lineHeight: Record<NativeTypeStep, number>;\n /** `leading-relaxed` line heights in px, for reading text such as markdown bodies. */\n lineHeightRelaxed: Record<NativeTypeStep, number>;\n /** Letter spacing in px per step; titles track slightly tight, the rest at 0. */\n letterSpacing: Record<NativeTypeStep, number>;\n fontWeight: typeof NATIVE_FONT_WEIGHT;\n fontFamily: typeof NATIVE_FONT_FAMILY;\n motion: typeof NATIVE_MOTION;\n}\n\nfunction hexChannels(hex: string): [number, number, number] {\n if (!HEX_COLOR.test(hex)) throw new Error(`Native themes need hex colours; got \"${hex}\".`);\n const digits =\n hex.length === 4\n ? hex\n .slice(1)\n .split('')\n .map((digit) => digit + digit)\n .join('')\n : hex.slice(1);\n return [0, 2, 4].map((offset) => Number.parseInt(digits.slice(offset, offset + 2), 16)) as [number, number, number];\n}\n\n/**\n * `color-mix(in srgb, first percent%, second)` for hex inputs: a straight\n * per-channel blend, rounded to the nearest 8-bit value.\n */\nexport function mixHex(first: string, percent: number, second: string): string {\n const weight = percent / PERCENT;\n const a = hexChannels(first);\n const b = hexChannels(second);\n return `#${a\n .map((channel, index) => {\n const mixed = Math.round(channel * weight + b[index]! * (1 - weight));\n return Math.min(CHANNEL_MAX, Math.max(0, mixed)).toString(16).padStart(2, '0');\n })\n .join('')}`;\n}\n\n/**\n * A hex colour at `percent` opacity as `#rrggbbaa`: the native form of\n * Tailwind's `/40`-style opacity modifiers.\n */\nexport function withAlpha(hex: string, percent: number): string {\n const alpha = Math.min(CHANNEL_MAX, Math.max(0, Math.round((percent / PERCENT) * CHANNEL_MAX)));\n const channels = [...hexChannels(hex), alpha];\n return `#${channels.map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction rampValues(pick: (step: NativeTypeStep) => number): Record<NativeTypeStep, number> {\n const values = {} as Record<NativeTypeStep, number>;\n for (const step of Object.keys(NATIVE_TYPE_RAMP) as NativeTypeStep[]) values[step] = pick(step);\n return values;\n}\n\n/** Resolves a web theme config to native values; tokens the theme pins win over the derived mix. */\nexport function nativeTheme(config: ThemeConfig): PoNativeTheme {\n const pinned = config.tokens as Partial<Record<ThemeToken, string>>;\n const colors = {} as Record<NativeColorToken, string>;\n for (const token of PALETTE_TOKENS) colors[token] = config.tokens[token];\n const resolve = (token: NativeColorToken, fallback: () => string): void => {\n colors[token] = pinned[token] ?? fallback();\n };\n for (const accent of ACCENT_TOKENS) {\n resolve(`tint-${accent}`, () => mixHex(colors[accent], TINT_MIX_PERCENT, colors.panel));\n }\n for (const accent of ACCENT_TOKENS) {\n resolve(`edge-${accent}`, () => mixHex(colors[accent], EDGE_MIX_PERCENT, colors.border));\n }\n resolve('on-selected', () => mixHex(colors.selected, ON_SELECTED_MIX_PERCENT, ON_SELECTED_BASE));\n\n return {\n scheme: config.scheme,\n colors,\n spacing: (steps) => steps * NATIVE_SPACING_BASE,\n borderRadius: NATIVE_BORDER_RADIUS,\n fontSize: rampValues((step) => NATIVE_TYPE_RAMP[step].size),\n lineHeight: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_TYPE_RAMP[step].leading)),\n lineHeightRelaxed: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_LEADING_RELAXED)),\n letterSpacing: rampValues((step) => {\n const em = (NATIVE_LETTER_SPACING_EM as Partial<Record<NativeTypeStep, number>>)[step] ?? 0;\n return Math.round(NATIVE_TYPE_RAMP[step].size * em * PX_PRECISION) / PX_PRECISION;\n }),\n fontWeight: NATIVE_FONT_WEIGHT,\n fontFamily: NATIVE_FONT_FAMILY,\n motion: NATIVE_MOTION,\n };\n}\n\nfunction shippedNative(name: string): PoNativeTheme {\n const theme = builtinTheme(name);\n if (theme === undefined) throw new Error(`The shipped theme ${name} is missing.`);\n return nativeTheme(theme);\n}\n\n/** The native themes by the names the native shell registers: `dark` and `light`. */\nexport const NATIVE_THEMES: Readonly<Record<NativeNamedTheme, PoNativeTheme>> = {\n dark: shippedNative('doom-one-dark'),\n light: shippedNative('doom-one-light'),\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"nativeTheme.mjs","names":["NATIVE_SPACING_BASE","NATIVE_RADII","NATIVE_BORDER_RADIUS","NATIVE_TYPE_RAMP","NATIVE_LETTER_SPACING_EM","NATIVE_LEADING_RELAXED","NATIVE_FONT_WEIGHT","NATIVE_MOTION","NATIVE_FONT_FAMILY","HEX_COLOR","hexChannels","hex","digits","digit","offset","mixHex","weight","percent","a","first","b","second","mixed","channel","index","withAlpha","alpha","rampValues","values","step","pick","nativeTheme","pinned","config","colors","token","PALETTE_TOKENS","resolve","fallback","accent","ACCENT_TOKENS","steps","em","shippedNative","theme","builtinTheme","name","NATIVE_THEMES"],"sources":["../../../../../../src/theme/nativeTheme.ts"],"sourcesContent":["import { ACCENT_TOKENS, PALETTE_TOKENS, type ThemeConfig, type ThemeScheme, type ThemeToken } from '../types/theme';\nimport { builtinTheme } from './builtinThemes';\nimport { EDGE_MIX_PERCENT, ON_SELECTED_MIX_PERCENT, TINT_MIX_PERCENT } from './derive';\n\n/*\n * The React Native copy of the web theme. Native styles cannot read CSS\n * custom properties or evaluate color-mix(), so this module resolves the same\n * tokens to plain values. The scales below mirror styles/theme.css by hand\n * (CSS cannot import TypeScript); tests/nativeTheme.test.ts fails when the two\n * drift.\n *\n * ponytail: bundle IBM Plex Sans and JetBrains Mono through expo-font when the\n * native visual review starts; until then the named families fall back to the\n * platform fonts below.\n * ponytail: add a native theme picker later; the shell follows the system\n * scheme between `light` and `dark` for now.\n * ponytail: `--tracking-*` (tracked uppercase micro-labels) is not ported;\n * docs/design.md bans tracked uppercase on new surfaces.\n * ponytail: `shadow-2xl` is not ported; native surfaces (sheets, modals,\n * headers) draw their own platform shadows.\n */\n\n/** The spacing unit, matching `--spacing: 0.25rem` at a 16px root. */\nexport const NATIVE_SPACING_BASE = 4;\n\n/** Corner radii in px, matching `--radius-*`. */\nexport const NATIVE_RADII = { xs: 2, sm: 3, md: 5, lg: 10 } as const;\n\n/**\n * Every radius a native style may name: the retunable `--radius-*` steps, plus\n * Tailwind's hardcoded bare `rounded` (4px) and `rounded-full`.\n */\nexport const NATIVE_BORDER_RADIUS = { ...NATIVE_RADII, DEFAULT: 4, full: 9999 } as const;\n\n/** The type ramp, matching `--text-*` (px) and `--text-*--line-height` (a multiple of the size). */\nexport const NATIVE_TYPE_RAMP = {\n '2xs': { size: 9, leading: 1.45 },\n xs: { size: 10, leading: 1.45 },\n sm: { size: 12, leading: 1.45 },\n base: { size: 13, leading: 1.5 },\n lg: { size: 15, leading: 1.4 },\n xl: { size: 18, leading: 1.3 },\n '2xl': { size: 22, leading: 1.25 },\n '3xl': { size: 28, leading: 1.2 },\n} as const;\n\n/** Title tracking in em, matching `--text-*--letter-spacing`; steps not listed track at 0. */\nexport const NATIVE_LETTER_SPACING_EM = { xl: -0.01, '2xl': -0.01, '3xl': -0.01 } as const;\n\n/** Tailwind's `leading-relaxed` multiple, which theme.css does not override. */\nexport const NATIVE_LEADING_RELAXED = 1.625;\n\n/** Font weights as React Native takes them, matching `font-normal`, `font-medium` and `font-semibold`. */\nexport const NATIVE_FONT_WEIGHT = { regular: '400', medium: '500', semibold: '600' } as const;\n\n/**\n * Durations in ms and the shared easing curve of `--animate-po-*`. `slide`\n * covers both slide directions; `easing` is the `cubic-bezier()` control points\n * for Reanimated's `Easing.bezier`.\n */\nexport const NATIVE_MOTION = {\n fade: 140,\n pop: 160,\n rise: 160,\n slide: 180,\n easing: [0.16, 1, 0.3, 1],\n} as const;\n\n/** A font as native styles name it: one family, plus the platform font to use until it is bundled. */\nexport interface NativeFontStack {\n family: string;\n ios: string;\n android: string;\n}\n\n/** The sans and mono families of `--font-sans` and `--po-font-mono`, with system fallbacks. */\nexport const NATIVE_FONT_FAMILY: { readonly sans: NativeFontStack; readonly mono: NativeFontStack } = {\n sans: { family: 'IBM Plex Sans', ios: 'System', android: 'sans-serif' },\n mono: { family: 'JetBrains Mono', ios: 'Menlo', android: 'monospace' },\n};\n\n/** The foreground `on-selected` mixes toward, as `white` in derive.ts. */\nconst ON_SELECTED_BASE = '#ffffff';\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst PERCENT = 100;\nconst CHANNEL_MAX = 255;\n/** Rounds px values to hundredths so `18 * -0.01` reads -0.18, not a float tail. */\nconst PX_PRECISION = 100;\n\nexport type NativeColorToken = Exclude<ThemeToken, 'font-mono'>;\nexport type NativeTypeStep = keyof typeof NATIVE_TYPE_RAMP;\nexport type NativeNamedTheme = 'dark' | 'light';\n\nexport interface PoNativeTheme {\n scheme: ThemeScheme;\n colors: Record<NativeColorToken, string>;\n /** `spacing(n)` is n steps of the 4px base, as Tailwind's `p-n`. */\n spacing: (steps: number) => number;\n borderRadius: typeof NATIVE_BORDER_RADIUS;\n fontSize: Record<NativeTypeStep, number>;\n /** Absolute line heights in px, since native styles take no unitless multiple. */\n lineHeight: Record<NativeTypeStep, number>;\n /** `leading-relaxed` line heights in px, for reading text such as markdown bodies. */\n lineHeightRelaxed: Record<NativeTypeStep, number>;\n /** Letter spacing in px per step; titles track slightly tight, the rest at 0. */\n letterSpacing: Record<NativeTypeStep, number>;\n fontWeight: typeof NATIVE_FONT_WEIGHT;\n fontFamily: typeof NATIVE_FONT_FAMILY;\n motion: typeof NATIVE_MOTION;\n}\n\nfunction hexChannels(hex: string): [number, number, number] {\n if (!HEX_COLOR.test(hex)) throw new Error(`Native themes need hex colours; got \"${hex}\".`);\n const digits =\n hex.length === 4\n ? hex\n .slice(1)\n .split('')\n .map((digit) => digit + digit)\n .join('')\n : hex.slice(1);\n return [0, 2, 4].map((offset) => Number.parseInt(digits.slice(offset, offset + 2), 16)) as [number, number, number];\n}\n\n/**\n * `color-mix(in srgb, first percent%, second)` for hex inputs: a straight\n * per-channel blend, rounded to the nearest 8-bit value.\n */\nexport function mixHex(first: string, percent: number, second: string): string {\n const weight = percent / PERCENT;\n const a = hexChannels(first);\n const b = hexChannels(second);\n return `#${a\n .map((channel, index) => {\n const mixed = Math.round(channel * weight + b[index]! * (1 - weight));\n return Math.min(CHANNEL_MAX, Math.max(0, mixed)).toString(16).padStart(2, '0');\n })\n .join('')}`;\n}\n\n/**\n * A hex colour at `percent` opacity as `#rrggbbaa`: the native form of\n * Tailwind's `/40`-style opacity modifiers.\n */\nexport function withAlpha(hex: string, percent: number): string {\n const alpha = Math.min(CHANNEL_MAX, Math.max(0, Math.round((percent / PERCENT) * CHANNEL_MAX)));\n const channels = [...hexChannels(hex), alpha];\n return `#${channels.map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction rampValues(pick: (step: NativeTypeStep) => number): Record<NativeTypeStep, number> {\n const values = {} as Record<NativeTypeStep, number>;\n for (const step of Object.keys(NATIVE_TYPE_RAMP) as NativeTypeStep[]) values[step] = pick(step);\n return values;\n}\n\n/** Resolves a web theme config to native values; tokens the theme pins win over the derived mix. */\nexport function nativeTheme(config: ThemeConfig): PoNativeTheme {\n const pinned = config.tokens as Partial<Record<ThemeToken, string>>;\n const colors = {} as Record<NativeColorToken, string>;\n for (const token of PALETTE_TOKENS) colors[token] = config.tokens[token];\n const resolve = (token: NativeColorToken, fallback: () => string): void => {\n colors[token] = pinned[token] ?? fallback();\n };\n for (const accent of ACCENT_TOKENS) {\n resolve(`tint-${accent}`, () => mixHex(colors[accent], TINT_MIX_PERCENT, colors.panel));\n }\n for (const accent of ACCENT_TOKENS) {\n resolve(`edge-${accent}`, () => mixHex(colors[accent], EDGE_MIX_PERCENT, colors.border));\n }\n resolve('on-selected', () => mixHex(colors.selected, ON_SELECTED_MIX_PERCENT, ON_SELECTED_BASE));\n\n return {\n scheme: config.scheme,\n colors,\n spacing: (steps) => steps * NATIVE_SPACING_BASE,\n borderRadius: NATIVE_BORDER_RADIUS,\n fontSize: rampValues((step) => NATIVE_TYPE_RAMP[step].size),\n lineHeight: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_TYPE_RAMP[step].leading)),\n lineHeightRelaxed: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_LEADING_RELAXED)),\n letterSpacing: rampValues((step) => {\n const em = (NATIVE_LETTER_SPACING_EM as Partial<Record<NativeTypeStep, number>>)[step] ?? 0;\n return Math.round(NATIVE_TYPE_RAMP[step].size * em * PX_PRECISION) / PX_PRECISION;\n }),\n fontWeight: NATIVE_FONT_WEIGHT,\n fontFamily: NATIVE_FONT_FAMILY,\n motion: NATIVE_MOTION,\n };\n}\n\nfunction shippedNative(name: string): PoNativeTheme {\n const theme = builtinTheme(name);\n if (theme === undefined) throw new Error(`The shipped theme ${name} is missing.`);\n return nativeTheme(theme);\n}\n\n/** The native themes by the names the native shell registers: `dark` and `light`. */\nexport const NATIVE_THEMES: Readonly<Record<NativeNamedTheme, PoNativeTheme>> = {\n dark: shippedNative('po-nord-dark'),\n light: shippedNative('po-one-light'),\n};\n"],"mappings":"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"}
@@ -33,6 +33,6 @@ export interface ThemeConfig {
33
33
  tokens: Record<PaletteToken, string> & Partial<Record<DerivedToken, string>>;
34
34
  }
35
35
  /** The CSS custom property a token is published as. */
36
- export declare function themeVariable(token: ThemeToken): `--doom-${ThemeToken}`;
36
+ export declare function themeVariable(token: ThemeToken): `--po-${ThemeToken}`;
37
37
  //#endregion
38
38
  //# sourceMappingURL=theme.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.mts","names":[],"sources":["../../../../../../src/types/theme.ts"],"mappings":";;;;;;;;qBAOa;qBAuBA;qBAEA;;;;;;;;qBA6BA;YAED,uBAAuB;YACvB,sBAAsB;YACtB,uBAAuB;YACvB,qBAAqB;YAErB;;iBAGK;;EAEf;;EAEA;;EAEA,QAAQ;EACR,QAAQ,OAAO,wBAAwB,QAAQ,OAAO;;;wBAIxC,cAAc,OAAO,uBAAuB"}
1
+ {"version":3,"file":"theme.d.mts","names":[],"sources":["../../../../../../src/types/theme.ts"],"mappings":";;;;;;;;qBAOa;qBAuBA;qBAEA;;;;;;;;qBA6BA;YAED,uBAAuB;YACvB,sBAAsB;YACtB,uBAAuB;YACvB,qBAAqB;YAErB;;iBAGK;;EAEf;;EAEA;;EAEA,QAAQ;EACR,QAAQ,OAAO,wBAAwB,QAAQ,OAAO;;;wBAIxC,cAAc,OAAO,qBAAqB"}
@@ -1,2 +1,2 @@
1
- const e=[`bg`,`rail`,`panel`,`deep`,`border`,`border-soft`,`hi`,`text`,`dim`,`faint`,`blue`,`green`,`yellow`,`red`,`magenta`,`violet`,`cyan`,`orange`,`teal`,`selected`],t=[`blue`,`green`,`yellow`,`red`,`magenta`,`violet`,`cyan`,`orange`,`teal`],n=[`tint-blue`,`tint-green`,`tint-yellow`,`tint-red`,`tint-magenta`,`tint-violet`,`tint-cyan`,`tint-orange`,`tint-teal`,`edge-blue`,`edge-green`,`edge-yellow`,`edge-red`,`edge-magenta`,`edge-violet`,`edge-cyan`,`edge-orange`,`edge-teal`,`on-selected`,`font-mono`],r=[...e,...n];function i(e){return`--doom-${e}`}export{t as ACCENT_TOKENS,n as DERIVED_TOKENS,e as PALETTE_TOKENS,r as THEME_TOKENS,i as themeVariable};
1
+ const e=[`bg`,`rail`,`panel`,`deep`,`border`,`border-soft`,`hi`,`text`,`dim`,`faint`,`blue`,`green`,`yellow`,`red`,`magenta`,`violet`,`cyan`,`orange`,`teal`,`selected`],t=[`blue`,`green`,`yellow`,`red`,`magenta`,`violet`,`cyan`,`orange`,`teal`],n=[`tint-blue`,`tint-green`,`tint-yellow`,`tint-red`,`tint-magenta`,`tint-violet`,`tint-cyan`,`tint-orange`,`tint-teal`,`edge-blue`,`edge-green`,`edge-yellow`,`edge-red`,`edge-magenta`,`edge-violet`,`edge-cyan`,`edge-orange`,`edge-teal`,`on-selected`,`font-mono`],r=[...e,...n];function i(e){return`--po-${e}`}export{t as ACCENT_TOKENS,n as DERIVED_TOKENS,e as PALETTE_TOKENS,r as THEME_TOKENS,i as themeVariable};
2
2
  //# sourceMappingURL=theme.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.mjs","names":["PALETTE_TOKENS","ACCENT_TOKENS","DERIVED_TOKENS","THEME_TOKENS","themeVariable","token"],"sources":["../../../../../../src/types/theme.ts"],"sourcesContent":["/**\n * The web theme contract: the named colours every cockpit surface is built\n * from. Palette tokens are the hand-picked values a theme must supply; the\n * derived tokens (tinted backgrounds, accented borders) are computed from the\n * palette unless a theme pins them, which is how the shipped dark theme keeps\n * its exact mockup values while a third-party theme needs only the palette.\n */\nexport const PALETTE_TOKENS = [\n 'bg',\n 'rail',\n 'panel',\n 'deep',\n 'border',\n 'border-soft',\n 'hi',\n 'text',\n 'dim',\n 'faint',\n 'blue',\n 'green',\n 'yellow',\n 'red',\n 'magenta',\n 'violet',\n 'cyan',\n 'orange',\n 'teal',\n 'selected',\n] as const;\n\nexport const ACCENT_TOKENS = ['blue', 'green', 'yellow', 'red', 'magenta', 'violet', 'cyan', 'orange', 'teal'] as const;\n\nexport const DERIVED_TOKENS = [\n 'tint-blue',\n 'tint-green',\n 'tint-yellow',\n 'tint-red',\n 'tint-magenta',\n 'tint-violet',\n 'tint-cyan',\n 'tint-orange',\n 'tint-teal',\n 'edge-blue',\n 'edge-green',\n 'edge-yellow',\n 'edge-red',\n 'edge-magenta',\n 'edge-violet',\n 'edge-cyan',\n 'edge-orange',\n 'edge-teal',\n /**\n * The readable foreground on the `selected` surface. Derived so an existing\n * theme stays valid, but a theme whose `selected` is pale must pin it: CSS\n * cannot pick a contrasting colour on its own, and the fallback assumes a\n * saturated selection, which is what both shipped themes use.\n */\n 'on-selected',\n 'font-mono',\n] as const;\n\nexport const THEME_TOKENS = [...PALETTE_TOKENS, ...DERIVED_TOKENS] as const;\n\nexport type PaletteToken = (typeof PALETTE_TOKENS)[number];\nexport type AccentToken = (typeof ACCENT_TOKENS)[number];\nexport type DerivedToken = (typeof DERIVED_TOKENS)[number];\nexport type ThemeToken = (typeof THEME_TOKENS)[number];\n\nexport type ThemeScheme = 'dark' | 'light';\n\n/** A theme config as written in JSON: identity, colour scheme, and the token values. */\nexport interface ThemeConfig {\n /** Stable id, kebab-case; the `data-theme` attribute and the stored preference. */\n name: string;\n /** What a picker shows. */\n label: string;\n /** Drives `color-scheme` so native controls and scrollbars match. */\n scheme: ThemeScheme;\n tokens: Record<PaletteToken, string> & Partial<Record<DerivedToken, string>>;\n}\n\n/** The CSS custom property a token is published as. */\nexport function themeVariable(token: ThemeToken): `--doom-${ThemeToken}` {\n return `--doom-${token}`;\n}\n"],"mappings":"AAOA,MAAaA,EAAiB,CAC5B,KACA,OACA,QACA,OACA,SACA,cACA,KACA,OACA,MACA,QACA,OACA,QACA,SACA,MACA,UACA,SACA,OACA,SACA,OACA,UACF,EAEaC,EAAgB,CAAC,OAAQ,QAAS,SAAU,MAAO,UAAW,SAAU,OAAQ,SAAU,MAAM,EAEhGC,EAAiB,CAC5B,YACA,aACA,cACA,WACA,eACA,cACA,YACA,cACA,YACA,YACA,aACA,cACA,WACA,eACA,cACA,YACA,cACA,YAOA,cACA,WACF,EAEaC,EAAe,CAAC,GAAGH,EAAgB,GAAGE,CAAc,EAqBjE,SAAgBE,EAAc,EAA2C,CACvE,MAAO,UAAUC,GACnB"}
1
+ {"version":3,"file":"theme.mjs","names":["PALETTE_TOKENS","ACCENT_TOKENS","DERIVED_TOKENS","THEME_TOKENS","themeVariable","token"],"sources":["../../../../../../src/types/theme.ts"],"sourcesContent":["/**\n * The web theme contract: the named colours every cockpit surface is built\n * from. Palette tokens are the hand-picked values a theme must supply; the\n * derived tokens (tinted backgrounds, accented borders) are computed from the\n * palette unless a theme pins them, which is how the shipped dark theme keeps\n * its exact mockup values while a third-party theme needs only the palette.\n */\nexport const PALETTE_TOKENS = [\n 'bg',\n 'rail',\n 'panel',\n 'deep',\n 'border',\n 'border-soft',\n 'hi',\n 'text',\n 'dim',\n 'faint',\n 'blue',\n 'green',\n 'yellow',\n 'red',\n 'magenta',\n 'violet',\n 'cyan',\n 'orange',\n 'teal',\n 'selected',\n] as const;\n\nexport const ACCENT_TOKENS = ['blue', 'green', 'yellow', 'red', 'magenta', 'violet', 'cyan', 'orange', 'teal'] as const;\n\nexport const DERIVED_TOKENS = [\n 'tint-blue',\n 'tint-green',\n 'tint-yellow',\n 'tint-red',\n 'tint-magenta',\n 'tint-violet',\n 'tint-cyan',\n 'tint-orange',\n 'tint-teal',\n 'edge-blue',\n 'edge-green',\n 'edge-yellow',\n 'edge-red',\n 'edge-magenta',\n 'edge-violet',\n 'edge-cyan',\n 'edge-orange',\n 'edge-teal',\n /**\n * The readable foreground on the `selected` surface. Derived so an existing\n * theme stays valid, but a theme whose `selected` is pale must pin it: CSS\n * cannot pick a contrasting colour on its own, and the fallback assumes a\n * saturated selection, which is what both shipped themes use.\n */\n 'on-selected',\n 'font-mono',\n] as const;\n\nexport const THEME_TOKENS = [...PALETTE_TOKENS, ...DERIVED_TOKENS] as const;\n\nexport type PaletteToken = (typeof PALETTE_TOKENS)[number];\nexport type AccentToken = (typeof ACCENT_TOKENS)[number];\nexport type DerivedToken = (typeof DERIVED_TOKENS)[number];\nexport type ThemeToken = (typeof THEME_TOKENS)[number];\n\nexport type ThemeScheme = 'dark' | 'light';\n\n/** A theme config as written in JSON: identity, colour scheme, and the token values. */\nexport interface ThemeConfig {\n /** Stable id, kebab-case; the `data-theme` attribute and the stored preference. */\n name: string;\n /** What a picker shows. */\n label: string;\n /** Drives `color-scheme` so native controls and scrollbars match. */\n scheme: ThemeScheme;\n tokens: Record<PaletteToken, string> & Partial<Record<DerivedToken, string>>;\n}\n\n/** The CSS custom property a token is published as. */\nexport function themeVariable(token: ThemeToken): `--po-${ThemeToken}` {\n return `--po-${token}`;\n}\n"],"mappings":"AAOA,MAAaA,EAAiB,CAC5B,KACA,OACA,QACA,OACA,SACA,cACA,KACA,OACA,MACA,QACA,OACA,QACA,SACA,MACA,UACA,SACA,OACA,SACA,OACA,UACF,EAEaC,EAAgB,CAAC,OAAQ,QAAS,SAAU,MAAO,UAAW,SAAU,OAAQ,SAAU,MAAM,EAEhGC,EAAiB,CAC5B,YACA,aACA,cACA,WACA,eACA,cACA,YACA,cACA,YACA,YACA,aACA,cACA,WACA,eACA,cACA,YACA,cACA,YAOA,cACA,WACF,EAEaC,EAAe,CAAC,GAAGH,EAAgB,GAAGE,CAAc,EAqBjE,SAAgBE,EAAc,EAAyC,CACrE,MAAO,QAAQC,GACjB"}
@@ -0,0 +1,2 @@
1
+ var e={name:`po-nord-dark`,label:`Po Nord (dark)`,scheme:`dark`,tokens:{bg:`#2e3440`,rail:`#272c36`,panel:`#2b313d`,deep:`#232831`,border:`#434c5e`,"border-soft":`#353c4a`,hi:`#eceff4`,text:`#d8dee9`,dim:`#9aa4b8`,faint:`#939db1`,blue:`#81a1c1`,green:`#a3be8c`,yellow:`#ebcb8b`,red:`#bf616a`,magenta:`#b48ead`,violet:`#a3a7d6`,cyan:`#88c0d0`,orange:`#d08770`,teal:`#8fbcbb`,selected:`#4c6a92`}};export{e as default};
2
+ //# sourceMappingURL=po-nord-dark.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"po-nord-dark.mjs","names":["po_nord_dark_default","\"bg\"","\"rail\"","\"panel\"","\"deep\"","\"border\"","\"hi\"","\"text\"","\"dim\"","\"faint\"","\"blue\"","\"green\"","\"yellow\"","\"red\"","\"magenta\"","\"violet\"","\"cyan\"","\"orange\"","\"teal\"","\"selected\""],"sources":["../../../../../themes/po-nord-dark.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,2 @@
1
+ var e={name:`po-one-light`,label:`Po Bloom (light)`,scheme:`light`,tokens:{bg:`#f6f1e7`,rail:`#efe9dc`,panel:`#fffcf5`,deep:`#e7e0d1`,border:`#9a9587`,"border-soft":`#ddd6c6`,hi:`#18271f`,text:`#2a3a31`,dim:`#55625a`,faint:`#56645b`,blue:`#285d80`,green:`#1a6b4b`,yellow:`#7a5d1c`,red:`#ad4036`,magenta:`#a2445f`,violet:`#675a80`,cyan:`#2b696c`,orange:`#8c5932`,teal:`#256b52`,selected:`#2b7a62`,"on-selected":`#fffcf6`}};export{e as default};
2
+ //# sourceMappingURL=po-one-light.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"po-one-light.mjs","names":["po_one_light_default","\"bg\"","\"rail\"","\"panel\"","\"deep\"","\"border\"","\"hi\"","\"text\"","\"dim\"","\"faint\"","\"blue\"","\"green\"","\"yellow\"","\"red\"","\"magenta\"","\"violet\"","\"cyan\"","\"orange\"","\"teal\"","\"selected\""],"sources":["../../../../../themes/po-one-light.json"],"sourcesContent":[""],"mappings":""}
@@ -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(e){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Root,{"data-slot":`accordion`,...e})}function a({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Item,{"data-slot":`accordion-item`,className:e.cn(`border-b border-doom-border-soft last:border-b-0`,r),...i})}function o({className:i,children:a,...o}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Header,{className:`flex`,children:/* @__PURE__ */ (0,n.jsxs)(t.Accordion.Trigger,{"data-slot":`accordion-trigger`,className:e.cn(`flex flex-1 cursor-pointer items-center justify-between gap-2 py-2 text-left text-sm text-doom-hi outline-none transition-colors hover:text-doom-blue focus-visible:text-doom-blue [&[data-state=open]>svg]:rotate-180`,i),...o,children:[a,/* @__PURE__ */ (0,n.jsx)(r.ChevronDown,{className:`h-3 w-3 shrink-0 text-doom-faint transition-transform`})]})})}function s({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Content,{"data-slot":`accordion-content`,className:e.cn(`overflow-hidden pb-2 text-sm text-doom-dim`,r),...i})}exports.Accordion=i,exports.AccordionContent=s,exports.AccordionItem=a,exports.AccordionTrigger=o;
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(e){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Root,{"data-slot":`accordion`,...e})}function a({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Item,{"data-slot":`accordion-item`,className:e.cn(`border-b border-po-border-soft last:border-b-0`,r),...i})}function o({className:i,children:a,...o}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Header,{className:`flex`,children:/* @__PURE__ */ (0,n.jsxs)(t.Accordion.Trigger,{"data-slot":`accordion-trigger`,className:e.cn(`flex flex-1 cursor-pointer items-center justify-between gap-2 py-2 text-left text-sm text-po-hi outline-none transition-colors hover:text-po-blue focus-visible:text-po-blue [&[data-state=open]>svg]:rotate-180`,i),...o,children:[a,/* @__PURE__ */ (0,n.jsx)(r.ChevronDown,{className:`h-3 w-3 shrink-0 text-po-faint transition-transform`})]})})}function s({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Accordion.Content,{"data-slot":`accordion-content`,className:e.cn(`overflow-hidden pb-2 text-sm text-po-dim`,r),...i})}exports.Accordion=i,exports.AccordionContent=s,exports.AccordionItem=a,exports.AccordionTrigger=o;
2
2
  //# sourceMappingURL=Accordion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.cjs","names":["AccordionPrimitive","cn","ChevronDownIcon","require_cn","radix_ui","react_jsx_runtime","lucide_react","Accordion","props","AccordionItem","className","AccordionTrigger","children","AccordionContent"],"sources":["../../../src/components/Accordion.tsx"],"sourcesContent":["import { Accordion as AccordionPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { ChevronDownIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/** Several collapsibles that know about each other; pass type=\"single\" for one open at a time. */\nexport function Accordion(props: ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nexport function AccordionItem({ className, ...props }: ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b border-doom-border-soft last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nexport function AccordionTrigger({ className, children, ...props }: ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'flex flex-1 cursor-pointer items-center justify-between gap-2 py-2 text-left text-sm text-doom-hi outline-none transition-colors hover:text-doom-blue focus-visible:text-doom-blue [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"h-3 w-3 shrink-0 text-doom-faint transition-transform\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nexport function AccordionContent({ className, ...props }: ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className={cn('overflow-hidden pb-2 text-sm text-doom-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"kJAOA,SAAgBO,EAAU,EAAuD,CAC/E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAACL,EAAAA,UAAmB,KAApB,CAAyB,YAAU,YAAY,GAAIQ,CAAQ,CAAA,CACpE,CAEA,SAAgBC,EAAc,CAAE,YAAW,GAAGD,GAAyD,CACrG,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,KAApB,CACE,YAAU,iBACV,UAAWC,EAAAA,GAAG,mDAAoDS,CAAS,EAC3E,GAAIF,CACL,CAAA,CAEL,CAEA,SAAgBG,EAAiB,CAAE,YAAW,WAAU,GAAGH,GAA4D,CACrH,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,OAApB,CAA2B,UAAU,OACnC,SAAA,iBAAA,EAAAK,EAAA,KAAA,CAACL,EAAAA,UAAmB,QAApB,CACE,YAAU,oBACV,UAAWC,EAAAA,GACT,yNACAS,CACF,EACA,GAAIF,EANN,SAAA,CAQGI,EACD,iBAAA,EAAAP,EAAA,IAAA,CAACH,EAAAA,YAAD,CAAiB,UAAU,uDAAyD,CAAA,CAC1D,GACH,CAAA,CAE/B,CAEA,SAAgBW,EAAiB,CAAE,YAAW,GAAGL,GAA4D,CAC3G,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,QAApB,CACE,YAAU,oBACV,UAAWC,EAAAA,GAAG,6CAA8CS,CAAS,EACrE,GAAIF,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Accordion.cjs","names":["AccordionPrimitive","cn","ChevronDownIcon","require_cn","radix_ui","react_jsx_runtime","lucide_react","Accordion","props","AccordionItem","className","AccordionTrigger","children","AccordionContent"],"sources":["../../../src/components/Accordion.tsx"],"sourcesContent":["import { Accordion as AccordionPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { ChevronDownIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/** Several collapsibles that know about each other; pass type=\"single\" for one open at a time. */\nexport function Accordion(props: ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nexport function AccordionItem({ className, ...props }: ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b border-po-border-soft last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nexport function AccordionTrigger({ className, children, ...props }: ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'flex flex-1 cursor-pointer items-center justify-between gap-2 py-2 text-left text-sm text-po-hi outline-none transition-colors hover:text-po-blue focus-visible:text-po-blue [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"h-3 w-3 shrink-0 text-po-faint transition-transform\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nexport function AccordionContent({ className, ...props }: ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className={cn('overflow-hidden pb-2 text-sm text-po-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"kJAOA,SAAgBO,EAAU,EAAuD,CAC/E,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAACL,EAAAA,UAAmB,KAApB,CAAyB,YAAU,YAAY,GAAIQ,CAAQ,CAAA,CACpE,CAEA,SAAgBC,EAAc,CAAE,YAAW,GAAGD,GAAyD,CACrG,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,KAApB,CACE,YAAU,iBACV,UAAWC,EAAAA,GAAG,iDAAkDS,CAAS,EACzE,GAAIF,CACL,CAAA,CAEL,CAEA,SAAgBG,EAAiB,CAAE,YAAW,WAAU,GAAGH,GAA4D,CACrH,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,OAApB,CAA2B,UAAU,OACnC,SAAA,iBAAA,EAAAK,EAAA,KAAA,CAACL,EAAAA,UAAmB,QAApB,CACE,YAAU,oBACV,UAAWC,EAAAA,GACT,mNACAS,CACF,EACA,GAAIF,EANN,SAAA,CAQGI,EACD,iBAAA,EAAAP,EAAA,IAAA,CAACH,EAAAA,YAAD,CAAiB,UAAU,qDAAuD,CAAA,CACxD,GACH,CAAA,CAE/B,CAEA,SAAgBW,EAAiB,CAAE,YAAW,GAAGL,GAA4D,CAC3G,MACE,iBAAA,EAAAH,EAAA,IAAA,CAACL,EAAAA,UAAmB,QAApB,CACE,YAAU,oBACV,UAAWC,EAAAA,GAAG,2CAA4CS,CAAS,EACnE,GAAIF,CACL,CAAA,CAEL"}
@@ -0,0 +1,2 @@
1
+ const e=require("./Avatar.cjs"),t=require("./Dot.cjs");let n=require("react/jsx-runtime");function r(e){return e.split(/[-_.\s]+/u).filter(Boolean).slice(0,2).map(e=>e.charAt(0).toUpperCase()).join(``)}const i=[`bg-po-tint-green`,`bg-po-tint-teal`,`bg-po-tint-blue`,`bg-po-tint-cyan`,`bg-po-tint-yellow`,`bg-po-tint-violet`],a={running:`green`,waiting:`yellow`,done:`neutral`,failed:`red`};function o(e){let t=0;for(let n of e)t=(t*31+n.charCodeAt(0))%997;return i[t%i.length]??i[0]}function s({name:i,seed:s=i,state:c,size:l=`md`}){return/* @__PURE__ */ (0,n.jsxs)(`span`,{role:`img`,"aria-label":c?`${i}, ${c}`:i,"data-testid":`agent-avatar`,className:`relative inline-flex shrink-0`,children:[/* @__PURE__ */ (0,n.jsx)(e.Avatar,{className:`${l===`sm`?`size-6`:`size-8`} ${o(s)}`,children:/* @__PURE__ */ (0,n.jsx)(e.AvatarFallback,{className:`text-sm text-po-hi`,children:r(i)})}),c?/* @__PURE__ */ (0,n.jsx)(t.Dot,{tone:a[c],size:`md`,pulse:c===`running`,className:`absolute -right-0.5 -bottom-0.5 ring-2 ring-po-panel`}):null]})}exports.AgentAvatar=s,exports.agentInitials=r;
2
+ //# sourceMappingURL=AgentAvatar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentAvatar.cjs","names":["Avatar","AvatarFallback","Dot","require_Avatar","require_Dot","react_jsx_runtime","agentInitials","name","part","TINTS","STATE_DOT","tintFor","hash","char","seed","AgentAvatar","state","size"],"sources":["../../../src/components/AgentAvatar.tsx"],"sourcesContent":["import type { DotTone } from '../types/tone';\nimport { Avatar, AvatarFallback } from './Avatar';\nimport { Dot } from './Dot';\n\n/** How an agent is doing, as the avatar's corner dot shows it. */\nexport type AgentState = 'running' | 'waiting' | 'done' | 'failed';\n\n/** One letter for a first name, two for a hyphenated agent name (`po-developer` is PD). */\nexport function agentInitials(name: string): string {\n return name\n .split(/[-_.\\s]+/u)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join('');\n}\n\nconst TINTS = [\n 'bg-po-tint-green',\n 'bg-po-tint-teal',\n 'bg-po-tint-blue',\n 'bg-po-tint-cyan',\n 'bg-po-tint-yellow',\n 'bg-po-tint-violet',\n] as const;\n\nconst STATE_DOT: Readonly<Record<AgentState, DotTone>> = {\n running: 'green',\n waiting: 'yellow',\n done: 'neutral',\n failed: 'red',\n};\n\nfunction tintFor(seed: string): string {\n let hash = 0;\n for (const char of seed) hash = (hash * 31 + char.charCodeAt(0)) % 997;\n return TINTS[hash % TINTS.length] ?? TINTS[0];\n}\n\n/** An agent's face: its initials on a tint fixed by `seed`, with its state as a corner dot. */\nexport function AgentAvatar({\n name,\n seed = name,\n state,\n size = 'md',\n}: {\n name: string;\n seed?: string;\n state?: AgentState;\n size?: 'sm' | 'md';\n}) {\n return (\n <span\n role=\"img\"\n aria-label={state ? `${name}, ${state}` : name}\n data-testid=\"agent-avatar\"\n className=\"relative inline-flex shrink-0\"\n >\n <Avatar className={`${size === 'sm' ? 'size-6' : 'size-8'} ${tintFor(seed)}`}>\n <AvatarFallback className=\"text-sm text-po-hi\">{agentInitials(name)}</AvatarFallback>\n </Avatar>\n {state ? (\n <Dot\n tone={STATE_DOT[state]}\n size=\"md\"\n pulse={state === 'running'}\n className=\"absolute -right-0.5 -bottom-0.5 ring-2 ring-po-panel\"\n />\n ) : null}\n </span>\n );\n}\n"],"mappings":"0FAQA,SAAgBM,EAAc,EAAsB,CAClD,OAAOC,EACJ,MAAM,WAAW,CAAC,CAClB,OAAO,OAAO,CAAC,CACf,MAAM,EAAG,CAAC,CAAC,CACX,IAAK,GAASC,EAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAC3C,KAAK,EAAE,CACZ,CAEA,MAAMC,EAAQ,CACZ,mBACA,kBACA,kBACA,kBACA,oBACA,mBACF,EAEMC,EAAmD,CACvD,QAAS,QACT,QAAS,SACT,KAAM,UACN,OAAQ,KACV,EAEA,SAASC,EAAQ,EAAsB,CACrC,IAAIC,EAAO,EACX,IAAK,IAAMC,KAAQC,EAAM,GAAQF,EAAO,GAAKC,EAAK,WAAW,CAAC,GAAK,IACnE,OAAOJ,EAAMG,EAAOH,EAAM,SAAWA,EAAM,EAC7C,CAGA,SAAgBM,EAAY,CAC1B,OACA,OAAOR,EACP,QACA,OAAO,MAMN,CACD,MACE,iBAAA,EAAAF,EAAA,KAAA,CAAC,OAAD,CACE,KAAK,MACL,aAAYW,EAAQ,GAAGT,EAAK,IAAIS,IAAUT,EAC1C,cAAY,eACZ,UAAU,gCAJZ,SAAA,CAME,iBAAA,EAAAF,EAAA,IAAA,CAACL,EAAAA,OAAD,CAAQ,UAAW,GAAGiB,IAAS,KAAO,SAAW,SAAS,GAAGN,EAAQG,CAAI,IACvE,SAAA,iBAAA,EAAAT,EAAA,IAAA,CAACJ,EAAAA,eAAD,CAAgB,UAAU,qBAAsB,SAAAK,EAAcC,CAAI,CAAkB,CAAA,CAC9E,CAAA,EACPS,EACC,iBAAA,EAAAX,EAAA,IAAA,CAACH,EAAAA,IAAD,CACE,KAAMQ,EAAUM,GAChB,KAAK,KACL,MAAOA,IAAU,UACjB,UAAU,sDACX,CAAA,EACC,IACA,GAEV"}
@@ -1,4 +1,4 @@
1
- const e=require("../lib/cn.cjs"),t=require("../lib/ansiSpans.cjs");let n=require("react/jsx-runtime"),r=require("react");function i(t){return e.cn(t.className,t.bold===!0&&`font-bold`,t.faint===!0&&`opacity-60`,t.italic===!0&&`italic`,t.underline===!0&&`underline`,t.inverse===!0&&`bg-doom-text text-doom-deep`)}function a({spans:e}){return/* @__PURE__ */ (0,n.jsx)(n.Fragment,{children:e.map((e,t)=>/* @__PURE__ */ (0,n.jsx)(`span`,{className:i(e),style:e.color===void 0?void 0:{color:e.color},children:e.text},t))})}function o({line:e,className:i,...o}){let s=(0,r.useMemo)(()=>t.ansiSpans(e),[e]);return/* @__PURE__ */ (0,n.jsx)(`span`,{"data-slot":`ansi-line`,className:i,...o,children:/* @__PURE__ */ (0,n.jsx)(a,{spans:s})})}function s({text:e,...i}){let o=(0,r.useMemo)(()=>e.split(`
1
+ const e=require("../lib/cn.cjs"),t=require("../lib/ansiSpans.cjs");let n=require("react/jsx-runtime"),r=require("react");function i(t){return e.cn(t.className,t.bold===!0&&`font-bold`,t.faint===!0&&`opacity-60`,t.italic===!0&&`italic`,t.underline===!0&&`underline`,t.inverse===!0&&`bg-po-text text-po-deep`)}function a({spans:e}){return/* @__PURE__ */ (0,n.jsx)(n.Fragment,{children:e.map((e,t)=>/* @__PURE__ */ (0,n.jsx)(`span`,{className:i(e),style:e.color===void 0?void 0:{color:e.color},children:e.text},t))})}function o({line:e,className:i,...o}){let s=(0,r.useMemo)(()=>t.ansiSpans(e),[e]);return/* @__PURE__ */ (0,n.jsx)(`span`,{"data-slot":`ansi-line`,className:i,...o,children:/* @__PURE__ */ (0,n.jsx)(a,{spans:s})})}function s({text:e,...i}){let o=(0,r.useMemo)(()=>e.split(`
2
2
  `).map(e=>t.ansiSpans(e)),[e]);return/* @__PURE__ */ (0,n.jsx)(`pre`,{"data-slot":`ansi-text`,...i,children:o.map((e,t)=>/* @__PURE__ */ (0,n.jsxs)(r.Fragment,{children:[t>0?`
3
3
  `:null,/* @__PURE__ */ (0,n.jsx)(a,{spans:e})]},t))})}exports.AnsiLine=o,exports.AnsiText=s;
4
4
  //# sourceMappingURL=AnsiText.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnsiText.cjs","names":["cn","useMemo","ansiSpans","Fragment","require_cn","require_ansiSpans","react_jsx_runtime","react","spanClassName","span","AnsiSpans","spans","index","AnsiLine","props","line","AnsiText","lines","text"],"sources":["../../../src/components/AnsiText.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, useMemo } from 'react';\n\nimport { type AnsiSpan, ansiSpans } from '../lib/ansiSpans';\nimport { cn } from '../lib/cn';\n\n/**\n * Terminal output with the colours it was written in.\n *\n * Both readers of terminal text render it the same way, so the mapping from a\n * span's attributes to classes lives here rather than in each of them: a\n * captured workflow screen is a line at a time, and a runner log is a block.\n * Parsing is synchronous and cheap; text with no escapes in it takes a path\n * that allocates nothing.\n *\n * DESIGN PATTERNS:\n * - Named colours arrive as theme classes from `ansiSpans`; only 256-colour\n * and truecolour, which no token stands for, come through as a style.\n * - One element per line, so wrapping and selection behave as they do in a pre.\n *\n * AVOID:\n * - Carrying attributes across lines. A captured screen and a bounded log tail\n * both start mid-stream.\n */\n\nfunction spanClassName(span: AnsiSpan): string {\n return cn(\n span.className,\n span.bold === true && 'font-bold',\n span.faint === true && 'opacity-60',\n span.italic === true && 'italic',\n span.underline === true && 'underline',\n span.inverse === true && 'bg-doom-text text-doom-deep',\n );\n}\n\nfunction AnsiSpans({ spans }: { spans: readonly AnsiSpan[] }) {\n return (\n <>\n {spans.map((span, index) => (\n <span\n key={index}\n className={spanClassName(span)}\n style={span.color === undefined ? undefined : { color: span.color }}\n >\n {span.text}\n </span>\n ))}\n </>\n );\n}\n\nexport interface AnsiLineProps extends Omit<ComponentProps<'span'>, 'children'> {\n /** One line of terminal output, escapes and all. */\n line: string;\n}\n\n/** One line, for a caller that already lays out a screen row by row. */\nexport function AnsiLine({ line, className, ...props }: AnsiLineProps) {\n const spans = useMemo(() => ansiSpans(line), [line]);\n return (\n <span data-slot=\"ansi-line\" className={className} {...props}>\n <AnsiSpans spans={spans} />\n </span>\n );\n}\n\nexport interface AnsiTextProps extends Omit<ComponentProps<'pre'>, 'children'> {\n /** Terminal output, newline separated, escapes and all. */\n text: string;\n}\n\n/** A block of terminal output: a log tail, or anything else that arrives whole. */\nexport function AnsiText({ text, ...props }: AnsiTextProps) {\n const lines = useMemo(() => text.split('\\n').map((line) => ansiSpans(line)), [text]);\n return (\n <pre data-slot=\"ansi-text\" {...props}>\n {lines.map((spans, index) => (\n <Fragment key={index}>\n {index > 0 ? '\\n' : null}\n <AnsiSpans spans={spans} />\n </Fragment>\n ))}\n </pre>\n );\n}\n"],"mappings":"yHAwBA,SAASQ,EAAc,EAAwB,CAC7C,OAAOR,EAAAA,GACLS,EAAK,UACLA,EAAK,OAAS,IAAQ,YACtBA,EAAK,QAAU,IAAQ,aACvBA,EAAK,SAAW,IAAQ,SACxBA,EAAK,YAAc,IAAQ,YAC3BA,EAAK,UAAY,IAAQ,6BAC3B,CACF,CAEA,SAASC,EAAU,CAAE,SAAyC,CAC5D,MACE,iBAAA,EAAAJ,EAAA,IAAA,CAAAA,EAAA,SAAA,CAAA,SACGK,EAAM,KAAK,EAAM,IAChB,iBAAA,EAAAL,EAAA,IAAA,CAAC,OAAD,CAEE,UAAWE,EAAcC,CAAI,EAC7B,MAAOA,EAAK,QAAU,IAAA,GAAY,IAAA,GAAY,CAAE,MAAOA,EAAK,KAAM,EAEjE,SAAAA,EAAK,IACF,EALCG,CAKD,CACP,CACD,CAAA,CAEN,CAQA,SAAgBC,EAAS,CAAE,OAAM,YAAW,GAAGC,GAAwB,CACrE,IAAMH,GAAA,EAAQV,EAAAA,QAAAA,KAAcC,EAAAA,UAAUa,CAAI,EAAG,CAACA,CAAI,CAAC,EACnD,MACE,iBAAA,EAAAT,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,YAAuB,YAAW,GAAIQ,EACpD,SAAA,iBAAA,EAAAR,EAAA,IAAA,CAACI,EAAD,CAAkB,OAAQ,CAAA,CACtB,CAAA,CAEV,CAQA,SAAgBM,EAAS,CAAE,OAAM,GAAGF,GAAwB,CAC1D,IAAMG,GAAA,EAAQhB,EAAAA,QAAAA,KAAciB,EAAK,MAAM;CAAI,CAAC,CAAC,IAAK,GAAShB,EAAAA,UAAUa,CAAI,CAAC,EAAG,CAACG,CAAI,CAAC,EACnF,MACE,iBAAA,EAAAZ,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,YAAY,GAAIQ,EAC5B,SAAAG,EAAM,KAAK,EAAO,IACjB,iBAAA,EAAAX,EAAA,KAAA,CAACH,EAAAA,SAAD,CAAA,SAAA,CACGS,EAAQ,EAAI;EAAO,KACpB,iBAAA,EAAAN,EAAA,IAAA,CAACI,EAAD,CAAkB,OAAQ,CAAA,CAClB,CAAA,EAHKE,CAGL,CACX,CACE,CAAA,CAET"}
1
+ {"version":3,"file":"AnsiText.cjs","names":["cn","useMemo","ansiSpans","Fragment","require_cn","require_ansiSpans","react_jsx_runtime","react","spanClassName","span","AnsiSpans","spans","index","AnsiLine","props","line","AnsiText","lines","text"],"sources":["../../../src/components/AnsiText.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, useMemo } from 'react';\n\nimport { type AnsiSpan, ansiSpans } from '../lib/ansiSpans';\nimport { cn } from '../lib/cn';\n\n/**\n * Terminal output with the colours it was written in.\n *\n * Both readers of terminal text render it the same way, so the mapping from a\n * span's attributes to classes lives here rather than in each of them: a\n * captured workflow screen is a line at a time, and a runner log is a block.\n * Parsing is synchronous and cheap; text with no escapes in it takes a path\n * that allocates nothing.\n *\n * DESIGN PATTERNS:\n * - Named colours arrive as theme classes from `ansiSpans`; only 256-colour\n * and truecolour, which no token stands for, come through as a style.\n * - One element per line, so wrapping and selection behave as they do in a pre.\n *\n * AVOID:\n * - Carrying attributes across lines. A captured screen and a bounded log tail\n * both start mid-stream.\n */\n\nfunction spanClassName(span: AnsiSpan): string {\n return cn(\n span.className,\n span.bold === true && 'font-bold',\n span.faint === true && 'opacity-60',\n span.italic === true && 'italic',\n span.underline === true && 'underline',\n span.inverse === true && 'bg-po-text text-po-deep',\n );\n}\n\nfunction AnsiSpans({ spans }: { spans: readonly AnsiSpan[] }) {\n return (\n <>\n {spans.map((span, index) => (\n <span\n key={index}\n className={spanClassName(span)}\n style={span.color === undefined ? undefined : { color: span.color }}\n >\n {span.text}\n </span>\n ))}\n </>\n );\n}\n\nexport interface AnsiLineProps extends Omit<ComponentProps<'span'>, 'children'> {\n /** One line of terminal output, escapes and all. */\n line: string;\n}\n\n/** One line, for a caller that already lays out a screen row by row. */\nexport function AnsiLine({ line, className, ...props }: AnsiLineProps) {\n const spans = useMemo(() => ansiSpans(line), [line]);\n return (\n <span data-slot=\"ansi-line\" className={className} {...props}>\n <AnsiSpans spans={spans} />\n </span>\n );\n}\n\nexport interface AnsiTextProps extends Omit<ComponentProps<'pre'>, 'children'> {\n /** Terminal output, newline separated, escapes and all. */\n text: string;\n}\n\n/** A block of terminal output: a log tail, or anything else that arrives whole. */\nexport function AnsiText({ text, ...props }: AnsiTextProps) {\n const lines = useMemo(() => text.split('\\n').map((line) => ansiSpans(line)), [text]);\n return (\n <pre data-slot=\"ansi-text\" {...props}>\n {lines.map((spans, index) => (\n <Fragment key={index}>\n {index > 0 ? '\\n' : null}\n <AnsiSpans spans={spans} />\n </Fragment>\n ))}\n </pre>\n );\n}\n"],"mappings":"yHAwBA,SAASQ,EAAc,EAAwB,CAC7C,OAAOR,EAAAA,GACLS,EAAK,UACLA,EAAK,OAAS,IAAQ,YACtBA,EAAK,QAAU,IAAQ,aACvBA,EAAK,SAAW,IAAQ,SACxBA,EAAK,YAAc,IAAQ,YAC3BA,EAAK,UAAY,IAAQ,yBAC3B,CACF,CAEA,SAASC,EAAU,CAAE,SAAyC,CAC5D,MACE,iBAAA,EAAAJ,EAAA,IAAA,CAAAA,EAAA,SAAA,CAAA,SACGK,EAAM,KAAK,EAAM,IAChB,iBAAA,EAAAL,EAAA,IAAA,CAAC,OAAD,CAEE,UAAWE,EAAcC,CAAI,EAC7B,MAAOA,EAAK,QAAU,IAAA,GAAY,IAAA,GAAY,CAAE,MAAOA,EAAK,KAAM,EAEjE,SAAAA,EAAK,IACF,EALCG,CAKD,CACP,CACD,CAAA,CAEN,CAQA,SAAgBC,EAAS,CAAE,OAAM,YAAW,GAAGC,GAAwB,CACrE,IAAMH,GAAA,EAAQV,EAAAA,QAAAA,KAAcC,EAAAA,UAAUa,CAAI,EAAG,CAACA,CAAI,CAAC,EACnD,MACE,iBAAA,EAAAT,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,YAAuB,YAAW,GAAIQ,EACpD,SAAA,iBAAA,EAAAR,EAAA,IAAA,CAACI,EAAD,CAAkB,OAAQ,CAAA,CACtB,CAAA,CAEV,CAQA,SAAgBM,EAAS,CAAE,OAAM,GAAGF,GAAwB,CAC1D,IAAMG,GAAA,EAAQhB,EAAAA,QAAAA,KAAciB,EAAK,MAAM;CAAI,CAAC,CAAC,IAAK,GAAShB,EAAAA,UAAUa,CAAI,CAAC,EAAG,CAACG,CAAI,CAAC,EACnF,MACE,iBAAA,EAAAZ,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,YAAY,GAAIQ,EAC5B,SAAAG,EAAM,KAAK,EAAO,IACjB,iBAAA,EAAAX,EAAA,KAAA,CAACH,EAAAA,SAAD,CAAA,SAAA,CACGS,EAAQ,EAAI;EAAO,KACpB,iBAAA,EAAAN,EAAA,IAAA,CAACI,EAAD,CAAkB,OAAQ,CAAA,CAClB,CAAA,EAHKE,CAGL,CACX,CACE,CAAA,CAET"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime");function r({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Root,{"data-slot":`avatar`,className:e.cn(`relative flex h-6 w-6 shrink-0 overflow-hidden rounded-full bg-doom-deep`,r),...i})}function i({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Image,{"data-slot":`avatar-image`,className:e.cn(`h-full w-full object-cover`,r),...i})}function a({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Fallback,{"data-slot":`avatar-fallback`,className:e.cn(`flex h-full w-full items-center justify-center text-xs font-semibold text-doom-dim`,r),...i})}exports.Avatar=r,exports.AvatarFallback=a,exports.AvatarImage=i;
1
+ const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime");function r({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Root,{"data-slot":`avatar`,className:e.cn(`relative flex h-6 w-6 shrink-0 overflow-hidden rounded-full bg-po-deep`,r),...i})}function i({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Image,{"data-slot":`avatar-image`,className:e.cn(`h-full w-full object-cover`,r),...i})}function a({className:r,...i}){return/* @__PURE__ */ (0,n.jsx)(t.Avatar.Fallback,{"data-slot":`avatar-fallback`,className:e.cn(`flex h-full w-full items-center justify-center text-xs font-semibold text-po-dim`,r),...i})}exports.Avatar=r,exports.AvatarFallback=a,exports.AvatarImage=i;
2
2
  //# sourceMappingURL=Avatar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.cjs","names":["AvatarPrimitive","cn","require_cn","radix_ui","react_jsx_runtime","Avatar","props","className","AvatarImage","AvatarFallback"],"sources":["../../../src/components/Avatar.tsx"],"sourcesContent":["import { Avatar as AvatarPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** A face or an initial; Radix only shows the fallback once the image has actually failed. */\nexport function Avatar({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn('relative flex h-6 w-6 shrink-0 overflow-hidden rounded-full bg-doom-deep', className)}\n {...props}\n />\n );\n}\n\nexport function AvatarImage({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('h-full w-full object-cover', className)}\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn('flex h-full w-full items-center justify-center text-xs font-semibold text-doom-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"0FAMA,SAAgBK,EAAO,CAAE,YAAW,GAAGC,GAAsD,CAC3F,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,KAAjB,CACE,YAAU,SACV,UAAWC,EAAAA,GAAG,2EAA4EM,CAAS,EACnG,GAAID,CACL,CAAA,CAEL,CAEA,SAAgBE,EAAY,CAAE,YAAW,GAAGF,GAAuD,CACjG,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,MAAjB,CACE,YAAU,eACV,UAAWC,EAAAA,GAAG,6BAA8BM,CAAS,EACrD,GAAID,CACL,CAAA,CAEL,CAEA,SAAgBG,EAAe,CAAE,YAAW,GAAGH,GAA0D,CACvG,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,SAAjB,CACE,YAAU,kBACV,UAAWC,EAAAA,GAAG,qFAAsFM,CAAS,EAC7G,GAAID,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Avatar.cjs","names":["AvatarPrimitive","cn","require_cn","radix_ui","react_jsx_runtime","Avatar","props","className","AvatarImage","AvatarFallback"],"sources":["../../../src/components/Avatar.tsx"],"sourcesContent":["import { Avatar as AvatarPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** A face or an initial; Radix only shows the fallback once the image has actually failed. */\nexport function Avatar({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn('relative flex h-6 w-6 shrink-0 overflow-hidden rounded-full bg-po-deep', className)}\n {...props}\n />\n );\n}\n\nexport function AvatarImage({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('h-full w-full object-cover', className)}\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({ className, ...props }: ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn('flex h-full w-full items-center justify-center text-xs font-semibold text-po-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"0FAMA,SAAgBK,EAAO,CAAE,YAAW,GAAGC,GAAsD,CAC3F,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,KAAjB,CACE,YAAU,SACV,UAAWC,EAAAA,GAAG,yEAA0EM,CAAS,EACjG,GAAID,CACL,CAAA,CAEL,CAEA,SAAgBE,EAAY,CAAE,YAAW,GAAGF,GAAuD,CACjG,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,MAAjB,CACE,YAAU,eACV,UAAWC,EAAAA,GAAG,6BAA8BM,CAAS,EACrD,GAAID,CACL,CAAA,CAEL,CAEA,SAAgBG,EAAe,CAAE,YAAW,GAAGH,GAA0D,CACvG,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,OAAgB,SAAjB,CACE,YAAU,kBACV,UAAWC,EAAAA,GAAG,mFAAoFM,CAAS,EAC3G,GAAID,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime");const r=(0,require("class-variance-authority").cva)(`inline-flex items-center gap-1.5 whitespace-nowrap rounded border`,{variants:{tone:{neutral:`border-doom-border text-doom-dim`,blue:`border-doom-blue/40 text-doom-blue`,green:`border-doom-green/40 text-doom-green`,yellow:`border-doom-yellow/40 text-doom-yellow`,red:`border-doom-red/40 text-doom-red`,magenta:`border-doom-magenta/40 text-doom-magenta`,violet:`border-doom-violet/40 text-doom-violet`,cyan:`border-doom-cyan/40 text-doom-cyan`,orange:`border-doom-orange/40 text-doom-orange`,teal:`border-doom-teal/40 text-doom-teal`},size:{xs:`px-1.5 py-px text-sm font-semibold`,sm:`px-2 py-0.5 text-sm`,md:`px-2.5 py-1 text-sm`,lg:`px-3 py-1.5 text-base`}},defaultVariants:{tone:`neutral`,size:`sm`}});function i({className:i,tone:a,size:o,asChild:s=!1,...c}){let l=s?t.Slot.Root:`span`;return/* @__PURE__ */ (0,n.jsx)(l,{"data-slot":`badge`,className:e.cn(r({tone:a,size:o}),i),...c})}exports.Badge=i,exports.badgeVariants=r;
1
+ const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime");const r=(0,require("class-variance-authority").cva)(`inline-flex items-center gap-1.5 whitespace-nowrap rounded border`,{variants:{tone:{neutral:`border-po-border text-po-dim`,blue:`border-po-blue/40 text-po-blue`,green:`border-po-green/40 text-po-green`,yellow:`border-po-yellow/40 text-po-yellow`,red:`border-po-red/40 text-po-red`,magenta:`border-po-magenta/40 text-po-magenta`,violet:`border-po-violet/40 text-po-violet`,cyan:`border-po-cyan/40 text-po-cyan`,orange:`border-po-orange/40 text-po-orange`,teal:`border-po-teal/40 text-po-teal`},size:{xs:`px-1.5 py-px text-sm font-semibold`,sm:`px-2 py-0.5 text-sm`,md:`px-2.5 py-1 text-sm`,lg:`px-3 py-1.5 text-base`}},defaultVariants:{tone:`neutral`,size:`sm`}});function i({className:i,tone:a,size:o,asChild:s=!1,...c}){let l=s?t.Slot.Root:`span`;return/* @__PURE__ */ (0,n.jsx)(l,{"data-slot":`badge`,className:e.cn(r({tone:a,size:o}),i),...c})}exports.Badge=i,exports.badgeVariants=r;
2
2
  //# sourceMappingURL=Badge.cjs.map