@mavea/mavea 1.0.7

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 (557) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/DISCLAIMER.md +16 -0
  3. package/LICENSE +75 -0
  4. package/PRIVACY.md +127 -0
  5. package/README.md +248 -0
  6. package/SECURITY.md +72 -0
  7. package/SUPPORT.md +13 -0
  8. package/TERMS.md +122 -0
  9. package/THIRD-PARTY.txt +639 -0
  10. package/TRADEMARKS.md +15 -0
  11. package/bin/mavea.mjs +1079 -0
  12. package/dist/.vite/manifest.json +4261 -0
  13. package/dist/_headers +52 -0
  14. package/dist/assets/AppCommandPalette-DUMSp3rd.js +1 -0
  15. package/dist/assets/AtlasView-B5fkQhO6.css +1 -0
  16. package/dist/assets/AtlasView-Dl2fssaG.js +1 -0
  17. package/dist/assets/BlockEmpty-CLtVQf6c.js +1 -0
  18. package/dist/assets/BriefingPlayer-DO205Qkh.js +1 -0
  19. package/dist/assets/BriefingPlayer-TpFZB77N.css +1 -0
  20. package/dist/assets/CanvasSkeleton-BZZPCuRZ.js +2 -0
  21. package/dist/assets/CanvasSkeleton-iy6DBvde.css +1 -0
  22. package/dist/assets/CardEditor-BY1bZiV6.css +1 -0
  23. package/dist/assets/CardEditor-DzJXb0G7.js +1 -0
  24. package/dist/assets/CheckLogRail-F4AlgAcc.css +1 -0
  25. package/dist/assets/CheckLogRail-wUfby67Z.js +1 -0
  26. package/dist/assets/CodeOutput-Kh6ldxQz.js +97 -0
  27. package/dist/assets/CommandPalette-Bb-eErih.css +1 -0
  28. package/dist/assets/CommandPalette-Kl00mMZm.js +1 -0
  29. package/dist/assets/CourseLessonReader-COmTQdSK.css +1 -0
  30. package/dist/assets/CourseLessonReader-MBHoknUz.js +2 -0
  31. package/dist/assets/CourseRail-CUa7uIGG.css +1 -0
  32. package/dist/assets/CourseRail-q6x5cCpW.js +1 -0
  33. package/dist/assets/CoursesApp-v89OVJvg.js +2 -0
  34. package/dist/assets/CrossExamPanel-CZ0ShGma.css +1 -0
  35. package/dist/assets/CrossExamPanel-DH04p6VS.js +1 -0
  36. package/dist/assets/DashPresent-BYXbPuGj.js +1 -0
  37. package/dist/assets/DashPresent-DQYcgp-W.css +1 -0
  38. package/dist/assets/DashboardDetail-B50ZkeVK.js +2 -0
  39. package/dist/assets/DashboardLoopRuntime-CFXPx3v_.js +1 -0
  40. package/dist/assets/DashboardOverview-C-FdGWM5.js +1 -0
  41. package/dist/assets/DashboardSettings-Dmw6JTbI.js +1 -0
  42. package/dist/assets/DashboardsApp-Dx-EsaPW.css +1 -0
  43. package/dist/assets/DashboardsApp-JSY_bVfi.js +2 -0
  44. package/dist/assets/DeepZoomApp-BFNwli7l.js +37 -0
  45. package/dist/assets/DeepZoomApp-fRXCJHHZ.css +1 -0
  46. package/dist/assets/DelegatePanel-BK7rEhIc.js +26 -0
  47. package/dist/assets/DelegatePanel-_9RZiLHM.css +1 -0
  48. package/dist/assets/DemoGallery-BPtVG7_y.js +1 -0
  49. package/dist/assets/DropSelect-DUhdQSta.js +1 -0
  50. package/dist/assets/ExportModal-D4WpAg2c.css +1 -0
  51. package/dist/assets/ExportModal-D65cGyj_.js +2 -0
  52. package/dist/assets/ExtractionPreview-Iwfg2Ogl.js +18 -0
  53. package/dist/assets/FallbackCard-B489rTd9.js +1 -0
  54. package/dist/assets/FallbackCard-D_6ps1xA.css +1 -0
  55. package/dist/assets/FeatureUseNotice-CWt7gOwS.css +1 -0
  56. package/dist/assets/FeatureUseNotice-DPtQ0OGb.js +1 -0
  57. package/dist/assets/FlagshipCTA-BXntKhxb.js +1 -0
  58. package/dist/assets/FlagshipCommandPalette-BDJfasI-.js +1 -0
  59. package/dist/assets/FlagshipShowcase-DJ8Gxk_G.js +1 -0
  60. package/dist/assets/FlashcardsApp-CLNo4WX7.js +1 -0
  61. package/dist/assets/ForecastPanel-Da2ZBUrE.css +1 -0
  62. package/dist/assets/ForecastPanel-PBO2-dgS.js +1 -0
  63. package/dist/assets/GalleryApp-B1CB3_81.css +1 -0
  64. package/dist/assets/GalleryApp-DM03CMRy.js +1 -0
  65. package/dist/assets/HonestByDesign-Dqyth6nW.js +1 -0
  66. package/dist/assets/HowItWorks-C0zosIvq.js +1 -0
  67. package/dist/assets/LegalApp-DZBdExTy.js +1 -0
  68. package/dist/assets/LegalMarkdownDocument-CSZhRG5r.js +3 -0
  69. package/dist/assets/LegalPageShell-C_HottbD.css +1 -0
  70. package/dist/assets/LegalPageShell-DTeXqWyc.js +1 -0
  71. package/dist/assets/LeverPanel-DhpJY76O.css +1 -0
  72. package/dist/assets/LeverPanel-aZfhtVJX.js +1 -0
  73. package/dist/assets/Library-D2XGNXz7.js +1 -0
  74. package/dist/assets/Library-DmrtHjUf.css +1 -0
  75. package/dist/assets/LibraryOverlay-B2WQSgwr.js +1 -0
  76. package/dist/assets/LibraryOverlay-CnKWDMG_.css +1 -0
  77. package/dist/assets/LiveApp-B9zwXlGC.js +61 -0
  78. package/dist/assets/LiveApp-BVZGpJ1S.css +1 -0
  79. package/dist/assets/LiveSettings-CmgrMqvK.css +1 -0
  80. package/dist/assets/LiveSettings-D9OcWlm6.js +6 -0
  81. package/dist/assets/MindMapViewerDrawer-YYyZqmAd.js +1 -0
  82. package/dist/assets/MindShape-Ca3MXEgK.css +1 -0
  83. package/dist/assets/MindShape-mTlN5mPZ.js +1 -0
  84. package/dist/assets/Orb-B0NEVfqL.js +1 -0
  85. package/dist/assets/PinToDashboard-_kIOHs0k.js +1 -0
  86. package/dist/assets/PlanReview-33V8GTNB.js +1 -0
  87. package/dist/assets/Presence-CzLJIeSD.js +1 -0
  88. package/dist/assets/PresentationDeck-BDoGecxr.js +1 -0
  89. package/dist/assets/PrismApp-PfBTFhMF.js +2 -0
  90. package/dist/assets/PrismAskController-DBoxQSJR.css +1 -0
  91. package/dist/assets/PrismAskController-DbQDrlU9.js +37 -0
  92. package/dist/assets/PrismBriefingPlayer-1fvlfLR8.js +2 -0
  93. package/dist/assets/PrismOverlay-B7lEspdu.js +131 -0
  94. package/dist/assets/PrismOverlay-BTfAicBt.css +1 -0
  95. package/dist/assets/PrivacyApp-CR4lRs0L.js +128 -0
  96. package/dist/assets/Quiz-CUwtekfu.js +1 -0
  97. package/dist/assets/Recap-DCiiWNiV.css +1 -0
  98. package/dist/assets/Recap-H5fhj5Tc.js +1 -0
  99. package/dist/assets/ReelJelly-3jSVsJsy.js +1 -0
  100. package/dist/assets/RehearsalPanel-BCU615wg.css +1 -0
  101. package/dist/assets/RehearsalPanel-BVgjrOPg.js +6 -0
  102. package/dist/assets/ReplayCard-BpYO5vX-.js +2 -0
  103. package/dist/assets/ReplayOverlay-DXmVdeIr.js +1 -0
  104. package/dist/assets/RewindOverlay-BusfWeFq.js +1 -0
  105. package/dist/assets/RewindOverlay-C92qgvmi.css +1 -0
  106. package/dist/assets/RippleApp-9KrJPYgN.js +2 -0
  107. package/dist/assets/RippleAskController-BNAUoIW0.css +1 -0
  108. package/dist/assets/RippleAskController-CO9wE7hU.js +34 -0
  109. package/dist/assets/RippleOverlay-DMHLbfh8.js +6 -0
  110. package/dist/assets/RippleOverlay-_iiZsQVZ.css +1 -0
  111. package/dist/assets/SeeDontRead-C389viue.js +1 -0
  112. package/dist/assets/ShareModal-C8S7ySls.css +1 -0
  113. package/dist/assets/ShareModal-ClnEkudw.js +32 -0
  114. package/dist/assets/ShipCascade-BUtwvQoW.js +1 -0
  115. package/dist/assets/ShipCascade-CyFnrlET.css +1 -0
  116. package/dist/assets/ShipCourse-B7lG6DYW.js +1 -0
  117. package/dist/assets/ShipCourse-DcT7PUSm.css +1 -0
  118. package/dist/assets/ShipGate-BVZfCllb.css +1 -0
  119. package/dist/assets/ShipGate-BYYu9WVq.js +2 -0
  120. package/dist/assets/ShipHotspots-Bj2CovtT.js +1 -0
  121. package/dist/assets/ShipHotspots-CLOMutPv.css +1 -0
  122. package/dist/assets/ShipIncident-BUHvFFiC.css +1 -0
  123. package/dist/assets/ShipIncident-DcmindmE.js +2 -0
  124. package/dist/assets/ShipMigration-BznCskNg.css +1 -0
  125. package/dist/assets/ShipMigration-s0hVjDQl.js +1 -0
  126. package/dist/assets/ShipOnboarding-BC9Vxkpa.css +1 -0
  127. package/dist/assets/ShipOnboarding-ekbHL7OH.js +1 -0
  128. package/dist/assets/ShipRead-BVNgQT6L.js +1 -0
  129. package/dist/assets/ShipRollout-BdUQzMyP.js +1 -0
  130. package/dist/assets/ShipRollout-CqeObx5b.css +1 -0
  131. package/dist/assets/ShipSuggestions-B6fKYh8L.js +1 -0
  132. package/dist/assets/ShipSuggestions-BKRvk5Mj.css +1 -0
  133. package/dist/assets/ShipWorkspace-3D3Rrs1p.js +2 -0
  134. package/dist/assets/ShipWorkspace-D6XQpGEN.css +1 -0
  135. package/dist/assets/SignatureLoop-C60r8Wm5.js +1 -0
  136. package/dist/assets/SrsReview-BoaYb6XN.js +1 -0
  137. package/dist/assets/SrsReview-DmGdGxT0.css +1 -0
  138. package/dist/assets/SynthesisApp-vJ2Jq0Qe.js +2 -0
  139. package/dist/assets/SynthesisOverlay-CkERphvG.js +66 -0
  140. package/dist/assets/TermsApp-C70tW6m6.js +123 -0
  141. package/dist/assets/TopicCanvas-CT0eSj2M.js +2 -0
  142. package/dist/assets/TopicCanvas-D2Nax9II.css +1 -0
  143. package/dist/assets/TourPrism-BvucSkcs.js +1 -0
  144. package/dist/assets/TrackerTile-CasZNmt4.js +2 -0
  145. package/dist/assets/TwoSurfaces-C90X7Aj5.js +1 -0
  146. package/dist/assets/UnderstoodPanel-CHPD2Ttj.js +1 -0
  147. package/dist/assets/UnderstoodPanel-Q6GX1TFq.css +1 -0
  148. package/dist/assets/WhyMachineOverlay-BZk3PVTl.css +1 -0
  149. package/dist/assets/WhyMachineOverlay-CB0_n6Sy.js +1 -0
  150. package/dist/assets/WowFeatures-Ci_H5QYX.js +1 -0
  151. package/dist/assets/ZoomDeck-B2SjNwY7.css +1 -0
  152. package/dist/assets/ZoomDeck-BQHO79ZU.js +1 -0
  153. package/dist/assets/__vite-browser-external-BufR4LQa.js +1 -0
  154. package/dist/assets/ai-Ba4lZJ9Y.js +12 -0
  155. package/dist/assets/alternateFinishes-DZ-rkpkX.js +494 -0
  156. package/dist/assets/annotationAuto-B0nihA4F.js +1 -0
  157. package/dist/assets/annotationReel-BcU9Q0Sw.js +1 -0
  158. package/dist/assets/annotations-D2K9A5GB.js +1 -0
  159. package/dist/assets/backup-c-Btapzp.js +1 -0
  160. package/dist/assets/blockLabel-DAqaHKy3.js +1 -0
  161. package/dist/assets/c-DWGmR78Y.js +1 -0
  162. package/dist/assets/c-SSSlmE39.js +1 -0
  163. package/dist/assets/cache-BumECILO.js +1 -0
  164. package/dist/assets/canvas-QTEIiK23.js +1 -0
  165. package/dist/assets/catalog-BHjl-1uH.js +2 -0
  166. package/dist/assets/catalog-Dqaq2YFd.js +1 -0
  167. package/dist/assets/cfo.generated-Bjl5OGay.js +1 -0
  168. package/dist/assets/chapters-BiUsDClQ.js +1 -0
  169. package/dist/assets/charts1-EOoxU_K3.js +1 -0
  170. package/dist/assets/charts2-tyUiQPff.js +1 -0
  171. package/dist/assets/chunk-BVpWp9h4.js +1 -0
  172. package/dist/assets/citation-BcvmjKS8.js +1 -0
  173. package/dist/assets/code-CpjYCNS8.js +8 -0
  174. package/dist/assets/codeContext-0UMRSGRr.js +5 -0
  175. package/dist/assets/colors-D49Req-e.js +1 -0
  176. package/dist/assets/compose-BJ9EfcQS.js +3 -0
  177. package/dist/assets/contentVault-DzTYWcbD.js +1 -0
  178. package/dist/assets/core-DEFyprhs.js +1 -0
  179. package/dist/assets/corpus.generated-oX9uU93S.js +11 -0
  180. package/dist/assets/courseSeed-CZdNBTTs.js +1 -0
  181. package/dist/assets/courseStore-DfafnL-9.js +1 -0
  182. package/dist/assets/courses-BkH1ntDL.css +1 -0
  183. package/dist/assets/cpp-BGdv8dzs.js +1 -0
  184. package/dist/assets/cpp-CNAAXZl-.js +1 -0
  185. package/dist/assets/csharp-oqKa8noW.js +1 -0
  186. package/dist/assets/css-CdtkT07m.js +1 -0
  187. package/dist/assets/css-LbU1hoFO.js +1 -0
  188. package/dist/assets/dag-C3Xx8pOD.js +2 -0
  189. package/dist/assets/dashboardEvents-DR9d_c74.js +2 -0
  190. package/dist/assets/dashboards-rcWxdoXI.css +1 -0
  191. package/dist/assets/deckLine-NBd3MyGT.js +1 -0
  192. package/dist/assets/demoPaletteItems-NPCSaSU6.js +1 -0
  193. package/dist/assets/dev.generated-DYgVxL_4.js +73 -0
  194. package/dist/assets/diagrams-CaSfjT4I.js +1 -0
  195. package/dist/assets/diff-woXpYk--.js +1 -0
  196. package/dist/assets/display-OvC57CMc.js +9 -0
  197. package/dist/assets/dist-BFx3nZg4.js +2785 -0
  198. package/dist/assets/dist-xRGLOZwv.js +14 -0
  199. package/dist/assets/docs-B2aDtm5K.js +1 -0
  200. package/dist/assets/everyday-CoZa4kDZ.js +1 -0
  201. package/dist/assets/explode-WBykfhqW.js +13 -0
  202. package/dist/assets/extractNumbers-CuhagRkd.js +1 -0
  203. package/dist/assets/facts-BBTt3ImG.js +1 -0
  204. package/dist/assets/finance-Bxn_Q1p0.js +1 -0
  205. package/dist/assets/fit-0HxU-rtB.js +1 -0
  206. package/dist/assets/fitText-CDFmCQzl.js +1 -0
  207. package/dist/assets/flows-BL81J7yN.js +1 -0
  208. package/dist/assets/format-DlZTyeMy.js +1 -0
  209. package/dist/assets/format-hc2QOoIu.js +1 -0
  210. package/dist/assets/forms-DeoXOxdD.js +1 -0
  211. package/dist/assets/generate-8odaTyr4.js +17 -0
  212. package/dist/assets/generateBeats-b64CL54v.js +1 -0
  213. package/dist/assets/generateCourse-Cj_-vDWu.js +28 -0
  214. package/dist/assets/generateLive-D4B30fnF.js +52 -0
  215. package/dist/assets/geometry-DXAbnb0J.js +1 -0
  216. package/dist/assets/gesture-DabMpPcq.js +2 -0
  217. package/dist/assets/github-dark-C-LZuMrd.js +1 -0
  218. package/dist/assets/github-light-EUqPIrTm.js +1 -0
  219. package/dist/assets/githubBrowser-DywfDeYx.js +1 -0
  220. package/dist/assets/githubToken-DtcLYqwm.js +11 -0
  221. package/dist/assets/go-rLFTqkRN.js +1 -0
  222. package/dist/assets/homeTarget-BgWKI_E1.js +1 -0
  223. package/dist/assets/html-BcACZWSP.js +1 -0
  224. package/dist/assets/html-DDNsd9lV.js +1 -0
  225. package/dist/assets/http-CJCtjYpA.js +2 -0
  226. package/dist/assets/icons-CHVz6kv_.js +1 -0
  227. package/dist/assets/index-CepQEz75.css +1 -0
  228. package/dist/assets/index-y8GL67bB.js +22 -0
  229. package/dist/assets/index.es-CRLiWwiA.js +5 -0
  230. package/dist/assets/info-CiqHR5cs.js +1 -0
  231. package/dist/assets/java-BtIQNnN0.js +1 -0
  232. package/dist/assets/java-DxlWrXwe.js +1 -0
  233. package/dist/assets/javascript-BzbQS41l.js +1 -0
  234. package/dist/assets/javascript-Yelw-5ZN.js +1 -0
  235. package/dist/assets/json-B0N3XRZU.js +1 -0
  236. package/dist/assets/json-B88Oqtu5.js +1 -0
  237. package/dist/assets/json-CaljABEy.js +1 -0
  238. package/dist/assets/jspdf.es.min-C-Pf79px.js +79 -0
  239. package/dist/assets/jsx-D3KKoC5L.js +1 -0
  240. package/dist/assets/jsx-hEbJ82HF.js +1 -0
  241. package/dist/assets/jsx-runtime-DaSxXjOY.js +1 -0
  242. package/dist/assets/katex-BMCG0xok.js +257 -0
  243. package/dist/assets/keyVault-DEsNh9FR.js +1 -0
  244. package/dist/assets/kokoro-D4GKpSL0.js +1 -0
  245. package/dist/assets/kotlin-DhhofPvG.js +1 -0
  246. package/dist/assets/layout-BFQOzXtG.js +1 -0
  247. package/dist/assets/layout-CkO0Psde.js +1 -0
  248. package/dist/assets/lazyRetry-D50B1UMY.js +1 -0
  249. package/dist/assets/leaflet-src-C_xhOQY7.js +1 -0
  250. package/dist/assets/learn-DVfqN-nf.js +1 -0
  251. package/dist/assets/lib-DMAxsZKm.css +1 -0
  252. package/dist/assets/lib-VFqp6Y3w.js +1 -0
  253. package/dist/assets/links--u_phi0x.js +1 -0
  254. package/dist/assets/liveSchema-CJ49PX5R.js +98 -0
  255. package/dist/assets/markdown-BYOwaDjH.js +1 -0
  256. package/dist/assets/mastery-BPjxP0fN.js +4 -0
  257. package/dist/assets/media-CsrUl279.js +43 -0
  258. package/dist/assets/model-BE0UHu1w.js +27 -0
  259. package/dist/assets/motion-S0NRruNj.js +1 -0
  260. package/dist/assets/nav-Czm-NzPV.js +1 -0
  261. package/dist/assets/neighborhoods-C-1Tjr1r.js +1 -0
  262. package/dist/assets/notes-A9t4jdfx.css +1 -0
  263. package/dist/assets/notes-lROPCorS.js +1 -0
  264. package/dist/assets/notify-Bz4wuE4T.js +1 -0
  265. package/dist/assets/now-C9-UAzTC.js +1 -0
  266. package/dist/assets/number-DXgzss0v.js +1 -0
  267. package/dist/assets/officeDoc-B6nEhNp4.js +3 -0
  268. package/dist/assets/openchemlib-nMLMmg26.js +23 -0
  269. package/dist/assets/overlays-JxbHtA2o.js +1 -0
  270. package/dist/assets/owners-FXDGInVq.js +2 -0
  271. package/dist/assets/pageVisibility-BxUVsw7Z.js +1 -0
  272. package/dist/assets/pdf-Df7PCH7q.js +11 -0
  273. package/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
  274. package/dist/assets/penStrokes-9Q_l7NTt.js +1 -0
  275. package/dist/assets/perfProbe-COAp9PAa.js +1 -0
  276. package/dist/assets/php-CYrBA5iX.js +1 -0
  277. package/dist/assets/pickers-B4-3HOR8.js +1 -0
  278. package/dist/assets/pin-Bya3BL_a.css +1 -0
  279. package/dist/assets/pin-CXSuPJYL.js +1 -0
  280. package/dist/assets/planTracker-7AMCQPNx.js +1 -0
  281. package/dist/assets/portal-DMw7C32j.js +1 -0
  282. package/dist/assets/pptxgen.es-CvTILmV9.js +115 -0
  283. package/dist/assets/predictions-CYS7Vo39.js +1 -0
  284. package/dist/assets/prewarm--whjQhWJ.js +1 -0
  285. package/dist/assets/prism-app-CXYElq8-.css +1 -0
  286. package/dist/assets/prism.generated-BhbHDHR6.js +41 -0
  287. package/dist/assets/prismExtract.worker-Cws9K1NG.js +13 -0
  288. package/dist/assets/prismGround.worker-CIvKqxm2.js +1 -0
  289. package/dist/assets/prismLayout.worker-CZO2CY7B.js +1 -0
  290. package/dist/assets/providers-wzm7E8Pa.js +1 -0
  291. package/dist/assets/purify.es-adlwq8Pz.js +3 -0
  292. package/dist/assets/python-gzcpVVnB.js +1 -0
  293. package/dist/assets/queue-DHeyJ32F.css +1 -0
  294. package/dist/assets/queue-J4h7E3uc.js +1 -0
  295. package/dist/assets/quietHours-BvcsBKKK.js +1 -0
  296. package/dist/assets/react-BQSORdFI.js +1 -0
  297. package/dist/assets/reference-sJzyMiL4.js +1 -0
  298. package/dist/assets/registry-1GuPBfQK.js +1 -0
  299. package/dist/assets/registry-2GJZ46M8.css +1 -0
  300. package/dist/assets/registry-2v0jlh5Q.js +2 -0
  301. package/dist/assets/registry-B8DStMJk.js +1 -0
  302. package/dist/assets/registry-B940W2j5.js +1 -0
  303. package/dist/assets/registry-BAoRB8rd.css +1 -0
  304. package/dist/assets/registry-BPvIPLke.js +1 -0
  305. package/dist/assets/registry-BVHiKEwE.css +1 -0
  306. package/dist/assets/registry-BcZXBr3y.css +1 -0
  307. package/dist/assets/registry-BffpZK5w.js +1 -0
  308. package/dist/assets/registry-BgGeRiDA.js +2 -0
  309. package/dist/assets/registry-Buq5uuCv.js +1 -0
  310. package/dist/assets/registry-BzNLfje1.css +1 -0
  311. package/dist/assets/registry-C3ezxLR3.css +1 -0
  312. package/dist/assets/registry-CAusoyBh.js +1 -0
  313. package/dist/assets/registry-CEVrY72Z.js +1 -0
  314. package/dist/assets/registry-CKjKq6ct.js +1 -0
  315. package/dist/assets/registry-CNgybLQv.css +1 -0
  316. package/dist/assets/registry-CRM7y8QT.css +1 -0
  317. package/dist/assets/registry-CRisz4Ca.css +1 -0
  318. package/dist/assets/registry-Cg7qUZPS.js +1 -0
  319. package/dist/assets/registry-Cix-yqch.js +1 -0
  320. package/dist/assets/registry-CtbuZWYz.css +1 -0
  321. package/dist/assets/registry-DCI_BeFJ.js +5 -0
  322. package/dist/assets/registry-DDLSYDVA.js +1 -0
  323. package/dist/assets/registry-DI1wSG1Y.js +1 -0
  324. package/dist/assets/registry-DJinB5ye.js +2 -0
  325. package/dist/assets/registry-DUvXX_d0.js +1 -0
  326. package/dist/assets/registry-DVzLacl_.css +1 -0
  327. package/dist/assets/registry-DWcNVyI2.css +1 -0
  328. package/dist/assets/registry-D_URPoL4.js +1 -0
  329. package/dist/assets/registry-Dkc7hN5T.js +1 -0
  330. package/dist/assets/registry-DmQlNN3y.js +1 -0
  331. package/dist/assets/registry-DpaaVbmL.css +1 -0
  332. package/dist/assets/registry-Dpb8EXHn.js +49 -0
  333. package/dist/assets/registry-Dru0JcTa.css +1 -0
  334. package/dist/assets/registry-DujBAgn_.js +1 -0
  335. package/dist/assets/registry-Dye5m3qt.css +1 -0
  336. package/dist/assets/registry-GeSy4i7R.css +1 -0
  337. package/dist/assets/registry-QcULZpdE.js +4 -0
  338. package/dist/assets/registry-T3i2Q9SI.css +1 -0
  339. package/dist/assets/registry-UFIuwh3i.css +1 -0
  340. package/dist/assets/registry-Xzq_Rpmm.css +1 -0
  341. package/dist/assets/registry-ZOWzhOHk.css +1 -0
  342. package/dist/assets/registry-aIH-Im5Y.css +1 -0
  343. package/dist/assets/registry-aazwkBJp.js +1 -0
  344. package/dist/assets/registry-ei6fIgBT.css +1 -0
  345. package/dist/assets/registry-types-DMuK0vJ6.js +1 -0
  346. package/dist/assets/registry-upbw6pyj.css +1 -0
  347. package/dist/assets/registry-zRPjWNl5.js +1 -0
  348. package/dist/assets/relate-A9ZeaaAI.js +1 -0
  349. package/dist/assets/richText-BkxJhl9N.js +1 -0
  350. package/dist/assets/ruby-BhrksQMt.js +1 -0
  351. package/dist/assets/run-BYP2YlZT.js +23 -0
  352. package/dist/assets/run-C_0B_41W.js +21 -0
  353. package/dist/assets/run-DSVvshaB.js +21 -0
  354. package/dist/assets/rust-Cfkwpbl8.js +1 -0
  355. package/dist/assets/safeCssColor-di93BXgG.js +1 -0
  356. package/dist/assets/safeImageUrl-CUkucDUu.js +1 -0
  357. package/dist/assets/scale-Bcgfo6Hp.js +1 -0
  358. package/dist/assets/screen-DLR7p_yP.js +1 -0
  359. package/dist/assets/search-DnjHupRf.js +1 -0
  360. package/dist/assets/seed-b1xc0dj2.js +1 -0
  361. package/dist/assets/shapes-RqjqC0ay.js +1 -0
  362. package/dist/assets/shard000-DM_rqD7W.js +1 -0
  363. package/dist/assets/shard001-gQEQs7_F.js +1 -0
  364. package/dist/assets/shard002-DbDas-W-.js +1 -0
  365. package/dist/assets/shard003-DxMszG4_.js +1 -0
  366. package/dist/assets/shard004-DZMpLBw1.js +1 -0
  367. package/dist/assets/shard005-DLVkh9IH.js +1 -0
  368. package/dist/assets/shard006-B6efKHov.js +1 -0
  369. package/dist/assets/shard007-AFdZLe38.js +1 -0
  370. package/dist/assets/shard008-LbSBzwRx.js +1 -0
  371. package/dist/assets/shard009-D_6-SUDb.js +1 -0
  372. package/dist/assets/shard010-DbOj-uZW.js +1 -0
  373. package/dist/assets/shard011-BYSz7EEW.js +1 -0
  374. package/dist/assets/shard012-B5Ypj7OV.js +1 -0
  375. package/dist/assets/shard013-BtsliNIe.js +1 -0
  376. package/dist/assets/shard014-15sjmk68.js +1 -0
  377. package/dist/assets/shard015-nnXrqru_.js +1 -0
  378. package/dist/assets/shard016-BayXFE13.js +1 -0
  379. package/dist/assets/shard017-Cy4cGexs.js +1 -0
  380. package/dist/assets/shard018-aO-BYJ8H.js +1 -0
  381. package/dist/assets/shard019-gxaTeA3I.js +1 -0
  382. package/dist/assets/shard020-BibJdMI0.js +1 -0
  383. package/dist/assets/shard021-2FE-tze4.js +1 -0
  384. package/dist/assets/shard022-IXiyG-JK.js +1 -0
  385. package/dist/assets/shard023-314F6NJS.js +1 -0
  386. package/dist/assets/shard024-cN5rpQ_X.js +1 -0
  387. package/dist/assets/shard025-KKTaXOGE.js +1 -0
  388. package/dist/assets/shard026-C2Dkd1t6.js +1 -0
  389. package/dist/assets/shard027-Xy-8x9As.js +1 -0
  390. package/dist/assets/shard028-Bul-klUj.js +1 -0
  391. package/dist/assets/shard029-BbRSUcUZ.js +1 -0
  392. package/dist/assets/shard030-GYllsFVC.js +1 -0
  393. package/dist/assets/shard031-DMigeiyn.js +1 -0
  394. package/dist/assets/shard032-CcvmzK0l.js +1 -0
  395. package/dist/assets/shard033-11AU702M.js +1 -0
  396. package/dist/assets/shard034-Bx3urxjM.js +1 -0
  397. package/dist/assets/shard035-DBdEeyCt.js +1 -0
  398. package/dist/assets/shard036-vYgoRBqS.js +1 -0
  399. package/dist/assets/shard037-DP4MMw91.js +1 -0
  400. package/dist/assets/shard038-ffxsv7d6.js +1 -0
  401. package/dist/assets/shard039-C1JHHNp9.js +1 -0
  402. package/dist/assets/shard040-JbVvCSO_.js +1 -0
  403. package/dist/assets/shard041-5L_eFwGx.js +1 -0
  404. package/dist/assets/shard042-C9nsGL79.js +1 -0
  405. package/dist/assets/shard043-Dx_9HSKI.js +1 -0
  406. package/dist/assets/shard044-B3QQNC4A.js +1 -0
  407. package/dist/assets/shard045-B7z0WHO6.js +1 -0
  408. package/dist/assets/shard046-D1yDablJ.js +1 -0
  409. package/dist/assets/shard047-DJi3AgeT.js +1 -0
  410. package/dist/assets/shard048-D_2ipfUr.js +1 -0
  411. package/dist/assets/shard049-1aGgWZdd.js +1 -0
  412. package/dist/assets/shard050-Bjwa0Og4.js +1 -0
  413. package/dist/assets/shard051-Cx_GAk3v.js +1 -0
  414. package/dist/assets/shard052-LaeOD3V5.js +1 -0
  415. package/dist/assets/shard053-D-da7Foj.js +1 -0
  416. package/dist/assets/shard054-CM8eSRQk.js +1 -0
  417. package/dist/assets/shard055-QRpDl4Vs.js +1 -0
  418. package/dist/assets/shard056-DkY7CQm3.js +1 -0
  419. package/dist/assets/shard057-BVCgf7o0.js +1 -0
  420. package/dist/assets/shard058-93aGtdrX.js +1 -0
  421. package/dist/assets/shard059-rJE9X1_I.js +1 -0
  422. package/dist/assets/shard060-Lu_hfl1r.js +1 -0
  423. package/dist/assets/shard061-C9A8iNiq.js +1 -0
  424. package/dist/assets/shard062-BBIpEYZO.js +1 -0
  425. package/dist/assets/shard063-C_uen3Ub.js +1 -0
  426. package/dist/assets/shard064-DAHUsHST.js +1 -0
  427. package/dist/assets/shard065-C2edvdvh.js +1 -0
  428. package/dist/assets/shard066-DFcuVhZm.js +1 -0
  429. package/dist/assets/shard067-BN8DM8JZ.js +1 -0
  430. package/dist/assets/shard068-i464K77p.js +1 -0
  431. package/dist/assets/shard069-Dm9m2a5U.js +1 -0
  432. package/dist/assets/shard070-BPVvR8GH.js +1 -0
  433. package/dist/assets/shard071-Bal_0d9L.js +1 -0
  434. package/dist/assets/shard072-CBQu62kt.js +1 -0
  435. package/dist/assets/shard073-D5BRae0w.js +1 -0
  436. package/dist/assets/shard074-DtFvcBnZ.js +1 -0
  437. package/dist/assets/share-QHGHNDhQ.js +1 -0
  438. package/dist/assets/shellscript-BiGZg9Om.js +1 -0
  439. package/dist/assets/shellscript-CqHdAlCp.js +1 -0
  440. package/dist/assets/shikiHighlight-DUCYbsJ2.js +153 -0
  441. package/dist/assets/sourceHost-BV3t2XDb.js +1 -0
  442. package/dist/assets/speed-DwPw9KSv.js +1 -0
  443. package/dist/assets/spokenText-D4zPX9JY.js +1 -0
  444. package/dist/assets/sql-0Qcw9ht3.js +1 -0
  445. package/dist/assets/sql-CP0rg-5b.js +1 -0
  446. package/dist/assets/src-DbgF7cRH.js +2 -0
  447. package/dist/assets/stats-BeP5Bws0.js +1 -0
  448. package/dist/assets/status-BY02LIJt.js +1 -0
  449. package/dist/assets/stepDriver-DwjFet6U.js +1 -0
  450. package/dist/assets/store-4JNNn732.js +1 -0
  451. package/dist/assets/store-BFC7DZcg.js +1 -0
  452. package/dist/assets/store-BFrJaSxJ.js +1 -0
  453. package/dist/assets/store-DXmC_fP2.js +0 -0
  454. package/dist/assets/store-DgG0C1Qx.js +1 -0
  455. package/dist/assets/streamParse-DRgMHWye.js +2 -0
  456. package/dist/assets/student.generated-DS_acPaJ.js +1 -0
  457. package/dist/assets/swift-DonLKvLd.js +1 -0
  458. package/dist/assets/tables-Dzd3rTqG.js +1 -0
  459. package/dist/assets/time-BHTmJR1s.js +1 -0
  460. package/dist/assets/toast-BBNs2h3L.js +1 -0
  461. package/dist/assets/toml-CcmNWLt0.js +1 -0
  462. package/dist/assets/traveler.generated-Beun9X7y.js +1 -0
  463. package/dist/assets/tsx-5f3ulCja.js +1 -0
  464. package/dist/assets/tsx-BOvsFOI6.js +1 -0
  465. package/dist/assets/typeof-B5XbjTb1.js +1 -0
  466. package/dist/assets/typescript-Utq2Cl8c.js +1 -0
  467. package/dist/assets/typescript-j_1H8WHN.js +1 -0
  468. package/dist/assets/useDashboardLoop-B6ByHWoE.js +5 -0
  469. package/dist/assets/useFocusTrap-DbfG6zbM.js +1 -0
  470. package/dist/assets/useLiveConfig-X9Wxh90k.js +1 -0
  471. package/dist/assets/useSpatialCanvas-DogK9457.js +1 -0
  472. package/dist/assets/useSpotlightWalk-rMbmNBKK.js +1 -0
  473. package/dist/assets/useSrsCards-CagZefwX.js +1 -0
  474. package/dist/assets/useStudy-Bflreq2a.js +1 -0
  475. package/dist/assets/useTimeout-BRYvu2jQ.js +1 -0
  476. package/dist/assets/useValidatedImage-D2fhA198.js +1 -0
  477. package/dist/assets/useZoomGesture-CYc3tf2z.js +1 -0
  478. package/dist/assets/verbatim-CBMzUDlf.js +1 -0
  479. package/dist/assets/worker-BbLKfGzm.js +2 -0
  480. package/dist/assets/xml-WY0zc4PG.js +1 -0
  481. package/dist/assets/yaml-CxbubiML.js +1 -0
  482. package/dist/assets/yaml-DijMHRDA.js +1 -0
  483. package/dist/demo-assets/CREDITS.md +40 -0
  484. package/dist/demo-assets/images/basalt-cliffs.jpg +0 -0
  485. package/dist/demo-assets/images/capelinhos.jpg +0 -0
  486. package/dist/demo-assets/images/cliff-fields.jpg +0 -0
  487. package/dist/demo-assets/images/crater-panorama.jpg +0 -0
  488. package/dist/demo-assets/images/furnas-lake.jpg +0 -0
  489. package/dist/demo-assets/images/green-coast.jpg +0 -0
  490. package/dist/demo-assets/images/overcast-coast.jpg +0 -0
  491. package/dist/demo-assets/images/patchwork-fields.jpg +0 -0
  492. package/dist/demo-assets/images/ponta-delgada.jpg +0 -0
  493. package/dist/demo-assets/images/sete-cidades.jpg +0 -0
  494. package/dist/demo-assets/images/slide-placeholder-light.svg +9 -0
  495. package/dist/demo-assets/images/slide-placeholder.svg +9 -0
  496. package/dist/demo-assets/images/village-street.jpg +0 -0
  497. package/dist/demo-assets/pdf/cfd-primer.pdf +0 -0
  498. package/dist/demo-assets/video/azores-film.mp4 +0 -0
  499. package/dist/favicon.svg +19 -0
  500. package/dist/fonts/LICENSE.txt +34 -0
  501. package/dist/fonts/archivo-var-latin.woff2 +0 -0
  502. package/dist/fonts/bodoni-moda-400-italic-latin.woff2 +0 -0
  503. package/dist/fonts/bodoni-moda-var-latin.woff2 +0 -0
  504. package/dist/fonts/eb-garamond-var-italic-latin.woff2 +0 -0
  505. package/dist/fonts/eb-garamond-var-latin.woff2 +0 -0
  506. package/dist/fonts/export/families/archivo.css +12 -0
  507. package/dist/fonts/export/families/bodoni-moda.css +23 -0
  508. package/dist/fonts/export/families/eb-garamond.css +22 -0
  509. package/dist/fonts/export/families/ibm-plex-sans.css +12 -0
  510. package/dist/fonts/export/families/instrument-serif.css +22 -0
  511. package/dist/fonts/export/families/jetbrains-mono.css +12 -0
  512. package/dist/fonts/export/families/libre-franklin.css +12 -0
  513. package/dist/fonts/export/families/lora.css +22 -0
  514. package/dist/fonts/export/families/source-serif-4.css +12 -0
  515. package/dist/fonts/export/families/space-grotesk.css +12 -0
  516. package/dist/fonts/export/families/spectral.css +52 -0
  517. package/dist/fonts/fonts.css +141 -0
  518. package/dist/fonts/hanken-grotesk-var-latin.woff2 +0 -0
  519. package/dist/fonts/ibm-plex-sans-var-latin.woff2 +0 -0
  520. package/dist/fonts/instrument-serif-400-italic-latin.woff2 +0 -0
  521. package/dist/fonts/instrument-serif-400-latin.woff2 +0 -0
  522. package/dist/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  523. package/dist/fonts/libre-franklin-var-latin.woff2 +0 -0
  524. package/dist/fonts/lora-var-italic-latin.woff2 +0 -0
  525. package/dist/fonts/lora-var-latin.woff2 +0 -0
  526. package/dist/fonts/newsreader-var-italic-latin.woff2 +0 -0
  527. package/dist/fonts/newsreader-var-latin.woff2 +0 -0
  528. package/dist/fonts/plex-mono-400-latin.woff2 +0 -0
  529. package/dist/fonts/plex-mono-500-latin.woff2 +0 -0
  530. package/dist/fonts/plex-mono-600-latin.woff2 +0 -0
  531. package/dist/fonts/source-serif-4-var-latin.woff2 +0 -0
  532. package/dist/fonts/space-grotesk-var-latin.woff2 +0 -0
  533. package/dist/fonts/spectral-400-italic-latin.woff2 +0 -0
  534. package/dist/fonts/spectral-400-latin.woff2 +0 -0
  535. package/dist/fonts/spectral-500-italic-latin.woff2 +0 -0
  536. package/dist/fonts/spectral-500-latin.woff2 +0 -0
  537. package/dist/fonts/spectral-600-latin.woff2 +0 -0
  538. package/dist/index.html +117 -0
  539. package/dist/legal/DISCLAIMER.md +16 -0
  540. package/dist/legal/LICENSE.txt +75 -0
  541. package/dist/legal/PRIVACY.md +127 -0
  542. package/dist/legal/SECURITY.md +72 -0
  543. package/dist/legal/SUPPORT.md +13 -0
  544. package/dist/legal/TERMS.md +122 -0
  545. package/dist/legal/THIRD-PARTY.txt +639 -0
  546. package/dist/legal/TRADEMARKS.md +15 -0
  547. package/dist/ort-wasm-simd-threaded.mjs +59 -0
  548. package/dist/sw.js +30 -0
  549. package/dist/vad.worklet.bundle.min.js +1 -0
  550. package/docker-compose.yml +33 -0
  551. package/gateway/README.md +99 -0
  552. package/gateway/actions-gateway.mjs +537 -0
  553. package/gateway/connectors.d.mts +27 -0
  554. package/gateway/connectors.mjs +463 -0
  555. package/gateway/guard.mjs +110 -0
  556. package/gateway/tokenStore.mjs +134 -0
  557. package/package.json +143 -0
@@ -0,0 +1 @@
1
+ .dash-app{flex-direction:column;height:100%;display:flex;overflow-y:auto}.dash-risk-note{width:min(calc(100% - 40px), var(--canvas-col-max));flex:none;margin:12px auto 0}.dash-cta{color:var(--on-presence,#fff);background:linear-gradient(120deg, var(--presence), var(--insight));border-radius:var(--r-full);font-size:13px;font-weight:600;font-family:var(--font);cursor:pointer;box-shadow:0 6px 18px -8px color-mix(in oklab, var(--presence) 70%, transparent);transition:transform var(--m-normal) var(--ease-out), box-shadow var(--m-normal) var(--ease-out);border:none;flex:none;align-items:center;gap:8px;padding:11px 20px;text-decoration:none;display:inline-flex}.dash-cta:hover{box-shadow:0 14px 30px -12px color-mix(in oklab, var(--presence) 75%, transparent);transform:translateY(-2px)}.dash-empty{text-align:center;max-width:460px;color:var(--text-secondary);margin:40px auto}.dash-empty-title{color:var(--text-primary);margin:0 0 10px;font-size:17px;font-weight:600}.dash-empty-how{color:var(--text-muted);margin:0;font-size:13.5px;line-height:1.65}.dash-empty-how a{color:var(--presence);text-decoration:none}.dash-detail{width:min(100%, var(--canvas-col-max));flex-direction:column;gap:20px;margin:0 auto;padding:24px 26px 64px;display:flex}.dash-detail-head{border-bottom:1px solid var(--line-soft);flex-wrap:wrap;align-items:center;gap:12px;padding-bottom:14px;display:flex}.dash-back{color:var(--text-muted);flex:none;font-size:18px;line-height:1;text-decoration:none}.dash-back:hover{color:var(--text-primary)}.dash-detail-title{text-overflow:ellipsis;white-space:nowrap;min-width:40px;color:var(--text-primary);flex:0 auto;font-size:18px;font-weight:700;overflow:hidden}.dash-detail-q{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-secondary);flex:1;font-size:13px;font-style:italic;overflow:hidden}.dash-detail-clock{font-family:var(--font-data,var(--font));letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:10px;display:inline-flex}.dash-live-dot{background:var(--presence);border-radius:50%;width:6px;height:6px;animation:1.6s ease-in-out infinite dashPulse}@keyframes dashPulse{0%,to{opacity:1}50%{opacity:.3}}@media (prefers-reduced-motion:reduce){.dash-live-dot{opacity:1;animation:none}}.dash-grid{grid-template-columns:repeat(12,1fr);align-items:stretch;gap:14px;display:grid}.dash-span-1{grid-column:span 4}.dash-span-2{grid-column:span 8}.dash-span-3{grid-column:span 12}.dash-tile{flex-direction:column;min-width:0;display:flex}.dash-tile .card{margin:0}.dash-tile .card-grid,.dash-talk-answer .card-grid{grid-template-columns:1fr;gap:12px;max-width:none;margin:0}.dash-tile .card-grid>[class*=col-],.dash-talk-answer .card-grid>[class*=col-]{grid-column:1/-1}.dash-tile,.dash-tile .card-grid,.dash-tile .card-grid>[class*=col-]{height:100%}@media (width<=760px){.dash-grid{grid-template-columns:1fr}.dash-span-1,.dash-span-2,.dash-span-3{grid-column:auto}}.dash-key-nudge{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;padding:12px 16px;display:flex}.dash-key-nudge-text{color:var(--text-secondary);flex:1;min-width:220px;margin:0;font-size:13px}.dash-key-nudge-actions{flex:none;align-items:center;gap:8px;display:flex}.dash-key-nudge-keep{color:var(--on-presence,#fff);background:var(--presence);border-radius:var(--r-full);cursor:pointer;white-space:nowrap;border:none;padding:7px 14px;font-size:12.5px;font-weight:600}.dash-key-nudge-dismiss{color:var(--text-muted);border:1px solid var(--line-soft);border-radius:var(--r-full);cursor:pointer;white-space:nowrap;background:0 0;padding:7px 14px;font-size:12.5px;font-weight:600}.dash-key-nudge-dismiss:hover{color:var(--text-secondary);border-color:var(--line)}.dash-key-nudge-keep:focus-visible,.dash-key-nudge-dismiss:focus-visible{outline:2px solid var(--presence);outline-offset:2px}.dash-hero{flex-direction:column;gap:14px;display:flex}.dash-hero-top{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:12px;display:flex}.dash-hero-eyebrow{font-family:var(--font-data);letter-spacing:.08em;text-transform:uppercase;color:var(--presence);font-size:11px;font-weight:600}.dash-hero-meta{font-family:var(--font-data,var(--font));letter-spacing:.05em;text-transform:uppercase;color:var(--text-muted);text-align:right;white-space:nowrap;font-size:10.5px}.dash-hero-value-row{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.dash-hero-value{font-family:var(--font-data,var(--font));letter-spacing:-.01em;font-variant-numeric:tabular-nums;color:var(--text-primary);font-size:clamp(32px,6vw,56px);font-weight:700;line-height:1}.dash-hero-delta{font-family:var(--font-data,var(--font));font-variant-numeric:tabular-nums;border-radius:var(--r-full);flex:none;padding:4px 10px;font-size:15px;font-weight:700}.dash-hero-delta--up{color:var(--insight);background:color-mix(in oklab, var(--insight) 16%, transparent)}.dash-hero-delta--down{color:var(--danger);background:color-mix(in oklab, var(--danger) 16%, transparent)}.dash-hero-chart{width:100%;overflow:hidden}.dash-hero-chart .tile-viz-svg{height:72px}.dash-hero-chart-empty{color:var(--text-muted);margin:0;font-size:12px}.dash-lastcheck{border:1px solid color-mix(in oklab, var(--presence) 32%, var(--line));border-radius:var(--r-lg);background:linear-gradient(180deg, color-mix(in oklab, var(--presence) 7%, var(--surface-elevated)), var(--surface-elevated));padding:16px 18px}.dash-lastcheck-head{justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:8px;display:flex}.dash-lastcheck-eyebrow{letter-spacing:.1em;text-transform:uppercase;color:var(--presence);font-weight:600}.dash-lastcheck-when{color:var(--text-secondary);white-space:nowrap;font-size:11.5px}.dash-lastcheck-text{font-family:var(--font-voice,var(--font));color:var(--text-primary);margin:0;font-size:14.5px;line-height:1.5}.dash-lastcheck-sources{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}.dash-lastcheck-source{text-overflow:ellipsis;white-space:nowrap;border-radius:var(--r-full);border:1px solid var(--line);background:var(--surface-default);max-width:220px;color:var(--text-secondary);padding:3px 9px;font-size:11.5px;text-decoration:none;transition:border-color .14s,color .14s;overflow:hidden}.dash-lastcheck-source:hover{border-color:var(--presence);color:var(--text-primary)}.dash-expects{border-top:1px solid var(--line-soft);flex-direction:column;gap:8px;margin-top:14px;padding-top:14px;display:flex}.dash-expects-eyebrow{color:var(--presence);letter-spacing:.08em;text-transform:uppercase;font-weight:600}.dash-expects-text{font-family:var(--font-voice,var(--font));color:var(--text-primary);margin:0;font-size:14.5px;line-height:1.5}.dash-expects-grade{flex-direction:column;gap:4px;display:flex}.dash-expects-chip{font-family:var(--font-data,var(--font));letter-spacing:.05em;text-transform:uppercase;border-radius:var(--r-full);align-self:flex-start;padding:3px 9px;font-size:11px;font-weight:700}.dash-expects-chip.is-hit{color:var(--insight);background:color-mix(in oklab, var(--insight) 16%, transparent)}.dash-expects-chip.is-miss{color:var(--danger);background:color-mix(in oklab, var(--danger) 16%, transparent)}.dash-expects-chip.is-unclear{color:var(--warning);background:color-mix(in oklab, var(--warning) 18%, transparent)}.dash-expects-expected{font-family:var(--font-voice,var(--font));color:var(--text-secondary);margin:0;font-size:13.5px;font-style:italic;line-height:1.5}.dash-expects-note{color:var(--text-muted);margin:0;font-size:12px}.dash-expects-foot{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.dash-expects-tally,.dash-expects-label{font-family:var(--font-data,var(--font));letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);font-size:10px}.dash-cadence-card{flex-direction:column;gap:12px;display:flex}.dash-cadence-cost{color:var(--text-muted);margin:0;font-size:12px;line-height:1.5}.dash-cadence-window,.dash-cadence-oneshot{border:1px solid var(--line-soft);border-radius:var(--r-md);background:var(--surface-glass);justify-content:space-between;align-items:center;gap:10px;padding:10px 12px;display:flex}.dash-cadence-window-text{color:var(--text-secondary);margin:0;font-size:12px;line-height:1.45}.dash-cadence-clear{font-family:var(--font-data,var(--font));letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted);border:1px solid var(--line);border-radius:var(--r-full);cursor:pointer;background:0 0;flex:none;padding:5px 11px;font-size:11px;font-weight:600;transition:color .14s,border-color .14s}.dash-cadence-clear:hover{color:var(--text-primary);border-color:var(--presence)}.dash-alertcard{flex-direction:column;gap:10px;display:flex}.dash-alertcard-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.dash-alertcard-row{border-radius:var(--r-sm);align-items:center;gap:11px;padding:6px 8px;display:flex}.dash-alertcard-row.is-triggered{background:color-mix(in oklab, var(--danger) 12%, transparent)}.dash-alertcard-body{flex-direction:column;gap:2px;min-width:0;display:flex}.dash-alertcard-line{color:var(--text-primary);font-size:13px;line-height:1.4}.dash-alertcard-state{font-family:var(--font-data,var(--font));letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);font-size:10px;font-weight:600}.dash-alertcard-crossed{font-family:var(--font-data,var(--font));letter-spacing:.04em;text-transform:uppercase;color:var(--danger);font-size:10.5px;font-weight:700}.dash-detail-cols{grid-template-columns:minmax(0,1fr) minmax(260px,320px);align-items:start;gap:18px;display:grid}.dash-detail-main{flex-direction:column;gap:18px;min-width:0;display:flex}.dash-detail-section{min-width:0}.dash-detail-section-title{letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px;font-weight:600;display:block}.dash-detail-side{flex-direction:column;gap:16px;min-width:0;display:flex}@media (width<=900px){.dash-detail-cols{grid-template-columns:1fr}}.dash-talk{border-top:1px solid var(--line-soft);flex-direction:column;gap:12px;padding-top:16px;display:flex}.dash-talk-eyebrow{margin-bottom:0}.dash-talk-chips{flex-wrap:wrap;gap:8px;display:flex}.dash-talk-chip{background:var(--surface-glass);border:1px solid var(--line);border-radius:var(--r-full);max-width:min(100%,340px);color:var(--text-primary);cursor:pointer;align-items:center;gap:8px;padding:8px 13px;font-size:12.5px;transition:border-color .14s;display:inline-flex}.dash-talk-chip-t{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.dash-talk-chip:hover:not(:disabled){border-color:var(--presence)}.dash-talk-chip:disabled{opacity:.5;cursor:default}.dash-talk-chip-orb{background:radial-gradient(circle at 34% 28%, var(--presence-soft,#a9afff), var(--presence) 60%, var(--presence-deep,#3a43c9));border-radius:50%;flex:none;width:14px;height:14px}.dash-talk-ask{gap:8px;display:flex}.dash-talk-input{background:var(--surface-elevated);border:1px solid var(--line);border-radius:var(--r-full);min-width:0;font-size:14px;font-family:var(--font);color:var(--text-primary);flex:1;padding:12px 18px}.dash-talk-input:focus{border-color:var(--presence);outline:none}.dash-talk-send{background:linear-gradient(120deg, var(--presence), var(--insight));color:var(--on-presence,#fff);border-radius:var(--r-full);cursor:pointer;border:none;flex:none;padding:12px 20px;font-size:13px;font-weight:600}.dash-talk-send:disabled{opacity:.5;cursor:default}.dash-talk-gate,.dash-talk-error{color:var(--text-secondary);font-size:13px;line-height:1.55}.dash-talk-gate a,.dash-talk-error a,.dash-detail-q a{color:var(--presence);text-decoration:none}.dash-talk-answer{border:1px solid var(--line-soft);background:var(--surface-elevated);border-radius:14px;flex-direction:column;gap:10px;padding:14px;display:flex}.dash-talk-q{color:var(--text-secondary);font-size:13px;font-style:italic;font-weight:600}.dash-talk-narration{color:var(--text-primary);margin:0;font-size:13.5px;line-height:1.55}.dash-talk-thinking{color:var(--text-muted);font-size:13px}.xt-scrim{z-index:50;background:color-mix(in oklab, var(--surface-deep,#000) 64%, transparent);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);justify-content:center;align-items:center;padding:28px;display:flex;position:fixed;inset:0}.xt-modal{background:var(--surface-elevated);border:1px solid var(--line);width:min(100%,920px);max-height:88vh;box-shadow:var(--shadow-modal);border-radius:18px;flex-direction:column;display:flex;overflow:hidden}.xt-head{border-bottom:1px solid var(--line-soft);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.xt-head-title{color:var(--text-primary);font-size:15px;font-weight:700}.xt-close{border-radius:var(--r-sm);background:var(--surface-glass);width:28px;height:28px;color:var(--text-muted);cursor:pointer;border:none;flex:none;font-size:17px;line-height:1}.xt-close:hover{color:var(--text-primary)}.xt-empty,.xt-loading{text-align:center;color:var(--text-secondary);padding:40px 28px;font-size:14px}.xt-empty a,.xt-comp-body a{color:var(--presence);text-decoration:none}.xt-split{grid-template-columns:1fr 1.2fr;min-height:0;display:grid;overflow:hidden}.xt-left,.xt-right{flex-direction:column;gap:11px;padding:18px 20px;display:flex;overflow-y:auto}.xt-left{border-right:1px solid var(--line-soft);background:var(--surface-glass)}.xt-section-label{font-family:var(--font-data,var(--font));letter-spacing:.14em;text-transform:uppercase;color:var(--text-muted);font-size:9.5px;font-weight:600}.xt-line{color:var(--text-secondary);overflow-wrap:anywhere;margin:0;font-size:13px;line-height:1.6}.xt-hl{background:color-mix(in oklab, var(--hl,var(--presence)) 18%, transparent);color:var(--text-primary);border-radius:4px;padding:1px 3px;position:relative}.xt-goal{--hl:var(--presence)}.xt-risk{--hl:var(--warning)}.xt-metric{--hl:var(--insight)}.xt-tag{font-family:var(--font-data,var(--font));letter-spacing:.1em;color:var(--hl,var(--presence));vertical-align:middle;margin-left:5px;font-size:7.5px;font-weight:700}.xt-comp{border:1px solid var(--line-soft);border-radius:var(--r-md);overflow:hidden}.xt-comp.xt-off{opacity:.5}.xt-comp-head{background:color-mix(in oklab, var(--hl,var(--presence)) 12%, transparent);justify-content:space-between;align-items:center;gap:10px;padding:9px 12px;display:flex}.xt-comp--goal{--hl:var(--presence)}.xt-comp--risk{--hl:var(--warning)}.xt-comp--metric{--hl:var(--insight)}.xt-comp-kind{font-family:var(--font-data,var(--font));letter-spacing:.1em;color:var(--hl,var(--presence));font-size:9px;font-weight:700}.xt-comp-toggle{border-radius:var(--r-sm);cursor:pointer;background:var(--surface-glass);color:var(--text-secondary);border:none;padding:4px 10px;font-size:11px;font-weight:600}.xt-comp-body{color:var(--text-primary);overflow-wrap:anywhere;padding:10px 12px;font-size:12.5px;line-height:1.5}.dash-plan-estimate{font-family:var(--font-data,var(--font));letter-spacing:.02em;color:var(--text-muted);margin:0;font-size:11px}.xt-build-row{gap:10px;margin-top:4px;display:flex}.xt-name{border:1.5px solid var(--presence);min-width:0;font-size:14px;font-weight:600;font-family:var(--font);background:var(--surface-default);color:var(--text-primary);border-radius:10px;flex:1;padding:10px 14px}.xt-name:focus{outline:none}.xt-build{cursor:pointer;background:var(--presence);color:var(--on-presence,#fff);border:none;border-radius:10px;flex:none;padding:10px 18px;font-size:13px;font-weight:700}@media (width<=720px){.xt-split{grid-template-columns:1fr}.xt-left{border-right:none;border-bottom:1px solid var(--line-soft)}}.dash-settings{flex-direction:column;gap:20px;width:min(100%,1180px);margin:0 auto;padding:24px 26px 64px;display:flex}.dash-gear{color:var(--text-muted);flex:none;font-size:15px;line-height:1;text-decoration:none}.dash-gear:hover{color:var(--text-primary)}.dash-settings-grid{grid-template-columns:1.4fr 1fr;align-items:start;gap:18px;display:grid}.dash-settings-cols{flex-direction:column;gap:16px;display:flex}.dash-set-card{flex-direction:column;gap:12px;display:flex}.dash-set-blurb{color:var(--text-muted);margin:0;font-size:12.5px;line-height:1.5}.dash-seg{flex-wrap:wrap;gap:7px;display:flex}.dash-seg-opt{color:var(--text-secondary);background:var(--surface-glass);border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;font-size:12.5px;font-weight:600;font-family:var(--font);padding:7px 13px;transition:color .14s,background .14s,border-color .14s}.dash-seg-opt:hover{border-color:var(--presence)}.dash-seg-opt.is-active{color:var(--on-presence,#fff);background:var(--presence);border-color:var(--presence)}.dash-switch{border-radius:var(--r-full);background:var(--track,var(--line));flex:none;width:42px;height:24px;transition:background .16s;position:relative}.dash-switch.on{background:var(--insight)}.dash-switch-knob{background:#fff;border-radius:50%;width:20px;height:20px;transition:transform .16s;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #00000040}.dash-switch.on .dash-switch-knob{transform:translate(18px)}.dash-set-alerts{flex-direction:column;gap:8px;display:flex}.dash-check{cursor:pointer;text-align:left;font-family:var(--font);background:0 0;border:none;align-items:center;gap:11px;padding:4px 0;display:flex}.dash-check.disabled{cursor:default;opacity:.6}.dash-check-box{border-radius:var(--r-sm);border:1px solid var(--line);width:20px;height:20px;color:var(--on-presence,#fff);flex:none;justify-content:center;align-items:center;font-size:12px;display:flex}.dash-check.on .dash-check-box{background:var(--presence);border-color:var(--presence)}.dash-check-text{flex-direction:column;display:flex}.dash-check-label{color:var(--text-primary);font-size:13px}.dash-check-note{color:var(--text-muted);font-size:11px}.dash-alert-test-row{flex-wrap:wrap;align-items:baseline;gap:8px;margin:2px 0 2px 31px;display:flex}.dash-alert-test{font:600 var(--fs-2xs) / 1 var(--font);color:var(--presence);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:0}.dash-alert-test-note{font-size:var(--fs-2xs);color:var(--text-muted);max-width:320px;line-height:1.5}.dash-usage{top:calc(var(--bar-h) + 10px);flex-direction:column;gap:12px;display:flex;position:sticky}.dash-usage-band{font-family:var(--font-data,var(--font));letter-spacing:.04em;color:var(--insight);font-size:13px;font-weight:700}.dash-usage--none{color:var(--text-muted)}.dash-usage--minimal,.dash-usage--light{color:var(--insight)}.dash-usage--moderate{color:var(--warning)}.dash-usage--frequent{color:var(--danger)}.dash-usage-rows{border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);flex-direction:column;gap:8px;padding:12px 0;display:flex}.dash-usage-row{color:var(--text-secondary);justify-content:space-between;align-items:baseline;gap:12px;font-size:12.5px;display:flex}.dash-usage-val{font-family:var(--font-data,var(--font));color:var(--text-primary);text-align:right;font-size:11.5px}.dash-usage-warning{color:var(--text-muted);margin:0;font-size:12px;line-height:1.55}.dash-usage-done{text-align:center;color:var(--on-presence,#fff);background:var(--presence);border-radius:11px;margin-top:2px;padding:11px;font-size:13px;font-weight:600;text-decoration:none}@media (width<=760px){.dash-settings-grid{grid-template-columns:1fr}.dash-usage{position:static}}.dash-edit-btn{color:var(--presence);background:color-mix(in oklab, var(--presence) 12%, transparent);border:1px solid color-mix(in oklab, var(--presence) 35%, transparent);border-radius:var(--r-sm);cursor:pointer;font-size:12px;font-weight:600;font-family:var(--font);flex:none;padding:6px 13px}.dash-edit-btn.is-active{color:var(--on-presence,#fff);background:var(--presence);border-color:var(--presence)}.dash-refresh-btn,.dash-read-btn{align-items:center;gap:6px;display:inline-flex}.dash-refresh-btn:disabled,.dash-read-btn:disabled{cursor:default;opacity:.7}.dash-refresh-btn svg,.dash-read-btn svg{width:13px;height:13px}.dash-read-btn{color:var(--presence)}.dash-refresh-spin{animation:.8s linear infinite dash-refresh-spin}@keyframes dash-refresh-spin{to{transform:rotate(360deg)}}.dash-refresh-hint{color:var(--text-muted);flex:none;font-size:11px}.dash-edit-bar{border:1px solid color-mix(in oklab, var(--presence) 28%, transparent);background:color-mix(in oklab, var(--presence) 8%, transparent);border-radius:var(--r-md);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;display:flex;position:relative}.dash-edit-hint{color:var(--text-secondary);font-size:12.5px}.dash-edit-add{color:var(--on-presence,#fff);background:var(--presence);border-radius:var(--r-sm);cursor:pointer;font-size:12px;font-weight:600;font-family:var(--font);border:none;flex:none;padding:7px 14px}.dash-palette{z-index:6;background:var(--surface-elevated);border:1px solid var(--line);border-radius:var(--r-md);min-width:180px;box-shadow:var(--shadow-modal);flex-direction:column;gap:2px;padding:6px;display:flex;position:absolute;top:calc(100% + 6px);right:14px}.dash-palette-item{text-align:left;color:var(--text-primary);border-radius:var(--r-sm);cursor:pointer;font-size:13px;font-family:var(--font);background:0 0;border:none;padding:9px 11px}.dash-palette-item:hover{background:var(--surface-glass)}.dash-tile--editing{border:1.5px dashed color-mix(in oklab, var(--presence) 45%, transparent);border-radius:18px;padding:2px;position:relative}.dash-tile--dragging{opacity:.55}.dash-tile-chrome{z-index:3;background:color-mix(in oklab, var(--surface-elevated) 92%, var(--presence));border-radius:var(--r-lg) var(--r-lg) 0 0;justify-content:space-between;align-items:center;gap:8px;padding:5px 8px;display:flex;position:absolute;top:-1px;left:-1px;right:-1px}.dash-tile-handle{cursor:grab;color:var(--text-muted);border-radius:var(--r-sm);touch-action:none;-webkit-user-select:none;user-select:none;padding:2px 6px;font-size:13px}.dash-tile-handle:hover{color:var(--text-primary);background:var(--surface-glass)}.dash-tile-ctrls{align-items:center;gap:6px;display:inline-flex}.dash-tile-size{font-family:var(--font-data,var(--font));color:var(--presence);background:color-mix(in oklab, var(--presence) 14%, transparent);border-radius:var(--r-sm);cursor:pointer;border:none;padding:3px 8px;font-size:10px;font-weight:700}.dash-tile-x{width:22px;height:22px;color:var(--danger);background:color-mix(in oklab, var(--danger) 12%, transparent);border-radius:var(--r-sm);cursor:pointer;border:none;justify-content:center;align-items:center;font-size:13px;display:inline-flex}.dash-tile--editing .card{margin-top:30px}.dash-overview{width:min(100%, var(--canvas-col-max));flex-direction:column;gap:36px;margin:0 auto;padding:36px 26px 72px;display:flex}.dash-ov-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px;font-size:11px;font-weight:600}.dash-ov-title{font-family:var(--font-voice,var(--font));letter-spacing:-.02em;color:var(--text-primary);margin:0;font-size:34px;font-weight:600;line-height:1.18}.dash-ov-lede{color:var(--text-secondary);max-width:660px;margin:12px 0 0;font-size:14.5px;line-height:1.6}.dash-ov-cta{align-items:center;gap:16px;margin-top:20px;display:flex}.dash-ov-link{color:var(--presence);font-size:13px;font-weight:600;text-decoration:none}.dash-ov-label{font-family:var(--font-data,var(--font));letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);margin-bottom:16px;font-size:10px;font-weight:600}.dash-ov-steps{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;display:grid}.dash-ov-step,.dash-ov-layer{border:1px solid var(--line-soft);border-radius:var(--r-md);background:var(--surface-elevated);gap:12px;padding:16px;display:flex}.dash-ov-step-n{border-radius:var(--r-sm);width:24px;height:24px;font-family:var(--font-data,var(--font));color:var(--presence);background:color-mix(in oklab, var(--presence) 14%, transparent);flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:flex}.dash-ov-step-text{flex-direction:column;gap:4px;min-width:0;display:flex}.dash-ov-step-title{color:var(--text-primary);font-size:13.5px;font-weight:700}.dash-ov-step-body{color:var(--text-muted);font-size:12.5px;line-height:1.55}.dash-ov-layers{flex-direction:column;gap:12px;display:flex}.dash-ov-layer-tag{font-family:var(--font-data,var(--font));letter-spacing:.08em;color:var(--tag,var(--presence));background:color-mix(in oklab, var(--tag,var(--presence)) 14%, transparent);border-radius:var(--r-sm);flex:none;align-self:flex-start;padding:4px 8px;font-size:9px;font-weight:700}.dash-ov-note{color:var(--text-muted);margin:16px 0 0;font-size:12.5px;font-style:italic;line-height:1.6}.xt-fold{border-top:1px solid var(--line-soft);margin-top:14px;padding-top:12px}.xt-fold-label{color:var(--text-muted);margin-bottom:8px;font-size:12px;font-style:italic}.xt-fold-chips{flex-wrap:wrap;gap:8px;display:flex}.xt-fold-chip{color:var(--text-primary);background:var(--surface-glass);border:1px solid var(--line);border-radius:var(--r-full);cursor:pointer;font-size:12px;font-weight:600;font-family:var(--font);padding:7px 13px;transition:border-color .14s}.xt-fold-chip:hover{border-color:var(--insight)}.xt-fold-chip.xt-fold-armed{color:var(--warning);background:color-mix(in oklab, var(--warning) 14%, var(--surface-glass));border-color:color-mix(in oklab, var(--warning) 50%, var(--line))}.dash-fill{align-items:center;gap:6px;margin-top:8px;display:flex}.dash-fill-input{background:var(--surface-elevated);border:1px solid var(--line);min-width:0;font-size:12.5px;font-family:var(--font);color:var(--text-primary);border-radius:9px;flex:1;padding:7px 11px}.dash-fill-input:focus{border-color:var(--presence);outline:none}.dash-fill-unit{color:var(--text-muted);flex:none;font-size:12px}.dash-fill-save{font-size:12px;font-weight:600;font-family:var(--font);cursor:pointer;color:var(--on-presence,#fff);background:var(--presence);border:none;border-radius:9px;flex:none;padding:7px 13px}.dash-fill-save:disabled{opacity:.5;cursor:default}.dash-set-danger{border-color:color-mix(in oklab, var(--danger) 30%, var(--line-soft))}.dash-del-btn{border:1px solid color-mix(in oklab, var(--danger) 40%, transparent);background:color-mix(in oklab, var(--danger) 10%, transparent);color:var(--danger);font-size:13px;font-weight:600;font-family:var(--font);cursor:pointer;border-radius:9px;align-self:flex-start;padding:8px 14px;transition:background .14s,color .14s}.dash-del-btn.armed{background:var(--danger);color:var(--on-presence,#fff)}.dash-talk-pin{border:1px solid color-mix(in oklab, var(--insight) 40%, transparent);background:color-mix(in oklab, var(--insight) 10%, transparent);color:var(--insight);font-size:12.5px;font-weight:600;font-family:var(--font);cursor:pointer;border-radius:9px;align-self:flex-start;margin-top:4px;padding:7px 13px}.dash-talk-pin:hover{background:color-mix(in oklab, var(--insight) 16%, transparent)}.dash-talk-pinned{color:var(--insight);align-self:flex-start;margin-top:4px;font-size:12.5px;font-weight:600}.xt-pick{border-bottom:1px solid var(--line-soft);background:var(--surface-glass);flex-wrap:wrap;align-items:center;gap:10px;padding:10px 20px;display:flex}.xt-pick-label{font-family:var(--font-data,var(--font));letter-spacing:.12em;text-transform:uppercase;color:var(--text-muted);font-size:9.5px;font-weight:600}.xt-pick-chips{flex-wrap:wrap;gap:7px;min-width:0;display:flex}.xt-pick-chip{text-overflow:ellipsis;white-space:nowrap;max-width:220px;color:var(--text-secondary);background:var(--surface-elevated);border:1px solid var(--line);border-radius:var(--r-full);cursor:pointer;font-size:12px;font-weight:600;font-family:var(--font);padding:6px 12px;overflow:hidden}.xt-pick-chip.is-active{color:var(--on-presence,#fff);background:var(--presence);border-color:var(--presence)}.xt-cadence-pick{background:0 0;border-bottom:none;flex-direction:column;align-items:flex-start;gap:8px;padding:0}.dash-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tpl-back{color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:600;font-family:var(--font);background:0 0;border:none;padding:0}.tpl-back:hover{color:var(--text-primary)}.tpl-grid{grid-template-columns:repeat(2,1fr);gap:12px;padding:20px;display:grid;overflow-y:auto}.tpl-tile{text-align:left;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-glass);cursor:pointer;font-family:var(--font);flex-direction:column;align-items:flex-start;gap:6px;padding:16px 18px;transition:border-color .14s,background .14s;display:flex}.tpl-tile:hover{border-color:var(--presence);background:color-mix(in oklab, var(--presence) 6%, var(--surface-glass))}.tpl-tile-label{color:var(--text-primary);font-size:14px;font-weight:700}.tpl-tile-blurb{color:var(--text-secondary);font-size:12px;line-height:1.45}@media (width<=640px){.tpl-grid{grid-template-columns:1fr}}.tpl-form{flex-direction:column;gap:16px;padding:20px;display:flex;overflow-y:auto}.tpl-field{flex-direction:column;gap:6px;display:flex}.tpl-chip-group{flex-direction:column;gap:8px;display:flex}.tpl-chips{flex-wrap:wrap;gap:8px;display:flex}.tpl-chip{border:1px solid var(--line);border-radius:var(--r-full);background:var(--surface-elevated);cursor:pointer;font-family:var(--font);align-items:center;gap:7px;padding:6px 12px;transition:opacity .14s,border-color .14s;display:flex}.tpl-chip.xt-comp--metric{border-color:color-mix(in oklab, var(--insight) 35%, var(--line))}.tpl-chip.xt-comp--risk{border-color:color-mix(in oklab, var(--warning) 35%, var(--line))}.tpl-chip.xt-comp--goal{border-color:color-mix(in oklab, var(--presence) 35%, var(--line))}.tpl-chip.tpl-chip-off{opacity:.5}.tpl-chip-kind{font-family:var(--font-data,var(--font));letter-spacing:.1em;color:var(--hl,var(--presence));font-size:8.5px;font-weight:700}.tpl-chip-label{color:var(--text-primary);font-size:12px;font-weight:600}.tpl-chip-state{color:var(--text-muted);font-size:10.5px}.tpl-create{cursor:pointer;font-size:13px;font-weight:700;font-family:var(--font);color:var(--on-presence,#fff);background:var(--presence);border:none;border-radius:10px;padding:10px 18px}.tpl-create:disabled{opacity:.5;cursor:default}.tpl-interstitial{flex-direction:column;gap:14px;padding:28px 24px;display:flex}.tpl-interstitial-text{color:var(--text-primary);margin:0;font-size:14px;line-height:1.6}.tpl-interstitial-actions{flex-wrap:wrap;gap:10px;display:flex}.tpl-fold-btn{cursor:pointer;font-size:13px;font-weight:700;font-family:var(--font);color:var(--on-presence,#fff);background:var(--presence);border:none;border-radius:10px;padding:10px 16px}.tpl-create-anyway{border:1px solid var(--line);cursor:pointer;font-size:13px;font-weight:600;font-family:var(--font);color:var(--text-secondary);background:var(--surface-glass);border-radius:10px;padding:10px 16px}.tpl-ask-row{gap:10px;display:flex}.tpl-ask-input{border-radius:var(--r-full);flex:1;min-width:0;padding:14px 20px;font-size:15px}.tpl-examples{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.tpl-example-chip{border:1px solid var(--line);border-radius:var(--r-full);font-size:12.5px;font-weight:500;font-family:var(--font);color:var(--text-secondary);background:var(--surface-glass);cursor:pointer;transition:color var(--m-fast) var(--ease-out), border-color var(--m-fast) var(--ease-out), background var(--m-fast) var(--ease-out);padding:7px 14px}.tpl-example-chip:hover{color:var(--text-primary);border-color:var(--line-strong);background:var(--surface-glass-strong)}.tpl-example-chip:disabled{opacity:.5;cursor:default}.tpl-gate-note{color:var(--text-muted);margin:14px 0 0;font-size:12.5px;line-height:1.6}.tpl-cadence-note{font-family:var(--font-data,var(--font));letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);align-self:center;margin-right:auto;font-size:10px}
@@ -0,0 +1 @@
1
+ function e(e){return e.due>0?`${e.due} card${e.due===1?``:`s`} due`:`${e.total} card${e.total===1?``:`s`} saved`}export{e as t};
@@ -0,0 +1 @@
1
+ function e(e,t){return e.map(e=>{let n=t.direct[e.id];if(n)return{feature:e,available:!0,run:n,watch:e.tourChapter?t.watchInLive(e.tourChapter):void 0};if(e.tourChapter){let n=t.watchInLive(e.tourChapter);return{feature:e,available:!0,run:n,watch:n}}return{feature:e,available:!1,reason:`Opens in Live`,run:t.enterLive}})}export{e as t};
@@ -0,0 +1,73 @@
1
+ var e=1,t=`dev`,n=1784149692057,r=`gemini-3.5-flash`,i=[{question:`Explain how OAuth login works, step by step. I'm adding it to our app.`,narration:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials…`,mode:`replace`,tour:[{index:1,say:`The core of the process is the Authorization Code flow. It starts with a redirect, gets user consent, and returns a temporary code.`,mark:{kind:`frame`,at:`Redirect user to the Identity Provider`},marks:[{kind:`frame`,at:`Redirect user to the Identity Provider`},{kind:`frame`,at:`Receive the authorization code`}]},{index:2,say:`Next, your backend swaps that temporary code for an access token using a secure POST request.`,mark:{kind:`underline`,at:`grant_type=authorization_code`},marks:[{kind:`underline`,at:`grant_type=authorization_code`},{kind:`highlight`,at:`access_token`}]},{index:5,say:`Before you ship, make sure you check off these security essentials, especially securing your redirect URIs and client secrets.`,mark:{kind:`check`,at:`Strictly validate redirect URIs on the provider dashboard (no wildcards)`},marks:[{kind:`check`,at:`Strictly validate redirect URIs on the provider dashboard (no wildcards)`},{kind:`check`,at:`Store client secrets securely in environment variables, never in client-side cod`}]}],spec:{id:`live`,workspace:`Live`,title:`OAuth 2.0 Login Flow`,sub:`The step-by-step authorization code flow for your app.`,opener:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials…`,context:[],blocks:[{type:`insight`,col:5,delay:0,id:`live-1`,num:`1`,props:{title:`Delegated Authorization, Not Just Login`,summary:`OAuth 2.0 is designed to let a third-party application access resources without exposing user credentials. When used for login, we typically layer OpenID Connect on top to get profile data.`,stat:`OAuth 2.0`,conf:`inferred`},note:`OAuth is about delegation — letting your app get a key to the front door without ever seeing the user's master password.`,section:`The Core Concept`,order:1,depth:1},{type:`howtosteps`,col:7,delay:70,props:{title:`The Authorization Code Flow`,steps:[{action:`Redirect user to the Identity Provider`,detail:`Send the user to the provider's authorization endpoint with your client ID, requested scopes, and a redirect URI.`,tip:`Always include a random 'state' parameter or use PKCE to prevent cross-site request forgery.`,check:`User sees the provider's login screen`},{action:`User grants permission`,detail:`The user authenticates with the provider (e.g., Google or GitHub) and consents to the permissions your app requested.`,check:`User clicks 'Authorize'`},{action:`Receive the authorization code`,detail:`The provider redirects the user back to your registered Redirect URI, appending a temporary 'code' in the query string.`,tip:`This code is short-lived, usually expiring in under 10 minutes.`,check:`Your backend endpoint receives the GET request`},{action:`Exchange code for an Access Token`,detail:`Your backend makes a secure POST request to the provider's token endpoint, sending the code, client ID, and client secret.`,check:`Provider returns an access token and ID token`},{action:`Fetch user profile data`,detail:`Use the access token in the Authorization header to request the user's profile details from the provider's UserInfo endpoint.`,check:`You have the user's email and unique ID to log them in`}],time:`5 steps`,difficulty:`medium`,tools:[`Client ID & Secret`,`Redirect URI`,`Authorization Server`]},id:`live-2`,note:`This five-step dance ensures that your client secret is never exposed to the user's browser.`,section:`The OAuth Flow`,order:2,depth:1},{type:`terminal`,col:12,delay:140,props:{lines:[{kind:`comment`,text:`Exchange the temporary authorization code for an access token`},{kind:`command`,text:`curl -X POST https://oauth2.googleapis.com/token \\
2
+ -d code=4/0AeaYSH... \\
3
+ -d client_id=YOUR_CLIENT_ID \\
4
+ -d client_secret=YOUR_CLIENT_SECRET \\
5
+ -d redirect_uri=https://myapp.com/callback \\
6
+ -d grant_type=authorization_code`},{kind:`stdout`,text:`{
7
+ "access_token": "ya29.a0AfH6SM...",
8
+ "expires_in": 3599,
9
+ "scope": "openid email profile",
10
+ "token_type": "Bearer",
11
+ "id_token": "eyJhbGciOiJSUzI1NiIs..."`}],title:`Step 4: The Token Exchange Request`,prompt:`backend-server $`,exitCode:0,caption:`This POST request must happen strictly server-to-server to protect your client secret.`},id:`live-3`,note:`Your server swaps the temporary code for a bearer token behind the scenes, keeping your client secret completely hidden.`,section:`The Token Exchange`,order:3,depth:1},{type:`codeblock`,col:12,delay:210,props:{title:`Handling the Callback in Express`,code:`router.get('/callback', async (req, res) => {
12
+ const { code, state } = req.query;
13
+
14
+ // 1. Verify state to prevent CSRF
15
+ if (state !== req.session.state) {
16
+ return res.status(400).send('State mismatch. Potential CSRF.');
17
+ }
18
+
19
+ // 2. Exchange code for tokens
20
+ const tokenResponse = await axios.post('https://oauth2.googleapis.com/token', {
21
+ code,
22
+ client_id: process.env.CLIENT_ID,
23
+ client_secret: process.env.CLIENT_SECRET,
24
+ redirect_uri: process.env.REDIRECT_URI,
25
+ grant_type: 'authorization_code'
26
+ });
27
+
28
+ const { access_token, id_token } = tokenResponse.data;
29
+ // 3. Use access_token to fetch user profile...
30
+ });`,lang:`javascript`,filename:`auth-router.js`,lineNumbers:!0,footer:`Always validate the state parameter before making the token exchange.`},id:`live-4`,note:`In code, the callback route is where you intercept the code, verify the state parameter, and perform the secure POST exchange.`,section:`The Token Exchange`,order:3,depth:2,facet:`example`},{type:`compare`,col:12,delay:280,props:{options:[{name:`OAuth 2.0`,sub:`Authorization framework`},{name:`OIDC (OpenID Connect)`,sub:`Identity layer on OAuth 2.0`,pick:!0}],criteria:[{label:`Primary Purpose`,cells:[{v:`Delegated access (API permissions)`},{v:`User authentication (Who is logging in)`,win:!0}]},{label:`Key Token Issued`,cells:[{v:`Access Token (opaque string or JWT)`},{v:`ID Token (standardized JWT)`,win:!0}]},{label:`Standard UserInfo Endpoint`,cells:[{v:`No (provider-specific)`},{v:`Yes (standardized profile claims)`,win:!0}]}],eyebrow:`Protocol Comparison`,recommendation:`For user login, always use OpenID Connect (OIDC) so you get a standardized ID token containing the user's profile.`},id:`live-5`,note:`While OAuth handles the permissions, OpenID Connect is what actually gives you the standardized ID token containing the user's profile.`,section:`OAuth vs. OIDC`,order:4,depth:1},{type:`checklist`,col:6,delay:350,props:{rows:[{t:`Use HTTPS everywhere to protect tokens in transit`,st:`todo`},{t:`Implement PKCE (Proof Key for Code Exchange) even for confidential backends`,st:`doing`},{t:`Strictly validate redirect URIs on the provider dashboard (no wildcards)`,st:`todo`},{t:`Store client secrets securely in environment variables, never in client-side code`,st:`todo`},{t:`Set short expiration times on access tokens and use secure HttpOnly cookies for sessions`,st:`todo`}],title:`OAuth Security Checklist`,footer:`A single leaked client secret or open redirect can compromise your entire user base.`},id:`live-6`,note:`Security is paramount here — make sure your redirect URIs are strictly matched and your client secrets are never exposed.`,section:`Implementation Checklist`,order:5,depth:1},{type:`breakdown`,col:6,delay:420,props:{title:`Common Implementation Pitfalls`,rows:[{name:`Exposing Client Secret`,val:`Critical Risk`,pct:36,hot:!0,tag:`Security`},{name:`Missing State/PKCE Validation`,val:`CSRF Vulnerability`,pct:27,tag:`Security`},{name:`Permissive Redirect URIs`,val:`Token Hijacking`,pct:21,tag:`Configuration`},{name:`Storing Tokens in LocalStorage`,val:`XSS Risk`,pct:16,tag:`Storage`}]},id:`live-7`,note:`The biggest mistake is putting the client secret in a mobile app or frontend code — it must live strictly on your secure server.`,section:`Common Pitfalls`,order:6,depth:1}],proof:null,topic:`Technology`,extras:{},group:`home`,suggests:[{label:`What is PKCE and how does it work?`,icon:`chat`,route:`What is PKCE and how does it work?`},{label:`How do I handle refresh tokens securely?`,icon:`chat`,route:`How do I handle refresh tokens securely?`},{label:`What is the difference between ID tokens and Access tokens?`,icon:`chat`,route:`What is the difference between ID tokens and Access tokens?`},{label:`How do I implement this with Passport.js?`,icon:`chat`,route:`How do I implement this with Passport.js?`}],keywords:[]},at:1784149672569},{question:`Compare session cookies and JWTs for keeping users signed in. Focus on tradeoffs, not dogma.`,narration:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials.`,mode:`augment`,tour:[{index:7,say:`First, let's look at the Authorization Code flow. It starts with a redirect to the identity provider and ends with your backend exchanging a code for tokens.`,mark:{kind:`bracket`,at:`Step 1`,to:`Step 4`,label:`Authorization Flow`}},{index:8,say:`This is what the actual token exchange request looks like. Notice how the authorization code and code verifier are sent securely from your backend.`,mark:{kind:`underline`,at:`code_verifier`},marks:[{kind:`underline`,at:`code_verifier`},{kind:`underline`,at:`access_token`}]},{index:9,say:`Once you have the tokens, you must decide how to keep the user logged in. Session cookies offer instant revocation, while JWTs are stateless.`,mark:{kind:`circle`,at:`Session Cookies`,color:`key`},marks:[{kind:`circle`,at:`Session Cookies`,color:`key`},{kind:`circle`,at:`JSON Web Tokens (JWT)`,color:`cool`}]},{index:10,say:`For storage, avoid LocalStorage due to XSS risks. An HttpOnly, Secure cookie with SameSite protection is the safest place for web apps.`,mark:{kind:`strike`,at:`LocalStorage / SessionStorage`,color:`cool`},marks:[{kind:`strike`,at:`LocalStorage / SessionStorage`,color:`cool`},{kind:`check`,at:`HttpOnly, Secure, SameSite Cookie`}]}],spec:{id:`live`,workspace:`Live`,title:`OAuth 2.0 Authorization Code Flow`,sub:`Step-by-step implementation guide and token comparison.`,opener:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials.`,context:[],blocks:[{type:`insight`,col:5,delay:0,id:`live-1`,num:`1`,props:{title:`Delegated Authorization, Not Just Login`,summary:`OAuth 2.0 is designed to let a third-party application access resources without exposing user credentials. When used for login, we typically layer OpenID Connect on top to get profile data.`,stat:`OAuth 2.0`,conf:`inferred`},note:`OAuth is about delegation — letting your app get a key to the front door without ever seeing the user's master password.`,section:`The Core Concept`,order:1,depth:1},{type:`howtosteps`,col:7,delay:70,props:{title:`The Authorization Code Flow`,steps:[{action:`Redirect user to the Identity Provider`,detail:`Send the user to the provider's authorization endpoint with your client ID, requested scopes, and a redirect URI.`,tip:`Always include a random 'state' parameter or use PKCE to prevent cross-site request forgery.`,check:`User sees the provider's login screen`},{action:`User grants permission`,detail:`The user authenticates with the provider (e.g., Google or GitHub) and consents to the permissions your app requested.`,check:`User clicks 'Authorize'`},{action:`Receive the authorization code`,detail:`The provider redirects the user back to your registered Redirect URI, appending a temporary 'code' in the query string.`,tip:`This code is short-lived, usually expiring in under 10 minutes.`,check:`Your backend endpoint receives the GET request`},{action:`Exchange code for an Access Token`,detail:`Your backend makes a secure POST request to the provider's token endpoint, sending the code, client ID, and client secret.`,check:`Provider returns an access token and ID token`},{action:`Fetch user profile data`,detail:`Use the access token in the Authorization header to request the user's profile details from the provider's UserInfo endpoint.`,check:`You have the user's email and unique ID to log them in`}],time:`5 steps`,difficulty:`medium`,tools:[`Client ID & Secret`,`Redirect URI`,`Authorization Server`]},id:`live-2`,note:`This five-step dance ensures that your client secret is never exposed to the user's browser.`,section:`The OAuth Flow`,order:2,depth:1},{type:`terminal`,col:12,delay:140,props:{lines:[{kind:`comment`,text:`Exchange the temporary authorization code for an access token`},{kind:`command`,text:`curl -X POST https://oauth2.googleapis.com/token \\
31
+ -d code=4/0AeaYSH... \\
32
+ -d client_id=YOUR_CLIENT_ID \\
33
+ -d client_secret=YOUR_CLIENT_SECRET \\
34
+ -d redirect_uri=https://myapp.com/callback \\
35
+ -d grant_type=authorization_code`},{kind:`stdout`,text:`{
36
+ "access_token": "ya29.a0AfH6SM...",
37
+ "expires_in": 3599,
38
+ "scope": "openid email profile",
39
+ "token_type": "Bearer",
40
+ "id_token": "eyJhbGciOiJSUzI1NiIs..."`}],title:`Step 4: The Token Exchange Request`,prompt:`backend-server $`,exitCode:0,caption:`This POST request must happen strictly server-to-server to protect your client secret.`},id:`live-3`,note:`Your server swaps the temporary code for a bearer token behind the scenes, keeping your client secret completely hidden.`,section:`The Token Exchange`,order:3,depth:1},{type:`codeblock`,col:12,delay:210,props:{title:`Handling the Callback in Express`,code:`router.get('/callback', async (req, res) => {
41
+ const { code, state } = req.query;
42
+
43
+ // 1. Verify state to prevent CSRF
44
+ if (state !== req.session.state) {
45
+ return res.status(400).send('State mismatch. Potential CSRF.');
46
+ }
47
+
48
+ // 2. Exchange code for tokens
49
+ const tokenResponse = await axios.post('https://oauth2.googleapis.com/token', {
50
+ code,
51
+ client_id: process.env.CLIENT_ID,
52
+ client_secret: process.env.CLIENT_SECRET,
53
+ redirect_uri: process.env.REDIRECT_URI,
54
+ grant_type: 'authorization_code'
55
+ });
56
+
57
+ const { access_token, id_token } = tokenResponse.data;
58
+ // 3. Use access_token to fetch user profile...
59
+ });`,lang:`javascript`,filename:`auth-router.js`,lineNumbers:!0,footer:`Always validate the state parameter before making the token exchange.`},id:`live-4`,note:`In code, the callback route is where you intercept the code, verify the state parameter, and perform the secure POST exchange.`,section:`The Token Exchange`,order:3,depth:2,facet:`example`},{type:`compare`,col:12,delay:280,props:{options:[{name:`OAuth 2.0`,sub:`Authorization framework`},{name:`OIDC (OpenID Connect)`,sub:`Identity layer on OAuth 2.0`,pick:!0}],criteria:[{label:`Primary Purpose`,cells:[{v:`Delegated access (API permissions)`},{v:`User authentication (Who is logging in)`,win:!0}]},{label:`Key Token Issued`,cells:[{v:`Access Token (opaque string or JWT)`},{v:`ID Token (standardized JWT)`,win:!0}]},{label:`Standard UserInfo Endpoint`,cells:[{v:`No (provider-specific)`},{v:`Yes (standardized profile claims)`,win:!0}]}],eyebrow:`Protocol Comparison`,recommendation:`For user login, always use OpenID Connect (OIDC) so you get a standardized ID token containing the user's profile.`},id:`live-5`,note:`While OAuth handles the permissions, OpenID Connect is what actually gives you the standardized ID token containing the user's profile.`,section:`OAuth vs. OIDC`,order:4,depth:1},{type:`checklist`,col:6,delay:350,props:{rows:[{t:`Use HTTPS everywhere to protect tokens in transit`,st:`todo`},{t:`Implement PKCE (Proof Key for Code Exchange) even for confidential backends`,st:`doing`},{t:`Strictly validate redirect URIs on the provider dashboard (no wildcards)`,st:`todo`},{t:`Store client secrets securely in environment variables, never in client-side code`,st:`todo`},{t:`Set short expiration times on access tokens and use secure HttpOnly cookies for sessions`,st:`todo`}],title:`OAuth Security Checklist`,footer:`A single leaked client secret or open redirect can compromise your entire user base.`},id:`live-6`,note:`Security is paramount here — make sure your redirect URIs are strictly matched and your client secrets are never exposed.`,section:`Implementation Checklist`,order:5,depth:1},{type:`breakdown`,col:6,delay:420,props:{title:`Common Implementation Pitfalls`,rows:[{name:`Exposing Client Secret`,val:`Critical Risk`,pct:36,hot:!0,tag:`Security`},{name:`Missing State/PKCE Validation`,val:`CSRF Vulnerability`,pct:27,tag:`Security`},{name:`Permissive Redirect URIs`,val:`Token Hijacking`,pct:21,tag:`Configuration`},{name:`Storing Tokens in LocalStorage`,val:`XSS Risk`,pct:16,tag:`Storage`}]},id:`live-7`,note:`The biggest mistake is putting the client secret in a mobile app or frontend code — it must live strictly on your secure server.`,section:`Common Pitfalls`,order:6,depth:1},{type:`timeline`,col:6,delay:0,props:{events:[{time:`Step 1`,title:`Redirect to Identity Provider`,detail:`Your app redirects the user to the OAuth server with a code_challenge (for PKCE) and requested scopes.`},{time:`Step 2`,title:`User Consents & Redirects Back`,detail:`The user logs in and approves permissions. The OAuth server redirects back to your redirect URI with a temporary authorization code.`},{time:`Step 3`,title:`Exchange Code for Tokens`,detail:`Your backend sends the authorization code and the original code_verifier to the token endpoint to prove identity.`},{time:`Step 4`,title:`Receive Access & ID Tokens`,detail:`The server validates the verifier and returns an Access Token, an ID Token, and optionally a Refresh Token.`}],eyebrow:`The Handshake`,title:`Authorization Code Flow with PKCE`},id:`live-8`,note:`This is the standard Authorization Code flow with PKCE, which is now the recommended best practice for both mobile and web apps.`,section:`OAuth Flow`,order:1},{type:`httpexchange`,col:6,delay:70,props:{exchanges:[{method:`POST`,url:`https://oauth2.googleapis.com/token`,status:200,statusText:`OK`,durationMs:142,reqBody:`POST /token HTTP/1.1
60
+ Host: oauth2.googleapis.com
61
+ Content-Type: application/x-www-form-urlencoded
62
+
63
+ code=4/0AdQt8q...&
64
+ client_id=your-client-id&
65
+ client_secret=your-client-secret&
66
+ redirect_uri=https://yourapp.com/callback&`,respPreview:`{
67
+ "access_token": "ya29.a0AfH6S...",
68
+ "expires_in": 3600,
69
+ "refresh_token": "1//06u...",
70
+ "scope": "openid email profile",
71
+ "token_type": "Bearer",
72
+ "id_token": "eyJhbGciOiJSUzI1NiIs..."
73
+ }`,note:`Your backend exchanges the short-lived authorization code for the actual access and ID tokens securely.`}],title:`Step 3: The Token Exchange Request`},id:`live-9`,note:`The token exchange happens entirely on your backend, keeping your client secret and the resulting tokens safe from the browser.`,section:`OAuth Flow`,order:1},{type:`comparematrix`,col:12,delay:140,props:{title:`Session Cookies vs. JWTs`,cols:[`Session Cookies`,`JSON Web Tokens (JWT)`],rows:[{label:`Storage Location`,cells:[{value:`Server-side database/Redis`},{value:`Client-side (Cookie or LocalStorage)`}]},{label:`Statelessness`,cells:[{value:`No (Requires DB lookup per request)`},{value:`Yes (Cryptographically signed self-contained data)`}]},{label:`Revocation`,cells:[{value:`Instant (Delete session from DB)`},{value:`Hard (Must wait for expiry or use a blacklist)`}]},{label:`Size Overhead`,cells:[{value:`Minimal (Just a small session ID string)`},{value:`Large (Carries claims, signatures, and metadata)`}]},{label:`Primary Security Risk`,cells:[{value:`CSRF (Mitigated with SameSite cookies)`},{value:`XSS (If stored in LocalStorage, tokens can be stolen)`}]}],caption:`How to keep users signed in after OAuth completes`,footer:`Use Session Cookies for standard web apps where instant revocation is critical. Use JWTs for APIs and microservices.`},id:`live-10`,note:`Cookies win on instant revocation and size, while JWTs win on statelessness and scalability across multiple microservices.`,section:`Session Management`,order:2},{type:`clearancematrix`,col:12,delay:210,props:{title:`Token Storage Security Matrix`,rows:[`LocalStorage / SessionStorage`,`In-Memory (React/Vue State)`,`HttpOnly, Secure, SameSite Cookie`],columns:[`XSS Vulnerability`,`CSRF Vulnerability`],cells:[{row:`LocalStorage / SessionStorage`,col:`XSS Vulnerability`,level:`avoid`,reason:`Any malicious script running on your page can read the tokens instantly.`},{row:`LocalStorage / SessionStorage`,col:`CSRF Vulnerability`,level:`safe`,reason:`Browsers don't automatically send LocalStorage values with requests.`},{row:`In-Memory (React/Vue State)`,col:`XSS Vulnerability`,level:`caution`,reason:`Safer, but tokens are lost on page refresh, requiring silent refresh flows.`},{row:`In-Memory (React/Vue State)`,col:`CSRF Vulnerability`,level:`safe`,reason:`Not automatically attached to cross-site requests.`},{row:`HttpOnly, Secure, SameSite Cookie`,col:`XSS Vulnerability`,level:`safe`,reason:`JavaScript cannot read HttpOnly cookies, blocking basic token theft.`},{row:`HttpOnly, Secure, SameSite Cookie`,col:`CSRF Vulnerability`,level:`caution`,reason:`Vulnerable to CSRF, but mitigated completely by using SameSite=Strict/Lax.`}],footer:`Storing tokens in an HttpOnly, Secure cookie is the industry standard for web applications.`},id:`live-11`,note:`Never store sensitive access tokens in LocalStorage; an XSS vulnerability would allow an attacker to steal them instantly.`,section:`Security Best Practices`,order:3},{type:`threatmodel`,col:12,delay:280,props:{title:`OAuth Implementation Threat Model`,assets:[{id:`auth_code`,name:`Authorization Code`,kind:`process`},{id:`access_token`,name:`Access Token`,kind:`process`},{id:`client_secret`,name:`Client Secret`,kind:`datastore`}],threats:[{assetId:`auth_code`,stride:`information-disclosure`,mitigation:`Use PKCE (Proof Key for Code Exchange) to bind the code to the client.`,status:`mitigated`},{assetId:`client_secret`,stride:`information-disclosure`,mitigation:`Never expose the client secret in frontend code or mobile apps.`,status:`mitigated`},{assetId:`access_token`,stride:`tampering`,mitigation:`Validate JWT signatures using JWKS endpoints and verify the 'aud' and 'iss' claims.`,status:`mitigated`}],boundaries:[{label:`Browser / Client`,contains:[`auth_code`]},{label:`Backend Server`,contains:[`access_token`,`client_secret`]}],footer:`Ensure PKCE is enabled even for confidential server-side clients to prevent authorization code injection.`},id:`live-12`,note:`A robust threat model ensures you mitigate common OAuth pitfalls like code interception and client secret exposure.`,section:`Security Best Practices`,order:3}],proof:null,topic:`Programming`,extras:{},group:`home`,suggests:[{label:`How do I implement PKCE in Node.js?`,icon:`chat`,route:`How do I implement PKCE in Node.js?`},{label:`What is a silent refresh flow?`,icon:`chat`,route:`What is a silent refresh flow?`},{label:`How do I validate a JWT signature?`,icon:`chat`,route:`How do I validate a JWT signature?`},{label:`What scopes should I request for basic login?`,icon:`chat`,route:`What scopes should I request for basic login?`}],keywords:[]},at:1784149692057}],a=[{role:`user`,content:`Explain how OAuth login works, step by step — I'm adding it to our app.`},{role:`assistant`,content:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials…`},{role:`user`,content:`Compare session cookies vs JWTs for keeping users signed in — a side-by-side of the real tradeoffs (revocation, statelessness, size, XSS/CSRF exposure), and when each wins.`},{role:`assistant`,content:`OAuth can feel like a maze of redirects, but at its heart, it's just a secure way for a user to say 'yes, this app can act on my behalf' without handing over their password. Let's walk through the standard Authorization Code flow, look at the actual token exchange, and check off the security essentials.`}],o={v:1,persona:`dev`,generatedAt:n,model:r,frames:i,history:a};export{o as default,i as frames,n as generatedAt,a as history,r as model,t as persona,e as v};
@@ -0,0 +1 @@
1
+ var e={diagramflow:{title:`The solver loop`,icon:`layers`,iconColor:`var(--presence)`,layout:`cycle`,nodes:[{id:`init`,label:`Initialize field`,kind:`start`},{id:`assemble`,label:`Assemble system`,sub:`discretize PDE`},{id:`solve`,label:`Solve linear system`,kind:`accent`},{id:`check`,label:`Residual < tol?`,kind:`muted`},{id:`done`,label:`Converged`,kind:`good`}],edges:[{from:`init`,to:`assemble`},{from:`assemble`,to:`solve`},{from:`solve`,to:`check`},{from:`check`,to:`assemble`,label:`no`,kind:`warn`,dashed:!0},{from:`check`,to:`done`,label:`yes`,kind:`good`}],footer:`Each iteration re-assembles and re-solves until the residual falls below tolerance.`},composite:{title:`Launch readiness`,icon:`layers`,regions:[{block:{type:`kpi`,id:`gallery-composite-kpi`,props:{title:`Release checks`,kpis:[{val:`12/12`,label:`Passing`}]}},span:5},{block:{type:`list`,id:`gallery-composite-list`,props:{title:`Next steps`,items:[`Ship the candidate`,`Watch real-user metrics`]}},span:7}],footer:`The same typed children and layout path used in Live.`},sequencediagram:{title:`How a graded exam flows`,actors:[{id:`you`,label:`You`},{id:`prof`,label:`Prof`},{id:`lms`,label:`LMS`}],messages:[{from:`you`,to:`prof`,label:`submit`},{from:`prof`,to:`lms`,label:`enter grade`},{from:`lms`,to:`you`,label:`notify`,reply:!0}]},statemachine:{title:`Study session states`,states:[{id:`idle`,label:`Idle`,start:!0},{id:`study`,label:`Study`},{id:`break`,label:`Break`},{id:`done`,label:`Done`,final:!0}],transitions:[{from:`idle`,to:`study`,label:`start`},{from:`study`,to:`break`,label:`25 min`},{from:`break`,to:`study`,label:`resume`},{from:`study`,to:`done`,label:`finish`}]},erdiagram:{title:`How your grades data is modelled`,entities:[{id:`student`,label:`Student`,fields:[{name:`id`,type:`uuid`,key:`pk`},{name:`name`,type:`text`}]},{id:`grade`,label:`Grade`,fields:[{name:`id`,type:`uuid`,key:`pk`},{name:`student_id`,type:`uuid`,key:`fk`},{name:`course`,type:`text`},{name:`score`,type:`int`}]}],relationships:[{from:`student`,to:`grade`,fromCard:`1`,toCard:`many`,label:`earns`}]},circuitdiagram:{title:`A simple series circuit`,components:[{id:`bat`,kind:`battery`,x:20,y:50,label:`9V`},{id:`r1`,kind:`resistor`,x:60,y:20,label:`R₁ 10Ω`},{id:`bulb`,kind:`bulb`,x:80,y:50}],wires:[{from:`bat`,to:`r1`},{from:`r1`,to:`bulb`},{from:`bulb`,to:`bat`}],footer:`Current is the same everywhere in series; the bulb’s brightness tracks it.`},controlblockdiagram:{title:`Your Thermostat's Feedback Loop`,icon:`sliders`,iconColor:`var(--insight)`,blocks:[{id:`setpoint`,label:`Setpoint 68°F`,kind:`block`},{id:`err`,label:`Σ`,kind:`sum`},{id:`ctrl`,label:`Controller`,kind:`block`},{id:`heater`,label:`Heater`,kind:`block`},{id:`room`,label:`Room Temp`,kind:`block`},{id:`sensor`,label:`Sensor H(s)`,kind:`block`}],wires:[{from:`setpoint`,to:`err`,sign:`plus`},{from:`err`,to:`ctrl`},{from:`ctrl`,to:`heater`},{from:`heater`,to:`room`},{from:`room`,to:`sensor`,feedback:!0},{from:`sensor`,to:`err`,sign:`minus`,feedback:!0}],footer:`The sensor feeds measured room temperature back with a minus sign; a wide 15A-driven duty cycle (the controller's gain) is what turned a 2°F drift into the heating line item that jumped your bill.`},fiveforces:{title:`Why the market is pushing us this way`,icon:`chart`,iconColor:`var(--warning)`,industry:`AI coding assistants`,forces:[{id:`rivalry`,label:`Well-funded incumbents`,strength:`high`,note:`Two capitalized players already own distribution.`},{id:`newEntrants`,label:`New entrants`,strength:`high`,note:`Foundation-model APIs lower the barrier every quarter.`},{id:`suppliers`,label:`Model API providers`,strength:`medium`,note:`A handful of frontier labs set the price and the pace.`},{id:`buyers`,label:`Enterprise buyers`,strength:`medium`,note:`Switching cost is low until data + workflow lock-in builds.`},{id:`substitutes`,label:`General chat LLMs`,strength:`high`,note:`A generic assistant already covers the easy 80% of asks, free.`}],footer:`Rivalry and substitutes are the two forces working against the fictional company — source visibility is one possible response.`},fivewhychain:{title:`Root cause: the SMB churn spike`,icon:`eye`,iconColor:`var(--danger)`,problem:`SMB churn nearly doubled in two months`,whys:[{question:`Why did SMB churn spike?`,answer:`58% of cancellations cite the February price increase.`},{question:`Why did the price increase hit so hard?`,answer:`It landed as a flat 40% jump with no advance notice.`},{question:`Why no advance notice or phased rollout?`,answer:`The pricing change shipped with the Q1 close, not a customer-comms plan.`},{question:`Why wasn't comms part of the pricing rollout?`,answer:`Pricing changes have never needed sign-off from anyone outside finance.`},{question:`Why is there no cross-team sign-off on pricing?`,answer:`There's no defined process connecting pricing, growth, and support before a change ships.`}],rootCause:`Missing cross-team process for pricing changes, not the price itself.`,footer:`Fix the process and the next price change stops costing accounts.`},sysarchdiagram:{title:`Whiteboard: a URL shortener at scale`,icon:`share`,iconColor:`var(--presence)`,nodes:[{id:`client`,label:`Client`,kind:`client`},{id:`cdn`,label:`CDN`,kind:`cdn`,sub:`static assets`},{id:`lb`,label:`Load Balancer`,kind:`loadbalancer`},{id:`api`,label:`API Service`,kind:`service`,sub:`×12 instances`},{id:`cache`,label:`Redis Cache`,kind:`cache`,sub:`hot slugs`},{id:`queue`,label:`Write Queue`,kind:`queue`,sub:`Kafka`},{id:`db`,label:`Postgres`,kind:`database`,sub:`primary + replicas`},{id:`gw`,label:`Auth Gateway`,kind:`gateway`}],edges:[{from:`client`,to:`cdn`,protocol:`HTTPS`},{from:`client`,to:`gw`,protocol:`HTTPS`},{from:`gw`,to:`lb`},{from:`lb`,to:`api`,protocol:`HTTP/2`},{from:`api`,to:`cache`,label:`read-through`},{from:`api`,to:`queue`,label:`enqueue write`},{from:`queue`,to:`db`,label:`batched insert`},{from:`cache`,to:`db`,label:`cache-aside`,protocol:`TCP:5432`}],footer:`Reads hit the cache first (sub-ms for hot slugs); writes go through the queue so Postgres never sees a request-rate spike directly. The gateway terminates auth before anything reaches the load balancer.`},datapipeline:{title:`How test_set.parquet gets built`,icon:`table`,iconColor:`var(--insight)`,stages:[{id:`raw`,label:`Ticket Events`,kind:`source`,sub:`Kafka topic`},{id:`dedup`,label:`Dedup & Clean`,kind:`transform`,sub:`drop dupes, strip PII`},{id:`label`,label:`Join Labels`,kind:`transform`,sub:`label-queue export`},{id:`features`,label:`Feature Store`,kind:`store`,sub:`Parquet, versioned`},{id:`split`,label:`Train/Test Split`,kind:`transform`,sub:`80/20 stratified`},{id:`train`,label:`train_set.parquet`,kind:`sink`,sub:`33,600 rows`},{id:`test`,label:`test_set.parquet`,kind:`sink`,sub:`8,400 rows`}],edges:[{from:`raw`,to:`dedup`,label:`nightly batch`},{from:`dedup`,to:`label`},{from:`label`,to:`features`,label:`write`},{from:`features`,to:`split`,label:`read`},{from:`split`,to:`train`},{from:`split`,to:`test`}],footer:`Dedup and the label join both run before anything lands in the feature store, so the same cleaned, labeled row is what both the training split and this eval set are drawn from — no separate path for either.`},threatmodel:{title:`Threat model — the Atlas v3 search path`,icon:`shield`,iconColor:`var(--danger)`,assets:[{id:`client`,name:`Web / mobile client`,kind:`external-entity`},{id:`gateway`,name:`API Gateway`,kind:`process`},{id:`search`,name:`Search Service`,kind:`process`},{id:`auth`,name:`Auth Service`,kind:`process`},{id:`userdb`,name:`User DB`,kind:`datastore`},{id:`index`,name:`Search Index`,kind:`datastore`}],boundaries:[{label:`Public internet`,contains:[`client`]},{label:`Application tier`,contains:[`gateway`,`search`,`auth`]},{label:`Data tier`,contains:[`userdb`,`index`]}],threats:[{assetId:`gateway`,stride:`spoofing`,mitigation:`mTLS + signed JWT on every internal hop.`,status:`mitigated`},{assetId:`gateway`,stride:`repudiation`,mitigation:`Structured audit log per request.`,status:`mitigated`},{assetId:`auth`,stride:`tampering`,mitigation:`Request signing lands with RFC-114 phase 2.`,status:`open`},{assetId:`search`,stride:`info-disclosure`,mitigation:`Field-level redaction on index responses.`,status:`mitigated`},{assetId:`index`,stride:`dos`,mitigation:`Rate limiting at the gateway.`,status:`mitigated`},{assetId:`userdb`,stride:`elevation`,mitigation:`Privilege review scheduled this sprint.`,status:`open`}],footer:`Two threats are still open — request signing on Auth ships with RFC-114 phase 2, and the User DB privilege review is this sprint.`},foodweb:{title:`Who ate whom in the Cretaceous`,icon:`globe`,iconColor:`var(--insight)`,tiers:[`Plants`,`Plant-eaters`,`Hunters`,`Top predator`],organisms:[{id:`ferns`,tier:0,label:`Ferns & cycads`},{id:`conifers`,tier:0,label:`Conifers`},{id:`tric`,tier:1,label:`Triceratops`},{id:`edmont`,tier:1,label:`Edmontosaurus`},{id:`ankyl`,tier:1,label:`Ankylosaurus`},{id:`dromae`,tier:2,label:`Dromaeosaurus`},{id:`trex`,tier:3,label:`T. rex`}],links:[{from:`ferns`,to:`tric`},{from:`conifers`,to:`edmont`},{from:`ferns`,to:`ankyl`},{from:`conifers`,to:`tric`},{from:`tric`,to:`dromae`},{from:`edmont`,to:`dromae`},{from:`dromae`,to:`trex`},{from:`tric`,to:`trex`},{from:`edmont`,to:`trex`}],footer:`T. rex sat at the top, but it likely scavenged just as often as it hunted.`},recursiontree:{title:`Naive Recursive fib(4)`,icon:`spark`,iconColor:`var(--presence)`,root:{call:`fib(4)`,result:3,children:[{call:`fib(3)`,result:2,children:[{call:`fib(2)`,result:1,children:[{call:`fib(1)`,result:1},{call:`fib(0)`,result:0}]},{call:`fib(1)`,result:1}]},{call:`fib(2)`,result:1,children:[{call:`fib(1)`,result:1},{call:`fib(0)`,result:0}]}]},footer:`fib(2) is recomputed twice here and the redundant subtree only grows with n — O(2ⁿ) calls total. A memo table (see the LCS dptable above) collapses each distinct call to O(1) after its first evaluation.`},primefactortree:{title:`Prime factorization of 360`,icon:`share`,iconColor:`var(--insight)`,number:360,nodes:[{value:360,isPrime:!1,children:[{value:8,isPrime:!1,children:[{value:2,isPrime:!0},{value:4,isPrime:!1,children:[{value:2,isPrime:!0},{value:2,isPrime:!0}]}]},{value:45,isPrime:!1,children:[{value:9,isPrime:!1,children:[{value:3,isPrime:!0},{value:3,isPrime:!0}]},{value:5,isPrime:!0}]}]}]},nnarchitecture:{title:`Transformer-v3 Routing Head`,icon:`layers`,iconColor:`var(--presence)`,connections:`sparse`,layers:[{name:`Input`,units:768},{name:`Hidden 1`,units:256,activation:`ReLU`},{name:`Hidden 2`,units:64,activation:`ReLU`},{name:`Output`,units:3,activation:`softmax`}],highlight:{layer:3,unit:0},footer:`A small classifier head sits on top of the frozen encoder — 768→256→64→3, softmax over {tier-1, enterprise, billing}. The highlighted output unit is the one deciding tier-1 routing.`},synthesisroute:{title:`Aspirin: a Convergent Synthesis`,icon:`spark`,iconColor:`var(--presence)`,nodes:[{id:`sal`,label:`Salicylic acid`,smiles:`OC(=O)c1ccccc1O`,role:`start`},{id:`anh`,label:`Acetic anhydride`,smiles:`CC(=O)OC(C)=O`,role:`start`},{id:`asp`,label:`Aspirin`,smiles:`CC(=O)Oc1ccccc1C(=O)O`,role:`target`},{id:`phenol`,label:`Phenol`,smiles:`Oc1ccccc1`,role:`start`}],edges:[{from:`sal`,to:`asp`,reagents:`Ac₂O`,conditions:`H₂SO₄ (cat.), 90 °C`,yieldPct:87},{from:`anh`,to:`asp`},{from:`asp`,to:`phenol`,direction:`retro`}],footer:`Salicylic acid and acetic anhydride converge on aspirin in one acetylation step (87% isolated yield). The dashed retrosynthetic arrow traces the target further back to phenol, the aromatic feedstock reached via a Kolbe–Schmitt carboxylation to salicylic acid.`},plasmidmap:{title:`pUC19 Cloning Vector`,icon:`sparkle`,iconColor:`var(--presence)`,sizeBp:2686,features:[{name:`AmpR`,startBp:1626,endBp:2486,kind:`marker`,strand:`minus`},{name:`lacZα`,startBp:396,endBp:626,kind:`gene`,strand:`plus`},{name:`lac promoter`,startBp:626,endBp:656,kind:`promoter`,strand:`plus`},{name:`rep origin`,startBp:2600,endBp:2650,kind:`terminator`}],sites:[{name:`EcoRI`,posBp:396,cutsOnce:!0},{name:`BamHI`,posBp:411,cutsOnce:!0},{name:`HindIII`,posBp:447,cutsOnce:!0},{name:`PstI`,posBp:435}],origin:{name:`ori`,posBp:2e3},footer:`The multiple cloning site sits inside lacZα (blue/white screening); AmpR selects for transformants. EcoRI, BamHI, and HindIII each cut once — safe choices for a single-site digest.`},argumentmap:{title:`SN2 vs SN1, which mechanism?`,claim:`The reaction proceeds via an SN2 (bimolecular nucleophilic substitution) mechanism.`,premises:[{type:`support`,text:`Primary substrate, minimal steric hindrance favors backside attack.`},{type:`support`,text:`Strong nucleophile (OH⁻) present in high concentration.`},{type:`support`,text:`Rate is second-order: rate = k[CH₃Br][OH⁻], both species appear in rate law.`},{type:`objection`,text:`Polar protic solvent (water) could stabilise a carbocation and favour SN1.`},{type:`qualifier`,text:`Solvent choice matters: aprotic solvents would further favour SN2 by not solvating the nucleophile.`}],verdict:`SN2 dominates: primary substrate + strong nucleophile + second-order kinetics all point the same way.`},toulmin:{title:`Toulmin Analysis`,icon:`proof`,iconColor:`var(--presence)`,claim:`Harry is a British citizen.`,grounds:`Harry was born in Bermuda.`,warrant:`A person born in Bermuda is generally a British citizen.`,backing:`On account of the British Nationality Acts and the statutes governing citizenship by birth in British territories.`,qualifier:`presumably`,rebuttal:`both his parents were foreign nationals, or he has since formally renounced his citizenship.`,footer:`The classic worked example from Toulmin’s <em>The Uses of Argument</em> (1958).`},castmap:{title:`Cast Map — The Keeper`,icon:`share`,iconColor:`var(--presence)`,nodes:[{id:`elara`,name:`Elara`,role:`The lighthouse keeper`,faction:`The Island`},{id:`mira`,name:`Mira`,role:`A runaway she shelters`,faction:`The Island`},{id:`bram`,name:`Old Bram`,role:`The keeper before her`,faction:`The Island`},{id:`davo`,name:`Captain Davo`,role:`Master of the Wrenn`,faction:`The Sea`},{id:`tomas`,name:`Tomas`,role:`Davo's first mate`,faction:`The Sea`},{id:`warden`,name:`The Warden`,role:`Hunts the runaway`,faction:`The Crown`}],links:[{from:`elara`,to:`mira`,kind:`ally`,label:`shelters`},{from:`bram`,to:`elara`,kind:`mentor`,label:`taught the light`},{from:`davo`,to:`mira`,kind:`family`,label:`her father`},{from:`elara`,to:`davo`,kind:`ally`,label:`saves the Wrenn`},{from:`warden`,to:`mira`,kind:`rival`,label:`hunts`},{from:`warden`,to:`elara`,kind:`rival`,label:`suspects`},{from:`tomas`,to:`davo`,kind:`betrays`,label:`cut the lines`}],caption:`Who protects whom — and who is hunting the runaway.`,footer:`The hidden <strong>father</strong> and the first mate’s <strong>betrayal</strong> are the two secrets the third act turns on.`},probabilitytree:{title:`Two Coin Tosses`,branches:[{label:`Heads`,prob:.5,children:[{label:`Heads`,prob:.5,outcome:`P = 0.25`},{label:`Tails`,prob:.5,outcome:`P = 0.25`}]},{label:`Tails`,prob:.5,children:[{label:`Heads`,prob:.5,outcome:`P = 0.25`},{label:`Tails`,prob:.5,outcome:`P = 0.25`}]}],note:`Each outcome has equal probability of 25%.`},datastructure:{title:`Binary search tree — searching for 40`,icon:`share`,iconColor:`var(--presence)`,kind:`bst`,nodes:[{id:`a`,value:50,left:`b`,right:`c`},{id:`b`,value:30,left:`d`,right:`e`},{id:`c`,value:70,left:`f`,right:`g`},{id:`d`,value:20},{id:`e`,value:40},{id:`f`,value:60},{id:`g`,value:80}],highlight:`e`,footer:`Search visits <b>50 → 30 → 40</b>: 40 &lt; 50 go left, 40 &gt; 30 go right, match. Three comparisons in a balanced tree of seven nodes — O(log n).`},causationchain:{title:`Causes and consequences of World War I`,event:{label:`Outbreak of World War I (1914)`},causes:[{label:`Assassination of Archduke Franz Ferdinand`,weight:.95,term:`short`},{label:`July Crisis and ultimatum to Serbia`,weight:.7,term:`short`},{label:`The alliance system (Triple Entente vs. Triple Alliance)`,weight:.85,term:`long`},{label:`Militarism and the arms race`,weight:.6,term:`long`},{label:`Imperial and nationalist rivalries`,weight:.55,term:`long`}],consequences:[{label:`Roughly 17 million deaths across the war`,weight:.9,term:`short`},{label:`Treaty of Versailles (1919)`,weight:.8,term:`short`},{label:`Collapse of four empires`,weight:.7,term:`long`},{label:`Rise of fascism and the path to World War II`,weight:.85,term:`long`}],footer:`The assassination was the trigger, but it lit a fuse laid by years of alliances, militarism, and rivalry — the line weights show which forces mattered most.`},protocolstack:{title:`The TCP/IP stack: how a request travels down`,icon:`layers`,iconColor:`var(--presence)`,layers:[{name:`Application`,role:`Your request lives here — the actual message a program speaks.`,protocols:[`HTTP`,`DNS`,`TLS`,`SMTP`]},{name:`Transport`,role:`Splits the message into segments and guarantees order & delivery.`,protocols:[`TCP`,`UDP`]},{name:`Internet`,role:`Wraps each segment in a packet and routes it across networks by IP address.`,protocols:[`IP`,`ICMP`]},{name:`Link`,role:`Frames the packet for the local wire and addresses the next hop by MAC.`,protocols:[`Ethernet`,`Wi-Fi`,`ARP`]}],packet:[{header:`Ethernet`,layer:`Link`},{header:`IP`,layer:`Internet`},{header:`TCP`,layer:`Transport`},{header:`HTTP`,layer:`Application`},{header:`Your request`,layer:`Application`}],caption:`Each layer adds its own header on the way down, then the receiver peels them off in reverse on the way back up.`},wiringdiagram:{title:`Three-Way Switch Loop`,icon:`spark`,iconColor:`var(--warning)`,nodes:[{id:`panel`,kind:`panel`,label:`Panel`,x:8,y:32},{id:`cb`,kind:`breaker`,label:`15A`,x:26,y:32},{id:`sw1`,kind:`switch3way`,label:`SW1`,x:46,y:14},{id:`sw2`,kind:`switch3way`,label:`SW2`,x:70,y:14},{id:`light`,kind:`light`,label:`Fixture`,x:90,y:32},{id:`gnd`,kind:`ground`,label:`Bond`,x:8,y:56}],wires:[{from:`panel`,to:`cb`,conductor:`hot`,gauge:`14 AWG`},{from:`cb`,to:`sw1`,conductor:`hot`},{from:`sw1`,to:`sw2`,conductor:`traveler`,gauge:`14/3`},{from:`sw2`,to:`light`,conductor:`hot`},{from:`light`,to:`panel`,conductor:`neutral`},{from:`panel`,to:`gnd`,conductor:`ground`}],caption:`One fixture controlled from two locations: the common feeds switch one, two travelers run between the switches, and the switched hot returns to the light.`,footer:`Black = hot, white = neutral, green = equipment ground, and the two travelers (here as 14/3) carry the switched leg between the 3-way switches.`},pipingschematic:{title:`Closed Hydronic Heating Loop`,icon:`sliders`,iconColor:`var(--insight)`,components:[{id:`tank`,kind:`tank`,label:`Buffer Tank`,x:12,y:18},{id:`pump`,kind:`pump`,label:`P-101`,x:42,y:18},{id:`heater`,kind:`heater`,label:`Boiler`,x:74,y:18},{id:`rad`,kind:`filter`,label:`Radiator`,x:74,y:46},{id:`valve`,kind:`valve`,label:`Balancing`,x:42,y:46},{id:`temp`,kind:`sensor`,label:`TT-1`,x:12,y:46}],lines:[{from:`tank`,to:`pump`,flow:!0,size:`DN50`},{from:`pump`,to:`heater`,flow:!0,size:`DN50`},{from:`heater`,to:`rad`,flow:!0,size:`DN40`},{from:`rad`,to:`valve`,flow:!0,size:`DN40`},{from:`valve`,to:`temp`,flow:!0},{from:`temp`,to:`tank`,flow:!0}],caption:`Water circulates buffer tank to pump to boiler, sheds heat at the radiator, then a balancing valve and return-temperature sensor close the loop back to the tank.`,footer:`Arrows show flow direction; line-size labels (DN50 supply, DN40 emitter branch) size each run for the design flow rate.`},logicgates:{title:`Half Adder`,icon:`share`,iconColor:`var(--presence)`,inputs:[{id:`A`,label:`A`,value:1},{id:`B`,label:`B`,value:0}],gates:[{id:`sum`,kind:`XOR`,inputs:[`A`,`B`]},{id:`carry`,kind:`AND`,inputs:[`A`,`B`]}],output:{from:`sum`,label:`Sum`},truth:[{row:[0,0],out:0},{row:[0,1],out:1},{row:[1,0],out:1},{row:[1,1],out:0}],caption:`A half adder sums two bits: the XOR gate produces the sum, the AND gate produces the carry. With A=1, B=0 the sum line lights (1) and there is no carry.`,footer:`The truth table row matching the live inputs is highlighted; flip A or B in your head and read the Sum column to see XOR in action.`},algorithmtrace:{title:`Bubble Sort — First Pass`,icon:`layers`,iconColor:`var(--presence)`,values:[5,1,4,2,8,3,7],steps:[{caption:`Start the pass: compare the first adjacent pair, 5 and 1.`,compare:[0,1],pointer:{i:0,j:1}},{caption:`5 > 1, so swap them — the larger value bubbles right.`,swapped:[0,1],pointer:{i:0,j:1}},{caption:`Advance the window and compare 5 and 4.`,compare:[1,2],pointer:{i:1,j:2}},{caption:`5 > 4, swap again.`,swapped:[1,2],pointer:{i:1,j:2}},{caption:`Compare 5 and 2.`,compare:[2,3],pointer:{i:2,j:3}},{caption:`5 > 2, swap.`,swapped:[2,3],pointer:{i:2,j:3}},{caption:`Compare 5 and 8 — already in order, no swap.`,compare:[3,4],pointer:{i:3,j:4}},{caption:`The largest value, 8, settles into the last sorted slot.`,highlight:[6],pointer:{i:5,j:6}}],caption:`Step through one full pass: each comparison either holds or swaps, walking the largest remaining value to the right end.`,footer:`After this pass the maximum (8) is locked in its final position; bubble sort repeats over the shrinking unsorted prefix.`},dptable:{title:`LCS — Longest Common Subsequence: "ABCB" vs "BCAB"`,recurrence:`dp[i][j] = dp[i-1][j-1]+1 if s[i]=t[j], else max(dp[i-1][j], dp[i][j-1])`,cols:[`ε`,`B`,`C`,`A`,`B`],rows:[`ε`,`A`,`B`,`C`,`B`],cells:[[0,0,0,0,0],[0,0,0,1,1],[0,1,1,1,2],[0,1,2,2,2],[0,1,2,2,3]],path:[[1,3],[2,4],[3,2],[4,4]],steps:[{caption:`Base case: row 0 and col 0 are all 0 — empty string has LCS 0 with anything.`,current:[0,0],deps:[]},{caption:`dp[1][3]: A matches A → dp[0][2]+1 = 1. First character matched.`,current:[1,3],deps:[[0,2]]},{caption:`dp[2][4]: B matches B → dp[1][3]+1 = 2. Two-character match.`,current:[2,4],deps:[[1,3]]},{caption:`dp[3][2]: C matches C → dp[2][1]+1 = 2.`,current:[3,2],deps:[[2,1]]},{caption:`dp[4][4]: B matches B → dp[3][3]+1 = 3. Final answer: LCS = "BCB" (length 3).`,current:[4,4],deps:[[3,3]]}],footer:`LCS is <b>"BCB"</b> (length 3). Backtrack from dp[4][4]=3 via diagonal match cells. Classic FAANG problem: edit distance, diff tools, DNA sequencing.`},cyclewheel:{title:`The water cycle`,icon:`cloud`,iconColor:`var(--presence)`,stages:[{label:`Evaporation`,caption:`Sun heats water to vapor`,icon:`sun`},{label:`Condensation`,caption:`Vapor cools into clouds`,icon:`cloud`},{label:`Precipitation`,caption:`Rain, snow, and hail fall`,icon:`rain`},{label:`Collection`,caption:`Water gathers in oceans`,icon:`globe`}],caption:`A closed loop driven by the sun: water leaves the surface as vapor, returns as precipitation, and collects to start the round again.`,footer:`No water is created or lost &mdash; the same supply circulates endlessly between the surface, the atmosphere, and back.`},hashtable:{title:`Hash table — separate chaining, h(k) = k mod 7`,size:7,hashFn:`h(k) = k mod 7`,entries:[{key:14,value:`Alice`},{key:21,value:`Bob`},{key:7,value:`Carol`},{key:3,value:`Dan`},{key:10,value:`Eve`},{key:1,value:`Frank`}],highlight:10,footer:`Keys 7, 14 and 21 hash to bucket 0 (all divisible by 7). Key 10 hashes to bucket 3, colliding with key 3 — the chain is walked to find Eve. Load factor = 6/7 ≈ 86%.`},trie:{title:`Prefix tree (Trie) — autocomplete words`,words:[`apple`,`app`,`apt`,`apply`,`bat`,`ball`,`ban`],highlight:`apply`,footer:`Trie lookup: O(m) where m = word length, regardless of dictionary size. Each edge is one character; double-ringed nodes mark end-of-word. Use for autocomplete, spell-check, prefix search.`},graphtrace:{title:`BFS Graph Traversal`,algorithm:`bfs`,nodes:[{id:`A`,label:`A`,x:50,y:10},{id:`B`,label:`B`,x:20,y:40},{id:`C`,label:`C`,x:80,y:40},{id:`D`,label:`D`,x:10,y:75},{id:`E`,label:`E`,x:40,y:75},{id:`F`,label:`F`,x:70,y:75}],edges:[{from:`A`,to:`B`},{from:`A`,to:`C`},{from:`B`,to:`D`},{from:`B`,to:`E`},{from:`C`,to:`F`}],steps:[{caption:`Start BFS at A. Add A to queue.`,current:`A`,frontier:[`A`],visited:[]},{caption:`Dequeue A. Enqueue neighbors B and C.`,current:`A`,visited:[`A`],frontier:[`B`,`C`]},{caption:`Dequeue B. Enqueue neighbors D and E.`,current:`B`,visited:[`A`,`B`],frontier:[`C`,`D`,`E`]},{caption:`Dequeue C. Enqueue neighbor F.`,current:`C`,visited:[`A`,`B`,`C`],frontier:[`D`,`E`,`F`]},{caption:`Dequeue D. No unvisited neighbors.`,current:`D`,visited:[`A`,`B`,`C`,`D`],frontier:[`E`,`F`]},{caption:`Dequeue E. No unvisited neighbors.`,current:`E`,visited:[`A`,`B`,`C`,`D`,`E`],frontier:[`F`]},{caption:`Dequeue F. Queue empty — BFS complete! Order: A B C D E F.`,current:`F`,visited:[`A`,`B`,`C`,`D`,`E`,`F`],frontier:[]}],footer:`BFS visits nodes level-by-level (breadth-first). Queue is FIFO. Time: O(V+E). Contrast with DFS which uses a stack and goes deep before wide.`},binarytree:{title:`BST Search — find 7`,nodes:[{id:`n10`,value:10,left:`n5`,right:`n15`},{id:`n5`,value:5,left:`n3`,right:`n7`},{id:`n15`,value:15},{id:`n3`,value:3},{id:`n7`,value:7}],root:`n10`,steps:[{caption:`Start at root: 10. Is 7 == 10?`,states:{n10:`visiting`}},{caption:`7 < 10 → go left to 5.`,states:{n10:`visited`,n5:`visiting`}},{caption:`7 > 5 → go right to 7.`,states:{n10:`visited`,n5:`visited`,n7:`visiting`}},{caption:`7 == 7 → Found! 3 comparisons.`,states:{n10:`visited`,n5:`visited`,n7:`found`}}],footer:`BST search: O(h) time where h is tree height — O(log n) balanced, O(n) worst case. Each comparison halves the search space in a balanced BST.`},sortingviz:{title:`Bubble Sort step-by-step`,algorithm:`Bubble Sort`,complexity:`o-n2`,values:[5,3,8,1,6],steps:[{caption:`Pass 1: compare 5 and 3.`,values:[5,3,8,1,6],compared:[0,1]},{caption:`5 > 3 → swap.`,values:[3,5,8,1,6],swapped:[0,1]},{caption:`Compare 5 and 8. No swap.`,values:[3,5,8,1,6],compared:[1,2]},{caption:`Compare 8 and 1.`,values:[3,5,8,1,6],compared:[2,3]},{caption:`8 > 1 → swap.`,values:[3,5,1,8,6],swapped:[2,3]},{caption:`Compare 8 and 6.`,values:[3,5,1,8,6],compared:[3,4]},{caption:`8 > 6 → swap. 8 is sorted!`,values:[3,5,1,6,8],swapped:[3,4],sorted:[4]},{caption:`Pass 2: 3 and 5. No swap.`,values:[3,5,1,6,8],compared:[0,1],sorted:[4]},{caption:`Compare 5 and 1.`,values:[3,5,1,6,8],compared:[1,2],sorted:[4]},{caption:`5 > 1 → swap.`,values:[3,1,5,6,8],swapped:[1,2],sorted:[4]},{caption:`5 and 6 — no swap. 6 sorted.`,values:[3,1,5,6,8],compared:[2,3],sorted:[3,4]},{caption:`Pass 3: 3 and 1.`,values:[3,1,5,6,8],compared:[0,1],sorted:[3,4]},{caption:`3 > 1 → swap. Done!`,values:[1,3,5,6,8],swapped:[0,1],sorted:[0,1,2,3,4]}],footer:`Bubble sort: O(n²) time. Each pass bubbles the largest unsorted element to its final position. Simple to understand, rarely used in practice.`},gridtrace:{title:`BFS Shortest Path on a Grid`,algorithm:`BFS`,steps:[{caption:`Find shortest path S→E. Walls (#) block movement.`,grid:[[{state:`start`},{state:`empty`},{state:`wall`},{state:`empty`}],[{state:`empty`},{state:`empty`},{state:`empty`},{state:`empty`}],[{state:`empty`},{state:`empty`},{state:`empty`},{state:`end`}]]},{caption:`BFS expands: S visited, neighbors queued.`,grid:[[{state:`visited`},{state:`queued`},{state:`wall`},{state:`empty`}],[{state:`queued`},{state:`empty`},{state:`empty`},{state:`empty`}],[{state:`empty`},{state:`empty`},{state:`empty`},{state:`end`}]]},{caption:`Wave reaches E. Shortest path length = 5.`,grid:[[{state:`path`},{state:`visited`},{state:`wall`},{state:`visited`}],[{state:`path`},{state:`path`},{state:`path`},{state:`visited`}],[{state:`visited`},{state:`visited`},{state:`visited`},{state:`end`}]]}],footer:`BFS guarantees shortest path in unweighted grids. O(rows×cols). Classic FAANG: islands (LC 200), rotting oranges (994), word search (79).`},tournamentbracket:{title:`Your projected playoff bracket`,icon:`share`,iconColor:`var(--presence)`,rounds:[`Wild Card`,`Semifinal`,`Final`],matchups:[{id:`wc-1`,round:0,slot:0,a:`Dynasty Dave`,winner:`a`},{id:`wc-2`,round:0,slot:1,a:`You · Gridiron`,winner:`a`},{id:`wc-3`,round:0,slot:2,a:`The Karens`,b:`Bottom Feeders`},{id:`wc-4`,round:0,slot:3,a:`Brady Bunch`,b:`Waiver Warriors`},{id:`sf-1`,round:1,slot:0,a:`Dynasty Dave`},{id:`sf-2`,round:1,slot:1,a:`You · Gridiron`},{id:`final`,round:2,slot:0}],footer:`Dynasty Dave and you both clinch a Wild Card bye with a win this week, everyone else plays in.`},prooftree:{title:`Natural deduction · P → R`,icon:`proof`,steps:[{id:`a1`,statement:`[P]`},{id:`p1`,statement:`P → Q`},{id:`p2`,statement:`Q → R`},{id:`s1`,statement:`Q`,rule:`→E`,from:[`a1`,`p1`]},{id:`s2`,statement:`R`,rule:`→E`,from:[`s1`,`p2`]},{id:`s3`,statement:`P → R`,rule:`→I`,from:[`s2`]}],conclusionId:`s3`,footer:`Read upward: each bar is one inference, its rule named at the right. The bracketed [P] is an assumption discharged by the final →I step — the shape of every conditional proof.`},fishbone:{title:`Why the loaf came out dense`,icon:`share`,effect:`Dense sourdough loaf`,categories:[{label:`Starter`,causes:[`Not at peak activity`,`Too little inoculation`]},{label:`Flour`,causes:[`Low-protein flour`,`Stale whole wheat`]},{label:`Process`,causes:[`Underproofed bulk`,`Degassed at shaping`]},{label:`Environment`,causes:[`Kitchen below 22 °C`,`Dry air crusts the dough`]},{label:`Baking`,causes:[`No steam in the oven`,`Baked before full preheat`]},{label:`Timing`,causes:[`Rushed the poke test`]}],footer:`An Ishikawa fishbone groups candidate causes by category — work each rib tip-to-spine, then test the likeliest twig first.`},classdiagram:{title:`A tiny 2D drawing engine`,icon:`layers`,classes:[{name:`Drawable`,stereotype:`interface`,methods:[`+ draw(ctx): void`]},{name:`Shape`,stereotype:`abstract`,fields:[`# x: number`,`# y: number`],methods:[`+ move(dx, dy): void`,`+ area(): number`]},{name:`Circle`,fields:[`- radius: number`],methods:[`+ area(): number`]},{name:`Rectangle`,fields:[`- w: number`,`- h: number`],methods:[`+ area(): number`]},{name:`CanvasScene`,fields:[`- shapes: Shape[]`],methods:[`+ add(s: Shape): void`,`+ render(): void`]},{name:`Viewport`,fields:[`- zoom: number`,`- panX: number`,`- panY: number`]}],relations:[{from:`Shape`,to:`Drawable`,kind:`implements`},{from:`Circle`,to:`Shape`,kind:`inheritance`},{from:`Rectangle`,to:`Shape`,kind:`inheritance`},{from:`CanvasScene`,to:`Shape`,kind:`aggregation`,label:`shapes *`},{from:`CanvasScene`,to:`Viewport`,kind:`composition`},{from:`CanvasScene`,to:`Drawable`,kind:`dependency`,label:`renders via`}],footer:`Five of the six UML relation kinds in one figure: hollow triangle = inheritance (dashed when implementing an interface), filled diamond = composition, hollow diamond = aggregation, dashed open arrow = dependency.`}};export{e as default};
@@ -0,0 +1 @@
1
+ var e=[Object.freeze(JSON.parse(`{"displayName":"Diff","name":"diff","patterns":[{"captures":{"1":{"name":"punctuation.definition.separator.diff"}},"match":"^((\\\\*{15})|(={67})|(-{3}))$\\\\n?","name":"meta.separator.diff"},{"match":"^\\\\d+(,\\\\d+)*([acd])\\\\d+(,\\\\d+)*$\\\\n?","name":"meta.diff.range.normal"},{"captures":{"1":{"name":"punctuation.definition.range.diff"},"2":{"name":"meta.toc-list.line-number.diff"},"3":{"name":"punctuation.definition.range.diff"}},"match":"^(@@)\\\\s*(.+?)\\\\s*(@@)($\\\\n?)?","name":"meta.diff.range.unified"},{"captures":{"3":{"name":"punctuation.definition.range.diff"},"4":{"name":"punctuation.definition.range.diff"},"6":{"name":"punctuation.definition.range.diff"},"7":{"name":"punctuation.definition.range.diff"}},"match":"^(((-{3}) .+ (-{4}))|((\\\\*{3}) .+ (\\\\*{4})))$\\\\n?","name":"meta.diff.range.context"},{"match":"^diff --git a/.*$\\\\n?","name":"meta.diff.header.git"},{"match":"^diff (-|\\\\S+\\\\s+\\\\S+).*$\\\\n?","name":"meta.diff.header.command"},{"captures":{"4":{"name":"punctuation.definition.from-file.diff"},"6":{"name":"punctuation.definition.from-file.diff"},"7":{"name":"punctuation.definition.from-file.diff"}},"match":"^((((-{3}) .+)|((\\\\*{3}) .+))$\\\\n?|(={4}) .+(?= - ))","name":"meta.diff.header.from-file"},{"captures":{"2":{"name":"punctuation.definition.to-file.diff"},"3":{"name":"punctuation.definition.to-file.diff"},"4":{"name":"punctuation.definition.to-file.diff"}},"match":"(^(\\\\+{3}) .+$\\\\n?| (-) .* (={4})$\\\\n?)","name":"meta.diff.header.to-file"},{"captures":{"3":{"name":"punctuation.definition.inserted.diff"},"6":{"name":"punctuation.definition.inserted.diff"}},"match":"^(((>)( .*)?)|((\\\\+).*))$\\\\n?","name":"markup.inserted.diff"},{"captures":{"1":{"name":"punctuation.definition.changed.diff"}},"match":"^(!).*$\\\\n?","name":"markup.changed.diff"},{"captures":{"3":{"name":"punctuation.definition.deleted.diff"},"6":{"name":"punctuation.definition.deleted.diff"}},"match":"^(((<)( .*)?)|((-).*))$\\\\n?","name":"markup.deleted.diff"},{"begin":"^(#)","captures":{"1":{"name":"punctuation.definition.comment.diff"}},"end":"\\\\n","name":"comment.line.number-sign.diff"},{"match":"^index [0-9a-f]{7,40}\\\\.\\\\.[0-9a-f]{7,40}.*$\\\\n?","name":"meta.diff.index.git"},{"captures":{"1":{"name":"punctuation.separator.key-value.diff"},"2":{"name":"meta.toc-list.file-name.diff"}},"match":"^Index(:) (.+)$\\\\n?","name":"meta.diff.index"},{"match":"^Only in .*: .*$\\\\n?","name":"meta.diff.only-in"}],"scopeName":"source.diff"}`))];export{e as default};
@@ -0,0 +1,9 @@
1
+ var e={avatar:{title:`<Avatar />`,icon:`eye`,iconColor:`var(--presence-soft)`,name:`Maya Chen`,initials:`MC`,size:`lg`,status:`online`,ring:!0,color:`var(--presence)`,role:`Design Systems Lead`,footer:`Falls back: image → initials → glyph. Presence dot is a single prop.`},avatargroup:{title:`<AvatarGroup />`,icon:`share`,iconColor:`var(--insight)`,max:5,size:`md`,members:[{name:`Maya Chen`,initials:`MC`,color:`var(--presence)`,status:`online`,role:`Systems Lead`},{name:`Dev Patel`,initials:`DP`,color:`var(--insight)`,status:`busy`,role:`Engineer`},{name:`Lena Ortiz`,initials:`LO`,color:`var(--presence-soft)`,status:`online`,role:`Designer`},{name:`Sam Okafor`,initials:`SO`,color:`var(--warning)`,status:`away`,role:`PM`},{name:`Ivy Brooks`,initials:`IB`,color:`var(--insight)`,status:`offline`,role:`Engineer`},{name:`Theo Marsh`,initials:`TM`,color:`var(--presence)`,status:`online`,role:`Engineer`},{name:`Nora Kim`,initials:`NK`,color:`var(--presence-soft)`,status:`online`,role:`Designer`}],caption:`<b>12 contributors</b> on Aria Core this quarter`,footer:`Hover to spread the stack and name a face; overflow collapses to “+N”.`},badgeset:{title:`Tonight's categories`,icon:`layers`,iconColor:`var(--presence-soft)`,badges:[{label:`Animals`,variant:`solid`,color:`var(--presence)`,icon:`spark`},{label:`Space`,variant:`soft`,color:`var(--insight)`,icon:`moon`},{label:`Movies`,variant:`soft`,color:`var(--presence-soft)`,icon:`play`},{label:`Food`,variant:`outline`,color:`var(--warning)`,icon:`cart`},{label:`Geography`,variant:`dot`,color:`var(--text-muted)`,icon:`globe`}],countIcon:`bell`,count:3,countColor:`var(--warning)`,footer:`Three questions queued. Tap the bell when the room is ready.`},chipset:{title:`<Chip />, filter the registry`,icon:`table`,iconColor:`var(--insight)`,mode:`multi`,color:`var(--presence)`,chips:[{label:`Inputs`,icon:`edit`,color:`var(--presence)`,selected:!0},{label:`Overlays`,icon:`layers`,color:`var(--insight)`,selected:!0},{label:`Data viz`,icon:`chart`,color:`var(--presence-soft)`},{label:`Layout`,icon:`screen`,color:`var(--text-muted)`,removable:!0},{label:`Feedback`,icon:`bell`,color:`var(--warning)`,removable:!0}],summary:`Showing <b>2 categories</b>, toggle to filter, × to remove.`,footer:`Single or multi-select; chips can carry a leading icon or avatar.`},kbd:{title:`Docs keyboard shortcuts`,icon:`screen`,iconColor:`var(--presence-soft)`,active:0,color:`var(--presence)`,shortcuts:[{keys:[`⌘`,`K`],label:`Search the component registry`,icon:`spark`},{keys:[`⌘`,`⇧`,`C`],label:`Copy the import statement`,icon:`doc`},{keys:[`[`],label:`Toggle the props panel`,icon:`table`},{keys:[`G`,`T`],label:`Jump to tokens`,icon:`layers`},{keys:[`?`],label:`Show all shortcuts`,icon:`eye`}],footer:`Hover a row to highlight its key-caps, same kbd primitive used in ⌘K.`},codeblock:{title:`Usage, <Button />`,icon:`doc`,iconColor:`var(--insight)`,lang:`tsx`,filename:`CheckoutCard.tsx`,lineNumbers:!0,highlight:[5],code:`import { Button } from 'aria-ui';
2
+
3
+ export function Pay() {
4
+ return (
5
+ <Button variant="primary" size="lg">
6
+ Pay $48.00
7
+ </Button>
8
+ );
9
+ }`,footer:`Real syntax highlighting + copy button, line 5 is the prop API you’ll reach for most.`},banner:{title:`Please read first`,tone:`warning`,bannerIcon:`shield`,iconColor:`var(--warning)`,message:`I’m Mavéa, not a doctor, this is general information, <b>not a diagnosis</b>.`,detail:`Use it to feel calmer and more prepared, then trust your gut. If anything worries you, call your pediatrician or a nurse line, that’s always the right move.`,action:`I understand`,dismissible:!1,footer:`When in doubt, a real clinician who can see your child wins over any guide.`},toaststack:{title:`<Toast />, stacked & auto-dismiss`,icon:`bell`,iconColor:`var(--presence)`,duration:4e3,pushLabel:`Push a toast`,toasts:[{kind:`success`,title:`Component published`,desc:`<b>Avatar</b> v3.4 is live on the registry.`,icon:`check`},{kind:`info`,title:`Tokens synced`,desc:`Figma → code pushed <b>18 token</b> updates.`,icon:`layers`}],pool:[{kind:`warning`,title:`Deprecation`,desc:`<b>LegacyModal</b> ships its last patch this month.`,icon:`alert`},{kind:`error`,title:`Build failed`,desc:`Storybook visual diff found <b>2 regressions</b>.`,icon:`x`},{kind:`success`,title:`Snapshot approved`,desc:`All 240 stories matched baseline.`,icon:`check`}],footer:`Auto-dismiss bar counts down; the button cycles the pool.`},spinner:{title:`<Spinner />, loading states`,icon:`clock`,iconColor:`var(--presence-soft)`,caption:`Sizes S/M/L, plus an indeterminate bar for unknown durations.`,buttonLabel:`Publish component`,loadingLabel:`Publishing…`,color:`var(--presence)`,footer:`Press the button to see the in-flight state every async action shares.`},notification:{title:`<NotificationList />, registry activity`,icon:`bell`,iconColor:`var(--presence)`,markAllLabel:`Mark all read`,items:[{avatar:`MC`,color:`var(--presence)`,title:`<strong>Maya Chen</strong> published Avatar v3.4`,time:`8m`,unread:!0},{avatar:`DP`,color:`var(--insight)`,title:`<strong>Dev Patel</strong> opened a PR on Tooltip`,time:`41m`,unread:!0},{icon:`shield`,color:`var(--warning)`,title:`A11y audit flagged <strong>2 contrast</strong> warnings`,time:`2h`,unread:!0},{avatar:`LO`,color:`var(--presence-soft)`,title:`<strong>Lena Ortiz</strong> approved the token sync`,time:`5h`},{icon:`check`,color:`var(--insight)`,title:`Nightly visual diff passed, <strong>240/240</strong>`,time:`9h`}],footer:`Avatar or icon, relative time, unread dots, the in-app changelog feed.`}};export{e as default};