@hienlh/ppm 0.17.16 → 0.17.18

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 (464) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/cli-reference.md +4 -4
  4. package/assets/skills/ppm/references/http-api.md +5 -1
  5. package/dist/web/assets/{ai-resource-editor-CsossqDO.js → ai-resource-editor-BgWg-ty8.js} +1 -1
  6. package/dist/web/assets/{angular-html-CkxY2iBQ.js → angular-html-2g8YGiJY.js} +1 -1
  7. package/dist/web/assets/{angular-ts-BePeGkkC.js → angular-ts-BwSmoLfh.js} +1 -1
  8. package/dist/web/assets/{api-settings-DAk7D-NP.js → api-settings-BJTjIG4U.js} +1 -1
  9. package/dist/web/assets/{api-themes-84MT-XqR.js → api-themes-DuLpbQFV.js} +1 -1
  10. package/dist/web/assets/{apl-DBS7PWvB.js → apl-B44SMKHp.js} +1 -1
  11. package/dist/web/assets/architecture-PBZL5I3N-gLlhsjM9.js +1 -0
  12. package/dist/web/assets/{astro-Clbk1k4h.js → astro-E5620wek.js} +1 -1
  13. package/dist/web/assets/{audio-preview-DIkokvPM.js → audio-preview-CLn1LTxc.js} +1 -1
  14. package/dist/web/assets/{blade-BeBsBuGS.js → blade-D-VQWAHB.js} +1 -1
  15. package/dist/web/assets/{bsl-DYigT3JZ.js → bsl-Bq5qFzpU.js} +1 -1
  16. package/dist/web/assets/{cairo-BjpO78wI.js → cairo-Cn9-ZKRa.js} +1 -1
  17. package/dist/web/assets/chat-tab-tTUVo4G3.js +13 -0
  18. package/dist/web/assets/{cobol-CpuUx69s.js → cobol-IM3E3iCH.js} +1 -1
  19. package/dist/web/assets/code-editor-DMfUjdk5.js +10 -0
  20. package/dist/web/assets/{coffee-FoFd2Cxo.js → coffee-24wG7ekn.js} +1 -1
  21. package/dist/web/assets/{conflict-editor-Dqm1bkyL.js → conflict-editor-BosR4PW3.js} +3 -3
  22. package/dist/web/assets/{cpp-CO_nPfdr.js → cpp-DH9Cqt4g.js} +1 -1
  23. package/dist/web/assets/{crystal-D-UygAAF.js → crystal-4nZYHhdi.js} +1 -1
  24. package/dist/web/assets/{csv-preview-CvP4xzug.js → csv-preview-BqszurHp.js} +1 -1
  25. package/dist/web/assets/data-grid-overlay-editor-DxdOKRAY.js +1 -0
  26. package/dist/web/assets/data-grid-types-CzEQU9PJ.js +1 -0
  27. package/dist/web/assets/database-viewer-CiomoOU6.js +1 -0
  28. package/dist/web/assets/dialog-BpkAWOy8.js +1 -0
  29. package/dist/web/assets/{diff-viewer-BfWixe_z.js → diff-viewer-aOrOaGWx.js} +1 -1
  30. package/dist/web/assets/dist-Bn3E6I4R.js +11 -0
  31. package/dist/web/assets/{docx-preview-CguUoTKe.js → docx-preview-BAzpJdua.js} +1 -1
  32. package/dist/web/assets/{edge-BSzxzX11.js → edge-DTI9d2Qi.js} +1 -1
  33. package/dist/web/assets/{elixir-DH1-Mrep.js → elixir-Ys0wioho.js} +1 -1
  34. package/dist/web/assets/{elm-B0ln5J70.js → elm-Cihc9TAz.js} +1 -1
  35. package/dist/web/assets/{erb-GIz6NnlZ.js → erb-BwYBWK2-.js} +1 -1
  36. package/dist/web/assets/{erlang-B8MgYhib.js → erlang-CzlD_Joo.js} +1 -1
  37. package/dist/web/assets/esm-JLkfN0k-.js +2 -0
  38. package/dist/web/assets/{extension-webview-DTpFt1eL.js → extension-webview-CKUUvgOr.js} +1 -1
  39. package/dist/web/assets/{fortran-fixed-form-D_-TrK6U.js → fortran-fixed-form-CT90EtSp.js} +1 -1
  40. package/dist/web/assets/{fsharp-C9cLCk2b.js → fsharp-LasxezlU.js} +1 -1
  41. package/dist/web/assets/{gdresource-CsZ3lXwY.js → gdresource-XqgPdfiE.js} +1 -1
  42. package/dist/web/assets/{git-commit-xmq0KqrA.js → git-commit-CZBgPolw.js} +1 -1
  43. package/dist/web/assets/{git-log-panel-DUX7N5tN.js → git-log-panel-B6GFWhj4.js} +1 -1
  44. package/dist/web/assets/{git-rebase-D3O-jsSX.js → git-rebase-C2VzKDB1.js} +1 -1
  45. package/dist/web/assets/gitGraph-HDMCJU4V-BKGq--Jw.js +1 -0
  46. package/dist/web/assets/glide-data-grid-z9FPvRBG.js +138 -0
  47. package/dist/web/assets/{glimmer-js-g74gESrC.js → glimmer-js-DfjWcOLD.js} +1 -1
  48. package/dist/web/assets/{glimmer-ts-DF4aDWHT.js → glimmer-ts-DBldQATc.js} +1 -1
  49. package/dist/web/assets/{glsl-D5LmfW7l.js → glsl-CzNv1NPP.js} +1 -1
  50. package/dist/web/assets/{graphql-_KI4RuXL.js → graphql-DDyLtQb4.js} +1 -1
  51. package/dist/web/assets/group-chat-tab-Bu31mwmF.js +1 -0
  52. package/dist/web/assets/{hack-B1NaTC39.js → hack-CtoYNYkC.js} +1 -1
  53. package/dist/web/assets/{haml-DDFXadZ4.js → haml-CnBVap7G.js} +1 -1
  54. package/dist/web/assets/{handlebars-Bp-Jq3K9.js → handlebars-Dg51esUH.js} +1 -1
  55. package/dist/web/assets/{html-DyB9_5Tj.js → html-Ec2_evSy.js} +1 -1
  56. package/dist/web/assets/{html-derivative-CC60wi-3.js → html-derivative-Cy-F7ZqL.js} +1 -1
  57. package/dist/web/assets/{http-C-9qngH4.js → http-C236v8Tg.js} +1 -1
  58. package/dist/web/assets/{hurl-BtxgpNDs.js → hurl-0rMD2gPU.js} +1 -1
  59. package/dist/web/assets/{hxml-DOoOS9op.js → hxml-e5uS5jTD.js} +1 -1
  60. package/dist/web/assets/{image-preview-CZg6FQ3w.js → image-preview-CaX4gpN6.js} +1 -1
  61. package/dist/web/assets/index-4M24PSHW.js +50 -0
  62. package/dist/web/assets/index-BYFXiFsa.css +2 -0
  63. package/dist/web/assets/info-3K5VOQVL-BOhGriBF.js +1 -0
  64. package/dist/web/assets/{jinja-cN-150ao.js → jinja-DybFmhfq.js} +1 -1
  65. package/dist/web/assets/{jison-CqjsqPq5.js → jison-hkHbixdZ.js} +1 -1
  66. package/dist/web/assets/{julia-C-I5m8W4.js → julia-QnxY6sRE.js} +1 -1
  67. package/dist/web/assets/{just-CgsSW9zs.js → just-1Rs-nm8g.js} +1 -1
  68. package/dist/web/assets/keybindings-store-Cv-U85V6.js +1 -0
  69. package/dist/web/assets/{latex-BFzR9N2d.js → latex-jEBQqA7u.js} +1 -1
  70. package/dist/web/assets/{liquid-BWfr-_iC.js → liquid-DfJaZpxG.js} +1 -1
  71. package/dist/web/assets/{lua-DsXVun6g.js → lua-ti0Jr6-C.js} +1 -1
  72. package/dist/web/assets/{markdown-renderer-CiQkvWP_.js → markdown-renderer-BNXJygz9.js} +3 -3
  73. package/dist/web/assets/markdown-renderer-DCsEEdo7.js +1 -0
  74. package/dist/web/assets/{marko-DWBbo09n.js → marko-DNj4AhPg.js} +1 -1
  75. package/dist/web/assets/{mdc-CUMe9LOG.js → mdc-DPFwQFe4.js} +1 -1
  76. package/dist/web/assets/mobile-bottom-sheet--5_YEewV.js +1 -0
  77. package/dist/web/assets/{nextflow-CoYbADOm.js → nextflow-BUrFV5aB.js} +1 -1
  78. package/dist/web/assets/{nginx-z-JRZREw.js → nginx-BrW9NdOb.js} +1 -1
  79. package/dist/web/assets/{nim-Ci4LHyBm.js → nim-DS_6PF2p.js} +1 -1
  80. package/dist/web/assets/notification-store-DADt1gJH.js +1 -0
  81. package/dist/web/assets/{number-overlay-editor-lnnuUpPI.js → number-overlay-editor-CReXWiQ1.js} +1 -1
  82. package/dist/web/assets/packet-RMMSAZCW-CdLFnL8a.js +1 -0
  83. package/dist/web/assets/{panel-store-D6RV_ztx.js → panel-store-DnbT1c8L.js} +1 -1
  84. package/dist/web/assets/{pdf-preview-B6ZqANpw.js → pdf-preview-DZzbm9A4.js} +1 -1
  85. package/dist/web/assets/{perl-pbDimKOO.js → perl-ytm9vKO_.js} +1 -1
  86. package/dist/web/assets/{php-B003E5v7.js → php-DWTD1Usw.js} +1 -1
  87. package/dist/web/assets/pie-UPGHQEXC-COC-h0zz.js +1 -0
  88. package/dist/web/assets/{trash-2-CbbD5QF1.js → plus-DcuJuDC3.js} +1 -1
  89. package/dist/web/assets/postgres-viewer-BxpeiVkt.js +3 -0
  90. package/dist/web/assets/{project-store-Cekcjcom.js → project-store-Sbnqc41N.js} +1 -1
  91. package/dist/web/assets/{pug-AoueAWJo.js → pug-Bt7KL3_r.js} +1 -1
  92. package/dist/web/assets/{qml-CepxioQA.js → qml-Dexdon5J.js} +1 -1
  93. package/dist/web/assets/radar-KQ55EAFF-CiCfdJNL.js +1 -0
  94. package/dist/web/assets/{razor-lIvU-Gu-.js → razor-DnYCSl0G.js} +1 -1
  95. package/dist/web/assets/{rst-Dn-dwElE.js → rst-BEFYzwF8.js} +1 -1
  96. package/dist/web/assets/{ruby-DmsD1Iz5.js → ruby-BPaXFEjN.js} +1 -1
  97. package/dist/web/assets/{sas-6IM2P4YP.js → sas-CywiNBp8.js} +1 -1
  98. package/dist/web/assets/{scss-RgYEZQqh.js → scss-CGk0L6hN.js} +1 -1
  99. package/dist/web/assets/{settings-store-BkSf4SPQ.js → settings-store-DkRZhj-g.js} +2 -2
  100. package/dist/web/assets/settings-tab-DJOhpW09.js +1 -0
  101. package/dist/web/assets/{shaderlab-B0MNEwt4.js → shaderlab-Byjk0kH7.js} +1 -1
  102. package/dist/web/assets/{shellsession-F8S4LrQI.js → shellsession-DbA70QB6.js} +1 -1
  103. package/dist/web/assets/{soy-DDlMbX7u.js → soy-Bm97kWiA.js} +1 -1
  104. package/dist/web/assets/sparkles-B3DmG8PJ.js +1 -0
  105. package/dist/web/assets/{sparql-kthmGAAe.js → sparql-CawLnniT.js} +1 -1
  106. package/dist/web/assets/{sql-query-editor-BYNM0RRl.js → sql-query-editor-9TwIPvRj.js} +1 -1
  107. package/dist/web/assets/sqlite-viewer-D-3i_x28.js +1 -0
  108. package/dist/web/assets/{stata-Tfbew8La.js → stata-RifEDtNO.js} +1 -1
  109. package/dist/web/assets/{surrealql-C0LIGqRx.js → surrealql-DGRQa5Lm.js} +1 -1
  110. package/dist/web/assets/{svelte-CfTy8CGF.js → svelte-w9Hb12aM.js} +1 -1
  111. package/dist/web/assets/system-monitor-tab-CuVVp2wt.js +1 -0
  112. package/dist/web/assets/{tab-store-CcLQfu8H.js → tab-store-vn0viMOP.js} +1 -1
  113. package/dist/web/assets/{templ-V5H1Sbfy.js → templ-BpUwjJXV.js} +1 -1
  114. package/dist/web/assets/{terminal-tab-CK3lX-0Y.js → terminal-tab-DrSqSrdX.js} +2 -2
  115. package/dist/web/assets/{tex-C3H3uMZf.js → tex-DJFSsuTD.js} +1 -1
  116. package/dist/web/assets/tool-cards-CtE_JnF-.js +7 -0
  117. package/dist/web/assets/treemap-KZPCXAKY-CZwuSCtA.js +1 -0
  118. package/dist/web/assets/{ts-tags-7AXgG5YS.js → ts-tags-vp9Qvx2O.js} +1 -1
  119. package/dist/web/assets/{twig-BSyS38T3.js → twig-CoazxjRB.js} +1 -1
  120. package/dist/web/assets/{use-blob-url-CpyRr7Cx.js → use-blob-url-DdXgVqfz.js} +1 -1
  121. package/dist/web/assets/use-is-mobile-CE6AamG6.js +1 -0
  122. package/dist/web/assets/{use-monaco-theme-Jj2OxkAE.js → use-monaco-theme-BvzqffqR.js} +1 -1
  123. package/dist/web/assets/{vendor-mermaid-DGOXKrJC.js → vendor-mermaid-DPpYkrMf.js} +193 -193
  124. package/dist/web/assets/{video-preview-BOHxkwKG.js → video-preview-DxdyVATR.js} +1 -1
  125. package/dist/web/assets/{vue-C4d_br9u.js → vue-CnshsiXd.js} +1 -1
  126. package/dist/web/assets/{vue-html-CGdoz4vW.js → vue-html-CZshynFp.js} +1 -1
  127. package/dist/web/assets/{vue-vine-CqNolQlN.js → vue-vine-C5gtp_T1.js} +1 -1
  128. package/dist/web/assets/{xml-UmCmu-Od.js → xml-BEGJasgj.js} +1 -1
  129. package/dist/web/assets/{xsl-DJG6USGh.js → xsl-DXpRLjYk.js} +1 -1
  130. package/dist/web/index.html +22 -20
  131. package/dist/web/monacoeditorwork/css.worker.bundle.js +122 -122
  132. package/dist/web/monacoeditorwork/editor.worker.bundle.js +78 -78
  133. package/dist/web/monacoeditorwork/html.worker.bundle.js +110 -110
  134. package/dist/web/monacoeditorwork/json.worker.bundle.js +108 -108
  135. package/dist/web/monacoeditorwork/ts.worker.bundle.js +81 -81
  136. package/dist/web/sw.js +1 -1
  137. package/docs/journal/binary-self-upgrade-260724.md +66 -0
  138. package/nul/docs/claude-agent-sdk-reference.md +780 -0
  139. package/nul/docs/code-standards.md +1080 -0
  140. package/nul/docs/codebase-summary.md +916 -0
  141. package/nul/docs/deployment-guide.md +702 -0
  142. package/nul/docs/design-guidelines.md +767 -0
  143. package/nul/docs/extension-development-guide.md +629 -0
  144. package/nul/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
  145. package/nul/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
  146. package/nul/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
  147. package/nul/docs/journals/260414-2001-bundled-extensions.md +219 -0
  148. package/nul/docs/journals/260415-frontend-memory-optimization.md +73 -0
  149. package/nul/docs/lessons-learned.md +70 -0
  150. package/nul/docs/project-changelog.md +574 -0
  151. package/nul/docs/project-overview-pdr.md +205 -0
  152. package/nul/docs/project-roadmap.md +222 -0
  153. package/nul/docs/system-architecture.md +1961 -0
  154. package/package.json +1 -1
  155. package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
  156. package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
  157. package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
  158. package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
  159. package/spike-group-channel.mjs +156 -0
  160. package/spike-group-chat.mjs +181 -0
  161. package/src/server/routes/group-chat.ts +118 -9
  162. package/src/services/group-chat/agent-runner.ts +15 -2
  163. package/src/services/group-chat/context-window.ts +15 -0
  164. package/src/services/group-chat/group-chat.service.ts +178 -79
  165. package/src/services/group-chat/group-chat.store.ts +30 -0
  166. package/src/services/group-chat/responder-router.ts +110 -0
  167. package/src/services/group-chat/transcript-archive.ts +18 -0
  168. package/src/services/group-chat/turn-engine.ts +183 -105
  169. package/src/services/jsonl-transcript-parser.ts +36 -0
  170. package/src/types/group-chat-ws.ts +2 -2
  171. package/src/types/group-chat.ts +33 -4
  172. package/src/web/components/group-chat/group-chat-tab.tsx +109 -14
  173. package/src/web/components/group-chat/group-create-dialog.tsx +10 -3
  174. package/src/web/components/group-chat/group-full-transcript-view.tsx +9 -8
  175. package/src/web/components/group-chat/group-member-edit-dialog.tsx +108 -0
  176. package/src/web/components/group-chat/group-member-roster.tsx +51 -23
  177. package/src/web/components/group-chat/group-message-item.tsx +45 -26
  178. package/src/web/components/group-chat/group-transcript-messages.tsx +126 -0
  179. package/src/web/components/layout/cloud-share-popover.tsx +10 -2
  180. package/src/web/components/layout/mobile-drawer-tab-bar.tsx +10 -0
  181. package/src/web/components/layout/mobile-drawer.tsx +26 -9
  182. package/src/web/components/layout/nav-section-rail.tsx +8 -2
  183. package/src/web/components/layout/upgrade-button.tsx +33 -11
  184. package/src/web/hooks/use-group-chat.ts +8 -1
  185. package/src/web/lib/api-group-chat.ts +47 -4
  186. package/src/web/lib/sidebar-tabs/tab-registry.ts +3 -1
  187. package/dist/web/assets/architecture-PBZL5I3N-NAS99xy0.js +0 -1
  188. package/dist/web/assets/chat-tab-Bh6l253v.js +0 -18
  189. package/dist/web/assets/click-outside-container-DXZVmhaX.js +0 -1
  190. package/dist/web/assets/code-editor-B7F-d4DK.js +0 -10
  191. package/dist/web/assets/data-grid-overlay-editor-CUlFsD-D.js +0 -1
  192. package/dist/web/assets/database-viewer-5oNTPgjF.js +0 -1
  193. package/dist/web/assets/dist-BsziT-tR.js +0 -11
  194. package/dist/web/assets/esm-CjVeOTNQ.js +0 -2
  195. package/dist/web/assets/gitGraph-HDMCJU4V-B4I3L4Sf.js +0 -1
  196. package/dist/web/assets/glide-data-grid-7vB1SNne.js +0 -138
  197. package/dist/web/assets/group-chat-tab-CNECY-zg.js +0 -1
  198. package/dist/web/assets/index-D2G6kmTs.js +0 -50
  199. package/dist/web/assets/index-DCmrZnq0.css +0 -2
  200. package/dist/web/assets/info-3K5VOQVL-CBbbOe3C.js +0 -1
  201. package/dist/web/assets/input-24Nf_edC.js +0 -1
  202. package/dist/web/assets/keybindings-store-D8Cppv4w.js +0 -1
  203. package/dist/web/assets/notification-store-DOGxkWih.js +0 -1
  204. package/dist/web/assets/packet-RMMSAZCW-fr8-QSTF.js +0 -1
  205. package/dist/web/assets/pie-UPGHQEXC-Biu7_Pbb.js +0 -1
  206. package/dist/web/assets/postgres-viewer-B23xTCSs.js +0 -3
  207. package/dist/web/assets/radar-KQ55EAFF-CMtNRpK6.js +0 -1
  208. package/dist/web/assets/settings-tab-D5hAA1bY.js +0 -1
  209. package/dist/web/assets/sparkles-2ii4lR7b.js +0 -1
  210. package/dist/web/assets/sqlite-viewer-DW9f2Hqj.js +0 -1
  211. package/dist/web/assets/system-monitor-tab-B5f4pgdX.js +0 -1
  212. package/dist/web/assets/treemap-KZPCXAKY-ZYVFjoaN.js +0 -1
  213. package/dist/web/assets/use-websocket-DrDBgIWU.js +0 -1
  214. /package/dist/web/assets/{abap-BZ3J5hF3.js → abap-wT6fgqwv.js} +0 -0
  215. /package/dist/web/assets/{actionscript-3-CkyGfT-8.js → actionscript-3-CqcHpPYj.js} +0 -0
  216. /package/dist/web/assets/{ada-CxNLBoe7.js → ada-DWE3Hn4E.js} +0 -0
  217. /package/dist/web/assets/{andromeeda-BPN5rsDz.js → andromeeda-DpQ-y-Jt.js} +0 -0
  218. /package/dist/web/assets/{apache-C1F5wHL6.js → apache-LRTUP4r3.js} +0 -0
  219. /package/dist/web/assets/{apex-BaNixdO-.js → apex-DwVeH5_h.js} +0 -0
  220. /package/dist/web/assets/{api-client-Dvzcc_EO.js → api-client-BK4NPNoY.js} +0 -0
  221. /package/dist/web/assets/{applescript-Cl_pdcch.js → applescript-DyQiO9JU.js} +0 -0
  222. /package/dist/web/assets/{apply-theme-ORrEdHKT.js → apply-theme-DxKsrDLA.js} +0 -0
  223. /package/dist/web/assets/{ara-B6UAE7M2.js → ara-Cf-OWd2S.js} +0 -0
  224. /package/dist/web/assets/{asciidoc-D9c9Twki.js → asciidoc-gocbKcVK.js} +0 -0
  225. /package/dist/web/assets/{asm-CNmtv7Y9.js → asm-C3meb5HY.js} +0 -0
  226. /package/dist/web/assets/{aurora-x-C9z-NyzR.js → aurora-x-BYcXaCIg.js} +0 -0
  227. /package/dist/web/assets/{awk-BfLHEnKa.js → awk-BcT6nIdN.js} +0 -0
  228. /package/dist/web/assets/{ayu-dark-Bn7trkt_.js → ayu-dark-CLZPoccg.js} +0 -0
  229. /package/dist/web/assets/{ayu-light-Dpya9hPf.js → ayu-light-CTyRQdS2.js} +0 -0
  230. /package/dist/web/assets/{ayu-mirage-Cc0jfABD.js → ayu-mirage-DjqfqZdo.js} +0 -0
  231. /package/dist/web/assets/{ballerina-BtiCmN7T.js → ballerina-BCARR-zK.js} +0 -0
  232. /package/dist/web/assets/{bat-tmFM76zR.js → bat-_yaRjWOb.js} +0 -0
  233. /package/dist/web/assets/{beancount-BjPqRrcH.js → beancount-BPESBMS9.js} +0 -0
  234. /package/dist/web/assets/{berry-D0SQBxN2.js → berry-BSLE-Sf8.js} +0 -0
  235. /package/dist/web/assets/{bibtex-CkjRWQKr.js → bibtex-CvUWWCVx.js} +0 -0
  236. /package/dist/web/assets/{bicep-Bhq28Cxc.js → bicep--vcqqALZ.js} +0 -0
  237. /package/dist/web/assets/{bird2-DFGInYb3.js → bird2-Clclqgh6.js} +0 -0
  238. /package/dist/web/assets/{c-CP8cB4k_.js → c-CSC2LwTp.js} +0 -0
  239. /package/dist/web/assets/{c3-oRytyeWo.js → c3-Cl1_jUnm.js} +0 -0
  240. /package/dist/web/assets/{cadence-Inf1rGb7.js → cadence-BwAD7vSC.js} +0 -0
  241. /package/dist/web/assets/{catppuccin-frappe-DAzribQo.js → catppuccin-frappe-hr0HKoFX.js} +0 -0
  242. /package/dist/web/assets/{catppuccin-latte-B6Y_mCCQ.js → catppuccin-latte-DXEIYlFO.js} +0 -0
  243. /package/dist/web/assets/{catppuccin-macchiato-COLbYqVL.js → catppuccin-macchiato-B2zST7sA.js} +0 -0
  244. /package/dist/web/assets/{catppuccin-mocha-DKWaML1B.js → catppuccin-mocha-CvrdnYv9.js} +0 -0
  245. /package/dist/web/assets/{chevron-right-BBc6ATtm.js → chevron-right-DeUue2aK.js} +0 -0
  246. /package/dist/web/assets/{circle-question-mark-CveWaCux.js → circle-question-mark-PaJgx-3d.js} +0 -0
  247. /package/dist/web/assets/{clarity-_ZLLrrsX.js → clarity-BeQd5TQD.js} +0 -0
  248. /package/dist/web/assets/{clojure-DWGVCg_P.js → clojure-Csdo0vb_.js} +0 -0
  249. /package/dist/web/assets/{cmake-Cwh3mug7.js → cmake-Cf0q7ddg.js} +0 -0
  250. /package/dist/web/assets/{code-7ZAlTvsm.js → code-TekEnDFM.js} +0 -0
  251. /package/dist/web/assets/{codeowners-BdV6CFYi.js → codeowners-CUEzlC7R.js} +0 -0
  252. /package/dist/web/assets/{codeql-NvupDIDf.js → codeql-DxHyogQt.js} +0 -0
  253. /package/dist/web/assets/{common-lisp-B-vtBh5k.js → common-lisp-WLb-tAda.js} +0 -0
  254. /package/dist/web/assets/{coq-M8-FTfiZ.js → coq-DFtMD6Wn.js} +0 -0
  255. /package/dist/web/assets/{csharp-B7Ugdtd-.js → csharp-DEnvXVjs.js} +0 -0
  256. /package/dist/web/assets/{css-86k3Z-YA.js → css-DMPpCfkZ.js} +0 -0
  257. /package/dist/web/assets/{csv-BX5XYhfH.js → csv-DTSgNSaP.js} +0 -0
  258. /package/dist/web/assets/{csv-parser-d56Fzpwc.js → csv-parser-B_xNn07y.js} +0 -0
  259. /package/dist/web/assets/{cue-B7099gQa.js → cue-BEmVIZmd.js} +0 -0
  260. /package/dist/web/assets/{cypher-D99mWVIu.js → cypher-CncQVhvU.js} +0 -0
  261. /package/dist/web/assets/{d-CFE8oQwh.js → d-BzUSBVex.js} +0 -0
  262. /package/dist/web/assets/{dark-plus-BEeeDwdg.js → dark-plus-mysFNRq2.js} +0 -0
  263. /package/dist/web/assets/{dart-HVSWGnI5.js → dart-BBu3nkcE.js} +0 -0
  264. /package/dist/web/assets/{database-BLht7BVM.js → database-COYAMZaw.js} +0 -0
  265. /package/dist/web/assets/{dax-DjDgSJkh.js → dax-DcLVz9_9.js} +0 -0
  266. /package/dist/web/assets/{desktop-B5A3i7J1.js → desktop-DS2PdvoU.js} +0 -0
  267. /package/dist/web/assets/{diff-CpTrlaE9.js → diff-aUYk5Qys.js} +0 -0
  268. /package/dist/web/assets/{dist-BSCgJs-V.js → dist-Dxl3dqhC.js} +0 -0
  269. /package/dist/web/assets/{docker-xBhmJeHj.js → docker-12Lj1QUD.js} +0 -0
  270. /package/dist/web/assets/{dotenv-DKKhLEv5.js → dotenv-D-P4bzvl.js} +0 -0
  271. /package/dist/web/assets/{dracula-CVwQuzra.js → dracula-C-eRNn4o.js} +0 -0
  272. /package/dist/web/assets/{dracula-soft-CG6mB-lf.js → dracula-soft-CBB1BI7O.js} +0 -0
  273. /package/dist/web/assets/{dream-maker-SC-IdYY3.js → dream-maker-C_j5A0r7.js} +0 -0
  274. /package/dist/web/assets/{edit-diff-preview-C50i1H63.js → edit-diff-preview-CRMu-6r1.js} +0 -0
  275. /package/dist/web/assets/{emacs-lisp-CIBFq6W8.js → emacs-lisp-W54LT7rh.js} +0 -0
  276. /package/dist/web/assets/{everforest-dark-odRT_lec.js → everforest-dark-B_ISUDeh.js} +0 -0
  277. /package/dist/web/assets/{everforest-light-or1Voqjl.js → everforest-light-CNUYa354.js} +0 -0
  278. /package/dist/web/assets/{fennel-tQd1z3iu.js → fennel-DK82-oso.js} +0 -0
  279. /package/dist/web/assets/{file-exclamation-point-C-lL0g_E.js → file-exclamation-point-DBEC-Kst.js} +0 -0
  280. /package/dist/web/assets/{fish-DSuZQG0k.js → fish-CbJVJzQj.js} +0 -0
  281. /package/dist/web/assets/{fluent-D7xI8a8e.js → fluent-Cug5cOL1.js} +0 -0
  282. /package/dist/web/assets/{fortran-free-form-BlAtcPd3.js → fortran-free-form-amHz32Zw.js} +0 -0
  283. /package/dist/web/assets/{gdscript-VsEQXBPm.js → gdscript-t_G6VYpv.js} +0 -0
  284. /package/dist/web/assets/{gdshader-iqHMOdwW.js → gdshader-DqZaHh4E.js} +0 -0
  285. /package/dist/web/assets/{genie-C4XU4g1a.js → genie-CIJtFlZK.js} +0 -0
  286. /package/dist/web/assets/{gherkin-C4nfQzAB.js → gherkin-CalidqLY.js} +0 -0
  287. /package/dist/web/assets/{github-dark-B_pbG3CC.js → github-dark-BG2xX0wa.js} +0 -0
  288. /package/dist/web/assets/{github-dark-default-kFbx7C95.js → github-dark-default-tDp_EOBs.js} +0 -0
  289. /package/dist/web/assets/{github-dark-dimmed-CpVfQEqs.js → github-dark-dimmed-DlSfPwW2.js} +0 -0
  290. /package/dist/web/assets/{github-dark-high-contrast-DYKqQwZh.js → github-dark-high-contrast-qZM7j5KB.js} +0 -0
  291. /package/dist/web/assets/{github-light-gEYBmKaj.js → github-light-CnvWTiyb.js} +0 -0
  292. /package/dist/web/assets/{github-light-default-DVHfMPQ2.js → github-light-default-Dy6OAt2Q.js} +0 -0
  293. /package/dist/web/assets/{github-light-high-contrast-ClVJDu-q.js → github-light-high-contrast-1BHQCOPl.js} +0 -0
  294. /package/dist/web/assets/{gleam-BLaPu7ft.js → gleam-D-2cpXVX.js} +0 -0
  295. /package/dist/web/assets/{gn-BKgerUyI.js → gn-C1cC4xLc.js} +0 -0
  296. /package/dist/web/assets/{gnuplot-cqJuEFb-.js → gnuplot-2Gp459mV.js} +0 -0
  297. /package/dist/web/assets/{go-B2EHdyD8.js → go-BA1q0q8h.js} +0 -0
  298. /package/dist/web/assets/{groovy-DdImoj8s.js → groovy-BlIa-VfI.js} +0 -0
  299. /package/dist/web/assets/{gruvbox-dark-hard-DlwstAds.js → gruvbox-dark-hard-BMIwVwaJ.js} +0 -0
  300. /package/dist/web/assets/{gruvbox-dark-medium-CiYEd1vd.js → gruvbox-dark-medium-DxfuBW3n.js} +0 -0
  301. /package/dist/web/assets/{gruvbox-dark-soft-C-wEa4h4.js → gruvbox-dark-soft-_NSslDDi.js} +0 -0
  302. /package/dist/web/assets/{gruvbox-light-hard-BqYmfna-.js → gruvbox-light-hard-CP5MIsL9.js} +0 -0
  303. /package/dist/web/assets/{gruvbox-light-medium-CxmfalT2.js → gruvbox-light-medium-BTMursH0.js} +0 -0
  304. /package/dist/web/assets/{gruvbox-light-soft-DGWXXMCB.js → gruvbox-light-soft-Bv6zFoVX.js} +0 -0
  305. /package/dist/web/assets/{haskell-H_C_IuVb.js → haskell-Da8UeSv-.js} +0 -0
  306. /package/dist/web/assets/{haxe-CGNSMpeZ.js → haxe-mcKlcxBa.js} +0 -0
  307. /package/dist/web/assets/{hcl-B7bSTSQf.js → hcl-BdZcx5JX.js} +0 -0
  308. /package/dist/web/assets/{hjson-DlJ-glQZ.js → hjson-pFXYbN4t.js} +0 -0
  309. /package/dist/web/assets/{hlsl-CehW5SJN.js → hlsl-Z0II0KR8.js} +0 -0
  310. /package/dist/web/assets/{horizon-Beabcz2d.js → horizon-CufN8DyP.js} +0 -0
  311. /package/dist/web/assets/{horizon-bright-BC87RXPa.js → horizon-bright-5qoQVyIY.js} +0 -0
  312. /package/dist/web/assets/{houston-Da7RFwUy.js → houston-DOFkQwep.js} +0 -0
  313. /package/dist/web/assets/{hy-m1H70w19.js → hy-BVbDMDcG.js} +0 -0
  314. /package/dist/web/assets/{imba-MExFsdAA.js → imba-DRM6LLS5.js} +0 -0
  315. /package/dist/web/assets/{ini-CJy_zmwy.js → ini-2KCnNvmz.js} +0 -0
  316. /package/dist/web/assets/{java-DqDFvJBH.js → java-BmvH-Ou1.js} +0 -0
  317. /package/dist/web/assets/{javascript-C3Wyv22X.js → javascript-B7VhU1Yc.js} +0 -0
  318. /package/dist/web/assets/{json-DnGBw_DZ.js → json-X1pNk0n7.js} +0 -0
  319. /package/dist/web/assets/{json5-CRN-zoN4.js → json5-CJeEJPTg.js} +0 -0
  320. /package/dist/web/assets/{jsonc-CKRUZNRo.js → jsonc-C1haTBsf.js} +0 -0
  321. /package/dist/web/assets/{jsonl-CGfD6FrH.js → jsonl-wQ8-AJgs.js} +0 -0
  322. /package/dist/web/assets/{jsonnet-nbFuDj0o.js → jsonnet-BrEjY3Xh.js} +0 -0
  323. /package/dist/web/assets/{jssm-D0ShzIqD.js → jssm-C6LgYbOs.js} +0 -0
  324. /package/dist/web/assets/{jsx-D27hbRbs.js → jsx-B2cfD_Fb.js} +0 -0
  325. /package/dist/web/assets/{kanagawa-dragon-Ov3f8K0T.js → kanagawa-dragon-6UCcJpLw.js} +0 -0
  326. /package/dist/web/assets/{kanagawa-lotus-CLyOqh-g.js → kanagawa-lotus-DOmfpsRg.js} +0 -0
  327. /package/dist/web/assets/{kanagawa-wave-Kj3dzabH.js → kanagawa-wave-CpxmPE7N.js} +0 -0
  328. /package/dist/web/assets/{kdl-DFF58Gu4.js → kdl-BrLEivmb.js} +0 -0
  329. /package/dist/web/assets/{kotlin-BM4PKaB4.js → kotlin-BO2FUnDB.js} +0 -0
  330. /package/dist/web/assets/{kusto-DrvHLCv5.js → kusto-Cev1yiq9.js} +0 -0
  331. /package/dist/web/assets/{laserwave-Db6i6ZkO.js → laserwave-BlEkf-eH.js} +0 -0
  332. /package/dist/web/assets/{lean-D0hEjzwk.js → lean-BLS3Xk2w.js} +0 -0
  333. /package/dist/web/assets/{less-BEj4npGG.js → less-BXmcsqcq.js} +0 -0
  334. /package/dist/web/assets/{lib-CBdlQ75W.js → lib-CxSBdrd7.js} +0 -0
  335. /package/dist/web/assets/{light-plus-DLIIbDea.js → light-plus-DS6zriYl.js} +0 -0
  336. /package/dist/web/assets/{llvm-DMt6umsO.js → llvm-C_wLnJgX.js} +0 -0
  337. /package/dist/web/assets/{log-BopvdtPW.js → log-Cg8pvmWi.js} +0 -0
  338. /package/dist/web/assets/{logo-CYSUFPFR.js → logo-C9-kEvPW.js} +0 -0
  339. /package/dist/web/assets/{luau-XC611HNO.js → luau-NwaGugfZ.js} +0 -0
  340. /package/dist/web/assets/{make-BMYZIfBj.js → make-DBpJE-Z8.js} +0 -0
  341. /package/dist/web/assets/{markdown-BLza5nvF.js → markdown-B7ZTAu7B.js} +0 -0
  342. /package/dist/web/assets/{material-theme-Uw27UfJW.js → material-theme-BsXH-Mss.js} +0 -0
  343. /package/dist/web/assets/{material-theme-darker-dfqt8XBY.js → material-theme-darker-CW9OlIeY.js} +0 -0
  344. /package/dist/web/assets/{material-theme-lighter-CPtBTblV.js → material-theme-lighter-D2PAh0Kw.js} +0 -0
  345. /package/dist/web/assets/{material-theme-ocean-BfZgVqC-.js → material-theme-ocean-Vz6DBVi3.js} +0 -0
  346. /package/dist/web/assets/{material-theme-palenight-DAZoVYg8.js → material-theme-palenight-D-GleP3G.js} +0 -0
  347. /package/dist/web/assets/{matlab-cSzmquiW.js → matlab-C7MYlMSn.js} +0 -0
  348. /package/dist/web/assets/{mdx-Dq0kW5VM.js → mdx-FkOOX3Dq.js} +0 -0
  349. /package/dist/web/assets/{mermaid-DoIKF0yS.js → mermaid-C_9qw5it.js} +0 -0
  350. /package/dist/web/assets/{min-dark-DyraimDU.js → min-dark-BowNvxk2.js} +0 -0
  351. /package/dist/web/assets/{min-light-Co9cbcUv.js → min-light-x8oWUmbL.js} +0 -0
  352. /package/dist/web/assets/{mipsasm-ph6cKgHn.js → mipsasm-Dmi1AZOT.js} +0 -0
  353. /package/dist/web/assets/{mojo-BBT0XwmY.js → mojo-C6z7mry2.js} +0 -0
  354. /package/dist/web/assets/{monokai-IP0T5Rtg.js → monokai-BQ4e_Hn0.js} +0 -0
  355. /package/dist/web/assets/{moonbit-B8cogNXl.js → moonbit-CEeNIoB4.js} +0 -0
  356. /package/dist/web/assets/{move-DkY26NtM.js → move-bALfKUa7.js} +0 -0
  357. /package/dist/web/assets/{narrat-rBs3byG0.js → narrat-DX4JlAWT.js} +0 -0
  358. /package/dist/web/assets/{nextflow-groovy-DkO9wMLP.js → nextflow-groovy-CKQWtRkO.js} +0 -0
  359. /package/dist/web/assets/{night-owl-jVR4lFji.js → night-owl-D4PQd726.js} +0 -0
  360. /package/dist/web/assets/{night-owl-light-fBYJ7s3U.js → night-owl-light-BQo_YHll.js} +0 -0
  361. /package/dist/web/assets/{nix-WX9oavu6.js → nix-B1jThkGj.js} +0 -0
  362. /package/dist/web/assets/{nord-Cf7G21Pu.js → nord-35quHUKo.js} +0 -0
  363. /package/dist/web/assets/{nushell-DQdzcJ1H.js → nushell-L6DbJTuL.js} +0 -0
  364. /package/dist/web/assets/{objective-c-JSO2uvZ-.js → objective-c-CTZ4bR2U.js} +0 -0
  365. /package/dist/web/assets/{objective-cpp-CZMGJ9Fb.js → objective-cpp-Dm1YDIdA.js} +0 -0
  366. /package/dist/web/assets/{ocaml-C4S4NSDo.js → ocaml-B3n__LGy.js} +0 -0
  367. /package/dist/web/assets/{odin-Y2jXCgVq.js → odin-DmqZ8n3i.js} +0 -0
  368. /package/dist/web/assets/{one-dark-pro-dVIxuoJY.js → one-dark-pro-16_UaUig.js} +0 -0
  369. /package/dist/web/assets/{one-light-BQ1IKfD1.js → one-light-B-GGjWn5.js} +0 -0
  370. /package/dist/web/assets/{openscad-Bddw4I3z.js → openscad-DTFB9Sj6.js} +0 -0
  371. /package/dist/web/assets/{pascal-BKVXrzC1.js → pascal-RcT1dQYN.js} +0 -0
  372. /package/dist/web/assets/{pkl-BTd-YRsO.js → pkl-Dr4yLQ_o.js} +0 -0
  373. /package/dist/web/assets/{plastic-eiGvBIxV.js → plastic-hp2Nry0R.js} +0 -0
  374. /package/dist/web/assets/{plsql-C290tieP.js → plsql-pFcO4WZ0.js} +0 -0
  375. /package/dist/web/assets/{po-DyDwh0tx.js → po-BkZ0_HvY.js} +0 -0
  376. /package/dist/web/assets/{poimandres-B87zc_g-.js → poimandres-BcTrxj7f.js} +0 -0
  377. /package/dist/web/assets/{polar-Cdub1YMT.js → polar-DHK3q8FF.js} +0 -0
  378. /package/dist/web/assets/{postcss-BcI_3K0v.js → postcss-Bv7WzijA.js} +0 -0
  379. /package/dist/web/assets/{powerquery-OdMrkJSe.js → powerquery-DpaU_hW9.js} +0 -0
  380. /package/dist/web/assets/{powershell-C8auT6xg.js → powershell-_Rqc0MGP.js} +0 -0
  381. /package/dist/web/assets/{prisma-DIbVv8PA.js → prisma-wyegE8us.js} +0 -0
  382. /package/dist/web/assets/{prolog-DbTOH3Ld.js → prolog-DspHCURv.js} +0 -0
  383. /package/dist/web/assets/{proto-C4Cq2dCD.js → proto-BOBiNGf5.js} +0 -0
  384. /package/dist/web/assets/{puppet-DJp3uqum.js → puppet-DfLvV8h2.js} +0 -0
  385. /package/dist/web/assets/{purescript-CLsV4rPU.js → purescript-BY5ZSOZy.js} +0 -0
  386. /package/dist/web/assets/{python-2gBtEza2.js → python-B758mMeg.js} +0 -0
  387. /package/dist/web/assets/{qmldir-DfhULcua.js → qmldir-C75bpHvy.js} +0 -0
  388. /package/dist/web/assets/{qss-DK--VTTV.js → qss-DcLTlbLd.js} +0 -0
  389. /package/dist/web/assets/{r-BArBO2Sa.js → r-D0G_Y1P5.js} +0 -0
  390. /package/dist/web/assets/{racket-5mijHsVy.js → racket-DTye_5qn.js} +0 -0
  391. /package/dist/web/assets/{raku-ir0suElk.js → raku-uJXBXkV0.js} +0 -0
  392. /package/dist/web/assets/{react-J9g6e3Rq.js → react-CorNPdie.js} +0 -0
  393. /package/dist/web/assets/{red-DSecpIOT.js → red-rs3HE3re.js} +0 -0
  394. /package/dist/web/assets/{reg-Dp30FusS.js → reg-DkTIaX7a.js} +0 -0
  395. /package/dist/web/assets/{regexp-DXJnEM_6.js → regexp-4TLSs4_m.js} +0 -0
  396. /package/dist/web/assets/{rel-Dr483ozj.js → rel-B0jumCjt.js} +0 -0
  397. /package/dist/web/assets/{resolve-theme-DJORYzKu.js → resolve-theme-CCoakF2E.js} +0 -0
  398. /package/dist/web/assets/{riscv-ZfBy5IA1.js → riscv-DtaWMlo0.js} +0 -0
  399. /package/dist/web/assets/{ron-ZJ_CljGP.js → ron-BCPxwJD6.js} +0 -0
  400. /package/dist/web/assets/{rose-pine-CcW_eJ6G.js → rose-pine-CNryoqGi.js} +0 -0
  401. /package/dist/web/assets/{rose-pine-dawn-v2l_UF-j.js → rose-pine-dawn-C-gJOQVP.js} +0 -0
  402. /package/dist/web/assets/{rose-pine-moon-CNXkwf3D.js → rose-pine-moon-BdXSXpZh.js} +0 -0
  403. /package/dist/web/assets/{rosmsg-BMYMVW84.js → rosmsg-CPG8X-D5.js} +0 -0
  404. /package/dist/web/assets/{rust-BR-zJh5q.js → rust-CxfW3ePx.js} +0 -0
  405. /package/dist/web/assets/{sass-BukPOBFz.js → sass-D-7bxo_L.js} +0 -0
  406. /package/dist/web/assets/{save-DO5xjW95.js → save-BM4p9_9n.js} +0 -0
  407. /package/dist/web/assets/{scala-DUFY7D6D.js → scala-DyUsfHNc.js} +0 -0
  408. /package/dist/web/assets/{scheme-Dl-dNNxQ.js → scheme-ROgrwiO-.js} +0 -0
  409. /package/dist/web/assets/{sdbl-DdmlQhia.js → sdbl-B1EAQWpp.js} +0 -0
  410. /package/dist/web/assets/{shellscript-UyhrvGcd.js → shellscript-HhmB_Ufy.js} +0 -0
  411. /package/dist/web/assets/{shield-check-m2QzZTuZ.js → shield-check-C3qYSU8a.js} +0 -0
  412. /package/dist/web/assets/{shield-off-DNn7VzJe.js → shield-off-D5tU7gQT.js} +0 -0
  413. /package/dist/web/assets/{slack-dark-Cv6Szr-q.js → slack-dark-DnmSY72G.js} +0 -0
  414. /package/dist/web/assets/{slack-ochin-V6Ii3lAm.js → slack-ochin-q97gHjcd.js} +0 -0
  415. /package/dist/web/assets/{smalltalk-BUCv5G91.js → smalltalk-B-1waXvA.js} +0 -0
  416. /package/dist/web/assets/{snazzy-light-B67a78qi.js → snazzy-light-C8yWDN2g.js} +0 -0
  417. /package/dist/web/assets/{solarized-dark-ccWnfYyA.js → solarized-dark-ClVDEMJZ.js} +0 -0
  418. /package/dist/web/assets/{solarized-light-C3WyRO5I.js → solarized-light-Bts6CUIP.js} +0 -0
  419. /package/dist/web/assets/{solidity-BFbRPNi_.js → solidity-DYxwp0om.js} +0 -0
  420. /package/dist/web/assets/{splunk-zdpwCJLE.js → splunk-jK6-Sr06.js} +0 -0
  421. /package/dist/web/assets/{sql-B2IPUsfz.js → sql-DPpd8aUS.js} +0 -0
  422. /package/dist/web/assets/{ssh-config-Co4cXifq.js → ssh-config-Bimb9LVr.js} +0 -0
  423. /package/dist/web/assets/{stylus-CmI75XY8.js → stylus-B2DgJRJw.js} +0 -0
  424. /package/dist/web/assets/{swift-Dfks9YQI.js → swift-ChEH2nFL.js} +0 -0
  425. /package/dist/web/assets/{synthwave-84-B3LERzNS.js → synthwave-84-DwSLbgAm.js} +0 -0
  426. /package/dist/web/assets/{system-verilog-BFvldiwl.js → system-verilog-DoVBMhJ8.js} +0 -0
  427. /package/dist/web/assets/{systemd-Cu4Vvgbu.js → systemd--Ux4VAYD.js} +0 -0
  428. /package/dist/web/assets/{table-CAVmgQMT.js → table-Di8pv2Y_.js} +0 -0
  429. /package/dist/web/assets/{talonscript-Bnq32pUB.js → talonscript-DQNx9nak.js} +0 -0
  430. /package/dist/web/assets/{tasl-Nwe2K3J1.js → tasl-Bwy_Y9uD.js} +0 -0
  431. /package/dist/web/assets/{tcl-zOnpywrl.js → tcl-Drea-2jA.js} +0 -0
  432. /package/dist/web/assets/{terraform-Bc9Vj-n3.js → terraform-4rS5HoFk.js} +0 -0
  433. /package/dist/web/assets/{tokyo-night-9_KyM8M2.js → tokyo-night-C9MqaxIn.js} +0 -0
  434. /package/dist/web/assets/{toml-ByH-fxOY.js → toml-tSgOSv42.js} +0 -0
  435. /package/dist/web/assets/{tsv-DrCnDClP.js → tsv-BmL4O1Zx.js} +0 -0
  436. /package/dist/web/assets/{tsx-B8LafSYr.js → tsx-BwzeA880.js} +0 -0
  437. /package/dist/web/assets/{turtle-DuyP_QCJ.js → turtle-2DYvssFL.js} +0 -0
  438. /package/dist/web/assets/{typescript-BTBJb5RD.js → typescript-ZC-vonSh.js} +0 -0
  439. /package/dist/web/assets/{typespec-DdOFo7M5.js → typespec-DkCEO45F.js} +0 -0
  440. /package/dist/web/assets/{typst-LYvnBWQu.js → typst-DAZdb2n6.js} +0 -0
  441. /package/dist/web/assets/{utils-CTg5uAYR.js → utils-CSCvNZxE.js} +0 -0
  442. /package/dist/web/assets/{v-BuBYA1_x.js → v-B_wsb4C1.js} +0 -0
  443. /package/dist/web/assets/{vala-vRIBYYe3.js → vala-BDBNS784.js} +0 -0
  444. /package/dist/web/assets/{vb-DwGi-IYM.js → vb-CuOoJSSa.js} +0 -0
  445. /package/dist/web/assets/{vendor-xterm-i6SHFTfU.js → vendor-xterm-CImj6i6Z.js} +0 -0
  446. /package/dist/web/assets/{verilog-6B1X4G2-.js → verilog-BCcOvOcc.js} +0 -0
  447. /package/dist/web/assets/{vesper-Dw1y_Ae7.js → vesper-vN8CREK5.js} +0 -0
  448. /package/dist/web/assets/{vhdl-DK8JwBzJ.js → vhdl-CI8PoqeM.js} +0 -0
  449. /package/dist/web/assets/{viml-BTKIEIqm.js → viml-B66dNP1B.js} +0 -0
  450. /package/dist/web/assets/{vitesse-black-BqqolhEg.js → vitesse-black-0bGIaCfD.js} +0 -0
  451. /package/dist/web/assets/{vitesse-dark-B9JL5WQA.js → vitesse-dark-Dk-RSXq-.js} +0 -0
  452. /package/dist/web/assets/{vitesse-light-DYJKj2se.js → vitesse-light-BUsA5RhG.js} +0 -0
  453. /package/dist/web/assets/{vyper-D-jDI3WH.js → vyper-dNodzEa8.js} +0 -0
  454. /package/dist/web/assets/{wasm-1-GlNdpk.js → wasm-BDxaNPCj.js} +0 -0
  455. /package/dist/web/assets/{wasm-BBW4WmT2.js → wasm-d6SE2_qm.js} +0 -0
  456. /package/dist/web/assets/{wenyan-B6cM7sDO.js → wenyan-D0h8Uz55.js} +0 -0
  457. /package/dist/web/assets/{wgsl-FaHGQgko.js → wgsl-vKs_vsvQ.js} +0 -0
  458. /package/dist/web/assets/{wikitext-DtIyPUrk.js → wikitext-BIWsPJit.js} +0 -0
  459. /package/dist/web/assets/{wit-BMVRif5Y.js → wit-6vmKi2H3.js} +0 -0
  460. /package/dist/web/assets/{wolfram-DQsCGohn.js → wolfram-zoNg6F1a.js} +0 -0
  461. /package/dist/web/assets/{x-C2VSAp7O.js → x-BsFLg-T8.js} +0 -0
  462. /package/dist/web/assets/{yaml-C-Va56Gt.js → yaml-W95qP6-B.js} +0 -0
  463. /package/dist/web/assets/{zenscript-DdobKGI-.js → zenscript-BxircxDx.js} +0 -0
  464. /package/dist/web/assets/{zig-vqDFwj6q.js → zig-DD79WQtz.js} +0 -0
@@ -0,0 +1,767 @@
1
+ # PPM Design Guidelines
2
+
3
+ ## Design Philosophy
4
+
5
+ **PPM** prioritizes **clarity, efficiency, and accessibility** over decoration. The UI should feel lightweight, responsive, and get out of the way of actual development work.
6
+
7
+ **Core Principles:**
8
+ 1. **Mobile-first** — Design for small screens, scale up
9
+ 2. **Dark-mode default** — Reduce eye strain during long coding sessions
10
+ 3. **Minimal chrome** — Maximize editor/terminal space
11
+ 4. **Keyboard-friendly** — Power users prefer shortcuts
12
+ 5. **Accessible** — WCAG 2.1 AA compliance
13
+ 6. **Consistent** — Reuse patterns across features
14
+
15
+ ---
16
+
17
+ ## Mobile-First UI Rules (MANDATORY)
18
+
19
+ These rules MUST be followed when creating or modifying any UI component. PPM is primarily used on phones and tablets.
20
+
21
+ ### 1. Dialogs → Bottom Sheet on Mobile
22
+ - **NEVER** use `<Dialog>` alone. All dialogs MUST render as bottom sheets on mobile (`md:` breakpoint).
23
+ - Desktop (`md:` and above): centered dialog is fine
24
+ - Mobile (below `md:`): full-width bottom sheet, slides up from bottom, max-height 85vh, rounded top corners
25
+ - Pattern: use `hidden md:block` for desktop dialog, `md:hidden` for mobile bottom sheet, or a responsive wrapper
26
+
27
+ ### 2. No Hover States on Touch Devices
28
+ - **NEVER** rely on `hover:` for essential interactions or information disclosure
29
+ - Hover states are acceptable for desktop enhancement but must have a touch alternative
30
+ - Use `active:` or `pressed` states for touch feedback instead
31
+ - Action buttons hidden behind `hover:` MUST use the `can-hover:` variant (defined in `globals.css` via `@media (hover: hover) and (pointer: fine)`)
32
+ - Pattern: `can-hover:opacity-0 can-hover:group-hover:opacity-100` — buttons visible on touch devices, hover-reveal on mouse devices
33
+ - For `hidden`/`flex` toggles: `flex can-hover:hidden can-hover:group-hover:flex`
34
+ - **DO NOT** use `md:opacity-0 md:group-hover:opacity-100` — iPad matches `md:` but has no hover
35
+
36
+ ### 3. Touch Targets
37
+ - Minimum touch target: **44×44px** (Apple HIG)
38
+ - Minimum spacing between interactive elements: **8px**
39
+ - Prefer `py-3 px-4` over `py-1 px-2` for buttons on mobile
40
+ - Icon-only buttons: minimum `size-10` (40px) with padding
41
+
42
+ ### 4. Context Menus → Long-Press or Inline Actions
43
+ - **NEVER** use right-click context menus as the only way to access actions on mobile
44
+ - Use long-press (400ms) with `select-none` to prevent text selection
45
+ - Or show inline action buttons that are always visible on mobile
46
+ - Pattern: `useLongPress` hook for touch, `onContextMenu` for desktop
47
+
48
+ ### 5. Scrolling & Overflow
49
+ - Lists MUST scroll independently, not the whole page
50
+ - Use `overflow-y-auto` on scroll containers, not on body
51
+ - Avoid horizontal scroll unless explicitly needed (tab bars)
52
+ - Test that touch scrolling doesn't accidentally trigger tap actions
53
+
54
+ ### 6. Text & Spacing
55
+ - Body text: minimum `text-sm` (14px) on mobile, `text-xs` (12px) only for metadata/labels
56
+ - Line spacing: `leading-relaxed` for readability on small screens
57
+ - Padding: `p-4` minimum for content areas on mobile, `p-2` acceptable for compact lists
58
+
59
+ ### 7. Layout Patterns
60
+ - Mobile: single-column layout, full-width components
61
+ - Desktop: multi-column, sidebars, split views
62
+ - Use `flex-col md:flex-row` for responsive layouts
63
+ - Sidebar content → drawer/bottom sheet on mobile
64
+
65
+ ### 8. Forms
66
+ - Input fields: full width on mobile (`w-full`)
67
+ - Labels above inputs, not beside (saves horizontal space)
68
+ - Use native `<select>` or bottom sheet pickers on mobile, not custom dropdowns
69
+ - Auto-focus first input on dialog/sheet open
70
+
71
+ ### 9. Thumb Zone — One-Handed Reachability
72
+ - Primary actions (submit, confirm, navigate) MUST be in the **bottom 1/3** of the screen on mobile
73
+ - Navigation bars → bottom, not top
74
+ - Destructive/secondary actions can be in upper areas (harder to reach = harder to accidentally tap)
75
+ - FABs (floating action buttons) → bottom-right corner
76
+ - Avoid placing frequently-used buttons in top corners — unreachable with one thumb
77
+ ```
78
+ ┌─────────────────────┐
79
+ │ ❌ Hard to reach │ ← Secondary/rare actions only
80
+ │ │
81
+ ├─────────────────────┤
82
+ │ ⚠️ Stretch zone │ ← Content, read-only info
83
+ │ │
84
+ ├─────────────────────┤
85
+ │ ✅ Thumb zone │ ← Primary actions, navigation,
86
+ │ Submit, confirm, │ inputs, frequently-used buttons
87
+ │ tab bar, FAB │
88
+ └─────────────────────┘
89
+ ```
90
+
91
+ ### 10. Existing Patterns to Follow
92
+ - `MobileDrawer` (`src/web/components/layout/mobile-drawer.tsx`) — slide-in drawer for sidebar
93
+ - `ProjectBottomSheet` (`src/web/components/layout/project-bottom-sheet.tsx`) — bottom sheet pattern
94
+ - `useLongPress` in `git-status-panel.tsx` — long-press for context menus
95
+ - `hidden md:block` / `md:hidden` — responsive show/hide pattern
96
+
97
+ ---
98
+
99
+ ## UI Framework Stack
100
+
101
+ ### Tailwind CSS 4.2
102
+ - Utility-first CSS framework
103
+ - Dark mode support (class-based: `dark:` prefix)
104
+ - Responsive breakpoints (`sm:`, `md:`, `lg:`, `xl:`, `2xl:`)
105
+ - Custom configuration in `tailwind.config.ts`
106
+
107
+ ### Radix UI 1.4.3
108
+ - Unstyled, accessible components
109
+ - Provides accessibility (ARIA, keyboard navigation)
110
+ - Examples: Dialog, Dropdown, Tooltip, Tabs
111
+ - No CSS imports; styled with Tailwind
112
+
113
+ ### shadcn/ui (New York Style)
114
+ - Pre-built Radix components with Tailwind styling
115
+ - Copy-paste component library (not npm-installed)
116
+ - Located in `src/web/components/ui/`
117
+ - Customizable and maintainable
118
+
119
+ ### Lucide Icons
120
+ - Clean, consistent icon set
121
+ - 600+ icons available
122
+ - Usage: `import { FileIcon, FolderIcon } from "lucide-react"`
123
+
124
+ ---
125
+
126
+ ## Color Scheme
127
+
128
+ ### Light Mode
129
+
130
+ | Purpose | Color | Tailwind | Usage |
131
+ |---------|-------|----------|-------|
132
+ | Background | #FFFFFF | `bg-white` | Page background |
133
+ | Foreground | #000000 | `text-black` | Primary text |
134
+ | Sidebar | #F3F4F6 | `bg-gray-100` | Navigation panel |
135
+ | Border | #E5E7EB | `border-gray-200` | Dividers, edges |
136
+ | Accent | #3B82F6 | `bg-blue-500` | Links, active states |
137
+ | Hover | #DBEAFE | `hover:bg-blue-100` | Interactive states |
138
+ | Danger | #EF4444 | `bg-red-500` | Destructive actions |
139
+ | Success | #10B981 | `bg-green-500` | Positive feedback |
140
+
141
+ ### Dark Mode
142
+
143
+ | Purpose | Color | Tailwind | Usage |
144
+ |---------|-------|----------|-------|
145
+ | Background | #0F172A | `dark:bg-slate-950` | Page background |
146
+ | Foreground | #F1F5F9 | `dark:text-slate-100` | Primary text |
147
+ | Sidebar | #1E293B | `dark:bg-slate-800` | Navigation panel |
148
+ | Border | #334155 | `dark:border-slate-700` | Dividers, edges |
149
+ | Accent | #3B82F6 | `dark:bg-blue-500` | Links, active states |
150
+ | Hover | #1E3A8A | `dark:hover:bg-blue-900` | Interactive states |
151
+ | Danger | #EF4444 | `dark:bg-red-600` | Destructive actions |
152
+ | Success | #10B981 | `dark:bg-green-600` | Positive feedback |
153
+
154
+ ### Implementation
155
+
156
+ ```tsx
157
+ // Auto-detected based on system preference
158
+ // Or manually controlled via SettingsStore
159
+
160
+ // Dark mode uses: <html class="dark">
161
+ // Tailwind applies dark: prefix styles
162
+
163
+ // Example component
164
+ <button className="bg-white dark:bg-slate-800 text-black dark:text-white">
165
+ Click me
166
+ </button>
167
+ ```
168
+
169
+ ---
170
+
171
+ ## Typography
172
+
173
+ ### Font Stack
174
+
175
+ ```css
176
+ /* tailwind.config.ts */
177
+ theme: {
178
+ fontFamily: {
179
+ sans: ['Inter', 'system-ui', 'sans-serif'],
180
+ mono: ['JetBrains Mono', 'Monaco', 'Courier New', 'monospace'],
181
+ }
182
+ }
183
+ ```
184
+
185
+ ### Type Scale
186
+
187
+ | Usage | Size | Line Height | Weight |
188
+ |-------|------|-------------|--------|
189
+ | H1 (Title) | 32px | 1.2 | 700 (bold) |
190
+ | H2 (Heading) | 24px | 1.3 | 600 (semibold) |
191
+ | H3 (Subheading) | 20px | 1.4 | 600 (semibold) |
192
+ | Body | 14px | 1.5 | 400 (regular) |
193
+ | Small | 12px | 1.4 | 400 (regular) |
194
+ | Code | 13px | 1.6 | 400 (monospace) |
195
+
196
+ ### Example
197
+
198
+ ```tsx
199
+ // Heading
200
+ <h1 className="text-2xl font-bold">PPM</h1>
201
+
202
+ // Body text
203
+ <p className="text-sm text-gray-600 dark:text-gray-400">
204
+ Descriptive text
205
+ </p>
206
+
207
+ // Code/terminal text
208
+ <code className="font-mono text-xs bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded">
209
+ npm install
210
+ </code>
211
+ ```
212
+
213
+ ---
214
+
215
+ ## Component Patterns
216
+
217
+ ### Button Component
218
+
219
+ ```tsx
220
+ // Base button from shadcn/ui
221
+ import { Button } from "@/components/ui/button";
222
+
223
+ // Variants
224
+ <Button>Primary</Button>
225
+ <Button variant="outline">Outline</Button>
226
+ <Button variant="ghost">Ghost</Button>
227
+ <Button variant="destructive">Delete</Button>
228
+ <Button disabled>Disabled</Button>
229
+
230
+ // Sizes
231
+ <Button size="sm">Small</Button>
232
+ <Button size="default">Default</Button>
233
+ <Button size="lg">Large</Button>
234
+ ```
235
+
236
+ ### Input Component
237
+
238
+ ```tsx
239
+ import { Input } from "@/components/ui/input";
240
+
241
+ <Input
242
+ type="text"
243
+ placeholder="Enter search..."
244
+ className="h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
245
+ />
246
+ ```
247
+
248
+ ### Dialog Component
249
+
250
+ ```tsx
251
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
252
+
253
+ <Dialog open={isOpen} onOpenChange={setIsOpen}>
254
+ <DialogContent>
255
+ <DialogHeader>
256
+ <DialogTitle>Confirm Action</DialogTitle>
257
+ </DialogHeader>
258
+ <p>Are you sure?</p>
259
+ </DialogContent>
260
+ </Dialog>
261
+ ```
262
+
263
+ ### Dropdown Menu
264
+
265
+ ```tsx
266
+ import {
267
+ DropdownMenu,
268
+ DropdownMenuContent,
269
+ DropdownMenuItem,
270
+ DropdownMenuTrigger,
271
+ } from "@/components/ui/dropdown-menu";
272
+
273
+ <DropdownMenu>
274
+ <DropdownMenuTrigger asChild>
275
+ <Button variant="ghost" size="sm">•••</Button>
276
+ </DropdownMenuTrigger>
277
+ <DropdownMenuContent>
278
+ <DropdownMenuItem>Edit</DropdownMenuItem>
279
+ <DropdownMenuItem>Delete</DropdownMenuItem>
280
+ </DropdownMenuContent>
281
+ </DropdownMenu>
282
+ ```
283
+
284
+ ---
285
+
286
+ ## Layout Structure
287
+
288
+ ### Desktop Layout
289
+
290
+ ```
291
+ ┌─────────────────────────────────────────────────────────┐
292
+ │ Sidebar (300px) │ MainArea │
293
+ ├──────────────────┼─────────────────────────────────────┤
294
+ │ Project Selector │ ┌───────────────────────────────────┐│
295
+ ├──────────────────┤ │ TabBar (Chat | Editor | Git | … )││
296
+ │ File Explorer │ ├───────────────────────────────────┤│
297
+ │ │ │ Tab Content (varies) ││
298
+ │ • src/ │ │ CodeEditor, ChatTab, etc. ││
299
+ │ - main.ts │ │ ││
300
+ │ - utils.ts │ │ ││
301
+ │ │ │ ││
302
+ │ • dist/ │ │ (Fills remaining space) ││
303
+ │ │ │ ││
304
+ │ │ │ ││
305
+ │ │ └───────────────────────────────────┘│
306
+ └──────────────────┴─────────────────────────────────────┘
307
+ ```
308
+
309
+ **Sidebar:** 300px fixed, scrollable, dark background
310
+ **MainArea:** Flex 1, contains TabBar + content
311
+ **TabBar:** Horizontal tabs (chat, editor, git, terminal, settings)
312
+ **Content:** Flex, fills remaining space, scrollable if needed
313
+
314
+ ### Mobile Layout
315
+
316
+ ```
317
+ ┌─────────────────────────────────────┐
318
+ │ ☰ | Project Selector | ⚙️ │
319
+ ├─────────────────────────────────────┤
320
+ │ MainArea (full width) │
321
+ │ │
322
+ │ ChatTab / EditorTab / etc. │
323
+ │ │
324
+ │ (Sidebar hidden, accessible via ☰) │
325
+ ├─────────────────────────────────────┤
326
+ │ TabBar (bottom, horizontal scroll) │
327
+ │ [Chat] [Editor] [Git] [Terminal] │
328
+ └─────────────────────────────────────┘
329
+ ```
330
+
331
+ **Header:** Project selector + hamburger menu
332
+ **Content:** Full-width tab content
333
+ **TabBar:** Bottom navigation (mobile-friendly)
334
+ **Sidebar:** Slide-in drawer (MobileDrawer component)
335
+
336
+ ### Responsive Breakpoints
337
+
338
+ ```typescript
339
+ // tailwind.config.ts
340
+ screens: {
341
+ sm: '640px', // Mobile
342
+ md: '768px', // Tablet
343
+ lg: '1024px', // Desktop
344
+ xl: '1280px', // Wide desktop
345
+ '2xl': '1536px' // Ultra-wide
346
+ }
347
+ ```
348
+
349
+ **Rules:**
350
+ - `sm:` and below — Mobile optimizations
351
+ - `md:` and above — Show sidebar
352
+ - `lg:` and above — Full-width optimizations
353
+
354
+ ---
355
+
356
+ ## Component Library Usage
357
+
358
+ ### File Tree Component
359
+
360
+ ```tsx
361
+ // src/web/components/explorer/file-tree.tsx
362
+ // Shows directory structure with expand/collapse
363
+
364
+ <FileTree
365
+ root={project.root}
366
+ onSelect={(file) => openFile(file)}
367
+ onContextMenu={(file) => showMenu(file)}
368
+ />
369
+
370
+ // Features:
371
+ // - Lazy load directories (expand on click)
372
+ // - File icons based on extension
373
+ // - Highlight current file
374
+ // - Right-click context menu (create, delete, etc.)
375
+ ```
376
+
377
+ ### Code Editor
378
+
379
+ ```tsx
380
+ // src/web/components/editor/code-editor.tsx
381
+ // Monaco Editor integration (@monaco-editor/react)
382
+
383
+ <CodeEditor
384
+ language="javascript"
385
+ value={fileContent}
386
+ onChange={setFileContent}
387
+ theme="dark"
388
+ readOnly={false}
389
+ />
390
+
391
+ // Features:
392
+ // - 50+ language support with IntelliSense
393
+ // - Real-time syntax highlighting
394
+ // - Line numbers, code folding
395
+ // - Find/replace (Ctrl+H)
396
+ // - Word wrap toggle (Alt+Z)
397
+ // - Monaco diff viewer for git diffs
398
+ // - Theme sync with app dark/light mode
399
+ // - VSCode-style breadcrumb navigation (EditorBreadcrumb)
400
+ // - File-type contextual toolbar (EditorToolbar)
401
+ ```
402
+
403
+ ### CSV Preview
404
+
405
+ ```tsx
406
+ // src/web/components/editor/csv-preview.tsx
407
+ // Table viewer for CSV files with sorting and editing
408
+
409
+ <CsvPreview
410
+ content={csvString}
411
+ onContentChange={setCsvString}
412
+ />
413
+
414
+ // Features:
415
+ // - State-machine CSV parser (handles quoted fields, embedded commas/newlines)
416
+ // - Virtual scrolling (@tanstack/react-virtual) for large files
417
+ // - Column sorting via @tanstack/react-table
418
+ // - Inline cell editing with live serialization
419
+ // - Mobile-friendly table layout
420
+ ```
421
+
422
+ ### Terminal Component
423
+
424
+ ```tsx
425
+ // src/web/components/terminal/terminal-tab.tsx
426
+ // xterm.js integration
427
+
428
+ <TerminalTab projectName={project.name} />
429
+
430
+ // Features:
431
+ // - Full terminal emulation (bash/zsh)
432
+ // - 256 color support
433
+ // - Mouse support (click, scroll)
434
+ // - Resize handling
435
+ // - Copy/paste from clipboard
436
+ ```
437
+
438
+ ### Chat Component
439
+
440
+ ```tsx
441
+ // src/web/components/chat/chat-tab.tsx
442
+ // Message list + input with file attachments
443
+
444
+ <ChatTab sessionId={sessionId} />
445
+
446
+ // Features:
447
+ // - Streaming message display
448
+ // - Tool use cards (file_read, git commands)
449
+ // - File attachment previews
450
+ // - Slash command autocomplete
451
+ // - Session switcher
452
+ ```
453
+
454
+ ### Git Status Panel
455
+
456
+ ```tsx
457
+ // src/web/components/git/git-status-panel.tsx
458
+ // Git status with staging UI
459
+
460
+ <GitStatusPanel projectName={project.name} />
461
+
462
+ // Features:
463
+ // - Staged/unstaged/untracked file lists
464
+ // - Stage/unstage buttons
465
+ // - Commit message input
466
+ // - Commit graph (Mermaid)
467
+ ```
468
+
469
+ ---
470
+
471
+ ## Dark Mode Implementation
472
+
473
+ ### Automatic Detection
474
+
475
+ ```tsx
476
+ // src/web/app.tsx
477
+ // Detect system preference
478
+
479
+ useEffect(() => {
480
+ const preference = window.matchMedia('(prefers-color-scheme: dark)');
481
+ const isDark = preference.matches;
482
+ setTheme(isDark ? 'dark' : 'light');
483
+ }, []);
484
+ ```
485
+
486
+ ### Manual Override
487
+
488
+ ```tsx
489
+ // Settings tab allows user to choose:
490
+ // - System (follow OS preference)
491
+ // - Dark (always dark)
492
+ // - Light (always light)
493
+
494
+ // Implementation via next-themes
495
+ <ThemeProvider attribute="class" defaultTheme="system">
496
+ <App />
497
+ </ThemeProvider>
498
+ ```
499
+
500
+ ### CSS in Dark Mode
501
+
502
+ ```tsx
503
+ // Tailwind dark: prefix
504
+ <div className="bg-white dark:bg-slate-950 text-black dark:text-white">
505
+ Content adapts to theme
506
+ </div>
507
+ ```
508
+
509
+ ---
510
+
511
+ ## Responsive Design
512
+
513
+ ### Mobile-First CSS
514
+
515
+ Start with mobile styles, add complexity for larger screens:
516
+
517
+ ```css
518
+ /* Mobile-first */
519
+ .sidebar {
520
+ display: none; /* Hidden on mobile */
521
+ }
522
+
523
+ /* Tablet and up */
524
+ @media (min-width: 768px) {
525
+ .sidebar {
526
+ display: block;
527
+ width: 300px;
528
+ }
529
+ }
530
+ ```
531
+
532
+ **Or in Tailwind:**
533
+ ```tsx
534
+ <div className="hidden md:block w-64">
535
+ Sidebar (hidden on mobile, shown on md+)
536
+ </div>
537
+ ```
538
+
539
+ ### Touch-Friendly Sizes
540
+
541
+ - **Button height:** 44px minimum (iOS guideline)
542
+ - **Touch target:** 44×44px or larger
543
+ - **Spacing:** 16px minimum between interactive elements
544
+
545
+ ```tsx
546
+ // Good: Touch-friendly
547
+ <button className="px-4 py-3 rounded-lg">Click</button>
548
+
549
+ // Avoid: Too small
550
+ <button className="px-2 py-1">Click</button>
551
+ ```
552
+
553
+ ### Viewport Configuration
554
+
555
+ ```html
556
+ <!-- public/index.html -->
557
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
558
+ ```
559
+
560
+ ---
561
+
562
+ ## PWA Considerations
563
+
564
+ ### Web App Manifest
565
+
566
+ ```json
567
+ {
568
+ "name": "Personal Project Manager",
569
+ "short_name": "PPM",
570
+ "description": "Mobile-first web IDE for managing code projects",
571
+ "start_url": "/",
572
+ "scope": "/",
573
+ "display": "standalone",
574
+ "theme_color": "#0F172A",
575
+ "background_color": "#FFFFFF",
576
+ "icons": [
577
+ {
578
+ "src": "/icons/icon-192.png",
579
+ "sizes": "192x192",
580
+ "type": "image/png",
581
+ "purpose": "any"
582
+ }
583
+ ]
584
+ }
585
+ ```
586
+
587
+ ### Service Worker
588
+
589
+ - Cache static assets (CSS, JS, images)
590
+ - Offline fallback (HTML, basic UI)
591
+ - Background sync (planned for v3)
592
+
593
+ ### Installation Prompt
594
+
595
+ - Browser shows "Add to Home Screen" on first visit
596
+ - Users can install as standalone app
597
+ - App opens fullscreen without browser chrome
598
+
599
+ ---
600
+
601
+ ## Animation & Micro-interactions
602
+
603
+ ### Smooth Transitions
604
+
605
+ ```css
606
+ /* Fade in content */
607
+ .fade-in {
608
+ animation: fadeIn 0.3s ease-in;
609
+ }
610
+
611
+ @keyframes fadeIn {
612
+ from { opacity: 0; }
613
+ to { opacity: 1; }
614
+ }
615
+ ```
616
+
617
+ ### Button Hover States
618
+
619
+ ```tsx
620
+ <button className="bg-blue-500 hover:bg-blue-600 active:bg-blue-700 transition-colors">
621
+ Click me
622
+ </button>
623
+ ```
624
+
625
+ ### Loading Spinner
626
+
627
+ ```tsx
628
+ <Spinner className="animate-spin w-5 h-5" />
629
+ ```
630
+
631
+ ### Toast Notifications
632
+
633
+ ```tsx
634
+ // sonner library for notifications
635
+ import { toast } from "sonner";
636
+
637
+ toast.success("File saved!");
638
+ toast.error("Failed to commit");
639
+ toast.loading("Pushing...");
640
+ ```
641
+
642
+ ---
643
+
644
+ ## Accessibility
645
+
646
+ ### Keyboard Navigation
647
+
648
+ - **Tab order:** Logical flow (left-to-right, top-to-bottom)
649
+ - **Focus visible:** Clear focus indicator on interactive elements
650
+ - **Keyboard shortcuts:** Alt+S (save), Ctrl+K (command palette), etc.
651
+
652
+ ```tsx
653
+ // Good: Focus visible
654
+ <button className="focus-visible:ring-2 focus-visible:ring-blue-500">
655
+ Click me
656
+ </button>
657
+ ```
658
+
659
+ ### Color Contrast
660
+
661
+ - **WCAG AA:** 4.5:1 for normal text, 3:1 for large text
662
+ - **Avoid:** Color-only indicators (use icons + text)
663
+
664
+ ```tsx
665
+ // Good: Icon + text + color
666
+ <span className="text-red-600">
667
+ <ErrorIcon className="inline" /> Error occurred
668
+ </span>
669
+
670
+ // Avoid: Color only
671
+ <span className="text-red-600">Error</span>
672
+ ```
673
+
674
+ ### ARIA Labels
675
+
676
+ ```tsx
677
+ // Good: Descriptive labels
678
+ <button aria-label="Delete file">
679
+ <TrashIcon />
680
+ </button>
681
+
682
+ <input
683
+ type="text"
684
+ aria-label="Search projects"
685
+ placeholder="Search..."
686
+ />
687
+ ```
688
+
689
+ ### Semantic HTML
690
+
691
+ ```tsx
692
+ // Good: Semantic structure
693
+ <nav>Navigation here</nav>
694
+ <main>Main content</main>
695
+ <aside>Sidebar</aside>
696
+ <footer>Footer</footer>
697
+
698
+ // Avoid: Generic divs
699
+ <div>Navigation here</div>
700
+ <div>Main content</div>
701
+ ```
702
+
703
+ ---
704
+
705
+ ## Visual Hierarchy
706
+
707
+ ### Size & Weight
708
+
709
+ Larger, bolder elements draw attention first:
710
+
711
+ ```tsx
712
+ // Page title (largest, boldest)
713
+ <h1 className="text-3xl font-bold">Project Name</h1>
714
+
715
+ // Section heading (medium)
716
+ <h2 className="text-xl font-semibold">Files</h2>
717
+
718
+ // Regular text (small, normal weight)
719
+ <p className="text-sm font-normal">3 files</p>
720
+ ```
721
+
722
+ ### Spacing & Whitespace
723
+
724
+ - **Compact:** 8px gutters between elements
725
+ - **Normal:** 16px padding inside containers
726
+ - **Generous:** 24px+ between major sections
727
+
728
+ ```tsx
729
+ // Compact list
730
+ <ul className="space-y-1">
731
+ <li>Item 1</li>
732
+ <li>Item 2</li>
733
+ </ul>
734
+
735
+ // Generous spacing
736
+ <section className="mb-8">
737
+ <h2 className="mb-4">Title</h2>
738
+ <p className="mb-4">Paragraph 1</p>
739
+ <p>Paragraph 2</p>
740
+ </section>
741
+ ```
742
+
743
+ ---
744
+
745
+ ## Icon Guidelines
746
+
747
+ **Lucide Icons** — Consistent 24px icons for UI
748
+
749
+ ### Usage Patterns
750
+
751
+ - **Navigation:** Folder, File, Terminal, Settings icons
752
+ - **Actions:** Plus (add), Trash (delete), Check (confirm)
753
+ - **Status:** CheckCircle (success), XCircle (error), AlertCircle (warning)
754
+ - **Modifiers:** ChevronRight (expand), X (close)
755
+
756
+ ```tsx
757
+ import { FileIcon, FolderIcon, TrashIcon } from "lucide-react";
758
+
759
+ <FileIcon className="w-5 h-5 text-gray-600" />
760
+ ```
761
+
762
+ ### Size Guidelines
763
+
764
+ - **UI elements:** 16px–20px (inline, labels)
765
+ - **Buttons:** 20px–24px (primary actions)
766
+ - **Headers:** 32px+ (large, prominent)
767
+