@ic-reactor/mcp 0.0.0-stage → 0.0.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 (1041) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.yml +77 -0
  4. package/.github/actions/setup-rust-wasm/action.yml +25 -0
  5. package/.github/dependabot.yml +107 -0
  6. package/.github/workflows/auth-latest.yml +67 -0
  7. package/.github/workflows/b3pay-site.yml +49 -0
  8. package/.github/workflows/ci.yml +430 -0
  9. package/.github/workflows/codeql.yml +41 -0
  10. package/.github/workflows/dependency-review.yml +68 -0
  11. package/.github/workflows/docs-check.yml +98 -0
  12. package/.github/workflows/docs.yml +265 -0
  13. package/.github/workflows/e2e.yml +90 -0
  14. package/.github/workflows/examples-published.yml +97 -0
  15. package/.github/workflows/release.yml +326 -0
  16. package/.husky/pre-commit +12 -0
  17. package/.prettierignore +109 -0
  18. package/.prettierrc +6 -0
  19. package/AGENTS.md +103 -0
  20. package/CHANGELOG.md +3268 -0
  21. package/CLAUDE.md +93 -0
  22. package/CNAME +1 -0
  23. package/CODE_OF_CONDUCT.md +7 -0
  24. package/CONTRIBUTING.md +433 -0
  25. package/LICENSE +21 -0
  26. package/README.md +2 -2
  27. package/SECURITY.md +74 -0
  28. package/b3pay-module.json +194 -0
  29. package/docs/.remarkrc.json +10 -0
  30. package/docs/README.md +64 -0
  31. package/docs/astro.config.mjs +205 -0
  32. package/docs/favicon.svg +15 -0
  33. package/docs/package.json +39 -0
  34. package/docs/public/favicon.svg +15 -0
  35. package/docs/public/ic-reactor-social-card.png +0 -0
  36. package/docs/scripts/b3pay-static.mjs +22 -0
  37. package/docs/scripts/check-example-docs.mjs +214 -0
  38. package/docs/scripts/check-links.mjs +212 -0
  39. package/docs/scripts/fix-dist-links.js +125 -0
  40. package/docs/scripts/fix-frontmatter.js +71 -0
  41. package/docs/scripts/remove-redundant-h1.cjs +48 -0
  42. package/docs/scripts/rewrite-typedoc-links.js +110 -0
  43. package/docs/scripts/split-index.js +69 -0
  44. package/docs/src/assets/ic-reactor-hero-dark.svg +23 -0
  45. package/docs/src/assets/ic-reactor-hero-light.svg +23 -0
  46. package/docs/src/assets/ic-reactor-lockup-dark.svg +15 -0
  47. package/docs/src/assets/ic-reactor-lockup-light.svg +15 -0
  48. package/docs/src/assets/ic-reactor-mark-dark.svg +14 -0
  49. package/docs/src/assets/ic-reactor-mark-light.svg +14 -0
  50. package/docs/src/assets/layers/candid-core-layer-icon-dark.svg +4 -0
  51. package/docs/src/assets/layers/candid-core-layer-icon-light.svg +4 -0
  52. package/docs/src/assets/layers/candid-profile-layer-icon-dark.svg +4 -0
  53. package/docs/src/assets/layers/candid-profile-layer-icon-light.svg +4 -0
  54. package/docs/src/assets/layers/ic-reactor-layer-icon-dark.svg +4 -0
  55. package/docs/src/assets/layers/ic-reactor-layer-icon-light.svg +4 -0
  56. package/docs/src/components/LibraryCards.astro +172 -0
  57. package/docs/src/components/LibraryIcon.astro +28 -0
  58. package/docs/src/components/SiteTitle.astro +241 -0
  59. package/docs/src/content/docs/404.mdx +19 -0
  60. package/docs/src/content/docs/build/agent-tools.mdx +593 -0
  61. package/docs/src/content/docs/build/icrc1-wallet.mdx +619 -0
  62. package/docs/src/content/docs/build/ssr-per-user.mdx +552 -0
  63. package/docs/src/content/docs/examples/canister-studio.mdx +95 -0
  64. package/docs/src/content/docs/examples/icrc-ledger.mdx +45 -0
  65. package/docs/src/content/docs/examples/index.mdx +38 -0
  66. package/docs/src/content/docs/examples/next-ssr.mdx +73 -0
  67. package/docs/src/content/docs/examples/node-agent-tool.mdx +80 -0
  68. package/docs/src/content/docs/examples/vite-wallet.mdx +71 -0
  69. package/docs/src/content/docs/guides/auth.mdx +1181 -0
  70. package/docs/src/content/docs/guides/client.mdx +551 -0
  71. package/docs/src/content/docs/guides/deploy.mdx +180 -0
  72. package/docs/src/content/docs/guides/errors.mdx +475 -0
  73. package/docs/src/content/docs/guides/getting-started.mdx +620 -0
  74. package/docs/src/content/docs/guides/reads.mdx +586 -0
  75. package/docs/src/content/docs/guides/ssr.mdx +529 -0
  76. package/docs/src/content/docs/guides/testing.mdx +401 -0
  77. package/docs/src/content/docs/guides/values.mdx +261 -0
  78. package/docs/src/content/docs/guides/vite-plugin.mdx +690 -0
  79. package/docs/src/content/docs/guides/writes.mdx +572 -0
  80. package/docs/src/content/docs/ic-reactor/index.mdx +167 -0
  81. package/docs/src/content/docs/index.mdx +65 -0
  82. package/docs/src/content/docs/migrating-from-3.mdx +535 -0
  83. package/docs/src/content/docs/packages/core.mdx +186 -0
  84. package/docs/src/content/docs/packages/mcp.mdx +163 -0
  85. package/docs/src/content/docs/packages/react.mdx +207 -0
  86. package/docs/src/content/docs/packages/vite-plugin.mdx +73 -0
  87. package/docs/src/content/docs/versioning.mdx +104 -0
  88. package/docs/src/content.config.ts +7 -0
  89. package/docs/src/styles/custom.css +189 -0
  90. package/docs/tsconfig.typedoc.json +26 -0
  91. package/docs/typedoc-entry.ts +17 -0
  92. package/docs/typedoc.json +37 -0
  93. package/e2e/Cargo.lock +646 -0
  94. package/e2e/Cargo.toml +3 -0
  95. package/e2e/README.md +101 -0
  96. package/e2e/frontends/build.mjs +94 -0
  97. package/e2e/frontends/index.html +10 -0
  98. package/e2e/global-setup.ts +65 -0
  99. package/e2e/icp.yaml +38 -0
  100. package/e2e/package.json +40 -0
  101. package/e2e/setup.ts +6 -0
  102. package/e2e/src/actor/Cargo.toml +14 -0
  103. package/e2e/src/actor/hello_actor.did +10 -0
  104. package/e2e/src/actor/src/lib.rs +73 -0
  105. package/e2e/src/calls.test.ts +132 -0
  106. package/e2e/src/declarations/hello_actor.envelope.json +175 -0
  107. package/e2e/src/declarations/hello_actor.ts +15 -0
  108. package/e2e/src/errors.test.ts +107 -0
  109. package/e2e/src/frontend-headers.test.ts +253 -0
  110. package/e2e/src/identity.test.ts +61 -0
  111. package/e2e/src/react.test.tsx +59 -0
  112. package/e2e/src/replica.ts +70 -0
  113. package/e2e/src/vite-env.test.ts +108 -0
  114. package/e2e/test.sh +47 -0
  115. package/e2e/tsconfig.json +20 -0
  116. package/e2e/tsconfig.typecheck.json +9 -0
  117. package/e2e/vitest.config.ts +22 -0
  118. package/eslint.config.mjs +100 -0
  119. package/evals/PREREGISTRATION.md +1346 -0
  120. package/evals/README.md +756 -0
  121. package/evals/conditions/thin/condition.json +8 -0
  122. package/evals/conditions/thin/docs/candid-core-cli.README.md +90 -0
  123. package/evals/conditions/thin/docs/candid-core-schema.README.md +339 -0
  124. package/evals/conditions/thin/package.json +25 -0
  125. package/evals/conditions/thin/starter/src/generated/icrc1.ts +57 -0
  126. package/evals/conditions/thin-guide/condition.json +10 -0
  127. package/evals/conditions/thin-guide/docs/llms.txt +292 -0
  128. package/evals/conditions/v3/condition.json +9 -0
  129. package/evals/conditions/v3/docs/ic-reactor-core.llms.txt +232 -0
  130. package/evals/conditions/v3/docs/ic-reactor-react.llms.txt +280 -0
  131. package/evals/conditions/v3/docs/llms-full.txt +1053 -0
  132. package/evals/conditions/v3/package.json +26 -0
  133. package/evals/conditions/v3/starter/src/declarations/icrc1.did.d.ts +95 -0
  134. package/evals/conditions/v3/starter/src/declarations/icrc1.did.js +140 -0
  135. package/evals/conditions/v4/PORTING.md +384 -0
  136. package/evals/conditions/v4/README.md +106 -0
  137. package/evals/conditions/v4/condition.json +5 -0
  138. package/evals/conditions/v4/docs/llms.txt +323 -0
  139. package/evals/conditions/v4/package.json +27 -0
  140. package/evals/conditions/v4/starter/src/generated/icrc1.ts +78 -0
  141. package/evals/conditions/v4-proto/condition.json +6 -0
  142. package/evals/conditions/v4-proto/docs/llms.txt +291 -0
  143. package/evals/conditions/v4-proto/lib/SHIM-NOTES.md +20 -0
  144. package/evals/conditions/v4-proto/lib/package.json +27 -0
  145. package/evals/conditions/v4-proto/lib/src/client.ts +471 -0
  146. package/evals/conditions/v4-proto/lib/src/errors.ts +214 -0
  147. package/evals/conditions/v4-proto/lib/src/index.ts +36 -0
  148. package/evals/conditions/v4-proto/lib/src/principal.ts +175 -0
  149. package/evals/conditions/v4-proto/lib/src/service.ts +69 -0
  150. package/evals/conditions/v4-proto/lib/src/types.ts +174 -0
  151. package/evals/conditions/v4-proto/lib/test/runtime.test.ts +170 -0
  152. package/evals/conditions/v4-proto/lib/test/tsconfig.json +10 -0
  153. package/evals/conditions/v4-proto/lib/test/types.test-d.ts +145 -0
  154. package/evals/conditions/v4-proto/lib/test/vitest.config.mjs +8 -0
  155. package/evals/conditions/v4-proto/lib/tsconfig.json +17 -0
  156. package/evals/conditions/v4-proto/package.json +26 -0
  157. package/evals/conditions/v4-proto/starter/src/generated/icrc1.service.ts +19 -0
  158. package/evals/conditions/v4-proto/starter/src/generated/icrc1.ts +57 -0
  159. package/evals/drive.mjs +1221 -0
  160. package/evals/gate.mjs +161 -0
  161. package/evals/harness/aggregate.mjs +534 -0
  162. package/evals/harness/aggregate.test.mjs +344 -0
  163. package/evals/harness/assemble.mjs +216 -0
  164. package/evals/harness/assemble.test.mjs +143 -0
  165. package/evals/harness/auth.mjs +91 -0
  166. package/evals/harness/check-docs.mjs +157 -0
  167. package/evals/harness/declarations/icrc1.did.d.ts +95 -0
  168. package/evals/harness/declarations/icrc1.did.js +140 -0
  169. package/evals/harness/drive-auth.test.mjs +584 -0
  170. package/evals/harness/drive.test.mjs +509 -0
  171. package/evals/harness/fake-auth.ts +67 -0
  172. package/evals/harness/fake-ledger.ts +178 -0
  173. package/evals/harness/gate-plan.mjs +104 -0
  174. package/evals/harness/gate-plan.test.mjs +243 -0
  175. package/evals/harness/icrc1.did +88 -0
  176. package/evals/harness/judge.mjs +63 -0
  177. package/evals/harness/judge.test.mjs +81 -0
  178. package/evals/harness/leak-scan.mjs +1373 -0
  179. package/evals/harness/leak-scan.test.mjs +1300 -0
  180. package/evals/harness/probes/amounts.ts +14 -0
  181. package/evals/harness/probes/node-tool.probe.ts +48 -0
  182. package/evals/harness/probes/probe.mjs +149 -0
  183. package/evals/harness/probes/react-wallet.probe.ts +96 -0
  184. package/evals/harness/public/support/auth.ts +38 -0
  185. package/evals/harness/public/support/fake-replica.d.ts +28 -0
  186. package/evals/harness/public/support/fake-replica.js +434 -0
  187. package/evals/harness/public/support/ledger.idl.d.ts +95 -0
  188. package/evals/harness/public/support/ledger.idl.js +140 -0
  189. package/evals/harness/public/support/world.ts +179 -0
  190. package/evals/harness/runs.mjs +139 -0
  191. package/evals/harness/sandbox.mjs +88 -0
  192. package/evals/harness/sandbox.test.mjs +134 -0
  193. package/evals/harness/ship.mjs +264 -0
  194. package/evals/harness/ship.test.mjs +552 -0
  195. package/evals/harness/world.ts +291 -0
  196. package/evals/package.json +26 -0
  197. package/evals/pnpm-lock.yaml +1537 -0
  198. package/evals/pnpm-workspace.yaml +12 -0
  199. package/evals/results/2026-09-30T14-22-05-924Z/pilot.json +384 -0
  200. package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.json +404 -0
  201. package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.rescored.json +404 -0
  202. package/evals/results/2026-09-30T14-22-05-924Z/plan.json +240 -0
  203. package/evals/results/2026-09-30T14-22-05-924Z/summary.json +1800 -0
  204. package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.json +1843 -0
  205. package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.rescored.json +2100 -0
  206. package/evals/results/2026-09-30T15-48-23-343Z/pilot.json +404 -0
  207. package/evals/results/2026-09-30T15-48-23-343Z/pilot.rescored.json +404 -0
  208. package/evals/results/2026-09-30T15-48-23-343Z/plan.json +242 -0
  209. package/evals/results/2026-09-30T15-48-23-343Z/summary.json +1843 -0
  210. package/evals/results/2026-09-30T15-48-23-343Z/summary.rescored.json +2195 -0
  211. package/evals/results/2026-10-03-beta1-gate/pilot.json +162 -0
  212. package/evals/results/2026-10-03-beta1-gate/plan.json +141 -0
  213. package/evals/results/2026-10-03-beta1-gate/summary.json +983 -0
  214. package/evals/results/2026-10-05-ga-gate/contaminated-run.json +55 -0
  215. package/evals/results/2026-10-05-ga-gate/pilot.json +162 -0
  216. package/evals/results/2026-10-05-ga-gate/plan.json +457 -0
  217. package/evals/results/2026-10-05-ga-gate/summary.json +1037 -0
  218. package/evals/results/2026-10-05-ga-gate/summary.rescanned.json +1037 -0
  219. package/evals/results/README.md +31 -0
  220. package/evals/runs-pilot.log +150 -0
  221. package/evals/runs-pilot2.log +150 -0
  222. package/evals/score.mjs +256 -0
  223. package/evals/setup.mjs +547 -0
  224. package/evals/tasks/node-tool/faulty/thin-accepts-exponent/meta.json +5 -0
  225. package/evals/tasks/node-tool/faulty/thin-accepts-exponent/src/index.ts +121 -0
  226. package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/meta.json +5 -0
  227. package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/src/index.ts +116 -0
  228. package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/meta.json +9 -0
  229. package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/src/index.ts +118 -0
  230. package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/meta.json +5 -0
  231. package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/src/index.ts +118 -0
  232. package/evals/tasks/node-tool/faulty/thin-ignores-root-key/meta.json +5 -0
  233. package/evals/tasks/node-tool/faulty/thin-ignores-root-key/src/index.ts +117 -0
  234. package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/meta.json +9 -0
  235. package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/src/index.ts +119 -0
  236. package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/meta.json +9 -0
  237. package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/src/index.ts +118 -0
  238. package/evals/tasks/node-tool/faulty/thin-number-amount/meta.json +10 -0
  239. package/evals/tasks/node-tool/faulty/thin-number-amount/src/index.ts +117 -0
  240. package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/meta.json +5 -0
  241. package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/src/index.ts +120 -0
  242. package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/meta.json +5 -0
  243. package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/src/index.ts +118 -0
  244. package/evals/tasks/node-tool/faulty/v3-retry-call-errors/meta.json +11 -0
  245. package/evals/tasks/node-tool/faulty/v3-retry-call-errors/src/index.ts +149 -0
  246. package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/meta.json +5 -0
  247. package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/src/index.ts +71 -0
  248. package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/meta.json +9 -0
  249. package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/src/index.ts +84 -0
  250. package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/meta.json +9 -0
  251. package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/src/index.ts +72 -0
  252. package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/meta.json +5 -0
  253. package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/src/index.ts +72 -0
  254. package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/meta.json +5 -0
  255. package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/src/index.ts +84 -0
  256. package/evals/tasks/node-tool/hidden/node-tool.test.ts +312 -0
  257. package/evals/tasks/node-tool/prompt.md +55 -0
  258. package/evals/tasks/node-tool/prompt.minimal.md +30 -0
  259. package/evals/tasks/node-tool/solutions/thin/reference/src/index.ts +118 -0
  260. package/evals/tasks/node-tool/solutions/thin/reference-module-scope/src/index.ts +145 -0
  261. package/evals/tasks/node-tool/solutions/thin-guide/reference/src/index.ts +118 -0
  262. package/evals/tasks/node-tool/solutions/thin-guide/reference-module-scope/src/index.ts +145 -0
  263. package/evals/tasks/node-tool/solutions/v3/reference/src/index.ts +140 -0
  264. package/evals/tasks/node-tool/solutions/v3/reference-module-scope/src/index.ts +153 -0
  265. package/evals/tasks/node-tool/solutions/v4/reference/src/index.ts +84 -0
  266. package/evals/tasks/node-tool/solutions/v4/reference-module-scope/src/index.ts +105 -0
  267. package/evals/tasks/node-tool/solutions/v4-proto/reference/src/index.ts +72 -0
  268. package/evals/tasks/node-tool/solutions/v4-proto/reference-module-scope/src/index.ts +87 -0
  269. package/evals/tasks/node-tool/starter/src/contract.ts +31 -0
  270. package/evals/tasks/node-tool/starter/src/index.ts +7 -0
  271. package/evals/tasks/node-tool/starter/test/smoke.test.ts +22 -0
  272. package/evals/tasks/node-tool/starter/tsconfig.json +17 -0
  273. package/evals/tasks/node-tool/task.json +63 -0
  274. package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/meta.json +5 -0
  275. package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/src/Wallet.tsx +216 -0
  276. package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/meta.json +5 -0
  277. package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/src/Wallet.tsx +212 -0
  278. package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/meta.json +5 -0
  279. package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/src/Wallet.tsx +210 -0
  280. package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/meta.json +8 -0
  281. package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/src/Wallet.tsx +213 -0
  282. package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/meta.json +9 -0
  283. package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/src/Wallet.tsx +213 -0
  284. package/evals/tasks/react-wallet/faulty/thin-number-balance/meta.json +5 -0
  285. package/evals/tasks/react-wallet/faulty/thin-number-balance/src/Wallet.tsx +213 -0
  286. package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/meta.json +5 -0
  287. package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/src/Wallet.tsx +254 -0
  288. package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/meta.json +5 -0
  289. package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/src/Wallet.tsx +215 -0
  290. package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/meta.json +5 -0
  291. package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/src/Wallet.tsx +214 -0
  292. package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/meta.json +5 -0
  293. package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/src/Wallet.tsx +224 -0
  294. package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/meta.json +12 -0
  295. package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/src/Wallet.tsx +225 -0
  296. package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/meta.json +11 -0
  297. package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/src/Wallet.tsx +182 -0
  298. package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/meta.json +5 -0
  299. package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/src/Wallet.tsx +160 -0
  300. package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/meta.json +5 -0
  301. package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/src/Wallet.tsx +166 -0
  302. package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/meta.json +5 -0
  303. package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/src/Wallet.tsx +161 -0
  304. package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/meta.json +5 -0
  305. package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/src/Wallet.tsx +163 -0
  306. package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/meta.json +12 -0
  307. package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/src/Wallet.tsx +162 -0
  308. package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/meta.json +5 -0
  309. package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/src/Wallet.tsx +163 -0
  310. package/evals/tasks/react-wallet/faulty/v4-retry-spread/meta.json +12 -0
  311. package/evals/tasks/react-wallet/faulty/v4-retry-spread/src/Wallet.tsx +163 -0
  312. package/evals/tasks/react-wallet/faulty/v4-status-not-idle/meta.json +5 -0
  313. package/evals/tasks/react-wallet/faulty/v4-status-not-idle/src/Wallet.tsx +162 -0
  314. package/evals/tasks/react-wallet/hidden/react-wallet.test.ts +536 -0
  315. package/evals/tasks/react-wallet/prompt.md +88 -0
  316. package/evals/tasks/react-wallet/prompt.minimal.md +51 -0
  317. package/evals/tasks/react-wallet/solutions/thin/reference/src/Wallet.tsx +213 -0
  318. package/evals/tasks/react-wallet/solutions/thin/reference-module-scope/src/Wallet.tsx +227 -0
  319. package/evals/tasks/react-wallet/solutions/thin-guide/reference/src/Wallet.tsx +213 -0
  320. package/evals/tasks/react-wallet/solutions/thin-guide/reference-module-scope/src/Wallet.tsx +227 -0
  321. package/evals/tasks/react-wallet/solutions/v3/reference/src/Wallet.tsx +224 -0
  322. package/evals/tasks/react-wallet/solutions/v3/reference-module-scope/src/Wallet.tsx +230 -0
  323. package/evals/tasks/react-wallet/solutions/v4/reference/src/Wallet.tsx +160 -0
  324. package/evals/tasks/react-wallet/solutions/v4/reference-module-scope/src/Wallet.tsx +178 -0
  325. package/evals/tasks/react-wallet/solutions/v4-proto/reference/src/Wallet.tsx +161 -0
  326. package/evals/tasks/react-wallet/solutions/v4-proto/reference-module-scope/src/Wallet.tsx +161 -0
  327. package/evals/tasks/react-wallet/starter/src/Wallet.tsx +12 -0
  328. package/evals/tasks/react-wallet/starter/src/auth.ts +16 -0
  329. package/evals/tasks/react-wallet/starter/src/config.ts +14 -0
  330. package/evals/tasks/react-wallet/starter/src/ii-auth.ts +43 -0
  331. package/evals/tasks/react-wallet/starter/src/main.tsx +15 -0
  332. package/evals/tasks/react-wallet/starter/test/smoke.test.ts +34 -0
  333. package/evals/tasks/react-wallet/starter/tsconfig.json +18 -0
  334. package/evals/tasks/react-wallet/task.json +84 -0
  335. package/examples/canister-studio/.stackblitzrc +4 -0
  336. package/examples/canister-studio/README.md +183 -0
  337. package/examples/canister-studio/did/ckbtc_minter.did +806 -0
  338. package/examples/canister-studio/did/icp_ledger.did +586 -0
  339. package/examples/canister-studio/did/icrc1.did +88 -0
  340. package/examples/canister-studio/package.json +45 -0
  341. package/examples/canister-studio/scripts/smoke.ts +188 -0
  342. package/examples/canister-studio/src/calls/CacheKeyPanel.tsx +104 -0
  343. package/examples/canister-studio/src/calls/ConfirmWrite.tsx +265 -0
  344. package/examples/canister-studio/src/calls/ErrorPanel.test.tsx +113 -0
  345. package/examples/canister-studio/src/calls/ErrorPanel.tsx +214 -0
  346. package/examples/canister-studio/src/calls/MethodRunner.test.tsx +354 -0
  347. package/examples/canister-studio/src/calls/MethodRunner.tsx +57 -0
  348. package/examples/canister-studio/src/calls/ReadRunner.tsx +244 -0
  349. package/examples/canister-studio/src/calls/ResendPanel.tsx +165 -0
  350. package/examples/canister-studio/src/calls/ShareLink.tsx +59 -0
  351. package/examples/canister-studio/src/calls/WriteRunner.test.tsx +678 -0
  352. package/examples/canister-studio/src/calls/WriteRunner.tsx +670 -0
  353. package/examples/canister-studio/src/calls/dedupe.ts +189 -0
  354. package/examples/canister-studio/src/calls/error-info.ts +168 -0
  355. package/examples/canister-studio/src/calls/history.test.ts +284 -0
  356. package/examples/canister-studio/src/calls/history.ts +287 -0
  357. package/examples/canister-studio/src/calls/kinds.ts +68 -0
  358. package/examples/canister-studio/src/calls/prepare.ts +32 -0
  359. package/examples/canister-studio/src/calls/query-options.ts +30 -0
  360. package/examples/canister-studio/src/calls/read.ts +47 -0
  361. package/examples/canister-studio/src/calls/readback.ts +100 -0
  362. package/examples/canister-studio/src/calls/record.ts +123 -0
  363. package/examples/canister-studio/src/calls/safe-calls.test.ts +299 -0
  364. package/examples/canister-studio/src/calls/share.ts +46 -0
  365. package/examples/canister-studio/src/calls/testing/doubles.tsx +108 -0
  366. package/examples/canister-studio/src/calls/testing/fixtures.ts +185 -0
  367. package/examples/canister-studio/src/calls/useCanisterHandle.ts +35 -0
  368. package/examples/canister-studio/src/canisters/ckbtc_minter.envelope.json +4228 -0
  369. package/examples/canister-studio/src/canisters/ckbtc_minter.ts +868 -0
  370. package/examples/canister-studio/src/canisters/icp_ledger.envelope.json +3454 -0
  371. package/examples/canister-studio/src/canisters/icp_ledger.ts +584 -0
  372. package/examples/canister-studio/src/canisters/icrc1.envelope.json +840 -0
  373. package/examples/canister-studio/src/canisters/icrc1.ts +78 -0
  374. package/examples/canister-studio/src/components/ActionButton.tsx +32 -0
  375. package/examples/canister-studio/src/components/AppHeader.tsx +83 -0
  376. package/examples/canister-studio/src/components/AppShell.tsx +29 -0
  377. package/examples/canister-studio/src/components/AuthButton.tsx +79 -0
  378. package/examples/canister-studio/src/components/Badge.tsx +79 -0
  379. package/examples/canister-studio/src/components/CanisterHeader.tsx +200 -0
  380. package/examples/canister-studio/src/components/CanisterJump.tsx +130 -0
  381. package/examples/canister-studio/src/components/Card.tsx +64 -0
  382. package/examples/canister-studio/src/components/Code.tsx +101 -0
  383. package/examples/canister-studio/src/components/CopyButton.tsx +126 -0
  384. package/examples/canister-studio/src/components/Disclosure.tsx +34 -0
  385. package/examples/canister-studio/src/components/EmptyState.tsx +34 -0
  386. package/examples/canister-studio/src/components/MethodList.test.tsx +137 -0
  387. package/examples/canister-studio/src/components/MethodList.tsx +244 -0
  388. package/examples/canister-studio/src/components/Notice.tsx +36 -0
  389. package/examples/canister-studio/src/components/ProvenanceBadge.tsx +44 -0
  390. package/examples/canister-studio/src/components/RouteError.tsx +42 -0
  391. package/examples/canister-studio/src/components/SectionBoundary.tsx +76 -0
  392. package/examples/canister-studio/src/components/Spinner.tsx +33 -0
  393. package/examples/canister-studio/src/components/Tabs.tsx +96 -0
  394. package/examples/canister-studio/src/components/canister/CanisterLoadFailure.test.tsx +56 -0
  395. package/examples/canister-studio/src/components/canister/CanisterLoadFailure.tsx +165 -0
  396. package/examples/canister-studio/src/components/canister/CanisterNotFound.tsx +59 -0
  397. package/examples/canister-studio/src/components/canister/CanisterPending.tsx +33 -0
  398. package/examples/canister-studio/src/components/canister/MethodOverview.tsx +93 -0
  399. package/examples/canister-studio/src/components/canister/MethodWorkspace.test.tsx +201 -0
  400. package/examples/canister-studio/src/components/canister/MethodWorkspace.tsx +187 -0
  401. package/examples/canister-studio/src/components/canister/shared-call.test.ts +186 -0
  402. package/examples/canister-studio/src/components/canister/shared-call.ts +133 -0
  403. package/examples/canister-studio/src/components/canister/shared-link-loader.test.ts +116 -0
  404. package/examples/canister-studio/src/components/canister/use-canister-page.ts +44 -0
  405. package/examples/canister-studio/src/components/canister/workspace-key.test.ts +27 -0
  406. package/examples/canister-studio/src/components/canister/workspace-key.ts +36 -0
  407. package/examples/canister-studio/src/components/canister-id-input.ts +69 -0
  408. package/examples/canister-studio/src/components/canister-names.ts +11 -0
  409. package/examples/canister-studio/src/components/download.ts +34 -0
  410. package/examples/canister-studio/src/components/fallbacks.tsx +33 -0
  411. package/examples/canister-studio/src/components/helpers.test.ts +107 -0
  412. package/examples/canister-studio/src/components/history/HistoryList.tsx +284 -0
  413. package/examples/canister-studio/src/components/home/FeaturedLedger.tsx +149 -0
  414. package/examples/canister-studio/src/components/home/OpenCanister.tsx +99 -0
  415. package/examples/canister-studio/src/components/home/featured.test.tsx +92 -0
  416. package/examples/canister-studio/src/components/home/featured.ts +64 -0
  417. package/examples/canister-studio/src/components/interface/CandidTab.tsx +38 -0
  418. package/examples/canister-studio/src/components/interface/CompatReport.tsx +92 -0
  419. package/examples/canister-studio/src/components/interface/CompatibilityTab.tsx +190 -0
  420. package/examples/canister-studio/src/components/interface/ProjectTab.tsx +196 -0
  421. package/examples/canister-studio/src/components/interface/TypeScriptTab.tsx +114 -0
  422. package/examples/canister-studio/src/components/interface/tools.test.tsx +169 -0
  423. package/examples/canister-studio/src/components/modes.ts +31 -0
  424. package/examples/canister-studio/src/components/playground/MethodPicker.tsx +67 -0
  425. package/examples/canister-studio/src/components/playground/PlaygroundForms.tsx +112 -0
  426. package/examples/canister-studio/src/components/playground/PlaygroundTools.tsx +219 -0
  427. package/examples/canister-studio/src/components/playground/sample.ts +43 -0
  428. package/examples/canister-studio/src/components/playground/target.test.tsx +86 -0
  429. package/examples/canister-studio/src/components/primitives.test.tsx +121 -0
  430. package/examples/canister-studio/src/components/provenance.ts +38 -0
  431. package/examples/canister-studio/src/components/route-render.test.tsx +71 -0
  432. package/examples/canister-studio/src/components/use-task.ts +56 -0
  433. package/examples/canister-studio/src/components/wallet/BalancePanel.tsx +110 -0
  434. package/examples/canister-studio/src/components/wallet/LedgerSummary.tsx +63 -0
  435. package/examples/canister-studio/src/components/wallet/MinterPanel.tsx +255 -0
  436. package/examples/canister-studio/src/components/wallet/SendPanel.test.tsx +297 -0
  437. package/examples/canister-studio/src/components/wallet/SendPanel.tsx +446 -0
  438. package/examples/canister-studio/src/components/wallet/ledgers.test.ts +36 -0
  439. package/examples/canister-studio/src/components/wallet/ledgers.ts +111 -0
  440. package/examples/canister-studio/src/forms/JsonPanel.tsx +157 -0
  441. package/examples/canister-studio/src/forms/MethodForm.test.tsx +369 -0
  442. package/examples/canister-studio/src/forms/MethodForm.tsx +368 -0
  443. package/examples/canister-studio/src/forms/TypedForm.tsx +55 -0
  444. package/examples/canister-studio/src/forms/context.ts +62 -0
  445. package/examples/canister-studio/src/forms/convert.ts +131 -0
  446. package/examples/canister-studio/src/forms/edge.test.ts +252 -0
  447. package/examples/canister-studio/src/forms/engine.test.ts +358 -0
  448. package/examples/canister-studio/src/forms/engine.ts +1492 -0
  449. package/examples/canister-studio/src/forms/fields/BytesField.tsx +210 -0
  450. package/examples/canister-studio/src/forms/fields/Field.tsx +106 -0
  451. package/examples/canister-studio/src/forms/fields/FieldShell.tsx +101 -0
  452. package/examples/canister-studio/src/forms/fields/Group.tsx +74 -0
  453. package/examples/canister-studio/src/forms/fields/ListField.tsx +256 -0
  454. package/examples/canister-studio/src/forms/fields/Segmented.tsx +78 -0
  455. package/examples/canister-studio/src/forms/fields/TimestampField.tsx +108 -0
  456. package/examples/canister-studio/src/forms/fields/UnitsField.tsx +119 -0
  457. package/examples/canister-studio/src/forms/fields/composites.tsx +389 -0
  458. package/examples/canister-studio/src/forms/fields/leaves.tsx +350 -0
  459. package/examples/canister-studio/src/forms/fields.test.tsx +396 -0
  460. package/examples/canister-studio/src/forms/helpers.test.ts +225 -0
  461. package/examples/canister-studio/src/forms/hints.ts +128 -0
  462. package/examples/canister-studio/src/forms/json.ts +119 -0
  463. package/examples/canister-studio/src/forms/parsing.test.ts +217 -0
  464. package/examples/canister-studio/src/forms/useMethodForm.ts +251 -0
  465. package/examples/canister-studio/src/interface/browser.test.ts +23 -0
  466. package/examples/canister-studio/src/interface/browser.ts +153 -0
  467. package/examples/canister-studio/src/interface/cache.ts +68 -0
  468. package/examples/canister-studio/src/interface/cli-cache.test.ts +155 -0
  469. package/examples/canister-studio/src/interface/cli-cache.ts +125 -0
  470. package/examples/canister-studio/src/interface/compile.server.test.ts +198 -0
  471. package/examples/canister-studio/src/interface/compile.server.ts +262 -0
  472. package/examples/canister-studio/src/interface/compile.test.ts +108 -0
  473. package/examples/canister-studio/src/interface/compile.ts +305 -0
  474. package/examples/canister-studio/src/interface/docs.test.ts +75 -0
  475. package/examples/canister-studio/src/interface/docs.ts +100 -0
  476. package/examples/canister-studio/src/interface/functions.test.ts +42 -0
  477. package/examples/canister-studio/src/interface/functions.ts +200 -0
  478. package/examples/canister-studio/src/interface/live-candid.server.ts +91 -0
  479. package/examples/canister-studio/src/interface/live-loader.test.ts +515 -0
  480. package/examples/canister-studio/src/interface/live-loader.ts +364 -0
  481. package/examples/canister-studio/src/interface/load.test.ts +328 -0
  482. package/examples/canister-studio/src/interface/load.ts +249 -0
  483. package/examples/canister-studio/src/interface/read-candid.test.ts +185 -0
  484. package/examples/canister-studio/src/interface/read-candid.ts +233 -0
  485. package/examples/canister-studio/src/interface/server-result.ts +42 -0
  486. package/examples/canister-studio/src/interface/typed.ts +68 -0
  487. package/examples/canister-studio/src/interface/types.ts +121 -0
  488. package/examples/canister-studio/src/lib/format.test.ts +107 -0
  489. package/examples/canister-studio/src/lib/format.ts +139 -0
  490. package/examples/canister-studio/src/lib/hex.test.ts +43 -0
  491. package/examples/canister-studio/src/lib/hex.ts +33 -0
  492. package/examples/canister-studio/src/lib/ids.test.ts +70 -0
  493. package/examples/canister-studio/src/lib/ids.ts +93 -0
  494. package/examples/canister-studio/src/lib/reactor.test.ts +55 -0
  495. package/examples/canister-studio/src/lib/reactor.ts +55 -0
  496. package/examples/canister-studio/src/lib/registry.test.ts +74 -0
  497. package/examples/canister-studio/src/lib/registry.ts +238 -0
  498. package/examples/canister-studio/src/lib/schema.ts +148 -0
  499. package/examples/canister-studio/src/routeTree.gen.ts +227 -0
  500. package/examples/canister-studio/src/router.test.ts +290 -0
  501. package/examples/canister-studio/src/router.tsx +127 -0
  502. package/examples/canister-studio/src/routes/__root.tsx +58 -0
  503. package/examples/canister-studio/src/routes/canister.$canisterId.index.tsx +172 -0
  504. package/examples/canister-studio/src/routes/canister.$canisterId.interface.tsx +98 -0
  505. package/examples/canister-studio/src/routes/canister.$canisterId.tsx +91 -0
  506. package/examples/canister-studio/src/routes/history.tsx +55 -0
  507. package/examples/canister-studio/src/routes/index.tsx +169 -0
  508. package/examples/canister-studio/src/routes/playground.tsx +286 -0
  509. package/examples/canister-studio/src/routes/safety.tsx +57 -0
  510. package/examples/canister-studio/src/routes/wallet.tsx +213 -0
  511. package/examples/canister-studio/src/safety/LabTransferForm.tsx +84 -0
  512. package/examples/canister-studio/src/safety/RequestLog.tsx +79 -0
  513. package/examples/canister-studio/src/safety/SafetyLab.test.tsx +89 -0
  514. package/examples/canister-studio/src/safety/SafetyLab.tsx +140 -0
  515. package/examples/canister-studio/src/safety/ScenarioCard.tsx +262 -0
  516. package/examples/canister-studio/src/safety/lab-run.ts +283 -0
  517. package/examples/canister-studio/src/safety/mock-ledger.test.ts +99 -0
  518. package/examples/canister-studio/src/safety/mock-ledger.ts +263 -0
  519. package/examples/canister-studio/src/safety/scenarios.test.ts +157 -0
  520. package/examples/canister-studio/src/safety/scenarios.ts +924 -0
  521. package/examples/canister-studio/src/styles.css +3453 -0
  522. package/examples/canister-studio/src/styles.test.ts +46 -0
  523. package/examples/canister-studio/src/values/CallPreview.test.tsx +86 -0
  524. package/examples/canister-studio/src/values/CallPreview.tsx +148 -0
  525. package/examples/canister-studio/src/values/ErrValueView.tsx +66 -0
  526. package/examples/canister-studio/src/values/Inspector.tsx +133 -0
  527. package/examples/canister-studio/src/values/ReplyView.test.tsx +341 -0
  528. package/examples/canister-studio/src/values/ReplyView.tsx +164 -0
  529. package/examples/canister-studio/src/values/candid-text.test.ts +516 -0
  530. package/examples/canister-studio/src/values/candid-text.ts +479 -0
  531. package/examples/canister-studio/src/values/hints.ts +58 -0
  532. package/examples/canister-studio/src/values/json.test.ts +66 -0
  533. package/examples/canister-studio/src/values/json.ts +31 -0
  534. package/examples/canister-studio/src/values/leaves.tsx +309 -0
  535. package/examples/canister-studio/src/values/schema.test.ts +123 -0
  536. package/examples/canister-studio/src/values/schema.ts +78 -0
  537. package/examples/canister-studio/src/values/test-router.tsx +21 -0
  538. package/examples/canister-studio/src/values/tree.tsx +670 -0
  539. package/examples/canister-studio/src/values/use-sha256.ts +29 -0
  540. package/examples/canister-studio/tsconfig.json +20 -0
  541. package/examples/canister-studio/vite.config.ts +50 -0
  542. package/examples/canister-studio/vitest.config.ts +20 -0
  543. package/examples/icrc-ledger/.stackblitzrc +4 -0
  544. package/examples/icrc-ledger/README.md +100 -0
  545. package/examples/icrc-ledger/ckbtc_minter.did +12 -0
  546. package/examples/icrc-ledger/icp_ledger.did +147 -0
  547. package/examples/icrc-ledger/icrc1.did +88 -0
  548. package/examples/icrc-ledger/index.html +13 -0
  549. package/examples/icrc-ledger/package.json +40 -0
  550. package/examples/icrc-ledger/scripts/smoke.ts +151 -0
  551. package/examples/icrc-ledger/src/App.tsx +71 -0
  552. package/examples/icrc-ledger/src/ErrorPanel.tsx +105 -0
  553. package/examples/icrc-ledger/src/MainnetTab.tsx +450 -0
  554. package/examples/icrc-ledger/src/SandboxTab.test.tsx +379 -0
  555. package/examples/icrc-ledger/src/SandboxTab.tsx +761 -0
  556. package/examples/icrc-ledger/src/blocks.test.ts +247 -0
  557. package/examples/icrc-ledger/src/blocks.ts +140 -0
  558. package/examples/icrc-ledger/src/canisters/ckbtc_minter.envelope.json +96 -0
  559. package/examples/icrc-ledger/src/canisters/ckbtc_minter.ts +16 -0
  560. package/examples/icrc-ledger/src/canisters/icp_ledger.envelope.json +690 -0
  561. package/examples/icrc-ledger/src/canisters/icp_ledger.ts +223 -0
  562. package/examples/icrc-ledger/src/canisters/icrc1.envelope.json +840 -0
  563. package/examples/icrc-ledger/src/canisters/icrc1.ts +78 -0
  564. package/examples/icrc-ledger/src/format.test.ts +41 -0
  565. package/examples/icrc-ledger/src/format.ts +68 -0
  566. package/examples/icrc-ledger/src/ledger.ts +15 -0
  567. package/examples/icrc-ledger/src/main.tsx +10 -0
  568. package/examples/icrc-ledger/src/minter.ts +16 -0
  569. package/examples/icrc-ledger/src/sandbox.test.ts +464 -0
  570. package/examples/icrc-ledger/src/sandbox.ts +281 -0
  571. package/examples/icrc-ledger/src/styles.css +391 -0
  572. package/examples/icrc-ledger/src/transfer-form.test.ts +62 -0
  573. package/examples/icrc-ledger/src/transfer-form.ts +97 -0
  574. package/examples/icrc-ledger/tsconfig.json +19 -0
  575. package/examples/icrc-ledger/vite.config.ts +44 -0
  576. package/examples/icrc-ledger/vitest.config.ts +12 -0
  577. package/examples/next-ssr/.stackblitzrc +4 -0
  578. package/examples/next-ssr/README.md +112 -0
  579. package/examples/next-ssr/icrc1.did +88 -0
  580. package/examples/next-ssr/next.config.ts +10 -0
  581. package/examples/next-ssr/package.json +41 -0
  582. package/examples/next-ssr/scripts/smoke.ts +169 -0
  583. package/examples/next-ssr/src/app/account/CertifiedBalances.tsx +58 -0
  584. package/examples/next-ssr/src/app/account/account.test.tsx +165 -0
  585. package/examples/next-ssr/src/app/account/page.tsx +82 -0
  586. package/examples/next-ssr/src/app/api/balance/[ledger]/[principal]/route.ts +10 -0
  587. package/examples/next-ssr/src/app/globals.css +278 -0
  588. package/examples/next-ssr/src/app/layout.tsx +34 -0
  589. package/examples/next-ssr/src/app/page.tsx +46 -0
  590. package/examples/next-ssr/src/app/providers.browser.test.tsx +127 -0
  591. package/examples/next-ssr/src/app/providers.test.tsx +73 -0
  592. package/examples/next-ssr/src/app/providers.tsx +60 -0
  593. package/examples/next-ssr/src/canisters/icrc1.envelope.json +840 -0
  594. package/examples/next-ssr/src/canisters/icrc1.ts +78 -0
  595. package/examples/next-ssr/src/components/BalanceTable.tsx +43 -0
  596. package/examples/next-ssr/src/components/LedgerCard.test.tsx +96 -0
  597. package/examples/next-ssr/src/components/LedgerCard.tsx +230 -0
  598. package/examples/next-ssr/src/components/LedgerError.tsx +32 -0
  599. package/examples/next-ssr/src/components/LedgerSections.tsx +22 -0
  600. package/examples/next-ssr/src/components/MyBalances.test.tsx +253 -0
  601. package/examples/next-ssr/src/components/MyBalances.tsx +129 -0
  602. package/examples/next-ssr/src/components/SessionBadge.tsx +18 -0
  603. package/examples/next-ssr/src/components/hydration.test.tsx +259 -0
  604. package/examples/next-ssr/src/components/server-data.ts +10 -0
  605. package/examples/next-ssr/src/format.ts +46 -0
  606. package/examples/next-ssr/src/ledgers.ts +38 -0
  607. package/examples/next-ssr/src/server/balance-route.test.ts +151 -0
  608. package/examples/next-ssr/src/server/balance-route.ts +157 -0
  609. package/examples/next-ssr/src/server/error-summary.test.ts +34 -0
  610. package/examples/next-ssr/src/server/error-summary.ts +37 -0
  611. package/examples/next-ssr/src/server/parse-owner.test.ts +39 -0
  612. package/examples/next-ssr/src/server/parse-owner.ts +34 -0
  613. package/examples/next-ssr/src/server/prefetch-ledgers.test.ts +137 -0
  614. package/examples/next-ssr/src/server/prefetch-ledgers.ts +70 -0
  615. package/examples/next-ssr/src/server/read-balances.test.ts +103 -0
  616. package/examples/next-ssr/src/server/read-balances.ts +78 -0
  617. package/examples/next-ssr/src/server/request-client.rsc.test.tsx +110 -0
  618. package/examples/next-ssr/src/server/request-client.ts +24 -0
  619. package/examples/next-ssr/src/testing/mock-ledgers.ts +115 -0
  620. package/examples/next-ssr/src/testing/react-server-dom-turbopack.d.ts +15 -0
  621. package/examples/next-ssr/src/testing/setup.ts +10 -0
  622. package/examples/next-ssr/tsconfig.json +31 -0
  623. package/examples/next-ssr/vitest.config.ts +59 -0
  624. package/examples/node-agent-tool/.stackblitzrc +4 -0
  625. package/examples/node-agent-tool/README.md +165 -0
  626. package/examples/node-agent-tool/icp.yaml +11 -0
  627. package/examples/node-agent-tool/icrc1.did +88 -0
  628. package/examples/node-agent-tool/package.json +32 -0
  629. package/examples/node-agent-tool/src/canisters/icrc1.envelope.json +840 -0
  630. package/examples/node-agent-tool/src/canisters/icrc1.ts +78 -0
  631. package/examples/node-agent-tool/src/cli.test.ts +64 -0
  632. package/examples/node-agent-tool/src/cli.ts +23 -0
  633. package/examples/node-agent-tool/src/command-line.ts +159 -0
  634. package/examples/node-agent-tool/src/commands/balance.ts +73 -0
  635. package/examples/node-agent-tool/src/commands/demo.test.ts +51 -0
  636. package/examples/node-agent-tool/src/commands/demo.ts +359 -0
  637. package/examples/node-agent-tool/src/commands/info.ts +69 -0
  638. package/examples/node-agent-tool/src/commands/reads.test.ts +133 -0
  639. package/examples/node-agent-tool/src/commands/resend.test.ts +363 -0
  640. package/examples/node-agent-tool/src/commands/transfer.test.ts +313 -0
  641. package/examples/node-agent-tool/src/commands/transfer.ts +415 -0
  642. package/examples/node-agent-tool/src/commands/watch.test.ts +159 -0
  643. package/examples/node-agent-tool/src/commands/watch.ts +135 -0
  644. package/examples/node-agent-tool/src/commands/whoami.ts +36 -0
  645. package/examples/node-agent-tool/src/context.ts +20 -0
  646. package/examples/node-agent-tool/src/dispatch.ts +70 -0
  647. package/examples/node-agent-tool/src/failure.test.ts +59 -0
  648. package/examples/node-agent-tool/src/failure.ts +176 -0
  649. package/examples/node-agent-tool/src/identity.test.ts +242 -0
  650. package/examples/node-agent-tool/src/identity.ts +228 -0
  651. package/examples/node-agent-tool/src/input.ts +110 -0
  652. package/examples/node-agent-tool/src/ledgers.test.ts +74 -0
  653. package/examples/node-agent-tool/src/ledgers.ts +62 -0
  654. package/examples/node-agent-tool/src/mock-ledger.ts +211 -0
  655. package/examples/node-agent-tool/src/network.test.ts +128 -0
  656. package/examples/node-agent-tool/src/network.ts +101 -0
  657. package/examples/node-agent-tool/src/output.test.ts +208 -0
  658. package/examples/node-agent-tool/src/output.ts +163 -0
  659. package/examples/node-agent-tool/src/run.ts +73 -0
  660. package/examples/node-agent-tool/src/test-kit.ts +167 -0
  661. package/examples/node-agent-tool/tsconfig.json +18 -0
  662. package/examples/node-agent-tool/vitest.config.ts +8 -0
  663. package/examples/vite-wallet/.stackblitzrc +4 -0
  664. package/examples/vite-wallet/Cargo.lock +646 -0
  665. package/examples/vite-wallet/Cargo.toml +5 -0
  666. package/examples/vite-wallet/README.md +107 -0
  667. package/examples/vite-wallet/backend/Cargo.toml +12 -0
  668. package/examples/vite-wallet/backend/backend.did +37 -0
  669. package/examples/vite-wallet/backend/src/lib.rs +133 -0
  670. package/examples/vite-wallet/icp.yaml +44 -0
  671. package/examples/vite-wallet/index.html +13 -0
  672. package/examples/vite-wallet/ledger.did +54 -0
  673. package/examples/vite-wallet/package.json +46 -0
  674. package/examples/vite-wallet/public/.ic-assets.json5 +26 -0
  675. package/examples/vite-wallet/scripts/faucet-args.test.ts +30 -0
  676. package/examples/vite-wallet/scripts/faucet-args.ts +41 -0
  677. package/examples/vite-wallet/scripts/faucet.ts +41 -0
  678. package/examples/vite-wallet/src/AddressBook.test.tsx +191 -0
  679. package/examples/vite-wallet/src/AddressBook.tsx +147 -0
  680. package/examples/vite-wallet/src/App.tsx +53 -0
  681. package/examples/vite-wallet/src/Balance.test.tsx +57 -0
  682. package/examples/vite-wallet/src/Balance.tsx +58 -0
  683. package/examples/vite-wallet/src/EnvironmentPanel.test.tsx +83 -0
  684. package/examples/vite-wallet/src/EnvironmentPanel.tsx +103 -0
  685. package/examples/vite-wallet/src/ErrorNote.tsx +70 -0
  686. package/examples/vite-wallet/src/Profile.test.tsx +145 -0
  687. package/examples/vite-wallet/src/Profile.tsx +92 -0
  688. package/examples/vite-wallet/src/SendIcp.test.tsx +231 -0
  689. package/examples/vite-wallet/src/SendIcp.tsx +244 -0
  690. package/examples/vite-wallet/src/SendToContact.test.tsx +113 -0
  691. package/examples/vite-wallet/src/SendToContact.tsx +102 -0
  692. package/examples/vite-wallet/src/SignIn.test.tsx +106 -0
  693. package/examples/vite-wallet/src/SignIn.tsx +120 -0
  694. package/examples/vite-wallet/src/Wallet.test.tsx +89 -0
  695. package/examples/vite-wallet/src/account-switch.test.tsx +108 -0
  696. package/examples/vite-wallet/src/auth/dev-accounts.test.ts +113 -0
  697. package/examples/vite-wallet/src/auth/dev-accounts.ts +216 -0
  698. package/examples/vite-wallet/src/auth/local-page.test.ts +28 -0
  699. package/examples/vite-wallet/src/auth/local-page.ts +20 -0
  700. package/examples/vite-wallet/src/auth/wallet-auth.test.ts +159 -0
  701. package/examples/vite-wallet/src/auth/wallet-auth.ts +131 -0
  702. package/examples/vite-wallet/src/canisters/backend.envelope.json +275 -0
  703. package/examples/vite-wallet/src/canisters/backend.ts +58 -0
  704. package/examples/vite-wallet/src/canisters/ledger.envelope.json +451 -0
  705. package/examples/vite-wallet/src/canisters/ledger.ts +56 -0
  706. package/examples/vite-wallet/src/client.ts +45 -0
  707. package/examples/vite-wallet/src/main.tsx +18 -0
  708. package/examples/vite-wallet/src/optimistic-contacts.ts +113 -0
  709. package/examples/vite-wallet/src/refusal.ts +17 -0
  710. package/examples/vite-wallet/src/styles.css +282 -0
  711. package/examples/vite-wallet/src/test/test-wallet.tsx +322 -0
  712. package/examples/vite-wallet/src/token.ts +50 -0
  713. package/examples/vite-wallet/src/transfer.test.ts +178 -0
  714. package/examples/vite-wallet/src/transfer.ts +110 -0
  715. package/examples/vite-wallet/src/use-canisters.ts +49 -0
  716. package/examples/vite-wallet/tsconfig.json +19 -0
  717. package/examples/vite-wallet/vite.config.ts +47 -0
  718. package/examples/vite-wallet/vitest.config.ts +17 -0
  719. package/package.json +9 -4
  720. package/packages/core/.size-limit.js +47 -0
  721. package/packages/core/LICENSE +21 -0
  722. package/packages/core/README.md +84 -0
  723. package/packages/core/llms.txt +610 -0
  724. package/packages/core/package.json +89 -0
  725. package/packages/core/src/call.ts +961 -0
  726. package/packages/core/src/canister.ts +259 -0
  727. package/packages/core/src/client.ts +2061 -0
  728. package/packages/core/src/errors.ts +1079 -0
  729. package/packages/core/src/hydration.ts +239 -0
  730. package/packages/core/src/index.ts +23 -0
  731. package/packages/core/src/keys.ts +108 -0
  732. package/packages/core/src/management.ts +138 -0
  733. package/packages/core/src/network.ts +1020 -0
  734. package/packages/core/src/options.ts +1000 -0
  735. package/packages/core/src/runtime.ts +50 -0
  736. package/packages/core/src/testing/fake-replica.ts +1166 -0
  737. package/packages/core/src/testing/index.ts +16 -0
  738. package/packages/core/src/testing/test-auth.ts +340 -0
  739. package/packages/core/src/testing/test-client.ts +559 -0
  740. package/packages/core/src/types.ts +541 -0
  741. package/packages/core/src/units.ts +299 -0
  742. package/packages/core/src/version.ts +4 -0
  743. package/packages/core/tests/canister-helpers.ts +187 -0
  744. package/packages/core/tests/canister-id.test.ts +158 -0
  745. package/packages/core/tests/canister-unwrap.test.ts +94 -0
  746. package/packages/core/tests/canister.test-d.ts +406 -0
  747. package/packages/core/tests/canister.test.ts +1921 -0
  748. package/packages/core/tests/client-account-change.test.ts +131 -0
  749. package/packages/core/tests/client-agents.test.ts +402 -0
  750. package/packages/core/tests/client-auth-network.test.ts +719 -0
  751. package/packages/core/tests/client-disposed.test.ts +403 -0
  752. package/packages/core/tests/client-helpers.ts +136 -0
  753. package/packages/core/tests/client-hydration.test.ts +166 -0
  754. package/packages/core/tests/client-pinned.test.ts +626 -0
  755. package/packages/core/tests/client-session.test.ts +348 -0
  756. package/packages/core/tests/client.test-d.ts +181 -0
  757. package/packages/core/tests/client.test.ts +1162 -0
  758. package/packages/core/tests/encode.test.ts +171 -0
  759. package/packages/core/tests/env-canister-id.test.ts +666 -0
  760. package/packages/core/tests/env-cookie-copies.test.ts +182 -0
  761. package/packages/core/tests/error-guard.test.ts +222 -0
  762. package/packages/core/tests/errors.test-d.ts +280 -0
  763. package/packages/core/tests/errors.test.ts +1359 -0
  764. package/packages/core/tests/fixtures/README.md +28 -0
  765. package/packages/core/tests/fixtures/accounts.did +21 -0
  766. package/packages/core/tests/fixtures/accounts.envelope.json +367 -0
  767. package/packages/core/tests/fixtures/accounts.ts +26 -0
  768. package/packages/core/tests/fixtures/archive.did +31 -0
  769. package/packages/core/tests/fixtures/archive.envelope.json +259 -0
  770. package/packages/core/tests/fixtures/archive.ts +55 -0
  771. package/packages/core/tests/fixtures/icrc1.did +88 -0
  772. package/packages/core/tests/fixtures/icrc1.envelope.json +840 -0
  773. package/packages/core/tests/fixtures/icrc1.ts +78 -0
  774. package/packages/core/tests/fixtures/management.did +724 -0
  775. package/packages/core/tests/fixtures/management.envelope.json +4455 -0
  776. package/packages/core/tests/fixtures/management.ts +486 -0
  777. package/packages/core/tests/fixtures/shapes.did +33 -0
  778. package/packages/core/tests/fixtures/shapes.envelope.json +440 -0
  779. package/packages/core/tests/fixtures/shapes.ts +56 -0
  780. package/packages/core/tests/fixtures/skippable.did +15 -0
  781. package/packages/core/tests/fixtures/skippable.envelope.json +182 -0
  782. package/packages/core/tests/fixtures/skippable.ts +33 -0
  783. package/packages/core/tests/func.test.ts +154 -0
  784. package/packages/core/tests/identity-attributes.test.ts +214 -0
  785. package/packages/core/tests/keys.test.ts +289 -0
  786. package/packages/core/tests/management.test.ts +206 -0
  787. package/packages/core/tests/network-helpers.ts +121 -0
  788. package/packages/core/tests/network.test-d.ts +78 -0
  789. package/packages/core/tests/network.test.ts +1051 -0
  790. package/packages/core/tests/options.test.ts +1594 -0
  791. package/packages/core/tests/redirect-sign-in.test.ts +393 -0
  792. package/packages/core/tests/resend.test-d.ts +81 -0
  793. package/packages/core/tests/resend.test.ts +723 -0
  794. package/packages/core/tests/skip.test-d.ts +125 -0
  795. package/packages/core/tests/testing-entry.test.ts +73 -0
  796. package/packages/core/tests/testing-fake-replica.test.ts +1242 -0
  797. package/packages/core/tests/testing-test-auth.test-d.ts +84 -0
  798. package/packages/core/tests/testing-test-auth.test.ts +483 -0
  799. package/packages/core/tests/testing-test-client.test-d.ts +184 -0
  800. package/packages/core/tests/testing-test-client.test.ts +1272 -0
  801. package/packages/core/tests/time-realm.test.ts +63 -0
  802. package/packages/core/tests/time.test.ts +238 -0
  803. package/packages/core/tests/traps/README.md +39 -0
  804. package/packages/core/tests/traps/anonymous-write.test.ts +145 -0
  805. package/packages/core/tests/traps/classification-table.test.ts +256 -0
  806. package/packages/core/tests/traps/err-arm.test.ts +144 -0
  807. package/packages/core/tests/traps/fetch-spy.ts +39 -0
  808. package/packages/core/tests/traps/invalidation-after-write.test.ts +178 -0
  809. package/packages/core/tests/traps/ledger.ts +248 -0
  810. package/packages/core/tests/traps/root-key-off-local.test.ts +130 -0
  811. package/packages/core/tests/traps/stale-data-across-users.test.ts +173 -0
  812. package/packages/core/tests/traps/unresolved-name.test.ts +155 -0
  813. package/packages/core/tests/traps/update-as-query.test.ts +244 -0
  814. package/packages/core/tests/traps/update-not-resent.test.ts +126 -0
  815. package/packages/core/tests/traps/update-resent-when-never-delivered.test.ts +159 -0
  816. package/packages/core/tests/traps.test-d.ts +476 -0
  817. package/packages/core/tests/units.test-d.ts +118 -0
  818. package/packages/core/tests/units.test.ts +634 -0
  819. package/packages/core/tsconfig.json +19 -0
  820. package/packages/core/tsconfig.typecheck.json +16 -0
  821. package/packages/core/vitest.config.ts +13 -0
  822. package/packages/mcp/LICENSE +21 -0
  823. package/packages/mcp/README.md +189 -0
  824. package/packages/mcp/package.json +62 -0
  825. package/packages/mcp/src/candid/candid-text.test.ts +455 -0
  826. package/packages/mcp/src/candid/candid-text.ts +501 -0
  827. package/packages/mcp/src/candid/contract.test.ts +398 -0
  828. package/packages/mcp/src/candid/formats.ts +155 -0
  829. package/packages/mcp/src/candid/hex.ts +29 -0
  830. package/packages/mcp/src/candid/json-schema.test.ts +758 -0
  831. package/packages/mcp/src/candid/json-schema.ts +454 -0
  832. package/packages/mcp/src/candid/json.test.ts +1207 -0
  833. package/packages/mcp/src/candid/json.ts +1053 -0
  834. package/packages/mcp/src/candid/schema-walk.ts +189 -0
  835. package/packages/mcp/src/candid/type-text.test.ts +179 -0
  836. package/packages/mcp/src/candid/type-text.ts +238 -0
  837. package/packages/mcp/src/cli.ts +134 -0
  838. package/packages/mcp/src/identity.ts +188 -0
  839. package/packages/mcp/src/interface/cache.test.ts +48 -0
  840. package/packages/mcp/src/interface/cache.ts +68 -0
  841. package/packages/mcp/src/interface/cli-cache.test.ts +150 -0
  842. package/packages/mcp/src/interface/cli-cache.ts +122 -0
  843. package/packages/mcp/src/interface/compile-worker.test.ts +246 -0
  844. package/packages/mcp/src/interface/compile-worker.ts +290 -0
  845. package/packages/mcp/src/interface/compile.test.ts +155 -0
  846. package/packages/mcp/src/interface/compile.ts +281 -0
  847. package/packages/mcp/src/interface/docs.test.ts +105 -0
  848. package/packages/mcp/src/interface/docs.ts +86 -0
  849. package/packages/mcp/src/interface/fixtures/icrc1.did +88 -0
  850. package/packages/mcp/src/interface/hex.ts +8 -0
  851. package/packages/mcp/src/interface/ids.test.ts +71 -0
  852. package/packages/mcp/src/interface/ids.ts +87 -0
  853. package/packages/mcp/src/interface/loader.test.ts +804 -0
  854. package/packages/mcp/src/interface/loader.ts +519 -0
  855. package/packages/mcp/src/interface/read-candid.test.ts +300 -0
  856. package/packages/mcp/src/interface/read-candid.ts +259 -0
  857. package/packages/mcp/src/interface/types.ts +113 -0
  858. package/packages/mcp/src/network.ts +122 -0
  859. package/packages/mcp/src/options.ts +149 -0
  860. package/packages/mcp/src/server/approval.ts +159 -0
  861. package/packages/mcp/src/server/naming.ts +43 -0
  862. package/packages/mcp/src/server/results.ts +102 -0
  863. package/packages/mcp/src/server/server.ts +797 -0
  864. package/packages/mcp/src/server/tools.ts +116 -0
  865. package/packages/mcp/src/usage.ts +40 -0
  866. package/packages/mcp/tests/approval.test.ts +60 -0
  867. package/packages/mcp/tests/identity.test.ts +234 -0
  868. package/packages/mcp/tests/naming.test.ts +62 -0
  869. package/packages/mcp/tests/options.test.ts +140 -0
  870. package/packages/mcp/tests/server.test.ts +997 -0
  871. package/packages/mcp/tsconfig.json +19 -0
  872. package/packages/mcp/tsconfig.typecheck.json +10 -0
  873. package/packages/mcp/vitest.config.ts +10 -0
  874. package/packages/react/LICENSE +21 -0
  875. package/packages/react/README.md +328 -0
  876. package/packages/react/llms.txt +95 -0
  877. package/packages/react/package.json +95 -0
  878. package/packages/react/src/index.tsx +678 -0
  879. package/packages/react/tests/abandoned-render.test.tsx +816 -0
  880. package/packages/react/tests/auth.test.tsx +315 -0
  881. package/packages/react/tests/caller-keys.test.tsx +2334 -0
  882. package/packages/react/tests/client-time.test.ts +40 -0
  883. package/packages/react/tests/entry.test.ts +52 -0
  884. package/packages/react/tests/helpers.tsx +291 -0
  885. package/packages/react/tests/hydration.test.tsx +262 -0
  886. package/packages/react/tests/ownership.test.tsx +260 -0
  887. package/packages/react/tests/provider.server.test.tsx +169 -0
  888. package/packages/react/tests/query-client.test.tsx +107 -0
  889. package/packages/react/tests/strict-mode.test.tsx +288 -0
  890. package/packages/react/tests/suspense.test-d.tsx +357 -0
  891. package/packages/react/tests/two-query-cores.test.tsx +135 -0
  892. package/packages/react/tests/types.test-d.tsx +63 -0
  893. package/packages/react/tsconfig.json +23 -0
  894. package/packages/react/tsconfig.test.json +8 -0
  895. package/packages/react/tsconfig.typecheck.json +16 -0
  896. package/packages/react/vitest.config.ts +39 -0
  897. package/packages/vite-plugin/LICENSE +21 -0
  898. package/packages/vite-plugin/README.md +532 -0
  899. package/packages/vite-plugin/package.json +76 -0
  900. package/packages/vite-plugin/src/describe-value.test.ts +43 -0
  901. package/packages/vite-plugin/src/describe-value.ts +167 -0
  902. package/packages/vite-plugin/src/dev-environment.test.ts +747 -0
  903. package/packages/vite-plugin/src/dev-environment.ts +510 -0
  904. package/packages/vite-plugin/src/env.ts +431 -0
  905. package/packages/vite-plugin/src/fetch.ts +348 -0
  906. package/packages/vite-plugin/src/file-identity.ts +106 -0
  907. package/packages/vite-plugin/src/generate.ts +691 -0
  908. package/packages/vite-plugin/src/index.test.ts +1243 -0
  909. package/packages/vite-plugin/src/index.ts +2565 -0
  910. package/packages/vite-plugin/src/interface.ts +339 -0
  911. package/packages/vite-plugin/src/local-host.ts +34 -0
  912. package/packages/vite-plugin/src/options.ts +641 -0
  913. package/packages/vite-plugin/src/principal-text.test.ts +87 -0
  914. package/packages/vite-plugin/src/principal-text.ts +98 -0
  915. package/packages/vite-plugin/tests/close.test.ts +141 -0
  916. package/packages/vite-plugin/tests/environment-mode.test.ts +136 -0
  917. package/packages/vite-plugin/tests/fake-ic.ts +214 -0
  918. package/packages/vite-plugin/tests/fetch-sdk.test.ts +27 -0
  919. package/packages/vite-plugin/tests/fetch.test.ts +1196 -0
  920. package/packages/vite-plugin/tests/fixtures/fake-cli/bin.js +90 -0
  921. package/packages/vite-plugin/tests/fixtures/fake-cli/package.json +8 -0
  922. package/packages/vite-plugin/tests/fixtures/icrc1.did +88 -0
  923. package/packages/vite-plugin/tests/generation.test.ts +1036 -0
  924. package/packages/vite-plugin/tests/icp-command.test.ts +194 -0
  925. package/packages/vite-plugin/tests/icp-timeout.test.ts +83 -0
  926. package/packages/vite-plugin/tests/no-process-exit.test.ts +83 -0
  927. package/packages/vite-plugin/tests/on-generated.test.ts +323 -0
  928. package/packages/vite-plugin/tests/output-collision.test.ts +329 -0
  929. package/packages/vite-plugin/tests/package.test.ts +62 -0
  930. package/packages/vite-plugin/tests/project.test.ts +2993 -0
  931. package/packages/vite-plugin/tests/support.ts +339 -0
  932. package/packages/vite-plugin/tests/timeout.test.ts +107 -0
  933. package/packages/vite-plugin/tsconfig.json +23 -0
  934. package/packages/vite-plugin/tsconfig.typecheck.json +16 -0
  935. package/packages/vite-plugin/vitest.config.ts +9 -0
  936. package/pnpm-workspace.yaml +23 -0
  937. package/scripts/ai-context-files.js +72 -0
  938. package/scripts/assemble-docs-site.mjs +485 -0
  939. package/scripts/assemble-docs-site.test.mjs +568 -0
  940. package/scripts/build-examples.js +58 -0
  941. package/scripts/check-ai-context.js +963 -0
  942. package/scripts/check-ai-context.test.mjs +811 -0
  943. package/scripts/check-exports.mjs +767 -0
  944. package/scripts/check-exports.test.mjs +1136 -0
  945. package/scripts/check-snippets/ambient.d.ts +428 -0
  946. package/scripts/check-snippets/app/generated/backend.did +7 -0
  947. package/scripts/check-snippets/app/generated/backend.ts +15 -0
  948. package/scripts/check-snippets/app/generated/icrc1.did +88 -0
  949. package/scripts/check-snippets/app/generated/icrc1.ts +78 -0
  950. package/scripts/check-snippets/app/globals.ts +26 -0
  951. package/scripts/check-snippets/docs/guides/App.tsx +21 -0
  952. package/scripts/check-snippets/docs/guides/app/providers.tsx +23 -0
  953. package/scripts/check-snippets/docs/guides/auth-client.ts +47 -0
  954. package/scripts/check-snippets/docs/guides/canisters/backend.ts +3 -0
  955. package/scripts/check-snippets/docs/guides/canisters/icrc1.ts +3 -0
  956. package/scripts/check-snippets/docs/guides/components/LedgerCard.tsx +26 -0
  957. package/scripts/check-snippets/docs/guides/components/shell.tsx +11 -0
  958. package/scripts/check-snippets/docs/guides/components/sign-in-page.tsx +29 -0
  959. package/scripts/check-snippets/docs/guides/components/slow-section.tsx +5 -0
  960. package/scripts/check-snippets/docs/guides/generated/accounts.ts +95 -0
  961. package/scripts/check-snippets/docs/guides/generated/ckbtc_minter.ts +40 -0
  962. package/scripts/check-snippets/docs/guides/generated/icp_ledger.ts +267 -0
  963. package/scripts/check-snippets/docs/guides/ledger.ts +10 -0
  964. package/scripts/check-snippets/docs/guides/server/request-client.ts +8 -0
  965. package/scripts/check-snippets.mjs +993 -0
  966. package/scripts/check-snippets.test.mjs +338 -0
  967. package/scripts/check-stack.mjs +501 -0
  968. package/scripts/check-stack.test.mjs +800 -0
  969. package/scripts/clean-node-modules.js +67 -0
  970. package/scripts/example-projects.js +58 -0
  971. package/scripts/export-budget.mjs +145 -0
  972. package/scripts/faults.json +6749 -0
  973. package/scripts/lib/fault-workspace.mjs +210 -0
  974. package/scripts/lib/io.mjs +29 -0
  975. package/scripts/lib/io.test.mjs +38 -0
  976. package/scripts/lib/markdown-fences.mjs +56 -0
  977. package/scripts/lib/markdown-fences.test.mjs +84 -0
  978. package/scripts/lib/package-exports.mjs +54 -0
  979. package/scripts/lib/package-exports.test.mjs +66 -0
  980. package/scripts/lib/release-pr-steps.mjs +47 -0
  981. package/scripts/release-tag.mjs +95 -0
  982. package/scripts/release-tag.test.mjs +278 -0
  983. package/scripts/release-workflow.test.mjs +98 -0
  984. package/scripts/release.js +167 -0
  985. package/scripts/release.test.mjs +347 -0
  986. package/scripts/removed-v3-names.js +125 -0
  987. package/scripts/size-app/.size-limit.js +90 -0
  988. package/scripts/size-app/core.js +3 -0
  989. package/scripts/size-app/package.json +24 -0
  990. package/scripts/size-app/react.js +4 -0
  991. package/scripts/size-app.test.mjs +73 -0
  992. package/scripts/sync-ai-context-versions.js +102 -0
  993. package/scripts/sync-example-versions.js +151 -0
  994. package/scripts/test-examples-published.mjs +1585 -0
  995. package/scripts/test-examples-published.test.mjs +1586 -0
  996. package/scripts/traps/any-method-vars-not-a-list.json +5 -0
  997. package/scripts/traps/canister-method-unknown.json +5 -0
  998. package/scripts/traps/client-says-who-calls-once.json +5 -0
  999. package/scripts/traps/client-says-who-calls.json +5 -0
  1000. package/scripts/traps/err-only-on-canister-err.json +14 -0
  1001. package/scripts/traps/format-units-refuses-missing-value.json +5 -0
  1002. package/scripts/traps/format-units-refuses-number.json +5 -0
  1003. package/scripts/traps/format-units-unknown-option.json +5 -0
  1004. package/scripts/traps/guard-err-is-the-methods.json +5 -0
  1005. package/scripts/traps/guard-false-keeps-every-kind.json +5 -0
  1006. package/scripts/traps/internals-not-exported.json +9 -0
  1007. package/scripts/traps/network-refuses-unknown-name.json +5 -0
  1008. package/scripts/traps/never-err-has-no-type.json +5 -0
  1009. package/scripts/traps/options-method-unknown.json +5 -0
  1010. package/scripts/traps/options-vars-wrong-type.json +5 -0
  1011. package/scripts/traps/parse-units-refuses-number.json +5 -0
  1012. package/scripts/traps/parse-units-unknown-option.json +5 -0
  1013. package/scripts/traps/principal-is-not-plain-text.json +14 -0
  1014. package/scripts/traps/query-options-refuses-oneway.json +5 -0
  1015. package/scripts/traps/query-options-refuses-update.json +5 -0
  1016. package/scripts/traps/refuse-next-unknown-option.json +5 -0
  1017. package/scripts/traps/resend-key-reads-the-methods-arg.json +5 -0
  1018. package/scripts/traps/resend-states-its-dedupe-key.json +5 -0
  1019. package/scripts/traps/suspense-refuses-argument-skip.json +5 -0
  1020. package/scripts/traps/suspense-refuses-skippable-read.json +5 -0
  1021. package/scripts/traps/suspense-refuses-vars-skip-fits.json +5 -0
  1022. package/scripts/traps/test-handler-method-unknown.json +5 -0
  1023. package/scripts/traps/test-handler-nat-is-bigint.json +5 -0
  1024. package/scripts/traps/test-handler-takes-the-domain-value.json +5 -0
  1025. package/scripts/traps/vars-of-two-arguments-are-the-tuple.json +5 -0
  1026. package/scripts/typecheck-examples.js +122 -0
  1027. package/scripts/verify-faults.mjs +375 -0
  1028. package/scripts/verify-faults.test.mjs +402 -0
  1029. package/scripts/verify-package-artifacts.mjs +590 -0
  1030. package/scripts/verify-peer-floors.js +399 -0
  1031. package/scripts/verify-peer-floors.test.mjs +422 -0
  1032. package/scripts/verify-test-fails-rules.mjs +104 -0
  1033. package/scripts/verify-test-fails-rules.test.mjs +215 -0
  1034. package/scripts/verify-test-fails.js +371 -0
  1035. package/scripts/verify-traps.mjs +505 -0
  1036. package/scripts/verify-traps.test.mjs +521 -0
  1037. package/scripts/verify-typescript-floor.js +239 -0
  1038. package/skill-packages/ic-reactor/SKILL.md +103 -0
  1039. package/stack.json +8 -0
  1040. package/tsconfig.base.json +23 -0
  1041. package/tsconfig.json +8 -0
@@ -0,0 +1,3453 @@
1
+ /*
2
+ * Canister Studio design system
3
+ * =============================
4
+ *
5
+ * One stylesheet, linked from the root route. Light and dark follow the
6
+ * reader's `prefers-color-scheme` only: no theme class, so the server's HTML
7
+ * and the hydrated page always agree.
8
+ *
9
+ * Rules for feature areas
10
+ * - Use the tokens below (var(--…)); never hard-code a color, a font or a
11
+ * spacing value that a token covers.
12
+ * - Append your own styles at the END of this file, in one clearly delimited
13
+ * section per area, opened by a comment that reads `=== forms ===`,
14
+ * `=== values ===`, and so on. Prefix area classes (`.form-…`, `.reply-…`,
15
+ * `.call-…`) so they never collide with the shared vocabulary below.
16
+ *
17
+ * Tokens (:root)
18
+ * Color --color-bg, --color-bg-subtle, --color-surface, --color-surface-2,
19
+ * --color-surface-hover, --color-border, --color-border-strong,
20
+ * --color-text, --color-text-muted, --color-text-subtle,
21
+ * --color-accent (links, accents), --color-accent-solid (filled
22
+ * buttons), --color-accent-hover, --color-accent-soft,
23
+ * --color-on-accent, --color-focus, --color-code-bg,
24
+ * --color-danger-solid, --color-danger-hover, --color-overlay
25
+ * Tones --tone-<name>-text / -bg / -border for
26
+ * query, update, composite, oneway, ok, err, warn, info, certified
27
+ * Spacing --space-0, --space-px (1px), --space-0-5 (2px), --space-1 (4px),
28
+ * --space-1-5 (6px), --space-2 (8px), --space-2-5 (10px),
29
+ * --space-3 (12px), --space-4 (16px), --space-5 (20px),
30
+ * --space-6 (24px), --space-8 (32px), --space-10 (40px),
31
+ * --space-12 (48px), --space-16 (64px)
32
+ * Radius --radius-xs, -sm, -md, -lg, -xl, -full
33
+ * Shadow --shadow-xs, -sm, -md, -lg, --ring (focus ring box-shadow,
34
+ * outside the element), --ring-inset (inside it: for controls
35
+ * in a container that clips, such as a segmented control)
36
+ * Type --font-sans, --font-mono; --text-2xs … --text-4xl;
37
+ * --leading-tight, -snug, -normal; --weight-normal, -medium,
38
+ * -semibold, -bold
39
+ * Layout --header-height, --sidebar-width, --content-max, --gutter
40
+ * Motion --duration-fast, --duration-normal, --ease
41
+ * Layers --z-header, --z-overlay, --z-toast
42
+ *
43
+ * Layout
44
+ * .app, .skip-link, .app-header (sticky), .app-header-inner, .brand,
45
+ * .brand-mark, .brand-name, .app-nav, .app-nav-link(.active),
46
+ * .app-header-tools, .app-main, .app-footer
47
+ * .page, .page-header, .page-title, .page-subtitle, .page-actions
48
+ * .section, .section-header, .section-title, .lead
49
+ * .layout-sidebar > .sidebar + .content (sidebar + main grid; one column
50
+ * below 960px)
51
+ *
52
+ * Components
53
+ * Buttons .btn (+ .btn-primary, .btn-ghost, .btn-danger, .btn-sm,
54
+ * .btn-lg, .btn-icon); disabled via [disabled] or
55
+ * [aria-disabled="true"]
56
+ * Controls .input, .select, .textarea (+ .mono for principals, hex);
57
+ * invalid via [aria-invalid="true"]; .input-group (control +
58
+ * button side by side), .input-addon
59
+ * Field .field > .field-label + control + .field-hint +
60
+ * .field-error; .fieldset (+ legend)
61
+ * Switch input[type="checkbox"].switch or button[role="switch"].switch
62
+ * ([aria-checked]); .switch-label wraps a switch and its text
63
+ * Segmented .segmented > button[aria-pressed] (or [aria-checked])
64
+ * Card .card (+ .card-interactive, .card-inset) > .card-header,
65
+ * .card-title, .card-subtitle, .card-body, .card-footer
66
+ * Badge .badge (+ .badge-query, .badge-update, .badge-composite,
67
+ * .badge-oneway, .badge-ok, .badge-err, .badge-warn,
68
+ * .badge-info, .badge-certified, .badge-accent,
69
+ * .badge-network, .badge-dot (leading dot), .badge-lg)
70
+ * Tabs .tabs[role="tablist"] > .tab ([aria-selected="true"] or
71
+ * .active / [aria-current="page"] for links); .tab-panel
72
+ * Table .table-wrap > table.table (+ .table-compact); th.num/td.num
73
+ * (right-aligned, tabular figures)
74
+ * Code pre.code (block, scrolls), code.code-inline, .mono (any
75
+ * monospace text), .break-all (long principals/hex)
76
+ * Notice .notice (+ .notice-info, .notice-warn, .notice-danger,
77
+ * .notice-success) > .notice-title + text; role="status" or
78
+ * role="alert" in markup
79
+ * Key/value dl.kv > dt + dd (two columns, stacks on narrow screens);
80
+ * .kv-compact
81
+ * Disclosure details.disclosure > summary + .disclosure-body
82
+ * Misc .chip (constant value), .kbd, .spinner (+
83
+ * .spinner-sm), .skeleton, .empty-state (+ -code, -detail),
84
+ * .list-plain, .dot (+ tone modifiers via color)
85
+ *
86
+ * Helpers
87
+ * .stack (vertical flow; .stack-xs/-sm/-lg/-xl are stacks with another gap)
88
+ * .row (horizontal, wraps, centered; .row-sm is a row with a smaller gap;
89
+ * modifiers .row-between, .row-end, .row-nowrap)
90
+ * .grid (auto-fill columns, min width --grid-min, default 260px; .grid-2
91
+ * two fixed columns that collapse on narrow screens)
92
+ * .grow, .shrink-0, .muted, .subtle, .text-xs, .text-sm, .tabular,
93
+ * .nowrap, .truncate, .sr-only
94
+ *
95
+ * Focus: every interactive element gets a visible ring on :focus-visible.
96
+ */
97
+
98
+ /* ------------------------------------------------------------------------ */
99
+ /* Tokens */
100
+ /* ------------------------------------------------------------------------ */
101
+
102
+ :root {
103
+ color-scheme: light dark;
104
+
105
+ /* Neutrals and surfaces */
106
+ --color-bg: #f6f7f9;
107
+ --color-bg-subtle: #eef0f3;
108
+ --color-surface: #ffffff;
109
+ --color-surface-2: #f9fafb;
110
+ --color-surface-hover: #f1f3f6;
111
+ --color-border: #e2e5ea;
112
+ --color-border-strong: #c9ced7;
113
+ --color-text: #151920;
114
+ --color-text-muted: #545d6b;
115
+ /* At least 4.5:1 on every surface and tone background (AA, small text). */
116
+ --color-text-subtle: #646d7b;
117
+ --color-code-bg: #f4f6f8;
118
+ --color-overlay: rgb(15 18 24 / 0.45);
119
+
120
+ /* Accent */
121
+ --color-accent: #4338ca;
122
+ --color-accent-solid: #4f46e5;
123
+ --color-accent-hover: #4338ca;
124
+ --color-accent-soft: #eef0ff;
125
+ --color-on-accent: #ffffff;
126
+ --color-focus: #6366f1;
127
+ --color-danger-solid: #dc2626;
128
+ --color-danger-hover: #b91c1c;
129
+
130
+ /* Tones: method modes and outcomes */
131
+ --tone-query-text: #1d4ed8;
132
+ --tone-query-bg: #eff6ff;
133
+ --tone-query-border: #bfdbfe;
134
+ --tone-update-text: #b45309;
135
+ --tone-update-bg: #fffbeb;
136
+ --tone-update-border: #fde68a;
137
+ --tone-composite-text: #6d28d9;
138
+ --tone-composite-bg: #f5f3ff;
139
+ --tone-composite-border: #ddd6fe;
140
+ --tone-oneway-text: #be185d;
141
+ --tone-oneway-bg: #fdf2f8;
142
+ --tone-oneway-border: #fbcfe8;
143
+ --tone-ok-text: #15803d;
144
+ --tone-ok-bg: #f0fdf4;
145
+ --tone-ok-border: #bbf7d0;
146
+ --tone-err-text: #b91c1c;
147
+ --tone-err-bg: #fef2f2;
148
+ --tone-err-border: #fecaca;
149
+ --tone-warn-text: #c2410c;
150
+ --tone-warn-bg: #fff7ed;
151
+ --tone-warn-border: #fed7aa;
152
+ --tone-info-text: #0369a1;
153
+ --tone-info-bg: #f0f9ff;
154
+ --tone-info-border: #bae6fd;
155
+ --tone-certified-text: #047857;
156
+ --tone-certified-bg: #ecfdf5;
157
+ --tone-certified-border: #a7f3d0;
158
+
159
+ /* Spacing (4 px grid, with half steps for dense controls) */
160
+ --space-0: 0;
161
+ --space-px: 1px;
162
+ --space-0-5: 2px;
163
+ --space-1: 4px;
164
+ --space-1-5: 6px;
165
+ --space-2: 8px;
166
+ --space-2-5: 10px;
167
+ --space-3: 12px;
168
+ --space-4: 16px;
169
+ --space-5: 20px;
170
+ --space-6: 24px;
171
+ --space-8: 32px;
172
+ --space-10: 40px;
173
+ --space-12: 48px;
174
+ --space-16: 64px;
175
+
176
+ /* Radius */
177
+ --radius-xs: 4px;
178
+ --radius-sm: 6px;
179
+ --radius-md: 8px;
180
+ --radius-lg: 12px;
181
+ --radius-xl: 16px;
182
+ --radius-full: 9999px;
183
+
184
+ /* Shadows */
185
+ --shadow-xs: 0 1px 2px rgb(16 24 40 / 0.05);
186
+ --shadow-sm: 0 1px 3px rgb(16 24 40 / 0.08), 0 1px 2px rgb(16 24 40 / 0.04);
187
+ --shadow-md:
188
+ 0 4px 8px -2px rgb(16 24 40 / 0.08), 0 2px 4px -2px rgb(16 24 40 / 0.04);
189
+ --shadow-lg:
190
+ 0 12px 24px -6px rgb(16 24 40 / 0.12), 0 4px 8px -4px rgb(16 24 40 / 0.05);
191
+ /* Solid, at least 3:1 against what surrounds it in both themes (WCAG
192
+ 1.4.11): a surface-colored gap, then the focus color. */
193
+ --ring: 0 0 0 2px var(--color-surface), 0 0 0 4px var(--color-focus);
194
+ --ring-inset: inset 0 0 0 2px var(--color-focus);
195
+
196
+ /* Type */
197
+ --font-sans:
198
+ ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
199
+ "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji",
200
+ "Segoe UI Emoji";
201
+ --font-mono:
202
+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas,
203
+ "Liberation Mono", "Courier New", monospace;
204
+ --text-2xs: 0.6875rem; /* 11px */
205
+ --text-xs: 0.75rem; /* 12px */
206
+ --text-sm: 0.8125rem; /* 13px */
207
+ --text-base: 0.875rem; /* 14px: dense, console-like body text */
208
+ --text-md: 1rem; /* 16px */
209
+ --text-lg: 1.125rem; /* 18px */
210
+ --text-xl: 1.25rem; /* 20px */
211
+ --text-2xl: 1.5rem; /* 24px */
212
+ --text-3xl: 1.875rem; /* 30px */
213
+ --text-4xl: 2.25rem; /* 36px */
214
+ --leading-tight: 1.2;
215
+ --leading-snug: 1.35;
216
+ --leading-normal: 1.55;
217
+ --weight-normal: 400;
218
+ --weight-medium: 500;
219
+ --weight-semibold: 600;
220
+ --weight-bold: 700;
221
+
222
+ /* Layout */
223
+ --header-height: 56px;
224
+ --sidebar-width: 288px;
225
+ --content-max: 1240px;
226
+ --gutter: var(--space-6);
227
+
228
+ /* Motion */
229
+ --duration-fast: 120ms;
230
+ --duration-normal: 200ms;
231
+ --ease: cubic-bezier(0.2, 0, 0, 1);
232
+
233
+ /* Layers */
234
+ --z-header: 20;
235
+ --z-overlay: 40;
236
+ --z-toast: 50;
237
+ }
238
+
239
+ @media (prefers-color-scheme: dark) {
240
+ :root {
241
+ --color-bg: #0b0d11;
242
+ --color-bg-subtle: #11141a;
243
+ --color-surface: #13161c;
244
+ --color-surface-2: #181c23;
245
+ --color-surface-hover: #1d222b;
246
+ --color-border: #262b35;
247
+ --color-border-strong: #353c48;
248
+ --color-text: #e7e9ee;
249
+ --color-text-muted: #a0a8b6;
250
+ --color-text-subtle: #8a93a3;
251
+ --color-code-bg: #0f1217;
252
+ --color-overlay: rgb(0 0 0 / 0.6);
253
+
254
+ --color-accent: #a5b4fc;
255
+ /* White on it is 4.97:1 (AA); #6366f1 was 4.47:1. */
256
+ --color-accent-solid: #5b5ee9;
257
+ --color-accent-hover: #4f46e5;
258
+ --color-accent-soft: rgb(99 102 241 / 0.16);
259
+ --color-on-accent: #ffffff;
260
+ --color-focus: #818cf8;
261
+ --color-danger-solid: #dc2626;
262
+ --color-danger-hover: #ef4444;
263
+
264
+ --tone-query-text: #93c5fd;
265
+ --tone-query-bg: rgb(59 130 246 / 0.14);
266
+ --tone-query-border: rgb(59 130 246 / 0.36);
267
+ --tone-update-text: #fcd34d;
268
+ --tone-update-bg: rgb(245 158 11 / 0.13);
269
+ --tone-update-border: rgb(245 158 11 / 0.36);
270
+ --tone-composite-text: #c4b5fd;
271
+ --tone-composite-bg: rgb(139 92 246 / 0.16);
272
+ --tone-composite-border: rgb(139 92 246 / 0.4);
273
+ --tone-oneway-text: #f9a8d4;
274
+ --tone-oneway-bg: rgb(236 72 153 / 0.14);
275
+ --tone-oneway-border: rgb(236 72 153 / 0.36);
276
+ --tone-ok-text: #86efac;
277
+ --tone-ok-bg: rgb(34 197 94 / 0.13);
278
+ --tone-ok-border: rgb(34 197 94 / 0.36);
279
+ --tone-err-text: #fca5a5;
280
+ --tone-err-bg: rgb(239 68 68 / 0.14);
281
+ --tone-err-border: rgb(239 68 68 / 0.4);
282
+ --tone-warn-text: #fdba74;
283
+ --tone-warn-bg: rgb(249 115 22 / 0.13);
284
+ --tone-warn-border: rgb(249 115 22 / 0.36);
285
+ --tone-info-text: #7dd3fc;
286
+ --tone-info-bg: rgb(14 165 233 / 0.13);
287
+ --tone-info-border: rgb(14 165 233 / 0.36);
288
+ --tone-certified-text: #6ee7b7;
289
+ --tone-certified-bg: rgb(16 185 129 / 0.13);
290
+ --tone-certified-border: rgb(16 185 129 / 0.38);
291
+
292
+ --shadow-xs: 0 1px 2px rgb(0 0 0 / 0.4);
293
+ --shadow-sm: 0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px rgb(0 0 0 / 0.3);
294
+ --shadow-md:
295
+ 0 4px 10px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.3);
296
+ --shadow-lg:
297
+ 0 14px 28px -6px rgb(0 0 0 / 0.6), 0 4px 8px -4px rgb(0 0 0 / 0.35);
298
+ }
299
+ }
300
+
301
+ /* ------------------------------------------------------------------------ */
302
+ /* Base */
303
+ /* ------------------------------------------------------------------------ */
304
+
305
+ *,
306
+ *::before,
307
+ *::after {
308
+ box-sizing: border-box;
309
+ }
310
+
311
+ html {
312
+ -webkit-text-size-adjust: 100%;
313
+ text-size-adjust: 100%;
314
+ scroll-padding-top: calc(var(--header-height) + var(--space-4));
315
+ }
316
+
317
+ body {
318
+ margin: 0;
319
+ min-width: 320px;
320
+ background: var(--color-bg);
321
+ color: var(--color-text);
322
+ font-family: var(--font-sans);
323
+ font-size: var(--text-base);
324
+ line-height: var(--leading-normal);
325
+ -webkit-font-smoothing: antialiased;
326
+ -moz-osx-font-smoothing: grayscale;
327
+ text-rendering: optimizeLegibility;
328
+ }
329
+
330
+ h1,
331
+ h2,
332
+ h3,
333
+ h4,
334
+ h5,
335
+ h6 {
336
+ margin: 0;
337
+ color: var(--color-text);
338
+ font-weight: var(--weight-semibold);
339
+ line-height: var(--leading-tight);
340
+ letter-spacing: -0.01em;
341
+ }
342
+
343
+ h1 {
344
+ font-size: var(--text-2xl);
345
+ }
346
+ h2 {
347
+ font-size: var(--text-xl);
348
+ }
349
+ h3 {
350
+ font-size: var(--text-lg);
351
+ }
352
+ h4 {
353
+ font-size: var(--text-md);
354
+ }
355
+ h5,
356
+ h6 {
357
+ font-size: var(--text-base);
358
+ }
359
+
360
+ p {
361
+ margin: 0;
362
+ }
363
+
364
+ a {
365
+ color: var(--color-accent);
366
+ text-decoration: none;
367
+ text-underline-offset: 2px;
368
+ }
369
+
370
+ a:hover {
371
+ text-decoration: underline;
372
+ }
373
+
374
+ code,
375
+ kbd,
376
+ pre,
377
+ samp {
378
+ font-family: var(--font-mono);
379
+ font-size: 0.92em;
380
+ }
381
+
382
+ pre {
383
+ margin: 0;
384
+ }
385
+
386
+ hr {
387
+ height: 0;
388
+ margin: var(--space-6) 0;
389
+ border: 0;
390
+ border-top: 1px solid var(--color-border);
391
+ }
392
+
393
+ img,
394
+ svg,
395
+ video,
396
+ canvas {
397
+ vertical-align: middle;
398
+ }
399
+
400
+ img,
401
+ video {
402
+ max-width: 100%;
403
+ height: auto;
404
+ }
405
+
406
+ button,
407
+ input,
408
+ select,
409
+ textarea {
410
+ margin: 0;
411
+ font: inherit;
412
+ color: inherit;
413
+ letter-spacing: inherit;
414
+ }
415
+
416
+ button {
417
+ cursor: pointer;
418
+ }
419
+
420
+ table {
421
+ border-collapse: collapse;
422
+ }
423
+
424
+ fieldset {
425
+ min-width: 0;
426
+ margin: 0;
427
+ padding: 0;
428
+ border: 0;
429
+ }
430
+
431
+ legend {
432
+ padding: 0;
433
+ }
434
+
435
+ dl,
436
+ dd,
437
+ ul,
438
+ ol {
439
+ margin: 0;
440
+ }
441
+
442
+ ul,
443
+ ol {
444
+ padding-left: var(--space-5);
445
+ }
446
+
447
+ ::selection {
448
+ background: color-mix(in srgb, var(--color-focus) 30%, transparent);
449
+ }
450
+
451
+ :focus-visible {
452
+ outline: 2px solid var(--color-focus);
453
+ outline-offset: 2px;
454
+ }
455
+
456
+ :focus:not(:focus-visible) {
457
+ outline: none;
458
+ }
459
+
460
+ [hidden] {
461
+ display: none !important;
462
+ }
463
+
464
+ @media (prefers-reduced-motion: reduce) {
465
+ *,
466
+ *::before,
467
+ *::after {
468
+ animation-duration: 0.01ms !important;
469
+ animation-iteration-count: 1 !important;
470
+ transition-duration: 0.01ms !important;
471
+ scroll-behavior: auto !important;
472
+ }
473
+ }
474
+
475
+ /* ------------------------------------------------------------------------ */
476
+ /* Layout */
477
+ /* ------------------------------------------------------------------------ */
478
+
479
+ .app {
480
+ display: flex;
481
+ min-height: 100vh;
482
+ min-height: 100dvh;
483
+ flex-direction: column;
484
+ }
485
+
486
+ .skip-link {
487
+ position: absolute;
488
+ top: var(--space-2);
489
+ left: var(--space-2);
490
+ z-index: var(--z-toast);
491
+ padding: var(--space-2) var(--space-3);
492
+ border-radius: var(--radius-sm);
493
+ background: var(--color-accent-solid);
494
+ color: var(--color-on-accent);
495
+ font-weight: var(--weight-medium);
496
+ transform: translateY(-200%);
497
+ transition: transform var(--duration-fast) var(--ease);
498
+ }
499
+
500
+ .skip-link:focus {
501
+ transform: none;
502
+ text-decoration: none;
503
+ }
504
+
505
+ .app-header {
506
+ position: sticky;
507
+ top: 0;
508
+ z-index: var(--z-header);
509
+ border-bottom: 1px solid var(--color-border);
510
+ background: var(--color-surface);
511
+ background: color-mix(in srgb, var(--color-surface) 86%, transparent);
512
+ -webkit-backdrop-filter: saturate(1.4) blur(10px);
513
+ backdrop-filter: saturate(1.4) blur(10px);
514
+ }
515
+
516
+ .app-header-inner {
517
+ display: flex;
518
+ max-width: var(--content-max);
519
+ min-height: var(--header-height);
520
+ margin: 0 auto;
521
+ padding: 0 var(--gutter);
522
+ align-items: center;
523
+ gap: var(--space-6);
524
+ }
525
+
526
+ .brand {
527
+ display: inline-flex;
528
+ flex-shrink: 0;
529
+ align-items: center;
530
+ gap: var(--space-2);
531
+ color: var(--color-text);
532
+ font-size: var(--text-md);
533
+ font-weight: var(--weight-semibold);
534
+ letter-spacing: -0.015em;
535
+ }
536
+
537
+ .brand:hover {
538
+ text-decoration: none;
539
+ }
540
+
541
+ .brand-mark {
542
+ color: var(--color-accent-solid);
543
+ }
544
+
545
+ .app-nav {
546
+ display: flex;
547
+ min-width: 0;
548
+ align-items: center;
549
+ gap: var(--space-1);
550
+ overflow-x: auto;
551
+ scrollbar-width: none;
552
+ }
553
+
554
+ .app-nav::-webkit-scrollbar {
555
+ display: none;
556
+ }
557
+
558
+ .app-nav-link {
559
+ flex-shrink: 0;
560
+ padding: var(--space-1-5) var(--space-3);
561
+ border-radius: var(--radius-sm);
562
+ color: var(--color-text-muted);
563
+ font-weight: var(--weight-medium);
564
+ white-space: nowrap;
565
+ transition:
566
+ background-color var(--duration-fast) var(--ease),
567
+ color var(--duration-fast) var(--ease);
568
+ }
569
+
570
+ .app-nav-link:hover {
571
+ background: var(--color-surface-hover);
572
+ color: var(--color-text);
573
+ text-decoration: none;
574
+ }
575
+
576
+ .app-nav-link.active,
577
+ .app-nav-link[aria-current="page"] {
578
+ background: var(--color-accent-soft);
579
+ color: var(--color-accent);
580
+ }
581
+
582
+ .app-header-tools {
583
+ display: flex;
584
+ margin-left: auto;
585
+ align-items: center;
586
+ gap: var(--space-2);
587
+ }
588
+
589
+ .app-main {
590
+ width: 100%;
591
+ max-width: var(--content-max);
592
+ margin: 0 auto;
593
+ padding: var(--space-8) var(--gutter) var(--space-12);
594
+ flex: 1;
595
+ }
596
+
597
+ .app-main:focus {
598
+ outline: none;
599
+ }
600
+
601
+ .app-footer {
602
+ border-top: 1px solid var(--color-border);
603
+ padding: var(--space-6) var(--gutter);
604
+ font-size: var(--text-xs);
605
+ text-align: center;
606
+ }
607
+
608
+ .page {
609
+ display: flex;
610
+ flex-direction: column;
611
+ gap: var(--space-6);
612
+ }
613
+
614
+ .page-header {
615
+ display: flex;
616
+ flex-direction: column;
617
+ gap: var(--space-1-5);
618
+ }
619
+
620
+ .page-title {
621
+ font-size: var(--text-3xl);
622
+ font-weight: var(--weight-bold);
623
+ letter-spacing: -0.025em;
624
+ }
625
+
626
+ .page-subtitle {
627
+ max-width: 72ch;
628
+ color: var(--color-text-muted);
629
+ font-size: var(--text-md);
630
+ }
631
+
632
+ .page-actions {
633
+ display: flex;
634
+ flex-wrap: wrap;
635
+ gap: var(--space-2);
636
+ }
637
+
638
+ .section {
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: var(--space-4);
642
+ }
643
+
644
+ .section-header {
645
+ display: flex;
646
+ flex-wrap: wrap;
647
+ align-items: baseline;
648
+ justify-content: space-between;
649
+ gap: var(--space-2) var(--space-4);
650
+ }
651
+
652
+ .section-title {
653
+ font-size: var(--text-lg);
654
+ font-weight: var(--weight-semibold);
655
+ }
656
+
657
+ .lead {
658
+ max-width: 68ch;
659
+ color: var(--color-text-muted);
660
+ font-size: var(--text-lg);
661
+ line-height: var(--leading-snug);
662
+ }
663
+
664
+ .layout-sidebar {
665
+ display: grid;
666
+ grid-template-columns: var(--sidebar-width) minmax(0, 1fr);
667
+ align-items: start;
668
+ gap: var(--space-6);
669
+ }
670
+
671
+ .layout-sidebar > .sidebar {
672
+ position: sticky;
673
+ top: calc(var(--header-height) + var(--space-4));
674
+ max-height: calc(100vh - var(--header-height) - var(--space-8));
675
+ overflow-y: auto;
676
+ overscroll-behavior: contain;
677
+ }
678
+
679
+ .layout-sidebar > .content {
680
+ min-width: 0;
681
+ }
682
+
683
+ /* ------------------------------------------------------------------------ */
684
+ /* Buttons */
685
+ /* ------------------------------------------------------------------------ */
686
+
687
+ .btn {
688
+ display: inline-flex;
689
+ /* Never stretched by a column flex container (.stack, .card-body). */
690
+ width: fit-content;
691
+ min-height: 32px;
692
+ padding: 0 var(--space-3);
693
+ align-items: center;
694
+ justify-content: center;
695
+ gap: var(--space-1-5);
696
+ border: 1px solid var(--color-border-strong);
697
+ border-radius: var(--radius-sm);
698
+ background: var(--color-surface);
699
+ box-shadow: var(--shadow-xs);
700
+ color: var(--color-text);
701
+ font-size: var(--text-sm);
702
+ font-weight: var(--weight-medium);
703
+ line-height: 1;
704
+ white-space: nowrap;
705
+ text-decoration: none;
706
+ cursor: pointer;
707
+ user-select: none;
708
+ transition:
709
+ background-color var(--duration-fast) var(--ease),
710
+ border-color var(--duration-fast) var(--ease),
711
+ color var(--duration-fast) var(--ease),
712
+ box-shadow var(--duration-fast) var(--ease);
713
+ }
714
+
715
+ .btn:hover {
716
+ background: var(--color-surface-hover);
717
+ text-decoration: none;
718
+ }
719
+
720
+ .btn:active {
721
+ transform: translateY(0.5px);
722
+ }
723
+
724
+ .btn:focus-visible {
725
+ outline: none;
726
+ box-shadow: var(--ring);
727
+ border-color: var(--color-focus);
728
+ }
729
+
730
+ .btn:disabled,
731
+ .btn[aria-disabled="true"] {
732
+ opacity: 0.5;
733
+ cursor: not-allowed;
734
+ transform: none;
735
+ }
736
+
737
+ .btn-primary {
738
+ border-color: var(--color-accent-solid);
739
+ background: var(--color-accent-solid);
740
+ color: var(--color-on-accent);
741
+ }
742
+
743
+ .btn-primary:hover {
744
+ border-color: var(--color-accent-hover);
745
+ background: var(--color-accent-hover);
746
+ }
747
+
748
+ .btn-primary:disabled,
749
+ .btn-primary[aria-disabled="true"] {
750
+ border-color: var(--color-accent-solid);
751
+ background: var(--color-accent-solid);
752
+ }
753
+
754
+ .btn-ghost {
755
+ border-color: transparent;
756
+ background: transparent;
757
+ box-shadow: none;
758
+ color: var(--color-text-muted);
759
+ }
760
+
761
+ .btn-ghost:hover {
762
+ background: var(--color-surface-hover);
763
+ color: var(--color-text);
764
+ }
765
+
766
+ .btn-danger {
767
+ border-color: var(--color-danger-solid);
768
+ background: var(--color-danger-solid);
769
+ color: #ffffff;
770
+ }
771
+
772
+ .btn-danger:hover {
773
+ border-color: var(--color-danger-hover);
774
+ background: var(--color-danger-hover);
775
+ }
776
+
777
+ .btn-sm {
778
+ min-height: 26px;
779
+ padding: 0 var(--space-2);
780
+ border-radius: var(--radius-xs);
781
+ font-size: var(--text-xs);
782
+ }
783
+
784
+ .btn-lg {
785
+ min-height: 40px;
786
+ padding: 0 var(--space-5);
787
+ font-size: var(--text-base);
788
+ }
789
+
790
+ .btn-icon {
791
+ width: 32px;
792
+ padding: 0;
793
+ }
794
+
795
+ .btn-icon.btn-sm {
796
+ width: 26px;
797
+ }
798
+
799
+ /* ------------------------------------------------------------------------ */
800
+ /* Form controls */
801
+ /* ------------------------------------------------------------------------ */
802
+
803
+ .input,
804
+ .select,
805
+ .textarea {
806
+ display: block;
807
+ width: 100%;
808
+ min-height: 34px;
809
+ padding: var(--space-1-5) var(--space-2-5);
810
+ border: 1px solid var(--color-border-strong);
811
+ border-radius: var(--radius-sm);
812
+ background: var(--color-surface);
813
+ color: var(--color-text);
814
+ font-size: var(--text-base);
815
+ line-height: var(--leading-snug);
816
+ transition:
817
+ border-color var(--duration-fast) var(--ease),
818
+ box-shadow var(--duration-fast) var(--ease);
819
+ }
820
+
821
+ .input::placeholder,
822
+ .textarea::placeholder {
823
+ color: var(--color-text-subtle);
824
+ opacity: 1;
825
+ }
826
+
827
+ .input:hover,
828
+ .select:hover,
829
+ .textarea:hover {
830
+ border-color: var(--color-text-subtle);
831
+ }
832
+
833
+ .input:focus-visible,
834
+ .select:focus-visible,
835
+ .textarea:focus-visible {
836
+ outline: none;
837
+ border-color: var(--color-focus);
838
+ box-shadow: var(--ring);
839
+ }
840
+
841
+ .input[aria-invalid="true"],
842
+ .select[aria-invalid="true"],
843
+ .textarea[aria-invalid="true"] {
844
+ border-color: var(--tone-err-text);
845
+ }
846
+
847
+ .input[aria-invalid="true"]:focus-visible,
848
+ .select[aria-invalid="true"]:focus-visible,
849
+ .textarea[aria-invalid="true"]:focus-visible {
850
+ box-shadow:
851
+ 0 0 0 2px var(--color-surface),
852
+ 0 0 0 4px var(--tone-err-text);
853
+ }
854
+
855
+ .input:disabled,
856
+ .select:disabled,
857
+ .textarea:disabled,
858
+ .input[readonly],
859
+ .textarea[readonly] {
860
+ background: var(--color-surface-2);
861
+ color: var(--color-text-muted);
862
+ }
863
+
864
+ .input:disabled,
865
+ .select:disabled,
866
+ .textarea:disabled {
867
+ cursor: not-allowed;
868
+ }
869
+
870
+ .input.mono,
871
+ .textarea.mono {
872
+ font-family: var(--font-mono);
873
+ font-size: var(--text-sm);
874
+ }
875
+
876
+ .select {
877
+ padding-right: var(--space-8);
878
+ appearance: none;
879
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5 6 7.5 9 4.5' fill='none' stroke='%23858e9c' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
880
+ background-position: right 10px center;
881
+ background-repeat: no-repeat;
882
+ cursor: pointer;
883
+ }
884
+
885
+ .textarea {
886
+ min-height: 84px;
887
+ resize: vertical;
888
+ }
889
+
890
+ .input-group {
891
+ display: flex;
892
+ align-items: stretch;
893
+ }
894
+
895
+ .input-group > .input,
896
+ .input-group > .select {
897
+ min-width: 0;
898
+ flex: 1;
899
+ }
900
+
901
+ .input-group > :not(:first-child) {
902
+ margin-left: -1px;
903
+ border-top-left-radius: 0;
904
+ border-bottom-left-radius: 0;
905
+ }
906
+
907
+ .input-group > :not(:last-child) {
908
+ border-top-right-radius: 0;
909
+ border-bottom-right-radius: 0;
910
+ }
911
+
912
+ .input-group > .btn {
913
+ min-height: 34px;
914
+ box-shadow: none;
915
+ }
916
+
917
+ .input-group > :focus-visible {
918
+ position: relative;
919
+ z-index: 1;
920
+ }
921
+
922
+ .input-addon {
923
+ display: inline-flex;
924
+ padding: 0 var(--space-2);
925
+ align-items: center;
926
+ border: 1px solid var(--color-border-strong);
927
+ border-radius: var(--radius-sm);
928
+ background: var(--color-surface-2);
929
+ color: var(--color-text-muted);
930
+ font-size: var(--text-sm);
931
+ white-space: nowrap;
932
+ }
933
+
934
+ /* Field: label + control + hint + error */
935
+
936
+ .field {
937
+ display: flex;
938
+ min-width: 0;
939
+ flex-direction: column;
940
+ gap: var(--space-1);
941
+ }
942
+
943
+ .field-label {
944
+ display: inline-flex;
945
+ flex-wrap: wrap;
946
+ align-items: center;
947
+ gap: var(--space-1-5);
948
+ color: var(--color-text);
949
+ font-size: var(--text-sm);
950
+ font-weight: var(--weight-medium);
951
+ }
952
+
953
+ .field-hint {
954
+ color: var(--color-text-muted);
955
+ font-size: var(--text-xs);
956
+ }
957
+
958
+ .field-error {
959
+ display: flex;
960
+ align-items: flex-start;
961
+ gap: var(--space-1);
962
+ color: var(--tone-err-text);
963
+ font-size: var(--text-xs);
964
+ font-weight: var(--weight-medium);
965
+ }
966
+
967
+ .fieldset {
968
+ display: flex;
969
+ min-width: 0;
970
+ flex-direction: column;
971
+ gap: var(--space-3);
972
+ padding: var(--space-3) var(--space-4) var(--space-4);
973
+ border: 1px solid var(--color-border);
974
+ border-radius: var(--radius-md);
975
+ background: var(--color-surface-2);
976
+ }
977
+
978
+ .fieldset > legend {
979
+ padding: 0 var(--space-1-5);
980
+ color: var(--color-text-muted);
981
+ font-size: var(--text-xs);
982
+ font-weight: var(--weight-semibold);
983
+ letter-spacing: 0.02em;
984
+ }
985
+
986
+ /* Switch: <input type="checkbox" class="switch"> or <button role="switch"> */
987
+
988
+ .switch {
989
+ position: relative;
990
+ display: inline-block;
991
+ width: 34px;
992
+ height: 20px;
993
+ flex-shrink: 0;
994
+ margin: 0;
995
+ padding: 0;
996
+ border: 0;
997
+ border-radius: var(--radius-full);
998
+ background: var(--color-border-strong);
999
+ appearance: none;
1000
+ cursor: pointer;
1001
+ vertical-align: middle;
1002
+ transition: background-color var(--duration-fast) var(--ease);
1003
+ }
1004
+
1005
+ .switch::before {
1006
+ content: "";
1007
+ position: absolute;
1008
+ top: 2px;
1009
+ left: 2px;
1010
+ width: 16px;
1011
+ height: 16px;
1012
+ border-radius: var(--radius-full);
1013
+ background: #ffffff;
1014
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.25);
1015
+ transition: transform var(--duration-fast) var(--ease);
1016
+ }
1017
+
1018
+ .switch:checked,
1019
+ .switch[aria-checked="true"] {
1020
+ background: var(--color-accent-solid);
1021
+ }
1022
+
1023
+ .switch:checked::before,
1024
+ .switch[aria-checked="true"]::before {
1025
+ transform: translateX(14px);
1026
+ }
1027
+
1028
+ .switch:focus-visible {
1029
+ outline: none;
1030
+ box-shadow: var(--ring);
1031
+ }
1032
+
1033
+ .switch:disabled,
1034
+ .switch[aria-disabled="true"] {
1035
+ opacity: 0.5;
1036
+ cursor: not-allowed;
1037
+ }
1038
+
1039
+ .switch-label {
1040
+ display: inline-flex;
1041
+ align-items: center;
1042
+ gap: var(--space-2);
1043
+ font-size: var(--text-sm);
1044
+ cursor: pointer;
1045
+ }
1046
+
1047
+ /* Segmented control: a few exclusive options (variant arms, view modes) */
1048
+
1049
+ .segmented {
1050
+ display: inline-flex;
1051
+ max-width: 100%;
1052
+ padding: 2px;
1053
+ gap: 2px;
1054
+ border: 1px solid var(--color-border);
1055
+ border-radius: var(--radius-sm);
1056
+ background: var(--color-bg-subtle);
1057
+ overflow-x: auto;
1058
+ }
1059
+
1060
+ .segmented > button {
1061
+ min-height: 26px;
1062
+ padding: 0 var(--space-2-5);
1063
+ border: 0;
1064
+ border-radius: var(--radius-xs);
1065
+ background: transparent;
1066
+ color: var(--color-text-muted);
1067
+ font-size: var(--text-xs);
1068
+ font-weight: var(--weight-medium);
1069
+ white-space: nowrap;
1070
+ }
1071
+
1072
+ .segmented > button:hover {
1073
+ color: var(--color-text);
1074
+ }
1075
+
1076
+ .segmented > button[aria-pressed="true"],
1077
+ .segmented > button[aria-checked="true"] {
1078
+ background: var(--color-surface);
1079
+ box-shadow: var(--shadow-xs);
1080
+ color: var(--color-text);
1081
+ }
1082
+
1083
+ .segmented > button:disabled {
1084
+ opacity: 0.45;
1085
+ cursor: not-allowed;
1086
+ }
1087
+
1088
+ .segmented > button:focus-visible {
1089
+ outline: none;
1090
+ box-shadow: var(--ring-inset);
1091
+ }
1092
+
1093
+ /* ------------------------------------------------------------------------ */
1094
+ /* Card */
1095
+ /* ------------------------------------------------------------------------ */
1096
+
1097
+ .card {
1098
+ display: flex;
1099
+ min-width: 0;
1100
+ flex-direction: column;
1101
+ border: 1px solid var(--color-border);
1102
+ border-radius: var(--radius-lg);
1103
+ background: var(--color-surface);
1104
+ box-shadow: var(--shadow-xs);
1105
+ }
1106
+
1107
+ .card-header {
1108
+ display: flex;
1109
+ flex-wrap: wrap;
1110
+ align-items: center;
1111
+ justify-content: space-between;
1112
+ gap: var(--space-2) var(--space-3);
1113
+ padding: var(--space-3) var(--space-4);
1114
+ border-bottom: 1px solid var(--color-border);
1115
+ }
1116
+
1117
+ .card-title {
1118
+ font-size: var(--text-md);
1119
+ font-weight: var(--weight-semibold);
1120
+ }
1121
+
1122
+ .card-subtitle {
1123
+ color: var(--color-text-muted);
1124
+ font-size: var(--text-sm);
1125
+ }
1126
+
1127
+ .card-body {
1128
+ display: flex;
1129
+ min-width: 0;
1130
+ flex-direction: column;
1131
+ gap: var(--space-3);
1132
+ padding: var(--space-4);
1133
+ }
1134
+
1135
+ .card-footer {
1136
+ display: flex;
1137
+ flex-wrap: wrap;
1138
+ align-items: center;
1139
+ gap: var(--space-2);
1140
+ padding: var(--space-3) var(--space-4);
1141
+ border-top: 1px solid var(--color-border);
1142
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1143
+ background: var(--color-surface-2);
1144
+ }
1145
+
1146
+ .card-interactive {
1147
+ transition:
1148
+ border-color var(--duration-fast) var(--ease),
1149
+ box-shadow var(--duration-fast) var(--ease),
1150
+ transform var(--duration-fast) var(--ease);
1151
+ }
1152
+
1153
+ .card-interactive:hover {
1154
+ border-color: var(--color-border-strong);
1155
+ box-shadow: var(--shadow-md);
1156
+ }
1157
+
1158
+ a.card-interactive,
1159
+ a.card-interactive:hover {
1160
+ color: inherit;
1161
+ text-decoration: none;
1162
+ }
1163
+
1164
+ .card-inset {
1165
+ background: var(--color-surface-2);
1166
+ box-shadow: none;
1167
+ }
1168
+
1169
+ /* ------------------------------------------------------------------------ */
1170
+ /* Badge */
1171
+ /* ------------------------------------------------------------------------ */
1172
+
1173
+ .badge {
1174
+ display: inline-flex;
1175
+ width: fit-content;
1176
+ height: 20px;
1177
+ padding: 0 var(--space-2);
1178
+ flex-shrink: 0;
1179
+ align-items: center;
1180
+ gap: var(--space-1);
1181
+ border: 1px solid var(--color-border);
1182
+ border-radius: var(--radius-full);
1183
+ background: var(--color-bg-subtle);
1184
+ color: var(--color-text-muted);
1185
+ font-size: var(--text-2xs);
1186
+ font-weight: var(--weight-semibold);
1187
+ font-variant-numeric: tabular-nums;
1188
+ letter-spacing: 0.02em;
1189
+ line-height: 1;
1190
+ white-space: nowrap;
1191
+ }
1192
+
1193
+ .badge-lg {
1194
+ height: 24px;
1195
+ padding: 0 var(--space-2-5);
1196
+ font-size: var(--text-xs);
1197
+ }
1198
+
1199
+ .badge-dot::before {
1200
+ content: "";
1201
+ width: 6px;
1202
+ height: 6px;
1203
+ border-radius: var(--radius-full);
1204
+ background: currentColor;
1205
+ }
1206
+
1207
+ .badge-query {
1208
+ border-color: var(--tone-query-border);
1209
+ background: var(--tone-query-bg);
1210
+ color: var(--tone-query-text);
1211
+ }
1212
+
1213
+ .badge-update {
1214
+ border-color: var(--tone-update-border);
1215
+ background: var(--tone-update-bg);
1216
+ color: var(--tone-update-text);
1217
+ }
1218
+
1219
+ .badge-composite {
1220
+ border-color: var(--tone-composite-border);
1221
+ background: var(--tone-composite-bg);
1222
+ color: var(--tone-composite-text);
1223
+ }
1224
+
1225
+ .badge-oneway {
1226
+ border-color: var(--tone-oneway-border);
1227
+ background: var(--tone-oneway-bg);
1228
+ color: var(--tone-oneway-text);
1229
+ }
1230
+
1231
+ .badge-ok {
1232
+ border-color: var(--tone-ok-border);
1233
+ background: var(--tone-ok-bg);
1234
+ color: var(--tone-ok-text);
1235
+ }
1236
+
1237
+ .badge-err {
1238
+ border-color: var(--tone-err-border);
1239
+ background: var(--tone-err-bg);
1240
+ color: var(--tone-err-text);
1241
+ }
1242
+
1243
+ .badge-warn {
1244
+ border-color: var(--tone-warn-border);
1245
+ background: var(--tone-warn-bg);
1246
+ color: var(--tone-warn-text);
1247
+ }
1248
+
1249
+ .badge-info {
1250
+ border-color: var(--tone-info-border);
1251
+ background: var(--tone-info-bg);
1252
+ color: var(--tone-info-text);
1253
+ }
1254
+
1255
+ .badge-certified {
1256
+ border-color: var(--tone-certified-border);
1257
+ background: var(--tone-certified-bg);
1258
+ color: var(--tone-certified-text);
1259
+ }
1260
+
1261
+ .badge-accent {
1262
+ border-color: transparent;
1263
+ background: var(--color-accent-soft);
1264
+ color: var(--color-accent);
1265
+ }
1266
+
1267
+ .badge-network {
1268
+ border-color: var(--tone-ok-border);
1269
+ background: var(--tone-ok-bg);
1270
+ color: var(--tone-ok-text);
1271
+ }
1272
+
1273
+ .badge-network::before {
1274
+ content: "";
1275
+ width: 6px;
1276
+ height: 6px;
1277
+ border-radius: var(--radius-full);
1278
+ background: currentColor;
1279
+ box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 25%, transparent);
1280
+ }
1281
+
1282
+ /* ------------------------------------------------------------------------ */
1283
+ /* Tabs */
1284
+ /* ------------------------------------------------------------------------ */
1285
+
1286
+ .tabs {
1287
+ display: flex;
1288
+ gap: var(--space-1);
1289
+ border-bottom: 1px solid var(--color-border);
1290
+ overflow-x: auto;
1291
+ scrollbar-width: none;
1292
+ }
1293
+
1294
+ .tabs::-webkit-scrollbar {
1295
+ display: none;
1296
+ }
1297
+
1298
+ .tab {
1299
+ position: relative;
1300
+ display: inline-flex;
1301
+ flex-shrink: 0;
1302
+ align-items: center;
1303
+ gap: var(--space-1-5);
1304
+ margin-bottom: -1px;
1305
+ padding: var(--space-2) var(--space-3);
1306
+ border: 0;
1307
+ border-bottom: 2px solid transparent;
1308
+ background: transparent;
1309
+ color: var(--color-text-muted);
1310
+ font-size: var(--text-sm);
1311
+ font-weight: var(--weight-medium);
1312
+ white-space: nowrap;
1313
+ text-decoration: none;
1314
+ transition:
1315
+ color var(--duration-fast) var(--ease),
1316
+ border-color var(--duration-fast) var(--ease);
1317
+ }
1318
+
1319
+ .tab:hover {
1320
+ color: var(--color-text);
1321
+ text-decoration: none;
1322
+ }
1323
+
1324
+ .tab[aria-selected="true"],
1325
+ .tab.active,
1326
+ .tab[aria-current="page"] {
1327
+ border-bottom-color: var(--color-accent-solid);
1328
+ color: var(--color-text);
1329
+ }
1330
+
1331
+ .tab:focus-visible {
1332
+ outline: none;
1333
+ border-radius: var(--radius-xs) var(--radius-xs) 0 0;
1334
+ box-shadow: var(--ring-inset);
1335
+ }
1336
+
1337
+ .tab-panel {
1338
+ padding-top: var(--space-4);
1339
+ }
1340
+
1341
+ /* ------------------------------------------------------------------------ */
1342
+ /* Table */
1343
+ /* ------------------------------------------------------------------------ */
1344
+
1345
+ .table-wrap {
1346
+ max-width: 100%;
1347
+ border: 1px solid var(--color-border);
1348
+ border-radius: var(--radius-md);
1349
+ background: var(--color-surface);
1350
+ overflow-x: auto;
1351
+ }
1352
+
1353
+ .table {
1354
+ width: 100%;
1355
+ font-size: var(--text-sm);
1356
+ }
1357
+
1358
+ .table th,
1359
+ .table td {
1360
+ padding: var(--space-2) var(--space-3);
1361
+ border-bottom: 1px solid var(--color-border);
1362
+ text-align: left;
1363
+ vertical-align: top;
1364
+ }
1365
+
1366
+ .table th {
1367
+ background: var(--color-surface-2);
1368
+ color: var(--color-text-muted);
1369
+ font-size: var(--text-2xs);
1370
+ font-weight: var(--weight-semibold);
1371
+ letter-spacing: 0.04em;
1372
+ text-transform: uppercase;
1373
+ white-space: nowrap;
1374
+ }
1375
+
1376
+ .table tbody tr:last-child > td {
1377
+ border-bottom: 0;
1378
+ }
1379
+
1380
+ .table tbody tr:hover > td {
1381
+ background: var(--color-surface-2);
1382
+ }
1383
+
1384
+ .table .num,
1385
+ .table th.num,
1386
+ .table td.num {
1387
+ font-variant-numeric: tabular-nums;
1388
+ text-align: right;
1389
+ }
1390
+
1391
+ .table-compact th,
1392
+ .table-compact td {
1393
+ padding: var(--space-1) var(--space-2);
1394
+ }
1395
+
1396
+ /* ------------------------------------------------------------------------ */
1397
+ /* Code and monospace */
1398
+ /* ------------------------------------------------------------------------ */
1399
+
1400
+ .mono {
1401
+ font-family: var(--font-mono);
1402
+ font-size: 0.92em;
1403
+ font-variant-ligatures: none;
1404
+ }
1405
+
1406
+ .break-all {
1407
+ overflow-wrap: anywhere;
1408
+ word-break: break-all;
1409
+ }
1410
+
1411
+ pre.code,
1412
+ .code {
1413
+ display: block;
1414
+ max-width: 100%;
1415
+ margin: 0;
1416
+ padding: var(--space-3) var(--space-4);
1417
+ border: 1px solid var(--color-border);
1418
+ border-radius: var(--radius-md);
1419
+ background: var(--color-code-bg);
1420
+ color: var(--color-text);
1421
+ font-family: var(--font-mono);
1422
+ font-size: var(--text-sm);
1423
+ line-height: var(--leading-normal);
1424
+ tab-size: 2;
1425
+ white-space: pre;
1426
+ overflow: auto;
1427
+ }
1428
+
1429
+ .code-wrap {
1430
+ white-space: pre-wrap;
1431
+ overflow-wrap: anywhere;
1432
+ }
1433
+
1434
+ code.code-inline {
1435
+ padding: 0.1em 0.35em;
1436
+ border: 1px solid var(--color-border);
1437
+ border-radius: var(--radius-xs);
1438
+ background: var(--color-code-bg);
1439
+ font-size: 0.88em;
1440
+ }
1441
+
1442
+ /* ------------------------------------------------------------------------ */
1443
+ /* Notice */
1444
+ /* ------------------------------------------------------------------------ */
1445
+
1446
+ .notice {
1447
+ display: flex;
1448
+ min-width: 0;
1449
+ flex-direction: column;
1450
+ gap: var(--space-1);
1451
+ padding: var(--space-3) var(--space-4);
1452
+ border: 1px solid var(--color-border);
1453
+ border-left-width: 3px;
1454
+ border-radius: var(--radius-md);
1455
+ background: var(--color-surface-2);
1456
+ color: var(--color-text);
1457
+ font-size: var(--text-sm);
1458
+ }
1459
+
1460
+ .notice-title {
1461
+ font-size: var(--text-sm);
1462
+ font-weight: var(--weight-semibold);
1463
+ }
1464
+
1465
+ .notice-info {
1466
+ border-color: var(--tone-info-border);
1467
+ border-left-color: var(--tone-info-text);
1468
+ background: var(--tone-info-bg);
1469
+ }
1470
+
1471
+ .notice-info > .notice-title {
1472
+ color: var(--tone-info-text);
1473
+ }
1474
+
1475
+ .notice-warn {
1476
+ border-color: var(--tone-warn-border);
1477
+ border-left-color: var(--tone-warn-text);
1478
+ background: var(--tone-warn-bg);
1479
+ }
1480
+
1481
+ .notice-warn > .notice-title {
1482
+ color: var(--tone-warn-text);
1483
+ }
1484
+
1485
+ .notice-danger {
1486
+ border-color: var(--tone-err-border);
1487
+ border-left-color: var(--tone-err-text);
1488
+ background: var(--tone-err-bg);
1489
+ }
1490
+
1491
+ .notice-danger > .notice-title {
1492
+ color: var(--tone-err-text);
1493
+ }
1494
+
1495
+ .notice-success {
1496
+ border-color: var(--tone-ok-border);
1497
+ border-left-color: var(--tone-ok-text);
1498
+ background: var(--tone-ok-bg);
1499
+ }
1500
+
1501
+ .notice-success > .notice-title {
1502
+ color: var(--tone-ok-text);
1503
+ }
1504
+
1505
+ /* ------------------------------------------------------------------------ */
1506
+ /* Key/value list */
1507
+ /* ------------------------------------------------------------------------ */
1508
+
1509
+ .kv {
1510
+ display: grid;
1511
+ grid-template-columns: minmax(96px, max-content) minmax(0, 1fr);
1512
+ gap: var(--space-1-5) var(--space-4);
1513
+ font-size: var(--text-sm);
1514
+ }
1515
+
1516
+ .kv > dt {
1517
+ color: var(--color-text-muted);
1518
+ font-weight: var(--weight-medium);
1519
+ }
1520
+
1521
+ .kv > dd {
1522
+ min-width: 0;
1523
+ margin: 0;
1524
+ overflow-wrap: anywhere;
1525
+ }
1526
+
1527
+ .kv-compact {
1528
+ gap: var(--space-0-5) var(--space-3);
1529
+ font-size: var(--text-xs);
1530
+ }
1531
+
1532
+ /* ------------------------------------------------------------------------ */
1533
+ /* Disclosure */
1534
+ /* ------------------------------------------------------------------------ */
1535
+
1536
+ .disclosure {
1537
+ border: 1px solid var(--color-border);
1538
+ border-radius: var(--radius-md);
1539
+ background: var(--color-surface);
1540
+ }
1541
+
1542
+ .disclosure > summary {
1543
+ display: flex;
1544
+ align-items: center;
1545
+ gap: var(--space-2);
1546
+ padding: var(--space-2) var(--space-3);
1547
+ border-radius: var(--radius-md);
1548
+ color: var(--color-text);
1549
+ font-size: var(--text-sm);
1550
+ font-weight: var(--weight-medium);
1551
+ list-style: none;
1552
+ cursor: pointer;
1553
+ user-select: none;
1554
+ }
1555
+
1556
+ .disclosure > summary::-webkit-details-marker {
1557
+ display: none;
1558
+ }
1559
+
1560
+ .disclosure > summary::before {
1561
+ content: "";
1562
+ width: 6px;
1563
+ height: 6px;
1564
+ flex-shrink: 0;
1565
+ border-right: 1.5px solid currentColor;
1566
+ border-bottom: 1.5px solid currentColor;
1567
+ color: var(--color-text-subtle);
1568
+ transform: rotate(-45deg);
1569
+ transition: transform var(--duration-fast) var(--ease);
1570
+ }
1571
+
1572
+ .disclosure[open] > summary::before {
1573
+ transform: rotate(45deg);
1574
+ }
1575
+
1576
+ .disclosure > summary:hover {
1577
+ background: var(--color-surface-hover);
1578
+ }
1579
+
1580
+ .disclosure > summary:focus-visible {
1581
+ outline: none;
1582
+ box-shadow: var(--ring-inset);
1583
+ }
1584
+
1585
+ .disclosure-body {
1586
+ display: flex;
1587
+ flex-direction: column;
1588
+ gap: var(--space-3);
1589
+ padding: var(--space-3);
1590
+ border-top: 1px solid var(--color-border);
1591
+ }
1592
+
1593
+ /* ------------------------------------------------------------------------ */
1594
+ /* Misc */
1595
+ /* ------------------------------------------------------------------------ */
1596
+
1597
+ .chip {
1598
+ display: inline-flex;
1599
+ width: fit-content;
1600
+ height: 22px;
1601
+ padding: 0 var(--space-2);
1602
+ align-items: center;
1603
+ border: 1px dashed var(--color-border-strong);
1604
+ border-radius: var(--radius-xs);
1605
+ color: var(--color-text-muted);
1606
+ font-family: var(--font-mono);
1607
+ font-size: var(--text-xs);
1608
+ white-space: nowrap;
1609
+ }
1610
+
1611
+ .kbd {
1612
+ display: inline-flex;
1613
+ width: fit-content;
1614
+ min-width: 20px;
1615
+ height: 20px;
1616
+ padding: 0 var(--space-1);
1617
+ align-items: center;
1618
+ justify-content: center;
1619
+ border: 1px solid var(--color-border-strong);
1620
+ border-bottom-width: 2px;
1621
+ border-radius: var(--radius-xs);
1622
+ background: var(--color-surface-2);
1623
+ color: var(--color-text-muted);
1624
+ font-family: var(--font-mono);
1625
+ font-size: var(--text-2xs);
1626
+ }
1627
+
1628
+ .dot {
1629
+ display: inline-block;
1630
+ width: 8px;
1631
+ height: 8px;
1632
+ flex-shrink: 0;
1633
+ border-radius: var(--radius-full);
1634
+ background: currentColor;
1635
+ }
1636
+
1637
+ .list-plain {
1638
+ margin: 0;
1639
+ padding: 0;
1640
+ list-style: none;
1641
+ }
1642
+
1643
+ .spinner {
1644
+ display: inline-block;
1645
+ width: 18px;
1646
+ height: 18px;
1647
+ flex-shrink: 0;
1648
+ border: 2px solid var(--color-border-strong);
1649
+ border-top-color: var(--color-accent-solid);
1650
+ border-radius: var(--radius-full);
1651
+ animation: spin 0.7s linear infinite;
1652
+ }
1653
+
1654
+ .spinner-sm {
1655
+ width: 12px;
1656
+ height: 12px;
1657
+ border-width: 1.5px;
1658
+ }
1659
+
1660
+ @keyframes spin {
1661
+ to {
1662
+ transform: rotate(360deg);
1663
+ }
1664
+ }
1665
+
1666
+ .skeleton {
1667
+ display: block;
1668
+ min-height: 1em;
1669
+ border-radius: var(--radius-xs);
1670
+ background: linear-gradient(
1671
+ 90deg,
1672
+ var(--color-bg-subtle) 25%,
1673
+ var(--color-surface-hover) 50%,
1674
+ var(--color-bg-subtle) 75%
1675
+ );
1676
+ background-size: 200% 100%;
1677
+ animation: shimmer 1.4s ease-in-out infinite;
1678
+ }
1679
+
1680
+ @keyframes shimmer {
1681
+ from {
1682
+ background-position: 200% 0;
1683
+ }
1684
+ to {
1685
+ background-position: -200% 0;
1686
+ }
1687
+ }
1688
+
1689
+ .empty-state {
1690
+ display: flex;
1691
+ max-width: 560px;
1692
+ margin: var(--space-12) auto;
1693
+ padding: var(--space-8) var(--space-6);
1694
+ flex-direction: column;
1695
+ align-items: center;
1696
+ gap: var(--space-3);
1697
+ border: 1px dashed var(--color-border-strong);
1698
+ border-radius: var(--radius-lg);
1699
+ text-align: center;
1700
+ }
1701
+
1702
+ .empty-state-code {
1703
+ color: var(--color-text-subtle);
1704
+ font-size: var(--text-3xl);
1705
+ font-weight: var(--weight-bold);
1706
+ }
1707
+
1708
+ .empty-state-detail {
1709
+ width: 100%;
1710
+ max-height: 240px;
1711
+ text-align: left;
1712
+ white-space: pre-wrap;
1713
+ overflow-wrap: anywhere;
1714
+ }
1715
+
1716
+ /* ------------------------------------------------------------------------ */
1717
+ /* Helpers */
1718
+ /* ------------------------------------------------------------------------ */
1719
+
1720
+ /* Each gap variant is a complete stack or row on its own: `.stack-sm` needs
1721
+ no `.stack`. */
1722
+ .stack,
1723
+ .stack-xs,
1724
+ .stack-sm,
1725
+ .stack-lg,
1726
+ .stack-xl {
1727
+ display: flex;
1728
+ min-width: 0;
1729
+ flex-direction: column;
1730
+ gap: var(--space-3);
1731
+ }
1732
+
1733
+ .stack-xs {
1734
+ gap: var(--space-1);
1735
+ }
1736
+
1737
+ .stack-sm {
1738
+ gap: var(--space-2);
1739
+ }
1740
+
1741
+ .stack-lg {
1742
+ gap: var(--space-5);
1743
+ }
1744
+
1745
+ .stack-xl {
1746
+ gap: var(--space-8);
1747
+ }
1748
+
1749
+ .row,
1750
+ .row-sm {
1751
+ display: flex;
1752
+ min-width: 0;
1753
+ flex-wrap: wrap;
1754
+ align-items: center;
1755
+ gap: var(--space-2);
1756
+ }
1757
+
1758
+ .row-sm {
1759
+ gap: var(--space-1);
1760
+ }
1761
+
1762
+ .row-between {
1763
+ justify-content: space-between;
1764
+ }
1765
+
1766
+ .row-end {
1767
+ justify-content: flex-end;
1768
+ }
1769
+
1770
+ .row-nowrap {
1771
+ flex-wrap: nowrap;
1772
+ }
1773
+
1774
+ .grid {
1775
+ display: grid;
1776
+ grid-template-columns: repeat(
1777
+ auto-fill,
1778
+ minmax(min(var(--grid-min, 260px), 100%), 1fr)
1779
+ );
1780
+ gap: var(--space-4);
1781
+ }
1782
+
1783
+ .grid-2 {
1784
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1785
+ }
1786
+
1787
+ .grow {
1788
+ min-width: 0;
1789
+ flex: 1 1 auto;
1790
+ }
1791
+
1792
+ .shrink-0 {
1793
+ flex-shrink: 0;
1794
+ }
1795
+
1796
+ .muted {
1797
+ color: var(--color-text-muted);
1798
+ }
1799
+
1800
+ .subtle {
1801
+ color: var(--color-text-subtle);
1802
+ }
1803
+
1804
+ .text-xs {
1805
+ font-size: var(--text-xs);
1806
+ }
1807
+
1808
+ .text-sm {
1809
+ font-size: var(--text-sm);
1810
+ }
1811
+
1812
+ .tabular {
1813
+ font-variant-numeric: tabular-nums;
1814
+ }
1815
+
1816
+ .nowrap {
1817
+ white-space: nowrap;
1818
+ }
1819
+
1820
+ .truncate {
1821
+ min-width: 0;
1822
+ overflow: hidden;
1823
+ text-overflow: ellipsis;
1824
+ white-space: nowrap;
1825
+ }
1826
+
1827
+ .sr-only {
1828
+ position: absolute;
1829
+ width: 1px;
1830
+ height: 1px;
1831
+ margin: -1px;
1832
+ padding: 0;
1833
+ border: 0;
1834
+ clip: rect(0 0 0 0);
1835
+ clip-path: inset(50%);
1836
+ overflow: hidden;
1837
+ white-space: nowrap;
1838
+ }
1839
+
1840
+ /* ------------------------------------------------------------------------ */
1841
+ /* Responsive */
1842
+ /* ------------------------------------------------------------------------ */
1843
+
1844
+ @media (max-width: 960px) {
1845
+ .layout-sidebar {
1846
+ grid-template-columns: minmax(0, 1fr);
1847
+ }
1848
+
1849
+ .layout-sidebar > .sidebar {
1850
+ position: static;
1851
+ max-height: none;
1852
+ overflow: visible;
1853
+ }
1854
+ }
1855
+
1856
+ @media (max-width: 720px) {
1857
+ :root {
1858
+ --gutter: var(--space-4);
1859
+ }
1860
+
1861
+ /* The nav moves to its own scrolling row under the brand and tools. */
1862
+ .app-header-inner {
1863
+ flex-wrap: wrap;
1864
+ gap: 0 var(--space-3);
1865
+ padding-top: var(--space-2);
1866
+ }
1867
+
1868
+ .app-nav {
1869
+ order: 3;
1870
+ width: calc(100% + 2 * var(--gutter));
1871
+ margin: 0 calc(-1 * var(--gutter));
1872
+ padding: var(--space-1) var(--gutter) var(--space-2);
1873
+ }
1874
+
1875
+ .app-main {
1876
+ padding-top: var(--space-6);
1877
+ }
1878
+
1879
+ .page-title {
1880
+ font-size: var(--text-2xl);
1881
+ }
1882
+
1883
+ .grid-2 {
1884
+ grid-template-columns: minmax(0, 1fr);
1885
+ }
1886
+
1887
+ .kv {
1888
+ grid-template-columns: minmax(0, 1fr);
1889
+ gap: 0;
1890
+ }
1891
+
1892
+ .kv > dd {
1893
+ margin-bottom: var(--space-2);
1894
+ }
1895
+ }
1896
+
1897
+ @media (max-width: 400px) {
1898
+ :root {
1899
+ --gutter: var(--space-3);
1900
+ }
1901
+
1902
+ .brand-name {
1903
+ font-size: var(--text-base);
1904
+ }
1905
+
1906
+ .card-header,
1907
+ .card-body,
1908
+ .card-footer {
1909
+ padding-left: var(--space-3);
1910
+ padding-right: var(--space-3);
1911
+ }
1912
+ }
1913
+
1914
+ /* === calls === */
1915
+ /* The safe-call layer (src/calls): runners, the confirm step, errors,
1916
+ re-sends, read-backs and the live query key. */
1917
+
1918
+ .call-runner .card-body {
1919
+ gap: var(--space-4);
1920
+ }
1921
+
1922
+ .call-kind-note {
1923
+ margin: 0;
1924
+ }
1925
+
1926
+ .call-outcome:empty {
1927
+ display: none;
1928
+ }
1929
+
1930
+ /* The verdict of a failed call: the one line a reader must not miss. */
1931
+ .call-verdict {
1932
+ display: flex;
1933
+ flex-wrap: wrap;
1934
+ align-items: center;
1935
+ gap: var(--space-2);
1936
+ }
1937
+
1938
+ .call-verdict .badge {
1939
+ letter-spacing: 0.02em;
1940
+ }
1941
+
1942
+ .call-verdict[data-verdict="may_have_executed"] .badge {
1943
+ font-weight: var(--weight-bold);
1944
+ }
1945
+
1946
+ .call-verdict-advice {
1947
+ font-weight: var(--weight-medium);
1948
+ }
1949
+
1950
+ .call-error .kv {
1951
+ margin: var(--space-1) 0;
1952
+ }
1953
+
1954
+ .call-error pre.code,
1955
+ .call-confirm pre.code {
1956
+ max-height: 16rem;
1957
+ white-space: pre-wrap;
1958
+ }
1959
+
1960
+ .call-issues {
1961
+ display: flex;
1962
+ flex-direction: column;
1963
+ gap: var(--space-1);
1964
+ font-size: var(--text-sm);
1965
+ }
1966
+
1967
+ .call-err-payload {
1968
+ padding: var(--space-2) var(--space-3);
1969
+ border: 1px solid var(--color-border);
1970
+ border-radius: var(--radius-sm);
1971
+ background: var(--color-surface);
1972
+ }
1973
+
1974
+ /* The confirm step: framed like the write it guards. */
1975
+ .call-confirm {
1976
+ border-color: var(--tone-update-border);
1977
+ box-shadow: var(--shadow-md);
1978
+ }
1979
+
1980
+ .call-confirm .card-header {
1981
+ display: flex;
1982
+ align-items: center;
1983
+ justify-content: space-between;
1984
+ gap: var(--space-2);
1985
+ background: var(--tone-update-bg);
1986
+ }
1987
+
1988
+ .call-confirm .card-title:focus-visible {
1989
+ outline: none;
1990
+ box-shadow: var(--ring);
1991
+ border-radius: var(--radius-xs);
1992
+ }
1993
+
1994
+ .call-confirm-candid {
1995
+ margin: 0;
1996
+ }
1997
+
1998
+ .call-confirm-hex {
1999
+ margin: 0;
2000
+ word-break: break-all;
2001
+ }
2002
+
2003
+ /* The live query key, one segment per row; the caller stands out. */
2004
+ .call-cache > summary .badge {
2005
+ margin-left: auto;
2006
+ }
2007
+
2008
+ .call-key {
2009
+ display: flex;
2010
+ flex-direction: column;
2011
+ gap: var(--space-1);
2012
+ }
2013
+
2014
+ .call-key-segment {
2015
+ display: grid;
2016
+ grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);
2017
+ gap: var(--space-0-5) var(--space-3);
2018
+ align-items: baseline;
2019
+ padding: var(--space-1) var(--space-2);
2020
+ border-radius: var(--radius-sm);
2021
+ }
2022
+
2023
+ .call-key-name {
2024
+ color: var(--color-text-muted);
2025
+ font-size: var(--text-xs);
2026
+ font-weight: var(--weight-semibold);
2027
+ }
2028
+
2029
+ .call-key-value {
2030
+ min-width: 0;
2031
+ font-size: var(--text-xs);
2032
+ }
2033
+
2034
+ .call-key-note {
2035
+ grid-column: 2;
2036
+ font-size: var(--text-2xs);
2037
+ }
2038
+
2039
+ .call-key-caller {
2040
+ border: 1px solid var(--tone-certified-border);
2041
+ background: var(--tone-certified-bg);
2042
+ }
2043
+
2044
+ .call-key-caller .call-key-name,
2045
+ .call-key-caller .call-key-value {
2046
+ color: var(--tone-certified-text);
2047
+ }
2048
+
2049
+ .call-resend .row,
2050
+ .call-no-resend .row {
2051
+ margin-top: var(--space-1);
2052
+ }
2053
+
2054
+ .call-readback .card-header {
2055
+ display: flex;
2056
+ align-items: center;
2057
+ justify-content: space-between;
2058
+ gap: var(--space-2);
2059
+ }
2060
+
2061
+ .call-share {
2062
+ min-width: 0;
2063
+ }
2064
+
2065
+ @media (max-width: 480px) {
2066
+ .call-key-segment {
2067
+ grid-template-columns: minmax(0, 1fr);
2068
+ }
2069
+
2070
+ .call-key-note {
2071
+ grid-column: 1;
2072
+ }
2073
+ }
2074
+ /* === end calls === */
2075
+
2076
+ /* === safety === */
2077
+
2078
+ .safety-card-header {
2079
+ flex-wrap: nowrap;
2080
+ justify-content: flex-start;
2081
+ }
2082
+
2083
+ .safety-number {
2084
+ display: inline-flex;
2085
+ flex-shrink: 0;
2086
+ align-items: center;
2087
+ justify-content: center;
2088
+ width: var(--space-8);
2089
+ height: var(--space-8);
2090
+ border-radius: var(--radius-full);
2091
+ background: var(--color-accent-soft);
2092
+ color: var(--color-accent);
2093
+ font-family: var(--font-mono);
2094
+ font-size: var(--text-sm);
2095
+ font-weight: var(--weight-semibold);
2096
+ }
2097
+
2098
+ .safety-card-title {
2099
+ flex: 1 1 auto;
2100
+ min-width: 0;
2101
+ line-height: var(--leading-snug);
2102
+ }
2103
+
2104
+ .safety-verdict {
2105
+ flex-shrink: 0;
2106
+ }
2107
+
2108
+ .safety-rule {
2109
+ display: flex;
2110
+ flex-direction: column;
2111
+ gap: var(--space-1);
2112
+ padding: var(--space-2) var(--space-3);
2113
+ border-left: 3px solid var(--color-accent);
2114
+ border-radius: var(--radius-sm);
2115
+ background: var(--color-surface-2);
2116
+ color: var(--color-text-muted);
2117
+ font-size: var(--text-sm);
2118
+ }
2119
+
2120
+ .safety-rule-label {
2121
+ color: var(--color-text-subtle);
2122
+ font-size: var(--text-2xs);
2123
+ font-weight: var(--weight-semibold);
2124
+ letter-spacing: 0.06em;
2125
+ text-transform: uppercase;
2126
+ }
2127
+
2128
+ .safety-outcome {
2129
+ padding-top: var(--space-4);
2130
+ border-top: 1px solid var(--color-border);
2131
+ }
2132
+
2133
+ .safety-subtitle {
2134
+ font-size: var(--text-sm);
2135
+ font-weight: var(--weight-semibold);
2136
+ }
2137
+
2138
+ .safety-steps {
2139
+ display: flex;
2140
+ flex-direction: column;
2141
+ gap: var(--space-1);
2142
+ }
2143
+
2144
+ .safety-step {
2145
+ display: flex;
2146
+ gap: var(--space-2);
2147
+ align-items: baseline;
2148
+ font-size: var(--text-sm);
2149
+ }
2150
+
2151
+ .safety-step-mark {
2152
+ flex-shrink: 0;
2153
+ width: var(--space-4);
2154
+ font-weight: var(--weight-bold);
2155
+ text-align: center;
2156
+ }
2157
+
2158
+ .safety-step-pass .safety-step-mark {
2159
+ color: var(--tone-ok-text);
2160
+ }
2161
+
2162
+ .safety-step-fail {
2163
+ color: var(--tone-err-text);
2164
+ font-weight: var(--weight-semibold);
2165
+ }
2166
+
2167
+ .safety-step-fail .safety-step-mark {
2168
+ color: var(--tone-err-text);
2169
+ }
2170
+
2171
+ .safety-step-info {
2172
+ color: var(--color-text-muted);
2173
+ }
2174
+
2175
+ .safety-step-info .safety-step-mark {
2176
+ color: var(--color-text-subtle);
2177
+ }
2178
+
2179
+ .safety-step-text {
2180
+ display: flex;
2181
+ min-width: 0;
2182
+ flex-wrap: wrap;
2183
+ gap: 0 var(--space-2);
2184
+ }
2185
+
2186
+ .safety-step-detail {
2187
+ color: var(--color-text-subtle);
2188
+ font-size: var(--text-xs);
2189
+ font-weight: var(--weight-normal);
2190
+ }
2191
+
2192
+ .safety-log-flagged td {
2193
+ background: var(--tone-warn-bg);
2194
+ }
2195
+
2196
+ .safety-log-empty {
2197
+ display: flex;
2198
+ flex-wrap: wrap;
2199
+ gap: var(--space-2);
2200
+ align-items: center;
2201
+ color: var(--color-text-muted);
2202
+ font-size: var(--text-sm);
2203
+ }
2204
+
2205
+ .safety-tally {
2206
+ color: var(--color-text-muted);
2207
+ font-size: var(--text-sm);
2208
+ }
2209
+
2210
+ .safety-item {
2211
+ scroll-margin-top: calc(var(--header-height) + var(--space-4));
2212
+ }
2213
+
2214
+ /* === end safety === */
2215
+
2216
+ /* === values === */
2217
+ /* The reply viewer, its Candid and JSON views, and the call preview
2218
+ (src/values). Classes: .value-* and .call-preview-*. */
2219
+
2220
+ .value-inspector,
2221
+ .value-body {
2222
+ min-width: 0;
2223
+ max-width: 100%;
2224
+ }
2225
+
2226
+ .value-inspector {
2227
+ display: flex;
2228
+ flex-direction: column;
2229
+ gap: var(--space-2);
2230
+ }
2231
+
2232
+ .value-toolbar,
2233
+ .value-toolbar-actions {
2234
+ display: flex;
2235
+ flex-wrap: wrap;
2236
+ align-items: center;
2237
+ gap: var(--space-2);
2238
+ }
2239
+
2240
+ .value-toolbar {
2241
+ justify-content: space-between;
2242
+ }
2243
+
2244
+ .value-code {
2245
+ max-height: 480px;
2246
+ }
2247
+
2248
+ /* Key/value levels: names in monospace; nested levels indented on a guide. */
2249
+ .value-record > dt {
2250
+ font-family: var(--font-mono);
2251
+ font-size: var(--text-xs);
2252
+ font-weight: var(--weight-medium);
2253
+ overflow-wrap: anywhere;
2254
+ }
2255
+
2256
+ .value-record > dd {
2257
+ min-width: 0;
2258
+ }
2259
+
2260
+ /* Two columns (they stack below 720px, as every .kv does): the names take
2261
+ at most 14rem and wrap past it (overflow-wrap above), so one long field
2262
+ name cannot squeeze every value, nested records most, into a sliver. The
2263
+ floor is .kv's, so short names still line their values up. */
2264
+ @media (min-width: 721px) {
2265
+ .value-record {
2266
+ grid-template-columns: fit-content(14rem) minmax(0, 1fr);
2267
+ }
2268
+
2269
+ .value-record > dt {
2270
+ min-width: 6rem;
2271
+ }
2272
+ }
2273
+
2274
+ .value-record .value-record,
2275
+ .value-vec .value-record {
2276
+ padding-left: var(--space-2);
2277
+ border-left: 2px solid var(--color-border);
2278
+ }
2279
+
2280
+ .value-principal,
2281
+ .value-blob,
2282
+ .value-func,
2283
+ .value-number,
2284
+ .value-mismatch,
2285
+ .value-variant {
2286
+ display: inline-flex;
2287
+ max-width: 100%;
2288
+ min-width: 0;
2289
+ flex-wrap: wrap;
2290
+ align-items: center;
2291
+ gap: var(--space-1) var(--space-1-5);
2292
+ vertical-align: middle;
2293
+ }
2294
+
2295
+ .value-variant {
2296
+ align-items: flex-start;
2297
+ }
2298
+
2299
+ .value-variant-payload {
2300
+ min-width: 0;
2301
+ flex: 1 1 auto;
2302
+ }
2303
+
2304
+ .value-result {
2305
+ display: flex;
2306
+ min-width: 0;
2307
+ flex-direction: column;
2308
+ align-items: flex-start;
2309
+ gap: var(--space-2);
2310
+ }
2311
+
2312
+ .value-text {
2313
+ white-space: pre-wrap;
2314
+ overflow-wrap: anywhere;
2315
+ }
2316
+
2317
+ pre.value-text-block {
2318
+ max-height: 320px;
2319
+ white-space: pre-wrap;
2320
+ overflow-wrap: anywhere;
2321
+ }
2322
+
2323
+ .value-time,
2324
+ .value-open,
2325
+ .value-utf8 {
2326
+ font-size: var(--text-xs);
2327
+ }
2328
+
2329
+ /* A number or a timestamp never breaks inside. */
2330
+ .value-number > .mono,
2331
+ .value-time {
2332
+ white-space: nowrap;
2333
+ }
2334
+
2335
+ .value-open {
2336
+ font-weight: var(--weight-medium);
2337
+ white-space: nowrap;
2338
+ }
2339
+
2340
+ /* The copy buttons inside a value: smaller than a .btn-sm, for dense trees. */
2341
+ .btn.value-copy {
2342
+ width: 22px;
2343
+ min-height: 22px;
2344
+ }
2345
+
2346
+ .value-vec {
2347
+ display: flex;
2348
+ max-width: 100%;
2349
+ min-width: 0;
2350
+ flex-direction: column;
2351
+ align-items: flex-start;
2352
+ gap: var(--space-1-5);
2353
+ }
2354
+
2355
+ .value-vec > .table-wrap,
2356
+ .value-vec > .value-record,
2357
+ .value-vec > .value-list {
2358
+ align-self: stretch;
2359
+ }
2360
+
2361
+ .value-table td {
2362
+ min-width: 6ch;
2363
+ }
2364
+
2365
+ /* Cells size to their content (the wrapper scrolls) instead of breaking
2366
+ names, hex and principals one character per line. */
2367
+ .value-table .kv {
2368
+ grid-template-columns: max-content minmax(max-content, 1fr);
2369
+ }
2370
+
2371
+ .value-table .kv > dd {
2372
+ overflow-wrap: normal;
2373
+ }
2374
+
2375
+ .value-table .value-blob,
2376
+ .value-table .value-principal {
2377
+ flex-wrap: nowrap;
2378
+ }
2379
+
2380
+ .value-table code.break-all {
2381
+ white-space: nowrap;
2382
+ word-break: normal;
2383
+ overflow-wrap: normal;
2384
+ }
2385
+
2386
+ .value-table td .value-record {
2387
+ font-size: var(--text-2xs);
2388
+ }
2389
+
2390
+ .value-list {
2391
+ display: flex;
2392
+ margin: 0;
2393
+ padding: 0;
2394
+ flex-direction: column;
2395
+ gap: var(--space-1);
2396
+ list-style: none;
2397
+ }
2398
+
2399
+ .value-list > li {
2400
+ display: flex;
2401
+ min-width: 0;
2402
+ align-items: baseline;
2403
+ gap: var(--space-2);
2404
+ }
2405
+
2406
+ .value-index {
2407
+ min-width: 2ch;
2408
+ font-size: var(--text-xs);
2409
+ text-align: right;
2410
+ }
2411
+
2412
+ .value-pager {
2413
+ display: flex;
2414
+ flex-wrap: wrap;
2415
+ align-items: center;
2416
+ gap: var(--space-2);
2417
+ }
2418
+
2419
+ .call-preview-hex {
2420
+ display: block;
2421
+ max-height: 240px;
2422
+ overflow: auto;
2423
+ font-size: var(--text-xs);
2424
+ }
2425
+
2426
+ /* === end values === */
2427
+
2428
+ /* === forms === */
2429
+ /* MethodForm / TypedForm: schema-driven argument editors (src/forms). */
2430
+
2431
+ .form {
2432
+ display: flex;
2433
+ min-width: 0;
2434
+ flex-direction: column;
2435
+ gap: var(--space-4);
2436
+ }
2437
+
2438
+ /* The busy wrapper: a disabled fieldset disables every control inside. */
2439
+ .form-fields {
2440
+ display: flex;
2441
+ min-width: 0;
2442
+ flex-direction: column;
2443
+ gap: var(--space-4);
2444
+ margin: 0;
2445
+ padding: 0;
2446
+ border: 0;
2447
+ }
2448
+
2449
+ .form-field {
2450
+ min-width: 0;
2451
+ }
2452
+
2453
+ .form-field-head {
2454
+ display: flex;
2455
+ min-width: 0;
2456
+ flex-wrap: wrap;
2457
+ align-items: center;
2458
+ gap: var(--space-1-5) var(--space-2);
2459
+ }
2460
+
2461
+ .form-field-head > .field-label {
2462
+ font-family: var(--font-mono);
2463
+ overflow-wrap: anywhere;
2464
+ }
2465
+
2466
+ .form-field-aside {
2467
+ display: inline-flex;
2468
+ margin-left: auto;
2469
+ align-items: center;
2470
+ gap: var(--space-1);
2471
+ }
2472
+
2473
+ .form-type {
2474
+ color: var(--color-text-subtle);
2475
+ font-family: var(--font-mono);
2476
+ font-size: var(--text-2xs);
2477
+ white-space: nowrap;
2478
+ }
2479
+
2480
+ .form-meta {
2481
+ font-variant-numeric: tabular-nums;
2482
+ overflow-wrap: anywhere;
2483
+ }
2484
+
2485
+ .form-status-ok {
2486
+ color: var(--tone-ok-text);
2487
+ }
2488
+
2489
+ .form-issues {
2490
+ display: flex;
2491
+ margin: 0;
2492
+ padding: 0;
2493
+ flex-direction: column;
2494
+ gap: var(--space-0-5);
2495
+ list-style: none;
2496
+ }
2497
+
2498
+ .form-issues > .field-error::before {
2499
+ content: "!";
2500
+ display: inline-flex;
2501
+ width: 14px;
2502
+ height: 14px;
2503
+ flex-shrink: 0;
2504
+ align-items: center;
2505
+ justify-content: center;
2506
+ border-radius: var(--radius-full);
2507
+ background: var(--tone-err-text);
2508
+ color: var(--color-surface);
2509
+ font-size: var(--text-2xs);
2510
+ font-weight: var(--weight-bold);
2511
+ }
2512
+
2513
+ /* Composite values */
2514
+
2515
+ .form-group {
2516
+ min-width: 0;
2517
+ }
2518
+
2519
+ .form .fieldset .fieldset {
2520
+ background: var(--color-surface);
2521
+ }
2522
+
2523
+ .form .fieldset .fieldset .fieldset {
2524
+ background: var(--color-surface-2);
2525
+ }
2526
+
2527
+ .form-legend {
2528
+ display: inline-flex;
2529
+ flex-wrap: wrap;
2530
+ align-items: center;
2531
+ gap: var(--space-1-5);
2532
+ }
2533
+
2534
+ .form-legend-toggle {
2535
+ display: inline-flex;
2536
+ padding: 0;
2537
+ align-items: center;
2538
+ gap: var(--space-1-5);
2539
+ border: 0;
2540
+ border-radius: var(--radius-xs);
2541
+ background: none;
2542
+ color: var(--color-text);
2543
+ font-family: var(--font-mono);
2544
+ font-size: var(--text-sm);
2545
+ font-weight: var(--weight-medium);
2546
+ cursor: pointer;
2547
+ }
2548
+
2549
+ .form-legend-toggle:focus-visible {
2550
+ outline: none;
2551
+ box-shadow: var(--ring);
2552
+ }
2553
+
2554
+ .form-chevron {
2555
+ width: 6px;
2556
+ height: 6px;
2557
+ border-right: 1.5px solid var(--color-text-subtle);
2558
+ border-bottom: 1.5px solid var(--color-text-subtle);
2559
+ transform: rotate(45deg);
2560
+ transition: transform var(--duration-fast) var(--ease);
2561
+ }
2562
+
2563
+ .form-legend-toggle[aria-expanded="false"] > .form-chevron {
2564
+ transform: rotate(-45deg);
2565
+ }
2566
+
2567
+ .form-group-body[hidden] {
2568
+ display: none;
2569
+ }
2570
+
2571
+ .form-opt {
2572
+ display: flex;
2573
+ min-width: 0;
2574
+ flex-direction: column;
2575
+ gap: var(--space-1-5);
2576
+ }
2577
+
2578
+ .form-opt > .form-field-head .field-label {
2579
+ font-family: var(--font-mono);
2580
+ }
2581
+
2582
+ .form-opt-body,
2583
+ .form-arm-body {
2584
+ min-width: 0;
2585
+ padding-left: var(--space-3);
2586
+ border-left: 2px solid var(--color-border);
2587
+ }
2588
+
2589
+ .form-optional > summary {
2590
+ font-size: var(--text-xs);
2591
+ }
2592
+
2593
+ .form-arm-select {
2594
+ max-width: 320px;
2595
+ }
2596
+
2597
+ /* A segmented control keeps its own width inside a stack. */
2598
+ .form .segmented {
2599
+ align-self: flex-start;
2600
+ }
2601
+
2602
+ .form-func-grid {
2603
+ display: grid;
2604
+ gap: var(--space-3);
2605
+ }
2606
+
2607
+ .form-fixed .chip {
2608
+ margin-left: var(--space-1);
2609
+ }
2610
+
2611
+ /* vec */
2612
+
2613
+ .form-list-items {
2614
+ display: flex;
2615
+ flex-direction: column;
2616
+ gap: var(--space-2);
2617
+ }
2618
+
2619
+ .form-list-item {
2620
+ display: flex;
2621
+ min-width: 0;
2622
+ flex-direction: column;
2623
+ gap: var(--space-1-5);
2624
+ padding: var(--space-2) var(--space-3) var(--space-3);
2625
+ border: 1px solid var(--color-border);
2626
+ border-radius: var(--radius-sm);
2627
+ background: var(--color-surface);
2628
+ }
2629
+
2630
+ .form-list-item-head {
2631
+ display: flex;
2632
+ align-items: center;
2633
+ justify-content: space-between;
2634
+ gap: var(--space-2);
2635
+ }
2636
+
2637
+ .form-list-actions {
2638
+ padding-top: var(--space-1);
2639
+ }
2640
+
2641
+ .form-input-narrow {
2642
+ width: 96px;
2643
+ min-height: 28px;
2644
+ flex: none;
2645
+ }
2646
+
2647
+ /* Widgets */
2648
+
2649
+ .form-helper,
2650
+ .form-timestamp-row {
2651
+ row-gap: var(--space-1-5);
2652
+ }
2653
+
2654
+ .form-timestamp-row > .switch-label {
2655
+ margin-left: auto;
2656
+ }
2657
+
2658
+ .form-datetime {
2659
+ width: auto;
2660
+ min-width: 0;
2661
+ max-width: 100%;
2662
+ flex: 0 1 280px;
2663
+ font-family: var(--font-mono);
2664
+ font-size: var(--text-sm);
2665
+ }
2666
+
2667
+ /* Submit, summary and tools */
2668
+
2669
+ .form-summary-link {
2670
+ padding: 0;
2671
+ border: 0;
2672
+ background: none;
2673
+ color: inherit;
2674
+ font-size: inherit;
2675
+ font-weight: var(--weight-semibold);
2676
+ text-decoration: underline;
2677
+ text-underline-offset: 2px;
2678
+ cursor: pointer;
2679
+ }
2680
+
2681
+ .form-summary-link:focus-visible {
2682
+ outline: none;
2683
+ border-radius: var(--radius-xs);
2684
+ box-shadow: var(--ring);
2685
+ }
2686
+
2687
+ .form-footer {
2688
+ display: flex;
2689
+ flex-direction: column;
2690
+ gap: var(--space-3);
2691
+ padding-top: var(--space-3);
2692
+ border-top: 1px solid var(--color-border);
2693
+ }
2694
+
2695
+ .form-submit-row {
2696
+ flex-wrap: nowrap;
2697
+ align-items: flex-start;
2698
+ gap: var(--space-3);
2699
+ }
2700
+
2701
+ .form-submit-row > .btn {
2702
+ flex-shrink: 0;
2703
+ }
2704
+
2705
+ .form-reason {
2706
+ min-width: 0;
2707
+ margin: 0;
2708
+ padding-top: var(--space-1-5);
2709
+ font-size: var(--text-sm);
2710
+ overflow-wrap: anywhere;
2711
+ }
2712
+
2713
+ .form-reason-issue {
2714
+ color: var(--tone-warn-text);
2715
+ }
2716
+
2717
+ .form-tools {
2718
+ align-items: flex-start;
2719
+ }
2720
+
2721
+ .form-json {
2722
+ min-width: 0;
2723
+ flex: 1 1 320px;
2724
+ }
2725
+
2726
+ .form-json-text {
2727
+ min-height: 140px;
2728
+ font-size: var(--text-xs);
2729
+ }
2730
+
2731
+ @media (max-width: 520px) {
2732
+ .form-submit-row {
2733
+ flex-wrap: wrap;
2734
+ }
2735
+
2736
+ .form-field-aside {
2737
+ margin-left: 0;
2738
+ }
2739
+
2740
+ .form-timestamp-row > .switch-label {
2741
+ margin-left: 0;
2742
+ }
2743
+ }
2744
+
2745
+ /* === end forms === */
2746
+
2747
+ /* === pages === */
2748
+ /* Layout and page styles of components/ and routes/: shared primitives
2749
+ (.ui-*), the header tools, and one prefix per page. */
2750
+
2751
+ /* Primitives ------------------------------------------------------------- */
2752
+
2753
+ .ui-code {
2754
+ display: flex;
2755
+ min-width: 0;
2756
+ flex-direction: column;
2757
+ }
2758
+
2759
+ .ui-code-toolbar {
2760
+ display: flex;
2761
+ flex-wrap: wrap;
2762
+ align-items: center;
2763
+ justify-content: space-between;
2764
+ gap: var(--space-1) var(--space-2);
2765
+ padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);
2766
+ border: 1px solid var(--color-border);
2767
+ border-bottom: 0;
2768
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
2769
+ background: var(--color-surface-2);
2770
+ }
2771
+
2772
+ .ui-code-toolbar + pre.code {
2773
+ border-top-left-radius: 0;
2774
+ border-top-right-radius: 0;
2775
+ }
2776
+
2777
+ .ui-code-label {
2778
+ color: var(--color-text-muted);
2779
+ font-family: var(--font-mono);
2780
+ font-size: var(--text-xs);
2781
+ }
2782
+
2783
+ .ui-tabs {
2784
+ display: flex;
2785
+ min-width: 0;
2786
+ flex-direction: column;
2787
+ }
2788
+
2789
+ .ui-tabs > .tab-panel:focus-visible {
2790
+ outline: none;
2791
+ border-radius: var(--radius-sm);
2792
+ box-shadow: var(--ring);
2793
+ }
2794
+
2795
+ .ui-section-error {
2796
+ position: relative;
2797
+ z-index: 1;
2798
+ display: flex;
2799
+ flex-wrap: wrap;
2800
+ align-items: center;
2801
+ justify-content: space-between;
2802
+ gap: var(--space-2);
2803
+ padding: var(--space-3);
2804
+ border: 1px dashed var(--tone-err-border);
2805
+ border-radius: var(--radius-md);
2806
+ background: var(--tone-err-bg);
2807
+ }
2808
+
2809
+ /* Header tools: canister jump and sign-in --------------------------------- */
2810
+
2811
+ .canister-jump {
2812
+ position: relative;
2813
+ min-width: 0;
2814
+ }
2815
+
2816
+ .canister-jump-field {
2817
+ position: relative;
2818
+ display: flex;
2819
+ align-items: center;
2820
+ }
2821
+
2822
+ .canister-jump-icon {
2823
+ position: absolute;
2824
+ left: var(--space-2-5);
2825
+ color: var(--color-text-subtle);
2826
+ pointer-events: none;
2827
+ }
2828
+
2829
+ .canister-jump-input.input {
2830
+ width: 15.5rem;
2831
+ min-height: 30px;
2832
+ padding-right: var(--space-8);
2833
+ padding-left: var(--space-8);
2834
+ background: var(--color-surface-2);
2835
+ font-size: var(--text-xs);
2836
+ }
2837
+
2838
+ .canister-jump-input.input:focus-visible {
2839
+ background: var(--color-surface);
2840
+ }
2841
+
2842
+ .canister-jump-kbd {
2843
+ position: absolute;
2844
+ right: var(--space-2);
2845
+ pointer-events: none;
2846
+ }
2847
+
2848
+ .canister-jump-input:focus-visible ~ .canister-jump-kbd {
2849
+ display: none;
2850
+ }
2851
+
2852
+ .canister-jump-problem,
2853
+ .auth-failure {
2854
+ position: absolute;
2855
+ top: calc(100% + var(--space-1-5));
2856
+ right: 0;
2857
+ z-index: var(--z-overlay);
2858
+ width: max-content;
2859
+ max-width: min(22rem, calc(100vw - 2 * var(--gutter)));
2860
+ padding: var(--space-2) var(--space-3);
2861
+ border: 1px solid var(--tone-err-border);
2862
+ border-radius: var(--radius-sm);
2863
+ background: var(--color-surface);
2864
+ box-shadow: var(--shadow-md);
2865
+ color: var(--tone-err-text);
2866
+ font-size: var(--text-xs);
2867
+ }
2868
+
2869
+ .auth {
2870
+ position: relative;
2871
+ display: flex;
2872
+ align-items: center;
2873
+ gap: var(--space-1);
2874
+ }
2875
+
2876
+ .auth-principal {
2877
+ display: inline-flex;
2878
+ min-height: 26px;
2879
+ padding: 0 var(--space-2);
2880
+ align-items: center;
2881
+ gap: var(--space-1-5);
2882
+ border: 1px solid var(--color-border);
2883
+ border-radius: var(--radius-full);
2884
+ background: var(--color-surface-2);
2885
+ font-size: var(--text-xs);
2886
+ white-space: nowrap;
2887
+ }
2888
+
2889
+ .auth-dot {
2890
+ width: 6px;
2891
+ height: 6px;
2892
+ color: var(--tone-ok-text);
2893
+ }
2894
+
2895
+ /* Home ----------------------------------------------------------------------- */
2896
+
2897
+ .home {
2898
+ gap: var(--space-10);
2899
+ }
2900
+
2901
+ .home-hero {
2902
+ display: grid;
2903
+ grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
2904
+ align-items: start;
2905
+ gap: var(--space-8);
2906
+ }
2907
+
2908
+ .home-hero-text {
2909
+ padding-top: var(--space-6);
2910
+ }
2911
+
2912
+ .home-eyebrow {
2913
+ color: var(--color-accent);
2914
+ font-size: var(--text-xs);
2915
+ font-weight: var(--weight-semibold);
2916
+ letter-spacing: 0.06em;
2917
+ text-transform: uppercase;
2918
+ }
2919
+
2920
+ .home-title {
2921
+ max-width: 18ch;
2922
+ font-size: var(--text-4xl);
2923
+ line-height: var(--leading-tight);
2924
+ }
2925
+
2926
+ .home-points {
2927
+ max-width: 60ch;
2928
+ color: var(--color-text-muted);
2929
+ font-size: var(--text-sm);
2930
+ }
2931
+
2932
+ .home-points > li {
2933
+ position: relative;
2934
+ padding-left: var(--space-5);
2935
+ }
2936
+
2937
+ .home-points > li::before {
2938
+ content: "";
2939
+ position: absolute;
2940
+ top: 0.55em;
2941
+ left: var(--space-1);
2942
+ width: 6px;
2943
+ height: 6px;
2944
+ border-radius: var(--radius-full);
2945
+ background: var(--tone-certified-text);
2946
+ }
2947
+
2948
+ .home-curated-title {
2949
+ font-size: var(--text-2xs);
2950
+ font-weight: var(--weight-semibold);
2951
+ letter-spacing: 0.04em;
2952
+ text-transform: uppercase;
2953
+ }
2954
+
2955
+ .home-curated {
2956
+ display: grid;
2957
+ max-height: 17rem;
2958
+ grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr));
2959
+ gap: var(--space-1);
2960
+ margin: 0 calc(-1 * var(--space-2));
2961
+ overflow-y: auto;
2962
+ overscroll-behavior: contain;
2963
+ }
2964
+
2965
+ .home-curated-item {
2966
+ display: flex;
2967
+ height: 100%;
2968
+ flex-direction: column;
2969
+ gap: var(--space-0-5);
2970
+ padding: var(--space-2);
2971
+ border-radius: var(--radius-sm);
2972
+ color: inherit;
2973
+ }
2974
+
2975
+ .home-curated-item:hover {
2976
+ background: var(--color-surface-hover);
2977
+ text-decoration: none;
2978
+ }
2979
+
2980
+ .home-curated-name {
2981
+ color: var(--color-accent);
2982
+ font-size: var(--text-sm);
2983
+ font-weight: var(--weight-medium);
2984
+ }
2985
+
2986
+ .home-featured-grid {
2987
+ --grid-min: 240px;
2988
+ }
2989
+
2990
+ .home-featured {
2991
+ position: relative;
2992
+ transition:
2993
+ border-color var(--duration-fast) var(--ease),
2994
+ box-shadow var(--duration-fast) var(--ease);
2995
+ }
2996
+
2997
+ .home-featured:hover {
2998
+ border-color: var(--color-border-strong);
2999
+ box-shadow: var(--shadow-md);
3000
+ }
3001
+
3002
+ .home-featured-link {
3003
+ color: inherit;
3004
+ }
3005
+
3006
+ /* The whole card is the link's target; buttons inside stay above it. */
3007
+ .home-featured-link::after {
3008
+ content: "";
3009
+ position: absolute;
3010
+ inset: 0;
3011
+ border-radius: inherit;
3012
+ }
3013
+
3014
+ .home-featured-link:hover {
3015
+ text-decoration: none;
3016
+ }
3017
+
3018
+ .home-featured-link:focus-visible {
3019
+ outline: none;
3020
+ }
3021
+
3022
+ .home-featured:has(.home-featured-link:focus-visible) {
3023
+ border-color: var(--color-focus);
3024
+ box-shadow: var(--ring);
3025
+ }
3026
+
3027
+ .home-stats {
3028
+ display: flex;
3029
+ flex-direction: column;
3030
+ margin: 0;
3031
+ padding: var(--space-1) var(--space-3);
3032
+ border: 1px solid var(--color-border);
3033
+ border-radius: var(--radius-md);
3034
+ background: var(--color-surface-2);
3035
+ }
3036
+
3037
+ .home-stat {
3038
+ display: flex;
3039
+ min-width: 0;
3040
+ min-height: 2rem;
3041
+ align-items: center;
3042
+ justify-content: space-between;
3043
+ gap: var(--space-3);
3044
+ }
3045
+
3046
+ .home-stat + .home-stat {
3047
+ border-top: 1px solid var(--color-border);
3048
+ }
3049
+
3050
+ .home-stat > dd {
3051
+ margin: 0;
3052
+ }
3053
+
3054
+ .home-stat-value {
3055
+ font-size: var(--text-sm);
3056
+ font-weight: var(--weight-semibold);
3057
+ text-align: right;
3058
+ overflow-wrap: anywhere;
3059
+ }
3060
+
3061
+ .home-features {
3062
+ --grid-min: 220px;
3063
+ }
3064
+
3065
+ .home-feature .card-body {
3066
+ height: 100%;
3067
+ }
3068
+
3069
+ .home-feature-link {
3070
+ font-size: var(--text-sm);
3071
+ font-weight: var(--weight-medium);
3072
+ }
3073
+
3074
+ /* Canister pages ------------------------------------------------------------- */
3075
+
3076
+ .canister-header {
3077
+ display: flex;
3078
+ flex-direction: column;
3079
+ gap: var(--space-4);
3080
+ }
3081
+
3082
+ .canister-header-top {
3083
+ display: flex;
3084
+ flex-wrap: wrap;
3085
+ align-items: flex-start;
3086
+ justify-content: space-between;
3087
+ gap: var(--space-4);
3088
+ }
3089
+
3090
+ .canister-title {
3091
+ overflow-wrap: anywhere;
3092
+ }
3093
+
3094
+ .canister-id {
3095
+ color: var(--color-text-muted);
3096
+ }
3097
+
3098
+ .canister-mode-counts {
3099
+ gap: var(--space-3);
3100
+ }
3101
+
3102
+ .canister-mode-count {
3103
+ font-weight: var(--weight-semibold);
3104
+ }
3105
+
3106
+ .canister-facts {
3107
+ padding: var(--space-3) var(--space-4);
3108
+ border: 1px solid var(--color-border);
3109
+ border-radius: var(--radius-md);
3110
+ background: var(--color-surface);
3111
+ }
3112
+
3113
+ .method-list {
3114
+ display: flex;
3115
+ flex-direction: column;
3116
+ gap: var(--space-3);
3117
+ padding: var(--space-3);
3118
+ border: 1px solid var(--color-border);
3119
+ border-radius: var(--radius-lg);
3120
+ background: var(--color-surface);
3121
+ }
3122
+
3123
+ .method-list-modes > .segmented {
3124
+ display: flex;
3125
+ width: 100%;
3126
+ }
3127
+
3128
+ .method-list-modes > .segmented > button {
3129
+ flex: 1 1 auto;
3130
+ }
3131
+
3132
+ .method-list-groups {
3133
+ display: flex;
3134
+ min-width: 0;
3135
+ flex-direction: column;
3136
+ gap: var(--space-3);
3137
+ }
3138
+
3139
+ .method-list-heading {
3140
+ display: flex;
3141
+ justify-content: space-between;
3142
+ padding: 0 var(--space-2) var(--space-1);
3143
+ color: var(--color-text-muted);
3144
+ font-size: var(--text-2xs);
3145
+ font-weight: var(--weight-semibold);
3146
+ letter-spacing: 0.04em;
3147
+ text-transform: uppercase;
3148
+ }
3149
+
3150
+ .method-list-item {
3151
+ display: flex;
3152
+ width: 100%;
3153
+ min-height: 30px;
3154
+ padding: var(--space-1) var(--space-2);
3155
+ align-items: center;
3156
+ justify-content: space-between;
3157
+ gap: var(--space-2);
3158
+ border: 0;
3159
+ border-radius: var(--radius-sm);
3160
+ background: transparent;
3161
+ color: var(--color-text);
3162
+ font-size: var(--text-sm);
3163
+ text-align: left;
3164
+ text-decoration: none;
3165
+ }
3166
+
3167
+ .method-list-item:hover {
3168
+ background: var(--color-surface-hover);
3169
+ text-decoration: none;
3170
+ }
3171
+
3172
+ /* The router marks the selected link aria-current="page" when the URL is
3173
+ exactly its own; the list marks it "true" otherwise (a shared link). */
3174
+ .method-list-item[aria-current]:not([aria-current="false"]),
3175
+ .method-list-item[aria-pressed="true"] {
3176
+ background: var(--color-accent-soft);
3177
+ color: var(--color-accent);
3178
+ }
3179
+
3180
+ .method-list-item:focus-visible {
3181
+ outline: none;
3182
+ box-shadow: var(--ring-inset);
3183
+ }
3184
+
3185
+ .method-list-name {
3186
+ min-width: 0;
3187
+ }
3188
+
3189
+ .method-list-empty {
3190
+ padding: var(--space-2);
3191
+ }
3192
+
3193
+ .method-heading {
3194
+ display: flex;
3195
+ flex-direction: column;
3196
+ gap: var(--space-2);
3197
+ }
3198
+
3199
+ .method-heading-name {
3200
+ font-size: var(--text-xl);
3201
+ }
3202
+
3203
+ .method-heading-doc {
3204
+ max-width: 80ch;
3205
+ white-space: pre-wrap;
3206
+ }
3207
+
3208
+ .method-quick-reads {
3209
+ --grid-min: 220px;
3210
+ gap: var(--space-2);
3211
+ }
3212
+
3213
+ .method-quick-read {
3214
+ flex-direction: row;
3215
+ align-items: center;
3216
+ justify-content: space-between;
3217
+ gap: var(--space-2);
3218
+ padding: var(--space-2-5) var(--space-3);
3219
+ font-size: var(--text-sm);
3220
+ }
3221
+
3222
+ /* The interface tools: secondary tabs under the page tabs. */
3223
+ .iface-tabs {
3224
+ gap: var(--space-1);
3225
+ border-bottom: 0;
3226
+ }
3227
+
3228
+ .iface-tabs > .tab {
3229
+ margin-bottom: 0;
3230
+ padding: var(--space-1) var(--space-3);
3231
+ border-bottom: 0;
3232
+ border-radius: var(--radius-full);
3233
+ }
3234
+
3235
+ .iface-tabs > .tab[aria-current="page"] {
3236
+ background: var(--color-accent-soft);
3237
+ color: var(--color-accent);
3238
+ }
3239
+
3240
+ .iface-tabs > .tab:focus-visible {
3241
+ border-radius: var(--radius-full);
3242
+ }
3243
+
3244
+ .iface-project-list {
3245
+ display: grid;
3246
+ max-height: 22rem;
3247
+ grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr));
3248
+ gap: var(--space-0-5) var(--space-2);
3249
+ overflow-y: auto;
3250
+ overscroll-behavior: contain;
3251
+ }
3252
+
3253
+ .iface-project-item {
3254
+ display: flex;
3255
+ min-width: 0;
3256
+ padding: var(--space-1-5) var(--space-2);
3257
+ align-items: center;
3258
+ gap: var(--space-2);
3259
+ border-radius: var(--radius-sm);
3260
+ font-size: var(--text-sm);
3261
+ cursor: pointer;
3262
+ }
3263
+
3264
+ .iface-project-item:hover {
3265
+ background: var(--color-surface-hover);
3266
+ }
3267
+
3268
+ .iface-project-item > input {
3269
+ flex-shrink: 0;
3270
+ accent-color: var(--color-accent-solid);
3271
+ }
3272
+
3273
+ .iface-project-filter.input {
3274
+ width: auto;
3275
+ min-width: min(12rem, 100%);
3276
+ }
3277
+
3278
+ .iface-compat-input.textarea {
3279
+ min-height: 10rem;
3280
+ }
3281
+
3282
+ /* Wallet ---------------------------------------------------------------------- */
3283
+
3284
+ .wallet-ledgers {
3285
+ width: fit-content;
3286
+ }
3287
+
3288
+ .wallet-ledgers > a {
3289
+ display: inline-flex;
3290
+ min-height: 28px;
3291
+ padding: 0 var(--space-4);
3292
+ align-items: center;
3293
+ border-radius: var(--radius-xs);
3294
+ color: var(--color-text-muted);
3295
+ font-size: var(--text-sm);
3296
+ font-weight: var(--weight-medium);
3297
+ white-space: nowrap;
3298
+ text-decoration: none;
3299
+ }
3300
+
3301
+ .wallet-ledgers > a:hover {
3302
+ color: var(--color-text);
3303
+ text-decoration: none;
3304
+ }
3305
+
3306
+ .wallet-ledgers > a[aria-current="page"] {
3307
+ background: var(--color-surface);
3308
+ box-shadow: var(--shadow-xs);
3309
+ color: var(--color-accent);
3310
+ font-weight: var(--weight-semibold);
3311
+ }
3312
+
3313
+ .wallet-ledgers > a:focus-visible {
3314
+ outline: none;
3315
+ box-shadow: var(--ring-inset);
3316
+ }
3317
+
3318
+ .wallet-grid {
3319
+ align-items: start;
3320
+ gap: var(--space-5);
3321
+ }
3322
+
3323
+ .wallet-balance-value {
3324
+ font-size: var(--text-2xl);
3325
+ font-weight: var(--weight-semibold);
3326
+ letter-spacing: -0.01em;
3327
+ }
3328
+
3329
+ .wallet-minter-grid {
3330
+ --grid-min: 240px;
3331
+ gap: var(--space-6);
3332
+ }
3333
+
3334
+ .wallet-minter-title {
3335
+ font-weight: var(--weight-semibold);
3336
+ }
3337
+
3338
+ .wallet-address {
3339
+ font-size: var(--text-sm);
3340
+ }
3341
+
3342
+ /* Safety, playground, history --------------------------------------------------- */
3343
+
3344
+ .safety-rules {
3345
+ margin: 0;
3346
+ padding-left: var(--space-5);
3347
+ }
3348
+
3349
+ .pg-inputs {
3350
+ align-items: start;
3351
+ }
3352
+
3353
+ .pg-source.textarea {
3354
+ min-height: 22rem;
3355
+ font-size: var(--text-xs);
3356
+ }
3357
+
3358
+ .history-filters {
3359
+ align-items: flex-end;
3360
+ gap: var(--space-3);
3361
+ }
3362
+
3363
+ .history-filters > .field {
3364
+ min-width: 9rem;
3365
+ }
3366
+
3367
+ .history-filters > .field.grow {
3368
+ min-width: min(16rem, 100%);
3369
+ }
3370
+
3371
+ /* Responsive ------------------------------------------------------------------- */
3372
+
3373
+ @media (max-width: 1100px) {
3374
+ .canister-jump-input.input {
3375
+ width: 12rem;
3376
+ }
3377
+ }
3378
+
3379
+ @media (max-width: 960px) {
3380
+ .home-hero {
3381
+ grid-template-columns: minmax(0, 1fr);
3382
+ gap: var(--space-6);
3383
+ }
3384
+
3385
+ .home-hero-text {
3386
+ padding-top: 0;
3387
+ }
3388
+
3389
+ .home-title {
3390
+ font-size: var(--text-3xl);
3391
+ }
3392
+
3393
+ /* The sidebar sits above the runner here: keep a long list short. */
3394
+ .canister-workspace .method-list-groups {
3395
+ max-height: 40vh;
3396
+ overflow-y: auto;
3397
+ overscroll-behavior: contain;
3398
+ }
3399
+ }
3400
+
3401
+ @media (max-width: 560px) {
3402
+ /* One header row of brand mark and tools; the nav keeps its own row. */
3403
+ .brand-name {
3404
+ position: absolute;
3405
+ width: 1px;
3406
+ height: 1px;
3407
+ overflow: hidden;
3408
+ clip-path: inset(50%);
3409
+ white-space: nowrap;
3410
+ }
3411
+
3412
+ .app-header-tools {
3413
+ min-width: 0;
3414
+ flex: 1 1 auto;
3415
+ gap: var(--space-1-5);
3416
+ }
3417
+
3418
+ .canister-jump {
3419
+ flex: 1 1 auto;
3420
+ }
3421
+
3422
+ /* All five links fit a phone's width; narrower still, the row scrolls. */
3423
+ .app-nav {
3424
+ justify-content: space-between;
3425
+ gap: 0;
3426
+ }
3427
+
3428
+ .app-nav-link {
3429
+ padding: var(--space-1-5) var(--space-2);
3430
+ }
3431
+
3432
+ .canister-jump-input.input {
3433
+ width: 100%;
3434
+ padding-right: var(--space-2);
3435
+ }
3436
+
3437
+ .canister-jump-kbd,
3438
+ .auth .btn-icon {
3439
+ display: none;
3440
+ }
3441
+
3442
+ /* The network badge keeps its dot; its text stays for screen readers. */
3443
+ .app-header-tools > .badge-network {
3444
+ gap: 0;
3445
+ padding: 0 var(--space-1-5);
3446
+ font-size: 0;
3447
+ }
3448
+
3449
+ .home-title {
3450
+ font-size: var(--text-2xl);
3451
+ }
3452
+ }
3453
+ /* === end pages === */