@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":"OptionList.mjs","names":["optionListVariants","cva","optionRowVariants","optionMarkerVariants","OptionRow","props","active","cn","className","marker","children","OptionLabel","density","OptionList","container","useRef","useEffect","cursor","testIdPrefix","options","index","optionMarker","option","onCursorChange","onSelect"],"sources":["../../../../../../src/components/OptionList.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { type ComponentProps, type ReactNode, useEffect, useRef } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { optionMarker } from '../lib/optionList';\n\nexport const optionListVariants = cva('flex min-h-0 flex-1 flex-col overflow-y-auto', {\n variants: {\n /** The compact rows of a bar popover, or the roomier rows of a modal. */\n density: { compact: 'gap-0.5 p-1.5', comfortable: 'gap-1.5' },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\nexport const optionRowVariants = cva('flex shrink-0 cursor-pointer items-center text-left outline-none', {\n variants: {\n density: {\n compact: 'gap-2.5 rounded-md px-2 py-[7px]',\n comfortable: 'min-h-[42px] gap-3 rounded-md border px-[11px] py-2 text-sm text-doom-text transition-colors',\n },\n active: { true: '', false: '' },\n },\n compoundVariants: [\n { density: 'compact', active: true, class: 'bg-doom-tint-green' },\n {\n density: 'comfortable',\n active: true,\n class: 'border-doom-edge-green bg-doom-tint-green',\n },\n {\n density: 'comfortable',\n active: false,\n class: 'border-doom-border-soft',\n },\n ],\n defaultVariants: { density: 'comfortable', active: false },\n});\n\nexport const optionMarkerVariants = cva('flex shrink-0 items-center justify-center rounded-full font-semibold', {\n variants: {\n density: {\n compact: 'h-[15px] w-[15px] border border-doom-border text-2xs text-doom-faint',\n comfortable: 'h-[18px] w-[18px] bg-doom-deep text-xs text-doom-dim',\n },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\nexport interface OptionRowProps extends ComponentProps<'button'>, VariantProps<typeof optionRowVariants> {\n /** The digit or bullet in the row's leading circle; omit it for a row with no shortcut. */\n marker?: ReactNode;\n}\n\n/**\n * One row of an option list, exported on its own so a surface with richer\n * rows than a plain string still wears the list's shape instead of restating\n * it. Children render straight into the row, so a row is free to hold a name\n * and a description side by side; OptionLabel is the single-string case.\n * `role=\"option\"` means a row belongs inside a `listbox`.\n */\nexport function OptionRow({ className, density, active, marker, children, ...props }: OptionRowProps) {\n return (\n <button\n type=\"button\"\n role=\"option\"\n data-slot=\"option-row\"\n aria-selected={active ?? false}\n data-cursor={active ?? false}\n className={cn(optionRowVariants({ density, active }), className)}\n {...props}\n >\n {marker === undefined ? null : <span className={optionMarkerVariants({ density })}>{marker}</span>}\n {children}\n </button>\n );\n}\n\n/** A row's single-string label: it takes the remaining width and clips or wraps by density. */\nexport function OptionLabel({\n className,\n density,\n ...props\n}: ComponentProps<'span'> & VariantProps<typeof optionListVariants>) {\n return (\n <span\n data-slot=\"option-label\"\n className={cn(\n 'min-w-0 flex-1',\n density === 'compact' ? 'truncate text-sm text-doom-text' : 'break-words',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface OptionListProps\n extends Omit<ComponentProps<'div'>, 'onSelect'>, VariantProps<typeof optionListVariants> {\n options: readonly string[];\n /** The highlighted row, owned by the surface so its own focused element can drive it. */\n cursor: number;\n onCursorChange: (cursor: number) => void;\n onSelect: (option: string) => void;\n /** Rows are `${testIdPrefix}-${index}`; the list itself is the plural, so a prefix query for a row never catches it. */\n testIdPrefix: string;\n}\n\n/**\n * The answers a select surface offers, wherever it is framed.\n *\n * The agent decides how many options there are, and a real one runs past\n * twenty, so the list cannot rely on the digit shortcuts alone. The cursor is\n * controlled rather than owned here because the surface around it is what the\n * overlay library focuses: keys arrive there, and taking focus away from it to\n * a list would fight the library for it and break the escape and outside-click\n * behaviour that focus carries. Pair it with handleOptionListKey.\n */\nexport function OptionList({\n className,\n options,\n cursor,\n onCursorChange,\n onSelect,\n testIdPrefix,\n density = 'comfortable',\n ...props\n}: OptionListProps) {\n const container = useRef<HTMLDivElement>(null);\n\n // Keep the highlighted row visible when the keyboard moves it past the edge.\n useEffect(() => {\n container.current?.children[cursor]?.scrollIntoView({ block: 'nearest' });\n }, [cursor]);\n\n return (\n <div\n ref={container}\n role=\"listbox\"\n aria-label=\"options\"\n data-slot=\"option-list\"\n data-testid={`${testIdPrefix}s`}\n className={cn(optionListVariants({ density }), className)}\n {...props}\n >\n {options.map((option, index) => (\n <OptionRow\n key={option}\n density={density}\n active={index === cursor}\n marker={optionMarker(index)}\n data-testid={`${testIdPrefix}-${String(index)}`}\n title={option}\n onMouseEnter={() => onCursorChange(index)}\n onClick={() => onSelect(option)}\n >\n <OptionLabel density={density}>{option}</OptionLabel>\n </OptionRow>\n ))}\n </div>\n );\n}\n"],"mappings":"uOAMA,MAAaA,EAAqBC,EAAI,+CAAgD,CACpF,SAAU,CAER,QAAS,CAAE,QAAS,gBAAiB,YAAa,SAAU,CAC9D,EACA,gBAAiB,CAAE,QAAS,aAAc,CAC5C,CAAC,EAEYC,EAAoBD,EAAI,mEAAoE,CACvG,SAAU,CACR,QAAS,CACP,QAAS,mCACT,YAAa,8FACf,EACA,OAAQ,CAAE,KAAM,GAAI,MAAO,EAAG,CAChC,EACA,iBAAkB,CAChB,CAAE,QAAS,UAAW,OAAQ,GAAM,MAAO,oBAAqB,EAChE,CACE,QAAS,cACT,OAAQ,GACR,MAAO,2CACT,EACA,CACE,QAAS,cACT,OAAQ,GACR,MAAO,yBACT,CACF,EACA,gBAAiB,CAAE,QAAS,cAAe,OAAQ,EAAM,CAC3D,CAAC,EAEYE,EAAuBF,EAAI,uEAAwE,CAC9G,SAAU,CACR,QAAS,CACP,QAAS,uEACT,YAAa,sDACf,CACF,EACA,gBAAiB,CAAE,QAAS,aAAc,CAC5C,CAAC,EAcD,SAAgBG,EAAU,CAAE,YAAW,UAAS,SAAQ,SAAQ,WAAU,GAAGC,GAAyB,CACpG,MACE,kBAAC,SAAD,CACE,KAAK,SACL,KAAK,SACL,YAAU,aACV,gBAAeC,GAAU,GACzB,cAAaA,GAAU,GACvB,UAAWC,EAAGL,EAAkB,CAAE,UAAS,QAAO,CAAC,EAAGM,CAAS,EAC/D,GAAIH,EAPN,SAAA,CASGI,IAAW,IAAA,GAAY,KAAO,kBAAC,OAAD,CAAM,UAAWN,EAAqB,CAAE,SAAQ,CAAC,EAAI,SAAAM,CAAa,CAAA,EAChGC,CACK,GAEZ,CAGA,SAAgBC,EAAY,CAC1B,YACA,UACA,GAAGN,GACgE,CACnE,MACE,kBAAC,OAAD,CACE,YAAU,eACV,UAAWE,EACT,iBACAK,IAAY,UAAY,kCAAoC,cAC5DJ,CACF,EACA,GAAIH,CACL,CAAA,CAEL,CAuBA,SAAgBQ,EAAW,CACzB,YACA,UACA,SACA,iBACA,WACA,eACA,UAAU,cACV,GAAGR,GACe,CAClB,IAAMS,EAAYC,EAAuB,IAAI,EAO7C,OAJAC,MAAgB,CACdF,EAAU,SAAS,SAASG,EAAO,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,CAC1E,EAAG,CAACA,CAAM,CAAC,EAGT,kBAAC,MAAD,CACE,IAAKH,EACL,KAAK,UACL,aAAW,UACX,YAAU,cACV,cAAa,GAAGI,EAAa,GAC7B,UAAWX,EAAGP,EAAmB,CAAE,SAAQ,CAAC,EAAGQ,CAAS,EACxD,GAAIH,EAEH,SAAAc,EAAQ,KAAK,EAAQ,IACpB,kBAACf,EAAD,CAEW,UACT,OAAQgB,IAAUH,EAClB,OAAQI,EAAaD,CAAK,EAC1B,cAAa,GAAGF,EAAa,GAAG,OAAOE,CAAK,IAC5C,MAAOE,EACP,iBAAoBC,EAAeH,CAAK,EACxC,YAAeI,EAASF,CAAM,EAE9B,SAAA,kBAACX,EAAD,CAAsB,UAAU,SAAAW,CAAoB,CAAA,CAC3C,EAVJA,CAUI,CACZ,CACE,CAAA,CAET"}
1
+ {"version":3,"file":"OptionList.mjs","names":["optionListVariants","cva","optionRowVariants","optionMarkerVariants","OptionRow","props","active","cn","className","marker","children","OptionLabel","density","OptionList","container","useRef","useEffect","cursor","testIdPrefix","options","index","optionMarker","option","onCursorChange","onSelect"],"sources":["../../../../../../src/components/OptionList.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { type ComponentProps, type ReactNode, useEffect, useRef } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { optionMarker } from '../lib/optionList';\n\nexport const optionListVariants = cva('flex min-h-0 flex-1 flex-col overflow-y-auto', {\n variants: {\n /** The compact rows of a bar popover, or the roomier rows of a modal. */\n density: { compact: 'gap-0.5 p-1.5', comfortable: 'gap-1.5' },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\nexport const optionRowVariants = cva('flex shrink-0 cursor-pointer items-center text-left outline-none', {\n variants: {\n density: {\n compact: 'gap-2.5 rounded-md px-2 py-[7px]',\n comfortable: 'min-h-[42px] gap-3 rounded-md border px-[11px] py-2 text-sm text-po-text transition-colors',\n },\n active: { true: '', false: '' },\n },\n compoundVariants: [\n { density: 'compact', active: true, class: 'bg-po-tint-green' },\n {\n density: 'comfortable',\n active: true,\n class: 'border-po-edge-green bg-po-tint-green',\n },\n {\n density: 'comfortable',\n active: false,\n class: 'border-po-border-soft',\n },\n ],\n defaultVariants: { density: 'comfortable', active: false },\n});\n\nexport const optionMarkerVariants = cva('flex shrink-0 items-center justify-center rounded-full font-semibold', {\n variants: {\n density: {\n compact: 'h-[15px] w-[15px] border border-po-border text-2xs text-po-faint',\n comfortable: 'h-[18px] w-[18px] bg-po-deep text-xs text-po-dim',\n },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\nexport interface OptionRowProps extends ComponentProps<'button'>, VariantProps<typeof optionRowVariants> {\n /** The digit or bullet in the row's leading circle; omit it for a row with no shortcut. */\n marker?: ReactNode;\n}\n\n/**\n * One row of an option list, exported on its own so a surface with richer\n * rows than a plain string still wears the list's shape instead of restating\n * it. Children render straight into the row, so a row is free to hold a name\n * and a description side by side; OptionLabel is the single-string case.\n * `role=\"option\"` means a row belongs inside a `listbox`.\n */\nexport function OptionRow({ className, density, active, marker, children, ...props }: OptionRowProps) {\n return (\n <button\n type=\"button\"\n role=\"option\"\n data-slot=\"option-row\"\n aria-selected={active ?? false}\n data-cursor={active ?? false}\n className={cn(optionRowVariants({ density, active }), className)}\n {...props}\n >\n {marker === undefined ? null : <span className={optionMarkerVariants({ density })}>{marker}</span>}\n {children}\n </button>\n );\n}\n\n/** A row's single-string label: it takes the remaining width and clips or wraps by density. */\nexport function OptionLabel({\n className,\n density,\n ...props\n}: ComponentProps<'span'> & VariantProps<typeof optionListVariants>) {\n return (\n <span\n data-slot=\"option-label\"\n className={cn(\n 'min-w-0 flex-1',\n density === 'compact' ? 'truncate text-sm text-po-text' : 'break-words',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface OptionListProps\n extends Omit<ComponentProps<'div'>, 'onSelect'>, VariantProps<typeof optionListVariants> {\n options: readonly string[];\n /** The highlighted row, owned by the surface so its own focused element can drive it. */\n cursor: number;\n onCursorChange: (cursor: number) => void;\n onSelect: (option: string) => void;\n /** Rows are `${testIdPrefix}-${index}`; the list itself is the plural, so a prefix query for a row never catches it. */\n testIdPrefix: string;\n}\n\n/**\n * The answers a select surface offers, wherever it is framed.\n *\n * The agent decides how many options there are, and a real one runs past\n * twenty, so the list cannot rely on the digit shortcuts alone. The cursor is\n * controlled rather than owned here because the surface around it is what the\n * overlay library focuses: keys arrive there, and taking focus away from it to\n * a list would fight the library for it and break the escape and outside-click\n * behaviour that focus carries. Pair it with handleOptionListKey.\n */\nexport function OptionList({\n className,\n options,\n cursor,\n onCursorChange,\n onSelect,\n testIdPrefix,\n density = 'comfortable',\n ...props\n}: OptionListProps) {\n const container = useRef<HTMLDivElement>(null);\n\n // Keep the highlighted row visible when the keyboard moves it past the edge.\n useEffect(() => {\n container.current?.children[cursor]?.scrollIntoView({ block: 'nearest' });\n }, [cursor]);\n\n return (\n <div\n ref={container}\n role=\"listbox\"\n aria-label=\"options\"\n data-slot=\"option-list\"\n data-testid={`${testIdPrefix}s`}\n className={cn(optionListVariants({ density }), className)}\n {...props}\n >\n {options.map((option, index) => (\n <OptionRow\n key={option}\n density={density}\n active={index === cursor}\n marker={optionMarker(index)}\n data-testid={`${testIdPrefix}-${String(index)}`}\n title={option}\n onMouseEnter={() => onCursorChange(index)}\n onClick={() => onSelect(option)}\n >\n <OptionLabel density={density}>{option}</OptionLabel>\n </OptionRow>\n ))}\n </div>\n );\n}\n"],"mappings":"uOAMA,MAAaA,EAAqBC,EAAI,+CAAgD,CACpF,SAAU,CAER,QAAS,CAAE,QAAS,gBAAiB,YAAa,SAAU,CAC9D,EACA,gBAAiB,CAAE,QAAS,aAAc,CAC5C,CAAC,EAEYC,EAAoBD,EAAI,mEAAoE,CACvG,SAAU,CACR,QAAS,CACP,QAAS,mCACT,YAAa,4FACf,EACA,OAAQ,CAAE,KAAM,GAAI,MAAO,EAAG,CAChC,EACA,iBAAkB,CAChB,CAAE,QAAS,UAAW,OAAQ,GAAM,MAAO,kBAAmB,EAC9D,CACE,QAAS,cACT,OAAQ,GACR,MAAO,uCACT,EACA,CACE,QAAS,cACT,OAAQ,GACR,MAAO,uBACT,CACF,EACA,gBAAiB,CAAE,QAAS,cAAe,OAAQ,EAAM,CAC3D,CAAC,EAEYE,EAAuBF,EAAI,uEAAwE,CAC9G,SAAU,CACR,QAAS,CACP,QAAS,mEACT,YAAa,kDACf,CACF,EACA,gBAAiB,CAAE,QAAS,aAAc,CAC5C,CAAC,EAcD,SAAgBG,EAAU,CAAE,YAAW,UAAS,SAAQ,SAAQ,WAAU,GAAGC,GAAyB,CACpG,MACE,kBAAC,SAAD,CACE,KAAK,SACL,KAAK,SACL,YAAU,aACV,gBAAeC,GAAU,GACzB,cAAaA,GAAU,GACvB,UAAWC,EAAGL,EAAkB,CAAE,UAAS,QAAO,CAAC,EAAGM,CAAS,EAC/D,GAAIH,EAPN,SAAA,CASGI,IAAW,IAAA,GAAY,KAAO,kBAAC,OAAD,CAAM,UAAWN,EAAqB,CAAE,SAAQ,CAAC,EAAI,SAAAM,CAAa,CAAA,EAChGC,CACK,GAEZ,CAGA,SAAgBC,EAAY,CAC1B,YACA,UACA,GAAGN,GACgE,CACnE,MACE,kBAAC,OAAD,CACE,YAAU,eACV,UAAWE,EACT,iBACAK,IAAY,UAAY,gCAAkC,cAC1DJ,CACF,EACA,GAAIH,CACL,CAAA,CAEL,CAuBA,SAAgBQ,EAAW,CACzB,YACA,UACA,SACA,iBACA,WACA,eACA,UAAU,cACV,GAAGR,GACe,CAClB,IAAMS,EAAYC,EAAuB,IAAI,EAO7C,OAJAC,MAAgB,CACdF,EAAU,SAAS,SAASG,EAAO,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,CAC1E,EAAG,CAACA,CAAM,CAAC,EAGT,kBAAC,MAAD,CACE,IAAKH,EACL,KAAK,UACL,aAAW,UACX,YAAU,cACV,cAAa,GAAGI,EAAa,GAC7B,UAAWX,EAAGP,EAAmB,CAAE,SAAQ,CAAC,EAAGQ,CAAS,EACxD,GAAIH,EAEH,SAAAc,EAAQ,KAAK,EAAQ,IACpB,kBAACf,EAAD,CAEW,UACT,OAAQgB,IAAUH,EAClB,OAAQI,EAAaD,CAAK,EAC1B,cAAa,GAAGF,EAAa,GAAG,OAAOE,CAAK,IAC5C,MAAOE,EACP,iBAAoBC,EAAeH,CAAK,EACxC,YAAeI,EAASF,CAAM,EAE9B,SAAA,kBAACX,EAAD,CAAsB,UAAU,SAAAW,CAAoB,CAAA,CAC3C,EAVJA,CAUI,CACZ,CACE,CAAA,CAET"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,asChild:i=!1,...a}){let o=i?t.Root:`div`;return/* @__PURE__ */ n(o,{"data-slot":`panel`,className:e(`overflow-hidden rounded-md border border-doom-border bg-doom-panel`,r),...a})}function i({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`panel-header`,className:e(`flex min-h-8 items-center gap-2 px-[11px]`,t),...r})}function a({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`panel-body`,className:e(`border-t border-doom-border-soft bg-doom-deep px-3 py-2 text-sm text-doom-dim`,t),...r})}export{r as Panel,a as PanelBody,i as PanelHeader};
1
+ import{cn as e}from"../lib/cn.mjs";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,asChild:i=!1,...a}){let o=i?t.Root:`div`;return/* @__PURE__ */ n(o,{"data-slot":`panel`,className:e(`overflow-hidden rounded-md border border-po-border bg-po-panel`,r),...a})}function i({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`panel-header`,className:e(`flex min-h-8 items-center gap-2 px-[11px]`,t),...r})}function a({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`panel-body`,className:e(`border-t border-po-border-soft bg-po-deep px-3 py-2 text-sm text-po-dim`,t),...r})}export{r as Panel,a as PanelBody,i as PanelHeader};
2
2
  //# sourceMappingURL=Panel.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Panel.mjs","names":["Panel","props","Component","asChild","Slot","cn","className","PanelHeader","PanelBody"],"sources":["../../../../../../src/components/Panel.tsx"],"sourcesContent":["import { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\nexport interface PanelProps extends ComponentProps<'div'> {\n /** Render the child element instead of a <div>, so a list row can be a panel. */\n asChild?: boolean;\n}\n\n/** The bordered card surface: a tool card, a run card, a provider row. */\nexport function Panel({ className, asChild = false, ...props }: PanelProps) {\n const Component = asChild ? Slot.Root : 'div';\n return (\n <Component\n data-slot=\"panel\"\n className={cn('overflow-hidden rounded-md border border-doom-border bg-doom-panel', className)}\n {...props}\n />\n );\n}\n\n/** A panel's title row. */\nexport function PanelHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"panel-header\" className={cn('flex min-h-8 items-center gap-2 px-[11px]', className)} {...props} />\n );\n}\n\n/** A panel's recessed body: the deep well the header sits above. */\nexport function PanelBody({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"panel-body\"\n className={cn('border-t border-doom-border-soft bg-doom-deep px-3 py-2 text-sm text-doom-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2GAWA,SAAgBA,EAAM,CAAE,YAAW,UAAU,GAAO,GAAGC,GAAqB,CAC1E,IAAMC,EAAYC,EAAUC,EAAK,KAAO,MACxC,MACE,kBAACF,EAAD,CACE,YAAU,QACV,UAAWG,EAAG,qEAAsEC,CAAS,EAC7F,GAAIL,CACL,CAAA,CAEL,CAGA,SAAgBM,EAAY,CAAE,YAAW,GAAGN,GAAgC,CAC1E,MACE,kBAAC,MAAD,CAAK,YAAU,eAAe,UAAWI,EAAG,4CAA6CC,CAAS,EAAG,GAAIL,CAAQ,CAAA,CAErH,CAGA,SAAgBO,EAAU,CAAE,YAAW,GAAGP,GAAgC,CACxE,MACE,kBAAC,MAAD,CACE,YAAU,aACV,UAAWI,EAAG,gFAAiFC,CAAS,EACxG,GAAIL,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Panel.mjs","names":["Panel","props","Component","asChild","Slot","cn","className","PanelHeader","PanelBody"],"sources":["../../../../../../src/components/Panel.tsx"],"sourcesContent":["import { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\nexport interface PanelProps extends ComponentProps<'div'> {\n /** Render the child element instead of a <div>, so a list row can be a panel. */\n asChild?: boolean;\n}\n\n/** The bordered card surface: a tool card, a run card, a provider row. */\nexport function Panel({ className, asChild = false, ...props }: PanelProps) {\n const Component = asChild ? Slot.Root : 'div';\n return (\n <Component\n data-slot=\"panel\"\n className={cn('overflow-hidden rounded-md border border-po-border bg-po-panel', className)}\n {...props}\n />\n );\n}\n\n/** A panel's title row. */\nexport function PanelHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"panel-header\" className={cn('flex min-h-8 items-center gap-2 px-[11px]', className)} {...props} />\n );\n}\n\n/** A panel's recessed body: the deep well the header sits above. */\nexport function PanelBody({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"panel-body\"\n className={cn('border-t border-po-border-soft bg-po-deep px-3 py-2 text-sm text-po-dim', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2GAWA,SAAgBA,EAAM,CAAE,YAAW,UAAU,GAAO,GAAGC,GAAqB,CAC1E,IAAMC,EAAYC,EAAUC,EAAK,KAAO,MACxC,MACE,kBAACF,EAAD,CACE,YAAU,QACV,UAAWG,EAAG,iEAAkEC,CAAS,EACzF,GAAIL,CACL,CAAA,CAEL,CAGA,SAAgBM,EAAY,CAAE,YAAW,GAAGN,GAAgC,CAC1E,MACE,kBAAC,MAAD,CAAK,YAAU,eAAe,UAAWI,EAAG,4CAA6CC,CAAS,EAAG,GAAIL,CAAQ,CAAA,CAErH,CAGA,SAAgBO,EAAU,CAAE,YAAW,GAAGP,GAAgC,CACxE,MACE,kBAAC,MAAD,CACE,YAAU,aACV,UAAWI,EAAG,0EAA2EC,CAAS,EAClG,GAAIL,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Button as t}from"./Button.mjs";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{useEffect as i,useImperativeHandle as a,useRef as o,useState as s}from"react";const c={page:1,pageCount:0,sourceWidth:0,sourceHeight:0};function l(e,t){return!Number.isFinite(e)||t<=0?1:Math.min(t,Math.max(1,Math.trunc(e)))}function u(e,t,n){if(t.width<=0||t.height<=0)return null;let r=Math.max(t.left,Math.min(t.right,n.left)),i=Math.max(t.left,Math.min(t.right,n.right)),a=Math.max(t.top,Math.min(t.bottom,n.top)),o=Math.max(t.top,Math.min(t.bottom,n.bottom));return i<=r||o<=a?null:{page:e,rect:{x:(r-t.left)/t.width,y:(a-t.top)/t.height,width:(i-r)/t.width,height:(o-a)/t.height}}}function d(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}function f({src:f,path:p,className:m,controllerRef:h,"data-testid":g}){let _=o(null),v=o(null),y=o(null),[b,x]=s(1),[S,C]=s(c),[w,T]=s();return i(()=>{let e=!1,t;return import(`pdfjs-dist/webpack.mjs`).then(({getDocument:n})=>{if(!e)return t=n({url:f}),t.promise.then(t=>{e||(v.current=t,T(void 0),x(1),C({...c,pageCount:t.numPages}))})}).catch(t=>{e||T(t instanceof Error?t.message:String(t))}),()=>{e=!0,t?.destroy(),y.current?.cancel(),y.current=null,v.current=null}},[f]),i(()=>{let e=v.current,t=_.current;if(e===null||t===null)return;let n=!1;return e.getPage(b).then(r=>{if(n)return;let i=r.getViewport({scale:1}),a=r.getViewport({scale:1.5});t.width=Math.ceil(a.width),t.height=Math.ceil(a.height),C({page:b,pageCount:e.numPages,sourceWidth:i.width,sourceHeight:i.height});let o=t.getContext(`2d`);if(o===null)return;let s=r.render({canvas:t,canvasContext:o,viewport:a});return y.current=s,s.promise}).catch(e=>{!n&&e.name!==`RenderingCancelledException`&&T(e instanceof Error?e.message:String(e))}),()=>{n=!0,y.current?.cancel(),y.current=null}},[b,S.pageCount]),a(h,()=>({getState:()=>S,setPage:e=>x(l(e,S.pageCount)),resolveViewportRegion:e=>{let t=_.current;return t===null||S.pageCount===0?null:u(S.page,t.getBoundingClientRect(),e)},capturePage:async(e=`image/png`,t)=>{let n=_.current;return n===null?null:await d(n,e,t)}}),[S]),/* @__PURE__ */ r(`section`,{"data-testid":g,"data-kind":`pdf`,className:e(`flex min-h-0 flex-col gap-2`,m),children:[/* @__PURE__ */ r(`div`,{className:`flex items-center justify-between gap-2 text-sm text-doom-dim`,children:[/* @__PURE__ */ n(`span`,{children:p}),/* @__PURE__ */ r(`div`,{className:`flex items-center gap-2`,children:[/* @__PURE__ */ n(t,{size:`xs`,variant:`ghost`,disabled:b<=1,onClick:()=>x(e=>Math.max(1,e-1)),children:`previous`}),/* @__PURE__ */ n(`span`,{"data-testid":g===void 0?void 0:`${g}-page`,children:S.pageCount===0?`loading`:`${b} / ${S.pageCount}`}),/* @__PURE__ */ n(t,{size:`xs`,variant:`ghost`,disabled:S.pageCount===0||b>=S.pageCount,onClick:()=>x(e=>l(e+1,S.pageCount)),children:`next`})]})]}),w===void 0?null:/* @__PURE__ */ n(`output`,{className:`text-sm text-doom-red`,children:w}),/* @__PURE__ */ n(`div`,{className:`min-h-0 overflow-auto rounded border border-doom-border bg-doom-deep`,children:/* @__PURE__ */ n(`canvas`,{ref:_,"aria-label":p,className:`mx-auto block max-w-full`})})]})}export{f as PdfPreview,u as resolvePdfViewportRegion};
1
+ import{cn as e}from"../lib/cn.mjs";import{Button as t}from"./Button.mjs";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{useEffect as i,useImperativeHandle as a,useRef as o,useState as s}from"react";const c={page:1,pageCount:0,sourceWidth:0,sourceHeight:0};function l(e,t){return!Number.isFinite(e)||t<=0?1:Math.min(t,Math.max(1,Math.trunc(e)))}function u(e,t,n){if(t.width<=0||t.height<=0)return null;let r=Math.max(t.left,Math.min(t.right,n.left)),i=Math.max(t.left,Math.min(t.right,n.right)),a=Math.max(t.top,Math.min(t.bottom,n.top)),o=Math.max(t.top,Math.min(t.bottom,n.bottom));return i<=r||o<=a?null:{page:e,rect:{x:(r-t.left)/t.width,y:(a-t.top)/t.height,width:(i-r)/t.width,height:(o-a)/t.height}}}function d(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}function f({src:f,path:p,className:m,controllerRef:h,"data-testid":g}){let _=o(null),v=o(null),y=o(null),[b,x]=s(1),[S,C]=s(c),[w,T]=s();return i(()=>{let e=!1,t;return import(`pdfjs-dist/webpack.mjs`).then(({getDocument:n})=>{if(!e)return t=n({url:f}),t.promise.then(t=>{e||(v.current=t,T(void 0),x(1),C({...c,pageCount:t.numPages}))})}).catch(t=>{e||T(t instanceof Error?t.message:String(t))}),()=>{e=!0,t?.destroy(),y.current?.cancel(),y.current=null,v.current=null}},[f]),i(()=>{let e=v.current,t=_.current;if(e===null||t===null)return;let n=!1;return e.getPage(b).then(r=>{if(n)return;let i=r.getViewport({scale:1}),a=r.getViewport({scale:1.5});t.width=Math.ceil(a.width),t.height=Math.ceil(a.height),C({page:b,pageCount:e.numPages,sourceWidth:i.width,sourceHeight:i.height});let o=t.getContext(`2d`);if(o===null)return;let s=r.render({canvas:t,canvasContext:o,viewport:a});return y.current=s,s.promise}).catch(e=>{!n&&e.name!==`RenderingCancelledException`&&T(e instanceof Error?e.message:String(e))}),()=>{n=!0,y.current?.cancel(),y.current=null}},[b,S.pageCount]),a(h,()=>({getState:()=>S,setPage:e=>x(l(e,S.pageCount)),resolveViewportRegion:e=>{let t=_.current;return t===null||S.pageCount===0?null:u(S.page,t.getBoundingClientRect(),e)},capturePage:async(e=`image/png`,t)=>{let n=_.current;return n===null?null:await d(n,e,t)}}),[S]),/* @__PURE__ */ r(`section`,{"data-testid":g,"data-kind":`pdf`,className:e(`flex min-h-0 flex-col gap-2`,m),children:[/* @__PURE__ */ r(`div`,{className:`flex items-center justify-between gap-2 text-sm text-po-dim`,children:[/* @__PURE__ */ n(`span`,{children:p}),/* @__PURE__ */ r(`div`,{className:`flex items-center gap-2`,children:[/* @__PURE__ */ n(t,{size:`xs`,variant:`ghost`,disabled:b<=1,onClick:()=>x(e=>Math.max(1,e-1)),children:`previous`}),/* @__PURE__ */ n(`span`,{"data-testid":g===void 0?void 0:`${g}-page`,children:S.pageCount===0?`loading`:`${b} / ${S.pageCount}`}),/* @__PURE__ */ n(t,{size:`xs`,variant:`ghost`,disabled:S.pageCount===0||b>=S.pageCount,onClick:()=>x(e=>l(e+1,S.pageCount)),children:`next`})]})]}),w===void 0?null:/* @__PURE__ */ n(`output`,{className:`text-sm text-po-red`,children:w}),/* @__PURE__ */ n(`div`,{className:`min-h-0 overflow-auto rounded border border-po-border bg-po-deep`,children:/* @__PURE__ */ n(`canvas`,{ref:_,"aria-label":p,className:`mx-auto block max-w-full`})})]})}export{f as PdfPreview,u as resolvePdfViewportRegion};
2
2
  //# sourceMappingURL=PdfPreview.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PdfPreview.mjs","names":["EMPTY_STATE","boundedPage","page","pageCount","resolvePdfViewportRegion","bounds","left","rectangle","right","top","bottom","canvasBlob","canvas","resolve","type","quality","PdfPreview","testId","canvasRef","useRef","documentRef","renderTask","setPage","useState","pageState","setPageState","error","setError","useEffect","disposed","loading","getDocument","src","document","reason","source","pdfPage","viewport","context","task","useImperativeHandle","controllerRef","next","cn","className","path","Button","value"],"sources":["../../../../../../src/components/PdfPreview.tsx"],"sourcesContent":["import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist/webpack.mjs';\nimport { useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\ntype PdfLoadingTask = ReturnType<typeof import('pdfjs-dist/webpack.mjs').getDocument>;\n\nexport interface PdfNormalizedRectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PdfPageState {\n page: number;\n pageCount: number;\n sourceWidth: number;\n sourceHeight: number;\n}\n\nexport interface PdfPageRegion {\n page: number;\n rect: PdfNormalizedRectangle;\n}\n\nexport interface PdfPreviewController {\n getState: () => PdfPageState;\n setPage: (page: number) => void;\n resolveViewportRegion: (rectangle: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n }) => PdfPageRegion | null;\n capturePage: (type?: 'image/png' | 'image/jpeg', quality?: number) => Promise<Blob | null>;\n}\n\nexport interface PdfPreviewProps {\n src: string;\n path: string;\n className?: string;\n 'data-testid'?: string;\n controllerRef?: import('react').Ref<PdfPreviewController>;\n}\n\nconst EMPTY_STATE: PdfPageState = { page: 1, pageCount: 0, sourceWidth: 0, sourceHeight: 0 };\n\nfunction boundedPage(page: number, pageCount: number): number {\n if (!Number.isFinite(page) || pageCount <= 0) return 1;\n return Math.min(pageCount, Math.max(1, Math.trunc(page)));\n}\n\nexport function resolvePdfViewportRegion(\n page: number,\n bounds: { left: number; top: number; right: number; bottom: number; width: number; height: number },\n rectangle: { left: number; top: number; right: number; bottom: number },\n): PdfPageRegion | null {\n if (bounds.width <= 0 || bounds.height <= 0) return null;\n const left = Math.max(bounds.left, Math.min(bounds.right, rectangle.left));\n const right = Math.max(bounds.left, Math.min(bounds.right, rectangle.right));\n const top = Math.max(bounds.top, Math.min(bounds.bottom, rectangle.top));\n const bottom = Math.max(bounds.top, Math.min(bounds.bottom, rectangle.bottom));\n if (right <= left || bottom <= top) return null;\n return {\n page,\n rect: {\n x: (left - bounds.left) / bounds.width,\n y: (top - bounds.top) / bounds.height,\n width: (right - left) / bounds.width,\n height: (bottom - top) / bounds.height,\n },\n };\n}\nfunction canvasBlob(\n canvas: HTMLCanvasElement,\n type: 'image/png' | 'image/jpeg',\n quality?: number,\n): Promise<Blob | null> {\n return new Promise((resolve) => canvas.toBlob(resolve, type, quality));\n}\n\n/** A page-aware PDF canvas. Coordinates resolve against PDF page geometry rather than an opaque browser iframe. */\nexport function PdfPreview({ src, path, className, controllerRef, 'data-testid': testId }: PdfPreviewProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const renderTask = useRef<{ cancel(): void } | null>(null);\n const [page, setPage] = useState(1);\n const [pageState, setPageState] = useState<PdfPageState>(EMPTY_STATE);\n const [error, setError] = useState<string | undefined>();\n\n useEffect(() => {\n let disposed = false;\n let loading: PdfLoadingTask | undefined;\n // pdfjs is imported on demand: `pdfjs-dist/webpack.mjs` spins up its worker\n // at module scope, so a static import would make every consumer of this\n // package pay for the worker whether or not it ever shows a PDF.\n void import('pdfjs-dist/webpack.mjs')\n .then(({ getDocument }) => {\n if (disposed) return undefined;\n loading = getDocument({ url: src });\n return loading.promise.then((document) => {\n if (disposed) return;\n documentRef.current = document;\n setError(undefined);\n setPage(1);\n setPageState({ ...EMPTY_STATE, pageCount: document.numPages });\n });\n })\n .catch((reason: unknown) => {\n if (!disposed) setError(reason instanceof Error ? reason.message : String(reason));\n });\n return () => {\n disposed = true;\n void loading?.destroy();\n renderTask.current?.cancel();\n renderTask.current = null;\n documentRef.current = null;\n };\n }, [src]);\n\n useEffect(() => {\n const document = documentRef.current;\n const canvas = canvasRef.current;\n if (document === null || canvas === null) return;\n let disposed = false;\n void document\n .getPage(page)\n .then((pdfPage: PDFPageProxy) => {\n if (disposed) return;\n const source = pdfPage.getViewport({ scale: 1 });\n const viewport = pdfPage.getViewport({ scale: 1.5 });\n canvas.width = Math.ceil(viewport.width);\n canvas.height = Math.ceil(viewport.height);\n setPageState({ page, pageCount: document.numPages, sourceWidth: source.width, sourceHeight: source.height });\n const context = canvas.getContext('2d');\n if (context === null) return;\n const task = pdfPage.render({ canvas, canvasContext: context, viewport });\n renderTask.current = task;\n return task.promise;\n })\n .catch((reason: unknown) => {\n if (!disposed && (reason as { name?: unknown }).name !== 'RenderingCancelledException') {\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n });\n return () => {\n disposed = true;\n renderTask.current?.cancel();\n renderTask.current = null;\n };\n }, [page, pageState.pageCount]);\n\n useImperativeHandle(\n controllerRef,\n () => ({\n getState: () => pageState,\n setPage: (next) => setPage(boundedPage(next, pageState.pageCount)),\n resolveViewportRegion: (rectangle) => {\n const canvas = canvasRef.current;\n if (canvas === null || pageState.pageCount === 0) return null;\n return resolvePdfViewportRegion(pageState.page, canvas.getBoundingClientRect(), rectangle);\n },\n capturePage: async (type = 'image/png', quality) => {\n const canvas = canvasRef.current;\n return canvas === null ? null : await canvasBlob(canvas, type, quality);\n },\n }),\n [pageState],\n );\n\n return (\n <section data-testid={testId} data-kind=\"pdf\" className={cn('flex min-h-0 flex-col gap-2', className)}>\n <div className=\"flex items-center justify-between gap-2 text-sm text-doom-dim\">\n <span>{path}</span>\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n disabled={page <= 1}\n onClick={() => setPage((value) => Math.max(1, value - 1))}\n >\n previous\n </Button>\n <span data-testid={testId === undefined ? undefined : `${testId}-page`}>\n {pageState.pageCount === 0 ? 'loading' : `${page} / ${pageState.pageCount}`}\n </span>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n disabled={pageState.pageCount === 0 || page >= pageState.pageCount}\n onClick={() => setPage((value) => boundedPage(value + 1, pageState.pageCount))}\n >\n next\n </Button>\n </div>\n </div>\n {error === undefined ? null : <output className=\"text-sm text-doom-red\">{error}</output>}\n <div className=\"min-h-0 overflow-auto rounded border border-doom-border bg-doom-deep\">\n <canvas ref={canvasRef} aria-label={path} className=\"mx-auto block max-w-full\" />\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PdfPreview.mjs","names":["EMPTY_STATE","boundedPage","page","pageCount","resolvePdfViewportRegion","bounds","left","rectangle","right","top","bottom","canvasBlob","canvas","resolve","type","quality","PdfPreview","testId","canvasRef","useRef","documentRef","renderTask","setPage","useState","pageState","setPageState","error","setError","useEffect","disposed","loading","getDocument","src","document","reason","source","pdfPage","viewport","context","task","useImperativeHandle","controllerRef","next","cn","className","path","Button","value"],"sources":["../../../../../../src/components/PdfPreview.tsx"],"sourcesContent":["import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist/webpack.mjs';\nimport { useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Button } from './Button';\n\ntype PdfLoadingTask = ReturnType<typeof import('pdfjs-dist/webpack.mjs').getDocument>;\n\nexport interface PdfNormalizedRectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PdfPageState {\n page: number;\n pageCount: number;\n sourceWidth: number;\n sourceHeight: number;\n}\n\nexport interface PdfPageRegion {\n page: number;\n rect: PdfNormalizedRectangle;\n}\n\nexport interface PdfPreviewController {\n getState: () => PdfPageState;\n setPage: (page: number) => void;\n resolveViewportRegion: (rectangle: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n }) => PdfPageRegion | null;\n capturePage: (type?: 'image/png' | 'image/jpeg', quality?: number) => Promise<Blob | null>;\n}\n\nexport interface PdfPreviewProps {\n src: string;\n path: string;\n className?: string;\n 'data-testid'?: string;\n controllerRef?: import('react').Ref<PdfPreviewController>;\n}\n\nconst EMPTY_STATE: PdfPageState = { page: 1, pageCount: 0, sourceWidth: 0, sourceHeight: 0 };\n\nfunction boundedPage(page: number, pageCount: number): number {\n if (!Number.isFinite(page) || pageCount <= 0) return 1;\n return Math.min(pageCount, Math.max(1, Math.trunc(page)));\n}\n\nexport function resolvePdfViewportRegion(\n page: number,\n bounds: { left: number; top: number; right: number; bottom: number; width: number; height: number },\n rectangle: { left: number; top: number; right: number; bottom: number },\n): PdfPageRegion | null {\n if (bounds.width <= 0 || bounds.height <= 0) return null;\n const left = Math.max(bounds.left, Math.min(bounds.right, rectangle.left));\n const right = Math.max(bounds.left, Math.min(bounds.right, rectangle.right));\n const top = Math.max(bounds.top, Math.min(bounds.bottom, rectangle.top));\n const bottom = Math.max(bounds.top, Math.min(bounds.bottom, rectangle.bottom));\n if (right <= left || bottom <= top) return null;\n return {\n page,\n rect: {\n x: (left - bounds.left) / bounds.width,\n y: (top - bounds.top) / bounds.height,\n width: (right - left) / bounds.width,\n height: (bottom - top) / bounds.height,\n },\n };\n}\nfunction canvasBlob(\n canvas: HTMLCanvasElement,\n type: 'image/png' | 'image/jpeg',\n quality?: number,\n): Promise<Blob | null> {\n return new Promise((resolve) => canvas.toBlob(resolve, type, quality));\n}\n\n/** A page-aware PDF canvas. Coordinates resolve against PDF page geometry rather than an opaque browser iframe. */\nexport function PdfPreview({ src, path, className, controllerRef, 'data-testid': testId }: PdfPreviewProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const renderTask = useRef<{ cancel(): void } | null>(null);\n const [page, setPage] = useState(1);\n const [pageState, setPageState] = useState<PdfPageState>(EMPTY_STATE);\n const [error, setError] = useState<string | undefined>();\n\n useEffect(() => {\n let disposed = false;\n let loading: PdfLoadingTask | undefined;\n // pdfjs is imported on demand: `pdfjs-dist/webpack.mjs` spins up its worker\n // at module scope, so a static import would make every consumer of this\n // package pay for the worker whether or not it ever shows a PDF.\n void import('pdfjs-dist/webpack.mjs')\n .then(({ getDocument }) => {\n if (disposed) return undefined;\n loading = getDocument({ url: src });\n return loading.promise.then((document) => {\n if (disposed) return;\n documentRef.current = document;\n setError(undefined);\n setPage(1);\n setPageState({ ...EMPTY_STATE, pageCount: document.numPages });\n });\n })\n .catch((reason: unknown) => {\n if (!disposed) setError(reason instanceof Error ? reason.message : String(reason));\n });\n return () => {\n disposed = true;\n void loading?.destroy();\n renderTask.current?.cancel();\n renderTask.current = null;\n documentRef.current = null;\n };\n }, [src]);\n\n useEffect(() => {\n const document = documentRef.current;\n const canvas = canvasRef.current;\n if (document === null || canvas === null) return;\n let disposed = false;\n void document\n .getPage(page)\n .then((pdfPage: PDFPageProxy) => {\n if (disposed) return;\n const source = pdfPage.getViewport({ scale: 1 });\n const viewport = pdfPage.getViewport({ scale: 1.5 });\n canvas.width = Math.ceil(viewport.width);\n canvas.height = Math.ceil(viewport.height);\n setPageState({ page, pageCount: document.numPages, sourceWidth: source.width, sourceHeight: source.height });\n const context = canvas.getContext('2d');\n if (context === null) return;\n const task = pdfPage.render({ canvas, canvasContext: context, viewport });\n renderTask.current = task;\n return task.promise;\n })\n .catch((reason: unknown) => {\n if (!disposed && (reason as { name?: unknown }).name !== 'RenderingCancelledException') {\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n });\n return () => {\n disposed = true;\n renderTask.current?.cancel();\n renderTask.current = null;\n };\n }, [page, pageState.pageCount]);\n\n useImperativeHandle(\n controllerRef,\n () => ({\n getState: () => pageState,\n setPage: (next) => setPage(boundedPage(next, pageState.pageCount)),\n resolveViewportRegion: (rectangle) => {\n const canvas = canvasRef.current;\n if (canvas === null || pageState.pageCount === 0) return null;\n return resolvePdfViewportRegion(pageState.page, canvas.getBoundingClientRect(), rectangle);\n },\n capturePage: async (type = 'image/png', quality) => {\n const canvas = canvasRef.current;\n return canvas === null ? null : await canvasBlob(canvas, type, quality);\n },\n }),\n [pageState],\n );\n\n return (\n <section data-testid={testId} data-kind=\"pdf\" className={cn('flex min-h-0 flex-col gap-2', className)}>\n <div className=\"flex items-center justify-between gap-2 text-sm text-po-dim\">\n <span>{path}</span>\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n disabled={page <= 1}\n onClick={() => setPage((value) => Math.max(1, value - 1))}\n >\n previous\n </Button>\n <span data-testid={testId === undefined ? undefined : `${testId}-page`}>\n {pageState.pageCount === 0 ? 'loading' : `${page} / ${pageState.pageCount}`}\n </span>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n disabled={pageState.pageCount === 0 || page >= pageState.pageCount}\n onClick={() => setPage((value) => boundedPage(value + 1, pageState.pageCount))}\n >\n next\n </Button>\n </div>\n </div>\n {error === undefined ? null : <output className=\"text-sm text-po-red\">{error}</output>}\n <div className=\"min-h-0 overflow-auto rounded border border-po-border bg-po-deep\">\n <canvas ref={canvasRef} aria-label={path} className=\"mx-auto block max-w-full\" />\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{CheckIcon as e,SearchIcon as t}from"../icons/icons.mjs";import{cn as n}from"../lib/cn.mjs";import{Button as r}from"./Button.mjs";import{Input as i}from"./Input.mjs";import"../lib/optionList.mjs";import{Kbd as a}from"./Kbd.mjs";import{appliedValues as o,draftChanged as s,filterPickerItems as c,initialPickerCursor as l,pickerHint as ee,pickerKeyAction as u,toggleDraft as d}from"../lib/picker.mjs";import{PopoverContent as f,PopoverFooter as p,PopoverHeader as m}from"./Popover.mjs";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";import{useEffect as v,useId as y,useState as b}from"react";function x({title:x,meta:S,items:C,value:w,multiple:T=!1,actions:E=!1,onSelect:D,onApply:O,onCancel:k,filterable:A=C.length>9,filterPlaceholder:j=`Filter`,filterProps:M,loading:N,footer:P,className:F,onKeyDown:I,...L}){let[R,z]=b(``),[B,V]=b(()=>new Set(w)),H=c(C,R),[U,W]=b(()=>l(C,w)),G=Math.min(U,Math.max(0,H.length-1)),[K,q]=b(null),J=y(),Y=y(),X=H.length>0?`${J}-${String(G)}`:void 0;v(()=>{let e=K?.children[G];K!==null&&e!==void 0&&(e.offsetTop<K.scrollTop?K.scrollTo({top:e.offsetTop-6}):e.offsetTop+e.offsetHeight>K.scrollTop+K.clientHeight&&K.scrollTo({top:e.offsetTop+e.offsetHeight-K.clientHeight+6}))},[G,K]);let Z=e=>T?B.has(e.value):w.includes(e.value),Q=T&&s(B,w),$=e=>{if(e!==void 0&&e.disabledReason===void 0){if(!T){D?.(e.value);return}V(t=>d(t,e.value))}},te=()=>O?.(o(C,B)),ne=e=>{if(I?.(e),e.defaultPrevented||e.altKey||e.ctrlKey||e.metaKey||e.nativeEvent.isComposing)return;let t=e.target;if(t.closest(`[data-slot="picker-slot"], [data-slot="popover-footer"]`)||t.closest(`[data-slot="picker-item"]`)&&(e.key===`Enter`||e.key===` `))return;let n=u(e.key,{count:H.length,cursor:G,multiple:T,filterable:A});n!==null&&(e.preventDefault(),e.stopPropagation(),n.kind===`move`?(W(n.cursor),t.closest(`[data-slot="picker-item"]`)&&(K?.children[n.cursor])?.focus()):(W(n.index),$(H[n.index])))},re=E?`enter opens`:ee(T,A);return/* @__PURE__ */ _(f,{side:`top`,"data-slot":`picker`,onKeyDown:ne,className:n(`w-[400px]`,F),...L,children:[/* @__PURE__ */ _(m,{className:`h-10 bg-doom-panel`,children:[/* @__PURE__ */ g(`span`,{id:Y,"data-slot":`picker-title`,className:`truncate text-base font-semibold text-doom-hi`,children:x}),S===void 0?null:/* @__PURE__ */ g(`span`,{"data-slot":`picker-meta`,className:`min-w-0 truncate text-sm text-doom-dim`,children:S})]}),A?/* @__PURE__ */ _(`div`,{className:`flex items-center gap-2 border-b border-doom-border-soft px-3`,children:[/* @__PURE__ */ g(t,{"aria-hidden":!0,className:`size-3.5 shrink-0 text-doom-faint`}),/* @__PURE__ */ g(i,{variant:`bare`,"data-slot":`picker-filter`,role:E?`searchbox`:`combobox`,"aria-expanded":!E||void 0,"aria-controls":J,"aria-haspopup":E?void 0:`listbox`,"aria-autocomplete":E?void 0:`list`,"aria-activedescendant":X,"aria-label":j,autoFocus:!0,value:R,placeholder:j,onChange:e=>{z(e.target.value),W(0)},className:`h-9 w-full`,...M})]}):null,/* @__PURE__ */ _(`div`,{ref:q,id:J,role:E?`menu`:`listbox`,"aria-labelledby":Y,"aria-multiselectable":E?void 0:T,"aria-activedescendant":A?void 0:X,tabIndex:A?void 0:0,"data-slot":`picker-list`,className:`relative flex max-h-80 min-h-0 flex-col gap-0.5 overflow-y-auto p-1.5`,children:[N!==void 0&&C.length===0?/* @__PURE__ */ g(`div`,{className:`flex items-center gap-2 px-2.5 py-2 text-base text-doom-dim`,children:N}):H.length===0?/* @__PURE__ */ g(`div`,{className:`px-2.5 py-2 text-base text-doom-dim`,children:`Nothing matches`}):null,H.map((t,r)=>{let i=Z(t),a=t.disabledReason!==void 0;return/* @__PURE__ */ _(`button`,{type:`button`,id:`${J}-${String(r)}`,role:E?`menuitem`:`option`,tabIndex:-1,"data-slot":`picker-item`,"data-value":t.value,"data-cursor":r===G,"aria-selected":E?void 0:i,"aria-disabled":a,disabled:a,...t.props,title:t.disabledReason??t.subtitle,onMouseMove:()=>{r!==G&&W(r)},onClick:()=>{W(r),$(t)},className:n(`flex w-full shrink-0 cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-left outline-none transition-colors`,r===G&&`bg-doom-deep`,i&&`bg-doom-tint-green`,i&&r===G&&`brightness-110`,a&&`cursor-not-allowed opacity-60`),children:[t.lead===void 0?null:/* @__PURE__ */ g(`span`,{className:`flex shrink-0 items-center`,children:t.lead}),/* @__PURE__ */ _(`span`,{className:`flex min-w-0 flex-1 flex-col`,children:[/* @__PURE__ */ g(`span`,{className:n(`truncate text-base`,i?`font-semibold text-doom-hi`:`font-medium text-doom-text`),children:t.title}),t.disabledReason!==void 0||t.subtitle!==void 0?/* @__PURE__ */ g(`span`,{className:`truncate text-sm text-doom-dim`,children:t.disabledReason??t.subtitle}):null]}),t.trail===void 0?null:/* @__PURE__ */ g(`span`,{className:`flex shrink-0 items-center text-sm text-doom-dim`,children:t.trail}),/* @__PURE__ */ g(`span`,{"aria-hidden":!0,className:n(`flex size-4 shrink-0 items-center justify-center text-doom-green`,!E&&(T?`rounded-sm border`:`rounded-full border`),!E&&(i?`border-doom-green`:`border-doom-border`),T&&i&&`bg-doom-green text-doom-on-selected`),children:E?/* @__PURE__ */ g(`span`,{className:n(`size-1.5 rounded-full`,i?`bg-doom-green`:`bg-doom-faint`)}):T?i?/* @__PURE__ */ g(e,{className:`size-3`}):null:i?/* @__PURE__ */ g(`span`,{className:`size-2 rounded-full bg-doom-green`}):null})]},t.value)})]}),P===void 0?null:/* @__PURE__ */ g(`div`,{"data-slot":`picker-slot`,className:`flex flex-col border-t border-doom-border-soft`,children:P}),/* @__PURE__ */ _(p,{className:`min-h-10`,children:[/* @__PURE__ */ _(`span`,{"data-slot":`picker-hint`,className:`flex min-w-0 items-center gap-1.5 truncate`,children:[re,T?null:/* @__PURE__ */ _(h,{children:[` · `,/* @__PURE__ */ g(a,{children:`esc`}),` closes`]})]}),T?/* @__PURE__ */ _(`span`,{className:`flex shrink-0 items-center gap-1.5`,children:[/* @__PURE__ */ g(r,{variant:`ghost`,size:`sm`,"data-slot":`picker-cancel`,onClick:k,children:`Cancel`}),/* @__PURE__ */ _(r,{variant:`primary`,size:`sm`,"data-slot":`picker-apply`,disabled:!Q,onClick:te,children:[`Apply`,B.size>0?` (${String(B.size)})`:``]})]}):null]})]})}export{x as PickerContent};
1
+ import{CheckIcon as e,SearchIcon as t}from"../icons/icons.mjs";import{cn as n}from"../lib/cn.mjs";import{Button as r}from"./Button.mjs";import{Input as i}from"./Input.mjs";import"../lib/optionList.mjs";import{Kbd as a}from"./Kbd.mjs";import{appliedValues as o,draftChanged as s,filterPickerItems as c,initialPickerCursor as l,pickerHint as ee,pickerKeyAction as u,toggleDraft as d}from"../lib/picker.mjs";import{PopoverContent as f,PopoverFooter as p,PopoverHeader as m}from"./Popover.mjs";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";import{useEffect as v,useId as y,useState as b}from"react";function x({title:x,meta:S,items:C,value:w,multiple:T=!1,actions:E=!1,onSelect:D,onApply:O,onCancel:k,filterable:A=C.length>9,filterPlaceholder:j=`Filter`,filterProps:M,loading:N,footer:P,className:F,onKeyDown:I,...L}){let[R,z]=b(``),[B,V]=b(()=>new Set(w)),H=c(C,R),[U,W]=b(()=>l(C,w)),G=Math.min(U,Math.max(0,H.length-1)),[K,q]=b(null),J=y(),Y=y(),X=H.length>0?`${J}-${String(G)}`:void 0;v(()=>{let e=K?.children[G];K!==null&&e!==void 0&&(e.offsetTop<K.scrollTop?K.scrollTo({top:e.offsetTop-6}):e.offsetTop+e.offsetHeight>K.scrollTop+K.clientHeight&&K.scrollTo({top:e.offsetTop+e.offsetHeight-K.clientHeight+6}))},[G,K]);let Z=e=>T?B.has(e.value):w.includes(e.value),Q=T&&s(B,w),$=e=>{e!==void 0&&e.disabledReason===void 0&&(T?V(t=>d(t,e.value)):D?.(e.value))},te=()=>O?.(o(C,B)),ne=e=>{if(I?.(e),e.defaultPrevented||e.altKey||e.ctrlKey||e.metaKey||e.nativeEvent.isComposing)return;let t=e.target;if(t.closest(`[data-slot="picker-slot"], [data-slot="popover-footer"]`)||t.closest(`[data-slot="picker-item"]`)&&(e.key===`Enter`||e.key===` `))return;let n=u(e.key,{count:H.length,cursor:G,multiple:T,filterable:A});n!==null&&(e.preventDefault(),e.stopPropagation(),n.kind===`move`?(W(n.cursor),t.closest(`[data-slot="picker-item"]`)&&(K?.children[n.cursor])?.focus()):(W(n.index),$(H[n.index])))},re=E?`enter opens`:ee(T,A);return/* @__PURE__ */ _(f,{side:`top`,"data-slot":`picker`,onKeyDown:ne,className:n(`w-[400px]`,F),...L,children:[/* @__PURE__ */ _(m,{className:`h-10 bg-po-panel`,children:[/* @__PURE__ */ g(`span`,{id:Y,"data-slot":`picker-title`,className:`truncate text-base font-semibold text-po-hi`,children:x}),S===void 0?null:/* @__PURE__ */ g(`span`,{"data-slot":`picker-meta`,className:`min-w-0 truncate text-sm text-po-dim`,children:S})]}),A?/* @__PURE__ */ _(`div`,{className:`flex items-center gap-2 border-b border-po-border-soft px-3`,children:[/* @__PURE__ */ g(t,{"aria-hidden":!0,className:`size-3.5 shrink-0 text-po-faint`}),/* @__PURE__ */ g(i,{variant:`bare`,"data-slot":`picker-filter`,role:E?`searchbox`:`combobox`,"aria-expanded":!E||void 0,"aria-controls":J,"aria-haspopup":E?void 0:`listbox`,"aria-autocomplete":E?void 0:`list`,"aria-activedescendant":X,"aria-label":j,autoFocus:!0,value:R,placeholder:j,onChange:e=>{z(e.target.value),W(0)},className:`h-9 w-full`,...M})]}):null,/* @__PURE__ */ _(`div`,{ref:q,id:J,role:E?`menu`:`listbox`,"aria-labelledby":Y,"aria-multiselectable":E?void 0:T,"aria-activedescendant":A?void 0:X,tabIndex:A?void 0:0,"data-slot":`picker-list`,className:`relative flex max-h-80 min-h-0 flex-col gap-0.5 overflow-y-auto p-1.5`,children:[N!==void 0&&C.length===0?/* @__PURE__ */ g(`div`,{className:`flex items-center gap-2 px-2.5 py-2 text-base text-po-dim`,children:N}):H.length===0?/* @__PURE__ */ g(`div`,{className:`px-2.5 py-2 text-base text-po-dim`,children:`Nothing matches`}):null,H.map((t,r)=>{let i=Z(t),a=t.disabledReason!==void 0;return/* @__PURE__ */ _(`button`,{type:`button`,id:`${J}-${String(r)}`,role:E?`menuitem`:`option`,tabIndex:-1,"data-slot":`picker-item`,"data-value":t.value,"data-cursor":r===G,"aria-selected":E?void 0:i,"aria-disabled":a,disabled:a,...t.props,title:t.disabledReason??t.subtitle,onMouseMove:()=>{r!==G&&W(r)},onClick:()=>{W(r),$(t)},className:n(`flex w-full shrink-0 cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-left outline-none transition-colors`,r===G&&`bg-po-deep`,i&&`bg-po-tint-green`,i&&r===G&&`brightness-110`,a&&`cursor-not-allowed opacity-60`),children:[t.lead===void 0?null:/* @__PURE__ */ g(`span`,{className:`flex shrink-0 items-center`,children:t.lead}),/* @__PURE__ */ _(`span`,{className:`flex min-w-0 flex-1 flex-col`,children:[/* @__PURE__ */ g(`span`,{className:n(`truncate text-base`,i?`font-semibold text-po-hi`:`font-medium text-po-text`),children:t.title}),t.disabledReason!==void 0||t.subtitle!==void 0?/* @__PURE__ */ g(`span`,{className:`truncate text-sm text-po-dim`,children:t.disabledReason??t.subtitle}):null]}),t.trail===void 0?null:/* @__PURE__ */ g(`span`,{className:`flex shrink-0 items-center text-sm text-po-dim`,children:t.trail}),/* @__PURE__ */ g(`span`,{"aria-hidden":!0,className:n(`flex size-4 shrink-0 items-center justify-center text-po-green`,!E&&(T?`rounded-sm border`:`rounded-full border`),!E&&(i?`border-po-green`:`border-po-border`),T&&i&&`bg-po-green text-po-on-selected`),children:E?/* @__PURE__ */ g(`span`,{className:n(`size-1.5 rounded-full`,i?`bg-po-green`:`bg-po-faint`)}):T?i?/* @__PURE__ */ g(e,{className:`size-3`}):null:i?/* @__PURE__ */ g(`span`,{className:`size-2 rounded-full bg-po-green`}):null})]},t.value)})]}),P===void 0?null:/* @__PURE__ */ g(`div`,{"data-slot":`picker-slot`,className:`flex flex-col border-t border-po-border-soft`,children:P}),/* @__PURE__ */ _(p,{className:`min-h-10`,children:[/* @__PURE__ */ _(`span`,{"data-slot":`picker-hint`,className:`flex min-w-0 items-center gap-1.5 truncate`,children:[re,T?null:/* @__PURE__ */ _(h,{children:[` · `,/* @__PURE__ */ g(a,{children:`esc`}),` closes`]})]}),T?/* @__PURE__ */ _(`span`,{className:`flex shrink-0 items-center gap-1.5`,children:[/* @__PURE__ */ g(r,{variant:`ghost`,size:`sm`,"data-slot":`picker-cancel`,onClick:k,children:`Cancel`}),/* @__PURE__ */ _(r,{variant:`primary`,size:`sm`,"data-slot":`picker-apply`,disabled:!Q,onClick:te,children:[`Apply`,B.size>0?` (${String(B.size)})`:``]})]}):null]})]})}export{x as PickerContent};
2
2
  //# sourceMappingURL=Picker.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.mjs","names":["PickerContent","items","props","filter","setFilter","useState","draft","setDraft","value","shown","filterPickerItems","cursor","setCursor","initialPickerCursor","at","box","setBox","listId","useId","titleId","activeId","useEffect","row","checked","multiple","item","changed","draftChanged","pick","onSelect","toggleDraft","current","apply","onApply","appliedValues","handleKey","onKeyDown","event","target","action","pickerKeyAction","hint","actions","pickerHint","filterable","PopoverContent","cn","className","PopoverHeader","title","meta","SearchIcon","Input","filterPlaceholder","filterProps","loading","on","disabled","index","CheckIcon","footer","PopoverFooter","Fragment","Kbd","Button","onCancel"],"sources":["../../../../../../src/components/Picker.tsx"],"sourcesContent":["import { type ComponentProps, type KeyboardEvent, type ReactNode, useEffect, useId, useState } from 'react';\n\nimport { CheckIcon, SearchIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { MAX_DIGIT_SHORTCUT } from '../lib/optionList';\nimport {\n appliedValues,\n draftChanged,\n filterPickerItems,\n initialPickerCursor,\n type PickerChoice,\n pickerHint,\n pickerKeyAction,\n toggleDraft,\n} from '../lib/picker';\nimport { Button } from './Button';\nimport { Input } from './Input';\nimport { Kbd } from './Kbd';\nimport { PopoverContent, PopoverFooter, PopoverHeader } from './Popover';\n\n/** One choice: a title, an optional line under it, and room either side for keys or a note. */\nexport interface PickerItem extends PickerChoice {\n /** Before the title: shortcut keys, a provider. */\n lead?: ReactNode;\n /** After the title, before the mark: a status such as \"thinks\". */\n trail?: ReactNode;\n /** Adapter attributes such as test IDs and availability. */\n props?: ComponentProps<'button'> & Record<`data-${string}`, string | boolean | undefined>;\n}\n\nexport interface PickerContentProps extends Omit<ComponentProps<typeof PopoverContent>, 'title' | 'onSelect'> {\n title: ReactNode;\n /** Header right: the current value, a count. */\n meta?: ReactNode;\n items: readonly PickerItem[];\n /** The values in effect now. Single choice has at most one. */\n value: readonly string[];\n /** Several can be on at once: picks are drafted and land together on Apply. */\n multiple?: boolean;\n /** Commands rather than set-valued choices: show availability, not radio marks. */\n actions?: boolean;\n /** Single choice: the pick. The caller closes the popover. */\n onSelect?: (value: string) => void;\n /** Multiple choice: the whole drafted set. */\n onApply?: (values: string[]) => void;\n /** Multiple choice: Cancel. Escape and an outside click close through the popover itself. */\n onCancel?: () => void;\n /** A typeahead filter over title, subtitle and value. Defaults on past nine items. */\n filterable?: boolean;\n filterPlaceholder?: string;\n filterProps?: ComponentProps<typeof Input> & Record<`data-${string}`, string | boolean | undefined>;\n /** While the choices are still on their way. */\n loading?: ReactNode;\n /** Extra controls above the hint strip, such as the model's thinking level. */\n footer?: ReactNode;\n}\n\n/** The list's padding, kept clear above and below a row scrolled into view. */\nconst ROW_GUTTER = 6;\n\n/**\n * The selection-bar picker: major mode, profile, domains, minor modes, model.\n *\n * One choice closes on the pick, because there is nothing left to decide. Many\n * choices stay open and land together on Apply, so turning on three domains is\n * one change rather than three. The keyboard cursor and the selection are\n * separate: the cursor is a neutral highlight that moves, the selection is the\n * jade mark that says what is in effect.\n */\nexport function PickerContent({\n title,\n meta,\n items,\n value,\n multiple = false,\n actions = false,\n onSelect,\n onApply,\n onCancel,\n filterable = items.length > MAX_DIGIT_SHORTCUT,\n filterPlaceholder = 'Filter',\n filterProps,\n loading,\n footer,\n className,\n onKeyDown,\n ...props\n}: PickerContentProps) {\n const [filter, setFilter] = useState('');\n const [draft, setDraft] = useState(() => new Set(value));\n const shown = filterPickerItems(items, filter);\n const [cursor, setCursor] = useState(() => initialPickerCursor(items, value));\n const at = Math.min(cursor, Math.max(0, shown.length - 1));\n // State rather than a ref: Radix mounts the content after this first renders,\n // and the scroll below has to run again once the list is really there.\n const [box, setBox] = useState<HTMLDivElement | null>(null);\n const listId = useId();\n const titleId = useId();\n const activeId = shown.length > 0 ? `${listId}-${String(at)}` : undefined;\n // Scrolled by hand rather than scrollIntoView, which misplaces the row while\n // the popover is still sliding in and can move the page under it.\n useEffect(() => {\n const row = box?.children[at] as HTMLElement | undefined;\n if (box === null || row === undefined) return;\n if (row.offsetTop < box.scrollTop) box.scrollTo({ top: row.offsetTop - ROW_GUTTER });\n else if (row.offsetTop + row.offsetHeight > box.scrollTop + box.clientHeight)\n box.scrollTo({ top: row.offsetTop + row.offsetHeight - box.clientHeight + ROW_GUTTER });\n }, [at, box]);\n\n const checked = (item: PickerItem): boolean => (multiple ? draft.has(item.value) : value.includes(item.value));\n const changed = multiple && draftChanged(draft, value);\n const pick = (item: PickerItem | undefined): void => {\n if (item === undefined || item.disabledReason !== undefined) return;\n if (!multiple) {\n onSelect?.(item.value);\n return;\n }\n setDraft((current) => toggleDraft(current, item.value));\n };\n const apply = (): void => onApply?.(appliedValues(items, draft));\n\n const handleKey = (event: KeyboardEvent<HTMLDivElement>): void => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || event.nativeEvent.isComposing)\n return;\n const target = event.target as HTMLElement;\n // Footer controls and directly focused rows keep their native activation.\n if (target.closest('[data-slot=\"picker-slot\"], [data-slot=\"popover-footer\"]')) return;\n if (target.closest('[data-slot=\"picker-item\"]') && (event.key === 'Enter' || event.key === ' ')) return;\n const action = pickerKeyAction(event.key, { count: shown.length, cursor: at, multiple, filterable });\n if (action === null) return;\n event.preventDefault();\n event.stopPropagation();\n if (action.kind === 'move') {\n setCursor(action.cursor);\n if (target.closest('[data-slot=\"picker-item\"]')) {\n const row = box?.children[action.cursor] as HTMLButtonElement | undefined;\n row?.focus();\n }\n } else {\n setCursor(action.index);\n pick(shown[action.index]);\n }\n };\n\n const hint = actions ? 'enter opens' : pickerHint(multiple, filterable);\n\n return (\n <PopoverContent\n side=\"top\"\n data-slot=\"picker\"\n onKeyDown={handleKey}\n className={cn('w-[400px]', className)}\n {...props}\n >\n <PopoverHeader className=\"h-10 bg-doom-panel\">\n <span id={titleId} data-slot=\"picker-title\" className=\"truncate text-base font-semibold text-doom-hi\">\n {title}\n </span>\n {meta === undefined ? null : (\n <span data-slot=\"picker-meta\" className=\"min-w-0 truncate text-sm text-doom-dim\">\n {meta}\n </span>\n )}\n </PopoverHeader>\n\n {filterable ? (\n <div className=\"flex items-center gap-2 border-b border-doom-border-soft px-3\">\n <SearchIcon aria-hidden className=\"size-3.5 shrink-0 text-doom-faint\" />\n <Input\n variant=\"bare\"\n data-slot=\"picker-filter\"\n role={actions ? 'searchbox' : 'combobox'}\n aria-expanded={actions ? undefined : true}\n aria-controls={listId}\n aria-haspopup={actions ? undefined : 'listbox'}\n aria-autocomplete={actions ? undefined : 'list'}\n aria-activedescendant={activeId}\n aria-label={filterPlaceholder}\n autoFocus\n value={filter}\n placeholder={filterPlaceholder}\n onChange={(event) => {\n setFilter(event.target.value);\n setCursor(0);\n }}\n className=\"h-9 w-full\"\n {...filterProps}\n />\n </div>\n ) : null}\n\n <div\n ref={setBox}\n id={listId}\n role={actions ? 'menu' : 'listbox'}\n aria-labelledby={titleId}\n aria-multiselectable={actions ? undefined : multiple}\n aria-activedescendant={filterable ? undefined : activeId}\n tabIndex={filterable ? undefined : 0}\n data-slot=\"picker-list\"\n className=\"relative flex max-h-80 min-h-0 flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n {loading !== undefined && items.length === 0 ? (\n <div className=\"flex items-center gap-2 px-2.5 py-2 text-base text-doom-dim\">{loading}</div>\n ) : shown.length === 0 ? (\n <div className=\"px-2.5 py-2 text-base text-doom-dim\">Nothing matches</div>\n ) : null}\n {shown.map((item, index) => {\n const on = checked(item);\n const disabled = item.disabledReason !== undefined;\n return (\n <button\n key={item.value}\n type=\"button\"\n id={`${listId}-${String(index)}`}\n role={actions ? 'menuitem' : 'option'}\n tabIndex={-1}\n data-slot=\"picker-item\"\n data-value={item.value}\n data-cursor={index === at}\n aria-selected={actions ? undefined : on}\n aria-disabled={disabled}\n disabled={disabled}\n {...item.props}\n title={item.disabledReason ?? item.subtitle}\n onMouseMove={() => {\n if (index !== at) setCursor(index);\n }}\n onClick={() => {\n setCursor(index);\n pick(item);\n }}\n className={cn(\n 'flex w-full shrink-0 cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-left outline-none transition-colors',\n index === at && 'bg-doom-deep',\n on && 'bg-doom-tint-green',\n on && index === at && 'brightness-110',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {item.lead === undefined ? null : <span className=\"flex shrink-0 items-center\">{item.lead}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn('truncate text-base', on ? 'font-semibold text-doom-hi' : 'font-medium text-doom-text')}\n >\n {item.title}\n </span>\n {item.disabledReason !== undefined || item.subtitle !== undefined ? (\n <span className=\"truncate text-sm text-doom-dim\">{item.disabledReason ?? item.subtitle}</span>\n ) : null}\n </span>\n {item.trail === undefined ? null : (\n <span className=\"flex shrink-0 items-center text-sm text-doom-dim\">{item.trail}</span>\n )}\n <span\n aria-hidden\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center text-doom-green',\n !actions && (multiple ? 'rounded-sm border' : 'rounded-full border'),\n !actions && (on ? 'border-doom-green' : 'border-doom-border'),\n multiple && on && 'bg-doom-green text-doom-on-selected',\n )}\n >\n {actions ? (\n <span className={cn('size-1.5 rounded-full', on ? 'bg-doom-green' : 'bg-doom-faint')} />\n ) : multiple ? (\n on ? (\n <CheckIcon className=\"size-3\" />\n ) : null\n ) : on ? (\n <span className=\"size-2 rounded-full bg-doom-green\" />\n ) : null}\n </span>\n </button>\n );\n })}\n </div>\n\n {footer === undefined ? null : (\n <div data-slot=\"picker-slot\" className=\"flex flex-col border-t border-doom-border-soft\">\n {footer}\n </div>\n )}\n\n <PopoverFooter className=\"min-h-10\">\n <span data-slot=\"picker-hint\" className=\"flex min-w-0 items-center gap-1.5 truncate\">\n {hint}\n {multiple ? null : (\n <>\n {' · '}\n <Kbd>esc</Kbd> closes\n </>\n )}\n </span>\n {multiple ? (\n <span className=\"flex shrink-0 items-center gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" data-slot=\"picker-cancel\" onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" size=\"sm\" data-slot=\"picker-apply\" disabled={!changed} onClick={apply}>\n Apply{draft.size > 0 ? ` (${String(draft.size)})` : ''}\n </Button>\n </span>\n ) : null}\n </PopoverFooter>\n </PopoverContent>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Picker.mjs","names":["PickerContent","items","props","filter","setFilter","useState","draft","setDraft","value","shown","filterPickerItems","cursor","setCursor","initialPickerCursor","at","box","setBox","listId","useId","titleId","activeId","useEffect","row","checked","multiple","item","changed","draftChanged","pick","toggleDraft","current","onSelect","apply","onApply","appliedValues","handleKey","onKeyDown","event","target","action","pickerKeyAction","hint","actions","pickerHint","filterable","PopoverContent","cn","className","PopoverHeader","title","meta","SearchIcon","Input","filterPlaceholder","filterProps","loading","on","disabled","index","CheckIcon","footer","PopoverFooter","Fragment","Kbd","Button","onCancel"],"sources":["../../../../../../src/components/Picker.tsx"],"sourcesContent":["import { type ComponentProps, type KeyboardEvent, type ReactNode, useEffect, useId, useState } from 'react';\n\nimport { CheckIcon, SearchIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\nimport { MAX_DIGIT_SHORTCUT } from '../lib/optionList';\nimport {\n appliedValues,\n draftChanged,\n filterPickerItems,\n initialPickerCursor,\n type PickerChoice,\n pickerHint,\n pickerKeyAction,\n toggleDraft,\n} from '../lib/picker';\nimport { Button } from './Button';\nimport { Input } from './Input';\nimport { Kbd } from './Kbd';\nimport { PopoverContent, PopoverFooter, PopoverHeader } from './Popover';\n\n/** One choice: a title, an optional line under it, and room either side for keys or a note. */\nexport interface PickerItem extends PickerChoice {\n /** Before the title: shortcut keys, a provider. */\n lead?: ReactNode;\n /** After the title, before the mark: a status such as \"thinks\". */\n trail?: ReactNode;\n /** Adapter attributes such as test IDs and availability. */\n props?: ComponentProps<'button'> & Record<`data-${string}`, string | boolean | undefined>;\n}\n\nexport interface PickerContentProps extends Omit<ComponentProps<typeof PopoverContent>, 'title' | 'onSelect'> {\n title: ReactNode;\n /** Header right: the current value, a count. */\n meta?: ReactNode;\n items: readonly PickerItem[];\n /** The values in effect now. Single choice has at most one. */\n value: readonly string[];\n /** Several can be on at once: picks are drafted and land together on Apply. */\n multiple?: boolean;\n /** Commands rather than set-valued choices: show availability, not radio marks. */\n actions?: boolean;\n /** Single choice: the pick. The caller closes the popover. */\n onSelect?: (value: string) => void;\n /** Multiple choice: the whole drafted set. */\n onApply?: (values: string[]) => void;\n /** Multiple choice: Cancel. Escape and an outside click close through the popover itself. */\n onCancel?: () => void;\n /** A typeahead filter over title, subtitle and value. Defaults on past nine items. */\n filterable?: boolean;\n filterPlaceholder?: string;\n filterProps?: ComponentProps<typeof Input> & Record<`data-${string}`, string | boolean | undefined>;\n /** While the choices are still on their way. */\n loading?: ReactNode;\n /** Extra controls above the hint strip, such as the model's thinking level. */\n footer?: ReactNode;\n}\n\n/** The list's padding, kept clear above and below a row scrolled into view. */\nconst ROW_GUTTER = 6;\n\n/**\n * The selection-bar picker: major mode, profile, domains, minor modes, model.\n *\n * One choice closes on the pick, because there is nothing left to decide. Many\n * choices stay open and land together on Apply, so turning on three domains is\n * one change rather than three. The keyboard cursor and the selection are\n * separate: the cursor is a neutral highlight that moves, the selection is the\n * jade mark that says what is in effect.\n */\nexport function PickerContent({\n title,\n meta,\n items,\n value,\n multiple = false,\n actions = false,\n onSelect,\n onApply,\n onCancel,\n filterable = items.length > MAX_DIGIT_SHORTCUT,\n filterPlaceholder = 'Filter',\n filterProps,\n loading,\n footer,\n className,\n onKeyDown,\n ...props\n}: PickerContentProps) {\n const [filter, setFilter] = useState('');\n const [draft, setDraft] = useState(() => new Set(value));\n const shown = filterPickerItems(items, filter);\n const [cursor, setCursor] = useState(() => initialPickerCursor(items, value));\n const at = Math.min(cursor, Math.max(0, shown.length - 1));\n // State rather than a ref: Radix mounts the content after this first renders,\n // and the scroll below has to run again once the list is really there.\n const [box, setBox] = useState<HTMLDivElement | null>(null);\n const listId = useId();\n const titleId = useId();\n const activeId = shown.length > 0 ? `${listId}-${String(at)}` : undefined;\n // Scrolled by hand rather than scrollIntoView, which misplaces the row while\n // the popover is still sliding in and can move the page under it.\n useEffect(() => {\n const row = box?.children[at] as HTMLElement | undefined;\n if (box === null || row === undefined) return;\n if (row.offsetTop < box.scrollTop) box.scrollTo({ top: row.offsetTop - ROW_GUTTER });\n else if (row.offsetTop + row.offsetHeight > box.scrollTop + box.clientHeight)\n box.scrollTo({ top: row.offsetTop + row.offsetHeight - box.clientHeight + ROW_GUTTER });\n }, [at, box]);\n\n const checked = (item: PickerItem): boolean => (multiple ? draft.has(item.value) : value.includes(item.value));\n const changed = multiple && draftChanged(draft, value);\n const pick = (item: PickerItem | undefined): void => {\n if (item === undefined || item.disabledReason !== undefined) return;\n if (!multiple) {\n onSelect?.(item.value);\n return;\n }\n setDraft((current) => toggleDraft(current, item.value));\n };\n const apply = (): void => onApply?.(appliedValues(items, draft));\n\n const handleKey = (event: KeyboardEvent<HTMLDivElement>): void => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || event.nativeEvent.isComposing)\n return;\n const target = event.target as HTMLElement;\n // Footer controls and directly focused rows keep their native activation.\n if (target.closest('[data-slot=\"picker-slot\"], [data-slot=\"popover-footer\"]')) return;\n if (target.closest('[data-slot=\"picker-item\"]') && (event.key === 'Enter' || event.key === ' ')) return;\n const action = pickerKeyAction(event.key, { count: shown.length, cursor: at, multiple, filterable });\n if (action === null) return;\n event.preventDefault();\n event.stopPropagation();\n if (action.kind === 'move') {\n setCursor(action.cursor);\n if (target.closest('[data-slot=\"picker-item\"]')) {\n const row = box?.children[action.cursor] as HTMLButtonElement | undefined;\n row?.focus();\n }\n } else {\n setCursor(action.index);\n pick(shown[action.index]);\n }\n };\n\n const hint = actions ? 'enter opens' : pickerHint(multiple, filterable);\n\n return (\n <PopoverContent\n side=\"top\"\n data-slot=\"picker\"\n onKeyDown={handleKey}\n className={cn('w-[400px]', className)}\n {...props}\n >\n <PopoverHeader className=\"h-10 bg-po-panel\">\n <span id={titleId} data-slot=\"picker-title\" className=\"truncate text-base font-semibold text-po-hi\">\n {title}\n </span>\n {meta === undefined ? null : (\n <span data-slot=\"picker-meta\" className=\"min-w-0 truncate text-sm text-po-dim\">\n {meta}\n </span>\n )}\n </PopoverHeader>\n\n {filterable ? (\n <div className=\"flex items-center gap-2 border-b border-po-border-soft px-3\">\n <SearchIcon aria-hidden className=\"size-3.5 shrink-0 text-po-faint\" />\n <Input\n variant=\"bare\"\n data-slot=\"picker-filter\"\n role={actions ? 'searchbox' : 'combobox'}\n aria-expanded={actions ? undefined : true}\n aria-controls={listId}\n aria-haspopup={actions ? undefined : 'listbox'}\n aria-autocomplete={actions ? undefined : 'list'}\n aria-activedescendant={activeId}\n aria-label={filterPlaceholder}\n autoFocus\n value={filter}\n placeholder={filterPlaceholder}\n onChange={(event) => {\n setFilter(event.target.value);\n setCursor(0);\n }}\n className=\"h-9 w-full\"\n {...filterProps}\n />\n </div>\n ) : null}\n\n <div\n ref={setBox}\n id={listId}\n role={actions ? 'menu' : 'listbox'}\n aria-labelledby={titleId}\n aria-multiselectable={actions ? undefined : multiple}\n aria-activedescendant={filterable ? undefined : activeId}\n tabIndex={filterable ? undefined : 0}\n data-slot=\"picker-list\"\n className=\"relative flex max-h-80 min-h-0 flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n {loading !== undefined && items.length === 0 ? (\n <div className=\"flex items-center gap-2 px-2.5 py-2 text-base text-po-dim\">{loading}</div>\n ) : shown.length === 0 ? (\n <div className=\"px-2.5 py-2 text-base text-po-dim\">Nothing matches</div>\n ) : null}\n {shown.map((item, index) => {\n const on = checked(item);\n const disabled = item.disabledReason !== undefined;\n return (\n <button\n key={item.value}\n type=\"button\"\n id={`${listId}-${String(index)}`}\n role={actions ? 'menuitem' : 'option'}\n tabIndex={-1}\n data-slot=\"picker-item\"\n data-value={item.value}\n data-cursor={index === at}\n aria-selected={actions ? undefined : on}\n aria-disabled={disabled}\n disabled={disabled}\n {...item.props}\n title={item.disabledReason ?? item.subtitle}\n onMouseMove={() => {\n if (index !== at) setCursor(index);\n }}\n onClick={() => {\n setCursor(index);\n pick(item);\n }}\n className={cn(\n 'flex w-full shrink-0 cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-left outline-none transition-colors',\n index === at && 'bg-po-deep',\n on && 'bg-po-tint-green',\n on && index === at && 'brightness-110',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {item.lead === undefined ? null : <span className=\"flex shrink-0 items-center\">{item.lead}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn('truncate text-base', on ? 'font-semibold text-po-hi' : 'font-medium text-po-text')}\n >\n {item.title}\n </span>\n {item.disabledReason !== undefined || item.subtitle !== undefined ? (\n <span className=\"truncate text-sm text-po-dim\">{item.disabledReason ?? item.subtitle}</span>\n ) : null}\n </span>\n {item.trail === undefined ? null : (\n <span className=\"flex shrink-0 items-center text-sm text-po-dim\">{item.trail}</span>\n )}\n <span\n aria-hidden\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center text-po-green',\n !actions && (multiple ? 'rounded-sm border' : 'rounded-full border'),\n !actions && (on ? 'border-po-green' : 'border-po-border'),\n multiple && on && 'bg-po-green text-po-on-selected',\n )}\n >\n {actions ? (\n <span className={cn('size-1.5 rounded-full', on ? 'bg-po-green' : 'bg-po-faint')} />\n ) : multiple ? (\n on ? (\n <CheckIcon className=\"size-3\" />\n ) : null\n ) : on ? (\n <span className=\"size-2 rounded-full bg-po-green\" />\n ) : null}\n </span>\n </button>\n );\n })}\n </div>\n\n {footer === undefined ? null : (\n <div data-slot=\"picker-slot\" className=\"flex flex-col border-t border-po-border-soft\">\n {footer}\n </div>\n )}\n\n <PopoverFooter className=\"min-h-10\">\n <span data-slot=\"picker-hint\" className=\"flex min-w-0 items-center gap-1.5 truncate\">\n {hint}\n {multiple ? null : (\n <>\n {' · '}\n <Kbd>esc</Kbd> closes\n </>\n )}\n </span>\n {multiple ? (\n <span className=\"flex shrink-0 items-center gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" data-slot=\"picker-cancel\" onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" size=\"sm\" data-slot=\"picker-apply\" disabled={!changed} onClick={apply}>\n Apply{draft.size > 0 ? ` (${String(draft.size)})` : ''}\n </Button>\n </span>\n ) : null}\n </PopoverFooter>\n </PopoverContent>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Popover as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r(e){return/* @__PURE__ */ n(t.Root,{"data-slot":`popover`,...e})}function i(e){return/* @__PURE__ */ n(t.Trigger,{"data-slot":`popover-trigger`,...e})}function a(e){return/* @__PURE__ */ n(t.Anchor,{"data-slot":`popover-anchor`,...e})}function o(e){return/* @__PURE__ */ n(t.Close,{"data-slot":`popover-close`,...e})}function s({className:r,align:i=`start`,sideOffset:a=6,...o}){return/* @__PURE__ */ n(t.Portal,{children:/* @__PURE__ */ n(t.Content,{"data-slot":`popover-content`,align:i,sideOffset:a,className:e(`z-50 flex max-w-[calc(100vw-24px)] flex-col overflow-hidden rounded-lg border border-doom-border bg-doom-panel shadow-2xl outline-none data-[state=open]:animate-doom-rise`,r),...o})})}function c({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`popover-header`,className:e(`flex h-[34px] shrink-0 items-center justify-between gap-3 border-b border-doom-border-soft bg-doom-deep px-3`,t),...r})}function l({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`popover-footer`,className:e(`flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-doom-border-soft bg-doom-deep px-3 text-sm text-doom-dim`,t),...r})}export{r as Popover,a as PopoverAnchor,o as PopoverClose,s as PopoverContent,l as PopoverFooter,c as PopoverHeader,i as PopoverTrigger};
1
+ import{cn as e}from"../lib/cn.mjs";import{Popover as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r(e){return/* @__PURE__ */ n(t.Root,{"data-slot":`popover`,...e})}function i(e){return/* @__PURE__ */ n(t.Trigger,{"data-slot":`popover-trigger`,...e})}function a(e){return/* @__PURE__ */ n(t.Anchor,{"data-slot":`popover-anchor`,...e})}function o(e){return/* @__PURE__ */ n(t.Close,{"data-slot":`popover-close`,...e})}function s({className:r,align:i=`start`,sideOffset:a=6,...o}){return/* @__PURE__ */ n(t.Portal,{children:/* @__PURE__ */ n(t.Content,{"data-slot":`popover-content`,align:i,sideOffset:a,className:e(`z-50 flex max-w-[calc(100vw-24px)] flex-col overflow-hidden rounded-lg border border-po-border bg-po-panel shadow-2xl outline-none data-[state=open]:animate-po-rise`,r),...o})})}function c({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`popover-header`,className:e(`flex h-[34px] shrink-0 items-center justify-between gap-3 border-b border-po-border-soft bg-po-deep px-3`,t),...r})}function l({className:t,...r}){return/* @__PURE__ */ n(`div`,{"data-slot":`popover-footer`,className:e(`flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-po-border-soft bg-po-deep px-3 text-sm text-po-dim`,t),...r})}export{r as Popover,a as PopoverAnchor,o as PopoverClose,s as PopoverContent,l as PopoverFooter,c as PopoverHeader,i as PopoverTrigger};
2
2
  //# sourceMappingURL=Popover.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.mjs","names":["Popover","PopoverPrimitive","Popover$1","Popover","props","PopoverTrigger","PopoverAnchor","PopoverClose","PopoverContent","cn","className","PopoverHeader","PopoverFooter"],"sources":["../../../../../../src/components/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * shadcn's Popover on Radix: anchored to its trigger, closes on outside\n * click and Escape, and the trigger toggles it rather than reopening it.\n */\nexport function Popover(props: ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nexport function PopoverTrigger(props: ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nexport function PopoverAnchor(props: ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\n/** Dismisses the popover from inside it: the row that acts and closes in one click. */\nexport function PopoverClose(props: ComponentProps<typeof PopoverPrimitive.Close>) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nexport function PopoverContent({\n className,\n align = 'start',\n sideOffset = 6,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 flex max-w-[calc(100vw-24px)] flex-col overflow-hidden rounded-lg border border-doom-border bg-doom-panel shadow-2xl outline-none data-[state=open]:animate-doom-rise',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** The strip a popover's title sits in; tone colours the title. */\nexport function PopoverHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\n 'flex h-[34px] shrink-0 items-center justify-between gap-3 border-b border-doom-border-soft bg-doom-deep px-3',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function PopoverFooter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"popover-footer\"\n className={cn(\n 'flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-doom-border-soft bg-doom-deep px-3 text-sm text-doom-dim',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"8GASA,SAAgBA,EAAQ,EAAqD,CAC3E,MAAO,kBAACC,EAAiB,KAAlB,CAAuB,YAAU,UAAU,GAAIG,CAAQ,CAAA,CAChE,CAEA,SAAgBC,EAAe,EAAwD,CACrF,MAAO,kBAACJ,EAAiB,QAAlB,CAA0B,YAAU,kBAAkB,GAAIG,CAAQ,CAAA,CAC3E,CAEA,SAAgBE,EAAc,EAAuD,CACnF,MAAO,kBAACL,EAAiB,OAAlB,CAAyB,YAAU,iBAAiB,GAAIG,CAAQ,CAAA,CACzE,CAGA,SAAgBG,EAAa,EAAsD,CACjF,MAAO,kBAACN,EAAiB,MAAlB,CAAwB,YAAU,gBAAgB,GAAIG,CAAQ,CAAA,CACvE,CAEA,SAAgBI,EAAe,CAC7B,YACA,QAAQ,QACR,aAAa,EACb,GAAGJ,GAC+C,CAClD,MACE,kBAACH,EAAiB,OAAlB,CAAA,SACE,kBAACA,EAAiB,QAAlB,CACE,YAAU,kBACH,QACK,aACZ,UAAWQ,EACT,6KACAC,CACF,EACA,GAAIN,CACL,CAAA,CACsB,CAAA,CAE7B,CAGA,SAAgBO,EAAc,CAAE,YAAW,GAAGP,GAAgC,CAC5E,MACE,kBAAC,MAAD,CACE,YAAU,iBACV,UAAWK,EACT,+GACAC,CACF,EACA,GAAIN,CACL,CAAA,CAEL,CAEA,SAAgBQ,EAAc,CAAE,YAAW,GAAGR,GAAgC,CAC5E,MACE,kBAAC,MAAD,CACE,YAAU,iBACV,UAAWK,EACT,yIACAC,CACF,EACA,GAAIN,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Popover.mjs","names":["Popover","PopoverPrimitive","Popover$1","Popover","props","PopoverTrigger","PopoverAnchor","PopoverClose","PopoverContent","cn","className","PopoverHeader","PopoverFooter"],"sources":["../../../../../../src/components/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * shadcn's Popover on Radix: anchored to its trigger, closes on outside\n * click and Escape, and the trigger toggles it rather than reopening it.\n */\nexport function Popover(props: ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nexport function PopoverTrigger(props: ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nexport function PopoverAnchor(props: ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\n/** Dismisses the popover from inside it: the row that acts and closes in one click. */\nexport function PopoverClose(props: ComponentProps<typeof PopoverPrimitive.Close>) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nexport function PopoverContent({\n className,\n align = 'start',\n sideOffset = 6,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 flex max-w-[calc(100vw-24px)] flex-col overflow-hidden rounded-lg border border-po-border bg-po-panel shadow-2xl outline-none data-[state=open]:animate-po-rise',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** The strip a popover's title sits in; tone colours the title. */\nexport function PopoverHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\n 'flex h-[34px] shrink-0 items-center justify-between gap-3 border-b border-po-border-soft bg-po-deep px-3',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function PopoverFooter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"popover-footer\"\n className={cn(\n 'flex min-h-[30px] shrink-0 items-center justify-between gap-3 border-t border-po-border-soft bg-po-deep px-3 text-sm text-po-dim',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"8GASA,SAAgBA,EAAQ,EAAqD,CAC3E,MAAO,kBAACC,EAAiB,KAAlB,CAAuB,YAAU,UAAU,GAAIG,CAAQ,CAAA,CAChE,CAEA,SAAgBC,EAAe,EAAwD,CACrF,MAAO,kBAACJ,EAAiB,QAAlB,CAA0B,YAAU,kBAAkB,GAAIG,CAAQ,CAAA,CAC3E,CAEA,SAAgBE,EAAc,EAAuD,CACnF,MAAO,kBAACL,EAAiB,OAAlB,CAAyB,YAAU,iBAAiB,GAAIG,CAAQ,CAAA,CACzE,CAGA,SAAgBG,EAAa,EAAsD,CACjF,MAAO,kBAACN,EAAiB,MAAlB,CAAwB,YAAU,gBAAgB,GAAIG,CAAQ,CAAA,CACvE,CAEA,SAAgBI,EAAe,CAC7B,YACA,QAAQ,QACR,aAAa,EACb,GAAGJ,GAC+C,CAClD,MACE,kBAACH,EAAiB,OAAlB,CAAA,SACE,kBAACA,EAAiB,QAAlB,CACE,YAAU,kBACH,QACK,aACZ,UAAWQ,EACT,uKACAC,CACF,EACA,GAAIN,CACL,CAAA,CACsB,CAAA,CAE7B,CAGA,SAAgBO,EAAc,CAAE,YAAW,GAAGP,GAAgC,CAC5E,MACE,kBAAC,MAAD,CACE,YAAU,iBACV,UAAWK,EACT,2GACAC,CACF,EACA,GAAIN,CACL,CAAA,CAEL,CAEA,SAAgBQ,EAAc,CAAE,YAAW,GAAGR,GAAgC,CAC5E,MACE,kBAAC,MAAD,CACE,YAAU,iBACV,UAAWK,EACT,mIACAC,CACF,EACA,GAAIN,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Progress as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,value:i,...a}){return/* @__PURE__ */ n(t.Root,{"data-slot":`progress`,value:i,className:e(`relative h-1 w-full overflow-hidden rounded-full bg-doom-deep`,r),...a,children:/* @__PURE__ */ n(t.Indicator,{"data-slot":`progress-indicator`,className:`h-full w-full flex-1 bg-doom-blue transition-transform`,style:{transform:`translateX(-${String(100-(i??0))}%)`}})})}export{r as Progress};
1
+ import{cn as e}from"../lib/cn.mjs";import{Progress as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,value:i,...a}){return/* @__PURE__ */ n(t.Root,{"data-slot":`progress`,value:i,className:e(`relative h-1 w-full overflow-hidden rounded-full bg-po-deep`,r),...a,children:/* @__PURE__ */ n(t.Indicator,{"data-slot":`progress-indicator`,className:`h-full w-full flex-1 bg-po-blue transition-transform`,style:{transform:`translateX(-${String(100-(i??0))}%)`}})})}export{r as Progress};
2
2
  //# sourceMappingURL=Progress.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Progress.mjs","names":["Progress","ProgressPrimitive","Progress$1","props","Progress","cn","className","value"],"sources":["../../../../../../src/components/Progress.tsx"],"sourcesContent":["import { Progress as ProgressPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** A determinate bar; leave `value` undefined and Radix reports it as indeterminate. */\nexport function Progress({ className, value, ...props }: ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n value={value}\n className={cn('relative h-1 w-full overflow-hidden rounded-full bg-doom-deep', className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"h-full w-full flex-1 bg-doom-blue transition-transform\"\n style={{ transform: `translateX(-${String(100 - (value ?? 0))}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n"],"mappings":"+GAMA,SAAgBA,EAAS,CAAE,YAAW,QAAO,GAAGG,GAAwD,CACtG,MACE,kBAACF,EAAkB,KAAnB,CACE,YAAU,WACH,QACP,UAAWI,EAAG,gEAAiEC,CAAS,EACxF,GAAIH,EAEJ,SAAA,kBAACF,EAAkB,UAAnB,CACE,YAAU,qBACV,UAAU,yDACV,MAAO,CAAE,UAAW,eAAe,OAAO,KAAOM,GAAS,EAAE,EAAE,GAAI,CACnE,CAAA,CACqB,CAAA,CAE5B"}
1
+ {"version":3,"file":"Progress.mjs","names":["Progress","ProgressPrimitive","Progress$1","props","Progress","cn","className","value"],"sources":["../../../../../../src/components/Progress.tsx"],"sourcesContent":["import { Progress as ProgressPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** A determinate bar; leave `value` undefined and Radix reports it as indeterminate. */\nexport function Progress({ className, value, ...props }: ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n value={value}\n className={cn('relative h-1 w-full overflow-hidden rounded-full bg-po-deep', className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"h-full w-full flex-1 bg-po-blue transition-transform\"\n style={{ transform: `translateX(-${String(100 - (value ?? 0))}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n"],"mappings":"+GAMA,SAAgBA,EAAS,CAAE,YAAW,QAAO,GAAGG,GAAwD,CACtG,MACE,kBAACF,EAAkB,KAAnB,CACE,YAAU,WACH,QACP,UAAWI,EAAG,8DAA+DC,CAAS,EACtF,GAAIH,EAEJ,SAAA,kBAACF,EAAkB,UAAnB,CACE,YAAU,qBACV,UAAU,uDACV,MAAO,CAAE,UAAW,eAAe,OAAO,KAAOM,GAAS,EAAE,EAAE,GAAI,CACnE,CAAA,CACqB,CAAA,CAE5B"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{RadioGroup as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,...i}){return/* @__PURE__ */ n(t.Root,{"data-slot":`radio-group`,className:e(`flex flex-col gap-2`,r),...i})}function i({className:r,...i}){return/* @__PURE__ */ n(t.Item,{"data-slot":`radio-group-item`,className:e(`flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-full border border-doom-border bg-doom-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-doom-green`,r),...i,children:/* @__PURE__ */ n(t.Indicator,{"data-slot":`radio-group-indicator`,className:`block h-1.5 w-1.5 rounded-full bg-doom-green`})})}function a({className:r,...i}){return/* @__PURE__ */ n(t.Item,{"data-slot":`radio-group-card`,className:e(`cursor-pointer rounded-md border border-doom-border bg-doom-panel p-2 text-left outline-none transition-colors hover:border-doom-green/50 focus-visible:ring-2 focus-visible:ring-doom-green/50 data-[state=checked]:border-doom-green data-[state=checked]:bg-doom-tint-green`,r),...i})}export{r as RadioGroup,a as RadioGroupCard,i as RadioGroupItem};
1
+ import{cn as e}from"../lib/cn.mjs";import{RadioGroup as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,...i}){return/* @__PURE__ */ n(t.Root,{"data-slot":`radio-group`,className:e(`flex flex-col gap-2`,r),...i})}function i({className:r,...i}){return/* @__PURE__ */ n(t.Item,{"data-slot":`radio-group-item`,className:e(`flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-full border border-po-border bg-po-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-po-green`,r),...i,children:/* @__PURE__ */ n(t.Indicator,{"data-slot":`radio-group-indicator`,className:`block h-1.5 w-1.5 rounded-full bg-po-green`})})}function a({className:r,...i}){return/* @__PURE__ */ n(t.Item,{"data-slot":`radio-group-card`,className:e(`cursor-pointer rounded-md border border-po-border bg-po-panel p-2 text-left outline-none transition-colors hover:border-po-green/50 focus-visible:ring-2 focus-visible:ring-po-green/50 data-[state=checked]:border-po-green data-[state=checked]:bg-po-tint-green`,r),...i})}export{r as RadioGroup,a as RadioGroupCard,i as RadioGroupItem};
2
2
  //# sourceMappingURL=RadioGroup.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RadioGroup.mjs","names":["RadioGroup","RadioGroupPrimitive","RadioGroup$1","props","RadioGroup","cn","className","RadioGroupItem","RadioGroupCard"],"sources":["../../../../../../src/components/RadioGroup.tsx"],"sourcesContent":["import { RadioGroup as RadioGroupPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** One choice out of several; Radix owns the arrow-key roving focus a native group has. */\nexport function RadioGroup({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn('flex flex-col gap-2', className)} {...props} />\n );\n}\n\nexport function RadioGroupItem({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n 'flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-full border border-doom-border bg-doom-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-doom-green',\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"block h-1.5 w-1.5 rounded-full bg-doom-green\"\n />\n </RadioGroupPrimitive.Item>\n );\n}\n\n/**\n * A whole card that is one radio choice: the theme picker, where the target is\n * the preview rather than a dot. Radix keeps the roving focus and the checked\n * state; the card supplies the frame.\n */\nexport function RadioGroupCard({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-card\"\n className={cn(\n 'cursor-pointer rounded-md border border-doom-border bg-doom-panel p-2 text-left outline-none transition-colors hover:border-doom-green/50 focus-visible:ring-2 focus-visible:ring-doom-green/50 data-[state=checked]:border-doom-green data-[state=checked]:bg-doom-tint-green',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"iHAMA,SAAgBA,EAAW,CAAE,YAAW,GAAGG,GAA0D,CACnG,MACE,kBAACF,EAAoB,KAArB,CAA0B,YAAU,cAAc,UAAWI,EAAG,sBAAuBC,CAAS,EAAG,GAAIH,CAAQ,CAAA,CAEnH,CAEA,SAAgBI,EAAe,CAAE,YAAW,GAAGJ,GAA0D,CACvG,MACE,kBAACF,EAAoB,KAArB,CACE,YAAU,mBACV,UAAWI,EACT,wSACAC,CACF,EACA,GAAIH,EAEJ,SAAA,kBAACF,EAAoB,UAArB,CACE,YAAU,wBACV,UAAU,8CACX,CAAA,CACuB,CAAA,CAE9B,CAOA,SAAgBO,EAAe,CAAE,YAAW,GAAGL,GAA0D,CACvG,MACE,kBAACF,EAAoB,KAArB,CACE,YAAU,mBACV,UAAWI,EACT,iRACAC,CACF,EACA,GAAIH,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"RadioGroup.mjs","names":["RadioGroup","RadioGroupPrimitive","RadioGroup$1","props","RadioGroup","cn","className","RadioGroupItem","RadioGroupCard"],"sources":["../../../../../../src/components/RadioGroup.tsx"],"sourcesContent":["import { RadioGroup as RadioGroupPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** One choice out of several; Radix owns the arrow-key roving focus a native group has. */\nexport function RadioGroup({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn('flex flex-col gap-2', className)} {...props} />\n );\n}\n\nexport function RadioGroupItem({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n 'flex h-3.5 w-3.5 shrink-0 cursor-pointer items-center justify-center rounded-full border border-po-border bg-po-deep outline-none transition-colors focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[state=checked]:border-po-green',\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"block h-1.5 w-1.5 rounded-full bg-po-green\"\n />\n </RadioGroupPrimitive.Item>\n );\n}\n\n/**\n * A whole card that is one radio choice: the theme picker, where the target is\n * the preview rather than a dot. Radix keeps the roving focus and the checked\n * state; the card supplies the frame.\n */\nexport function RadioGroupCard({ className, ...props }: ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-card\"\n className={cn(\n 'cursor-pointer rounded-md border border-po-border bg-po-panel p-2 text-left outline-none transition-colors hover:border-po-green/50 focus-visible:ring-2 focus-visible:ring-po-green/50 data-[state=checked]:border-po-green data-[state=checked]:bg-po-tint-green',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"iHAMA,SAAgBA,EAAW,CAAE,YAAW,GAAGG,GAA0D,CACnG,MACE,kBAACF,EAAoB,KAArB,CAA0B,YAAU,cAAc,UAAWI,EAAG,sBAAuBC,CAAS,EAAG,GAAIH,CAAQ,CAAA,CAEnH,CAEA,SAAgBI,EAAe,CAAE,YAAW,GAAGJ,GAA0D,CACvG,MACE,kBAACF,EAAoB,KAArB,CACE,YAAU,mBACV,UAAWI,EACT,gSACAC,CACF,EACA,GAAIH,EAEJ,SAAA,kBAACF,EAAoB,UAArB,CACE,YAAU,wBACV,UAAU,4CACX,CAAA,CACuB,CAAA,CAE9B,CAOA,SAAgBO,EAAe,CAAE,YAAW,GAAGL,GAA0D,CACvG,MACE,kBAACF,EAAoB,KAArB,CACE,YAAU,mBACV,UAAWI,EACT,qQACAC,CACF,EACA,GAAIH,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{Button as e}from"./Button.mjs";import{trimSnippet as t}from"../lib/review.mjs";import{Textarea as n}from"./Textarea.mjs";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{useState as a}from"react";function o(e,t,n){if(e===void 0)return`no line anchor: this selection came from the rendered preview`;let r=n===`old`?`removed `:``;return t===void 0||t===e?`${r}line ${e}`:`${r}lines ${e} to ${t}`}function s({snippet:s,startLine:c,endLine:l,side:u,onSubmit:d,onCancel:f,testIdPrefix:p=`review-comment`}){let[m,h]=a(``);return/* @__PURE__ */ i(`div`,{"data-testid":`${p}-draft`,className:`flex flex-col gap-1.5 border-t border-doom-border p-2`,children:[/* @__PURE__ */ r(`p`,{className:`text-sm text-doom-dim`,children:o(c,l,u)}),/* @__PURE__ */ r(`pre`,{className:`max-h-24 overflow-y-auto whitespace-pre-wrap break-words rounded border border-doom-border-soft bg-doom-deep p-1.5 font-mono text-xs text-doom-dim`,children:t(s,8,600)}),/* @__PURE__ */ r(n,{"data-testid":`${p}-body`,value:m,rows:3,autoFocus:!0,placeholder:`what should change here?`,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Escape`&&f(),e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),m.trim()!==``&&d(m))},className:`text-sm`}),/* @__PURE__ */ i(`div`,{className:`flex items-center gap-1.5`,children:[/* @__PURE__ */ r(e,{variant:`outline`,size:`xs`,"data-testid":`${p}-add`,disabled:m.trim()===``,onClick:()=>d(m),children:`Add comment`}),/* @__PURE__ */ r(e,{variant:`ghost`,size:`xs`,"data-testid":`${p}-cancel`,onClick:f,children:`Cancel`}),/* @__PURE__ */ r(`span`,{className:`text-sm text-doom-dim`,children:`⌘⏎ to add`})]})]})}export{s as ReviewCommentDraft};
1
+ import{Button as e}from"./Button.mjs";import{trimSnippet as t}from"../lib/review.mjs";import{Textarea as n}from"./Textarea.mjs";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{useState as a}from"react";function o(e,t,n){if(e===void 0)return`no line anchor: this selection came from the rendered preview`;let r=n===`old`?`removed `:``;return t===void 0||t===e?`${r}line ${e}`:`${r}lines ${e} to ${t}`}function s({snippet:s,startLine:c,endLine:l,side:u,onSubmit:d,onCancel:f,testIdPrefix:p=`review-comment`}){let[m,h]=a(``);return/* @__PURE__ */ i(`div`,{"data-testid":`${p}-draft`,className:`flex flex-col gap-1.5 border-t border-po-border p-2`,children:[/* @__PURE__ */ r(`p`,{className:`text-sm text-po-dim`,children:o(c,l,u)}),/* @__PURE__ */ r(`pre`,{className:`max-h-24 overflow-y-auto whitespace-pre-wrap break-words rounded border border-po-border-soft bg-po-deep p-1.5 font-mono text-xs text-po-dim`,children:t(s,8,600)}),/* @__PURE__ */ r(n,{"data-testid":`${p}-body`,value:m,rows:3,autoFocus:!0,placeholder:`what should change here?`,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Escape`&&f(),e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),m.trim()!==``&&d(m))},className:`text-sm`}),/* @__PURE__ */ i(`div`,{className:`flex items-center gap-1.5`,children:[/* @__PURE__ */ r(e,{variant:`outline`,size:`xs`,"data-testid":`${p}-add`,disabled:m.trim()===``,onClick:()=>d(m),children:`Add comment`}),/* @__PURE__ */ r(e,{variant:`ghost`,size:`xs`,"data-testid":`${p}-cancel`,onClick:f,children:`Cancel`}),/* @__PURE__ */ r(`span`,{className:`text-sm text-po-dim`,children:`⌘⏎ to add`})]})]})}export{s as ReviewCommentDraft};
2
2
  //# sourceMappingURL=ReviewCommentDraft.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewCommentDraft.mjs","names":["rangeLabel","startLine","removed","side","endLine","ReviewCommentDraft","body","setBody","useState","testIdPrefix","trimSnippet","snippet","Textarea","event","onCancel","onSubmit","Button"],"sources":["../../../../../../src/components/ReviewCommentDraft.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { trimSnippet } from '../lib/review';\nimport type { DiffSide } from '../types/diff';\nimport { Button } from './Button';\nimport { Textarea } from './Textarea';\n\n/**\n * The box a selection raises: what was highlighted, and a note about it.\n *\n * The note is held here rather than in a store because it belongs to one open\n * box and dies with it; only a submitted comment is worth keeping, and the\n * owner decides where that goes.\n */\nexport interface ReviewCommentDraftProps {\n snippet: string;\n /** Absent when the selection came from somewhere lines cannot be recovered, such as a rendered preview. */\n startLine?: number;\n endLine?: number;\n /** Absent means the new side. */\n side?: DiffSide;\n onSubmit: (body: string) => void;\n onCancel: () => void;\n /** Prefix for the test ids: `<prefix>-draft`, `-body`, `-add`, `-cancel`. */\n testIdPrefix?: string;\n}\n\nfunction rangeLabel(startLine: number | undefined, endLine: number | undefined, side: DiffSide | undefined): string {\n if (startLine === undefined) return 'no line anchor: this selection came from the rendered preview';\n const removed = side === 'old' ? 'removed ' : '';\n return endLine === undefined || endLine === startLine\n ? `${removed}line ${startLine}`\n : `${removed}lines ${startLine} to ${endLine}`;\n}\n\nexport function ReviewCommentDraft({\n snippet,\n startLine,\n endLine,\n side,\n onSubmit,\n onCancel,\n testIdPrefix = 'review-comment',\n}: ReviewCommentDraftProps) {\n const [body, setBody] = useState('');\n\n return (\n <div data-testid={`${testIdPrefix}-draft`} className=\"flex flex-col gap-1.5 border-t border-doom-border p-2\">\n <p className=\"text-sm text-doom-dim\">{rangeLabel(startLine, endLine, side)}</p>\n <pre className=\"max-h-24 overflow-y-auto whitespace-pre-wrap break-words rounded border border-doom-border-soft bg-doom-deep p-1.5 font-mono text-xs text-doom-dim\">\n {trimSnippet(snippet, 8, 600)}\n </pre>\n <Textarea\n data-testid={`${testIdPrefix}-body`}\n value={body}\n rows={3}\n autoFocus\n placeholder=\"what should change here?\"\n onChange={(event) => setBody(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') onCancel();\n if (event.key !== 'Enter' || !(event.metaKey || event.ctrlKey)) return;\n event.preventDefault();\n if (body.trim() !== '') onSubmit(body);\n }}\n className=\"text-sm\"\n />\n <div className=\"flex items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n data-testid={`${testIdPrefix}-add`}\n disabled={body.trim() === ''}\n onClick={() => onSubmit(body)}\n >\n Add comment\n </Button>\n <Button variant=\"ghost\" size=\"xs\" data-testid={`${testIdPrefix}-cancel`} onClick={onCancel}>\n Cancel\n </Button>\n <span className=\"text-sm text-doom-dim\">⌘⏎ to add</span>\n </div>\n </div>\n );\n}\n"],"mappings":"mNA2BA,SAASA,EAAW,EAA+B,EAA6B,EAAoC,CAClH,GAAIC,IAAc,IAAA,GAAW,MAAO,gEACpC,IAAMC,EAAUC,IAAS,MAAQ,WAAa,GAC9C,OAAOC,IAAY,IAAA,IAAaA,IAAYH,EACxC,GAAGC,EAAQ,OAAOD,IAClB,GAAGC,EAAQ,QAAQD,EAAU,MAAMG,GACzC,CAEA,SAAgBC,EAAmB,CACjC,UACA,YACA,UACA,OACA,WACA,WACA,eAAe,kBACW,CAC1B,GAAM,CAACC,EAAMC,GAAWC,EAAS,EAAE,EAEnC,MACE,kBAAC,MAAD,CAAK,cAAa,GAAGC,EAAa,QAAS,UAAU,wDAArD,SAAA,CACE,kBAAC,IAAD,CAAG,UAAU,wBAAyB,SAAAT,EAAWC,EAAWG,EAASD,CAAI,CAAK,CAAA,EAC9E,kBAAC,MAAD,CAAK,UAAU,qJACZ,SAAAO,EAAYC,EAAS,EAAG,GAAG,CACzB,CAAA,EACL,kBAACC,EAAD,CACE,cAAa,GAAGH,EAAa,OAC7B,MAAOH,EACP,KAAM,EACN,UAAA,GACA,YAAY,2BACZ,SAAW,GAAUC,EAAQM,EAAM,OAAO,KAAK,EAC/C,UAAY,GAAU,CAChBA,EAAM,MAAQ,UAAUC,EAAS,EACjCD,EAAM,MAAQ,UAAaA,EAAM,SAAWA,EAAM,WACtDA,EAAM,eAAe,EACjBP,EAAK,KAAK,IAAM,IAAIS,EAAST,CAAI,EACvC,EACA,UAAU,SACX,CAAA,EACD,kBAAC,MAAD,CAAK,UAAU,4BAAf,SAAA,CACE,kBAACU,EAAD,CACE,QAAQ,UACR,KAAK,KACL,cAAa,GAAGP,EAAa,MAC7B,SAAUH,EAAK,KAAK,IAAM,GAC1B,YAAeS,EAAST,CAAI,EAC7B,SAAA,aAEO,CAAA,EACR,kBAACU,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,cAAa,GAAGP,EAAa,SAAU,QAASK,EAAU,SAAA,QAEpF,CAAA,EACR,kBAAC,OAAD,CAAM,UAAU,wBAAwB,SAAA,WAAe,CAAA,CACpD,GACF,GAET"}
1
+ {"version":3,"file":"ReviewCommentDraft.mjs","names":["rangeLabel","startLine","removed","side","endLine","ReviewCommentDraft","body","setBody","useState","testIdPrefix","trimSnippet","snippet","Textarea","event","onCancel","onSubmit","Button"],"sources":["../../../../../../src/components/ReviewCommentDraft.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { trimSnippet } from '../lib/review';\nimport type { DiffSide } from '../types/diff';\nimport { Button } from './Button';\nimport { Textarea } from './Textarea';\n\n/**\n * The box a selection raises: what was highlighted, and a note about it.\n *\n * The note is held here rather than in a store because it belongs to one open\n * box and dies with it; only a submitted comment is worth keeping, and the\n * owner decides where that goes.\n */\nexport interface ReviewCommentDraftProps {\n snippet: string;\n /** Absent when the selection came from somewhere lines cannot be recovered, such as a rendered preview. */\n startLine?: number;\n endLine?: number;\n /** Absent means the new side. */\n side?: DiffSide;\n onSubmit: (body: string) => void;\n onCancel: () => void;\n /** Prefix for the test ids: `<prefix>-draft`, `-body`, `-add`, `-cancel`. */\n testIdPrefix?: string;\n}\n\nfunction rangeLabel(startLine: number | undefined, endLine: number | undefined, side: DiffSide | undefined): string {\n if (startLine === undefined) return 'no line anchor: this selection came from the rendered preview';\n const removed = side === 'old' ? 'removed ' : '';\n return endLine === undefined || endLine === startLine\n ? `${removed}line ${startLine}`\n : `${removed}lines ${startLine} to ${endLine}`;\n}\n\nexport function ReviewCommentDraft({\n snippet,\n startLine,\n endLine,\n side,\n onSubmit,\n onCancel,\n testIdPrefix = 'review-comment',\n}: ReviewCommentDraftProps) {\n const [body, setBody] = useState('');\n\n return (\n <div data-testid={`${testIdPrefix}-draft`} className=\"flex flex-col gap-1.5 border-t border-po-border p-2\">\n <p className=\"text-sm text-po-dim\">{rangeLabel(startLine, endLine, side)}</p>\n <pre className=\"max-h-24 overflow-y-auto whitespace-pre-wrap break-words rounded border border-po-border-soft bg-po-deep p-1.5 font-mono text-xs text-po-dim\">\n {trimSnippet(snippet, 8, 600)}\n </pre>\n <Textarea\n data-testid={`${testIdPrefix}-body`}\n value={body}\n rows={3}\n autoFocus\n placeholder=\"what should change here?\"\n onChange={(event) => setBody(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') onCancel();\n if (event.key !== 'Enter' || !(event.metaKey || event.ctrlKey)) return;\n event.preventDefault();\n if (body.trim() !== '') onSubmit(body);\n }}\n className=\"text-sm\"\n />\n <div className=\"flex items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n data-testid={`${testIdPrefix}-add`}\n disabled={body.trim() === ''}\n onClick={() => onSubmit(body)}\n >\n Add comment\n </Button>\n <Button variant=\"ghost\" size=\"xs\" data-testid={`${testIdPrefix}-cancel`} onClick={onCancel}>\n Cancel\n </Button>\n <span className=\"text-sm text-po-dim\">⌘⏎ to add</span>\n </div>\n </div>\n );\n}\n"],"mappings":"mNA2BA,SAASA,EAAW,EAA+B,EAA6B,EAAoC,CAClH,GAAIC,IAAc,IAAA,GAAW,MAAO,gEACpC,IAAMC,EAAUC,IAAS,MAAQ,WAAa,GAC9C,OAAOC,IAAY,IAAA,IAAaA,IAAYH,EACxC,GAAGC,EAAQ,OAAOD,IAClB,GAAGC,EAAQ,QAAQD,EAAU,MAAMG,GACzC,CAEA,SAAgBC,EAAmB,CACjC,UACA,YACA,UACA,OACA,WACA,WACA,eAAe,kBACW,CAC1B,GAAM,CAACC,EAAMC,GAAWC,EAAS,EAAE,EAEnC,MACE,kBAAC,MAAD,CAAK,cAAa,GAAGC,EAAa,QAAS,UAAU,sDAArD,SAAA,CACE,kBAAC,IAAD,CAAG,UAAU,sBAAuB,SAAAT,EAAWC,EAAWG,EAASD,CAAI,CAAK,CAAA,EAC5E,kBAAC,MAAD,CAAK,UAAU,+IACZ,SAAAO,EAAYC,EAAS,EAAG,GAAG,CACzB,CAAA,EACL,kBAACC,EAAD,CACE,cAAa,GAAGH,EAAa,OAC7B,MAAOH,EACP,KAAM,EACN,UAAA,GACA,YAAY,2BACZ,SAAW,GAAUC,EAAQM,EAAM,OAAO,KAAK,EAC/C,UAAY,GAAU,CAChBA,EAAM,MAAQ,UAAUC,EAAS,EACjCD,EAAM,MAAQ,UAAaA,EAAM,SAAWA,EAAM,WACtDA,EAAM,eAAe,EACjBP,EAAK,KAAK,IAAM,IAAIS,EAAST,CAAI,EACvC,EACA,UAAU,SACX,CAAA,EACD,kBAAC,MAAD,CAAK,UAAU,4BAAf,SAAA,CACE,kBAACU,EAAD,CACE,QAAQ,UACR,KAAK,KACL,cAAa,GAAGP,EAAa,MAC7B,SAAUH,EAAK,KAAK,IAAM,GAC1B,YAAeS,EAAST,CAAI,EAC7B,SAAA,aAEO,CAAA,EACR,kBAACU,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,cAAa,GAAGP,EAAa,SAAU,QAASK,EAAU,SAAA,QAEpF,CAAA,EACR,kBAAC,OAAD,CAAM,UAAU,sBAAsB,SAAA,WAAe,CAAA,CAClD,GACF,GAET"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{ScrollArea as t}from"radix-ui";import{jsx as n,jsxs as r}from"react/jsx-runtime";function i({className:i,children:o,...s}){return/* @__PURE__ */ r(t.Root,{"data-slot":`scroll-area`,className:e(`relative overflow-hidden`,i),...s,children:[/* @__PURE__ */ n(t.Viewport,{"data-slot":`scroll-area-viewport`,className:`h-full w-full rounded-[inherit]`,children:o}),/* @__PURE__ */ n(a,{}),/* @__PURE__ */ n(t.Corner,{})]})}function a({className:r,orientation:i=`vertical`,...a}){return/* @__PURE__ */ n(t.ScrollAreaScrollbar,{"data-slot":`scroll-area-scrollbar`,orientation:i,className:e(`flex touch-none select-none`,i===`vertical`?`h-full w-2.5 p-px`:`h-2.5 flex-col p-px`,r),...a,children:/* @__PURE__ */ n(t.ScrollAreaThumb,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-doom-border`})})}export{i as ScrollArea,a as ScrollBar};
1
+ import{cn as e}from"../lib/cn.mjs";import{ScrollArea as t}from"radix-ui";import{jsx as n,jsxs as r}from"react/jsx-runtime";function i({className:i,children:o,...s}){return/* @__PURE__ */ r(t.Root,{"data-slot":`scroll-area`,className:e(`relative overflow-hidden`,i),...s,children:[/* @__PURE__ */ n(t.Viewport,{"data-slot":`scroll-area-viewport`,className:`h-full w-full rounded-[inherit]`,children:o}),/* @__PURE__ */ n(a,{}),/* @__PURE__ */ n(t.Corner,{})]})}function a({className:r,orientation:i=`vertical`,...a}){return/* @__PURE__ */ n(t.ScrollAreaScrollbar,{"data-slot":`scroll-area-scrollbar`,orientation:i,className:e(`flex touch-none select-none`,i===`vertical`?`h-full w-2.5 p-px`:`h-2.5 flex-col p-px`,r),...a,children:/* @__PURE__ */ n(t.ScrollAreaThumb,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-po-border`})})}export{i as ScrollArea,a as ScrollBar};
2
2
  //# sourceMappingURL=ScrollArea.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollArea.mjs","names":["ScrollArea","ScrollAreaPrimitive","ScrollArea$1","props","ScrollArea","cn","className","ScrollBar","orientation"],"sources":["../../../../../../src/components/ScrollArea.tsx"],"sourcesContent":["import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * A scroll container with a styled bar. The base stylesheet already themes\n * the native scrollbar, so reach for this only where the bar must overlay the\n * content or sit inside a rounded surface that clips it.\n */\nexport function ScrollArea({ className, children, ...props }: ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root data-slot=\"scroll-area\" className={cn('relative overflow-hidden', className)} {...props}>\n <ScrollAreaPrimitive.Viewport data-slot=\"scroll-area-viewport\" className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport function ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none',\n orientation === 'vertical' ? 'h-full w-2.5 p-px' : 'h-2.5 flex-col p-px',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-doom-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n"],"mappings":"2HAUA,SAAgBA,EAAW,CAAE,YAAW,WAAU,GAAGG,GAA0D,CAC7G,MACE,kBAACF,EAAoB,KAArB,CAA0B,YAAU,cAAc,UAAWI,EAAG,2BAA4BC,CAAS,EAAG,GAAIH,EAA5G,SAAA,CACE,kBAACF,EAAoB,SAArB,CAA8B,YAAU,uBAAuB,UAAU,kCACtE,UAC2B,CAAA,EAC9B,kBAACM,EAAD,CAAY,CAAA,EACZ,kBAACN,EAAoB,OAArB,CAA6B,CAAA,CACL,GAE9B,CAEA,SAAgBM,EAAU,CACxB,YACA,cAAc,WACd,GAAGJ,GAC8D,CACjE,MACE,kBAACF,EAAoB,oBAArB,CACE,YAAU,wBACG,cACb,UAAWI,EACT,8BACAG,IAAgB,WAAa,oBAAsB,sBACnDF,CACF,EACA,GAAIH,EAEJ,SAAA,kBAACF,EAAoB,gBAArB,CACE,YAAU,oBACV,UAAU,6CACX,CAAA,CACsC,CAAA,CAE7C"}
1
+ {"version":3,"file":"ScrollArea.mjs","names":["ScrollArea","ScrollAreaPrimitive","ScrollArea$1","props","ScrollArea","cn","className","ScrollBar","orientation"],"sources":["../../../../../../src/components/ScrollArea.tsx"],"sourcesContent":["import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * A scroll container with a styled bar. The base stylesheet already themes\n * the native scrollbar, so reach for this only where the bar must overlay the\n * content or sit inside a rounded surface that clips it.\n */\nexport function ScrollArea({ className, children, ...props }: ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root data-slot=\"scroll-area\" className={cn('relative overflow-hidden', className)} {...props}>\n <ScrollAreaPrimitive.Viewport data-slot=\"scroll-area-viewport\" className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport function ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none',\n orientation === 'vertical' ? 'h-full w-2.5 p-px' : 'h-2.5 flex-col p-px',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-po-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n"],"mappings":"2HAUA,SAAgBA,EAAW,CAAE,YAAW,WAAU,GAAGG,GAA0D,CAC7G,MACE,kBAACF,EAAoB,KAArB,CAA0B,YAAU,cAAc,UAAWI,EAAG,2BAA4BC,CAAS,EAAG,GAAIH,EAA5G,SAAA,CACE,kBAACF,EAAoB,SAArB,CAA8B,YAAU,uBAAuB,UAAU,kCACtE,UAC2B,CAAA,EAC9B,kBAACM,EAAD,CAAY,CAAA,EACZ,kBAACN,EAAoB,OAArB,CAA6B,CAAA,CACL,GAE9B,CAEA,SAAgBM,EAAU,CACxB,YACA,cAAc,WACd,GAAGJ,GAC8D,CACjE,MACE,kBAACF,EAAoB,oBAArB,CACE,YAAU,wBACG,cACb,UAAWI,EACT,8BACAG,IAAgB,WAAa,oBAAsB,sBACnDF,CACF,EACA,GAAIH,EAEJ,SAAA,kBAACF,EAAoB,gBAArB,CACE,YAAU,oBACV,UAAU,2CACX,CAAA,CACsC,CAAA,CAE7C"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{jsx as t}from"react/jsx-runtime";function n({className:n,...r}){return/* @__PURE__ */ t(`span`,{"data-slot":`section-label`,className:e(`inline-block text-sm font-semibold text-doom-dim first-letter:uppercase`,n),...r})}export{n as SectionLabel};
1
+ import{cn as e}from"../lib/cn.mjs";import{jsx as t}from"react/jsx-runtime";function n({className:n,...r}){return/* @__PURE__ */ t(`span`,{"data-slot":`section-label`,className:e(`inline-block text-sm font-semibold text-po-dim first-letter:uppercase`,n),...r})}export{n as SectionLabel};
2
2
  //# sourceMappingURL=SectionLabel.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SectionLabel.mjs","names":["SectionLabel","props","cn","className"],"sources":["../../../../../../src/components/SectionLabel.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** The quiet sentence-case heading over a cockpit section (Sessions, Activity, Minor modes). */\nexport function SectionLabel({ className, ...props }: ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"section-label\"\n className={cn('inline-block text-sm font-semibold text-doom-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2EAKA,SAAgBA,EAAa,CAAE,YAAW,GAAGC,GAAiC,CAC5E,MACE,kBAAC,OAAD,CACE,YAAU,gBACV,UAAWC,EAAG,0EAA2EC,CAAS,EAClG,GAAIF,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"SectionLabel.mjs","names":["SectionLabel","props","cn","className"],"sources":["../../../../../../src/components/SectionLabel.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** The quiet sentence-case heading over a cockpit section (Sessions, Activity, Minor modes). */\nexport function SectionLabel({ className, ...props }: ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"section-label\"\n className={cn('inline-block text-sm font-semibold text-po-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2EAKA,SAAgBA,EAAa,CAAE,YAAW,GAAGC,GAAiC,CAC5E,MACE,kBAAC,OAAD,CACE,YAAU,gBACV,UAAWC,EAAG,wEAAyEC,CAAS,EAChG,GAAIF,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{CheckIcon as e,ChevronDownIcon as t}from"../icons/icons.mjs";import{cn as n}from"../lib/cn.mjs";import{Select as r}from"radix-ui";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o(e){return/* @__PURE__ */ i(r.Root,{"data-slot":`select`,...e})}function s(e){return/* @__PURE__ */ i(r.Group,{"data-slot":`select-group`,...e})}function c(e){return/* @__PURE__ */ i(r.Value,{"data-slot":`select-value`,...e})}function l({className:e,children:o,...s}){return/* @__PURE__ */ a(r.Trigger,{"data-slot":`select-trigger`,className:n(`flex h-7 cursor-pointer items-center justify-between gap-2 rounded border border-doom-border bg-doom-deep px-2.5 text-left text-base text-doom-hi outline-none transition-colors hover:border-doom-green/50 focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[placeholder]:text-doom-faint *:data-[slot=select-value]:truncate`,e),...s,children:[o,/* @__PURE__ */ i(r.Icon,{asChild:!0,children:/* @__PURE__ */ i(t,{className:`h-3 w-3 shrink-0 text-doom-faint`})})]})}function u({className:e,position:t=`popper`,sideOffset:a=4,children:o,...s}){return/* @__PURE__ */ i(r.Portal,{children:/* @__PURE__ */ i(r.Content,{"data-slot":`select-content`,position:t,sideOffset:a,className:n(`z-50 max-h-[320px] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded border border-doom-border bg-doom-panel shadow-xl outline-none data-[state=open]:animate-doom-rise`,e),...s,children:/* @__PURE__ */ i(r.Viewport,{className:`p-1`,children:o})})})}function d({className:e,...t}){return/* @__PURE__ */ i(r.Label,{"data-slot":`select-label`,className:n(`px-2 py-1 text-sm font-semibold text-doom-dim first-letter:uppercase`,e),...t})}function f({className:t,children:o,...s}){return/* @__PURE__ */ a(r.Item,{"data-slot":`select-item`,className:n(`relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-7 text-base text-doom-hi outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-doom-deep`,t),...s,children:[/* @__PURE__ */ i(`span`,{className:`pointer-events-none absolute left-2 flex h-3 w-3 items-center justify-center`,children:/* @__PURE__ */ i(r.ItemIndicator,{children:/* @__PURE__ */ i(e,{className:`h-3 w-3 text-doom-green`})})}),/* @__PURE__ */ i(r.ItemText,{children:o})]})}function p({className:e,...t}){return/* @__PURE__ */ i(r.Separator,{"data-slot":`select-separator`,className:n(`my-1 h-px bg-doom-border-soft`,e),...t})}export{o as Select,u as SelectContent,s as SelectGroup,f as SelectItem,d as SelectLabel,p as SelectSeparator,l as SelectTrigger,c as SelectValue};
1
+ import{CheckIcon as e,ChevronDownIcon as t}from"../icons/icons.mjs";import{cn as n}from"../lib/cn.mjs";import{Select as r}from"radix-ui";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o(e){return/* @__PURE__ */ i(r.Root,{"data-slot":`select`,...e})}function s(e){return/* @__PURE__ */ i(r.Group,{"data-slot":`select-group`,...e})}function c(e){return/* @__PURE__ */ i(r.Value,{"data-slot":`select-value`,...e})}function l({className:e,children:o,...s}){return/* @__PURE__ */ a(r.Trigger,{"data-slot":`select-trigger`,className:n(`flex h-7 cursor-pointer items-center justify-between gap-2 rounded border border-po-border bg-po-deep px-2.5 text-left text-base text-po-hi outline-none transition-colors hover:border-po-green/50 focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[placeholder]:text-po-faint *:data-[slot=select-value]:truncate`,e),...s,children:[o,/* @__PURE__ */ i(r.Icon,{asChild:!0,children:/* @__PURE__ */ i(t,{className:`h-3 w-3 shrink-0 text-po-faint`})})]})}function u({className:e,position:t=`popper`,sideOffset:a=4,children:o,...s}){return/* @__PURE__ */ i(r.Portal,{children:/* @__PURE__ */ i(r.Content,{"data-slot":`select-content`,position:t,sideOffset:a,className:n(`z-50 max-h-[320px] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded border border-po-border bg-po-panel shadow-xl outline-none data-[state=open]:animate-po-rise`,e),...s,children:/* @__PURE__ */ i(r.Viewport,{className:`p-1`,children:o})})})}function d({className:e,...t}){return/* @__PURE__ */ i(r.Label,{"data-slot":`select-label`,className:n(`px-2 py-1 text-sm font-semibold text-po-dim first-letter:uppercase`,e),...t})}function f({className:t,children:o,...s}){return/* @__PURE__ */ a(r.Item,{"data-slot":`select-item`,className:n(`relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-7 text-base text-po-hi outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-po-deep`,t),...s,children:[/* @__PURE__ */ i(`span`,{className:`pointer-events-none absolute left-2 flex h-3 w-3 items-center justify-center`,children:/* @__PURE__ */ i(r.ItemIndicator,{children:/* @__PURE__ */ i(e,{className:`h-3 w-3 text-po-green`})})}),/* @__PURE__ */ i(r.ItemText,{children:o})]})}function p({className:e,...t}){return/* @__PURE__ */ i(r.Separator,{"data-slot":`select-separator`,className:n(`my-1 h-px bg-po-border-soft`,e),...t})}export{o as Select,u as SelectContent,s as SelectGroup,f as SelectItem,d as SelectLabel,p as SelectSeparator,l as SelectTrigger,c as SelectValue};
2
2
  //# sourceMappingURL=Select.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.mjs","names":["Select","SelectPrimitive","Select$1","Select","props","SelectGroup","SelectValue","SelectTrigger","cn","className","children","ChevronDownIcon","SelectContent","SelectLabel","SelectItem","CheckIcon","SelectSeparator"],"sources":["../../../../../../src/components/Select.tsx"],"sourcesContent":["import { Select as SelectPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { CheckIcon, ChevronDownIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/**\n * A single choice from a list, on Radix rather than a native <select>: a\n * native one cannot be styled to the palette on every platform, and the\n * cockpit's model and mode pickers need the same surface a popover has.\n */\nexport function Select(props: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nexport function SelectGroup(props: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nexport function SelectValue(props: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nexport function SelectTrigger({ className, children, ...props }: ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n 'flex h-7 cursor-pointer items-center justify-between gap-2 rounded border border-doom-border bg-doom-deep px-2.5 text-left text-base text-doom-hi outline-none transition-colors hover:border-doom-green/50 focus-visible:ring-2 focus-visible:ring-doom-green/50 disabled:pointer-events-none disabled:opacity-40 data-[placeholder]:text-doom-faint *:data-[slot=select-value]:truncate',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"h-3 w-3 shrink-0 text-doom-faint\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectContent({\n className,\n position = 'popper',\n sideOffset = 4,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n position={position}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-h-[320px] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded border border-doom-border bg-doom-panel shadow-xl outline-none data-[state=open]:animate-doom-rise',\n className,\n )}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectLabel({ className, ...props }: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('px-2 py-1 text-sm font-semibold text-doom-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n\nexport function SelectItem({ className, children, ...props }: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n 'relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-7 text-base text-doom-hi outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-doom-deep',\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex h-3 w-3 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-3 w-3 text-doom-green\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nexport function SelectSeparator({ className, ...props }: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('my-1 h-px bg-doom-border-soft', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2LAWA,SAAgBA,EAAO,EAAoD,CACzE,MAAO,kBAACC,EAAgB,KAAjB,CAAsB,YAAU,SAAS,GAAIG,CAAQ,CAAA,CAC9D,CAEA,SAAgBC,EAAY,EAAqD,CAC/E,MAAO,kBAACJ,EAAgB,MAAjB,CAAuB,YAAU,eAAe,GAAIG,CAAQ,CAAA,CACrE,CAEA,SAAgBE,EAAY,EAAqD,CAC/E,MAAO,kBAACL,EAAgB,MAAjB,CAAuB,YAAU,eAAe,GAAIG,CAAQ,CAAA,CACrE,CAEA,SAAgBG,EAAc,CAAE,YAAW,WAAU,GAAGH,GAAyD,CAC/G,MACE,kBAACH,EAAgB,QAAjB,CACE,YAAU,iBACV,UAAWO,EACT,4XACAC,CACF,EACA,GAAIL,EANN,SAAA,CAQGM,EACD,kBAACT,EAAgB,KAAjB,CAAsB,QAAA,GACpB,SAAA,kBAACU,EAAD,CAAiB,UAAU,kCAAoC,CAAA,CAC3C,CAAA,CACC,GAE7B,CAEA,SAAgBC,EAAc,CAC5B,YACA,WAAW,SACX,aAAa,EACb,WACA,GAAGR,GAC8C,CACjD,MACE,kBAACH,EAAgB,OAAjB,CAAA,SACE,kBAACA,EAAgB,QAAjB,CACE,YAAU,iBACA,WACE,aACZ,UAAWO,EACT,0LACAC,CACF,EACA,GAAIL,EAEJ,SAAA,kBAACH,EAAgB,SAAjB,CAA0B,UAAU,MAAO,UAAmC,CAAA,CACvD,CAAA,CACH,CAAA,CAE5B,CAEA,SAAgBY,EAAY,CAAE,YAAW,GAAGT,GAAuD,CACjG,MACE,kBAACH,EAAgB,MAAjB,CACE,YAAU,eACV,UAAWO,EAAG,uEAAwEC,CAAS,EAC/F,GAAIL,CACL,CAAA,CAEL,CAEA,SAAgBU,EAAW,CAAE,YAAW,WAAU,GAAGV,GAAsD,CACzG,MACE,kBAACH,EAAgB,KAAjB,CACE,YAAU,cACV,UAAWO,EACT,6NACAC,CACF,EACA,GAAIL,EANN,SAAA,CAQE,kBAAC,OAAD,CAAM,UAAU,+EACd,SAAA,kBAACH,EAAgB,cAAjB,CAAA,SACE,kBAACc,EAAD,CAAW,UAAU,yBAA2B,CAAA,CACnB,CAAA,CAC3B,CAAA,EACN,kBAACd,EAAgB,SAAjB,CAA2B,UAAmC,CAAA,CAC1C,GAE1B,CAEA,SAAgBe,EAAgB,CAAE,YAAW,GAAGZ,GAA2D,CACzG,MACE,kBAACH,EAAgB,UAAjB,CACE,YAAU,mBACV,UAAWO,EAAG,gCAAiCC,CAAS,EACxD,GAAIL,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Select.mjs","names":["Select","SelectPrimitive","Select$1","Select","props","SelectGroup","SelectValue","SelectTrigger","cn","className","children","ChevronDownIcon","SelectContent","SelectLabel","SelectItem","CheckIcon","SelectSeparator"],"sources":["../../../../../../src/components/Select.tsx"],"sourcesContent":["import { Select as SelectPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { CheckIcon, ChevronDownIcon } from '../icons/icons';\nimport { cn } from '../lib/cn';\n\n/**\n * A single choice from a list, on Radix rather than a native <select>: a\n * native one cannot be styled to the palette on every platform, and the\n * cockpit's model and mode pickers need the same surface a popover has.\n */\nexport function Select(props: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nexport function SelectGroup(props: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nexport function SelectValue(props: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nexport function SelectTrigger({ className, children, ...props }: ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n 'flex h-7 cursor-pointer items-center justify-between gap-2 rounded border border-po-border bg-po-deep px-2.5 text-left text-base text-po-hi outline-none transition-colors hover:border-po-green/50 focus-visible:ring-2 focus-visible:ring-po-green/50 disabled:pointer-events-none disabled:opacity-40 data-[placeholder]:text-po-faint *:data-[slot=select-value]:truncate',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"h-3 w-3 shrink-0 text-po-faint\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectContent({\n className,\n position = 'popper',\n sideOffset = 4,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n position={position}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-h-[320px] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded border border-po-border bg-po-panel shadow-xl outline-none data-[state=open]:animate-po-rise',\n className,\n )}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectLabel({ className, ...props }: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('px-2 py-1 text-sm font-semibold text-po-dim first-letter:uppercase', className)}\n {...props}\n />\n );\n}\n\nexport function SelectItem({ className, children, ...props }: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n 'relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-7 text-base text-po-hi outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-po-deep',\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex h-3 w-3 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-3 w-3 text-po-green\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nexport function SelectSeparator({ className, ...props }: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('my-1 h-px bg-po-border-soft', className)}\n {...props}\n />\n );\n}\n"],"mappings":"2LAWA,SAAgBA,EAAO,EAAoD,CACzE,MAAO,kBAACC,EAAgB,KAAjB,CAAsB,YAAU,SAAS,GAAIG,CAAQ,CAAA,CAC9D,CAEA,SAAgBC,EAAY,EAAqD,CAC/E,MAAO,kBAACJ,EAAgB,MAAjB,CAAuB,YAAU,eAAe,GAAIG,CAAQ,CAAA,CACrE,CAEA,SAAgBE,EAAY,EAAqD,CAC/E,MAAO,kBAACL,EAAgB,MAAjB,CAAuB,YAAU,eAAe,GAAIG,CAAQ,CAAA,CACrE,CAEA,SAAgBG,EAAc,CAAE,YAAW,WAAU,GAAGH,GAAyD,CAC/G,MACE,kBAACH,EAAgB,QAAjB,CACE,YAAU,iBACV,UAAWO,EACT,gXACAC,CACF,EACA,GAAIL,EANN,SAAA,CAQGM,EACD,kBAACT,EAAgB,KAAjB,CAAsB,QAAA,GACpB,SAAA,kBAACU,EAAD,CAAiB,UAAU,gCAAkC,CAAA,CACzC,CAAA,CACC,GAE7B,CAEA,SAAgBC,EAAc,CAC5B,YACA,WAAW,SACX,aAAa,EACb,WACA,GAAGR,GAC8C,CACjD,MACE,kBAACH,EAAgB,OAAjB,CAAA,SACE,kBAACA,EAAgB,QAAjB,CACE,YAAU,iBACA,WACE,aACZ,UAAWO,EACT,oLACAC,CACF,EACA,GAAIL,EAEJ,SAAA,kBAACH,EAAgB,SAAjB,CAA0B,UAAU,MAAO,UAAmC,CAAA,CACvD,CAAA,CACH,CAAA,CAE5B,CAEA,SAAgBY,EAAY,CAAE,YAAW,GAAGT,GAAuD,CACjG,MACE,kBAACH,EAAgB,MAAjB,CACE,YAAU,eACV,UAAWO,EAAG,qEAAsEC,CAAS,EAC7F,GAAIL,CACL,CAAA,CAEL,CAEA,SAAgBU,EAAW,CAAE,YAAW,WAAU,GAAGV,GAAsD,CACzG,MACE,kBAACH,EAAgB,KAAjB,CACE,YAAU,cACV,UAAWO,EACT,yNACAC,CACF,EACA,GAAIL,EANN,SAAA,CAQE,kBAAC,OAAD,CAAM,UAAU,+EACd,SAAA,kBAACH,EAAgB,cAAjB,CAAA,SACE,kBAACc,EAAD,CAAW,UAAU,uBAAyB,CAAA,CACjB,CAAA,CAC3B,CAAA,EACN,kBAACd,EAAgB,SAAjB,CAA2B,UAAmC,CAAA,CAC1C,GAE1B,CAEA,SAAgBe,EAAgB,CAAE,YAAW,GAAGZ,GAA2D,CACzG,MACE,kBAACH,EAAgB,UAAjB,CACE,YAAU,mBACV,UAAWO,EAAG,8BAA+BC,CAAS,EACtD,GAAIL,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Separator as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,orientation:i=`horizontal`,decorative:a=!0,...o}){return/* @__PURE__ */ n(t.Root,{"data-slot":`separator`,orientation:i,decorative:a,className:e(`shrink-0 bg-doom-border-soft`,i===`vertical`?`h-full w-px`:`h-px w-full`,r),...o})}export{r as Separator};
1
+ import{cn as e}from"../lib/cn.mjs";import{Separator as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function r({className:r,orientation:i=`horizontal`,decorative:a=!0,...o}){return/* @__PURE__ */ n(t.Root,{"data-slot":`separator`,orientation:i,decorative:a,className:e(`shrink-0 bg-po-border-soft`,i===`vertical`?`h-full w-px`:`h-px w-full`,r),...o})}export{r as Separator};
2
2
  //# sourceMappingURL=Separator.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Separator.mjs","names":["Separator","SeparatorPrimitive","Separator$1","props","Separator","cn","orientation","className"],"sources":["../../../../../../src/components/Separator.tsx"],"sourcesContent":["import { Separator as SeparatorPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * A hairline in the soft border colour. Radix decides the semantics: a\n * decorative rule is hidden from assistive tech, a meaningful one keeps its\n * separator role, and either way the element carries `data-orientation` so a\n * consumer can style around it the way it does every other primitive.\n */\nexport function Separator({\n className,\n orientation = 'horizontal',\n decorative = true,\n ...props\n}: ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n orientation={orientation}\n decorative={decorative}\n className={cn(\n 'shrink-0 bg-doom-border-soft',\n orientation === 'vertical' ? 'h-full w-px' : 'h-px w-full',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"gHAWA,SAAgBA,EAAU,CACxB,YACA,cAAc,aACd,aAAa,GACb,GAAGG,GAC8C,CACjD,MACE,kBAACF,EAAmB,KAApB,CACE,YAAU,YACG,cACD,aACZ,UAAWI,EACT,+BACAC,IAAgB,WAAa,cAAgB,cAC7CC,CACF,EACA,GAAIJ,CACL,CAAA,CAEL"}
1
+ {"version":3,"file":"Separator.mjs","names":["Separator","SeparatorPrimitive","Separator$1","props","Separator","cn","orientation","className"],"sources":["../../../../../../src/components/Separator.tsx"],"sourcesContent":["import { Separator as SeparatorPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/**\n * A hairline in the soft border colour. Radix decides the semantics: a\n * decorative rule is hidden from assistive tech, a meaningful one keeps its\n * separator role, and either way the element carries `data-orientation` so a\n * consumer can style around it the way it does every other primitive.\n */\nexport function Separator({\n className,\n orientation = 'horizontal',\n decorative = true,\n ...props\n}: ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n orientation={orientation}\n decorative={decorative}\n className={cn(\n 'shrink-0 bg-po-border-soft',\n orientation === 'vertical' ? 'h-full w-px' : 'h-px w-full',\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":"gHAWA,SAAgBA,EAAU,CACxB,YACA,cAAc,aACd,aAAa,GACb,GAAGG,GAC8C,CACjD,MACE,kBAACF,EAAmB,KAApB,CACE,YAAU,YACG,cACD,aACZ,UAAWI,EACT,6BACAC,IAAgB,WAAa,cAAgB,cAC7CC,CACF,EACA,GAAIJ,CACL,CAAA,CAEL"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../lib/cn.mjs";import{Panel as t}from"./Panel.mjs";import{Slot as n}from"radix-ui";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{createContext as a,useContext as o,useId as s}from"react";function c({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-page`,className:e(`flex min-w-0 flex-col gap-10`,t),...n})}function l({className:t,...n}){return/* @__PURE__ */ r(`header`,{"data-slot":`settings-header`,className:e(`flex min-w-0 flex-col gap-2`,t),...n})}function u({className:t,children:n,...i}){return/* @__PURE__ */ r(`h2`,{"data-slot":`settings-title`,className:e(`text-2xl font-semibold text-doom-hi first-letter:uppercase`,t),...i,children:n})}function d({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-description`,className:e(`max-w-[60ch] text-base leading-relaxed text-doom-dim first-letter:uppercase`,t),...n})}const f=a(void 0);function p({className:t,...n}){let i=s();return/* @__PURE__ */ r(f.Provider,{value:i,children:/* @__PURE__ */ r(`section`,{"data-slot":`settings-section`,"aria-labelledby":i,className:e(`flex min-w-0 flex-col gap-4`,t),...n})})}function m({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-section-header`,className:e(`grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-end gap-x-4 gap-y-1`,t),...n})}function h({className:t,children:n,...i}){let a=o(f);return/* @__PURE__ */ r(`h3`,{"data-slot":`settings-section-title`,id:a,className:e(`text-lg font-semibold text-doom-hi first-letter:uppercase`,t),...i,children:n})}function g({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-section-description`,className:e(`col-span-full row-start-2 max-w-[60ch] text-sm leading-relaxed text-doom-dim first-letter:uppercase`,t),...n})}function _({className:n,...i}){return/* @__PURE__ */ r(t,{"data-slot":`settings-card`,className:e(`flex min-w-0 flex-col divide-y divide-doom-border-soft rounded-lg`,n),...i})}function v({className:t,asChild:i=!1,changed:a=!1,...o}){let s=i?n.Root:`div`;return/* @__PURE__ */ r(s,{"data-slot":`settings-row`,"data-changed":a||void 0,className:e(`relative flex min-w-0 flex-wrap items-center gap-x-6 gap-y-3 px-5 py-4`,a&&`before:absolute before:inset-y-4 before:left-0 before:w-0.5 before:rounded-r before:bg-doom-green`,t),...o})}function y({id:e,label:t,description:n,children:a,className:o,...s}){return/* @__PURE__ */ i(v,{className:o,...s,children:[/* @__PURE__ */ i(b,{children:[/* @__PURE__ */ r(x,{children:/* @__PURE__ */ r(`label`,{htmlFor:e,children:t})}),n===void 0?null:/* @__PURE__ */ r(S,{children:n})]}),/* @__PURE__ */ r(`div`,{"data-slot":`settings-field-control`,className:`w-full sm:w-72 [&>*]:w-full`,children:a})]})}function b({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-row-text`,className:e(`flex min-w-0 flex-1 flex-col gap-0.5`,t),...n})}function x({className:t,...n}){return/* @__PURE__ */ r(`span`,{"data-slot":`settings-row-title`,className:e(`block text-base font-medium text-doom-hi first-letter:uppercase`,t),...n})}function S({className:t,...n}){return/* @__PURE__ */ r(`span`,{"data-slot":`settings-row-description`,className:e(`block text-sm leading-relaxed text-doom-dim first-letter:uppercase`,t),...n})}function C({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-note`,className:e(`text-sm leading-relaxed text-doom-dim`,t),...n})}function w({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-actions`,className:e(`flex flex-wrap items-center gap-2`,t),...n})}export{w as SettingsActions,_ as SettingsCard,d as SettingsDescription,y as SettingsField,l as SettingsHeader,C as SettingsNote,c as SettingsPage,v as SettingsRow,S as SettingsRowDescription,b as SettingsRowText,x as SettingsRowTitle,p as SettingsSection,g as SettingsSectionDescription,m as SettingsSectionHeader,h as SettingsSectionTitle,u as SettingsTitle};
1
+ import{cn as e}from"../lib/cn.mjs";import{Panel as t}from"./Panel.mjs";import{Slot as n}from"radix-ui";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{createContext as a,useContext as o,useId as s}from"react";function c({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-page`,className:e(`flex min-w-0 flex-col gap-10`,t),...n})}function l({className:t,...n}){return/* @__PURE__ */ r(`header`,{"data-slot":`settings-header`,className:e(`flex min-w-0 flex-col gap-2`,t),...n})}function u({className:t,children:n,...i}){return/* @__PURE__ */ r(`h2`,{"data-slot":`settings-title`,className:e(`text-2xl font-semibold text-po-hi first-letter:uppercase`,t),...i,children:n})}function d({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-description`,className:e(`max-w-[60ch] text-base leading-relaxed text-po-dim first-letter:uppercase`,t),...n})}const f=a(void 0);function p({className:t,...n}){let i=s();return/* @__PURE__ */ r(f.Provider,{value:i,children:/* @__PURE__ */ r(`section`,{"data-slot":`settings-section`,"aria-labelledby":i,className:e(`flex min-w-0 flex-col gap-4`,t),...n})})}function m({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-section-header`,className:e(`grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-end gap-x-4 gap-y-1`,t),...n})}function h({className:t,children:n,...i}){let a=o(f);return/* @__PURE__ */ r(`h3`,{"data-slot":`settings-section-title`,id:a,className:e(`text-lg font-semibold text-po-hi first-letter:uppercase`,t),...i,children:n})}function g({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-section-description`,className:e(`col-span-full row-start-2 max-w-[60ch] text-sm leading-relaxed text-po-dim first-letter:uppercase`,t),...n})}function _({className:n,...i}){return/* @__PURE__ */ r(t,{"data-slot":`settings-card`,className:e(`flex min-w-0 flex-col divide-y divide-po-border-soft rounded-lg`,n),...i})}function v({className:t,asChild:i=!1,changed:a=!1,...o}){let s=i?n.Root:`div`;return/* @__PURE__ */ r(s,{"data-slot":`settings-row`,"data-changed":a||void 0,className:e(`relative flex min-w-0 flex-wrap items-center gap-x-6 gap-y-3 px-5 py-4`,a&&`before:absolute before:inset-y-4 before:left-0 before:w-0.5 before:rounded-r before:bg-po-green`,t),...o})}function y({id:e,label:t,description:n,children:a,className:o,...s}){return/* @__PURE__ */ i(v,{className:o,...s,children:[/* @__PURE__ */ i(b,{children:[/* @__PURE__ */ r(x,{children:/* @__PURE__ */ r(`label`,{htmlFor:e,children:t})}),n===void 0?null:/* @__PURE__ */ r(S,{children:n})]}),/* @__PURE__ */ r(`div`,{"data-slot":`settings-field-control`,className:`w-full sm:w-72 [&>*]:w-full`,children:a})]})}function b({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-row-text`,className:e(`flex min-w-0 flex-1 flex-col gap-0.5`,t),...n})}function x({className:t,...n}){return/* @__PURE__ */ r(`span`,{"data-slot":`settings-row-title`,className:e(`block text-base font-medium text-po-hi first-letter:uppercase`,t),...n})}function S({className:t,...n}){return/* @__PURE__ */ r(`span`,{"data-slot":`settings-row-description`,className:e(`block text-sm leading-relaxed text-po-dim first-letter:uppercase`,t),...n})}function C({className:t,...n}){return/* @__PURE__ */ r(`p`,{"data-slot":`settings-note`,className:e(`text-sm leading-relaxed text-po-dim`,t),...n})}function w({className:t,...n}){return/* @__PURE__ */ r(`div`,{"data-slot":`settings-actions`,className:e(`flex flex-wrap items-center gap-2`,t),...n})}export{w as SettingsActions,_ as SettingsCard,d as SettingsDescription,y as SettingsField,l as SettingsHeader,C as SettingsNote,c as SettingsPage,v as SettingsRow,S as SettingsRowDescription,b as SettingsRowText,x as SettingsRowTitle,p as SettingsSection,g as SettingsSectionDescription,m as SettingsSectionHeader,h as SettingsSectionTitle,u as SettingsTitle};
2
2
  //# sourceMappingURL=Settings.mjs.map