@jini-ai/ui 0.1.2 → 0.3.0

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 (1417) hide show
  1. package/README.md +108 -18
  2. package/dist/browser/useDismissOnOutsideOrEscape.d.ts.map +1 -1
  3. package/dist/browser/useDismissOnOutsideOrEscape.js +3 -2
  4. package/dist/browser/useDismissOnOutsideOrEscape.js.map +1 -1
  5. package/dist/browser/useGlobalKeydown.js +1 -1
  6. package/dist/browser/useGlobalKeydown.js.map +1 -1
  7. package/dist/core.d.ts +69 -0
  8. package/dist/core.d.ts.map +1 -0
  9. package/dist/core.js +66 -0
  10. package/dist/core.js.map +1 -0
  11. package/dist/features/a2ui/catalog-from-registry.d.ts +30 -0
  12. package/dist/features/a2ui/catalog-from-registry.d.ts.map +1 -0
  13. package/dist/features/a2ui/catalog-from-registry.js +25 -0
  14. package/dist/features/a2ui/catalog-from-registry.js.map +1 -0
  15. package/dist/features/a2ui/index.d.ts +5 -0
  16. package/dist/features/a2ui/index.d.ts.map +1 -0
  17. package/dist/features/a2ui/index.js +5 -0
  18. package/dist/features/a2ui/index.js.map +1 -0
  19. package/dist/features/a2ui/protocol.d.ts +7 -0
  20. package/dist/features/a2ui/protocol.d.ts.map +1 -0
  21. package/dist/features/a2ui/protocol.js +7 -0
  22. package/dist/features/a2ui/protocol.js.map +1 -0
  23. package/dist/features/a2ui/renderer.d.ts +17 -0
  24. package/dist/features/a2ui/renderer.d.ts.map +1 -0
  25. package/dist/features/a2ui/renderer.js +80 -0
  26. package/dist/features/a2ui/renderer.js.map +1 -0
  27. package/dist/features/a2ui/use-a2ui-surface.d.ts +13 -0
  28. package/dist/features/a2ui/use-a2ui-surface.d.ts.map +1 -0
  29. package/dist/features/a2ui/use-a2ui-surface.js +17 -0
  30. package/dist/features/a2ui/use-a2ui-surface.js.map +1 -0
  31. package/dist/features/about/index.d.ts +7 -0
  32. package/dist/features/about/index.d.ts.map +1 -0
  33. package/dist/features/about/index.js +4 -0
  34. package/dist/features/about/index.js.map +1 -0
  35. package/dist/features/about/react/components/AboutTab.d.ts +82 -0
  36. package/dist/features/about/react/components/AboutTab.d.ts.map +1 -0
  37. package/dist/features/about/react/components/AboutTab.js +70 -0
  38. package/dist/features/about/react/components/AboutTab.js.map +1 -0
  39. package/dist/features/about/react/hooks/useSilentUpdatesToggle.d.ts +44 -0
  40. package/dist/features/about/react/hooks/useSilentUpdatesToggle.d.ts.map +1 -0
  41. package/dist/features/about/react/hooks/useSilentUpdatesToggle.js +44 -0
  42. package/dist/features/about/react/hooks/useSilentUpdatesToggle.js.map +1 -0
  43. package/dist/features/about/rules.d.ts +105 -0
  44. package/dist/features/about/rules.d.ts.map +1 -0
  45. package/dist/features/about/rules.js +240 -0
  46. package/dist/features/about/rules.js.map +1 -0
  47. package/dist/features/about/types.d.ts +110 -0
  48. package/dist/features/about/types.d.ts.map +1 -0
  49. package/dist/features/about/types.js +20 -0
  50. package/dist/features/about/types.js.map +1 -0
  51. package/dist/features/appearance/constants.d.ts +16 -0
  52. package/dist/features/appearance/constants.d.ts.map +1 -0
  53. package/dist/features/appearance/constants.js +23 -0
  54. package/dist/features/appearance/constants.js.map +1 -0
  55. package/dist/features/appearance/index.d.ts +5 -0
  56. package/dist/features/appearance/index.d.ts.map +1 -0
  57. package/dist/features/appearance/index.js.map +1 -0
  58. package/dist/features/appearance/react/components/AppearanceTab.d.ts.map +1 -0
  59. package/dist/features/appearance/react/components/AppearanceTab.js +31 -0
  60. package/dist/features/appearance/react/components/AppearanceTab.js.map +1 -0
  61. package/dist/features/appearance/rules.d.ts +31 -0
  62. package/dist/features/appearance/rules.d.ts.map +1 -0
  63. package/dist/features/appearance/rules.js +45 -0
  64. package/dist/features/appearance/rules.js.map +1 -0
  65. package/dist/features/appearance/types.d.ts +12 -0
  66. package/dist/features/appearance/types.d.ts.map +1 -0
  67. package/dist/features/appearance/types.js +8 -0
  68. package/dist/features/appearance/types.js.map +1 -0
  69. package/dist/features/asset-grid/react/components/AssetGrid.d.ts.map +1 -1
  70. package/dist/features/asset-grid/react/components/AssetGrid.js +44 -9
  71. package/dist/features/asset-grid/react/components/AssetGrid.js.map +1 -1
  72. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.d.ts.map +1 -1
  73. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.js +39 -2
  74. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.js.map +1 -1
  75. package/dist/features/asset-tree-browser/rules.d.ts +1 -0
  76. package/dist/features/asset-tree-browser/rules.d.ts.map +1 -1
  77. package/dist/features/asset-tree-browser/rules.js.map +1 -1
  78. package/dist/features/connectors/ConnectorsBrowser.d.ts.map +1 -1
  79. package/dist/features/connectors/ConnectorsBrowser.js +2 -2
  80. package/dist/features/connectors/ConnectorsBrowser.js.map +1 -1
  81. package/dist/features/connectors/components/ConnectorCard.d.ts.map +1 -1
  82. package/dist/features/connectors/components/ConnectorCard.js.map +1 -1
  83. package/dist/features/connectors/components/ConnectorDetailDrawer.d.ts.map +1 -1
  84. package/dist/features/connectors/components/ConnectorDetailDrawer.js.map +1 -1
  85. package/dist/features/connectors/dependencies.d.ts +1 -1
  86. package/dist/features/connectors/dependencies.d.ts.map +1 -1
  87. package/dist/features/connectors/dependencies.js +1 -2
  88. package/dist/features/connectors/dependencies.js.map +1 -1
  89. package/dist/features/connectors/hooks/useConnectorAuthorization.d.ts +38 -0
  90. package/dist/features/connectors/hooks/useConnectorAuthorization.d.ts.map +1 -1
  91. package/dist/features/connectors/hooks/useConnectorAuthorization.js +76 -63
  92. package/dist/features/connectors/hooks/useConnectorAuthorization.js.map +1 -1
  93. package/dist/features/connectors/hooks/useConnectorCatalog.d.ts.map +1 -1
  94. package/dist/features/connectors/hooks/useConnectorCatalog.js.map +1 -1
  95. package/dist/features/connectors/hooks/useConnectorDetail.d.ts.map +1 -1
  96. package/dist/features/connectors/hooks/useConnectorDetail.js +1 -1
  97. package/dist/features/connectors/hooks/useConnectorDetail.js.map +1 -1
  98. package/dist/features/connectors/index.d.ts +4 -4
  99. package/dist/features/connectors/index.d.ts.map +1 -1
  100. package/dist/features/connectors/index.js +2 -2
  101. package/dist/features/connectors/index.js.map +1 -1
  102. package/dist/features/execution/constants.d.ts +55 -0
  103. package/dist/features/execution/constants.d.ts.map +1 -0
  104. package/dist/features/execution/constants.js +187 -0
  105. package/dist/features/execution/constants.js.map +1 -0
  106. package/dist/features/execution/dependencies.d.ts +41 -0
  107. package/dist/features/execution/dependencies.d.ts.map +1 -0
  108. package/dist/features/execution/dependencies.js +64 -0
  109. package/dist/features/execution/dependencies.js.map +1 -0
  110. package/dist/features/execution/index.d.ts +24 -0
  111. package/dist/features/execution/index.d.ts.map +1 -0
  112. package/dist/features/execution/index.js +13 -0
  113. package/dist/features/execution/index.js.map +1 -0
  114. package/dist/features/execution/ports.d.ts +71 -0
  115. package/dist/features/execution/ports.d.ts.map +1 -0
  116. package/dist/features/execution/ports.js.map +1 -0
  117. package/dist/features/execution/react/components/AgentCliEnvFields.d.ts +26 -0
  118. package/dist/features/execution/react/components/AgentCliEnvFields.d.ts.map +1 -0
  119. package/dist/features/execution/react/components/AgentCliEnvFields.js +25 -0
  120. package/dist/features/execution/react/components/AgentCliEnvFields.js.map +1 -0
  121. package/dist/features/execution/react/components/AgentDiagnosticRow.d.ts +32 -0
  122. package/dist/features/execution/react/components/AgentDiagnosticRow.d.ts.map +1 -0
  123. package/dist/features/execution/react/components/AgentDiagnosticRow.js +61 -0
  124. package/dist/features/execution/react/components/AgentDiagnosticRow.js.map +1 -0
  125. package/dist/features/execution/react/components/ByokProviderForm.d.ts +73 -0
  126. package/dist/features/execution/react/components/ByokProviderForm.d.ts.map +1 -0
  127. package/dist/features/execution/react/components/ByokProviderForm.js +88 -0
  128. package/dist/features/execution/react/components/ByokProviderForm.js.map +1 -0
  129. package/dist/features/execution/react/components/ExecutionTab.d.ts +60 -0
  130. package/dist/features/execution/react/components/ExecutionTab.d.ts.map +1 -0
  131. package/dist/features/execution/react/components/ExecutionTab.js +91 -0
  132. package/dist/features/execution/react/components/ExecutionTab.js.map +1 -0
  133. package/dist/features/execution/react/components/LocalCliAgentCard.d.ts +40 -0
  134. package/dist/features/execution/react/components/LocalCliAgentCard.d.ts.map +1 -0
  135. package/dist/features/execution/react/components/LocalCliAgentCard.js +121 -0
  136. package/dist/features/execution/react/components/LocalCliAgentCard.js.map +1 -0
  137. package/dist/features/execution/react/components/LocalCliAgentList.d.ts +37 -0
  138. package/dist/features/execution/react/components/LocalCliAgentList.d.ts.map +1 -0
  139. package/dist/features/execution/react/components/LocalCliAgentList.js +18 -0
  140. package/dist/features/execution/react/components/LocalCliAgentList.js.map +1 -0
  141. package/dist/features/execution/react/components/ProviderChipGroup.d.ts +21 -0
  142. package/dist/features/execution/react/components/ProviderChipGroup.d.ts.map +1 -0
  143. package/dist/features/execution/react/components/ProviderChipGroup.js +22 -0
  144. package/dist/features/execution/react/components/ProviderChipGroup.js.map +1 -0
  145. package/dist/features/execution/react/components/SearchableModelSelect.d.ts +45 -0
  146. package/dist/features/execution/react/components/SearchableModelSelect.d.ts.map +1 -0
  147. package/dist/features/execution/react/components/SearchableModelSelect.js +55 -0
  148. package/dist/features/execution/react/components/SearchableModelSelect.js.map +1 -0
  149. package/dist/features/execution/react/hooks/useExecutionTab.d.ts +38 -0
  150. package/dist/features/execution/react/hooks/useExecutionTab.d.ts.map +1 -0
  151. package/dist/features/execution/react/hooks/useExecutionTab.js +158 -0
  152. package/dist/features/execution/react/hooks/useExecutionTab.js.map +1 -0
  153. package/dist/features/execution/rules.d.ts +218 -0
  154. package/dist/features/execution/rules.d.ts.map +1 -0
  155. package/dist/features/execution/rules.js +414 -0
  156. package/dist/features/execution/rules.js.map +1 -0
  157. package/dist/features/execution/types.d.ts +410 -0
  158. package/dist/features/execution/types.d.ts.map +1 -0
  159. package/dist/features/execution/types.js +19 -0
  160. package/dist/features/execution/types.js.map +1 -0
  161. package/dist/features/external-mcp/constants.d.ts +3 -0
  162. package/dist/features/external-mcp/constants.d.ts.map +1 -0
  163. package/dist/features/external-mcp/constants.js +22 -0
  164. package/dist/features/external-mcp/constants.js.map +1 -0
  165. package/dist/features/external-mcp/index.d.ts +4 -0
  166. package/dist/features/external-mcp/index.d.ts.map +1 -0
  167. package/dist/features/external-mcp/index.js +3 -0
  168. package/dist/features/external-mcp/index.js.map +1 -0
  169. package/dist/features/external-mcp/react/components/ExternalMcpTab.d.ts +23 -0
  170. package/dist/features/external-mcp/react/components/ExternalMcpTab.d.ts.map +1 -0
  171. package/dist/features/external-mcp/react/components/ExternalMcpTab.js +53 -0
  172. package/dist/features/external-mcp/react/components/ExternalMcpTab.js.map +1 -0
  173. package/dist/features/html-editor/canvas-content-wrapper.d.ts +16 -0
  174. package/dist/features/html-editor/canvas-content-wrapper.d.ts.map +1 -0
  175. package/dist/features/html-editor/canvas-content-wrapper.js +86 -0
  176. package/dist/features/html-editor/canvas-content-wrapper.js.map +1 -0
  177. package/dist/features/html-editor/canvas-embed-placeholders.d.ts +65 -0
  178. package/dist/features/html-editor/canvas-embed-placeholders.d.ts.map +1 -0
  179. package/dist/features/html-editor/canvas-embed-placeholders.js +190 -0
  180. package/dist/features/html-editor/canvas-embed-placeholders.js.map +1 -0
  181. package/dist/features/html-editor/canvas-style.d.ts +73 -0
  182. package/dist/features/html-editor/canvas-style.d.ts.map +1 -0
  183. package/dist/features/html-editor/canvas-style.js +64 -0
  184. package/dist/features/html-editor/canvas-style.js.map +1 -0
  185. package/dist/features/html-editor/css.d.ts +22 -0
  186. package/dist/features/html-editor/css.d.ts.map +1 -0
  187. package/dist/features/html-editor/css.js +140 -0
  188. package/dist/features/html-editor/css.js.map +1 -0
  189. package/dist/features/html-editor/dom.d.ts +15 -0
  190. package/dist/features/html-editor/dom.d.ts.map +1 -0
  191. package/dist/features/html-editor/dom.js +20 -0
  192. package/dist/features/html-editor/dom.js.map +1 -0
  193. package/dist/features/html-editor/index.d.ts +8 -0
  194. package/dist/features/html-editor/index.d.ts.map +1 -0
  195. package/dist/features/html-editor/index.js +5 -0
  196. package/dist/features/html-editor/index.js.map +1 -0
  197. package/dist/features/html-editor/react/components/InteractiveHtmlEditor.d.ts +94 -0
  198. package/dist/features/html-editor/react/components/InteractiveHtmlEditor.d.ts.map +1 -0
  199. package/dist/features/html-editor/react/components/InteractiveHtmlEditor.js +15 -0
  200. package/dist/features/html-editor/react/components/InteractiveHtmlEditor.js.map +1 -0
  201. package/dist/features/html-editor/react/hooks/useInteractiveHtmlEditor.d.ts +33 -0
  202. package/dist/features/html-editor/react/hooks/useInteractiveHtmlEditor.d.ts.map +1 -0
  203. package/dist/features/html-editor/react/hooks/useInteractiveHtmlEditor.js +170 -0
  204. package/dist/features/html-editor/react/hooks/useInteractiveHtmlEditor.js.map +1 -0
  205. package/dist/features/html-viewer/dependencies.d.ts +1 -1
  206. package/dist/features/html-viewer/dependencies.d.ts.map +1 -1
  207. package/dist/features/html-viewer/dependencies.js +2 -2
  208. package/dist/features/html-viewer/dependencies.js.map +1 -1
  209. package/dist/features/html-viewer/react/hooks/useDeckNavigation.d.ts +2 -2
  210. package/dist/features/html-viewer/react/hooks/useDeckNavigation.js +3 -3
  211. package/dist/features/html-viewer/react/hooks/useDeckNavigation.js.map +1 -1
  212. package/dist/features/i18n/context.d.ts +35 -2
  213. package/dist/features/i18n/context.d.ts.map +1 -1
  214. package/dist/features/i18n/context.js +1 -1
  215. package/dist/features/i18n/context.js.map +1 -1
  216. package/dist/features/i18n/dictionaries/index.d.ts +63 -0
  217. package/dist/features/i18n/dictionaries/index.d.ts.map +1 -0
  218. package/dist/features/i18n/dictionaries/index.js +70 -0
  219. package/dist/features/i18n/dictionaries/index.js.map +1 -0
  220. package/dist/features/i18n/dictionaries/settings-dialog.ar.d.ts +8 -0
  221. package/dist/features/i18n/dictionaries/settings-dialog.ar.d.ts.map +1 -0
  222. package/dist/features/i18n/dictionaries/settings-dialog.ar.js +239 -0
  223. package/dist/features/i18n/dictionaries/settings-dialog.ar.js.map +1 -0
  224. package/dist/features/i18n/dictionaries/settings-dialog.bn.d.ts +8 -0
  225. package/dist/features/i18n/dictionaries/settings-dialog.bn.d.ts.map +1 -0
  226. package/dist/features/i18n/dictionaries/settings-dialog.bn.js +239 -0
  227. package/dist/features/i18n/dictionaries/settings-dialog.bn.js.map +1 -0
  228. package/dist/features/i18n/dictionaries/settings-dialog.de.d.ts +17 -0
  229. package/dist/features/i18n/dictionaries/settings-dialog.de.d.ts.map +1 -0
  230. package/dist/features/i18n/dictionaries/settings-dialog.de.js +239 -0
  231. package/dist/features/i18n/dictionaries/settings-dialog.de.js.map +1 -0
  232. package/dist/features/i18n/dictionaries/settings-dialog.en.d.ts +33 -0
  233. package/dist/features/i18n/dictionaries/settings-dialog.en.d.ts.map +1 -0
  234. package/dist/features/i18n/dictionaries/settings-dialog.en.js +239 -0
  235. package/dist/features/i18n/dictionaries/settings-dialog.en.js.map +1 -0
  236. package/dist/features/i18n/dictionaries/settings-dialog.es.d.ts +17 -0
  237. package/dist/features/i18n/dictionaries/settings-dialog.es.d.ts.map +1 -0
  238. package/dist/features/i18n/dictionaries/settings-dialog.es.js +239 -0
  239. package/dist/features/i18n/dictionaries/settings-dialog.es.js.map +1 -0
  240. package/dist/features/i18n/dictionaries/settings-dialog.fa.d.ts +8 -0
  241. package/dist/features/i18n/dictionaries/settings-dialog.fa.d.ts.map +1 -0
  242. package/dist/features/i18n/dictionaries/settings-dialog.fa.js +239 -0
  243. package/dist/features/i18n/dictionaries/settings-dialog.fa.js.map +1 -0
  244. package/dist/features/i18n/dictionaries/settings-dialog.fr.d.ts +17 -0
  245. package/dist/features/i18n/dictionaries/settings-dialog.fr.d.ts.map +1 -0
  246. package/dist/features/i18n/dictionaries/settings-dialog.fr.js +239 -0
  247. package/dist/features/i18n/dictionaries/settings-dialog.fr.js.map +1 -0
  248. package/dist/features/i18n/dictionaries/settings-dialog.hi.d.ts +8 -0
  249. package/dist/features/i18n/dictionaries/settings-dialog.hi.d.ts.map +1 -0
  250. package/dist/features/i18n/dictionaries/settings-dialog.hi.js +239 -0
  251. package/dist/features/i18n/dictionaries/settings-dialog.hi.js.map +1 -0
  252. package/dist/features/i18n/dictionaries/settings-dialog.hu.d.ts +8 -0
  253. package/dist/features/i18n/dictionaries/settings-dialog.hu.d.ts.map +1 -0
  254. package/dist/features/i18n/dictionaries/settings-dialog.hu.js +239 -0
  255. package/dist/features/i18n/dictionaries/settings-dialog.hu.js.map +1 -0
  256. package/dist/features/i18n/dictionaries/settings-dialog.id.d.ts +17 -0
  257. package/dist/features/i18n/dictionaries/settings-dialog.id.d.ts.map +1 -0
  258. package/dist/features/i18n/dictionaries/settings-dialog.id.js +239 -0
  259. package/dist/features/i18n/dictionaries/settings-dialog.id.js.map +1 -0
  260. package/dist/features/i18n/dictionaries/settings-dialog.it.d.ts +17 -0
  261. package/dist/features/i18n/dictionaries/settings-dialog.it.d.ts.map +1 -0
  262. package/dist/features/i18n/dictionaries/settings-dialog.it.js +239 -0
  263. package/dist/features/i18n/dictionaries/settings-dialog.it.js.map +1 -0
  264. package/dist/features/i18n/dictionaries/settings-dialog.ja.d.ts +8 -0
  265. package/dist/features/i18n/dictionaries/settings-dialog.ja.d.ts.map +1 -0
  266. package/dist/features/i18n/dictionaries/settings-dialog.ja.js +239 -0
  267. package/dist/features/i18n/dictionaries/settings-dialog.ja.js.map +1 -0
  268. package/dist/features/i18n/dictionaries/settings-dialog.ko.d.ts +8 -0
  269. package/dist/features/i18n/dictionaries/settings-dialog.ko.d.ts.map +1 -0
  270. package/dist/features/i18n/dictionaries/settings-dialog.ko.js +239 -0
  271. package/dist/features/i18n/dictionaries/settings-dialog.ko.js.map +1 -0
  272. package/dist/features/i18n/dictionaries/settings-dialog.pl.d.ts +8 -0
  273. package/dist/features/i18n/dictionaries/settings-dialog.pl.d.ts.map +1 -0
  274. package/dist/features/i18n/dictionaries/settings-dialog.pl.js +239 -0
  275. package/dist/features/i18n/dictionaries/settings-dialog.pl.js.map +1 -0
  276. package/dist/features/i18n/dictionaries/settings-dialog.pt-BR.d.ts +8 -0
  277. package/dist/features/i18n/dictionaries/settings-dialog.pt-BR.d.ts.map +1 -0
  278. package/dist/features/i18n/dictionaries/settings-dialog.pt-BR.js +239 -0
  279. package/dist/features/i18n/dictionaries/settings-dialog.pt-BR.js.map +1 -0
  280. package/dist/features/i18n/dictionaries/settings-dialog.ru.d.ts +8 -0
  281. package/dist/features/i18n/dictionaries/settings-dialog.ru.d.ts.map +1 -0
  282. package/dist/features/i18n/dictionaries/settings-dialog.ru.js +239 -0
  283. package/dist/features/i18n/dictionaries/settings-dialog.ru.js.map +1 -0
  284. package/dist/features/i18n/dictionaries/settings-dialog.th.d.ts +17 -0
  285. package/dist/features/i18n/dictionaries/settings-dialog.th.d.ts.map +1 -0
  286. package/dist/features/i18n/dictionaries/settings-dialog.th.js +239 -0
  287. package/dist/features/i18n/dictionaries/settings-dialog.th.js.map +1 -0
  288. package/dist/features/i18n/dictionaries/settings-dialog.tr.d.ts +17 -0
  289. package/dist/features/i18n/dictionaries/settings-dialog.tr.d.ts.map +1 -0
  290. package/dist/features/i18n/dictionaries/settings-dialog.tr.js +239 -0
  291. package/dist/features/i18n/dictionaries/settings-dialog.tr.js.map +1 -0
  292. package/dist/features/i18n/dictionaries/settings-dialog.uk.d.ts +17 -0
  293. package/dist/features/i18n/dictionaries/settings-dialog.uk.d.ts.map +1 -0
  294. package/dist/features/i18n/dictionaries/settings-dialog.uk.js +239 -0
  295. package/dist/features/i18n/dictionaries/settings-dialog.uk.js.map +1 -0
  296. package/dist/features/i18n/dictionaries/settings-dialog.ur.d.ts +8 -0
  297. package/dist/features/i18n/dictionaries/settings-dialog.ur.d.ts.map +1 -0
  298. package/dist/features/i18n/dictionaries/settings-dialog.ur.js +239 -0
  299. package/dist/features/i18n/dictionaries/settings-dialog.ur.js.map +1 -0
  300. package/dist/features/i18n/dictionaries/settings-dialog.zh-CN.d.ts +17 -0
  301. package/dist/features/i18n/dictionaries/settings-dialog.zh-CN.d.ts.map +1 -0
  302. package/dist/features/i18n/dictionaries/settings-dialog.zh-CN.js +239 -0
  303. package/dist/features/i18n/dictionaries/settings-dialog.zh-CN.js.map +1 -0
  304. package/dist/features/i18n/dictionaries/settings-dialog.zh-TW.d.ts +20 -0
  305. package/dist/features/i18n/dictionaries/settings-dialog.zh-TW.d.ts.map +1 -0
  306. package/dist/features/i18n/dictionaries/settings-dialog.zh-TW.js +239 -0
  307. package/dist/features/i18n/dictionaries/settings-dialog.zh-TW.js.map +1 -0
  308. package/dist/features/i18n/dictionaries/types.d.ts +16 -0
  309. package/dist/features/i18n/dictionaries/types.d.ts.map +1 -0
  310. package/dist/features/i18n/dictionaries/types.js.map +1 -0
  311. package/dist/features/i18n/index.d.ts +2 -0
  312. package/dist/features/i18n/index.d.ts.map +1 -1
  313. package/dist/features/i18n/index.js +1 -0
  314. package/dist/features/i18n/index.js.map +1 -1
  315. package/dist/features/iframe-pool/react/components/PooledIframe.d.ts.map +1 -1
  316. package/dist/features/iframe-pool/react/components/PooledIframe.js +27 -3
  317. package/dist/features/iframe-pool/react/components/PooledIframe.js.map +1 -1
  318. package/dist/features/instructions/index.d.ts.map +1 -0
  319. package/dist/features/instructions/index.js.map +1 -0
  320. package/dist/features/instructions/react/components/InstructionsTab.d.ts.map +1 -0
  321. package/dist/features/instructions/react/components/InstructionsTab.js +16 -0
  322. package/dist/features/instructions/react/components/InstructionsTab.js.map +1 -0
  323. package/dist/features/integrations/constants.d.ts.map +1 -0
  324. package/dist/features/integrations/constants.js.map +1 -0
  325. package/dist/features/integrations/dependencies.d.ts.map +1 -0
  326. package/dist/features/integrations/dependencies.js.map +1 -0
  327. package/dist/features/integrations/index.d.ts +18 -0
  328. package/dist/features/integrations/index.d.ts.map +1 -0
  329. package/dist/features/integrations/index.js +10 -0
  330. package/dist/features/integrations/index.js.map +1 -0
  331. package/dist/features/integrations/ports.d.ts.map +1 -0
  332. package/dist/features/integrations/ports.js +2 -0
  333. package/dist/features/integrations/ports.js.map +1 -0
  334. package/dist/features/integrations/react/components/ClientPicker.d.ts.map +1 -0
  335. package/dist/features/integrations/react/components/ClientPicker.js +31 -0
  336. package/dist/features/integrations/react/components/ClientPicker.js.map +1 -0
  337. package/dist/features/integrations/react/components/CodexInstallToggleButton.d.ts.map +1 -0
  338. package/dist/features/integrations/react/components/CodexInstallToggleButton.js +21 -0
  339. package/dist/features/integrations/react/components/CodexInstallToggleButton.js.map +1 -0
  340. package/dist/features/integrations/react/components/IntegrationsTab.d.ts +27 -0
  341. package/dist/features/integrations/react/components/IntegrationsTab.d.ts.map +1 -0
  342. package/dist/features/integrations/react/components/IntegrationsTab.js +61 -0
  343. package/dist/features/integrations/react/components/IntegrationsTab.js.map +1 -0
  344. package/dist/features/integrations/react/components/SnippetBlock.d.ts.map +1 -0
  345. package/dist/features/integrations/react/components/SnippetBlock.js +53 -0
  346. package/dist/features/integrations/react/components/SnippetBlock.js.map +1 -0
  347. package/dist/features/integrations/react/hooks/useCodexInstallToggle.d.ts.map +1 -0
  348. package/dist/features/integrations/react/hooks/useCodexInstallToggle.js.map +1 -0
  349. package/dist/features/integrations/react/hooks/useMcpInstallInfo.d.ts.map +1 -0
  350. package/dist/features/integrations/react/hooks/useMcpInstallInfo.js.map +1 -0
  351. package/dist/features/integrations/rules.d.ts +55 -0
  352. package/dist/features/integrations/rules.d.ts.map +1 -0
  353. package/dist/features/integrations/rules.js +193 -0
  354. package/dist/features/integrations/rules.js.map +1 -0
  355. package/dist/features/integrations/types.d.ts +58 -0
  356. package/dist/features/integrations/types.d.ts.map +1 -0
  357. package/dist/features/integrations/types.js +15 -0
  358. package/dist/features/integrations/types.js.map +1 -0
  359. package/dist/features/interactive-ui/index.d.ts +23 -0
  360. package/dist/features/interactive-ui/index.d.ts.map +1 -0
  361. package/dist/features/interactive-ui/index.js +37 -0
  362. package/dist/features/interactive-ui/index.js.map +1 -0
  363. package/dist/features/interactive-ui/interactive-ui.css +2 -0
  364. package/dist/features/interactive-ui/manifests.d.ts +21 -0
  365. package/dist/features/interactive-ui/manifests.d.ts.map +1 -0
  366. package/dist/features/interactive-ui/manifests.js +37 -0
  367. package/dist/features/interactive-ui/manifests.js.map +1 -0
  368. package/dist/features/interactive-ui/providers/native/data-table.d.ts +12 -0
  369. package/dist/features/interactive-ui/providers/native/data-table.d.ts.map +1 -0
  370. package/dist/features/interactive-ui/providers/native/data-table.js +5 -0
  371. package/dist/features/interactive-ui/providers/native/data-table.js.map +1 -0
  372. package/dist/features/interactive-ui/providers/native/data-table.manifest.d.ts +57 -0
  373. package/dist/features/interactive-ui/providers/native/data-table.manifest.d.ts.map +1 -0
  374. package/dist/features/interactive-ui/providers/native/data-table.manifest.js +31 -0
  375. package/dist/features/interactive-ui/providers/native/data-table.manifest.js.map +1 -0
  376. package/dist/features/interactive-ui/providers/native/index.d.ts +3 -0
  377. package/dist/features/interactive-ui/providers/native/index.d.ts.map +1 -0
  378. package/dist/features/interactive-ui/providers/native/index.js +3 -0
  379. package/dist/features/interactive-ui/providers/native/index.js.map +1 -0
  380. package/dist/features/interactive-ui/providers/recharts/bar-chart.d.ts +8 -0
  381. package/dist/features/interactive-ui/providers/recharts/bar-chart.d.ts.map +1 -0
  382. package/dist/features/interactive-ui/providers/recharts/bar-chart.js +6 -0
  383. package/dist/features/interactive-ui/providers/recharts/bar-chart.js.map +1 -0
  384. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.d.ts +21 -0
  385. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.d.ts.map +1 -0
  386. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.js +18 -0
  387. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.js.map +1 -0
  388. package/dist/features/interactive-ui/providers/recharts/index.d.ts +7 -0
  389. package/dist/features/interactive-ui/providers/recharts/index.d.ts.map +1 -0
  390. package/dist/features/interactive-ui/providers/recharts/index.js +7 -0
  391. package/dist/features/interactive-ui/providers/recharts/index.js.map +1 -0
  392. package/dist/features/interactive-ui/providers/recharts/line-chart.d.ts +8 -0
  393. package/dist/features/interactive-ui/providers/recharts/line-chart.d.ts.map +1 -0
  394. package/dist/features/interactive-ui/providers/recharts/line-chart.js +6 -0
  395. package/dist/features/interactive-ui/providers/recharts/line-chart.js.map +1 -0
  396. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.d.ts +20 -0
  397. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.d.ts.map +1 -0
  398. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.js +17 -0
  399. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.js.map +1 -0
  400. package/dist/features/interactive-ui/providers/recharts/pie-chart.d.ts +10 -0
  401. package/dist/features/interactive-ui/providers/recharts/pie-chart.d.ts.map +1 -0
  402. package/dist/features/interactive-ui/providers/recharts/pie-chart.js +7 -0
  403. package/dist/features/interactive-ui/providers/recharts/pie-chart.js.map +1 -0
  404. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.d.ts +41 -0
  405. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.d.ts.map +1 -0
  406. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.js +15 -0
  407. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.js.map +1 -0
  408. package/dist/features/interactive-ui/providers/shadcn/action-button.d.ts +14 -0
  409. package/dist/features/interactive-ui/providers/shadcn/action-button.d.ts.map +1 -0
  410. package/dist/features/interactive-ui/providers/shadcn/action-button.js +6 -0
  411. package/dist/features/interactive-ui/providers/shadcn/action-button.js.map +1 -0
  412. package/dist/features/interactive-ui/providers/shadcn/action-button.manifest.d.ts +24 -0
  413. package/dist/features/interactive-ui/providers/shadcn/action-button.manifest.d.ts.map +1 -0
  414. package/dist/features/interactive-ui/providers/shadcn/action-button.manifest.js +21 -0
  415. package/dist/features/interactive-ui/providers/shadcn/action-button.manifest.js.map +1 -0
  416. package/dist/features/interactive-ui/providers/shadcn/button.d.ts +18 -0
  417. package/dist/features/interactive-ui/providers/shadcn/button.d.ts.map +1 -0
  418. package/dist/features/interactive-ui/providers/shadcn/button.js +40 -0
  419. package/dist/features/interactive-ui/providers/shadcn/button.js.map +1 -0
  420. package/dist/features/interactive-ui/providers/shadcn/card.d.ts +13 -0
  421. package/dist/features/interactive-ui/providers/shadcn/card.d.ts.map +1 -0
  422. package/dist/features/interactive-ui/providers/shadcn/card.js +21 -0
  423. package/dist/features/interactive-ui/providers/shadcn/card.js.map +1 -0
  424. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.d.ts +9 -0
  425. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.d.ts.map +1 -0
  426. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.js +9 -0
  427. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.js.map +1 -0
  428. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.manifest.d.ts +17 -0
  429. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.manifest.d.ts.map +1 -0
  430. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.manifest.js +16 -0
  431. package/dist/features/interactive-ui/providers/shadcn/checkbox-field.manifest.js.map +1 -0
  432. package/dist/features/interactive-ui/providers/shadcn/checkbox.d.ts +10 -0
  433. package/dist/features/interactive-ui/providers/shadcn/checkbox.d.ts.map +1 -0
  434. package/dist/features/interactive-ui/providers/shadcn/checkbox.js +14 -0
  435. package/dist/features/interactive-ui/providers/shadcn/checkbox.js.map +1 -0
  436. package/dist/features/interactive-ui/providers/shadcn/content-card.d.ts +7 -0
  437. package/dist/features/interactive-ui/providers/shadcn/content-card.d.ts.map +1 -0
  438. package/dist/features/interactive-ui/providers/shadcn/content-card.js +6 -0
  439. package/dist/features/interactive-ui/providers/shadcn/content-card.js.map +1 -0
  440. package/dist/features/interactive-ui/providers/shadcn/content-card.manifest.d.ts +17 -0
  441. package/dist/features/interactive-ui/providers/shadcn/content-card.manifest.d.ts.map +1 -0
  442. package/dist/features/interactive-ui/providers/shadcn/content-card.manifest.js +16 -0
  443. package/dist/features/interactive-ui/providers/shadcn/content-card.manifest.js.map +1 -0
  444. package/dist/features/interactive-ui/providers/shadcn/data-table.d.ts +13 -0
  445. package/dist/features/interactive-ui/providers/shadcn/data-table.d.ts.map +1 -0
  446. package/dist/features/interactive-ui/providers/shadcn/data-table.js +7 -0
  447. package/dist/features/interactive-ui/providers/shadcn/data-table.js.map +1 -0
  448. package/dist/features/interactive-ui/providers/shadcn/data-table.manifest.d.ts +47 -0
  449. package/dist/features/interactive-ui/providers/shadcn/data-table.manifest.d.ts.map +1 -0
  450. package/dist/features/interactive-ui/providers/shadcn/data-table.manifest.js +21 -0
  451. package/dist/features/interactive-ui/providers/shadcn/data-table.manifest.js.map +1 -0
  452. package/dist/features/interactive-ui/providers/shadcn/index.d.ts +15 -0
  453. package/dist/features/interactive-ui/providers/shadcn/index.d.ts.map +1 -0
  454. package/dist/features/interactive-ui/providers/shadcn/index.js +15 -0
  455. package/dist/features/interactive-ui/providers/shadcn/index.js.map +1 -0
  456. package/dist/features/interactive-ui/providers/shadcn/input.d.ts +8 -0
  457. package/dist/features/interactive-ui/providers/shadcn/input.d.ts.map +1 -0
  458. package/dist/features/interactive-ui/providers/shadcn/input.js +13 -0
  459. package/dist/features/interactive-ui/providers/shadcn/input.js.map +1 -0
  460. package/dist/features/interactive-ui/providers/shadcn/label.d.ts +11 -0
  461. package/dist/features/interactive-ui/providers/shadcn/label.d.ts.map +1 -0
  462. package/dist/features/interactive-ui/providers/shadcn/label.js +15 -0
  463. package/dist/features/interactive-ui/providers/shadcn/label.js.map +1 -0
  464. package/dist/features/interactive-ui/providers/shadcn/lib/utils.d.ts +9 -0
  465. package/dist/features/interactive-ui/providers/shadcn/lib/utils.d.ts.map +1 -0
  466. package/dist/features/interactive-ui/providers/shadcn/lib/utils.js +12 -0
  467. package/dist/features/interactive-ui/providers/shadcn/lib/utils.js.map +1 -0
  468. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.d.ts +13 -0
  469. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.d.ts.map +1 -0
  470. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.js +14 -0
  471. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.js.map +1 -0
  472. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.manifest.d.ts +44 -0
  473. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.manifest.d.ts.map +1 -0
  474. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.manifest.js +16 -0
  475. package/dist/features/interactive-ui/providers/shadcn/radio-group-field.manifest.js.map +1 -0
  476. package/dist/features/interactive-ui/providers/shadcn/radio-group.d.ts +11 -0
  477. package/dist/features/interactive-ui/providers/shadcn/radio-group.d.ts.map +1 -0
  478. package/dist/features/interactive-ui/providers/shadcn/radio-group.js +20 -0
  479. package/dist/features/interactive-ui/providers/shadcn/radio-group.js.map +1 -0
  480. package/dist/features/interactive-ui/providers/shadcn/select-field.d.ts +14 -0
  481. package/dist/features/interactive-ui/providers/shadcn/select-field.d.ts.map +1 -0
  482. package/dist/features/interactive-ui/providers/shadcn/select-field.js +8 -0
  483. package/dist/features/interactive-ui/providers/shadcn/select-field.js.map +1 -0
  484. package/dist/features/interactive-ui/providers/shadcn/select-field.manifest.d.ts +47 -0
  485. package/dist/features/interactive-ui/providers/shadcn/select-field.manifest.d.ts.map +1 -0
  486. package/dist/features/interactive-ui/providers/shadcn/select-field.manifest.js +17 -0
  487. package/dist/features/interactive-ui/providers/shadcn/select-field.manifest.js.map +1 -0
  488. package/dist/features/interactive-ui/providers/shadcn/select.d.ts +19 -0
  489. package/dist/features/interactive-ui/providers/shadcn/select.d.ts.map +1 -0
  490. package/dist/features/interactive-ui/providers/shadcn/select.js +30 -0
  491. package/dist/features/interactive-ui/providers/shadcn/select.js.map +1 -0
  492. package/dist/features/interactive-ui/providers/shadcn/table.d.ts +17 -0
  493. package/dist/features/interactive-ui/providers/shadcn/table.d.ts.map +1 -0
  494. package/dist/features/interactive-ui/providers/shadcn/table.js +35 -0
  495. package/dist/features/interactive-ui/providers/shadcn/table.js.map +1 -0
  496. package/dist/features/interactive-ui/providers/shadcn/text-input-field.d.ts +16 -0
  497. package/dist/features/interactive-ui/providers/shadcn/text-input-field.d.ts.map +1 -0
  498. package/dist/features/interactive-ui/providers/shadcn/text-input-field.js +6 -0
  499. package/dist/features/interactive-ui/providers/shadcn/text-input-field.js.map +1 -0
  500. package/dist/features/interactive-ui/providers/shadcn/text-input-field.manifest.d.ts +20 -0
  501. package/dist/features/interactive-ui/providers/shadcn/text-input-field.manifest.d.ts.map +1 -0
  502. package/dist/features/interactive-ui/providers/shadcn/text-input-field.manifest.js +17 -0
  503. package/dist/features/interactive-ui/providers/shadcn/text-input-field.manifest.js.map +1 -0
  504. package/dist/features/interactive-ui/registry.d.ts +27 -0
  505. package/dist/features/interactive-ui/registry.d.ts.map +1 -0
  506. package/dist/features/interactive-ui/registry.js +27 -0
  507. package/dist/features/interactive-ui/registry.js.map +1 -0
  508. package/dist/features/interactive-ui/types.d.ts +18 -0
  509. package/dist/features/interactive-ui/types.d.ts.map +1 -0
  510. package/dist/features/interactive-ui/types.js.map +1 -0
  511. package/dist/features/language/index.d.ts.map +1 -0
  512. package/dist/features/language/index.js.map +1 -0
  513. package/dist/features/language/react/components/LanguageTab.d.ts.map +1 -0
  514. package/dist/features/language/react/components/LanguageTab.js +18 -0
  515. package/dist/features/language/react/components/LanguageTab.js.map +1 -0
  516. package/dist/features/language/types.d.ts +21 -0
  517. package/dist/features/language/types.d.ts.map +1 -0
  518. package/dist/features/language/types.js +2 -0
  519. package/dist/features/language/types.js.map +1 -0
  520. package/dist/features/list-detail-panel/types.d.ts +1 -1
  521. package/dist/features/list-detail-panel/types.js +1 -1
  522. package/dist/features/mcp-ui/confirmation-store.d.ts +110 -0
  523. package/dist/features/mcp-ui/confirmation-store.d.ts.map +1 -0
  524. package/dist/features/mcp-ui/confirmation-store.js +149 -0
  525. package/dist/features/mcp-ui/confirmation-store.js.map +1 -0
  526. package/dist/features/mcp-ui/early-message-buffer.d.ts +62 -0
  527. package/dist/features/mcp-ui/early-message-buffer.d.ts.map +1 -0
  528. package/dist/features/mcp-ui/early-message-buffer.js +69 -0
  529. package/dist/features/mcp-ui/early-message-buffer.js.map +1 -0
  530. package/dist/features/mcp-ui/escape.d.ts +51 -0
  531. package/dist/features/mcp-ui/escape.d.ts.map +1 -0
  532. package/dist/features/mcp-ui/escape.js +68 -0
  533. package/dist/features/mcp-ui/escape.js.map +1 -0
  534. package/dist/features/mcp-ui/index.d.ts +28 -0
  535. package/dist/features/mcp-ui/index.d.ts.map +1 -0
  536. package/dist/features/mcp-ui/index.js +28 -0
  537. package/dist/features/mcp-ui/index.js.map +1 -0
  538. package/dist/features/mcp-ui/protocol.d.ts +59 -0
  539. package/dist/features/mcp-ui/protocol.d.ts.map +1 -0
  540. package/dist/features/mcp-ui/protocol.js +58 -0
  541. package/dist/features/mcp-ui/protocol.js.map +1 -0
  542. package/dist/features/mcp-ui/resource.d.ts +192 -0
  543. package/dist/features/mcp-ui/resource.d.ts.map +1 -0
  544. package/dist/features/mcp-ui/resource.js +228 -0
  545. package/dist/features/mcp-ui/resource.js.map +1 -0
  546. package/dist/features/mcp-ui/sandbox-proxy.d.ts +132 -0
  547. package/dist/features/mcp-ui/sandbox-proxy.d.ts.map +1 -0
  548. package/dist/features/mcp-ui/sandbox-proxy.js +167 -0
  549. package/dist/features/mcp-ui/sandbox-proxy.js.map +1 -0
  550. package/dist/features/mcp-ui/surfaces/bridge.d.ts +43 -0
  551. package/dist/features/mcp-ui/surfaces/bridge.d.ts.map +1 -0
  552. package/dist/features/mcp-ui/surfaces/bridge.js +200 -0
  553. package/dist/features/mcp-ui/surfaces/bridge.js.map +1 -0
  554. package/dist/features/mcp-ui/surfaces/checkbox.d.ts +25 -0
  555. package/dist/features/mcp-ui/surfaces/checkbox.d.ts.map +1 -0
  556. package/dist/features/mcp-ui/surfaces/checkbox.js +26 -0
  557. package/dist/features/mcp-ui/surfaces/checkbox.js.map +1 -0
  558. package/dist/features/mcp-ui/surfaces/choice-group.d.ts +34 -0
  559. package/dist/features/mcp-ui/surfaces/choice-group.d.ts.map +1 -0
  560. package/dist/features/mcp-ui/surfaces/choice-group.js +70 -0
  561. package/dist/features/mcp-ui/surfaces/choice-group.js.map +1 -0
  562. package/dist/features/mcp-ui/surfaces/confirmation.d.ts +75 -0
  563. package/dist/features/mcp-ui/surfaces/confirmation.d.ts.map +1 -0
  564. package/dist/features/mcp-ui/surfaces/confirmation.js +148 -0
  565. package/dist/features/mcp-ui/surfaces/confirmation.js.map +1 -0
  566. package/dist/features/mcp-ui/surfaces/document.d.ts +173 -0
  567. package/dist/features/mcp-ui/surfaces/document.d.ts.map +1 -0
  568. package/dist/features/mcp-ui/surfaces/document.js +327 -0
  569. package/dist/features/mcp-ui/surfaces/document.js.map +1 -0
  570. package/dist/features/mcp-ui/surfaces/fields.d.ts +77 -0
  571. package/dist/features/mcp-ui/surfaces/fields.d.ts.map +1 -0
  572. package/dist/features/mcp-ui/surfaces/fields.js +97 -0
  573. package/dist/features/mcp-ui/surfaces/fields.js.map +1 -0
  574. package/dist/features/mcp-ui/surfaces/form.d.ts +78 -0
  575. package/dist/features/mcp-ui/surfaces/form.d.ts.map +1 -0
  576. package/dist/features/mcp-ui/surfaces/form.js +218 -0
  577. package/dist/features/mcp-ui/surfaces/form.js.map +1 -0
  578. package/dist/features/mcp-ui/surfaces/index.d.ts +12 -0
  579. package/dist/features/mcp-ui/surfaces/index.d.ts.map +1 -0
  580. package/dist/features/mcp-ui/surfaces/index.js +12 -0
  581. package/dist/features/mcp-ui/surfaces/index.js.map +1 -0
  582. package/dist/features/mcp-ui/surfaces/outcome.d.ts +102 -0
  583. package/dist/features/mcp-ui/surfaces/outcome.d.ts.map +1 -0
  584. package/dist/features/mcp-ui/surfaces/outcome.js +119 -0
  585. package/dist/features/mcp-ui/surfaces/outcome.js.map +1 -0
  586. package/dist/features/mcp-ui/surfaces/select.d.ts +35 -0
  587. package/dist/features/mcp-ui/surfaces/select.d.ts.map +1 -0
  588. package/dist/features/mcp-ui/surfaces/select.js +36 -0
  589. package/dist/features/mcp-ui/surfaces/select.js.map +1 -0
  590. package/dist/features/mcp-ui/surfaces/text-input.d.ts +35 -0
  591. package/dist/features/mcp-ui/surfaces/text-input.d.ts.map +1 -0
  592. package/dist/features/mcp-ui/surfaces/text-input.js +61 -0
  593. package/dist/features/mcp-ui/surfaces/text-input.js.map +1 -0
  594. package/dist/features/mcp-ui/surfaces/tokens.d.ts +106 -0
  595. package/dist/features/mcp-ui/surfaces/tokens.d.ts.map +1 -0
  596. package/dist/features/mcp-ui/surfaces/tokens.js +165 -0
  597. package/dist/features/mcp-ui/surfaces/tokens.js.map +1 -0
  598. package/dist/features/media-providers/constants.d.ts +10 -0
  599. package/dist/features/media-providers/constants.d.ts.map +1 -0
  600. package/dist/features/media-providers/constants.js +90 -0
  601. package/dist/features/media-providers/constants.js.map +1 -0
  602. package/dist/features/media-providers/dependencies.d.ts +27 -0
  603. package/dist/features/media-providers/dependencies.d.ts.map +1 -0
  604. package/dist/features/media-providers/dependencies.js +29 -0
  605. package/dist/features/media-providers/dependencies.js.map +1 -0
  606. package/dist/features/media-providers/index.d.ts +10 -0
  607. package/dist/features/media-providers/index.d.ts.map +1 -0
  608. package/dist/features/media-providers/index.js +6 -0
  609. package/dist/features/media-providers/index.js.map +1 -0
  610. package/dist/features/media-providers/ports.d.ts +51 -0
  611. package/dist/features/media-providers/ports.d.ts.map +1 -0
  612. package/dist/features/media-providers/ports.js +2 -0
  613. package/dist/features/media-providers/ports.js.map +1 -0
  614. package/dist/features/media-providers/react/components/MediaProvidersTab.d.ts +59 -0
  615. package/dist/features/media-providers/react/components/MediaProvidersTab.d.ts.map +1 -0
  616. package/dist/features/media-providers/react/components/MediaProvidersTab.js +92 -0
  617. package/dist/features/media-providers/react/components/MediaProvidersTab.js.map +1 -0
  618. package/dist/features/media-providers/react/hooks/useMediaProvidersTab.d.ts +58 -0
  619. package/dist/features/media-providers/react/hooks/useMediaProvidersTab.d.ts.map +1 -0
  620. package/dist/features/media-providers/react/hooks/useMediaProvidersTab.js +294 -0
  621. package/dist/features/media-providers/react/hooks/useMediaProvidersTab.js.map +1 -0
  622. package/dist/features/media-providers/rules.d.ts +139 -0
  623. package/dist/features/media-providers/rules.d.ts.map +1 -0
  624. package/dist/features/media-providers/rules.js +227 -0
  625. package/dist/features/media-providers/rules.js.map +1 -0
  626. package/dist/features/media-providers/types.d.ts +102 -0
  627. package/dist/features/media-providers/types.d.ts.map +1 -0
  628. package/dist/features/media-providers/types.js +27 -0
  629. package/dist/features/media-providers/types.js.map +1 -0
  630. package/dist/features/memory/constants.d.ts +0 -2
  631. package/dist/features/memory/constants.d.ts.map +1 -1
  632. package/dist/features/memory/constants.js +0 -9
  633. package/dist/features/memory/constants.js.map +1 -1
  634. package/dist/features/memory/dependencies.d.ts +1 -28
  635. package/dist/features/memory/dependencies.d.ts.map +1 -1
  636. package/dist/features/memory/dependencies.js +39 -23
  637. package/dist/features/memory/dependencies.js.map +1 -1
  638. package/dist/features/memory/formatters.d.ts +5 -2
  639. package/dist/features/memory/formatters.d.ts.map +1 -1
  640. package/dist/features/memory/formatters.js +1 -2
  641. package/dist/features/memory/formatters.js.map +1 -1
  642. package/dist/features/memory/index.d.ts +8 -8
  643. package/dist/features/memory/index.d.ts.map +1 -1
  644. package/dist/features/memory/index.js +6 -10
  645. package/dist/features/memory/index.js.map +1 -1
  646. package/dist/features/memory/ports.d.ts +1 -1
  647. package/dist/features/memory/react/components/MemoryConnectedPanel.d.ts +1 -1
  648. package/dist/features/memory/react/components/MemoryConnectedPanel.d.ts.map +1 -1
  649. package/dist/features/memory/react/components/MemoryConnectedPanel.js +2 -1
  650. package/dist/features/memory/react/components/MemoryConnectedPanel.js.map +1 -1
  651. package/dist/features/memory/react/components/MemoryEntryCard.d.ts.map +1 -1
  652. package/dist/features/memory/react/components/MemoryEntryCard.js +2 -1
  653. package/dist/features/memory/react/components/MemoryEntryCard.js.map +1 -1
  654. package/dist/features/memory/react/components/MemoryExtractionCard.d.ts.map +1 -1
  655. package/dist/features/memory/react/components/MemoryExtractionCard.js +1 -1
  656. package/dist/features/memory/react/components/MemoryExtractionCard.js.map +1 -1
  657. package/dist/features/memory/react/components/MemoryManualEditor.d.ts.map +1 -1
  658. package/dist/features/memory/react/components/MemoryManualEditor.js +2 -1
  659. package/dist/features/memory/react/components/MemoryManualEditor.js.map +1 -1
  660. package/dist/features/memory/react/components/MemorySettingsPanel.d.ts +22 -0
  661. package/dist/features/memory/react/components/MemorySettingsPanel.d.ts.map +1 -0
  662. package/dist/features/memory/react/components/MemorySettingsPanel.js +30 -0
  663. package/dist/features/memory/react/components/MemorySettingsPanel.js.map +1 -0
  664. package/dist/features/memory/react/hooks/useMemoryConfig.hooks.d.ts.map +1 -1
  665. package/dist/features/memory/react/hooks/useMemoryConfig.hooks.js +1 -1
  666. package/dist/features/memory/react/hooks/useMemoryConfig.hooks.js.map +1 -1
  667. package/dist/features/memory/react/hooks/useMemoryConnectors.hooks.d.ts +43 -1
  668. package/dist/features/memory/react/hooks/useMemoryConnectors.hooks.d.ts.map +1 -1
  669. package/dist/features/memory/react/hooks/useMemoryConnectors.hooks.js +99 -99
  670. package/dist/features/memory/react/hooks/useMemoryConnectors.hooks.js.map +1 -1
  671. package/dist/features/memory/react/hooks/useMemoryConnectors.rules.d.ts +54 -0
  672. package/dist/features/memory/react/hooks/useMemoryConnectors.rules.d.ts.map +1 -0
  673. package/dist/features/memory/react/hooks/useMemoryConnectors.rules.js +81 -0
  674. package/dist/features/memory/react/hooks/useMemoryConnectors.rules.js.map +1 -0
  675. package/dist/features/memory/react/hooks/useMemoryEntries.hooks.d.ts.map +1 -1
  676. package/dist/features/memory/react/hooks/useMemoryEntries.hooks.js +1 -1
  677. package/dist/features/memory/react/hooks/useMemoryEntries.hooks.js.map +1 -1
  678. package/dist/features/memory/react/hooks/useMemoryExtractions.hooks.d.ts.map +1 -1
  679. package/dist/features/memory/react/hooks/useMemoryExtractions.hooks.js.map +1 -1
  680. package/dist/features/memory/react/render-markdown.d.ts.map +1 -1
  681. package/dist/features/memory/react/render-markdown.js +3 -2
  682. package/dist/features/memory/react/render-markdown.js.map +1 -1
  683. package/dist/features/memory/react/styles.d.ts +11 -0
  684. package/dist/features/memory/react/styles.d.ts.map +1 -0
  685. package/dist/features/memory/react/styles.js +18 -0
  686. package/dist/features/memory/react/styles.js.map +1 -0
  687. package/dist/features/memory/rules.d.ts +1 -1
  688. package/dist/features/memory/rules.js +2 -2
  689. package/dist/features/memory/rules.js.map +1 -1
  690. package/dist/features/memory/types.d.ts +1 -1
  691. package/dist/features/memory/types.d.ts.map +1 -1
  692. package/dist/features/notifications/constants.d.ts.map +1 -0
  693. package/dist/features/notifications/constants.js +8 -0
  694. package/dist/features/notifications/constants.js.map +1 -0
  695. package/dist/features/notifications/index.d.ts +5 -0
  696. package/dist/features/notifications/index.d.ts.map +1 -0
  697. package/dist/features/notifications/index.js.map +1 -0
  698. package/dist/features/notifications/notifications-catalog.d.ts +25 -0
  699. package/dist/features/notifications/notifications-catalog.d.ts.map +1 -0
  700. package/dist/features/notifications/notifications-catalog.js +27 -0
  701. package/dist/features/notifications/notifications-catalog.js.map +1 -0
  702. package/dist/features/notifications/react/components/NotificationsTab.d.ts +48 -0
  703. package/dist/features/notifications/react/components/NotificationsTab.d.ts.map +1 -0
  704. package/dist/features/notifications/react/components/NotificationsTab.js +84 -0
  705. package/dist/features/notifications/react/components/NotificationsTab.js.map +1 -0
  706. package/dist/features/notifications/rules.d.ts +21 -0
  707. package/dist/features/notifications/rules.d.ts.map +1 -0
  708. package/dist/features/notifications/rules.js +7 -0
  709. package/dist/features/notifications/rules.js.map +1 -0
  710. package/dist/features/notifications/types.d.ts +15 -0
  711. package/dist/features/notifications/types.d.ts.map +1 -0
  712. package/dist/features/notifications/types.js +2 -0
  713. package/dist/features/notifications/types.js.map +1 -0
  714. package/dist/features/privacy/index.d.ts +5 -0
  715. package/dist/features/privacy/index.d.ts.map +1 -0
  716. package/dist/features/privacy/index.js.map +1 -0
  717. package/dist/features/privacy/react/components/PrivacyTab.d.ts +34 -0
  718. package/dist/features/privacy/react/components/PrivacyTab.d.ts.map +1 -0
  719. package/dist/features/privacy/react/components/PrivacyTab.js +36 -0
  720. package/dist/features/privacy/react/components/PrivacyTab.js.map +1 -0
  721. package/dist/features/privacy/rules.d.ts.map +1 -0
  722. package/dist/features/privacy/rules.js +70 -0
  723. package/dist/features/privacy/rules.js.map +1 -0
  724. package/dist/features/privacy/types.d.ts.map +1 -0
  725. package/dist/features/privacy/types.js.map +1 -0
  726. package/dist/features/project-locations/dependencies.d.ts +20 -0
  727. package/dist/features/project-locations/dependencies.d.ts.map +1 -0
  728. package/dist/features/project-locations/dependencies.js +45 -0
  729. package/dist/features/project-locations/dependencies.js.map +1 -0
  730. package/dist/features/project-locations/index.d.ts +9 -0
  731. package/dist/features/project-locations/index.d.ts.map +1 -0
  732. package/dist/features/project-locations/index.js +5 -0
  733. package/dist/features/project-locations/index.js.map +1 -0
  734. package/dist/features/project-locations/ports.d.ts +41 -0
  735. package/dist/features/project-locations/ports.d.ts.map +1 -0
  736. package/dist/features/project-locations/ports.js +2 -0
  737. package/dist/features/project-locations/ports.js.map +1 -0
  738. package/dist/features/project-locations/react/components/ProjectLocationsTab.d.ts +36 -0
  739. package/dist/features/project-locations/react/components/ProjectLocationsTab.d.ts.map +1 -0
  740. package/dist/features/project-locations/react/components/ProjectLocationsTab.js +53 -0
  741. package/dist/features/project-locations/react/components/ProjectLocationsTab.js.map +1 -0
  742. package/dist/features/project-locations/react/hooks/useProjectLocationsTab.d.ts +41 -0
  743. package/dist/features/project-locations/react/hooks/useProjectLocationsTab.d.ts.map +1 -0
  744. package/dist/features/project-locations/react/hooks/useProjectLocationsTab.js +157 -0
  745. package/dist/features/project-locations/react/hooks/useProjectLocationsTab.js.map +1 -0
  746. package/dist/features/project-locations/rules.d.ts +53 -0
  747. package/dist/features/project-locations/rules.d.ts.map +1 -0
  748. package/dist/features/project-locations/rules.js +82 -0
  749. package/dist/features/project-locations/rules.js.map +1 -0
  750. package/dist/features/project-locations/types.d.ts +78 -0
  751. package/dist/features/project-locations/types.d.ts.map +1 -0
  752. package/dist/features/project-locations/types.js +13 -0
  753. package/dist/features/project-locations/types.js.map +1 -0
  754. package/dist/features/resource-dashboard/types.d.ts +1 -1
  755. package/dist/features/resource-dashboard/types.js +1 -1
  756. package/dist/features/settings/dialog/index.d.ts +7 -0
  757. package/dist/features/settings/dialog/index.d.ts.map +1 -0
  758. package/dist/features/settings/dialog/index.js +8 -0
  759. package/dist/features/settings/dialog/index.js.map +1 -0
  760. package/dist/features/settings/dialog/react/components/SettingsDialogShell.d.ts +33 -0
  761. package/dist/features/settings/dialog/react/components/SettingsDialogShell.d.ts.map +1 -0
  762. package/dist/features/settings/dialog/react/components/SettingsDialogShell.js +32 -0
  763. package/dist/features/settings/dialog/react/components/SettingsDialogShell.js.map +1 -0
  764. package/dist/features/settings/dialog/react/hooks/useSettingsDialogShell.d.ts +11 -0
  765. package/dist/features/settings/dialog/react/hooks/useSettingsDialogShell.d.ts.map +1 -0
  766. package/dist/features/settings/dialog/react/hooks/useSettingsDialogShell.js +10 -0
  767. package/dist/features/settings/dialog/react/hooks/useSettingsDialogShell.js.map +1 -0
  768. package/dist/features/settings/dialog/styles/settings-dialog.css +4434 -0
  769. package/dist/features/skills/dependencies.d.ts +18 -0
  770. package/dist/features/skills/dependencies.d.ts.map +1 -0
  771. package/dist/features/skills/dependencies.js +82 -0
  772. package/dist/features/skills/dependencies.js.map +1 -0
  773. package/dist/features/skills/index.d.ts +13 -0
  774. package/dist/features/skills/index.d.ts.map +1 -0
  775. package/dist/features/skills/index.js +7 -0
  776. package/dist/features/skills/index.js.map +1 -0
  777. package/dist/features/skills/ports.d.ts +45 -0
  778. package/dist/features/skills/ports.d.ts.map +1 -0
  779. package/dist/features/skills/ports.js +2 -0
  780. package/dist/features/skills/ports.js.map +1 -0
  781. package/dist/features/skills/react/components/SkillDraftForm.d.ts +39 -0
  782. package/dist/features/skills/react/components/SkillDraftForm.d.ts.map +1 -0
  783. package/dist/features/skills/react/components/SkillDraftForm.js +29 -0
  784. package/dist/features/skills/react/components/SkillDraftForm.js.map +1 -0
  785. package/dist/features/skills/react/components/SkillRow.d.ts +54 -0
  786. package/dist/features/skills/react/components/SkillRow.d.ts.map +1 -0
  787. package/dist/features/skills/react/components/SkillRow.js +34 -0
  788. package/dist/features/skills/react/components/SkillRow.js.map +1 -0
  789. package/dist/features/skills/react/components/SkillsTab.d.ts +34 -0
  790. package/dist/features/skills/react/components/SkillsTab.d.ts.map +1 -0
  791. package/dist/features/skills/react/components/SkillsTab.js +33 -0
  792. package/dist/features/skills/react/components/SkillsTab.js.map +1 -0
  793. package/dist/features/skills/react/hooks/useSkillsTab.d.ts +70 -0
  794. package/dist/features/skills/react/hooks/useSkillsTab.d.ts.map +1 -0
  795. package/dist/features/skills/react/hooks/useSkillsTab.js +282 -0
  796. package/dist/features/skills/react/hooks/useSkillsTab.js.map +1 -0
  797. package/dist/features/skills/rules.d.ts +156 -0
  798. package/dist/features/skills/rules.d.ts.map +1 -0
  799. package/dist/features/skills/rules.js +272 -0
  800. package/dist/features/skills/rules.js.map +1 -0
  801. package/dist/features/skills/types.d.ts +97 -0
  802. package/dist/features/skills/types.d.ts.map +1 -0
  803. package/dist/features/skills/types.js +18 -0
  804. package/dist/features/skills/types.js.map +1 -0
  805. package/dist/features/source-config-list/agent-handles.d.ts +121 -0
  806. package/dist/features/source-config-list/agent-handles.d.ts.map +1 -0
  807. package/dist/features/source-config-list/agent-handles.js +151 -0
  808. package/dist/features/source-config-list/agent-handles.js.map +1 -0
  809. package/dist/features/source-config-list/index.d.ts +6 -5
  810. package/dist/features/source-config-list/index.d.ts.map +1 -1
  811. package/dist/features/source-config-list/index.js +3 -2
  812. package/dist/features/source-config-list/index.js.map +1 -1
  813. package/dist/features/source-config-list/react/components/SourceConfigAddForm.d.ts +28 -1
  814. package/dist/features/source-config-list/react/components/SourceConfigAddForm.d.ts.map +1 -1
  815. package/dist/features/source-config-list/react/components/SourceConfigAddForm.js +25 -4
  816. package/dist/features/source-config-list/react/components/SourceConfigAddForm.js.map +1 -1
  817. package/dist/features/source-config-list/react/components/SourceConfigField.d.ts +36 -1
  818. package/dist/features/source-config-list/react/components/SourceConfigField.d.ts.map +1 -1
  819. package/dist/features/source-config-list/react/components/SourceConfigField.js +74 -3
  820. package/dist/features/source-config-list/react/components/SourceConfigField.js.map +1 -1
  821. package/dist/features/source-config-list/react/components/SourceConfigItemCard.d.ts +39 -2
  822. package/dist/features/source-config-list/react/components/SourceConfigItemCard.d.ts.map +1 -1
  823. package/dist/features/source-config-list/react/components/SourceConfigItemCard.js +55 -4
  824. package/dist/features/source-config-list/react/components/SourceConfigItemCard.js.map +1 -1
  825. package/dist/features/source-config-list/react/components/SourceConfigList.d.ts +9 -3
  826. package/dist/features/source-config-list/react/components/SourceConfigList.d.ts.map +1 -1
  827. package/dist/features/source-config-list/react/components/SourceConfigList.js +2 -2
  828. package/dist/features/source-config-list/react/components/SourceConfigList.js.map +1 -1
  829. package/dist/features/source-config-list/react/components/SourceConfigListView.d.ts +13 -2
  830. package/dist/features/source-config-list/react/components/SourceConfigListView.d.ts.map +1 -1
  831. package/dist/features/source-config-list/react/components/SourceConfigListView.js +8 -2
  832. package/dist/features/source-config-list/react/components/SourceConfigListView.js.map +1 -1
  833. package/dist/features/source-config-list/react/components/SourceConfigTestControl.d.ts +18 -1
  834. package/dist/features/source-config-list/react/components/SourceConfigTestControl.d.ts.map +1 -1
  835. package/dist/features/source-config-list/react/components/SourceConfigTestControl.js +16 -2
  836. package/dist/features/source-config-list/react/components/SourceConfigTestControl.js.map +1 -1
  837. package/dist/features/source-config-list/react/hooks/useSourceConfigAddForm.d.ts.map +1 -1
  838. package/dist/features/source-config-list/react/hooks/useSourceConfigAddForm.js.map +1 -1
  839. package/dist/features/source-config-list/react/hooks/useSourceConfigList.d.ts +12 -1
  840. package/dist/features/source-config-list/react/hooks/useSourceConfigList.d.ts.map +1 -1
  841. package/dist/features/source-config-list/react/hooks/useSourceConfigList.js.map +1 -1
  842. package/dist/features/source-config-list/rules.d.ts +22 -5
  843. package/dist/features/source-config-list/rules.d.ts.map +1 -1
  844. package/dist/features/source-config-list/rules.js +56 -16
  845. package/dist/features/source-config-list/rules.js.map +1 -1
  846. package/dist/features/source-config-list/types.d.ts +16 -2
  847. package/dist/features/source-config-list/types.d.ts.map +1 -1
  848. package/dist/features/tab-strip/types.d.ts +1 -1
  849. package/dist/features/tabbed-dialog/index.d.ts +7 -0
  850. package/dist/features/tabbed-dialog/index.d.ts.map +1 -0
  851. package/dist/features/tabbed-dialog/index.js +4 -0
  852. package/dist/features/tabbed-dialog/index.js.map +1 -0
  853. package/dist/features/tabbed-dialog/react/components/TabbedDialog.d.ts +71 -0
  854. package/dist/features/tabbed-dialog/react/components/TabbedDialog.d.ts.map +1 -0
  855. package/dist/features/tabbed-dialog/react/components/TabbedDialog.js +72 -0
  856. package/dist/features/tabbed-dialog/react/components/TabbedDialog.js.map +1 -0
  857. package/dist/features/tabbed-dialog/react/hooks/useTabbedDialog.d.ts +39 -0
  858. package/dist/features/tabbed-dialog/react/hooks/useTabbedDialog.d.ts.map +1 -0
  859. package/dist/features/tabbed-dialog/react/hooks/useTabbedDialog.js +50 -0
  860. package/dist/features/tabbed-dialog/react/hooks/useTabbedDialog.js.map +1 -0
  861. package/dist/features/tabbed-dialog/rules.d.ts +13 -0
  862. package/dist/features/tabbed-dialog/rules.d.ts.map +1 -0
  863. package/dist/features/tabbed-dialog/rules.js.map +1 -0
  864. package/dist/features/tabbed-dialog/styles/tabbed-dialog.css +406 -0
  865. package/dist/features/tabbed-dialog/types.d.ts +51 -0
  866. package/dist/features/tabbed-dialog/types.d.ts.map +1 -0
  867. package/dist/features/tabbed-dialog/types.js +23 -0
  868. package/dist/features/tabbed-dialog/types.js.map +1 -0
  869. package/dist/features/viewer-shell/react/components/ViewportSwitcher.d.ts +1 -1
  870. package/dist/features/viewer-shell/react/components/ViewportSwitcher.js +1 -1
  871. package/dist/features/viewer-shell/rules.d.ts +1 -1
  872. package/dist/features/viewer-shell/rules.js +1 -1
  873. package/dist/icon-name.d.ts +21 -0
  874. package/dist/icon-name.d.ts.map +1 -0
  875. package/dist/icon-name.js +25 -0
  876. package/dist/icon-name.js.map +1 -0
  877. package/dist/index.d.ts +16 -9
  878. package/dist/index.d.ts.map +1 -1
  879. package/dist/index.js +32 -9
  880. package/dist/index.js.map +1 -1
  881. package/dist/react/components/AgentIcon.d.ts +5 -3
  882. package/dist/react/components/AgentIcon.d.ts.map +1 -1
  883. package/dist/react/components/AgentIcon.js +52 -13
  884. package/dist/react/components/AgentIcon.js.map +1 -1
  885. package/dist/react/components/AppChromeHeader.js +1 -1
  886. package/dist/react/components/AppChromeHeader.js.map +1 -1
  887. package/dist/react/components/CustomSelect.d.ts +19 -4
  888. package/dist/react/components/CustomSelect.d.ts.map +1 -1
  889. package/dist/react/components/CustomSelect.js +59 -12
  890. package/dist/react/components/CustomSelect.js.map +1 -1
  891. package/dist/react/components/EdgeScrollZones.js +1 -1
  892. package/dist/react/components/EdgeScrollZones.js.map +1 -1
  893. package/dist/react/components/ExportDiagnosticsButton.d.ts.map +1 -1
  894. package/dist/react/components/ExportDiagnosticsButton.js +5 -2
  895. package/dist/react/components/ExportDiagnosticsButton.js.map +1 -1
  896. package/dist/react/components/HeaderActionsMenu.d.ts +1 -1
  897. package/dist/react/components/HeaderActionsMenu.d.ts.map +1 -1
  898. package/dist/react/components/HeaderActionsMenu.js +1 -1
  899. package/dist/react/components/HeaderActionsMenu.js.map +1 -1
  900. package/dist/react/components/Icon.d.ts +7 -4
  901. package/dist/react/components/Icon.d.ts.map +1 -1
  902. package/dist/react/components/Icon.js +133 -213
  903. package/dist/react/components/Icon.js.map +1 -1
  904. package/dist/react/components/LanguageMenu.d.ts +2 -4
  905. package/dist/react/components/LanguageMenu.d.ts.map +1 -1
  906. package/dist/react/components/LanguageMenu.js +1 -1
  907. package/dist/react/components/LanguageMenu.js.map +1 -1
  908. package/dist/react/components/Loading.js +1 -1
  909. package/dist/react/components/Loading.js.map +1 -1
  910. package/dist/react/components/PaletteTweaks.js +1 -1
  911. package/dist/react/components/PaletteTweaks.js.map +1 -1
  912. package/dist/react/components/RemixIcon.d.ts +3 -3
  913. package/dist/react/components/RemixIcon.d.ts.map +1 -1
  914. package/dist/react/components/RemixIcon.js +39 -3
  915. package/dist/react/components/RemixIcon.js.map +1 -1
  916. package/dist/react/components/Toast.js +1 -1
  917. package/dist/react/components/Toast.js.map +1 -1
  918. package/dist/react/components/WorkingDirPicker.js +1 -1
  919. package/dist/react/components/WorkingDirPicker.js.map +1 -1
  920. package/dist/react/components/agent-icons/amr.svg +17 -0
  921. package/dist/react/components/agent-icons/antigravity.svg +1 -0
  922. package/dist/react/components/agent-icons/claude.svg +1 -0
  923. package/dist/react/components/agent-icons/codex.svg +1 -0
  924. package/dist/react/components/agent-icons/copilot.svg +1 -0
  925. package/dist/react/components/agent-icons/cursor-agent.svg +1 -0
  926. package/dist/react/components/agent-icons/deepseek.svg +1 -0
  927. package/dist/react/components/agent-icons/gemini.svg +1 -0
  928. package/dist/react/components/agent-icons/grok-build.svg +15 -0
  929. package/dist/react/components/agent-icons/hermes.svg +1 -0
  930. package/dist/react/components/agent-icons/kilo.svg +1 -0
  931. package/dist/react/components/agent-icons/kimi.svg +1 -0
  932. package/dist/react/components/agent-icons/kiro.svg +1 -0
  933. package/dist/react/components/agent-icons/mimo.svg +1 -0
  934. package/dist/react/components/agent-icons/opencode.svg +1 -0
  935. package/dist/react/components/agent-icons/pi.svg +1 -0
  936. package/dist/react/components/agent-icons/qoder.svg +1 -0
  937. package/dist/react/components/agent-icons/qwen.svg +1 -0
  938. package/dist/react/components/agent-icons/reasonix.svg +37 -0
  939. package/dist/react/components/agent-icons/vibe.svg +1 -0
  940. package/dist/react/components/remixicon-font/remixicon.css +3270 -0
  941. package/dist/react/components/remixicon-font/remixicon.woff2 +0 -0
  942. package/dist/react/hooks/useBrandFonts.d.ts.map +1 -1
  943. package/dist/react/hooks/useBrandFonts.js +2 -3
  944. package/dist/react/hooks/useBrandFonts.js.map +1 -1
  945. package/dist/react/mcp-ui/McpUiHost.d.ts +19 -0
  946. package/dist/react/mcp-ui/McpUiHost.d.ts.map +1 -0
  947. package/dist/react/mcp-ui/McpUiHost.js +34 -0
  948. package/dist/react/mcp-ui/McpUiHost.js.map +1 -0
  949. package/dist/react/mcp-ui/host-message-source.d.ts +27 -0
  950. package/dist/react/mcp-ui/host-message-source.d.ts.map +1 -0
  951. package/dist/react/mcp-ui/host-message-source.js +33 -0
  952. package/dist/react/mcp-ui/host-message-source.js.map +1 -0
  953. package/dist/react/mcp-ui/index.d.ts +23 -0
  954. package/dist/react/mcp-ui/index.d.ts.map +1 -0
  955. package/dist/react/mcp-ui/index.js +26 -0
  956. package/dist/react/mcp-ui/index.js.map +1 -0
  957. package/dist/react/mcp-ui/useMcpUiHost.d.ts +160 -0
  958. package/dist/react/mcp-ui/useMcpUiHost.d.ts.map +1 -0
  959. package/dist/react/mcp-ui/useMcpUiHost.js +193 -0
  960. package/dist/react/mcp-ui/useMcpUiHost.js.map +1 -0
  961. package/dist/renderers/annotation-canvas/dependencies.d.ts +13 -0
  962. package/dist/renderers/annotation-canvas/dependencies.d.ts.map +1 -0
  963. package/dist/renderers/annotation-canvas/dependencies.js +8 -0
  964. package/dist/renderers/annotation-canvas/dependencies.js.map +1 -0
  965. package/dist/renderers/annotation-canvas/drawing.d.ts +39 -0
  966. package/dist/renderers/annotation-canvas/drawing.d.ts.map +1 -0
  967. package/dist/renderers/annotation-canvas/drawing.js +135 -0
  968. package/dist/renderers/annotation-canvas/drawing.js.map +1 -0
  969. package/dist/renderers/annotation-canvas/index.d.ts +13 -0
  970. package/dist/renderers/annotation-canvas/index.d.ts.map +1 -0
  971. package/dist/renderers/annotation-canvas/index.js +7 -0
  972. package/dist/renderers/annotation-canvas/index.js.map +1 -0
  973. package/dist/renderers/annotation-canvas/ports.d.ts +30 -0
  974. package/dist/renderers/annotation-canvas/ports.d.ts.map +1 -0
  975. package/dist/renderers/annotation-canvas/ports.js +2 -0
  976. package/dist/renderers/annotation-canvas/ports.js.map +1 -0
  977. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.d.ts +24 -0
  978. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.d.ts.map +1 -0
  979. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.js +102 -0
  980. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.js.map +1 -0
  981. package/dist/renderers/annotation-canvas/react/components/icons.d.ts +11 -0
  982. package/dist/renderers/annotation-canvas/react/components/icons.d.ts.map +1 -0
  983. package/dist/renderers/annotation-canvas/react/components/icons.js +21 -0
  984. package/dist/renderers/annotation-canvas/react/components/icons.js.map +1 -0
  985. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.controller.d.ts +146 -0
  986. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.controller.d.ts.map +1 -0
  987. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.controller.js +118 -0
  988. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.controller.js.map +1 -0
  989. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.d.ts +101 -0
  990. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.d.ts.map +1 -0
  991. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.js +834 -0
  992. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.js.map +1 -0
  993. package/dist/renderers/annotation-canvas/rules.d.ts +73 -0
  994. package/dist/renderers/annotation-canvas/rules.d.ts.map +1 -0
  995. package/dist/renderers/annotation-canvas/rules.js +177 -0
  996. package/dist/renderers/annotation-canvas/rules.js.map +1 -0
  997. package/dist/renderers/annotation-canvas/types.d.ts +108 -0
  998. package/dist/renderers/annotation-canvas/types.d.ts.map +1 -0
  999. package/dist/renderers/annotation-canvas/types.js +2 -0
  1000. package/dist/renderers/annotation-canvas/types.js.map +1 -0
  1001. package/dist/renderers/html-utils.d.ts +25 -0
  1002. package/dist/renderers/html-utils.d.ts.map +1 -0
  1003. package/dist/renderers/html-utils.js +53 -0
  1004. package/dist/renderers/html-utils.js.map +1 -0
  1005. package/dist/renderers/index.d.ts +45 -0
  1006. package/dist/renderers/index.d.ts.map +1 -0
  1007. package/dist/renderers/index.js +36 -0
  1008. package/dist/renderers/index.js.map +1 -0
  1009. package/dist/renderers/new-tab-preview.d.ts +22 -0
  1010. package/dist/renderers/new-tab-preview.d.ts.map +1 -0
  1011. package/dist/renderers/new-tab-preview.js +50 -0
  1012. package/dist/renderers/new-tab-preview.js.map +1 -0
  1013. package/dist/renderers/preview-modal-shell/index.d.ts +10 -0
  1014. package/dist/renderers/preview-modal-shell/index.d.ts.map +1 -0
  1015. package/dist/renderers/preview-modal-shell/index.js +5 -0
  1016. package/dist/renderers/preview-modal-shell/index.js.map +1 -0
  1017. package/dist/renderers/preview-modal-shell/react/components/PreviewModalShell.d.ts +62 -0
  1018. package/dist/renderers/preview-modal-shell/react/components/PreviewModalShell.d.ts.map +1 -0
  1019. package/dist/renderers/preview-modal-shell/react/components/PreviewModalShell.js +74 -0
  1020. package/dist/renderers/preview-modal-shell/react/components/PreviewModalShell.js.map +1 -0
  1021. package/dist/renderers/preview-modal-shell/react/components/icons.d.ts +12 -0
  1022. package/dist/renderers/preview-modal-shell/react/components/icons.d.ts.map +1 -0
  1023. package/dist/renderers/preview-modal-shell/react/components/icons.js +11 -0
  1024. package/dist/renderers/preview-modal-shell/react/components/icons.js.map +1 -0
  1025. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.d.ts +50 -0
  1026. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.d.ts.map +1 -0
  1027. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.js +171 -0
  1028. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.js.map +1 -0
  1029. package/dist/renderers/preview-modal-shell/rules.d.ts +44 -0
  1030. package/dist/renderers/preview-modal-shell/rules.d.ts.map +1 -0
  1031. package/dist/renderers/preview-modal-shell/rules.js +50 -0
  1032. package/dist/renderers/preview-modal-shell/rules.js.map +1 -0
  1033. package/dist/renderers/preview-modal-shell/types.d.ts +50 -0
  1034. package/dist/renderers/preview-modal-shell/types.d.ts.map +1 -0
  1035. package/dist/renderers/preview-modal-shell/types.js +14 -0
  1036. package/dist/renderers/preview-modal-shell/types.js.map +1 -0
  1037. package/dist/renderers/react/components/ArtifactView.d.ts +46 -0
  1038. package/dist/renderers/react/components/ArtifactView.d.ts.map +1 -0
  1039. package/dist/renderers/react/components/ArtifactView.js +35 -0
  1040. package/dist/renderers/react/components/ArtifactView.js.map +1 -0
  1041. package/dist/renderers/react/components/SrcDocSandbox.d.ts +13 -0
  1042. package/dist/renderers/react/components/SrcDocSandbox.d.ts.map +1 -0
  1043. package/dist/renderers/react/components/SrcDocSandbox.js +34 -0
  1044. package/dist/renderers/react/components/SrcDocSandbox.js.map +1 -0
  1045. package/dist/renderers/react/i18n.d.ts +30 -0
  1046. package/dist/renderers/react/i18n.d.ts.map +1 -0
  1047. package/dist/renderers/react/i18n.js +40 -0
  1048. package/dist/renderers/react/i18n.js.map +1 -0
  1049. package/dist/renderers/registry.d.ts +57 -0
  1050. package/dist/renderers/registry.d.ts.map +1 -0
  1051. package/dist/renderers/registry.js +39 -0
  1052. package/dist/renderers/registry.js.map +1 -0
  1053. package/dist/renderers/renderers/html.d.ts +10 -0
  1054. package/dist/renderers/renderers/html.d.ts.map +1 -0
  1055. package/dist/renderers/renderers/html.js +23 -0
  1056. package/dist/renderers/renderers/html.js.map +1 -0
  1057. package/dist/renderers/renderers/index.d.ts +12 -0
  1058. package/dist/renderers/renderers/index.d.ts.map +1 -0
  1059. package/dist/renderers/renderers/index.js +18 -0
  1060. package/dist/renderers/renderers/index.js.map +1 -0
  1061. package/dist/renderers/renderers/markdown.d.ts +4 -0
  1062. package/dist/renderers/renderers/markdown.d.ts.map +1 -0
  1063. package/dist/renderers/renderers/markdown.js +126 -0
  1064. package/dist/renderers/renderers/markdown.js.map +1 -0
  1065. package/dist/renderers/renderers/react-component.d.ts +10 -0
  1066. package/dist/renderers/renderers/react-component.d.ts.map +1 -0
  1067. package/dist/renderers/renderers/react-component.js +19 -0
  1068. package/dist/renderers/renderers/react-component.js.map +1 -0
  1069. package/dist/renderers/renderers/svg.d.ts +3 -0
  1070. package/dist/renderers/renderers/svg.d.ts.map +1 -0
  1071. package/dist/renderers/renderers/svg.js +14 -0
  1072. package/dist/renderers/renderers/svg.js.map +1 -0
  1073. package/dist/renderers/sandbox-bridge.d.ts +44 -0
  1074. package/dist/renderers/sandbox-bridge.d.ts.map +1 -0
  1075. package/dist/renderers/sandbox-bridge.js +46 -0
  1076. package/dist/renderers/sandbox-bridge.js.map +1 -0
  1077. package/dist/renderers/sandboxed-document.d.ts +34 -0
  1078. package/dist/renderers/sandboxed-document.d.ts.map +1 -0
  1079. package/dist/renderers/sandboxed-document.js +152 -0
  1080. package/dist/renderers/sandboxed-document.js.map +1 -0
  1081. package/dist/renderers/shiki.d.ts +2 -0
  1082. package/dist/renderers/shiki.d.ts.map +1 -0
  1083. package/dist/renderers/shiki.js +55 -0
  1084. package/dist/renderers/shiki.js.map +1 -0
  1085. package/dist/renderers/srcdoc/bridge.d.ts +37 -0
  1086. package/dist/renderers/srcdoc/bridge.d.ts.map +1 -0
  1087. package/dist/renderers/srcdoc/bridge.js +35 -0
  1088. package/dist/renderers/srcdoc/bridge.js.map +1 -0
  1089. package/dist/renderers/srcdoc/build.d.ts +130 -0
  1090. package/dist/renderers/srcdoc/build.d.ts.map +1 -0
  1091. package/dist/renderers/srcdoc/build.js +448 -0
  1092. package/dist/renderers/srcdoc/build.js.map +1 -0
  1093. package/dist/renderers/srcdoc/index.d.ts +3 -0
  1094. package/dist/renderers/srcdoc/index.d.ts.map +1 -0
  1095. package/dist/renderers/srcdoc/index.js +3 -0
  1096. package/dist/renderers/srcdoc/index.js.map +1 -0
  1097. package/dist/renderers/types.d.ts +98 -0
  1098. package/dist/renderers/types.d.ts.map +1 -0
  1099. package/dist/renderers/types.js +2 -0
  1100. package/dist/renderers/types.js.map +1 -0
  1101. package/dist/renderers/url-load-decision.d.ts +93 -0
  1102. package/dist/renderers/url-load-decision.d.ts.map +1 -0
  1103. package/dist/renderers/url-load-decision.js +116 -0
  1104. package/dist/renderers/url-load-decision.js.map +1 -0
  1105. package/dist/utils/appearance.d.ts +2 -16
  1106. package/dist/utils/appearance.d.ts.map +1 -1
  1107. package/dist/utils/appearance.js +11 -51
  1108. package/dist/utils/appearance.js.map +1 -1
  1109. package/dist/utils/endpoint-policy.d.ts +65 -0
  1110. package/dist/utils/endpoint-policy.d.ts.map +1 -0
  1111. package/dist/utils/endpoint-policy.js +157 -0
  1112. package/dist/utils/endpoint-policy.js.map +1 -0
  1113. package/dist/utils/file-transfer.d.ts +10 -0
  1114. package/dist/utils/file-transfer.d.ts.map +1 -1
  1115. package/dist/utils/file-transfer.js +22 -1
  1116. package/dist/utils/file-transfer.js.map +1 -1
  1117. package/dist/utils/notifications.d.ts +2 -9
  1118. package/dist/utils/notifications.d.ts.map +1 -1
  1119. package/dist/utils/notifications.js +1 -13
  1120. package/dist/utils/notifications.js.map +1 -1
  1121. package/package.json +118 -15
  1122. package/dist/components/AgentIcon.d.ts +0 -15
  1123. package/dist/components/AgentIcon.d.ts.map +0 -1
  1124. package/dist/components/AgentIcon.js +0 -80
  1125. package/dist/components/AgentIcon.js.map +0 -1
  1126. package/dist/components/AppChromeHeader.d.ts +0 -19
  1127. package/dist/components/AppChromeHeader.d.ts.map +0 -1
  1128. package/dist/components/AppChromeHeader.js +0 -11
  1129. package/dist/components/AppChromeHeader.js.map +0 -1
  1130. package/dist/components/CustomSelect.d.ts +0 -28
  1131. package/dist/components/CustomSelect.d.ts.map +0 -1
  1132. package/dist/components/CustomSelect.js +0 -167
  1133. package/dist/components/CustomSelect.js.map +0 -1
  1134. package/dist/components/ExportDiagnosticsButton.d.ts +0 -40
  1135. package/dist/components/ExportDiagnosticsButton.d.ts.map +0 -1
  1136. package/dist/components/ExportDiagnosticsButton.js +0 -112
  1137. package/dist/components/ExportDiagnosticsButton.js.map +0 -1
  1138. package/dist/components/Icon.d.ts +0 -15
  1139. package/dist/components/Icon.d.ts.map +0 -1
  1140. package/dist/components/Icon.js +0 -236
  1141. package/dist/components/Icon.js.map +0 -1
  1142. package/dist/components/KitErrorBoundary.d.ts +0 -13
  1143. package/dist/components/KitErrorBoundary.d.ts.map +0 -1
  1144. package/dist/components/KitErrorBoundary.js +0 -30
  1145. package/dist/components/KitErrorBoundary.js.map +0 -1
  1146. package/dist/components/LanguageMenu.d.ts +0 -23
  1147. package/dist/components/LanguageMenu.d.ts.map +0 -1
  1148. package/dist/components/LanguageMenu.js +0 -44
  1149. package/dist/components/LanguageMenu.js.map +0 -1
  1150. package/dist/components/Loading.d.ts +0 -27
  1151. package/dist/components/Loading.d.ts.map +0 -1
  1152. package/dist/components/Loading.js +0 -24
  1153. package/dist/components/Loading.js.map +0 -1
  1154. package/dist/components/PaletteTweaks.d.ts +0 -11
  1155. package/dist/components/PaletteTweaks.d.ts.map +0 -1
  1156. package/dist/components/PaletteTweaks.js +0 -65
  1157. package/dist/components/PaletteTweaks.js.map +0 -1
  1158. package/dist/components/RemixIcon.d.ts +0 -15
  1159. package/dist/components/RemixIcon.d.ts.map +0 -1
  1160. package/dist/components/RemixIcon.js +0 -19
  1161. package/dist/components/RemixIcon.js.map +0 -1
  1162. package/dist/components/Toast.d.ts +0 -18
  1163. package/dist/components/Toast.d.ts.map +0 -1
  1164. package/dist/components/Toast.js +0 -70
  1165. package/dist/components/Toast.js.map +0 -1
  1166. package/dist/components/TooltipLayer.d.ts +0 -9
  1167. package/dist/components/TooltipLayer.d.ts.map +0 -1
  1168. package/dist/components/TooltipLayer.js +0 -289
  1169. package/dist/components/TooltipLayer.js.map +0 -1
  1170. package/dist/components/WorkingDirPicker.d.ts +0 -47
  1171. package/dist/components/WorkingDirPicker.d.ts.map +0 -1
  1172. package/dist/components/WorkingDirPicker.js +0 -63
  1173. package/dist/components/WorkingDirPicker.js.map +0 -1
  1174. package/dist/features/agent-tools/model-context.d.ts +0 -30
  1175. package/dist/features/agent-tools/model-context.d.ts.map +0 -1
  1176. package/dist/features/agent-tools/model-context.js +0 -29
  1177. package/dist/features/agent-tools/model-context.js.map +0 -1
  1178. package/dist/features/agent-tools/types.d.ts +0 -34
  1179. package/dist/features/agent-tools/types.d.ts.map +0 -1
  1180. package/dist/features/agent-tools/types.js +0 -18
  1181. package/dist/features/agent-tools/types.js.map +0 -1
  1182. package/dist/features/rich-text-input/constants.d.ts +0 -16
  1183. package/dist/features/rich-text-input/constants.d.ts.map +0 -1
  1184. package/dist/features/rich-text-input/constants.js +0 -18
  1185. package/dist/features/rich-text-input/constants.js.map +0 -1
  1186. package/dist/features/rich-text-input/deserialize.d.ts +0 -9
  1187. package/dist/features/rich-text-input/deserialize.d.ts.map +0 -1
  1188. package/dist/features/rich-text-input/deserialize.js +0 -55
  1189. package/dist/features/rich-text-input/deserialize.js.map +0 -1
  1190. package/dist/features/rich-text-input/index.d.ts +0 -12
  1191. package/dist/features/rich-text-input/index.d.ts.map +0 -1
  1192. package/dist/features/rich-text-input/index.js +0 -11
  1193. package/dist/features/rich-text-input/index.js.map +0 -1
  1194. package/dist/features/rich-text-input/mention-node.d.ts +0 -56
  1195. package/dist/features/rich-text-input/mention-node.d.ts.map +0 -1
  1196. package/dist/features/rich-text-input/mention-node.js +0 -142
  1197. package/dist/features/rich-text-input/mention-node.js.map +0 -1
  1198. package/dist/features/rich-text-input/mention-parser.d.ts +0 -47
  1199. package/dist/features/rich-text-input/mention-parser.d.ts.map +0 -1
  1200. package/dist/features/rich-text-input/mention-parser.js +0 -239
  1201. package/dist/features/rich-text-input/mention-parser.js.map +0 -1
  1202. package/dist/features/rich-text-input/react/components/CaretFloatingLayer.d.ts +0 -20
  1203. package/dist/features/rich-text-input/react/components/CaretFloatingLayer.d.ts.map +0 -1
  1204. package/dist/features/rich-text-input/react/components/CaretFloatingLayer.js +0 -33
  1205. package/dist/features/rich-text-input/react/components/CaretFloatingLayer.js.map +0 -1
  1206. package/dist/features/rich-text-input/react/components/RichTextInput.d.ts +0 -61
  1207. package/dist/features/rich-text-input/react/components/RichTextInput.d.ts.map +0 -1
  1208. package/dist/features/rich-text-input/react/components/RichTextInput.js +0 -154
  1209. package/dist/features/rich-text-input/react/components/RichTextInput.js.map +0 -1
  1210. package/dist/features/rich-text-input/react/hooks/useCaretFloatingLayerPosition.d.ts +0 -15
  1211. package/dist/features/rich-text-input/react/hooks/useCaretFloatingLayerPosition.d.ts.map +0 -1
  1212. package/dist/features/rich-text-input/react/hooks/useCaretFloatingLayerPosition.js +0 -54
  1213. package/dist/features/rich-text-input/react/hooks/useCaretFloatingLayerPosition.js.map +0 -1
  1214. package/dist/features/rich-text-input/react/hooks/useKeyboardCommands.d.ts +0 -11
  1215. package/dist/features/rich-text-input/react/hooks/useKeyboardCommands.d.ts.map +0 -1
  1216. package/dist/features/rich-text-input/react/hooks/useKeyboardCommands.js +0 -70
  1217. package/dist/features/rich-text-input/react/hooks/useKeyboardCommands.js.map +0 -1
  1218. package/dist/features/rich-text-input/react/hooks/useMentionAtomicNavigation.d.ts +0 -8
  1219. package/dist/features/rich-text-input/react/hooks/useMentionAtomicNavigation.d.ts.map +0 -1
  1220. package/dist/features/rich-text-input/react/hooks/useMentionAtomicNavigation.js +0 -63
  1221. package/dist/features/rich-text-input/react/hooks/useMentionAtomicNavigation.js.map +0 -1
  1222. package/dist/features/rich-text-input/react/hooks/useMentionColorStamping.d.ts +0 -18
  1223. package/dist/features/rich-text-input/react/hooks/useMentionColorStamping.d.ts.map +0 -1
  1224. package/dist/features/rich-text-input/react/hooks/useMentionColorStamping.js +0 -64
  1225. package/dist/features/rich-text-input/react/hooks/useMentionColorStamping.js.map +0 -1
  1226. package/dist/features/rich-text-input/react/hooks/usePasteFiles.d.ts +0 -5
  1227. package/dist/features/rich-text-input/react/hooks/usePasteFiles.d.ts.map +0 -1
  1228. package/dist/features/rich-text-input/react/hooks/usePasteFiles.js +0 -24
  1229. package/dist/features/rich-text-input/react/hooks/usePasteFiles.js.map +0 -1
  1230. package/dist/features/rich-text-input/react/hooks/useSeededValue.d.ts +0 -21
  1231. package/dist/features/rich-text-input/react/hooks/useSeededValue.d.ts.map +0 -1
  1232. package/dist/features/rich-text-input/react/hooks/useSeededValue.js +0 -35
  1233. package/dist/features/rich-text-input/react/hooks/useSeededValue.js.map +0 -1
  1234. package/dist/features/rich-text-input/react/hooks/useSyncedOnChange.d.ts +0 -10
  1235. package/dist/features/rich-text-input/react/hooks/useSyncedOnChange.d.ts.map +0 -1
  1236. package/dist/features/rich-text-input/react/hooks/useSyncedOnChange.js +0 -29
  1237. package/dist/features/rich-text-input/react/hooks/useSyncedOnChange.js.map +0 -1
  1238. package/dist/features/rich-text-input/react/hooks/useTriggerDetection.d.ts +0 -6
  1239. package/dist/features/rich-text-input/react/hooks/useTriggerDetection.d.ts.map +0 -1
  1240. package/dist/features/rich-text-input/react/hooks/useTriggerDetection.js +0 -39
  1241. package/dist/features/rich-text-input/react/hooks/useTriggerDetection.js.map +0 -1
  1242. package/dist/features/rich-text-input/react/test-support/lexical-harness.d.ts +0 -11
  1243. package/dist/features/rich-text-input/react/test-support/lexical-harness.d.ts.map +0 -1
  1244. package/dist/features/rich-text-input/react/test-support/lexical-harness.js +0 -35
  1245. package/dist/features/rich-text-input/react/test-support/lexical-harness.js.map +0 -1
  1246. package/dist/features/rich-text-input/rules.d.ts +0 -83
  1247. package/dist/features/rich-text-input/rules.d.ts.map +0 -1
  1248. package/dist/features/rich-text-input/rules.js +0 -317
  1249. package/dist/features/rich-text-input/rules.js.map +0 -1
  1250. package/dist/features/rich-text-input/serialize.d.ts +0 -8
  1251. package/dist/features/rich-text-input/serialize.d.ts.map +0 -1
  1252. package/dist/features/rich-text-input/serialize.js +0 -44
  1253. package/dist/features/rich-text-input/serialize.js.map +0 -1
  1254. package/dist/features/rich-text-input/types.d.ts +0 -83
  1255. package/dist/features/rich-text-input/types.d.ts.map +0 -1
  1256. package/dist/features/rich-text-input/types.js +0 -15
  1257. package/dist/features/rich-text-input/types.js.map +0 -1
  1258. package/dist/features/settings-dialog/index.d.ts +0 -7
  1259. package/dist/features/settings-dialog/index.d.ts.map +0 -1
  1260. package/dist/features/settings-dialog/index.js +0 -4
  1261. package/dist/features/settings-dialog/index.js.map +0 -1
  1262. package/dist/features/settings-dialog/react/components/SettingsDialogShell.d.ts +0 -49
  1263. package/dist/features/settings-dialog/react/components/SettingsDialogShell.d.ts.map +0 -1
  1264. package/dist/features/settings-dialog/react/components/SettingsDialogShell.js +0 -55
  1265. package/dist/features/settings-dialog/react/components/SettingsDialogShell.js.map +0 -1
  1266. package/dist/features/settings-dialog/react/hooks/useSettingsDialogShell.d.ts +0 -39
  1267. package/dist/features/settings-dialog/react/hooks/useSettingsDialogShell.d.ts.map +0 -1
  1268. package/dist/features/settings-dialog/react/hooks/useSettingsDialogShell.js +0 -50
  1269. package/dist/features/settings-dialog/react/hooks/useSettingsDialogShell.js.map +0 -1
  1270. package/dist/features/settings-dialog/rules.d.ts +0 -13
  1271. package/dist/features/settings-dialog/rules.d.ts.map +0 -1
  1272. package/dist/features/settings-dialog/rules.js.map +0 -1
  1273. package/dist/features/settings-dialog/tabs/appearance/constants.d.ts +0 -12
  1274. package/dist/features/settings-dialog/tabs/appearance/constants.d.ts.map +0 -1
  1275. package/dist/features/settings-dialog/tabs/appearance/constants.js +0 -10
  1276. package/dist/features/settings-dialog/tabs/appearance/constants.js.map +0 -1
  1277. package/dist/features/settings-dialog/tabs/appearance/index.d.ts +0 -6
  1278. package/dist/features/settings-dialog/tabs/appearance/index.d.ts.map +0 -1
  1279. package/dist/features/settings-dialog/tabs/appearance/index.js.map +0 -1
  1280. package/dist/features/settings-dialog/tabs/appearance/react/components/AppearanceTab.d.ts.map +0 -1
  1281. package/dist/features/settings-dialog/tabs/appearance/react/components/AppearanceTab.js +0 -31
  1282. package/dist/features/settings-dialog/tabs/appearance/react/components/AppearanceTab.js.map +0 -1
  1283. package/dist/features/settings-dialog/tabs/appearance/types.d.ts +0 -12
  1284. package/dist/features/settings-dialog/tabs/appearance/types.d.ts.map +0 -1
  1285. package/dist/features/settings-dialog/tabs/appearance/types.js +0 -8
  1286. package/dist/features/settings-dialog/tabs/appearance/types.js.map +0 -1
  1287. package/dist/features/settings-dialog/tabs/instructions/index.d.ts.map +0 -1
  1288. package/dist/features/settings-dialog/tabs/instructions/index.js.map +0 -1
  1289. package/dist/features/settings-dialog/tabs/instructions/react/components/InstructionsTab.d.ts.map +0 -1
  1290. package/dist/features/settings-dialog/tabs/instructions/react/components/InstructionsTab.js +0 -16
  1291. package/dist/features/settings-dialog/tabs/instructions/react/components/InstructionsTab.js.map +0 -1
  1292. package/dist/features/settings-dialog/tabs/integrations/constants.d.ts.map +0 -1
  1293. package/dist/features/settings-dialog/tabs/integrations/constants.js.map +0 -1
  1294. package/dist/features/settings-dialog/tabs/integrations/dependencies.d.ts.map +0 -1
  1295. package/dist/features/settings-dialog/tabs/integrations/dependencies.js.map +0 -1
  1296. package/dist/features/settings-dialog/tabs/integrations/index.d.ts +0 -19
  1297. package/dist/features/settings-dialog/tabs/integrations/index.d.ts.map +0 -1
  1298. package/dist/features/settings-dialog/tabs/integrations/index.js +0 -10
  1299. package/dist/features/settings-dialog/tabs/integrations/index.js.map +0 -1
  1300. package/dist/features/settings-dialog/tabs/integrations/ports.d.ts.map +0 -1
  1301. package/dist/features/settings-dialog/tabs/integrations/ports.js.map +0 -1
  1302. package/dist/features/settings-dialog/tabs/integrations/react/components/ClientPicker.d.ts.map +0 -1
  1303. package/dist/features/settings-dialog/tabs/integrations/react/components/ClientPicker.js +0 -31
  1304. package/dist/features/settings-dialog/tabs/integrations/react/components/ClientPicker.js.map +0 -1
  1305. package/dist/features/settings-dialog/tabs/integrations/react/components/CodexInstallToggleButton.d.ts.map +0 -1
  1306. package/dist/features/settings-dialog/tabs/integrations/react/components/CodexInstallToggleButton.js +0 -21
  1307. package/dist/features/settings-dialog/tabs/integrations/react/components/CodexInstallToggleButton.js.map +0 -1
  1308. package/dist/features/settings-dialog/tabs/integrations/react/components/IntegrationsTab.d.ts +0 -27
  1309. package/dist/features/settings-dialog/tabs/integrations/react/components/IntegrationsTab.d.ts.map +0 -1
  1310. package/dist/features/settings-dialog/tabs/integrations/react/components/IntegrationsTab.js +0 -54
  1311. package/dist/features/settings-dialog/tabs/integrations/react/components/IntegrationsTab.js.map +0 -1
  1312. package/dist/features/settings-dialog/tabs/integrations/react/components/SnippetBlock.d.ts.map +0 -1
  1313. package/dist/features/settings-dialog/tabs/integrations/react/components/SnippetBlock.js +0 -53
  1314. package/dist/features/settings-dialog/tabs/integrations/react/components/SnippetBlock.js.map +0 -1
  1315. package/dist/features/settings-dialog/tabs/integrations/react/hooks/useCodexInstallToggle.d.ts.map +0 -1
  1316. package/dist/features/settings-dialog/tabs/integrations/react/hooks/useCodexInstallToggle.js.map +0 -1
  1317. package/dist/features/settings-dialog/tabs/integrations/react/hooks/useMcpInstallInfo.d.ts.map +0 -1
  1318. package/dist/features/settings-dialog/tabs/integrations/react/hooks/useMcpInstallInfo.js.map +0 -1
  1319. package/dist/features/settings-dialog/tabs/integrations/rules.d.ts +0 -45
  1320. package/dist/features/settings-dialog/tabs/integrations/rules.d.ts.map +0 -1
  1321. package/dist/features/settings-dialog/tabs/integrations/rules.js +0 -181
  1322. package/dist/features/settings-dialog/tabs/integrations/rules.js.map +0 -1
  1323. package/dist/features/settings-dialog/tabs/integrations/types.d.ts +0 -58
  1324. package/dist/features/settings-dialog/tabs/integrations/types.d.ts.map +0 -1
  1325. package/dist/features/settings-dialog/tabs/integrations/types.js +0 -15
  1326. package/dist/features/settings-dialog/tabs/integrations/types.js.map +0 -1
  1327. package/dist/features/settings-dialog/tabs/language/index.d.ts.map +0 -1
  1328. package/dist/features/settings-dialog/tabs/language/index.js.map +0 -1
  1329. package/dist/features/settings-dialog/tabs/language/react/components/LanguageTab.d.ts.map +0 -1
  1330. package/dist/features/settings-dialog/tabs/language/react/components/LanguageTab.js +0 -18
  1331. package/dist/features/settings-dialog/tabs/language/react/components/LanguageTab.js.map +0 -1
  1332. package/dist/features/settings-dialog/tabs/language/types.d.ts +0 -15
  1333. package/dist/features/settings-dialog/tabs/language/types.d.ts.map +0 -1
  1334. package/dist/features/settings-dialog/tabs/language/types.js.map +0 -1
  1335. package/dist/features/settings-dialog/tabs/notifications/constants.d.ts.map +0 -1
  1336. package/dist/features/settings-dialog/tabs/notifications/constants.js +0 -8
  1337. package/dist/features/settings-dialog/tabs/notifications/constants.js.map +0 -1
  1338. package/dist/features/settings-dialog/tabs/notifications/index.d.ts +0 -5
  1339. package/dist/features/settings-dialog/tabs/notifications/index.d.ts.map +0 -1
  1340. package/dist/features/settings-dialog/tabs/notifications/index.js.map +0 -1
  1341. package/dist/features/settings-dialog/tabs/notifications/react/components/NotificationsTab.d.ts +0 -33
  1342. package/dist/features/settings-dialog/tabs/notifications/react/components/NotificationsTab.d.ts.map +0 -1
  1343. package/dist/features/settings-dialog/tabs/notifications/react/components/NotificationsTab.js +0 -71
  1344. package/dist/features/settings-dialog/tabs/notifications/react/components/NotificationsTab.js.map +0 -1
  1345. package/dist/features/settings-dialog/tabs/notifications/types.d.ts +0 -15
  1346. package/dist/features/settings-dialog/tabs/notifications/types.d.ts.map +0 -1
  1347. package/dist/features/settings-dialog/tabs/notifications/types.js.map +0 -1
  1348. package/dist/features/settings-dialog/tabs/privacy/index.d.ts +0 -5
  1349. package/dist/features/settings-dialog/tabs/privacy/index.d.ts.map +0 -1
  1350. package/dist/features/settings-dialog/tabs/privacy/index.js.map +0 -1
  1351. package/dist/features/settings-dialog/tabs/privacy/react/components/PrivacyTab.d.ts +0 -34
  1352. package/dist/features/settings-dialog/tabs/privacy/react/components/PrivacyTab.d.ts.map +0 -1
  1353. package/dist/features/settings-dialog/tabs/privacy/react/components/PrivacyTab.js +0 -36
  1354. package/dist/features/settings-dialog/tabs/privacy/react/components/PrivacyTab.js.map +0 -1
  1355. package/dist/features/settings-dialog/tabs/privacy/rules.d.ts.map +0 -1
  1356. package/dist/features/settings-dialog/tabs/privacy/rules.js +0 -70
  1357. package/dist/features/settings-dialog/tabs/privacy/rules.js.map +0 -1
  1358. package/dist/features/settings-dialog/tabs/privacy/types.d.ts.map +0 -1
  1359. package/dist/features/settings-dialog/tabs/privacy/types.js.map +0 -1
  1360. package/dist/features/settings-dialog/types.d.ts +0 -46
  1361. package/dist/features/settings-dialog/types.d.ts.map +0 -1
  1362. package/dist/features/settings-dialog/types.js +0 -18
  1363. package/dist/features/settings-dialog/types.js.map +0 -1
  1364. package/dist/hooks/useCoalescedCallback.d.ts +0 -35
  1365. package/dist/hooks/useCoalescedCallback.d.ts.map +0 -1
  1366. package/dist/hooks/useCoalescedCallback.js +0 -61
  1367. package/dist/hooks/useCoalescedCallback.js.map +0 -1
  1368. package/dist/hooks/useDebouncedValue.d.ts +0 -2
  1369. package/dist/hooks/useDebouncedValue.d.ts.map +0 -1
  1370. package/dist/hooks/useDebouncedValue.js +0 -14
  1371. package/dist/hooks/useDebouncedValue.js.map +0 -1
  1372. package/dist/hooks/useInView.d.ts +0 -19
  1373. package/dist/hooks/useInView.d.ts.map +0 -1
  1374. package/dist/hooks/useInView.js +0 -39
  1375. package/dist/hooks/useInView.js.map +0 -1
  1376. package/dist/hooks/useResizableSplitPane.d.ts +0 -44
  1377. package/dist/hooks/useResizableSplitPane.d.ts.map +0 -1
  1378. package/dist/hooks/useResizableSplitPane.js +0 -259
  1379. package/dist/hooks/useResizableSplitPane.js.map +0 -1
  1380. package/dist/hooks/useStableHandler.d.ts +0 -10
  1381. package/dist/hooks/useStableHandler.d.ts.map +0 -1
  1382. package/dist/hooks/useStableHandler.js +0 -17
  1383. package/dist/hooks/useStableHandler.js.map +0 -1
  1384. package/dist/vitest-chat-entry.d.ts +0 -13
  1385. package/dist/vitest-chat-entry.d.ts.map +0 -1
  1386. package/dist/vitest-chat-entry.js +0 -13
  1387. package/dist/vitest-chat-entry.js.map +0 -1
  1388. /package/dist/features/{settings-dialog/tabs/appearance → appearance}/index.js +0 -0
  1389. /package/dist/features/{settings-dialog/tabs/appearance → appearance}/react/components/AppearanceTab.d.ts +0 -0
  1390. /package/dist/features/{settings-dialog/tabs/integrations → execution}/ports.js +0 -0
  1391. /package/dist/features/{settings-dialog/tabs/language → i18n/dictionaries}/types.js +0 -0
  1392. /package/dist/features/{settings-dialog/tabs/instructions → instructions}/index.d.ts +0 -0
  1393. /package/dist/features/{settings-dialog/tabs/instructions → instructions}/index.js +0 -0
  1394. /package/dist/features/{settings-dialog/tabs/instructions → instructions}/react/components/InstructionsTab.d.ts +0 -0
  1395. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/constants.d.ts +0 -0
  1396. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/constants.js +0 -0
  1397. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/dependencies.d.ts +0 -0
  1398. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/dependencies.js +0 -0
  1399. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/ports.d.ts +0 -0
  1400. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/components/ClientPicker.d.ts +0 -0
  1401. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/components/CodexInstallToggleButton.d.ts +0 -0
  1402. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/components/SnippetBlock.d.ts +0 -0
  1403. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/hooks/useCodexInstallToggle.d.ts +0 -0
  1404. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/hooks/useCodexInstallToggle.js +0 -0
  1405. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/hooks/useMcpInstallInfo.d.ts +0 -0
  1406. /package/dist/features/{settings-dialog/tabs/integrations → integrations}/react/hooks/useMcpInstallInfo.js +0 -0
  1407. /package/dist/features/{settings-dialog/tabs/notifications → interactive-ui}/types.js +0 -0
  1408. /package/dist/features/{settings-dialog/tabs/language → language}/index.d.ts +0 -0
  1409. /package/dist/features/{settings-dialog/tabs/language → language}/index.js +0 -0
  1410. /package/dist/features/{settings-dialog/tabs/language → language}/react/components/LanguageTab.d.ts +0 -0
  1411. /package/dist/features/{settings-dialog/tabs/notifications → notifications}/constants.d.ts +0 -0
  1412. /package/dist/features/{settings-dialog/tabs/notifications → notifications}/index.js +0 -0
  1413. /package/dist/features/{settings-dialog/tabs/privacy → privacy}/index.js +0 -0
  1414. /package/dist/features/{settings-dialog/tabs/privacy → privacy}/rules.d.ts +0 -0
  1415. /package/dist/features/{settings-dialog/tabs/privacy → privacy}/types.d.ts +0 -0
  1416. /package/dist/features/{settings-dialog/tabs/privacy → privacy}/types.js +0 -0
  1417. /package/dist/features/{settings-dialog → tabbed-dialog}/rules.js +0 -0
@@ -0,0 +1,4434 @@
1
+ /**
2
+ * Tab CONTENT styling for `SettingsDialogShell` and its `tabs/*` components — fields,
3
+ * cards, agent lists, byok forms, segmented controls, and every other `.jini-*` primitive
4
+ * a tab renders inside the shell. The shell CHROME itself (backdrop, sidebar nav,
5
+ * fullscreen/collapse/close affordances, and the `--jini-*` design tokens both layers
6
+ * share) lives in `../../../tabbed-dialog/styles/tabbed-dialog.css` — imported below — since
7
+ * 2026-08-13, when the shell was extracted into the product-neutral `TabbedDialog`
8
+ * component so hosts other than Settings could mount it under its own name.
9
+ *
10
+ * The `@import` keeps every existing importer of THIS file (`SettingsUi.tsx`,
11
+ * `AiAssistant.tsx`, `Media.tsx`, `AssistantDock.tsx`) working unchanged — they still get
12
+ * the complete rule set, chrome included, from the one `@jini-ai/ui/settings-dialog.css`
13
+ * subpath they already import. A host that only needs the chrome (no tab content) can
14
+ * import `@jini-ai/ui/tabbed-dialog.css` directly instead.
15
+ */
16
+
17
+ @import '../../../tabbed-dialog/styles/tabbed-dialog.css';
18
+
19
+
20
+ /* ============================================================
21
+ Shared tab primitives
22
+ ============================================================ */
23
+
24
+ .jini-settings-section {
25
+ display: flex;
26
+ flex-direction: column;
27
+ gap: 14px;
28
+ margin-top: 14px;
29
+ }
30
+
31
+ .jini-section-head {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ gap: 12px;
36
+ flex-wrap: wrap;
37
+ }
38
+
39
+ .jini-field {
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: 4px;
43
+ }
44
+
45
+ .jini-field-label {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 6px;
49
+ font-size: 12px;
50
+ font-weight: 500;
51
+ color: var(--jini-text-muted);
52
+ }
53
+
54
+ .jini-field-required {
55
+ color: var(--jini-danger);
56
+ }
57
+
58
+ .jini-field-link {
59
+ margin-left: auto;
60
+ color: var(--jini-accent);
61
+ font-size: 12px;
62
+ text-decoration: none;
63
+ }
64
+
65
+ .jini-field-link:hover {
66
+ color: var(--jini-accent-hover);
67
+ text-decoration: underline;
68
+ }
69
+
70
+ /* `.jini-hint` is the same helper-text role under a different name — used by
71
+ Notifications, Privacy, and the MCP server tab instead of this class. Same
72
+ rule, both selectors: this is a naming drift from an earlier pass that
73
+ updated those components without updating this stylesheet, not two
74
+ different kinds of hint text. */
75
+ .jini-field-hint,
76
+ .jini-hint {
77
+ font-size: 12px;
78
+ color: var(--jini-text-muted);
79
+ }
80
+
81
+ .jini-field-hint.is-error {
82
+ color: var(--jini-danger);
83
+ }
84
+
85
+ .jini-field-input-row {
86
+ display: flex;
87
+ align-items: stretch;
88
+ gap: 6px;
89
+ min-width: 0;
90
+ }
91
+
92
+ .jini-field-input-row > .jini-input {
93
+ flex: 1 1 auto;
94
+ min-width: 0;
95
+ }
96
+
97
+ .jini-input {
98
+ width: 100%;
99
+ min-width: 0;
100
+ padding: 8px 10px;
101
+ font: inherit;
102
+ font-size: 13px;
103
+ color: var(--jini-text);
104
+ background: var(--jini-bg-panel);
105
+ border: 1px solid var(--jini-border);
106
+ border-radius: var(--jini-radius-sm);
107
+ transition: border-color 120ms var(--jini-ease-out), box-shadow 120ms var(--jini-ease-out);
108
+ }
109
+
110
+ .jini-input:focus {
111
+ outline: none;
112
+ border-color: var(--jini-accent);
113
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent);
114
+ }
115
+
116
+ .jini-input.is-missing {
117
+ border-color: color-mix(in srgb, var(--jini-danger) 55%, var(--jini-border));
118
+ }
119
+
120
+ /* `.jini-button` is the same naming drift as `.jini-hint` above — Privacy's
121
+ "Delete my data" and the MCP server tab's snippet-copy/one-click-install
122
+ controls use this family instead of `.jini-btn`. `<a>` is included
123
+ alongside `<button>` because the MCP server tab's "One-click install"
124
+ deep link renders as an anchor styled as a button, not a real button. */
125
+ .jini-btn,
126
+ .jini-button,
127
+ a.jini-button {
128
+ display: inline-flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ gap: 6px;
132
+ padding: 7px 14px;
133
+ font: inherit;
134
+ font-size: 12px;
135
+ font-weight: 500;
136
+ color: var(--jini-text);
137
+ background: var(--jini-bg-panel);
138
+ border: 1px solid var(--jini-border);
139
+ border-radius: var(--jini-radius-sm);
140
+ cursor: pointer;
141
+ text-decoration: none;
142
+ transition: border-color 120ms var(--jini-ease-out), background-color 120ms var(--jini-ease-out);
143
+ }
144
+
145
+ .jini-btn:hover:not(:disabled),
146
+ .jini-button:hover:not(:disabled) {
147
+ border-color: var(--jini-border-strong);
148
+ }
149
+
150
+ .jini-btn:disabled,
151
+ .jini-button:disabled {
152
+ opacity: 0.55;
153
+ cursor: not-allowed;
154
+ }
155
+
156
+ /* No existing `.jini-btn-primary` to alias — nothing in this stylesheet had
157
+ a filled/accent button treatment before the MCP server tab's "One-click
158
+ install" needed one, so this is a genuinely new definition, not a rename
159
+ fix. `jini-button-disabled` mirrors it: the deep link has no native
160
+ `disabled` (it drops `href` instead — see `IntegrationsTab.tsx`), so the
161
+ component sets this class in the same case a real `disabled` attribute
162
+ would apply. */
163
+ .jini-button-primary {
164
+ color: #fff;
165
+ background: var(--jini-accent);
166
+ border-color: var(--jini-accent);
167
+ }
168
+
169
+ .jini-button-primary:hover {
170
+ background: var(--jini-accent-hover);
171
+ border-color: var(--jini-accent-hover);
172
+ }
173
+
174
+ .jini-button-disabled {
175
+ opacity: 0.55;
176
+ cursor: not-allowed;
177
+ pointer-events: none;
178
+ }
179
+
180
+ .jini-input-affix-btn {
181
+ flex: 0 0 auto;
182
+ padding: 0 12px;
183
+ font: inherit;
184
+ font-size: 12px;
185
+ color: var(--jini-text-muted);
186
+ background: var(--jini-bg-subtle);
187
+ border: 1px solid var(--jini-border);
188
+ border-radius: var(--jini-radius-sm);
189
+ cursor: pointer;
190
+ }
191
+
192
+ .jini-input-affix-btn:hover {
193
+ color: var(--jini-text);
194
+ }
195
+
196
+ .jini-empty-card {
197
+ padding: 16px;
198
+ border: 1px dashed var(--jini-border);
199
+ border-radius: var(--jini-radius-sm);
200
+ color: var(--jini-text-muted);
201
+ font-size: 12px;
202
+ background: var(--jini-bg-subtle);
203
+ }
204
+
205
+ /* Color modifiers for the MCP server tab's daemon-error and
206
+ prerequisite-missing states (`IntegrationsTab.tsx`). */
207
+ .jini-empty-card-error {
208
+ border-color: color-mix(in srgb, var(--jini-danger) 45%, var(--jini-border));
209
+ color: var(--jini-danger);
210
+ background: color-mix(in srgb, var(--jini-danger) 6%, var(--jini-bg-subtle));
211
+ }
212
+
213
+ .jini-empty-card-warning {
214
+ border-color: color-mix(in srgb, var(--jini-accent) 45%, var(--jini-border));
215
+ background: color-mix(in srgb, var(--jini-accent) 6%, var(--jini-bg-subtle));
216
+ }
217
+
218
+ /* Segmented control — shared by AppearanceTab and ExecutionTab. */
219
+
220
+ .jini-seg-control {
221
+ display: grid;
222
+ grid-template-columns: repeat(var(--seg-cols, 2), minmax(0, 1fr));
223
+ gap: 2px;
224
+ padding: 3px;
225
+ background: var(--jini-bg-subtle);
226
+ border: 1px solid var(--jini-border);
227
+ border-radius: var(--jini-radius);
228
+ min-height: 42px;
229
+ min-width: 0;
230
+ }
231
+
232
+ .jini-seg-btn {
233
+ display: inline-flex;
234
+ align-items: baseline;
235
+ justify-content: center;
236
+ gap: 8px;
237
+ padding: 8px 12px;
238
+ border: 1px solid transparent;
239
+ border-radius: var(--jini-radius-sm);
240
+ background: transparent;
241
+ color: var(--jini-text);
242
+ font: inherit;
243
+ cursor: pointer;
244
+ text-align: center;
245
+ min-width: 0;
246
+ }
247
+
248
+ .jini-seg-btn.active {
249
+ background: var(--jini-bg-panel);
250
+ box-shadow: var(--jini-shadow-xs);
251
+ }
252
+
253
+ .jini-seg-btn:disabled {
254
+ opacity: 0.55;
255
+ cursor: not-allowed;
256
+ }
257
+
258
+ .jini-seg-title {
259
+ font-size: 12px;
260
+ font-weight: 500;
261
+ white-space: nowrap;
262
+ overflow: hidden;
263
+ text-overflow: ellipsis;
264
+ flex: 0 0 auto;
265
+ }
266
+
267
+ .jini-seg-btn.active .jini-seg-title {
268
+ font-weight: 600;
269
+ }
270
+
271
+ .jini-seg-meta {
272
+ font-size: 11px;
273
+ color: var(--jini-text-muted);
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+ /* `0 1 auto`, not `1 1 auto`: growing pushed the meta to the far edge of a
277
+ wide button and left the title stranded at the other. */
278
+ flex: 0 1 auto;
279
+ min-width: 0;
280
+ }
281
+
282
+ /* ============================================================
283
+ Execution tab
284
+ ============================================================ */
285
+
286
+ .jini-settings-execution {
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 4px;
290
+ }
291
+
292
+ .jini-provider-chip-row {
293
+ display: flex;
294
+ align-items: center;
295
+ gap: 10px;
296
+ flex-wrap: wrap;
297
+ min-width: 0;
298
+ }
299
+
300
+ .jini-provider-chip-row-label {
301
+ color: var(--jini-text-muted);
302
+ font-size: 11px;
303
+ font-weight: 600;
304
+ white-space: nowrap;
305
+ }
306
+
307
+ .jini-provider-chip-options {
308
+ display: flex;
309
+ flex-wrap: wrap;
310
+ gap: 6px;
311
+ min-width: 0;
312
+ }
313
+
314
+ .jini-provider-chip {
315
+ display: inline-flex;
316
+ align-items: center;
317
+ gap: 6px;
318
+ flex: 0 1 auto;
319
+ max-width: 100%;
320
+ min-width: 0;
321
+ background: transparent;
322
+ border: 1px solid var(--jini-border);
323
+ border-radius: var(--jini-radius-pill);
324
+ padding: 4px 12px;
325
+ font: inherit;
326
+ font-size: 12px;
327
+ font-weight: 500;
328
+ color: var(--jini-text-muted);
329
+ cursor: pointer;
330
+ white-space: nowrap;
331
+ overflow: hidden;
332
+ text-overflow: ellipsis;
333
+ transition:
334
+ background 120ms var(--jini-ease-out),
335
+ color 120ms var(--jini-ease-out),
336
+ border-color 120ms var(--jini-ease-out);
337
+ }
338
+
339
+ .jini-provider-chip:hover {
340
+ color: var(--jini-text);
341
+ border-color: var(--jini-border-strong);
342
+ }
343
+
344
+ .jini-provider-chip.active {
345
+ background: var(--jini-accent);
346
+ border-color: var(--jini-accent);
347
+ color: #fff;
348
+ }
349
+
350
+ .jini-provider-chip-status {
351
+ width: 7px;
352
+ height: 7px;
353
+ border-radius: var(--jini-radius-pill);
354
+ flex: 0 0 auto;
355
+ background: var(--jini-text-disabled);
356
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--jini-text-disabled) 16%, transparent);
357
+ }
358
+
359
+ .jini-provider-chip-status.is-configured {
360
+ background: var(--jini-success);
361
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--jini-success) 18%, transparent);
362
+ }
363
+
364
+ .jini-provider-chip.active .jini-provider-chip-status.is-configured,
365
+ .jini-provider-chip.active .jini-provider-chip-status.is-unset {
366
+ box-shadow: 0 0 0 2px color-mix(in srgb, #fff 40%, transparent);
367
+ }
368
+
369
+ .jini-byok-card {
370
+ display: flex;
371
+ flex-direction: column;
372
+ gap: 14px;
373
+ padding: 16px;
374
+ border: 1px solid var(--jini-border);
375
+ border-radius: var(--jini-radius);
376
+ background: var(--jini-bg-panel);
377
+ }
378
+
379
+ .jini-byok-card-title {
380
+ margin: 0;
381
+ font-size: 14px;
382
+ font-weight: 600;
383
+ color: var(--jini-text-strong);
384
+ }
385
+
386
+ .jini-byok-test-row {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: 10px;
390
+ flex-wrap: wrap;
391
+ }
392
+
393
+ .jini-byok-test-status {
394
+ font-size: 12px;
395
+ }
396
+
397
+ .jini-byok-test-status.is-ok {
398
+ color: var(--jini-success);
399
+ }
400
+
401
+ .jini-byok-test-status.is-error {
402
+ color: var(--jini-danger);
403
+ }
404
+
405
+ /* Local CLI list */
406
+
407
+ .jini-agent-group-head {
408
+ margin: 0;
409
+ font-size: 12px;
410
+ font-weight: 600;
411
+ color: var(--jini-text-muted);
412
+ }
413
+
414
+ .jini-section-head-text {
415
+ display: flex;
416
+ flex-direction: column;
417
+ gap: 2px;
418
+ min-width: 0;
419
+ }
420
+
421
+ .jini-local-cli-scope {
422
+ margin: 0 0 4px;
423
+ }
424
+
425
+ /* Agent cards. The origin drew a responsive grid of selectable vendor cards;
426
+ `auto-fill` keeps it one column inside a narrow settings panel and two or
427
+ more when the host gives the dialog room. */
428
+ .jini-agent-grid {
429
+ display: grid;
430
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
431
+ gap: 10px;
432
+ }
433
+
434
+ .jini-agent-card {
435
+ display: flex;
436
+ flex-direction: column;
437
+ border: 1px solid var(--jini-border);
438
+ border-radius: var(--jini-radius);
439
+ background: var(--jini-bg-panel);
440
+ transition: border-color 120ms var(--jini-ease-out), box-shadow 120ms var(--jini-ease-out);
441
+ }
442
+
443
+ .jini-agent-card.is-missing {
444
+ opacity: 0.6;
445
+ }
446
+
447
+ .jini-agent-card.is-selected {
448
+ border-color: var(--jini-accent);
449
+ box-shadow: 0 0 0 1px var(--jini-accent);
450
+ }
451
+
452
+ .jini-agent-card-main {
453
+ display: flex;
454
+ align-items: flex-start;
455
+ gap: 8px;
456
+ padding: 12px;
457
+ }
458
+
459
+ .jini-agent-card-select {
460
+ flex: 1 1 auto;
461
+ display: flex;
462
+ align-items: flex-start;
463
+ gap: 10px;
464
+ min-width: 0;
465
+ padding: 0;
466
+ border: 0;
467
+ background: none;
468
+ text-align: left;
469
+ cursor: pointer;
470
+ color: inherit;
471
+ font: inherit;
472
+ }
473
+
474
+ .jini-agent-card-select:disabled {
475
+ cursor: default;
476
+ }
477
+
478
+ /* The whole card is the click target, not just the text at the top of it.
479
+ *
480
+ * `.jini-agent-grid` is a grid, so selecting one CLI stretches every card in
481
+ * that row to match the expanded one — while `-select` keeps its natural
482
+ * content height. The space the row-mate's expansion added was therefore
483
+ * inert: clicking the lower two-thirds of a stretched-but-unselected card did
484
+ * nothing, which reads as a broken card rather than as "aim higher".
485
+ *
486
+ * `:last-child` is load-bearing. A card renders its diagnostics, model config,
487
+ * test result and path-repair actions as SIBLINGS after `-main`, and those
488
+ * blocks contain their own buttons; growing `-main` unconditionally would push
489
+ * them to the card's bottom edge, and a full-card overlay would swallow their
490
+ * clicks outright. `-main:last-child` is true exactly when nothing rendered
491
+ * after it — the unselected, no-diagnostics case this bug is about.
492
+ *
493
+ * `:not(.is-selected)` guards the padding move specifically: a SELECTED card
494
+ * can render its Test button inside `-main`, and zeroing the padding there
495
+ * would shove that button flush against the card edge. */
496
+ .jini-agent-card:not(.is-selected) .jini-agent-card-main:last-child {
497
+ flex: 1 1 auto;
498
+ /* Handed to the button below — left here it would ring the card in 12px of
499
+ unclickable margin, a smaller version of the same bug. */
500
+ padding: 0;
501
+ }
502
+
503
+ .jini-agent-card:not(.is-selected) .jini-agent-card-main:last-child > .jini-agent-card-select {
504
+ /* The row is `align-items: flex-start` so the Test button never stretches;
505
+ this opts the select button alone into filling the card. Its own
506
+ `align-items: flex-start` keeps icon and text at the top — only the hit
507
+ area grows. */
508
+ align-self: stretch;
509
+ /* Exactly the padding `-main` gave up, so nothing moves on screen. */
510
+ padding: 12px;
511
+ }
512
+
513
+ .jini-agent-card-icon {
514
+ flex: 0 0 auto;
515
+ display: grid;
516
+ place-items: center;
517
+ width: 32px;
518
+ height: 32px;
519
+ border-radius: var(--jini-radius-sm);
520
+ background: var(--jini-bg-subtle);
521
+ color: var(--jini-text-muted);
522
+ font-size: 14px;
523
+ font-weight: 600;
524
+ }
525
+
526
+ .jini-agent-card-icon > img,
527
+ .jini-agent-card-icon > svg {
528
+ width: 20px;
529
+ height: 20px;
530
+ }
531
+
532
+ .jini-agent-card-body {
533
+ display: flex;
534
+ flex-direction: column;
535
+ gap: 3px;
536
+ min-width: 0;
537
+ }
538
+
539
+ .jini-agent-card-name {
540
+ display: flex;
541
+ align-items: baseline;
542
+ flex-wrap: wrap;
543
+ gap: 4px;
544
+ min-width: 0;
545
+ }
546
+
547
+ .jini-agent-card-title {
548
+ font-size: 13px;
549
+ font-weight: 600;
550
+ color: var(--jini-text);
551
+ }
552
+
553
+ .jini-agent-card-name-divider {
554
+ color: var(--jini-text-disabled);
555
+ }
556
+
557
+ .jini-agent-card-tagline {
558
+ font-size: 12px;
559
+ color: var(--jini-text-muted);
560
+ }
561
+
562
+ .jini-agent-card-badges {
563
+ display: flex;
564
+ flex-wrap: wrap;
565
+ gap: 4px;
566
+ }
567
+
568
+ .jini-agent-card-badge {
569
+ padding: 1px 7px;
570
+ border-radius: var(--jini-radius-pill);
571
+ background: var(--jini-bg-subtle);
572
+ border: 1px solid var(--jini-border);
573
+ font-size: 10px;
574
+ font-weight: 500;
575
+ color: var(--jini-text-muted);
576
+ }
577
+
578
+ .jini-agent-card-meta {
579
+ font-size: 11px;
580
+ color: var(--jini-text-muted);
581
+ overflow-wrap: anywhere;
582
+ }
583
+
584
+ .jini-agent-card-model-summary {
585
+ display: flex;
586
+ align-items: baseline;
587
+ gap: 5px;
588
+ font-size: 11px;
589
+ color: var(--jini-text-muted);
590
+ }
591
+
592
+ .jini-agent-card-model-summary > strong {
593
+ font-weight: 500;
594
+ color: var(--jini-text);
595
+ }
596
+
597
+ .jini-agent-card-test {
598
+ flex: 0 0 auto;
599
+ }
600
+
601
+ .jini-agent-card-test.is-loading {
602
+ opacity: 0.7;
603
+ }
604
+
605
+ .jini-agent-card-config {
606
+ display: flex;
607
+ flex-direction: column;
608
+ gap: 4px;
609
+ padding: 0 12px 12px;
610
+ border-top: 1px solid var(--jini-border);
611
+ margin-top: 2px;
612
+ padding-top: 10px;
613
+ }
614
+
615
+ /* The source badge is load-bearing, not decoration: a built-in list can be
616
+ stale, and the operator needs to see which one they are choosing from. */
617
+ .jini-agent-model-source {
618
+ margin-left: 6px;
619
+ padding: 1px 6px;
620
+ border-radius: var(--jini-radius-pill);
621
+ font-size: 10px;
622
+ font-weight: 500;
623
+ background: var(--jini-bg-subtle);
624
+ color: var(--jini-text-muted);
625
+ border: 1px solid var(--jini-border);
626
+ }
627
+
628
+ .jini-agent-model-source.live {
629
+ color: var(--jini-success);
630
+ border-color: color-mix(in srgb, var(--jini-success) 40%, transparent);
631
+ background: color-mix(in srgb, var(--jini-success) 10%, transparent);
632
+ }
633
+
634
+ .jini-agent-card-test-result {
635
+ margin: 0;
636
+ padding: 0 12px 12px;
637
+ font-size: 12px;
638
+ }
639
+
640
+ .jini-agent-card-test-result.is-ok {
641
+ color: var(--jini-success);
642
+ }
643
+
644
+ .jini-agent-card-test-result.is-error {
645
+ color: var(--jini-danger);
646
+ }
647
+
648
+ .jini-agent-scan-card {
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 10px;
652
+ padding: 14px 16px;
653
+ border: 1px solid var(--jini-border);
654
+ border-radius: var(--jini-radius-sm);
655
+ background: var(--jini-bg-subtle);
656
+ font-size: 13px;
657
+ }
658
+
659
+ .jini-agent-scan-ring {
660
+ width: 14px;
661
+ height: 14px;
662
+ flex: 0 0 auto;
663
+ border-radius: var(--jini-radius-pill);
664
+ border: 2px solid color-mix(in srgb, var(--jini-accent) 30%, transparent);
665
+ border-top-color: var(--jini-accent);
666
+ animation: jini-settings-spin 700ms linear infinite;
667
+ }
668
+
669
+ @keyframes jini-settings-spin {
670
+ to {
671
+ transform: rotate(360deg);
672
+ }
673
+ }
674
+
675
+ @media (prefers-reduced-motion: reduce) {
676
+ .jini-agent-scan-ring {
677
+ animation: none;
678
+ }
679
+ }
680
+
681
+ /* Agent diagnostics (open-design-parity gap 5) — "one-line reason + fix
682
+ button(s)", never a silent grey card. Severity sets only the left accent
683
+ and message color; layout matches `.jini-agent-card-test-result` above. */
684
+ .jini-agent-diagnostic {
685
+ display: flex;
686
+ align-items: center;
687
+ justify-content: space-between;
688
+ gap: 10px;
689
+ margin: 0 12px 10px;
690
+ padding: 8px 10px;
691
+ border: 1px solid var(--jini-border);
692
+ border-left: 3px solid var(--jini-border-strong);
693
+ border-radius: var(--jini-radius-sm);
694
+ background: var(--jini-bg-subtle);
695
+ font-size: 12px;
696
+ }
697
+
698
+ .jini-agent-diagnostic.is-error {
699
+ border-left-color: var(--jini-danger);
700
+ }
701
+
702
+ .jini-agent-diagnostic.is-error .jini-agent-diagnostic-message {
703
+ color: var(--jini-danger);
704
+ }
705
+
706
+ .jini-agent-diagnostic.is-warning {
707
+ border-left-color: var(--jini-accent);
708
+ }
709
+
710
+ .jini-agent-diagnostic-message {
711
+ color: var(--jini-text);
712
+ overflow: hidden;
713
+ text-overflow: ellipsis;
714
+ white-space: nowrap;
715
+ }
716
+
717
+ .jini-agent-diagnostic-actions {
718
+ display: flex;
719
+ flex: 0 0 auto;
720
+ gap: 4px;
721
+ }
722
+
723
+ .jini-agent-diagnostic-action {
724
+ display: inline-flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ width: 24px;
728
+ height: 24px;
729
+ padding: 0;
730
+ color: var(--jini-text-muted);
731
+ background: transparent;
732
+ border: 1px solid var(--jini-border);
733
+ border-radius: var(--jini-radius-sm);
734
+ cursor: pointer;
735
+ transition: color 120ms var(--jini-ease-out), border-color 120ms var(--jini-ease-out);
736
+ }
737
+
738
+ .jini-agent-diagnostic-action:hover {
739
+ color: var(--jini-text);
740
+ border-color: var(--jini-border-strong);
741
+ }
742
+
743
+ /* Per-agent CLI env overrides (gap 1) — a collapsed disclosure so the card
744
+ stays compact for the operators who never open it. */
745
+ .jini-agent-cli-env {
746
+ margin: 0 12px 10px;
747
+ padding-top: 10px;
748
+ border-top: 1px solid var(--jini-border);
749
+ }
750
+
751
+ .jini-agent-cli-env-summary {
752
+ cursor: pointer;
753
+ font-size: 12px;
754
+ font-weight: 500;
755
+ color: var(--jini-text-muted);
756
+ }
757
+
758
+ .jini-agent-cli-env-summary:hover {
759
+ color: var(--jini-text);
760
+ }
761
+
762
+ .jini-agent-cli-env-body {
763
+ display: flex;
764
+ flex-direction: column;
765
+ gap: 8px;
766
+ margin-top: 8px;
767
+ }
768
+
769
+ .jini-agent-cli-env-grid {
770
+ display: grid;
771
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
772
+ gap: 10px;
773
+ }
774
+
775
+ /* Executable-path repair (gap 6) — "a configured override didn't work, use
776
+ the binary that actually ran instead". */
777
+ .jini-agent-card-path-repair {
778
+ display: flex;
779
+ flex-direction: column;
780
+ gap: 6px;
781
+ margin: 0 12px 12px;
782
+ padding: 10px;
783
+ border: 1px solid var(--jini-border);
784
+ border-radius: var(--jini-radius-sm);
785
+ background: var(--jini-bg-subtle);
786
+ }
787
+
788
+ .jini-agent-card-path-repair-actions {
789
+ display: flex;
790
+ gap: 8px;
791
+ }
792
+
793
+ .jini-btn-ghost,
794
+ .jini-button-ghost {
795
+ background: transparent;
796
+ }
797
+
798
+ /* A host app's own global `button:disabled` reset (Tovu's admin: `styles.css`'s burnt-orange
799
+ `color-mix` tint) is a type selector + pseudo-class, (0,1,1) specificity — it outranks the
800
+ class-only rule above for the SAME property, so a disabled ghost button would otherwise show
801
+ that host's accent tint behind it instead of staying transparent (confirmed live: the Media
802
+ providers tab's disabled "Clear" button). `:disabled` gives this rule the matching (0,1,1)
803
+ specificity it needs to win regardless of which host renders it — a ghost button has no fill in
804
+ any state, disabled included, and that contract shouldn't depend on what a consuming app's own
805
+ button reset happens to do.
806
+
807
+ `color` needs the same treatment, not just `background`: Tovu's global rule sets BOTH as a
808
+ matched pair (a near-white "ink" meant to sit on ITS OWN peach fill), so resetting only the
809
+ background left white-on-white invisible text — confirmed live, not a hypothetical. `.jini-
810
+ button:disabled` (above, line ~150) already dims via `opacity: 0.55`; restoring the ordinary
811
+ `var(--jini-text)` here just gives that opacity something visible to dim, same as every other
812
+ disabled `.jini-button` variant that doesn't hit this host-specific collision. */
813
+ .jini-btn-ghost:disabled,
814
+ .jini-button-ghost:disabled {
815
+ background: transparent;
816
+ color: var(--jini-text);
817
+ }
818
+
819
+ /* Searchable model select (gap 4) — thin wrapper around the shared
820
+ `CustomSelect` primitive; the wrapper itself carries no layout beyond
821
+ filling its `.jini-field`. */
822
+ .jini-searchable-select {
823
+ width: 100%;
824
+ }
825
+
826
+ .jini-searchable-select-search-row {
827
+ padding: 6px 6px 4px;
828
+ }
829
+
830
+ .jini-searchable-select-search {
831
+ padding: 6px 8px;
832
+ font-size: 12px;
833
+ }
834
+
835
+ /* `CustomSelect` (packages/ui/src/react/components/CustomSelect.tsx) — first
836
+ real consumer is this tab's `SearchableModelSelect`, so its base styling
837
+ lands here rather than in a package-wide stylesheet that doesn't otherwise
838
+ exist for `react/components`. */
839
+ .jini-select {
840
+ width: 100%;
841
+ }
842
+
843
+ .jini-select-trigger {
844
+ display: flex;
845
+ align-items: center;
846
+ justify-content: space-between;
847
+ gap: 8px;
848
+ width: 100%;
849
+ padding: 8px 10px;
850
+ font: inherit;
851
+ font-size: 13px;
852
+ text-align: left;
853
+ color: var(--jini-text);
854
+ background: var(--jini-bg-panel);
855
+ border: 1px solid var(--jini-border);
856
+ border-radius: var(--jini-radius-sm);
857
+ cursor: pointer;
858
+ }
859
+
860
+ .jini-select-trigger:hover:not(:disabled) {
861
+ border-color: var(--jini-border-strong);
862
+ }
863
+
864
+ .jini-select-trigger:disabled {
865
+ opacity: 0.55;
866
+ cursor: not-allowed;
867
+ }
868
+
869
+ .jini-select-value {
870
+ overflow: hidden;
871
+ text-overflow: ellipsis;
872
+ white-space: nowrap;
873
+ }
874
+
875
+ .jini-select-menu {
876
+ z-index: 60;
877
+ overflow-y: auto;
878
+ background: var(--jini-bg-panel);
879
+ /* REQUIRED, not a tidy-up. `CustomSelect` renders this menu through
880
+ `createPortal(menu, document.body)`, so it is not a descendant of the
881
+ dialog and inherits `color` from the HOST's `<body>` — whatever that
882
+ happens to be. Setting only `background` left the two halves sourced from
883
+ different systems: this rule's `--jini-bg-panel` and the host's own text
884
+ colour.
885
+
886
+ Measured in a host admin, `prefers-color-scheme: dark`, pinned light via
887
+ `data-theme="light"` on a WRAPPER (which the portal escapes):
888
+ background rgb(34, 33, 32) <- Jini dark token
889
+ color oklch(0.24 0.022 262) <- the host's own --fg, also dark
890
+ i.e. dark text on a dark menu. Unreadable, and it reads as "the dropdown
891
+ is broken" rather than as a theming fault.
892
+
893
+ Every other property here already resolves through a `--jini-*` token; the
894
+ foreground was the one that did not, and portalling is exactly the case
895
+ where inheriting it stops being safe. */
896
+ color: var(--jini-text);
897
+ border: 1px solid var(--jini-border);
898
+ border-radius: var(--jini-radius-sm);
899
+ box-shadow: 0 8px 24px color-mix(in srgb, black 18%, transparent);
900
+ }
901
+
902
+ .jini-select-menu.inline {
903
+ position: relative;
904
+ margin-top: 4px;
905
+ width: 100%;
906
+ }
907
+
908
+ .jini-select-menu.portal {
909
+ position: fixed;
910
+ }
911
+
912
+ .jini-select-group-label {
913
+ padding: 6px 10px 2px;
914
+ font-size: 11px;
915
+ font-weight: 600;
916
+ color: var(--jini-text-muted);
917
+ text-transform: uppercase;
918
+ }
919
+
920
+ .jini-select-option {
921
+ display: flex;
922
+ align-items: center;
923
+ justify-content: space-between;
924
+ gap: 8px;
925
+ width: 100%;
926
+ padding: 7px 10px;
927
+ font: inherit;
928
+ font-size: 13px;
929
+ text-align: left;
930
+ color: var(--jini-text);
931
+ background: transparent;
932
+ border: none;
933
+ cursor: pointer;
934
+ }
935
+
936
+ .jini-select-option.active {
937
+ background: var(--jini-bg-subtle);
938
+ }
939
+
940
+ .jini-select-option.selected {
941
+ font-weight: 500;
942
+ }
943
+
944
+ .jini-select-option:disabled {
945
+ color: var(--jini-text-muted);
946
+ cursor: not-allowed;
947
+ }
948
+
949
+ .jini-select-option-check {
950
+ display: none;
951
+ flex: 0 0 auto;
952
+ color: var(--jini-accent);
953
+ }
954
+
955
+ .jini-select-option.selected .jini-select-option-check {
956
+ display: inline-flex;
957
+ }
958
+
959
+ /* ============================================================
960
+ Instructions tab
961
+ ============================================================
962
+ `InstructionsTab.tsx` renders `jini-settings-section-card` /
963
+ `jini-field-block` / `jini-instructions-card` / `jini-block-head` /
964
+ `jini-instructions-input` / `jini-custom-instructions-input` — none of
965
+ which existed here, so the tab fell back to unstyled browser defaults: no
966
+ card, and a ~2-row, monospace-looking default `<textarea>`. Reference:
967
+ `od-settings-instructions.png` — one bordered card holding the title,
968
+ description and textarea, the textarea spanning the card at several rows
969
+ tall. */
970
+
971
+ .jini-settings-section-card {
972
+ padding: 16px;
973
+ border: 1px solid var(--jini-border);
974
+ border-radius: var(--jini-radius);
975
+ background: var(--jini-bg-panel);
976
+ }
977
+
978
+ .jini-field-block {
979
+ display: flex;
980
+ flex-direction: column;
981
+ gap: 12px;
982
+ }
983
+
984
+ .jini-block-head h4 {
985
+ margin: 0;
986
+ font-size: 14px;
987
+ font-weight: 600;
988
+ color: var(--jini-text-strong);
989
+ }
990
+
991
+ .jini-instructions-input,
992
+ .jini-custom-instructions-input {
993
+ width: 100%;
994
+ min-height: 96px;
995
+ box-sizing: border-box;
996
+ padding: 10px 12px;
997
+ font: inherit;
998
+ font-size: 13px;
999
+ line-height: 1.5;
1000
+ color: var(--jini-text);
1001
+ background: var(--jini-bg-panel);
1002
+ border: 1px solid var(--jini-border);
1003
+ border-radius: var(--jini-radius-sm);
1004
+ resize: vertical;
1005
+ }
1006
+
1007
+ .jini-instructions-input:focus,
1008
+ .jini-custom-instructions-input:focus {
1009
+ outline: none;
1010
+ border-color: var(--jini-accent);
1011
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent);
1012
+ }
1013
+
1014
+ /* ============================================================
1015
+ Notifications tab
1016
+ ============================================================
1017
+ `NotificationsTab.tsx`'s `jini-settings-notify-card` /
1018
+ `jini-settings-notify-card-header` had no rules, so the title and its
1019
+ On/Off pill (a `.jini-seg-control` with `--seg-cols: 1`) stacked instead
1020
+ of sharing a row, and the pill stretched to the panel's full width instead
1021
+ of sizing to its own label. Reference: `od-settings-notifications.png` —
1022
+ title and pill share one row inside a bordered card, description below
1023
+ both, still inside the same card. */
1024
+
1025
+ .jini-settings-subsection {
1026
+ display: flex;
1027
+ flex-direction: column;
1028
+ gap: 10px;
1029
+ }
1030
+
1031
+ .jini-settings-notify-card {
1032
+ display: flex;
1033
+ flex-direction: column;
1034
+ gap: 6px;
1035
+ padding: 14px 16px;
1036
+ border: 1px solid var(--jini-border);
1037
+ border-radius: var(--jini-radius);
1038
+ background: var(--jini-bg-panel);
1039
+ }
1040
+
1041
+ .jini-settings-notify-card-header {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ justify-content: space-between;
1045
+ gap: 12px;
1046
+ }
1047
+
1048
+ .jini-settings-notify-card-header h4 {
1049
+ margin: 0;
1050
+ font-size: 14px;
1051
+ font-weight: 600;
1052
+ color: var(--jini-text-strong);
1053
+ }
1054
+
1055
+ /* A flex item's default main-axis size is its content size, which is what
1056
+ keeps the header's `.jini-seg-control` pill-sized instead of stretching —
1057
+ no explicit width needed once the header above is a flex row. */
1058
+
1059
+ .jini-settings-field {
1060
+ display: flex;
1061
+ flex-direction: column;
1062
+ gap: 6px;
1063
+ }
1064
+
1065
+ .jini-settings-field > label {
1066
+ font-size: 12px;
1067
+ font-weight: 500;
1068
+ color: var(--jini-text-muted);
1069
+ }
1070
+
1071
+ /* ============================================================
1072
+ Privacy tab
1073
+ ============================================================
1074
+ `PrivacyTab.tsx`'s disclosure list was a bare `<dl>`/`<dt>`/`<dd>` (browser
1075
+ default `<dd>` indent leaking through), its consent buttons
1076
+ (`jini-privacy-consent-action*`) were unstyled text, and its toggle
1077
+ switches (`jini-toggle-row*`) had NO rules anywhere in this file — not
1078
+ even a partial match; `grep -i "toggle|switch"` against the file returned
1079
+ nothing before this. Reference: `od-settings-privacy.png` — the two
1080
+ disclosure items read as plain title+description pairs, the two consent
1081
+ buttons sit side by side with the primary one filled, and the granular
1082
+ toggles are real switches once a consent decision exists
1083
+ (`hasMadeConsentDecision`). */
1084
+
1085
+ /* `PrivacyTab.tsx` puts its two `jini-section-head` headings ("Help improve
1086
+ this product", "Installation ID") in a bare `<h4>` with no className of
1087
+ its own, unlike e.g. `LocalCliAgentList.tsx`'s "Your CLIs" heading, which
1088
+ carries its own `jini-agent-group-head` (already reset). Without this, the
1089
+ browser's ~1.33em default `<h4>` block margin fights `.jini-section-head`'s
1090
+ own `gap`. Scoped to `.jini-settings-privacy` specifically — `.jini-
1091
+ section-head` is a shared primitive several other tabs also use, each with
1092
+ its own heading markup, so a blanket reset here isn't this tab's call to
1093
+ make. */
1094
+ .jini-settings-privacy .jini-section-head h4 {
1095
+ margin: 0;
1096
+ font-size: 14px;
1097
+ font-weight: 600;
1098
+ color: var(--jini-text-strong);
1099
+ }
1100
+
1101
+ .jini-settings-privacy-disclosure {
1102
+ margin: 0;
1103
+ display: flex;
1104
+ flex-direction: column;
1105
+ gap: 10px;
1106
+ }
1107
+
1108
+ .jini-settings-privacy-disclosure > div {
1109
+ display: flex;
1110
+ flex-direction: column;
1111
+ gap: 2px;
1112
+ }
1113
+
1114
+ .jini-settings-privacy-disclosure dt {
1115
+ margin: 0;
1116
+ font-size: 13px;
1117
+ font-weight: 600;
1118
+ color: var(--jini-text-strong);
1119
+ }
1120
+
1121
+ .jini-settings-privacy-disclosure dd {
1122
+ margin: 0;
1123
+ font-size: 12px;
1124
+ color: var(--jini-text-muted);
1125
+ }
1126
+
1127
+ .jini-privacy-consent-actions {
1128
+ display: flex;
1129
+ gap: 10px;
1130
+ }
1131
+
1132
+ .jini-privacy-consent-action {
1133
+ flex: 1 1 0;
1134
+ padding: 9px 16px;
1135
+ font: inherit;
1136
+ font-size: 13px;
1137
+ font-weight: 600;
1138
+ color: var(--jini-text);
1139
+ background: var(--jini-bg-panel);
1140
+ border: 1px solid var(--jini-border-strong);
1141
+ border-radius: var(--jini-radius-sm);
1142
+ cursor: pointer;
1143
+ }
1144
+
1145
+ .jini-privacy-consent-action:hover {
1146
+ border-color: var(--jini-text-muted);
1147
+ }
1148
+
1149
+ .jini-privacy-consent-action--primary {
1150
+ color: #fff;
1151
+ background: var(--jini-accent);
1152
+ border-color: var(--jini-accent);
1153
+ }
1154
+
1155
+ .jini-privacy-consent-action--primary:hover,
1156
+ .jini-privacy-consent-action--primary.is-active {
1157
+ background: var(--jini-accent-hover);
1158
+ border-color: var(--jini-accent-hover);
1159
+ }
1160
+
1161
+ .jini-settings-privacy-toggles {
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ gap: 8px;
1165
+ }
1166
+
1167
+ .jini-toggle-row {
1168
+ display: flex;
1169
+ align-items: center;
1170
+ justify-content: space-between;
1171
+ gap: 16px;
1172
+ width: 100%;
1173
+ padding: 12px 14px;
1174
+ font: inherit;
1175
+ text-align: left;
1176
+ color: var(--jini-text);
1177
+ background: var(--jini-bg-panel);
1178
+ border: 1px solid var(--jini-border);
1179
+ border-radius: var(--jini-radius);
1180
+ cursor: pointer;
1181
+ }
1182
+
1183
+ .jini-toggle-row-text {
1184
+ display: flex;
1185
+ flex-direction: column;
1186
+ gap: 2px;
1187
+ }
1188
+
1189
+ .jini-toggle-row-label {
1190
+ font-size: 13px;
1191
+ font-weight: 600;
1192
+ color: var(--jini-text-strong);
1193
+ }
1194
+
1195
+ .jini-toggle-row-hint {
1196
+ font-size: 12px;
1197
+ color: var(--jini-text-muted);
1198
+ }
1199
+
1200
+ .jini-toggle-row-switch {
1201
+ position: relative;
1202
+ flex: 0 0 auto;
1203
+ width: 36px;
1204
+ height: 20px;
1205
+ border-radius: var(--jini-radius-pill);
1206
+ background: var(--jini-border-strong);
1207
+ transition: background-color 120ms var(--jini-ease-out);
1208
+ }
1209
+
1210
+ .jini-toggle-row-switch::after {
1211
+ content: "";
1212
+ position: absolute;
1213
+ top: 2px;
1214
+ left: 2px;
1215
+ width: 16px;
1216
+ height: 16px;
1217
+ border-radius: 50%;
1218
+ background: #fff;
1219
+ box-shadow: var(--jini-shadow-xs);
1220
+ transition: transform 120ms var(--jini-ease-out);
1221
+ }
1222
+
1223
+ .jini-toggle-row.on .jini-toggle-row-switch {
1224
+ background: var(--jini-accent);
1225
+ }
1226
+
1227
+ .jini-toggle-row.on .jini-toggle-row-switch::after {
1228
+ transform: translateX(16px);
1229
+ }
1230
+
1231
+ /* ============================================================
1232
+ Appearance tab — accent swatches
1233
+ ============================================================
1234
+ `AppearanceTab.tsx`'s theme segmented control already worked (it reuses
1235
+ the shared `.jini-seg-control` primitive), but `jini-accent-swatches` /
1236
+ `jini-accent-swatch` / `jini-accent-swatch-picker` had no size, shape, or
1237
+ selected-state rules — each swatch is a bare `<button style="background:
1238
+ <color>">` with no explicit dimensions. Reference: `od-settings-
1239
+ appearance.png` — a row of small circular swatches, the selected one
1240
+ ringed, plus a same-sized native color-picker swatch at the end. */
1241
+
1242
+ .jini-accent-swatches {
1243
+ display: flex;
1244
+ flex-wrap: wrap;
1245
+ align-items: center;
1246
+ gap: 8px;
1247
+ }
1248
+
1249
+ .jini-accent-swatch {
1250
+ width: 24px;
1251
+ height: 24px;
1252
+ padding: 0;
1253
+ border: none;
1254
+ border-radius: 50%;
1255
+ cursor: pointer;
1256
+ box-shadow: 0 0 0 1px var(--jini-border) inset;
1257
+ }
1258
+
1259
+ .jini-accent-swatch.active {
1260
+ box-shadow: 0 0 0 2px var(--jini-bg-panel), 0 0 0 4px var(--jini-text-strong);
1261
+ }
1262
+
1263
+ .jini-accent-swatch-picker {
1264
+ width: 24px;
1265
+ height: 24px;
1266
+ padding: 0;
1267
+ border: 1px solid var(--jini-border);
1268
+ border-radius: 50%;
1269
+ overflow: hidden;
1270
+ cursor: pointer;
1271
+ background: var(--jini-bg-panel);
1272
+ }
1273
+
1274
+ .jini-accent-swatch-picker::-webkit-color-swatch-wrapper {
1275
+ padding: 0;
1276
+ }
1277
+
1278
+ .jini-accent-swatch-picker::-webkit-color-swatch {
1279
+ border: none;
1280
+ border-radius: 50%;
1281
+ }
1282
+
1283
+ .jini-accent-swatch-picker::-moz-color-swatch {
1284
+ border: none;
1285
+ border-radius: 50%;
1286
+ }
1287
+
1288
+ /* ============================================================
1289
+ Language tab
1290
+ ============================================================
1291
+ `LanguageTab.tsx`'s `jini-settings-language-tile-title` and
1292
+ `jini-settings-language-tile-code` spans had no layout separating them —
1293
+ two adjacent inline text nodes with no line break, so "English" + "en"
1294
+ rendered as the single word "Englishen". Reference: `od-settings-
1295
+ language.png` — a grid of bordered tiles, each locale's name above its
1296
+ code. */
1297
+
1298
+ .jini-settings-language-grid {
1299
+ display: grid;
1300
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
1301
+ gap: 8px;
1302
+ }
1303
+
1304
+ .jini-settings-language-tile {
1305
+ display: flex;
1306
+ align-items: center;
1307
+ justify-content: space-between;
1308
+ gap: 8px;
1309
+ padding: 10px 12px;
1310
+ font: inherit;
1311
+ text-align: left;
1312
+ color: var(--jini-text);
1313
+ background: var(--jini-bg-panel);
1314
+ border: 1px solid var(--jini-border);
1315
+ border-radius: var(--jini-radius);
1316
+ cursor: pointer;
1317
+ }
1318
+
1319
+ .jini-settings-language-tile:hover {
1320
+ border-color: var(--jini-border-strong);
1321
+ }
1322
+
1323
+ .jini-settings-language-tile.active {
1324
+ border-color: var(--jini-accent);
1325
+ background: color-mix(in srgb, var(--jini-accent) 8%, var(--jini-bg-panel));
1326
+ color: var(--jini-accent);
1327
+ }
1328
+
1329
+ .jini-settings-language-tile-text {
1330
+ display: flex;
1331
+ flex-direction: column;
1332
+ gap: 2px;
1333
+ }
1334
+
1335
+ .jini-settings-language-tile-title {
1336
+ font-size: 13px;
1337
+ font-weight: 600;
1338
+ }
1339
+
1340
+ .jini-settings-language-tile-code {
1341
+ font-size: 11px;
1342
+ color: var(--jini-text-muted);
1343
+ }
1344
+
1345
+ .jini-settings-language-tile.active .jini-settings-language-tile-code {
1346
+ color: inherit;
1347
+ }
1348
+
1349
+ /* ============================================================
1350
+ MCP server tab (IntegrationsTab, ClientPicker, SnippetBlock)
1351
+ ============================================================
1352
+ `jini-mcp-*` and `jini-picker-*` had no rules at all. The concrete symptom
1353
+ was `ClientPicker.tsx`'s `jini-picker-title` and `jini-picker-sub` — two
1354
+ adjacent inline spans with nothing to put them on separate lines, so
1355
+ "Claude Code" + "CLI command" rendered as the single string "Claude
1356
+ CodeCLI command". Reference: `od-settings-mcp-server.png` — an
1357
+ uppercase-kicker capabilities card, a bordered client-picker dropdown
1358
+ whose name and method sub-label sit on their own lines, and a dark code
1359
+ block with the Copy button overlaid on it rather than below as its own
1360
+ row. */
1361
+
1362
+ .jini-mcp-capabilities-card {
1363
+ padding: 14px 16px;
1364
+ border: 1px solid var(--jini-border);
1365
+ border-radius: var(--jini-radius);
1366
+ background: var(--jini-bg-panel);
1367
+ }
1368
+
1369
+ .jini-mcp-capabilities-label {
1370
+ margin: 0 0 8px;
1371
+ font-size: 11px;
1372
+ font-weight: 700;
1373
+ text-transform: uppercase;
1374
+ letter-spacing: 0.05em;
1375
+ color: var(--jini-text-muted);
1376
+ }
1377
+
1378
+ .jini-mcp-capabilities-list {
1379
+ margin: 0;
1380
+ padding-left: 18px;
1381
+ display: flex;
1382
+ flex-direction: column;
1383
+ gap: 4px;
1384
+ font-size: 13px;
1385
+ color: var(--jini-text);
1386
+ }
1387
+
1388
+ .jini-mcp-setup-card {
1389
+ display: flex;
1390
+ flex-direction: column;
1391
+ gap: 12px;
1392
+ }
1393
+
1394
+ .jini-mcp-instruction {
1395
+ margin: 0;
1396
+ font-size: 12px;
1397
+ color: var(--jini-text-muted);
1398
+ }
1399
+
1400
+ .jini-mcp-restart-note {
1401
+ font-size: 12px;
1402
+ color: var(--jini-text-muted);
1403
+ }
1404
+
1405
+ .jini-mcp-deeplink-row {
1406
+ display: flex;
1407
+ align-items: center;
1408
+ gap: 10px;
1409
+ flex-wrap: wrap;
1410
+ }
1411
+
1412
+ .jini-picker {
1413
+ position: relative;
1414
+ }
1415
+
1416
+ .jini-picker-trigger {
1417
+ display: flex;
1418
+ align-items: center;
1419
+ justify-content: space-between;
1420
+ gap: 12px;
1421
+ width: 100%;
1422
+ padding: 10px 14px;
1423
+ font: inherit;
1424
+ text-align: left;
1425
+ color: var(--jini-text);
1426
+ background: var(--jini-bg-panel);
1427
+ border: 1px solid var(--jini-border);
1428
+ border-radius: var(--jini-radius);
1429
+ cursor: pointer;
1430
+ }
1431
+
1432
+ .jini-picker-trigger:hover,
1433
+ .jini-picker-trigger.open {
1434
+ border-color: var(--jini-border-strong);
1435
+ }
1436
+
1437
+ .jini-picker-meta {
1438
+ display: flex;
1439
+ align-items: baseline;
1440
+ gap: 8px;
1441
+ min-width: 0;
1442
+ }
1443
+
1444
+ .jini-picker-title {
1445
+ font-size: 13px;
1446
+ font-weight: 600;
1447
+ }
1448
+
1449
+ .jini-picker-sub {
1450
+ font-size: 12px;
1451
+ color: var(--jini-text-muted);
1452
+ }
1453
+
1454
+ .jini-picker-chevron {
1455
+ flex: 0 0 auto;
1456
+ color: var(--jini-text-muted);
1457
+ transition: transform 120ms var(--jini-ease-out);
1458
+ }
1459
+
1460
+ .jini-picker-popover {
1461
+ position: absolute;
1462
+ z-index: 20;
1463
+ top: calc(100% + 4px);
1464
+ left: 0;
1465
+ right: 0;
1466
+ padding: 6px;
1467
+ background: var(--jini-bg-elevated);
1468
+ border: 1px solid var(--jini-border);
1469
+ border-radius: var(--jini-radius);
1470
+ box-shadow: var(--jini-shadow-lg);
1471
+ }
1472
+
1473
+ .jini-picker-list {
1474
+ display: flex;
1475
+ flex-direction: column;
1476
+ gap: 2px;
1477
+ max-height: 260px;
1478
+ overflow-y: auto;
1479
+ }
1480
+
1481
+ .jini-picker-item {
1482
+ display: flex;
1483
+ align-items: baseline;
1484
+ justify-content: space-between;
1485
+ gap: 8px;
1486
+ padding: 8px 10px;
1487
+ font: inherit;
1488
+ text-align: left;
1489
+ color: var(--jini-text);
1490
+ background: transparent;
1491
+ border: none;
1492
+ border-radius: var(--jini-radius-sm);
1493
+ cursor: pointer;
1494
+ }
1495
+
1496
+ .jini-picker-item:hover {
1497
+ background: var(--jini-bg-subtle);
1498
+ }
1499
+
1500
+ .jini-picker-item.active {
1501
+ background: color-mix(in srgb, var(--jini-accent) 10%, transparent);
1502
+ color: var(--jini-accent);
1503
+ }
1504
+
1505
+ .jini-picker-item-title {
1506
+ font-size: 13px;
1507
+ }
1508
+
1509
+ .jini-picker-item-sub {
1510
+ font-size: 11px;
1511
+ color: var(--jini-text-muted);
1512
+ }
1513
+
1514
+ .jini-snippet-block {
1515
+ position: relative;
1516
+ }
1517
+
1518
+ .jini-snippet-pre {
1519
+ margin: 0;
1520
+ padding: 14px 16px;
1521
+ overflow-x: auto;
1522
+ background: var(--jini-text-strong);
1523
+ border-radius: var(--jini-radius);
1524
+ }
1525
+
1526
+ .jini-snippet-code {
1527
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
1528
+ font-size: 12px;
1529
+ line-height: 1.6;
1530
+ color: var(--jini-bg-panel);
1531
+ white-space: pre-wrap;
1532
+ word-break: break-all;
1533
+ }
1534
+
1535
+ .jini-snippet-copy-btn {
1536
+ position: absolute;
1537
+ top: 10px;
1538
+ right: 10px;
1539
+ color: var(--jini-bg-panel);
1540
+ background: color-mix(in srgb, var(--jini-text-strong) 60%, transparent);
1541
+ border-color: transparent;
1542
+ }
1543
+
1544
+ .jini-snippet-copy-btn:hover {
1545
+ background: color-mix(in srgb, var(--jini-text-strong) 75%, transparent);
1546
+ }
1547
+
1548
+ /* ============================================================
1549
+ Connectors tab — PORTED from OD's real source, not authored by eye.
1550
+ Sources: `foundry/integrations/open-design/reference/od-web-src.orig/
1551
+ styles/workspace/connectors.css`, `.../workspace/drawer.css`, and
1552
+ `.../primitives.css` (base `button`/`.ghost`/`.primary` — see the
1553
+ scoping note below). `ConnectorsBrowser.tsx`'s classNames are a 1:1,
1554
+ unrenamed match with OD's original component (confirmed against
1555
+ `.../components/ConnectorsBrowser.tsx`), so every selector below is
1556
+ copied verbatim except: `var(--od-token)` → `var(--jini-token)`
1557
+ (identical values, confirmed against OD's `tokens.css`); three tokens
1558
+ OD has that this file didn't (`--radius-md`, `--shadow-md`, `--warning`)
1559
+ were added to the `:root` blocks above rather than hardcoded; and every
1560
+ OD-global `button`/`.ghost`/`.primary`/`.icon-only` rule is rescoped
1561
+ under `.connectors-panel` — those are unscoped in OD's own app (a
1562
+ single-purpose SPA where every button gets that treatment), but here
1563
+ they'd otherwise leak onto every unrelated `<button>` in the Tovu admin.
1564
+ Two intentional substitutions where jini's token set has no equivalent:
1565
+ `var(--bg)` (OD's page-level background, distinct from `--bg-panel`) →
1566
+ `var(--jini-bg-subtle)` in the gate's backdrop gradient; OD's
1567
+ `.entry-tab-content:has(...)` (its outer scrollable route content, N/A
1568
+ here) → `.jini-tabbed-dialog-content:has(...)`, this host's actual
1569
+ outer scroll container, so the masked-grid height-clamp logic still
1570
+ anchors to a real ancestor. */
1571
+
1572
+ .tab-panel {
1573
+ display: flex;
1574
+ flex-direction: column;
1575
+ gap: 18px;
1576
+ }
1577
+
1578
+ .tab-panel-toolbar {
1579
+ display: flex;
1580
+ gap: 10px;
1581
+ align-items: center;
1582
+ justify-content: space-between;
1583
+ flex-wrap: wrap;
1584
+ row-gap: 8px;
1585
+ position: sticky;
1586
+ top: 0;
1587
+ z-index: 4;
1588
+ background: var(--jini-bg-panel);
1589
+ }
1590
+ .tab-panel-toolbar .toolbar-left {
1591
+ display: flex;
1592
+ gap: 8px;
1593
+ align-items: center;
1594
+ flex: 0 0 auto;
1595
+ min-width: 0;
1596
+ }
1597
+ .tab-panel-toolbar .toolbar-right {
1598
+ display: flex;
1599
+ gap: 8px;
1600
+ align-items: center;
1601
+ flex: 1 1 auto;
1602
+ min-width: 0;
1603
+ justify-content: flex-end;
1604
+ flex-wrap: wrap;
1605
+ }
1606
+ .tab-panel-toolbar .toolbar-search {
1607
+ position: relative;
1608
+ flex: 1 1 180px;
1609
+ min-width: 140px;
1610
+ max-width: 280px;
1611
+ }
1612
+ @media (max-width: 720px) {
1613
+ .tab-panel-toolbar { flex-direction: column; align-items: stretch; }
1614
+ .tab-panel-toolbar .toolbar-left { justify-content: flex-start; }
1615
+ .tab-panel-toolbar .toolbar-right { justify-content: space-between; }
1616
+ .tab-panel-toolbar .toolbar-search { max-width: none; }
1617
+ }
1618
+ .tab-panel-toolbar .toolbar-search input {
1619
+ padding-left: 30px;
1620
+ background: var(--jini-bg-panel);
1621
+ }
1622
+ .tab-panel-toolbar .toolbar-search input[type='search']::-webkit-search-cancel-button {
1623
+ appearance: none;
1624
+ -webkit-appearance: none;
1625
+ }
1626
+ .tab-panel-toolbar .toolbar-search input[disabled] {
1627
+ opacity: 0.6;
1628
+ cursor: not-allowed;
1629
+ }
1630
+ .tab-panel-toolbar .toolbar-search .toolbar-search-clear {
1631
+ position: absolute;
1632
+ right: 6px;
1633
+ top: 50%;
1634
+ transform: translateY(-50%);
1635
+ display: inline-flex;
1636
+ align-items: center;
1637
+ justify-content: center;
1638
+ width: 20px;
1639
+ height: 20px;
1640
+ padding: 0;
1641
+ border: 0;
1642
+ border-radius: var(--jini-radius-pill);
1643
+ background: transparent;
1644
+ color: var(--jini-text-disabled);
1645
+ cursor: pointer;
1646
+ transition: background-color 120ms var(--jini-ease-out), color 120ms var(--jini-ease-out);
1647
+ }
1648
+ .tab-panel-toolbar .toolbar-search .toolbar-search-clear:hover {
1649
+ background: var(--jini-bg-subtle);
1650
+ color: var(--jini-text);
1651
+ }
1652
+ .tab-panel-toolbar .toolbar-search .toolbar-search-clear:focus-visible {
1653
+ outline: 2px solid var(--jini-text);
1654
+ outline-offset: 2px;
1655
+ }
1656
+ .tab-panel-toolbar .toolbar-search .search-icon {
1657
+ position: absolute;
1658
+ left: 9px;
1659
+ top: 50%;
1660
+ transform: translateY(-50%);
1661
+ color: var(--jini-text-disabled);
1662
+ font-size: 13px;
1663
+ pointer-events: none;
1664
+ }
1665
+ .tab-empty {
1666
+ padding: 48px 0;
1667
+ text-align: center;
1668
+ color: var(--jini-text-muted);
1669
+ font-size: 13px;
1670
+ }
1671
+
1672
+ .connectors-heading h2 {
1673
+ margin: 0;
1674
+ font-size: 18px;
1675
+ line-height: 1.25;
1676
+ }
1677
+ .connectors-heading p {
1678
+ margin: 4px 0 0;
1679
+ color: var(--jini-text-muted);
1680
+ font-size: 13px;
1681
+ }
1682
+ .tab-panel-toolbar .toolbar-search.connectors-search {
1683
+ flex: 0 1 320px;
1684
+ width: min(320px, 100%);
1685
+ }
1686
+ .tab-panel-toolbar .toolbar-search.connectors-search input {
1687
+ padding-right: 32px;
1688
+ }
1689
+ .connectors-empty {
1690
+ display: flex;
1691
+ flex-direction: column;
1692
+ align-items: center;
1693
+ gap: 8px;
1694
+ padding: 64px 16px;
1695
+ text-align: center;
1696
+ }
1697
+ .connectors-empty-title {
1698
+ margin: 0;
1699
+ font-size: 14px;
1700
+ color: var(--jini-text);
1701
+ font-weight: 500;
1702
+ max-width: 480px;
1703
+ word-break: break-word;
1704
+ }
1705
+ .connectors-empty-body {
1706
+ margin: 0;
1707
+ font-size: 13px;
1708
+ color: var(--jini-text-muted);
1709
+ max-width: 480px;
1710
+ }
1711
+ .connectors-empty-action {
1712
+ margin-top: 8px;
1713
+ }
1714
+ .connector-grid {
1715
+ display: grid;
1716
+ grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
1717
+ gap: 14px;
1718
+ }
1719
+ .connector-card {
1720
+ position: relative;
1721
+ display: flex;
1722
+ flex-direction: column;
1723
+ gap: 12px;
1724
+ min-height: 168px;
1725
+ padding: 16px 16px 14px;
1726
+ background: var(--jini-bg-panel);
1727
+ border: 1px solid var(--jini-border);
1728
+ border-radius: var(--jini-radius);
1729
+ box-shadow: var(--jini-shadow-xs);
1730
+ cursor: pointer;
1731
+ text-align: left;
1732
+ transition:
1733
+ transform 140ms var(--jini-ease-out),
1734
+ border-color 140ms var(--jini-ease-out),
1735
+ box-shadow 180ms var(--jini-ease-out),
1736
+ background 140ms var(--jini-ease-out);
1737
+ }
1738
+ .connector-card:hover:not(.is-locked) {
1739
+ transform: translateY(-1px);
1740
+ border-color: color-mix(in srgb, var(--jini-text) 28%, var(--jini-border));
1741
+ box-shadow: 0 8px 24px -14px rgba(0, 0, 0, 0.25), var(--jini-shadow-xs);
1742
+ }
1743
+ .connector-card:focus-visible {
1744
+ outline: none;
1745
+ border-color: color-mix(in srgb, var(--jini-text) 48%, var(--jini-border));
1746
+ box-shadow:
1747
+ 0 0 0 3px color-mix(in srgb, var(--jini-text) 14%, transparent),
1748
+ 0 8px 24px -14px rgba(0, 0, 0, 0.25);
1749
+ }
1750
+ .connector-card.status-connected {
1751
+ border-color: color-mix(in srgb, var(--jini-success) 40%, var(--jini-border));
1752
+ background: linear-gradient(
1753
+ 180deg,
1754
+ color-mix(in srgb, var(--jini-success) 5%, var(--jini-bg-panel)) 0%,
1755
+ var(--jini-bg-panel) 60%
1756
+ );
1757
+ }
1758
+ .connector-card.status-disabled { background: var(--jini-bg-subtle); }
1759
+ .connector-card.status-error {
1760
+ border-color: color-mix(in srgb, var(--jini-danger) 35%, var(--jini-border));
1761
+ }
1762
+ .connector-card-top {
1763
+ display: flex;
1764
+ align-items: flex-start;
1765
+ justify-content: space-between;
1766
+ gap: 10px;
1767
+ }
1768
+ .connector-card-head {
1769
+ display: flex;
1770
+ flex-direction: column;
1771
+ gap: 4px;
1772
+ min-width: 0;
1773
+ flex: 1 1 auto;
1774
+ }
1775
+ .connector-card-title {
1776
+ margin: 0;
1777
+ font-size: 15px;
1778
+ font-weight: 600;
1779
+ line-height: 1.25;
1780
+ letter-spacing: -0.005em;
1781
+ color: var(--jini-text);
1782
+ display: flex;
1783
+ align-items: center;
1784
+ gap: 6px;
1785
+ min-width: 0;
1786
+ }
1787
+ .connector-card-title-name {
1788
+ min-width: 0;
1789
+ overflow: hidden;
1790
+ text-overflow: ellipsis;
1791
+ white-space: nowrap;
1792
+ }
1793
+ .connector-card-title-dot {
1794
+ flex: 0 0 auto;
1795
+ margin-top: -1px;
1796
+ }
1797
+
1798
+ .connector-logo {
1799
+ position: relative;
1800
+ flex: 0 0 auto;
1801
+ display: inline-flex;
1802
+ align-items: center;
1803
+ justify-content: center;
1804
+ width: 28px;
1805
+ height: 28px;
1806
+ border-radius: var(--jini-radius);
1807
+ border: 1px solid var(--jini-border);
1808
+ background: var(--jini-bg-panel);
1809
+ overflow: hidden;
1810
+ isolation: isolate;
1811
+ box-shadow: var(--jini-shadow-xs);
1812
+ user-select: none;
1813
+ }
1814
+ .connector-logo.size-lg {
1815
+ width: 44px;
1816
+ height: 44px;
1817
+ border-radius: var(--jini-radius-lg);
1818
+ }
1819
+ .connector-logo-img {
1820
+ position: absolute;
1821
+ inset: 0;
1822
+ width: 100%;
1823
+ height: 100%;
1824
+ object-fit: contain;
1825
+ padding: 4px;
1826
+ opacity: 0;
1827
+ transform: scale(0.96);
1828
+ transition: opacity 160ms ease-out, transform 160ms ease-out;
1829
+ z-index: 1;
1830
+ }
1831
+ .connector-logo.size-lg .connector-logo-img { padding: 6px; }
1832
+ .connector-logo.state-loaded .connector-logo-img {
1833
+ opacity: 1;
1834
+ transform: scale(1);
1835
+ }
1836
+ .connector-logo-fallback {
1837
+ position: absolute;
1838
+ inset: 0;
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: center;
1842
+ font-size: 11px;
1843
+ font-weight: 600;
1844
+ letter-spacing: 0.02em;
1845
+ color: transparent;
1846
+ background: var(--jini-bg-subtle);
1847
+ text-transform: uppercase;
1848
+ z-index: 0;
1849
+ transition: color 140ms ease-out, background-color 140ms ease-out, opacity 120ms ease-out;
1850
+ }
1851
+ .connector-logo.size-lg .connector-logo-fallback {
1852
+ font-size: 14px;
1853
+ letter-spacing: 0.04em;
1854
+ }
1855
+ .connector-logo.state-pending .connector-logo-fallback {
1856
+ background: linear-gradient(
1857
+ 90deg,
1858
+ var(--jini-bg-subtle) 0%,
1859
+ color-mix(in srgb, var(--jini-bg-subtle) 60%, var(--jini-bg-panel)) 50%,
1860
+ var(--jini-bg-subtle) 100%
1861
+ );
1862
+ background-size: 200% 100%;
1863
+ animation: connector-logo-shimmer 1400ms ease-in-out infinite;
1864
+ }
1865
+ @keyframes connector-logo-shimmer {
1866
+ from { background-position: 100% 0; }
1867
+ to { background-position: -100% 0; }
1868
+ }
1869
+ .connector-logo.state-loaded .connector-logo-fallback {
1870
+ visibility: hidden;
1871
+ opacity: 0;
1872
+ }
1873
+ .connector-logo.state-error .connector-logo-fallback,
1874
+ .connector-logo.is-fallback .connector-logo-fallback {
1875
+ color: var(--jini-text-muted);
1876
+ background: var(--jini-bg-subtle);
1877
+ animation: none;
1878
+ }
1879
+ .connector-logo.state-error[data-palette='0'] .connector-logo-fallback,
1880
+ .connector-logo.is-fallback[data-palette='0'] .connector-logo-fallback {
1881
+ background: color-mix(in oklab, var(--jini-accent) 6%, var(--jini-bg-subtle));
1882
+ color: color-mix(in oklab, var(--jini-accent) 35%, var(--jini-text-muted));
1883
+ }
1884
+ .connector-logo.state-error[data-palette='1'] .connector-logo-fallback,
1885
+ .connector-logo.is-fallback[data-palette='1'] .connector-logo-fallback {
1886
+ background: color-mix(in oklab, #6b8afd 7%, var(--jini-bg-subtle));
1887
+ color: color-mix(in oklab, #6b8afd 38%, var(--jini-text-muted));
1888
+ }
1889
+ .connector-logo.state-error[data-palette='2'] .connector-logo-fallback,
1890
+ .connector-logo.is-fallback[data-palette='2'] .connector-logo-fallback {
1891
+ background: color-mix(in oklab, #2dbfa8 7%, var(--jini-bg-subtle));
1892
+ color: color-mix(in oklab, #2dbfa8 38%, var(--jini-text-muted));
1893
+ }
1894
+ .connector-logo.state-error[data-palette='3'] .connector-logo-fallback,
1895
+ .connector-logo.is-fallback[data-palette='3'] .connector-logo-fallback {
1896
+ background: color-mix(in oklab, #d18b3a 7%, var(--jini-bg-subtle));
1897
+ color: color-mix(in oklab, #d18b3a 40%, var(--jini-text-muted));
1898
+ }
1899
+ .connector-logo.state-error[data-palette='4'] .connector-logo-fallback,
1900
+ .connector-logo.is-fallback[data-palette='4'] .connector-logo-fallback {
1901
+ background: color-mix(in oklab, #c356b3 6%, var(--jini-bg-subtle));
1902
+ color: color-mix(in oklab, #c356b3 38%, var(--jini-text-muted));
1903
+ }
1904
+ .connector-logo.state-error[data-palette='5'] .connector-logo-fallback,
1905
+ .connector-logo.is-fallback[data-palette='5'] .connector-logo-fallback {
1906
+ background: color-mix(in oklab, #5d6b85 9%, var(--jini-bg-subtle));
1907
+ color: color-mix(in oklab, #5d6b85 42%, var(--jini-text-muted));
1908
+ }
1909
+ .connector-logo.state-error,
1910
+ .connector-logo.is-fallback {
1911
+ border-color: var(--jini-border-soft, var(--jini-border));
1912
+ box-shadow: none;
1913
+ }
1914
+ @media (prefers-reduced-motion: reduce) {
1915
+ .connector-logo-img { transition: none; transform: none; }
1916
+ .connector-logo.state-pending .connector-logo-fallback {
1917
+ animation: none;
1918
+ background: var(--jini-bg-subtle);
1919
+ }
1920
+ }
1921
+
1922
+ .connectors-panel-embedded .connector-logo.size-sm {
1923
+ width: 24px;
1924
+ height: 24px;
1925
+ border-radius: var(--jini-radius);
1926
+ }
1927
+ .connectors-panel-embedded .connector-logo.size-sm .connector-logo-img { padding: 3px; }
1928
+ .connectors-panel-embedded .connector-logo.size-sm .connector-logo-fallback { font-size: 10px; }
1929
+
1930
+ .connector-meta {
1931
+ display: flex;
1932
+ align-items: center;
1933
+ flex-wrap: wrap;
1934
+ gap: 6px;
1935
+ color: var(--jini-text-muted);
1936
+ font-size: 12px;
1937
+ line-height: 1;
1938
+ }
1939
+ .connector-meta-item { white-space: nowrap; }
1940
+ .connector-meta-dot { color: var(--jini-text-disabled); }
1941
+ .connector-tools-badge {
1942
+ display: inline-flex;
1943
+ align-items: center;
1944
+ gap: 4px;
1945
+ padding: 2px 7px;
1946
+ border-radius: var(--jini-radius-pill);
1947
+ background: var(--jini-bg-subtle);
1948
+ border: 1px solid var(--jini-border);
1949
+ color: var(--jini-text-muted);
1950
+ font-size: 11px;
1951
+ font-weight: 500;
1952
+ line-height: 1.3;
1953
+ white-space: nowrap;
1954
+ transform-origin: left center;
1955
+ will-change: transform, opacity;
1956
+ }
1957
+ .connector-tools-badge svg { opacity: 0.65; }
1958
+ .connector-tools-badge.is-ready {
1959
+ animation: connector-tools-badge-in 420ms cubic-bezier(0.22, 1, 0.36, 1) both;
1960
+ }
1961
+ .connector-tools-badge.is-ready svg {
1962
+ animation: connector-tools-badge-icon-in 520ms cubic-bezier(0.22, 1, 0.36, 1) both;
1963
+ animation-delay: 120ms;
1964
+ }
1965
+ @keyframes connector-tools-badge-in {
1966
+ 0% {
1967
+ opacity: 0;
1968
+ transform: translateY(3px) scale(0.92);
1969
+ border-color: color-mix(in srgb, var(--jini-border) 40%, transparent);
1970
+ background: color-mix(in srgb, var(--jini-bg-subtle) 60%, transparent);
1971
+ }
1972
+ 55% {
1973
+ opacity: 1;
1974
+ border-color: color-mix(in srgb, var(--jini-accent) 30%, var(--jini-border));
1975
+ }
1976
+ 100% {
1977
+ opacity: 1;
1978
+ transform: translateY(0) scale(1);
1979
+ border-color: var(--jini-border);
1980
+ background: var(--jini-bg-subtle);
1981
+ }
1982
+ }
1983
+ @keyframes connector-tools-badge-icon-in {
1984
+ 0% { opacity: 0; transform: rotate(-12deg) scale(0.8); }
1985
+ 100% { opacity: 0.65; transform: rotate(0) scale(1); }
1986
+ }
1987
+ @media (prefers-reduced-motion: reduce) {
1988
+ .connector-tools-badge.is-ready { animation: connector-tools-badge-fade 180ms ease-out both; }
1989
+ .connector-tools-badge.is-ready svg { animation: none; }
1990
+ @keyframes connector-tools-badge-fade {
1991
+ from { opacity: 0; }
1992
+ to { opacity: 1; }
1993
+ }
1994
+ }
1995
+ .connector-status {
1996
+ flex: 0 0 auto;
1997
+ display: inline-flex;
1998
+ align-items: center;
1999
+ gap: 5px;
2000
+ padding: 2px 8px;
2001
+ border-radius: var(--jini-radius-pill);
2002
+ background: var(--jini-bg-subtle);
2003
+ color: var(--jini-text-muted);
2004
+ border: 1px solid var(--jini-border);
2005
+ font-size: 11px;
2006
+ font-weight: 600;
2007
+ line-height: 1.4;
2008
+ letter-spacing: 0.01em;
2009
+ }
2010
+ .connector-status-dot {
2011
+ width: 6px;
2012
+ height: 6px;
2013
+ border-radius: var(--jini-radius-pill);
2014
+ background: currentColor;
2015
+ box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 22%, transparent);
2016
+ }
2017
+ .connector-status.status-connected,
2018
+ .connector-status-pill.status-connected {
2019
+ background: color-mix(in srgb, var(--jini-success) 12%, transparent);
2020
+ color: var(--jini-success);
2021
+ border-color: color-mix(in srgb, var(--jini-success) 32%, transparent);
2022
+ }
2023
+ .connector-status.status-error,
2024
+ .connector-status-pill.status-error {
2025
+ background: color-mix(in srgb, var(--jini-danger) 10%, transparent);
2026
+ color: var(--jini-danger);
2027
+ border-color: color-mix(in srgb, var(--jini-danger) 30%, transparent);
2028
+ }
2029
+ .connector-status.status-disabled,
2030
+ .connector-status-pill.status-disabled { opacity: 0.7; }
2031
+ .connector-status.status-pending,
2032
+ .connector-status-pill.status-pending {
2033
+ background: color-mix(in srgb, var(--jini-accent) 12%, transparent);
2034
+ color: var(--jini-accent);
2035
+ border-color: color-mix(in srgb, var(--jini-accent) 32%, transparent);
2036
+ }
2037
+ .connector-status-pill {
2038
+ display: inline-flex;
2039
+ align-items: center;
2040
+ gap: 6px;
2041
+ padding: 3px 10px;
2042
+ border-radius: var(--jini-radius-pill);
2043
+ background: var(--jini-bg-subtle);
2044
+ border: 1px solid var(--jini-border);
2045
+ color: var(--jini-text-muted);
2046
+ font-size: 12px;
2047
+ font-weight: 600;
2048
+ }
2049
+ .connector-description {
2050
+ margin: 0;
2051
+ color: var(--jini-text-muted);
2052
+ font-size: 13px;
2053
+ line-height: 1.5;
2054
+ display: -webkit-box;
2055
+ -webkit-line-clamp: 3;
2056
+ -webkit-box-orient: vertical;
2057
+ overflow: hidden;
2058
+ }
2059
+ .connector-actions {
2060
+ display: flex;
2061
+ align-items: center;
2062
+ gap: 8px;
2063
+ margin-top: auto;
2064
+ padding-top: 4px;
2065
+ }
2066
+
2067
+ /* Base button + `.ghost`/`.primary`/`.icon-only` — OD's `primitives.css`
2068
+ defines these UNSCOPED (every `<button>` in its single-purpose app gets
2069
+ them). Rescoped under `.connectors-panel` so they style only this
2070
+ feature's buttons and never leak onto the rest of the Tovu admin. */
2071
+ .connectors-panel button {
2072
+ font: inherit;
2073
+ color: var(--jini-text);
2074
+ background: var(--jini-bg-panel);
2075
+ border: 1px solid var(--jini-border);
2076
+ border-radius: var(--jini-radius-sm);
2077
+ padding: 6px 12px;
2078
+ cursor: pointer;
2079
+ transition: background 120ms var(--jini-ease-out), border-color 120ms var(--jini-ease-out), color 120ms var(--jini-ease-out), box-shadow 120ms var(--jini-ease-out);
2080
+ }
2081
+ .connectors-panel button:hover:not(:disabled) { background: var(--jini-bg-subtle); border-color: var(--jini-border-strong); }
2082
+ .connectors-panel button:focus-visible { outline: 2px solid var(--jini-accent); outline-offset: 2px; }
2083
+ .connectors-panel button:disabled { opacity: 0.5; cursor: not-allowed; }
2084
+ .connectors-panel button.primary {
2085
+ display: inline-flex;
2086
+ align-items: center;
2087
+ justify-content: center;
2088
+ gap: 6px;
2089
+ background: var(--jini-accent);
2090
+ border-color: var(--jini-accent);
2091
+ color: #fff;
2092
+ font-weight: 500;
2093
+ line-height: 1.2;
2094
+ box-shadow: 0 1px 0 rgba(180, 90, 59, 0.18) inset, var(--jini-shadow-xs);
2095
+ }
2096
+ .connectors-panel button.primary:hover:not(:disabled) {
2097
+ background: var(--jini-accent-hover);
2098
+ border-color: var(--jini-accent-hover);
2099
+ }
2100
+ .connectors-panel button.ghost {
2101
+ display: inline-flex;
2102
+ align-items: center;
2103
+ justify-content: center;
2104
+ gap: 6px;
2105
+ background: transparent;
2106
+ border-color: var(--jini-border);
2107
+ color: var(--jini-text);
2108
+ line-height: 1.2;
2109
+ }
2110
+ .connectors-panel button.ghost:hover:not(:disabled) { background: var(--jini-bg-subtle); border-color: var(--jini-border-strong); }
2111
+ button.connector-action {
2112
+ display: inline-flex;
2113
+ align-items: center;
2114
+ justify-content: center;
2115
+ gap: 6px;
2116
+ padding: 5px 12px;
2117
+ font-size: 12px;
2118
+ font-weight: 500;
2119
+ border-radius: var(--jini-radius);
2120
+ transition: transform 120ms var(--jini-ease-out), background 140ms var(--jini-ease-out), border-color 140ms var(--jini-ease-out);
2121
+ }
2122
+ button.connector-action.is-connect { min-width: 92px; }
2123
+ button.connector-action.is-disconnect { min-width: 106px; color: var(--jini-text-muted); }
2124
+ button.connector-action.is-disconnect:hover:not(:disabled) {
2125
+ color: var(--jini-danger);
2126
+ border-color: color-mix(in srgb, var(--jini-danger) 35%, var(--jini-border));
2127
+ }
2128
+ button.connector-action.is-cancel-authorization { min-width: 74px; color: var(--jini-text-muted); }
2129
+ button.connector-action.is-loading { cursor: wait; }
2130
+ .connector-authorization-hint {
2131
+ margin: -2px 0 0;
2132
+ color: var(--jini-text-muted);
2133
+ font-size: 12px;
2134
+ line-height: 1.4;
2135
+ }
2136
+ /* `connector-authorization-error` is a real modifier `ConnectorsBrowser.tsx`
2137
+ applies (confirmed in OD's own source, both `components-original` and
2138
+ `od-web-src.orig`) but OD's own `connectors.css` never actually defines a
2139
+ rule for it — a genuine gap in OD itself, not something this port
2140
+ introduced. Left unstyled would mean an error-labeled hint (`role="alert"`)
2141
+ renders in the same muted gray as a normal hint; adding the obviously-
2142
+ intended color is a one-line, non-leaking safety net rather than
2143
+ faithfully reproducing OD's own oversight. */
2144
+ .connector-authorization-error { color: var(--jini-danger); }
2145
+ .connector-panel-alerts { display: grid; gap: 6px; }
2146
+ .connector-panel-alert {
2147
+ display: grid;
2148
+ grid-template-columns: minmax(0, 1fr) auto;
2149
+ align-items: center;
2150
+ gap: 8px;
2151
+ margin: 0;
2152
+ padding: 7px 9px;
2153
+ border: 1px solid color-mix(in srgb, var(--jini-danger) 28%, var(--jini-border));
2154
+ border-radius: var(--jini-radius);
2155
+ background: color-mix(in srgb, var(--jini-danger) 8%, var(--jini-bg-panel));
2156
+ color: var(--jini-text-muted);
2157
+ font-size: 12px;
2158
+ line-height: 1.35;
2159
+ }
2160
+ .connector-panel-alert-copy {
2161
+ display: grid;
2162
+ grid-template-columns: minmax(0, max-content) minmax(0, 1fr);
2163
+ align-items: center;
2164
+ gap: 8px;
2165
+ min-width: 0;
2166
+ margin: 0;
2167
+ }
2168
+ .connector-panel-alert-copy strong {
2169
+ min-width: 0;
2170
+ max-width: min(160px, 34vw);
2171
+ overflow: hidden;
2172
+ color: var(--jini-danger);
2173
+ font-weight: 600;
2174
+ text-overflow: ellipsis;
2175
+ white-space: nowrap;
2176
+ }
2177
+ .connector-panel-alert-copy span {
2178
+ display: -webkit-box;
2179
+ max-height: calc(12px * 1.35 * 2);
2180
+ min-width: 0;
2181
+ overflow: hidden;
2182
+ overflow-wrap: anywhere;
2183
+ -webkit-box-orient: vertical;
2184
+ -webkit-line-clamp: 2;
2185
+ line-clamp: 2;
2186
+ }
2187
+ .connector-panel-alert-action {
2188
+ width: 24px;
2189
+ height: 24px;
2190
+ padding: 0;
2191
+ border-radius: var(--jini-radius-pill);
2192
+ color: var(--jini-danger);
2193
+ border-color: color-mix(in srgb, var(--jini-danger) 22%, var(--jini-border));
2194
+ background: color-mix(in srgb, var(--jini-danger) 7%, transparent);
2195
+ }
2196
+ .connector-panel-alert-action:hover:not(:disabled) {
2197
+ border-color: color-mix(in srgb, var(--jini-danger) 42%, var(--jini-border));
2198
+ background: color-mix(in srgb, var(--jini-danger) 12%, transparent);
2199
+ }
2200
+
2201
+ .connector-authorization-block { display: grid; gap: 8px; margin-top: 8px; }
2202
+ .connector-authorization-link {
2203
+ display: inline-flex;
2204
+ align-items: center;
2205
+ width: fit-content;
2206
+ min-height: 26px;
2207
+ padding: 4px 9px;
2208
+ border: 1px solid color-mix(in srgb, var(--jini-accent) 35%, var(--jini-border));
2209
+ border-radius: var(--jini-radius-pill);
2210
+ color: var(--jini-accent);
2211
+ background: color-mix(in srgb, var(--jini-accent) 8%, transparent);
2212
+ appearance: none;
2213
+ cursor: pointer;
2214
+ font: inherit;
2215
+ font-size: 12px;
2216
+ font-weight: 600;
2217
+ text-decoration: none;
2218
+ }
2219
+ .connector-card > .connector-authorization-link { margin-top: -2px; }
2220
+
2221
+ /* Gate: masks the grid when the Composio API key is missing. */
2222
+ .connector-grid-wrap { position: relative; }
2223
+ .connector-grid-wrap.is-masked .connector-grid {
2224
+ filter: blur(2px) saturate(0.85);
2225
+ opacity: 0.55;
2226
+ pointer-events: none;
2227
+ user-select: none;
2228
+ transition: filter 160ms var(--jini-ease-out), opacity 160ms var(--jini-ease-out);
2229
+ }
2230
+ .jini-tabbed-dialog-content:has(> .tab-panel.connectors-panel > .connector-grid-wrap.is-masked) {
2231
+ display: flex;
2232
+ flex-direction: column;
2233
+ overflow: hidden;
2234
+ }
2235
+ .tab-panel.connectors-panel:has(> .connector-grid-wrap.is-masked) {
2236
+ flex: 1 1 auto;
2237
+ min-height: 0;
2238
+ }
2239
+ .connector-grid-wrap.is-masked {
2240
+ flex: 1 1 auto;
2241
+ min-height: 0;
2242
+ overflow: hidden;
2243
+ }
2244
+ .connector-grid-wrap.is-masked .connector-grid {
2245
+ max-height: 100%;
2246
+ overflow: hidden;
2247
+ }
2248
+ .connector-card.is-locked { cursor: not-allowed; }
2249
+
2250
+ .tab-panel.connectors-panel.connectors-panel-embedded {
2251
+ gap: 14px;
2252
+ position: relative;
2253
+ }
2254
+ .connectors-panel-embedded .tab-panel-toolbar {
2255
+ justify-content: flex-end;
2256
+ margin-top: -4px;
2257
+ }
2258
+ .connectors-panel-embedded .toolbar-left.connectors-heading { display: none; }
2259
+ .connectors-panel-embedded .toolbar-right {
2260
+ flex: 1 1 auto;
2261
+ justify-content: space-between;
2262
+ gap: 10px;
2263
+ align-items: center;
2264
+ flex-wrap: nowrap;
2265
+ }
2266
+ .connectors-panel-embedded .tab-panel-toolbar .toolbar-search.connectors-search {
2267
+ flex: 0 1 320px;
2268
+ width: min(320px, 100%);
2269
+ max-width: 320px;
2270
+ min-width: 180px;
2271
+ }
2272
+
2273
+ .connectors-provider-tabs {
2274
+ display: inline-flex;
2275
+ align-items: center;
2276
+ gap: 2px;
2277
+ padding: 3px;
2278
+ border-radius: var(--jini-radius-pill);
2279
+ background: var(--jini-bg-subtle);
2280
+ border: 1px solid var(--jini-border);
2281
+ flex: 0 0 auto;
2282
+ }
2283
+ /* Hide the provider tabs when there is only one option — no choice = no
2284
+ need for a tab (matches OD exactly; Tovu's single "All" tab hits this). */
2285
+ .connectors-provider-tabs:has(> :only-child) { display: none; }
2286
+ .connectors-provider-tab {
2287
+ appearance: none;
2288
+ border: 0;
2289
+ background: transparent;
2290
+ color: var(--jini-text-muted);
2291
+ font: inherit;
2292
+ font-size: 12px;
2293
+ font-weight: 500;
2294
+ letter-spacing: 0.005em;
2295
+ padding: 5px 12px;
2296
+ border-radius: var(--jini-radius-pill);
2297
+ cursor: pointer;
2298
+ white-space: nowrap;
2299
+ transition: background 140ms var(--jini-ease-out), color 140ms var(--jini-ease-out), box-shadow 180ms var(--jini-ease-out);
2300
+ }
2301
+ .connectors-provider-tab:hover:not(.is-active) {
2302
+ color: var(--jini-text);
2303
+ background: color-mix(in srgb, var(--jini-text) 6%, transparent);
2304
+ }
2305
+ .connectors-provider-tab.is-active {
2306
+ color: var(--jini-text);
2307
+ background: var(--jini-bg-panel);
2308
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 0 0 1px color-mix(in srgb, var(--jini-text) 12%, var(--jini-border));
2309
+ }
2310
+ .connectors-provider-tab:focus-visible {
2311
+ outline: none;
2312
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--jini-text) 14%, transparent), 0 1px 2px rgba(0, 0, 0, 0.06);
2313
+ }
2314
+ .connectors-panel-embedded .connector-grid-wrap.is-masked {
2315
+ min-height: clamp(320px, 45vh, 420px);
2316
+ max-height: clamp(360px, 56vh, 560px);
2317
+ overflow: hidden;
2318
+ border-radius: var(--jini-radius);
2319
+ }
2320
+ .connectors-panel-embedded .connector-grid-wrap.is-masked .connector-grid {
2321
+ max-height: 100%;
2322
+ overflow: hidden;
2323
+ }
2324
+ .connectors-panel-embedded .connector-grid {
2325
+ grid-template-columns: repeat(auto-fill, minmax(196px, 1fr));
2326
+ gap: 10px;
2327
+ }
2328
+ .connectors-panel-embedded .connector-card {
2329
+ min-height: 0;
2330
+ padding: 10px 10px 10px 12px;
2331
+ gap: 6px;
2332
+ }
2333
+ .connectors-panel-embedded .connector-card-title {
2334
+ font-size: 13px;
2335
+ font-weight: 600;
2336
+ letter-spacing: 0;
2337
+ }
2338
+ .connectors-panel-embedded .connector-meta {
2339
+ flex-direction: column;
2340
+ align-items: flex-start;
2341
+ flex-wrap: nowrap;
2342
+ font-size: 11px;
2343
+ gap: 4px;
2344
+ width: 100%;
2345
+ min-width: 0;
2346
+ }
2347
+ .connectors-panel-embedded .connector-meta-category {
2348
+ display: block;
2349
+ width: 100%;
2350
+ min-width: 0;
2351
+ max-width: 100%;
2352
+ overflow: hidden;
2353
+ text-overflow: ellipsis;
2354
+ white-space: nowrap;
2355
+ line-height: 1.3;
2356
+ }
2357
+ .connectors-panel-embedded .connector-meta-tools {
2358
+ display: inline-flex;
2359
+ align-items: center;
2360
+ min-height: 18px;
2361
+ position: relative;
2362
+ }
2363
+ .connectors-panel-embedded .connector-meta-tools[aria-hidden='true']::after {
2364
+ content: '';
2365
+ display: block;
2366
+ width: 32px;
2367
+ height: 1px;
2368
+ background: color-mix(in srgb, var(--jini-text) 10%, transparent);
2369
+ border-radius: var(--jini-radius-pill);
2370
+ }
2371
+ .connectors-panel-embedded .connector-meta .connector-meta-dot { display: none; }
2372
+ .connectors-panel-embedded .connector-tools-badge {
2373
+ padding: 1px 6px;
2374
+ font-size: 10px;
2375
+ border-radius: var(--jini-radius-pill);
2376
+ }
2377
+ .connectors-panel-embedded .connector-card-top { align-items: flex-start; gap: 8px; }
2378
+ .connectors-panel-embedded .connector-card-actions {
2379
+ display: inline-flex;
2380
+ align-items: center;
2381
+ gap: 6px;
2382
+ flex: 0 0 auto;
2383
+ margin-top: 1px;
2384
+ }
2385
+ .connectors-panel-embedded button.connector-action.icon-only {
2386
+ display: inline-flex;
2387
+ align-items: center;
2388
+ justify-content: center;
2389
+ width: 26px;
2390
+ height: 26px;
2391
+ min-width: 0;
2392
+ padding: 0;
2393
+ border-radius: var(--jini-radius-pill);
2394
+ border: 1px solid transparent;
2395
+ background: color-mix(in srgb, var(--jini-text) 5%, transparent);
2396
+ border-color: color-mix(in srgb, var(--jini-text) 10%, transparent);
2397
+ color: var(--jini-text-muted);
2398
+ cursor: pointer;
2399
+ transition:
2400
+ background 160ms var(--jini-ease-out),
2401
+ border-color 160ms var(--jini-ease-out),
2402
+ color 160ms var(--jini-ease-out),
2403
+ transform 120ms var(--jini-ease-out),
2404
+ box-shadow 160ms var(--jini-ease-out),
2405
+ opacity 160ms var(--jini-ease-out);
2406
+ }
2407
+ .connectors-panel-embedded .connector-card:hover:not(.is-locked) button.connector-action.icon-only:not(:disabled),
2408
+ .connectors-panel-embedded .connector-card:focus-visible button.connector-action.icon-only:not(:disabled) {
2409
+ color: var(--jini-text);
2410
+ background: color-mix(in srgb, var(--jini-text) 9%, transparent);
2411
+ border-color: color-mix(in srgb, var(--jini-text) 18%, transparent);
2412
+ }
2413
+ .connectors-panel-embedded button.connector-action.icon-only:hover:not(:disabled) {
2414
+ color: var(--jini-text);
2415
+ background: color-mix(in srgb, var(--jini-text) 12%, transparent);
2416
+ border-color: color-mix(in srgb, var(--jini-text) 24%, transparent);
2417
+ }
2418
+ .connectors-panel-embedded button.connector-action.icon-only:active:not(:disabled) { transform: scale(0.92); }
2419
+ .connectors-panel-embedded button.connector-action.icon-only:focus-visible {
2420
+ outline: none;
2421
+ border-color: color-mix(in srgb, var(--jini-accent) 70%, transparent);
2422
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 22%, transparent);
2423
+ }
2424
+ .connectors-panel-embedded button.connector-action.icon-only:disabled { opacity: 0.4; cursor: not-allowed; }
2425
+ @media (prefers-reduced-motion: reduce) {
2426
+ .connectors-panel-embedded button.connector-action.icon-only { transition: background 80ms linear, color 80ms linear; }
2427
+ .connectors-panel-embedded button.connector-action.icon-only:active:not(:disabled) { transform: none; }
2428
+ }
2429
+ .connectors-panel-embedded button.connector-action.is-connect {
2430
+ color: color-mix(in srgb, var(--jini-accent) 76%, var(--jini-text-muted));
2431
+ background: color-mix(in srgb, var(--jini-accent) 10%, transparent);
2432
+ border-color: color-mix(in srgb, var(--jini-accent) 22%, transparent);
2433
+ }
2434
+ .connectors-panel-embedded .connector-card:hover:not(.is-locked) button.connector-action.is-connect:not(:disabled),
2435
+ .connectors-panel-embedded .connector-card:focus-visible button.connector-action.is-connect:not(:disabled) {
2436
+ color: var(--jini-accent-hover);
2437
+ background: color-mix(in srgb, var(--jini-accent) 16%, transparent);
2438
+ border-color: color-mix(in srgb, var(--jini-accent) 38%, transparent);
2439
+ }
2440
+ .connectors-panel-embedded button.connector-action.is-connect:hover:not(:disabled) {
2441
+ color: var(--jini-accent-hover);
2442
+ background: color-mix(in srgb, var(--jini-accent) 26%, transparent);
2443
+ border-color: color-mix(in srgb, var(--jini-accent) 56%, transparent);
2444
+ box-shadow: 0 4px 14px -8px color-mix(in srgb, var(--jini-accent) 60%, transparent);
2445
+ }
2446
+ .connectors-panel-embedded button.connector-action.is-connect:active:not(:disabled) {
2447
+ background: color-mix(in srgb, var(--jini-accent) 32%, transparent);
2448
+ }
2449
+ .connectors-panel-embedded button.connector-action.is-disconnect {
2450
+ color: var(--jini-text-muted);
2451
+ background: color-mix(in srgb, var(--jini-text) 4%, transparent);
2452
+ border-color: color-mix(in srgb, var(--jini-text) 10%, transparent);
2453
+ }
2454
+ .connectors-panel-embedded .connector-card:hover:not(.is-locked) button.connector-action.is-disconnect:not(:disabled),
2455
+ .connectors-panel-embedded .connector-card:focus-visible button.connector-action.is-disconnect:not(:disabled) {
2456
+ color: var(--jini-text);
2457
+ background: color-mix(in srgb, var(--jini-text) 9%, transparent);
2458
+ border-color: color-mix(in srgb, var(--jini-text) 18%, transparent);
2459
+ }
2460
+ .connectors-panel-embedded button.connector-action.is-disconnect:hover:not(:disabled) {
2461
+ color: var(--jini-danger);
2462
+ background: color-mix(in srgb, var(--jini-danger) 14%, transparent);
2463
+ border-color: color-mix(in srgb, var(--jini-danger) 42%, transparent);
2464
+ }
2465
+ .connectors-panel-embedded .connector-status-dot {
2466
+ display: inline-block;
2467
+ width: 7px;
2468
+ height: 7px;
2469
+ border-radius: var(--jini-radius-pill);
2470
+ background: var(--jini-text-muted);
2471
+ flex: 0 0 auto;
2472
+ }
2473
+ .connectors-panel-embedded .connector-status-dot.status-connected {
2474
+ background: var(--jini-success);
2475
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-success) 22%, transparent);
2476
+ }
2477
+ .connectors-panel-embedded .connector-status-dot.status-error { background: var(--jini-danger); }
2478
+ .connectors-panel-embedded .connector-status-dot.status-disabled { background: var(--jini-text-disabled); }
2479
+ .connectors-panel-embedded .connector-card .connector-status-pill { font-size: 10px; padding: 1px 6px; }
2480
+
2481
+ @media (max-width: 540px) {
2482
+ .connectors-provider-tabs { flex-shrink: 0; }
2483
+ .connectors-panel-embedded .tab-panel-toolbar .toolbar-search.connectors-search { min-width: 0; }
2484
+ }
2485
+
2486
+ .connector-gate {
2487
+ position: absolute;
2488
+ inset: 0;
2489
+ z-index: 2;
2490
+ display: flex;
2491
+ align-items: center;
2492
+ justify-content: center;
2493
+ padding: 24px;
2494
+ background:
2495
+ radial-gradient(ellipse at top, color-mix(in srgb, var(--jini-bg-panel) 78%, transparent) 0%, color-mix(in srgb, var(--jini-bg-subtle) 72%, transparent) 65%),
2496
+ color-mix(in srgb, var(--jini-bg-subtle) 45%, transparent);
2497
+ backdrop-filter: blur(6px);
2498
+ -webkit-backdrop-filter: blur(6px);
2499
+ border-radius: var(--jini-radius);
2500
+ animation: connector-gate-fade 220ms ease-out;
2501
+ pointer-events: auto;
2502
+ }
2503
+ @keyframes connector-gate-fade {
2504
+ from { opacity: 0; transform: translateY(4px); }
2505
+ to { opacity: 1; transform: translateY(0); }
2506
+ }
2507
+ .connector-gate-card {
2508
+ display: flex;
2509
+ flex-direction: column;
2510
+ align-items: center;
2511
+ gap: 12px;
2512
+ max-width: 420px;
2513
+ padding: 28px 28px 24px;
2514
+ text-align: center;
2515
+ text-decoration: none;
2516
+ background: var(--jini-bg-panel);
2517
+ border: 1px solid var(--jini-border);
2518
+ border-radius: var(--jini-radius);
2519
+ box-shadow: var(--jini-shadow-md);
2520
+ }
2521
+ .connector-gate-card:visited { color: inherit; }
2522
+ .connector-gate-icon {
2523
+ display: inline-flex;
2524
+ align-items: center;
2525
+ justify-content: center;
2526
+ width: 40px;
2527
+ height: 40px;
2528
+ border-radius: 50%;
2529
+ background: var(--jini-bg-subtle);
2530
+ border: 1px solid var(--jini-border);
2531
+ color: var(--jini-text-muted);
2532
+ }
2533
+ .connector-gate-title {
2534
+ margin: 2px 0 0;
2535
+ font-size: 15px;
2536
+ font-weight: 600;
2537
+ color: var(--jini-text);
2538
+ letter-spacing: 0.01em;
2539
+ }
2540
+ .connector-gate-body {
2541
+ margin: 0;
2542
+ max-width: 340px;
2543
+ color: var(--jini-text-muted);
2544
+ font-size: 13px;
2545
+ line-height: 1.5;
2546
+ }
2547
+ .connector-gate-cta {
2548
+ display: inline-flex;
2549
+ align-items: center;
2550
+ justify-content: center;
2551
+ gap: 6px;
2552
+ color: var(--jini-text);
2553
+ font-size: 12px;
2554
+ font-weight: 600;
2555
+ }
2556
+
2557
+ /* ---- Detail drawer — ported from `.../workspace/drawer.css` ---- */
2558
+
2559
+ .connector-drawer-backdrop {
2560
+ position: fixed;
2561
+ inset: 0;
2562
+ z-index: 100;
2563
+ background: color-mix(in srgb, #111827 18%, transparent);
2564
+ backdrop-filter: blur(1px);
2565
+ -webkit-backdrop-filter: blur(1px);
2566
+ display: flex;
2567
+ justify-content: flex-end;
2568
+ align-items: flex-end;
2569
+ padding: 24px 24px 12px;
2570
+ animation: connector-drawer-fade 180ms cubic-bezier(0.23, 1, 0.32, 1);
2571
+ }
2572
+ @keyframes connector-drawer-fade {
2573
+ from { opacity: 0; }
2574
+ to { opacity: 1; }
2575
+ }
2576
+ .connector-drawer {
2577
+ position: relative;
2578
+ display: flex;
2579
+ flex-direction: column;
2580
+ width: min(456px, 92vw);
2581
+ height: clamp(480px, 68vh, 640px);
2582
+ max-height: calc(100vh - 36px);
2583
+ background: var(--jini-bg-panel);
2584
+ border: 1px solid color-mix(in srgb, var(--jini-border) 82%, transparent);
2585
+ border-radius: var(--jini-radius-lg);
2586
+ box-shadow: 0 24px 64px -34px rgba(15, 23, 42, 0.5);
2587
+ overflow: hidden;
2588
+ animation: connector-drawer-slide 220ms cubic-bezier(0.23, 1, 0.32, 1);
2589
+ }
2590
+ @keyframes connector-drawer-slide {
2591
+ from { transform: translateX(18px); opacity: 0; }
2592
+ to { transform: translateX(0); opacity: 1; }
2593
+ }
2594
+ .connector-drawer-head {
2595
+ display: flex;
2596
+ align-items: flex-start;
2597
+ gap: 14px;
2598
+ padding: 22px 22px 18px;
2599
+ border-bottom: 1px solid color-mix(in srgb, var(--jini-border) 70%, transparent);
2600
+ background: color-mix(in srgb, var(--jini-bg-subtle) 36%, var(--jini-bg-panel));
2601
+ }
2602
+ .connector-drawer-titles {
2603
+ flex: 1 1 auto;
2604
+ min-width: 0;
2605
+ display: flex;
2606
+ flex-direction: column;
2607
+ gap: 8px;
2608
+ }
2609
+ .connector-drawer-eyebrow {
2610
+ display: flex;
2611
+ align-items: center;
2612
+ flex-wrap: wrap;
2613
+ gap: 6px;
2614
+ font-size: 11px;
2615
+ font-weight: 500;
2616
+ letter-spacing: 0.02em;
2617
+ text-transform: uppercase;
2618
+ color: var(--jini-text-disabled);
2619
+ }
2620
+ .connector-drawer-titles h2 {
2621
+ margin: 0;
2622
+ font-size: 21px;
2623
+ font-weight: 600;
2624
+ line-height: 1.2;
2625
+ letter-spacing: 0;
2626
+ color: var(--jini-text);
2627
+ }
2628
+ .connector-drawer-status {
2629
+ display: flex;
2630
+ align-items: center;
2631
+ gap: 7px;
2632
+ flex-wrap: wrap;
2633
+ }
2634
+ .connector-drawer-tool-count-chip {
2635
+ display: inline-flex;
2636
+ align-items: center;
2637
+ min-height: 24px;
2638
+ max-width: 100%;
2639
+ padding: 3px 9px;
2640
+ border-radius: var(--jini-radius-pill);
2641
+ border: 1px solid color-mix(in srgb, var(--jini-border) 75%, transparent);
2642
+ background: color-mix(in srgb, var(--jini-bg-panel) 72%, var(--jini-bg-subtle));
2643
+ color: var(--jini-text-muted);
2644
+ font-size: 11.5px;
2645
+ font-weight: 600;
2646
+ line-height: 1.2;
2647
+ }
2648
+ .connector-drawer-close {
2649
+ flex: 0 0 auto;
2650
+ display: inline-flex;
2651
+ align-items: center;
2652
+ justify-content: center;
2653
+ width: 32px;
2654
+ height: 32px;
2655
+ padding: 0;
2656
+ border-radius: var(--jini-radius-pill);
2657
+ color: var(--jini-text-muted);
2658
+ }
2659
+ .connector-drawer-close:hover {
2660
+ background: var(--jini-bg-subtle);
2661
+ color: var(--jini-text);
2662
+ }
2663
+ .connector-drawer-body {
2664
+ flex: 1 1 auto;
2665
+ min-height: 0;
2666
+ overflow-y: auto;
2667
+ padding: 18px 22px 14px;
2668
+ display: flex;
2669
+ flex-direction: column;
2670
+ gap: 20px;
2671
+ }
2672
+ .connector-drawer-section {
2673
+ display: flex;
2674
+ flex-direction: column;
2675
+ gap: 10px;
2676
+ }
2677
+ .connector-drawer-section-head {
2678
+ display: flex;
2679
+ align-items: center;
2680
+ justify-content: space-between;
2681
+ gap: 12px;
2682
+ min-width: 0;
2683
+ }
2684
+ .connector-drawer-section-title {
2685
+ margin: 0;
2686
+ font-size: 11px;
2687
+ font-weight: 600;
2688
+ letter-spacing: 0.08em;
2689
+ text-transform: uppercase;
2690
+ color: var(--jini-text-disabled);
2691
+ display: flex;
2692
+ align-items: center;
2693
+ gap: 8px;
2694
+ }
2695
+ .connector-drawer-inline-action {
2696
+ display: inline-flex;
2697
+ align-items: center;
2698
+ gap: 6px;
2699
+ min-width: 0;
2700
+ min-height: 28px;
2701
+ padding: 4px 9px;
2702
+ border-radius: var(--jini-radius);
2703
+ font-size: 12px;
2704
+ font-weight: 500;
2705
+ white-space: nowrap;
2706
+ }
2707
+ .connector-drawer-count {
2708
+ display: inline-flex;
2709
+ align-items: center;
2710
+ justify-content: center;
2711
+ min-width: 20px;
2712
+ height: 18px;
2713
+ padding: 0 6px;
2714
+ border-radius: var(--jini-radius-pill);
2715
+ background: var(--jini-bg-subtle);
2716
+ border: 1px solid var(--jini-border);
2717
+ color: var(--jini-text-muted);
2718
+ font-size: 10px;
2719
+ font-weight: 600;
2720
+ letter-spacing: 0;
2721
+ text-transform: none;
2722
+ }
2723
+ .connector-drawer-description {
2724
+ margin: 0;
2725
+ color: var(--jini-text);
2726
+ font-size: 14px;
2727
+ line-height: 1.55;
2728
+ }
2729
+ .connector-drawer-details {
2730
+ display: grid;
2731
+ grid-template-columns: minmax(0, 1fr);
2732
+ gap: 0;
2733
+ margin: 0;
2734
+ padding: 2px 0 0;
2735
+ border-top: 1px solid color-mix(in srgb, var(--jini-border) 55%, transparent);
2736
+ }
2737
+ .connector-drawer-details > div {
2738
+ display: grid;
2739
+ grid-template-columns: minmax(96px, 0.38fr) minmax(0, 1fr);
2740
+ align-items: baseline;
2741
+ gap: 12px;
2742
+ padding: 8px 0;
2743
+ }
2744
+ .connector-drawer-details > div + div {
2745
+ border-top: 1px solid color-mix(in srgb, var(--jini-border) 42%, transparent);
2746
+ }
2747
+ .connector-drawer-details dt {
2748
+ margin: 0;
2749
+ color: var(--jini-text-muted);
2750
+ font-size: 12.5px;
2751
+ font-weight: 500;
2752
+ }
2753
+ .connector-drawer-details dd {
2754
+ margin: 0;
2755
+ color: var(--jini-text);
2756
+ font-size: 13px;
2757
+ word-break: break-word;
2758
+ }
2759
+ .connector-drawer-details-error dd { color: var(--jini-danger); }
2760
+ .connector-drawer-empty {
2761
+ margin: 0;
2762
+ padding: 12px 14px;
2763
+ border: 1px dashed color-mix(in srgb, var(--jini-border) 78%, transparent);
2764
+ border-radius: var(--jini-radius);
2765
+ color: var(--jini-text-muted);
2766
+ font-size: 13px;
2767
+ line-height: 1.5;
2768
+ }
2769
+ .connector-drawer-tools {
2770
+ list-style: none;
2771
+ margin: 0;
2772
+ padding: 0;
2773
+ display: flex;
2774
+ flex-direction: column;
2775
+ gap: 6px;
2776
+ }
2777
+ .connector-drawer-tool {
2778
+ display: flex;
2779
+ flex-direction: column;
2780
+ gap: 5px;
2781
+ padding: 9px 11px;
2782
+ background: color-mix(in srgb, var(--jini-bg-panel) 74%, var(--jini-bg-subtle));
2783
+ border: 1px solid color-mix(in srgb, var(--jini-border) 68%, transparent);
2784
+ border-radius: var(--jini-radius);
2785
+ transition: border-color 140ms var(--jini-ease-out), background 140ms var(--jini-ease-out);
2786
+ }
2787
+ .connector-drawer-tool:hover {
2788
+ background: var(--jini-bg-panel);
2789
+ border-color: color-mix(in srgb, var(--jini-text) 16%, var(--jini-border));
2790
+ }
2791
+ .connector-drawer-tool-head {
2792
+ display: flex;
2793
+ align-items: flex-start;
2794
+ justify-content: space-between;
2795
+ gap: 10px;
2796
+ }
2797
+ .connector-drawer-tool-title {
2798
+ min-width: 0;
2799
+ font-size: 12.5px;
2800
+ font-weight: 600;
2801
+ color: var(--jini-text);
2802
+ line-height: 1.35;
2803
+ }
2804
+ .connector-drawer-tool-badge {
2805
+ display: inline-flex;
2806
+ align-items: center;
2807
+ flex: 0 0 auto;
2808
+ padding: 1px 6px;
2809
+ border-radius: var(--jini-radius-pill);
2810
+ font-size: 9.5px;
2811
+ font-weight: 600;
2812
+ text-transform: uppercase;
2813
+ letter-spacing: 0.04em;
2814
+ background: var(--jini-bg-subtle);
2815
+ border: 1px solid var(--jini-border);
2816
+ color: var(--jini-text-muted);
2817
+ }
2818
+ .connector-drawer-tool-badge.side-read {
2819
+ background: color-mix(in srgb, var(--jini-success) 10%, transparent);
2820
+ border-color: color-mix(in srgb, var(--jini-success) 28%, transparent);
2821
+ color: var(--jini-success);
2822
+ }
2823
+ .connector-drawer-tool-badge.side-write {
2824
+ background: color-mix(in srgb, var(--jini-warning) 10%, transparent);
2825
+ border-color: color-mix(in srgb, var(--jini-warning) 28%, transparent);
2826
+ color: var(--jini-warning);
2827
+ }
2828
+ .connector-drawer-tool-badge.side-destructive {
2829
+ background: color-mix(in srgb, var(--jini-danger) 10%, transparent);
2830
+ border-color: color-mix(in srgb, var(--jini-danger) 30%, transparent);
2831
+ color: var(--jini-danger);
2832
+ }
2833
+ .connector-drawer-tool-desc {
2834
+ margin: 0;
2835
+ color: var(--jini-text-muted);
2836
+ font-size: 12px;
2837
+ line-height: 1.42;
2838
+ }
2839
+ .connector-drawer-tool-name {
2840
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
2841
+ font-size: 10.5px;
2842
+ color: var(--jini-text-disabled);
2843
+ background: color-mix(in srgb, var(--jini-bg-subtle) 76%, transparent);
2844
+ padding: 2px 5px;
2845
+ border-radius: var(--jini-radius-xs);
2846
+ align-self: flex-start;
2847
+ max-width: 100%;
2848
+ overflow: hidden;
2849
+ text-overflow: ellipsis;
2850
+ white-space: nowrap;
2851
+ }
2852
+ .connector-drawer-load-more {
2853
+ align-self: flex-start;
2854
+ margin-top: 10px;
2855
+ display: inline-flex;
2856
+ align-items: center;
2857
+ gap: 6px;
2858
+ min-height: 34px;
2859
+ padding: 7px 14px;
2860
+ }
2861
+ .connector-drawer-foot {
2862
+ padding: 12px 22px 16px;
2863
+ border-top: 1px solid color-mix(in srgb, var(--jini-border) 70%, transparent);
2864
+ display: flex;
2865
+ justify-content: flex-end;
2866
+ gap: 8px;
2867
+ background: color-mix(in srgb, var(--jini-bg-subtle) 28%, var(--jini-bg-panel));
2868
+ }
2869
+ .connector-drawer-foot button.connector-action {
2870
+ padding: 7px 18px;
2871
+ font-size: 13px;
2872
+ }
2873
+ @media (max-width: 520px) {
2874
+ .connector-drawer-backdrop { align-items: stretch; padding: 0; }
2875
+ .connector-drawer { width: 100%; max-height: none; height: 100%; border-radius: 0; border-right: 0; border-left: 0; }
2876
+ .connector-drawer-head { padding: 16px 16px 14px; }
2877
+ .connector-drawer-body { padding: 16px 16px 20px; }
2878
+ .connector-drawer-foot { padding: 12px 16px 16px; }
2879
+ .connector-drawer-section-head { align-items: flex-start; flex-direction: column; gap: 8px; }
2880
+ .connector-drawer-details > div { grid-template-columns: 1fr; gap: 2px; }
2881
+ }
2882
+
2883
+ /* Keep the drawer inside the embedded connectors panel rather than
2884
+ full-viewport (OD's own accommodation for this exact "Settings" context). */
2885
+ .connectors-panel-embedded:has(.connector-drawer-backdrop) {
2886
+ min-height: clamp(500px, 62vh, 700px);
2887
+ overflow: hidden;
2888
+ border-radius: var(--jini-radius);
2889
+ }
2890
+ .connectors-panel-embedded .connector-drawer-backdrop {
2891
+ position: absolute;
2892
+ inset: 0;
2893
+ z-index: 6;
2894
+ align-items: stretch;
2895
+ padding: 12px;
2896
+ background: color-mix(in srgb, var(--jini-bg-subtle) 24%, transparent);
2897
+ border-radius: inherit;
2898
+ }
2899
+ .connectors-panel-embedded .connector-drawer {
2900
+ width: min(440px, 58%);
2901
+ height: 100%;
2902
+ max-height: none;
2903
+ border-radius: var(--jini-radius);
2904
+ box-shadow: 0 20px 48px -28px rgba(15, 23, 42, 0.55);
2905
+ }
2906
+ @media (max-width: 720px) {
2907
+ .connectors-panel-embedded:has(.connector-drawer-backdrop) { min-height: clamp(520px, 70vh, 640px); }
2908
+ .connectors-panel-embedded .connector-drawer-backdrop { padding: 0; }
2909
+ .connectors-panel-embedded .connector-drawer { width: 100%; border-radius: var(--jini-radius); }
2910
+ }
2911
+
2912
+ /* ============================================================
2913
+ Skills tab — PORTED from OD's real source.
2914
+ Sources: `.../viewer/library.css` (`.library-toolbar`/`-search`/
2915
+ `-filter-select*`, shared with Design Systems management — our
2916
+ `SkillsTab.tsx` uses its own `jini-skills-*` names instead of these
2917
+ shared ones, so the rules below target our classes but keep OD's exact
2918
+ values), `.../viewer/templates-plugins.css` and `.../viewer/
2919
+ plugin-inputs.css` (both scoped under OD's `.settings-skills` — our
2920
+ equivalent scope is `.jini-settings-skills`), and `.../viewer/
2921
+ memory.css` (`.toggle-switch`/`.toggle-slider`, the real switch chrome
2922
+ Privacy's toggles also use — Skills' own port had substituted the
2923
+ wrong shared class before this pass). `--od-token` → `--jini-token`
2924
+ throughout, same as Connectors above. */
2925
+
2926
+ .jini-skills-toolbar {
2927
+ display: flex;
2928
+ flex-direction: column;
2929
+ gap: 10px;
2930
+ }
2931
+ .jini-skills-toolbar-top {
2932
+ display: flex;
2933
+ align-items: center;
2934
+ gap: 12px;
2935
+ }
2936
+ .jini-skills-toolbar-top .jini-skills-search {
2937
+ flex: 1 1 0;
2938
+ min-width: 0;
2939
+ }
2940
+ .jini-skills-search {
2941
+ width: 100%;
2942
+ padding: 9px 12px;
2943
+ border: 1px solid var(--jini-border-strong);
2944
+ border-radius: var(--jini-radius-md);
2945
+ font-size: 13px;
2946
+ background: var(--jini-bg-panel);
2947
+ color: var(--jini-text);
2948
+ outline: none;
2949
+ box-shadow: var(--jini-shadow-xs);
2950
+ cursor: text;
2951
+ transition: border-color 120ms var(--jini-ease-out), box-shadow 120ms var(--jini-ease-out), background 120ms var(--jini-ease-out);
2952
+ }
2953
+ .jini-skills-search:hover {
2954
+ background: var(--jini-bg-elevated);
2955
+ border-color: var(--jini-border-strong);
2956
+ }
2957
+ .jini-skills-search:focus {
2958
+ border-color: var(--jini-accent);
2959
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent), var(--jini-shadow-xs);
2960
+ }
2961
+ .jini-skills-filter-selects {
2962
+ display: flex;
2963
+ flex-wrap: wrap;
2964
+ align-items: center;
2965
+ gap: 12px;
2966
+ }
2967
+ .jini-skills-filter-select {
2968
+ display: inline-flex;
2969
+ flex-direction: column;
2970
+ align-items: flex-start;
2971
+ gap: 4px;
2972
+ font-size: 12px;
2973
+ color: var(--jini-text-muted);
2974
+ min-width: 0;
2975
+ }
2976
+ .jini-skills-filter-select > span {
2977
+ font-weight: 500;
2978
+ flex: 0 0 auto;
2979
+ }
2980
+ .jini-skills-filter-select select {
2981
+ padding: 5px 28px 5px 10px;
2982
+ font-size: 12px;
2983
+ background-color: var(--jini-bg-panel);
2984
+ border: 1px solid var(--jini-border);
2985
+ border-radius: var(--jini-radius-sm);
2986
+ color: var(--jini-text);
2987
+ min-width: 100px;
2988
+ max-width: 180px;
2989
+ cursor: pointer;
2990
+ }
2991
+ .jini-skills-filter-select select:hover:not(:disabled) { border-color: var(--jini-border-strong); }
2992
+
2993
+ /* `.jini-settings-skills` scopes everything below, matching OD's own
2994
+ `.settings-skills` scoping (its Skills styling lives entirely under
2995
+ that selector so it can't collide with the Design Systems manager,
2996
+ which shares several of the same generic `library-*` class names). */
2997
+ .jini-skills-toolbar-top button.jini-button-primary {
2998
+ display: inline-flex;
2999
+ align-items: center;
3000
+ gap: 6px;
3001
+ padding: 7px 14px;
3002
+ font-size: 13px;
3003
+ white-space: nowrap;
3004
+ flex-shrink: 0;
3005
+ border-radius: var(--jini-radius);
3006
+ }
3007
+ .jini-skills-rows {
3008
+ display: flex;
3009
+ flex-direction: column;
3010
+ gap: 8px;
3011
+ margin-top: 4px;
3012
+ }
3013
+ .jini-skills-row {
3014
+ position: relative;
3015
+ border: 1px solid var(--jini-border);
3016
+ border-radius: var(--jini-radius-md);
3017
+ background: var(--jini-bg-panel);
3018
+ display: flex;
3019
+ flex-direction: column;
3020
+ min-width: 0;
3021
+ transition: border-color 140ms var(--jini-ease-out), box-shadow 140ms var(--jini-ease-out), background-color 140ms var(--jini-ease-out);
3022
+ }
3023
+ .jini-skills-row::before {
3024
+ content: '';
3025
+ position: absolute;
3026
+ left: 0;
3027
+ top: 8px;
3028
+ bottom: 8px;
3029
+ width: 3px;
3030
+ border-radius: 0 3px 3px 0;
3031
+ background: transparent;
3032
+ transition: background-color 140ms var(--jini-ease-out);
3033
+ pointer-events: none;
3034
+ }
3035
+ .jini-skills-row:hover {
3036
+ border-color: var(--jini-border-strong);
3037
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
3038
+ }
3039
+ .jini-skills-row-expanded {
3040
+ background: var(--jini-bg-subtle);
3041
+ border-color: var(--jini-border-strong);
3042
+ }
3043
+ .jini-skills-row-expanded::before { background: var(--jini-accent); }
3044
+ .jini-skills-row-disabled { opacity: 0.55; }
3045
+
3046
+ .jini-skills-row-head {
3047
+ display: flex;
3048
+ align-items: center;
3049
+ gap: 8px;
3050
+ padding: 8px 10px 8px 14px;
3051
+ min-width: 0;
3052
+ }
3053
+ .jini-skills-row-summary-btn {
3054
+ flex: 1;
3055
+ min-width: 0;
3056
+ display: flex;
3057
+ align-items: center;
3058
+ gap: 10px;
3059
+ padding: 4px 6px;
3060
+ background: transparent;
3061
+ border: none;
3062
+ border-radius: var(--jini-radius-sm);
3063
+ text-align: left;
3064
+ cursor: pointer;
3065
+ color: inherit;
3066
+ font: inherit;
3067
+ }
3068
+ .jini-skills-row-summary-btn:hover .jini-skills-row-summary-line strong { color: var(--jini-accent); }
3069
+ .jini-skills-row-summary-btn:focus-visible {
3070
+ outline: 2px solid var(--jini-accent);
3071
+ outline-offset: 2px;
3072
+ }
3073
+ /* Icon leads the summary button. OD wraps it in its own `.skills-row-icon`
3074
+ chip (28px, rounded, tinted background that swaps to accent when
3075
+ expanded) — our `SkillRow.tsx` renders the `<Icon>` bare with no wrapper
3076
+ span, so the chip treatment (which needs a real box to hold a background
3077
+ independent of the glyph's own intrinsic size) isn't reproducible from
3078
+ CSS alone without that wrapper. NOT ported: left as a plain colored
3079
+ glyph rather than distorting the icon by forcing chip dimensions onto
3080
+ the bare `<svg>`. Flagged as a follow-up requiring a small JSX change,
3081
+ same shape as the toggle-switch fix below. */
3082
+ .jini-skills-row-summary-btn > svg:first-child {
3083
+ flex: 0 0 auto;
3084
+ color: var(--jini-text-muted);
3085
+ }
3086
+ .jini-skills-row-expanded .jini-skills-row-summary-btn > svg:first-child { color: var(--jini-accent); }
3087
+ .jini-skills-row-summary {
3088
+ flex: 1;
3089
+ min-width: 0;
3090
+ display: flex;
3091
+ flex-direction: column;
3092
+ gap: 2px;
3093
+ }
3094
+ .jini-skills-row-summary-line {
3095
+ display: flex;
3096
+ align-items: center;
3097
+ gap: 6px;
3098
+ min-width: 0;
3099
+ }
3100
+ .jini-skills-row-summary-line strong {
3101
+ min-width: 0;
3102
+ overflow: hidden;
3103
+ text-overflow: ellipsis;
3104
+ white-space: nowrap;
3105
+ font-size: 13px;
3106
+ font-weight: 500;
3107
+ color: var(--jini-text);
3108
+ transition: color 120ms var(--jini-ease-out);
3109
+ }
3110
+ .jini-skills-row-summary-mode,
3111
+ .jini-skills-row-summary-source,
3112
+ .jini-skills-row-summary-category {
3113
+ flex-shrink: 0;
3114
+ font-size: 9.5px;
3115
+ letter-spacing: 0.06em;
3116
+ text-transform: uppercase;
3117
+ color: var(--jini-text-disabled);
3118
+ background: var(--jini-bg-subtle);
3119
+ border: 1px solid var(--jini-border);
3120
+ border-radius: var(--jini-radius-pill);
3121
+ padding: 1px 7px;
3122
+ font-weight: 500;
3123
+ }
3124
+ .jini-skills-row-summary-source {
3125
+ color: var(--jini-accent);
3126
+ border-color: color-mix(in srgb, var(--jini-accent) 50%, transparent);
3127
+ background: color-mix(in srgb, var(--jini-accent) 8%, transparent);
3128
+ }
3129
+ .jini-skills-row-summary-category {
3130
+ text-transform: none;
3131
+ letter-spacing: 0.02em;
3132
+ color: color-mix(in srgb, var(--jini-accent) 80%, var(--jini-text-muted));
3133
+ border-color: color-mix(in srgb, var(--jini-accent) 25%, transparent);
3134
+ background: color-mix(in srgb, var(--jini-accent) 5%, transparent);
3135
+ }
3136
+ /* Description — OD's own `.skills-row-summary-desc` truncates to one
3137
+ line; our port reuses the shared `.jini-hint` span instead of a
3138
+ dedicated class, so the truncation is scoped onto that combination
3139
+ rather than `.jini-hint` globally (which other tabs use for wrapping
3140
+ hint text). */
3141
+ .jini-skills-row-summary .jini-hint {
3142
+ display: block;
3143
+ overflow: hidden;
3144
+ text-overflow: ellipsis;
3145
+ white-space: nowrap;
3146
+ font-size: 12px;
3147
+ color: var(--jini-text-muted);
3148
+ line-height: 1.4;
3149
+ }
3150
+ .jini-skills-row-summary-btn > svg:last-child {
3151
+ flex: 0 0 auto;
3152
+ color: var(--jini-text-muted);
3153
+ transition: transform 120ms var(--jini-ease-out), color 120ms var(--jini-ease-out);
3154
+ }
3155
+ .jini-skills-row-expanded .jini-skills-row-summary-btn > svg:last-child { transform: rotate(180deg); }
3156
+
3157
+ .jini-skills-row-actions {
3158
+ display: inline-flex;
3159
+ align-items: center;
3160
+ gap: 4px;
3161
+ flex-shrink: 0;
3162
+ }
3163
+ .jini-skills-row-actions .jini-button-ghost {
3164
+ width: 26px;
3165
+ height: 26px;
3166
+ padding: 0;
3167
+ display: inline-flex;
3168
+ align-items: center;
3169
+ justify-content: center;
3170
+ background: transparent;
3171
+ border: 1px solid transparent;
3172
+ border-radius: var(--jini-radius-sm);
3173
+ color: var(--jini-text-disabled);
3174
+ cursor: pointer;
3175
+ transition: background-color 120ms var(--jini-ease-out), border-color 120ms var(--jini-ease-out), color 120ms var(--jini-ease-out);
3176
+ }
3177
+ .jini-skills-row-actions .jini-button-ghost:hover {
3178
+ background: var(--jini-bg-panel);
3179
+ border-color: var(--jini-border);
3180
+ color: var(--jini-text);
3181
+ }
3182
+ .jini-skills-row-enable { margin-left: 4px; }
3183
+ .jini-skills-delete-confirm {
3184
+ display: inline-flex;
3185
+ gap: 6px;
3186
+ }
3187
+ .jini-skills-delete-confirm .jini-button {
3188
+ padding: 4px 10px;
3189
+ font-size: 12px;
3190
+ border-radius: var(--jini-radius-sm);
3191
+ }
3192
+ /* OD's `.danger` modifier is always scope-local (`.some-scope button.danger
3193
+ { color: var(--red) }`) rather than a global class — no bare `.danger`
3194
+ rule exists anywhere in its source tree, confirmed by an exhaustive grep.
3195
+ Matching that pattern here rather than inventing a filled/solid danger
3196
+ button style that OD itself never uses for this control. */
3197
+ .jini-skills-delete-confirm .jini-button-danger {
3198
+ color: var(--jini-danger);
3199
+ background: transparent;
3200
+ }
3201
+ .jini-skills-delete-confirm .jini-button-danger:hover:not(:disabled) {
3202
+ background: color-mix(in srgb, var(--jini-danger) 12%, transparent);
3203
+ border-color: color-mix(in srgb, var(--jini-danger) 35%, var(--jini-border));
3204
+ }
3205
+
3206
+ .jini-empty-card.jini-empty-card-warning {
3207
+ display: flex;
3208
+ flex-direction: column;
3209
+ gap: 12px;
3210
+ margin: 2px 14px 14px;
3211
+ padding: 12px 14px;
3212
+ color: var(--jini-text);
3213
+ }
3214
+ .jini-empty-card.jini-empty-card-warning p {
3215
+ margin: 0;
3216
+ color: var(--jini-text-muted);
3217
+ font-size: 12.5px;
3218
+ line-height: 1.5;
3219
+ }
3220
+ .jini-skills-draft-actions {
3221
+ display: flex;
3222
+ flex-wrap: wrap;
3223
+ justify-content: flex-end;
3224
+ gap: 8px;
3225
+ }
3226
+ .jini-empty-card-warning .jini-button {
3227
+ min-height: 30px;
3228
+ padding: 6px 12px;
3229
+ border-radius: var(--jini-radius-sm);
3230
+ }
3231
+
3232
+ .jini-skills-row-detail {
3233
+ display: flex;
3234
+ flex-direction: column;
3235
+ gap: 14px;
3236
+ padding: 4px 14px 14px;
3237
+ border-top: 1px dashed var(--jini-border);
3238
+ margin: 0 4px;
3239
+ }
3240
+ .jini-skills-row-detail h5 {
3241
+ margin: 0;
3242
+ font-size: 10.5px;
3243
+ letter-spacing: 0.07em;
3244
+ text-transform: uppercase;
3245
+ color: var(--jini-text-disabled);
3246
+ font-weight: 600;
3247
+ }
3248
+ .jini-skills-body-preview {
3249
+ margin: 0;
3250
+ max-height: 320px;
3251
+ overflow: auto;
3252
+ background: var(--jini-bg-panel);
3253
+ border: 1px solid var(--jini-border);
3254
+ border-radius: var(--jini-radius);
3255
+ padding: 10px 12px;
3256
+ font-size: 12.5px;
3257
+ line-height: 1.55;
3258
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
3259
+ white-space: pre-wrap;
3260
+ }
3261
+ .jini-skills-file-tree {
3262
+ list-style: none;
3263
+ margin: 0;
3264
+ padding: 8px 10px;
3265
+ font-size: 12px;
3266
+ color: var(--jini-text-muted);
3267
+ overflow-y: auto;
3268
+ max-height: 240px;
3269
+ background: var(--jini-bg-panel);
3270
+ border: 1px solid var(--jini-border);
3271
+ border-radius: var(--jini-radius);
3272
+ }
3273
+ .jini-skills-file-entry {
3274
+ display: flex;
3275
+ align-items: center;
3276
+ gap: 6px;
3277
+ padding: 3px 0;
3278
+ }
3279
+ .jini-skills-file-entry svg { flex: 0 0 auto; }
3280
+ .jini-skills-file-entry-directory {
3281
+ color: var(--jini-text);
3282
+ font-weight: 500;
3283
+ }
3284
+
3285
+ .jini-skills-draft {
3286
+ margin: 0;
3287
+ }
3288
+ .jini-skills-row > .jini-skills-draft {
3289
+ border: none;
3290
+ border-top: 1px dashed var(--jini-border);
3291
+ border-radius: 0 0 var(--jini-radius-md) var(--jini-radius-md);
3292
+ margin: 0;
3293
+ background: transparent;
3294
+ padding: 14px 14px 14px;
3295
+ }
3296
+ .jini-skills-draft h4 {
3297
+ margin: 0;
3298
+ font-size: 13px;
3299
+ font-weight: 600;
3300
+ }
3301
+ .jini-skills-draft .jini-hint {
3302
+ margin: 0;
3303
+ font-size: 11px;
3304
+ color: var(--jini-text-disabled);
3305
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
3306
+ }
3307
+
3308
+ /* Real OD form fields for `SkillDraftForm` — from `.../viewer/
3309
+ library.css`'s `.library-import-*` family (its actual create/import
3310
+ form). Also fixes `PrivacyTab`'s read-only Anonymous ID `<input>`, the
3311
+ only other `.jini-settings-field > input` in the codebase. */
3312
+ .jini-settings-field input,
3313
+ .jini-settings-field textarea {
3314
+ font-size: 13px;
3315
+ color: var(--jini-text);
3316
+ background: var(--jini-bg-panel);
3317
+ border: 1px solid var(--jini-border);
3318
+ border-radius: var(--jini-radius);
3319
+ padding: 7px 9px;
3320
+ font-family: inherit;
3321
+ width: 100%;
3322
+ box-sizing: border-box;
3323
+ }
3324
+ .jini-settings-field textarea { resize: vertical; }
3325
+ .jini-settings-field input:focus,
3326
+ .jini-settings-field textarea:focus {
3327
+ outline: none;
3328
+ border-color: var(--jini-accent);
3329
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent);
3330
+ }
3331
+ .jini-settings-field input:read-only {
3332
+ color: var(--jini-text-muted);
3333
+ background: var(--jini-bg-subtle);
3334
+ }
3335
+ .jini-hint-error {
3336
+ color: var(--jini-danger);
3337
+ font-size: 12px;
3338
+ }
3339
+
3340
+ /* Media providers tab — `MediaProvidersTab.tsx` renders `jini-media-provider-*`
3341
+ classes that had never been given rules here, so every card fell back to
3342
+ plain block/inline flow: label above input, one field per line. Ported
3343
+ from the origin's real `.media-provider-row`/`.media-provider-body` (a
3344
+ three-column grid — API key, Base URL, Model — with `auto`-width Clear as
3345
+ the trailing item, so it sits inline when Model is absent and wraps to its
3346
+ own left-aligned line, sized to the first column, when Model is present).
3347
+ `.jini-sr-only` keeps each field's existing visible label in the
3348
+ accessibility tree and in `getByText` queries without occupying grid
3349
+ space — sighted users read the placeholder instead, matching the origin,
3350
+ which never rendered a visible label for these fields at all. */
3351
+ .jini-media-provider-list {
3352
+ display: flex;
3353
+ flex-direction: column;
3354
+ gap: 10px;
3355
+ }
3356
+
3357
+ .jini-media-provider-card {
3358
+ display: flex;
3359
+ flex-direction: column;
3360
+ gap: 8px;
3361
+ padding: 12px;
3362
+ background: var(--jini-bg-panel);
3363
+ border: 1px solid var(--jini-border);
3364
+ border-radius: var(--jini-radius-sm);
3365
+ }
3366
+
3367
+ /* Separates a pinned provider (`MediaProvidersTabProps.pinnedProviderIds`) from the rest of the
3368
+ configured-first/alphabetical list below it — a plain `<hr>` rather than a styled `<div>` since
3369
+ it carries no content, just a boundary; a flex child of `.jini-media-provider-list` so it needs
3370
+ its own margin reset (the browser default `hr` margin would otherwise fight that list's own
3371
+ `gap`, doubling the visual space around it). */
3372
+ .jini-media-provider-divider {
3373
+ margin: 2px 0;
3374
+ border: none;
3375
+ border-top: 1px solid var(--jini-border);
3376
+ }
3377
+
3378
+ .jini-media-provider-card-head {
3379
+ display: flex;
3380
+ align-items: center;
3381
+ gap: 8px;
3382
+ flex-wrap: wrap;
3383
+ }
3384
+
3385
+ .jini-media-provider-fields {
3386
+ display: grid;
3387
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
3388
+ gap: 6px;
3389
+ }
3390
+
3391
+ .jini-media-provider-field {
3392
+ min-width: 0;
3393
+ }
3394
+
3395
+ .jini-media-provider-field--secret {
3396
+ position: relative;
3397
+ }
3398
+
3399
+ .jini-media-provider-field--secret .jini-input {
3400
+ padding-right: 34px;
3401
+ }
3402
+
3403
+ /* Overrides `.jini-input-affix-btn`'s boxed look (shared with
3404
+ `ByokProviderForm.tsx`, which still wants that) for this one context only:
3405
+ the origin's `.secret-visibility-button` is a borderless icon that floats
3406
+ inside the field's own right edge, not a separate boxed button beside it. */
3407
+ .jini-media-provider-field--secret .jini-input-affix-btn {
3408
+ position: absolute;
3409
+ top: 50%;
3410
+ right: 4px;
3411
+ transform: translateY(-50%);
3412
+ width: 22px;
3413
+ height: 22px;
3414
+ padding: 0;
3415
+ background: transparent;
3416
+ border: 0;
3417
+ border-radius: var(--jini-radius-pill);
3418
+ }
3419
+
3420
+ .jini-media-provider-field--secret .jini-input-affix-btn:hover {
3421
+ background: var(--jini-bg-subtle);
3422
+ }
3423
+
3424
+ /* `top: 0; left: 0` is a BUG FIX, not cosmetic — do not drop it. Without an explicit offset,
3425
+ `position: absolute` resolves against the element's STATIC position, and when every ancestor up
3426
+ the chain is `position: static` (true for every current caller — none of `.jini-media-provider-
3427
+ field`'s ancestors are positioned except the one `--secret` field's own wrapper), the containing
3428
+ block falls back to the *initial containing block* (the whole document). A static position deep
3429
+ in a long page can then inflate the document's scrollHeight well past its real content — the
3430
+ exact defect class the consuming host's own `.visually-hidden` was fixed for after a "bunch of
3431
+ white space" incident; pinning to the containing block's origin here closes it for every current
3432
+ and future `.jini-sr-only` caller instead of leaving it latent. */
3433
+ .jini-sr-only {
3434
+ position: absolute;
3435
+ top: 0;
3436
+ left: 0;
3437
+ width: 1px;
3438
+ height: 1px;
3439
+ padding: 0;
3440
+ margin: -1px;
3441
+ overflow: hidden;
3442
+ clip: rect(0, 0, 0, 0);
3443
+ white-space: nowrap;
3444
+ border: 0;
3445
+ }
3446
+
3447
+ .jini-field-status-badge {
3448
+ display: inline-flex;
3449
+ align-items: center;
3450
+ font-size: 10.5px;
3451
+ font-weight: 600;
3452
+ letter-spacing: 0.02em;
3453
+ padding: 2px 7px;
3454
+ border-radius: var(--jini-radius-pill);
3455
+ color: var(--jini-text-muted);
3456
+ background: var(--jini-bg-subtle);
3457
+ border: 1px solid var(--jini-border);
3458
+ }
3459
+
3460
+ .jini-field-status-badge-success {
3461
+ color: var(--jini-success);
3462
+ background: color-mix(in srgb, var(--jini-success) 10%, transparent);
3463
+ border-color: color-mix(in srgb, var(--jini-success) 28%, var(--jini-border));
3464
+ }
3465
+
3466
+ /* Toggle switch — ported from `.../viewer/memory.css`'s `.toggle-switch`/
3467
+ `.toggle-slider`, the real switch chrome (Privacy's own toggles use the
3468
+ same OD component, just via a different wrapper: `.jini-toggle-row`).
3469
+ `SkillRow.tsx` previously wrapped its checkbox in `.jini-toggle-row`
3470
+ (built for Privacy's big bordered standalone-row toggles) with no
3471
+ `.toggle-slider` sibling at all — a structural gap CSS alone can't
3472
+ close, since the switch's visual track+thumb is a `::before` on that
3473
+ sibling span. Fixed by editing `SkillRow.tsx` to render the real OD
3474
+ markup (`toggle-switch toggle-switch-sm` wrapper + `.toggle-slider`
3475
+ span) instead — see that file's own comment for the diff. */
3476
+ .toggle-switch {
3477
+ position: relative;
3478
+ display: inline-block;
3479
+ width: 36px;
3480
+ height: 20px;
3481
+ flex-shrink: 0;
3482
+ }
3483
+ .toggle-switch input {
3484
+ opacity: 0;
3485
+ width: 0;
3486
+ height: 0;
3487
+ }
3488
+ .toggle-slider {
3489
+ position: absolute;
3490
+ cursor: pointer;
3491
+ top: 0;
3492
+ left: 0;
3493
+ right: 0;
3494
+ bottom: 0;
3495
+ background-color: var(--jini-border);
3496
+ border-radius: 20px;
3497
+ transition: background-color 0.2s;
3498
+ }
3499
+ .toggle-slider::before {
3500
+ content: '';
3501
+ position: absolute;
3502
+ height: 14px;
3503
+ width: 14px;
3504
+ left: 3px;
3505
+ bottom: 3px;
3506
+ background-color: white;
3507
+ border-radius: 50%;
3508
+ transition: transform 0.2s;
3509
+ }
3510
+ .toggle-switch input:checked + .toggle-slider { background-color: var(--jini-accent); }
3511
+ .toggle-switch input:checked + .toggle-slider::before { transform: translateX(16px); }
3512
+ .toggle-switch-sm { width: 30px; height: 17px; }
3513
+ .toggle-switch-sm .toggle-slider::before { height: 11px; width: 11px; }
3514
+ .toggle-switch-sm input:checked + .toggle-slider::before { transform: translateX(13px); }
3515
+
3516
+ /* ============================================================
3517
+ Memory + External MCP OD-parity pass (2026-07-31)
3518
+ ============================================================
3519
+ Everything below is new. Before this pass, `memory-*`/`library-*`/
3520
+ `settings-section*` (used by `MemoryList`/`MemoryHowPanel`/
3521
+ `MemoryHooksPanel`, `features/memory`) and `source-config-list-*`/
3522
+ `source-config-*` (used by `SourceConfigList`'s presentational pieces,
3523
+ `features/source-config-list`) had ZERO rules anywhere in this file —
3524
+ both features were functional but had literally never been styled by any
3525
+ host. Reference screenshots: `od-settings-memory.png`,
3526
+ `od-settings-memory-howitworks.png`, `od-settings-external-mcp.png`,
3527
+ `od-settings-external-mcp-customform.png`. Tovu mounts the two new
3528
+ composed components this section styles — `MemorySettingsPanel`
3529
+ (`features/memory`) and `ExternalMcpTab` (new `features/external-mcp`) —
3530
+ inert-wrapped in `SettingsUi.tsx`, same pattern as Media providers/
3531
+ Connectors/Skills. */
3532
+
3533
+ /* ---- Generic checkbox toggle switch ---------------------------------
3534
+ `toggle-switch`/`toggle-switch-sm`/`toggle-slider`: a real
3535
+ `<input type="checkbox">` plus a sibling `<span class="toggle-slider">`,
3536
+ styled via `:checked + .toggle-slider` — a different shape from
3537
+ `.jini-toggle-row`'s button-plus-class-toggle above. Used by
3538
+ `MemoryHooksPanel`'s four per-row toggles and `MemorySettingsPanel`'s
3539
+ master switch; had no rules anywhere (every hook toggle rendered as a
3540
+ bare unstyled checkbox before this). */
3541
+ .toggle-switch {
3542
+ position: relative;
3543
+ display: inline-flex;
3544
+ align-items: center;
3545
+ flex: 0 0 auto;
3546
+ width: 36px;
3547
+ height: 20px;
3548
+ }
3549
+
3550
+ .toggle-switch input {
3551
+ position: absolute;
3552
+ inset: 0;
3553
+ margin: 0;
3554
+ opacity: 0;
3555
+ cursor: pointer;
3556
+ }
3557
+
3558
+ .toggle-switch input:disabled {
3559
+ cursor: not-allowed;
3560
+ }
3561
+
3562
+ .toggle-slider {
3563
+ position: absolute;
3564
+ inset: 0;
3565
+ background: var(--jini-border-strong);
3566
+ border-radius: var(--jini-radius-pill);
3567
+ pointer-events: none;
3568
+ transition: background-color 120ms var(--jini-ease-out);
3569
+ }
3570
+
3571
+ .toggle-slider::after {
3572
+ content: "";
3573
+ position: absolute;
3574
+ top: 2px;
3575
+ left: 2px;
3576
+ width: 16px;
3577
+ height: 16px;
3578
+ border-radius: 50%;
3579
+ background: #fff;
3580
+ box-shadow: var(--jini-shadow-xs);
3581
+ transition: transform 120ms var(--jini-ease-out);
3582
+ }
3583
+
3584
+ .toggle-switch input:checked + .toggle-slider {
3585
+ background: var(--jini-accent);
3586
+ }
3587
+
3588
+ .toggle-switch input:checked + .toggle-slider::after {
3589
+ transform: translateX(16px);
3590
+ }
3591
+
3592
+ .toggle-switch input:disabled + .toggle-slider {
3593
+ opacity: 0.55;
3594
+ }
3595
+
3596
+ /* `MemoryHooksPanel`'s per-row size — smaller track/knob than the master
3597
+ switch in `MemorySettingsPanel`'s header. */
3598
+ .toggle-switch-sm {
3599
+ width: 30px;
3600
+ height: 18px;
3601
+ }
3602
+
3603
+ .toggle-switch-sm .toggle-slider::after {
3604
+ width: 14px;
3605
+ height: 14px;
3606
+ }
3607
+
3608
+ .toggle-switch-sm input:checked + .toggle-slider::after {
3609
+ transform: translateX(12px);
3610
+ }
3611
+
3612
+ /* ---- Memory tab head card (`MemorySettingsPanel`) --------------------- */
3613
+
3614
+ .memory-settings-panel {
3615
+ display: flex;
3616
+ flex-direction: column;
3617
+ gap: 16px;
3618
+ margin-top: 14px;
3619
+ }
3620
+
3621
+ .memory-panel-head-card {
3622
+ display: flex;
3623
+ align-items: center;
3624
+ justify-content: space-between;
3625
+ gap: 16px;
3626
+ flex-wrap: wrap;
3627
+ padding: 16px;
3628
+ border: 1px solid var(--jini-border);
3629
+ border-radius: var(--jini-radius);
3630
+ background: var(--jini-bg-panel);
3631
+ }
3632
+
3633
+ .memory-panel-head-copy h4 {
3634
+ margin: 0 0 4px;
3635
+ font-size: 14px;
3636
+ font-weight: 600;
3637
+ color: var(--jini-text-strong);
3638
+ }
3639
+
3640
+ .memory-panel-head-copy .hint {
3641
+ margin: 0;
3642
+ max-width: 46ch;
3643
+ font-size: 12px;
3644
+ color: var(--jini-text-muted);
3645
+ }
3646
+
3647
+ .memory-panel-head-controls {
3648
+ display: flex;
3649
+ align-items: center;
3650
+ gap: 8px;
3651
+ flex: 0 0 auto;
3652
+ }
3653
+
3654
+ /* Narrower than `.jini-seg-control`'s other hosts (Execution mode/
3655
+ Appearance stretch to fill their own full-width row) — Memory's two
3656
+ segments share their header row with three more controls, so the pill
3657
+ sizes to its own two short labels instead of stretching. */
3658
+ .memory-panel-seg {
3659
+ width: auto;
3660
+ min-width: 0;
3661
+ min-height: 34px;
3662
+ }
3663
+
3664
+ .memory-panel-seg .jini-seg-btn {
3665
+ padding: 6px 12px;
3666
+ }
3667
+
3668
+ .memory-icon-btn {
3669
+ display: inline-flex;
3670
+ align-items: center;
3671
+ justify-content: center;
3672
+ /* Tovu's own global `button { padding: 0.5rem 0.95rem }` reset otherwise
3673
+ wins here (this rule never declared a `padding` of its own, so the
3674
+ cascade fills it in from that less-specific element selector) — 15.2px
3675
+ of horizontal padding on each side left a 34px button almost no room for
3676
+ its 14px icon, squashing the `<svg>` to ~1.6px wide. Explicit `padding:
3677
+ 0` plus centering via flex is this button's own sizing model. */
3678
+ padding: 0;
3679
+ width: 34px;
3680
+ height: 34px;
3681
+ flex: 0 0 auto;
3682
+ color: var(--jini-text-muted);
3683
+ background: var(--jini-bg-panel);
3684
+ border: 1px solid var(--jini-border);
3685
+ border-radius: var(--jini-radius-sm);
3686
+ cursor: pointer;
3687
+ }
3688
+
3689
+ .memory-icon-btn svg {
3690
+ flex-shrink: 0;
3691
+ }
3692
+
3693
+ .memory-icon-btn:hover:not(:disabled) {
3694
+ color: var(--jini-text);
3695
+ border-color: var(--jini-border-strong);
3696
+ }
3697
+
3698
+ .memory-icon-btn:disabled {
3699
+ opacity: 0.55;
3700
+ cursor: not-allowed;
3701
+ }
3702
+
3703
+ /* ---- Saved-memory card (`MemoryList`) --------------------------------- */
3704
+
3705
+ .settings-section-card,
3706
+ .memory-records-section {
3707
+ padding: 16px;
3708
+ border: 1px solid var(--jini-border);
3709
+ border-radius: var(--jini-radius);
3710
+ background: var(--jini-bg-panel);
3711
+ }
3712
+
3713
+ .memory-management-panel {
3714
+ display: flex;
3715
+ flex-direction: column;
3716
+ gap: 12px;
3717
+ }
3718
+
3719
+ .memory-subsection-head {
3720
+ display: flex;
3721
+ align-items: flex-start;
3722
+ justify-content: space-between;
3723
+ gap: 12px;
3724
+ flex-wrap: wrap;
3725
+ }
3726
+
3727
+ .memory-subsection-head h4 {
3728
+ margin: 0 0 4px;
3729
+ font-size: 14px;
3730
+ font-weight: 600;
3731
+ color: var(--jini-text-strong);
3732
+ }
3733
+
3734
+ .memory-subsection-head .hint {
3735
+ margin: 0;
3736
+ font-size: 12px;
3737
+ color: var(--jini-text-muted);
3738
+ }
3739
+
3740
+ .memory-management-counts {
3741
+ display: flex;
3742
+ align-items: center;
3743
+ gap: 6px;
3744
+ flex: 0 0 auto;
3745
+ }
3746
+
3747
+ .memory-source-badge {
3748
+ display: inline-flex;
3749
+ align-items: center;
3750
+ padding: 3px 10px;
3751
+ font-size: 11px;
3752
+ font-weight: 600;
3753
+ color: var(--jini-text-muted);
3754
+ background: var(--jini-bg-subtle);
3755
+ border: 1px solid var(--jini-border);
3756
+ border-radius: var(--jini-radius-pill);
3757
+ white-space: nowrap;
3758
+ }
3759
+
3760
+ .library-toolbar {
3761
+ display: flex;
3762
+ align-items: center;
3763
+ justify-content: space-between;
3764
+ gap: 12px;
3765
+ flex-wrap: wrap;
3766
+ }
3767
+
3768
+ .library-filters {
3769
+ display: flex;
3770
+ align-items: center;
3771
+ gap: 6px;
3772
+ flex-wrap: wrap;
3773
+ }
3774
+
3775
+ .filter-pill {
3776
+ display: inline-flex;
3777
+ align-items: center;
3778
+ gap: 6px;
3779
+ padding: 5px 12px;
3780
+ font: inherit;
3781
+ font-size: 12px;
3782
+ font-weight: 500;
3783
+ color: var(--jini-text-muted);
3784
+ background: var(--jini-bg-panel);
3785
+ border: 1px solid var(--jini-border);
3786
+ border-radius: var(--jini-radius-pill);
3787
+ cursor: pointer;
3788
+ }
3789
+
3790
+ /* Neutral highlight, not a filled accent pill — `od-settings-memory.png`'s
3791
+ "All 0" (the only pill ever visible while every type count is 0) is a
3792
+ plain bordered pill with dark text, not coral-filled. */
3793
+ .filter-pill.active {
3794
+ color: var(--jini-text-strong);
3795
+ font-weight: 600;
3796
+ border-color: var(--jini-border-strong);
3797
+ }
3798
+
3799
+ .filter-pill-count {
3800
+ font-size: 11px;
3801
+ opacity: 0.85;
3802
+ }
3803
+
3804
+ .memory-management-actions {
3805
+ display: flex;
3806
+ align-items: center;
3807
+ gap: 6px;
3808
+ }
3809
+
3810
+ .library-content {
3811
+ display: flex;
3812
+ flex-direction: column;
3813
+ gap: 8px;
3814
+ }
3815
+
3816
+ .library-empty {
3817
+ padding: 20px 16px;
3818
+ border: 1px solid var(--jini-border);
3819
+ border-radius: var(--jini-radius-sm);
3820
+ background: var(--jini-bg-subtle);
3821
+ }
3822
+
3823
+ .library-empty-title {
3824
+ margin: 0 0 4px;
3825
+ font-size: 13px;
3826
+ font-weight: 600;
3827
+ color: var(--jini-text-strong);
3828
+ }
3829
+
3830
+ .library-empty-hint {
3831
+ margin: 0;
3832
+ font-size: 12px;
3833
+ color: var(--jini-text-muted);
3834
+ }
3835
+
3836
+ .library-empty-hint code {
3837
+ padding: 1px 6px;
3838
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
3839
+ font-size: 11px;
3840
+ color: var(--jini-text);
3841
+ background: var(--jini-bg-panel);
3842
+ border: 1px solid var(--jini-border);
3843
+ border-radius: var(--jini-radius-xs);
3844
+ }
3845
+
3846
+ /* ---- "How it works" card (`MemoryHowPanel` + `MemoryHooksPanel`) ------ */
3847
+
3848
+ .memory-how-panel {
3849
+ display: flex;
3850
+ flex-direction: column;
3851
+ gap: 16px;
3852
+ padding: 16px;
3853
+ border: 1px solid var(--jini-border);
3854
+ border-radius: var(--jini-radius);
3855
+ background: var(--jini-bg-panel);
3856
+ }
3857
+
3858
+ .memory-auto-flow {
3859
+ display: flex;
3860
+ align-items: center;
3861
+ gap: 6px;
3862
+ flex-wrap: wrap;
3863
+ font-size: 12px;
3864
+ color: var(--jini-text-muted);
3865
+ }
3866
+
3867
+ .memory-auto-flow strong {
3868
+ color: var(--jini-text-strong);
3869
+ }
3870
+
3871
+ .memory-how-copy {
3872
+ margin: 0;
3873
+ font-size: 13px;
3874
+ line-height: 1.6;
3875
+ color: var(--jini-text);
3876
+ }
3877
+
3878
+ .memory-hooks-panel {
3879
+ display: flex;
3880
+ flex-direction: column;
3881
+ gap: 12px;
3882
+ padding: 14px;
3883
+ border: 1px solid var(--jini-border);
3884
+ border-radius: var(--jini-radius);
3885
+ background: var(--jini-bg-subtle);
3886
+ }
3887
+
3888
+ .memory-hooks-panel-head {
3889
+ display: flex;
3890
+ align-items: flex-start;
3891
+ gap: 10px;
3892
+ }
3893
+
3894
+ .memory-hooks-panel-head-icon {
3895
+ display: inline-flex;
3896
+ align-items: center;
3897
+ justify-content: center;
3898
+ width: 26px;
3899
+ height: 26px;
3900
+ flex: 0 0 auto;
3901
+ color: var(--jini-accent);
3902
+ background: var(--jini-bg-panel);
3903
+ border: 1px solid var(--jini-border);
3904
+ border-radius: var(--jini-radius-sm);
3905
+ }
3906
+
3907
+ .memory-hooks-panel-title {
3908
+ margin: 0 0 2px;
3909
+ font-size: 13px;
3910
+ font-weight: 600;
3911
+ color: var(--jini-text-strong);
3912
+ }
3913
+
3914
+ .memory-hooks-panel-hint {
3915
+ margin: 0;
3916
+ font-size: 12px;
3917
+ color: var(--jini-text-muted);
3918
+ }
3919
+
3920
+ .memory-hooks-panel-list {
3921
+ display: flex;
3922
+ flex-direction: column;
3923
+ gap: 2px;
3924
+ margin: 0;
3925
+ padding: 0;
3926
+ list-style: none;
3927
+ }
3928
+
3929
+ .memory-hooks-panel-row {
3930
+ display: flex;
3931
+ align-items: center;
3932
+ gap: 10px;
3933
+ padding: 10px 4px;
3934
+ border-top: 1px solid var(--jini-border);
3935
+ }
3936
+
3937
+ .memory-hooks-panel-list .memory-hooks-panel-row:first-child {
3938
+ border-top: none;
3939
+ }
3940
+
3941
+ .memory-hooks-panel-row-icon {
3942
+ display: inline-flex;
3943
+ align-items: center;
3944
+ justify-content: center;
3945
+ width: 22px;
3946
+ flex: 0 0 auto;
3947
+ color: var(--jini-text-muted);
3948
+ }
3949
+
3950
+ .memory-hooks-panel-row-copy {
3951
+ display: flex;
3952
+ flex-direction: column;
3953
+ gap: 1px;
3954
+ flex: 1 1 auto;
3955
+ min-width: 0;
3956
+ }
3957
+
3958
+ .memory-hooks-panel-row-label {
3959
+ font-size: 13px;
3960
+ font-weight: 500;
3961
+ color: var(--jini-text);
3962
+ }
3963
+
3964
+ .memory-hooks-panel-row-desc {
3965
+ font-size: 12px;
3966
+ color: var(--jini-text-muted);
3967
+ }
3968
+
3969
+ .memory-hooks-panel-toggle {
3970
+ flex: 0 0 auto;
3971
+ }
3972
+
3973
+ /* ---- `source-config-list` primitive (External MCP's list/add-form) --- */
3974
+
3975
+ .source-config-list {
3976
+ display: flex;
3977
+ flex-direction: column;
3978
+ gap: 14px;
3979
+ margin-top: 14px;
3980
+ }
3981
+
3982
+ .source-config-list-head h3 {
3983
+ margin: 0 0 4px;
3984
+ font-size: 16px;
3985
+ font-weight: 600;
3986
+ color: var(--jini-text-strong);
3987
+ }
3988
+
3989
+ .source-config-list-subtitle {
3990
+ margin: 0;
3991
+ font-size: 12px;
3992
+ color: var(--jini-text-muted);
3993
+ }
3994
+
3995
+ .source-config-add-form {
3996
+ display: flex;
3997
+ flex-direction: column;
3998
+ gap: 12px;
3999
+ padding: 16px;
4000
+ border: 1px solid var(--jini-border);
4001
+ border-radius: var(--jini-radius);
4002
+ background: var(--jini-bg-panel);
4003
+ }
4004
+
4005
+ .source-config-field {
4006
+ display: flex;
4007
+ flex-direction: column;
4008
+ gap: 4px;
4009
+ }
4010
+
4011
+ .source-config-field-label {
4012
+ display: flex;
4013
+ align-items: center;
4014
+ gap: 4px;
4015
+ font-size: 11px;
4016
+ font-weight: 600;
4017
+ letter-spacing: 0.02em;
4018
+ text-transform: uppercase;
4019
+ color: var(--jini-text-muted);
4020
+ }
4021
+
4022
+ .source-config-field-required {
4023
+ color: var(--jini-danger);
4024
+ }
4025
+
4026
+ .source-config-field input,
4027
+ .source-config-field select,
4028
+ .source-config-field textarea {
4029
+ width: 100%;
4030
+ box-sizing: border-box;
4031
+ padding: 8px 10px;
4032
+ font: inherit;
4033
+ font-size: 13px;
4034
+ color: var(--jini-text);
4035
+ background: var(--jini-bg-panel);
4036
+ border: 1px solid var(--jini-border);
4037
+ border-radius: var(--jini-radius-sm);
4038
+ }
4039
+
4040
+ .source-config-field textarea {
4041
+ min-height: 64px;
4042
+ resize: vertical;
4043
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
4044
+ font-size: 12px;
4045
+ }
4046
+
4047
+ .source-config-field input:focus,
4048
+ .source-config-field select:focus,
4049
+ .source-config-field textarea:focus {
4050
+ outline: none;
4051
+ border-color: var(--jini-accent);
4052
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent);
4053
+ }
4054
+
4055
+ .source-config-field-row {
4056
+ display: flex;
4057
+ gap: 6px;
4058
+ }
4059
+
4060
+ .source-config-field-row input {
4061
+ flex: 1 1 auto;
4062
+ }
4063
+
4064
+ .source-config-field-toggle {
4065
+ flex: 0 0 auto;
4066
+ padding: 0 12px;
4067
+ font: inherit;
4068
+ font-size: 12px;
4069
+ color: var(--jini-text-muted);
4070
+ background: var(--jini-bg-subtle);
4071
+ border: 1px solid var(--jini-border);
4072
+ border-radius: var(--jini-radius-sm);
4073
+ cursor: pointer;
4074
+ }
4075
+
4076
+ .source-config-field-error {
4077
+ font-size: 11px;
4078
+ color: var(--jini-danger);
4079
+ }
4080
+
4081
+ .source-config-add-form-error {
4082
+ padding: 10px 12px;
4083
+ font-size: 12px;
4084
+ color: var(--jini-danger);
4085
+ background: color-mix(in srgb, var(--jini-danger) 6%, var(--jini-bg-subtle));
4086
+ border: 1px solid color-mix(in srgb, var(--jini-danger) 45%, var(--jini-border));
4087
+ border-radius: var(--jini-radius-sm);
4088
+ }
4089
+
4090
+ .source-config-add-form-submit {
4091
+ align-self: flex-start;
4092
+ display: inline-flex;
4093
+ align-items: center;
4094
+ gap: 6px;
4095
+ padding: 8px 16px;
4096
+ font: inherit;
4097
+ font-size: 13px;
4098
+ font-weight: 500;
4099
+ color: #fff;
4100
+ background: var(--jini-accent);
4101
+ border: 1px solid var(--jini-accent);
4102
+ border-radius: var(--jini-radius-sm);
4103
+ cursor: pointer;
4104
+ }
4105
+
4106
+ .source-config-add-form-submit:hover:not(:disabled) {
4107
+ background: var(--jini-accent-hover);
4108
+ border-color: var(--jini-accent-hover);
4109
+ }
4110
+
4111
+ .source-config-add-form-submit:disabled {
4112
+ opacity: 0.55;
4113
+ cursor: not-allowed;
4114
+ }
4115
+
4116
+ .source-config-test-control {
4117
+ display: flex;
4118
+ align-items: center;
4119
+ justify-content: space-between;
4120
+ gap: 10px;
4121
+ }
4122
+
4123
+ .source-config-test-control-status {
4124
+ font-size: 12px;
4125
+ }
4126
+
4127
+ .source-config-test-status.is-running,
4128
+ .source-config-test-status.is-success {
4129
+ color: var(--jini-success);
4130
+ }
4131
+
4132
+ .source-config-test-status.is-error {
4133
+ color: var(--jini-danger);
4134
+ }
4135
+
4136
+ .source-config-test-button {
4137
+ padding: 6px 12px;
4138
+ font: inherit;
4139
+ font-size: 12px;
4140
+ color: var(--jini-text);
4141
+ background: var(--jini-bg-panel);
4142
+ border: 1px solid var(--jini-border);
4143
+ border-radius: var(--jini-radius-sm);
4144
+ cursor: pointer;
4145
+ }
4146
+
4147
+ .source-config-test-button:disabled {
4148
+ opacity: 0.55;
4149
+ cursor: not-allowed;
4150
+ }
4151
+
4152
+ .source-config-list-error,
4153
+ .source-config-list-loading {
4154
+ padding: 12px 14px;
4155
+ font-size: 12px;
4156
+ border-radius: var(--jini-radius-sm);
4157
+ }
4158
+
4159
+ .source-config-list-error {
4160
+ color: var(--jini-danger);
4161
+ background: color-mix(in srgb, var(--jini-danger) 6%, var(--jini-bg-subtle));
4162
+ border: 1px solid color-mix(in srgb, var(--jini-danger) 45%, var(--jini-border));
4163
+ }
4164
+
4165
+ .source-config-list-loading {
4166
+ color: var(--jini-text-muted);
4167
+ background: var(--jini-bg-subtle);
4168
+ border: 1px solid var(--jini-border);
4169
+ }
4170
+
4171
+ .source-config-list-empty {
4172
+ padding: 16px;
4173
+ border: 1px dashed var(--jini-border);
4174
+ border-radius: var(--jini-radius-sm);
4175
+ color: var(--jini-text-muted);
4176
+ font-size: 12px;
4177
+ background: var(--jini-bg-subtle);
4178
+ }
4179
+
4180
+ .source-config-list-items {
4181
+ display: flex;
4182
+ flex-direction: column;
4183
+ gap: 8px;
4184
+ }
4185
+
4186
+ .source-config-item-card {
4187
+ border: 1px solid var(--jini-border);
4188
+ border-radius: var(--jini-radius-sm);
4189
+ background: var(--jini-bg-panel);
4190
+ }
4191
+
4192
+ .source-config-item-card-head {
4193
+ display: flex;
4194
+ align-items: center;
4195
+ gap: 10px;
4196
+ padding: 10px 12px;
4197
+ }
4198
+
4199
+ .source-config-item-card-enabled-toggle {
4200
+ flex: 0 0 auto;
4201
+ }
4202
+
4203
+ .source-config-item-card-summary {
4204
+ display: flex;
4205
+ align-items: center;
4206
+ gap: 8px;
4207
+ flex: 1 1 auto;
4208
+ min-width: 0;
4209
+ padding: 0;
4210
+ font: inherit;
4211
+ text-align: left;
4212
+ color: var(--jini-text);
4213
+ background: none;
4214
+ border: none;
4215
+ cursor: pointer;
4216
+ }
4217
+
4218
+ .source-config-item-card-label {
4219
+ font-size: 13px;
4220
+ font-weight: 500;
4221
+ overflow: hidden;
4222
+ text-overflow: ellipsis;
4223
+ white-space: nowrap;
4224
+ }
4225
+
4226
+ .source-config-item-card-trust-badge {
4227
+ padding: 2px 8px;
4228
+ font-size: 11px;
4229
+ font-weight: 600;
4230
+ color: var(--jini-text-muted);
4231
+ background: var(--jini-bg-subtle);
4232
+ border: 1px solid var(--jini-border);
4233
+ border-radius: var(--jini-radius-pill);
4234
+ white-space: nowrap;
4235
+ }
4236
+
4237
+ .source-config-item-card-actions {
4238
+ display: flex;
4239
+ align-items: center;
4240
+ gap: 6px;
4241
+ flex: 0 0 auto;
4242
+ }
4243
+
4244
+ .source-config-item-card-actions button,
4245
+ .source-config-item-card-actions select {
4246
+ padding: 5px 10px;
4247
+ font: inherit;
4248
+ font-size: 12px;
4249
+ color: var(--jini-text);
4250
+ background: var(--jini-bg-panel);
4251
+ border: 1px solid var(--jini-border);
4252
+ border-radius: var(--jini-radius-sm);
4253
+ cursor: pointer;
4254
+ }
4255
+
4256
+ .source-config-item-card-remove {
4257
+ color: var(--jini-danger);
4258
+ }
4259
+
4260
+ .source-config-item-card-body {
4261
+ display: flex;
4262
+ flex-direction: column;
4263
+ gap: 10px;
4264
+ padding: 0 12px 12px;
4265
+ border-top: 1px solid var(--jini-border);
4266
+ }
4267
+
4268
+ .source-config-item-card-edit-toggle {
4269
+ display: flex;
4270
+ gap: 6px;
4271
+ padding-top: 10px;
4272
+ }
4273
+
4274
+ .source-config-item-card-edit-toggle button {
4275
+ padding: 5px 10px;
4276
+ font: inherit;
4277
+ font-size: 12px;
4278
+ background: var(--jini-bg-panel);
4279
+ border: 1px solid var(--jini-border);
4280
+ border-radius: var(--jini-radius-sm);
4281
+ cursor: pointer;
4282
+ }
4283
+
4284
+ .source-config-item-card-edit-fields {
4285
+ display: flex;
4286
+ flex-direction: column;
4287
+ gap: 10px;
4288
+ }
4289
+
4290
+ .source-config-item-card-fields {
4291
+ display: grid;
4292
+ grid-template-columns: max-content 1fr;
4293
+ gap: 6px 12px;
4294
+ margin: 10px 0 0;
4295
+ }
4296
+
4297
+ /* Each field is a `<div class="source-config-item-card-field">` wrapping one
4298
+ `<dt>`/`<dd>` pair (`SourceConfigItemCard.tsx`) — `display: contents` lets
4299
+ that wrapper disappear from layout so its `dt`/`dd` land directly in the
4300
+ parent `<dl>`'s two-column grid instead of each pair collapsing onto one
4301
+ grid cell. */
4302
+ .source-config-item-card-field {
4303
+ display: contents;
4304
+ }
4305
+
4306
+ .source-config-item-card-field dt {
4307
+ font-size: 11px;
4308
+ font-weight: 600;
4309
+ text-transform: uppercase;
4310
+ letter-spacing: 0.02em;
4311
+ color: var(--jini-text-muted);
4312
+ }
4313
+
4314
+ .source-config-item-card-field dd {
4315
+ margin: 0;
4316
+ font-size: 12px;
4317
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
4318
+ color: var(--jini-text);
4319
+ word-break: break-all;
4320
+ }
4321
+
4322
+ /* ---- `ExternalMcpTab` chrome (header/banner/empty/footer) ------------ */
4323
+
4324
+ .external-mcp-tab {
4325
+ display: flex;
4326
+ flex-direction: column;
4327
+ gap: 14px;
4328
+ margin-top: 14px;
4329
+ }
4330
+
4331
+ .external-mcp-head {
4332
+ display: flex;
4333
+ align-items: flex-start;
4334
+ justify-content: space-between;
4335
+ gap: 16px;
4336
+ flex-wrap: wrap;
4337
+ }
4338
+
4339
+ .external-mcp-head h3 {
4340
+ margin: 0 0 4px;
4341
+ font-size: 18px;
4342
+ font-weight: 600;
4343
+ color: var(--jini-text-strong);
4344
+ }
4345
+
4346
+ .external-mcp-subtitle {
4347
+ margin: 0;
4348
+ font-size: 13px;
4349
+ color: var(--jini-text-muted);
4350
+ }
4351
+
4352
+ .external-mcp-add-button {
4353
+ display: inline-flex;
4354
+ align-items: center;
4355
+ gap: 6px;
4356
+ flex: 0 0 auto;
4357
+ padding: 8px 16px;
4358
+ font: inherit;
4359
+ font-size: 13px;
4360
+ font-weight: 500;
4361
+ color: #fff;
4362
+ background: var(--jini-accent);
4363
+ border: 1px solid var(--jini-accent);
4364
+ border-radius: var(--jini-radius-sm);
4365
+ cursor: pointer;
4366
+ }
4367
+
4368
+ .external-mcp-add-button:hover {
4369
+ background: var(--jini-accent-hover);
4370
+ border-color: var(--jini-accent-hover);
4371
+ }
4372
+
4373
+ .external-mcp-banner {
4374
+ padding: 12px 14px;
4375
+ font-size: 13px;
4376
+ color: var(--jini-danger);
4377
+ background: color-mix(in srgb, var(--jini-danger) 6%, var(--jini-bg-subtle));
4378
+ border: 1px solid color-mix(in srgb, var(--jini-danger) 45%, var(--jini-border));
4379
+ border-radius: var(--jini-radius-sm);
4380
+ }
4381
+
4382
+ .external-mcp-empty {
4383
+ padding: 20px 16px;
4384
+ border: 1px solid var(--jini-border);
4385
+ border-radius: var(--jini-radius-sm);
4386
+ background: var(--jini-bg-subtle);
4387
+ }
4388
+
4389
+ .external-mcp-empty-title {
4390
+ margin: 0 0 4px;
4391
+ font-size: 13px;
4392
+ font-weight: 600;
4393
+ color: var(--jini-text-strong);
4394
+ }
4395
+
4396
+ .external-mcp-empty-hint {
4397
+ margin: 0;
4398
+ font-size: 12px;
4399
+ color: var(--jini-text-muted);
4400
+ }
4401
+
4402
+ .external-mcp-footer {
4403
+ display: flex;
4404
+ align-items: center;
4405
+ justify-content: space-between;
4406
+ gap: 12px;
4407
+ flex-wrap: wrap;
4408
+ }
4409
+
4410
+ .external-mcp-save-pill {
4411
+ display: inline-flex;
4412
+ align-items: center;
4413
+ padding: 5px 14px;
4414
+ font-size: 12px;
4415
+ font-weight: 600;
4416
+ color: #fff;
4417
+ background: var(--jini-accent);
4418
+ border-radius: var(--jini-radius-pill);
4419
+ }
4420
+
4421
+ .external-mcp-stored-at {
4422
+ font-size: 12px;
4423
+ color: var(--jini-text-muted);
4424
+ }
4425
+
4426
+ .external-mcp-stored-at code {
4427
+ padding: 1px 6px;
4428
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
4429
+ font-size: 11px;
4430
+ color: var(--jini-text);
4431
+ background: var(--jini-bg-subtle);
4432
+ border: 1px solid var(--jini-border);
4433
+ border-radius: var(--jini-radius-xs);
4434
+ }