ronin-skillforce 0.1.0 → 0.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +202 -21
  3. package/NOTICE +19 -0
  4. package/README.md +38 -5
  5. package/bin/cli.js +15 -3
  6. package/bin/commands/archive.js +192 -0
  7. package/bin/commands/capstone-status.js +82 -0
  8. package/bin/commands/create.js +69 -12
  9. package/bin/commands/import.js +5 -5
  10. package/bin/commands/status.js +1 -1
  11. package/bin/commands/studio-autostart.js +414 -0
  12. package/bin/commands/studio-state.js +159 -0
  13. package/bin/commands/studio.js +351 -17
  14. package/bin/commands/trail.js +153 -3
  15. package/bin/commands/web.js +8 -10
  16. package/bin/course-reader.js +6 -15
  17. package/bin/platforms/_shared.js +154 -28
  18. package/bin/platforms/claude.js +23 -42
  19. package/bin/platforms/cursor.js +23 -20
  20. package/bin/platforms/gemini.js +18 -19
  21. package/bin/platforms/opencode.js +47 -28
  22. package/package.json +5 -4
  23. package/plugin.json +1 -1
  24. package/shared/SKILL.md +102 -72
  25. package/shared/agents/coach.md +19 -16
  26. package/shared/agents/navigator.md +27 -34
  27. package/shared/agents/professor.md +16 -34
  28. package/shared/agents/researcher.md +1 -1
  29. package/shared/agents/spotter.md +3 -4
  30. package/shared/commands/professor/archive.md +65 -72
  31. package/shared/commands/professor/capstone-review.md +5 -5
  32. package/shared/commands/professor/capstone.md +3 -3
  33. package/shared/commands/professor/done.md +59 -31
  34. package/shared/commands/professor/hint.md +14 -2
  35. package/shared/commands/professor/navigator.md +27 -1
  36. package/shared/commands/professor/new-topic.md +3 -3
  37. package/shared/commands/professor/next.md +9 -5
  38. package/shared/commands/professor/note.md +6 -6
  39. package/shared/commands/professor/progress.md +1 -1
  40. package/shared/commands/professor/publish.md +5 -5
  41. package/shared/commands/professor/quiz.md +2 -2
  42. package/shared/commands/professor/recall.md +1 -1
  43. package/shared/commands/professor/review.md +14 -0
  44. package/shared/commands/professor/skill-export.md +3 -4
  45. package/shared/commands/professor/spotter.md +21 -4
  46. package/shared/commands/professor/stuck.md +24 -0
  47. package/shared/commands/professor/switch.md +1 -1
  48. package/shared/commands/professor/syllabus.md +1 -1
  49. package/shared/commands/professor/template-export.md +2 -2
  50. package/shared/commands/professor/worktrees.md +3 -7
  51. package/shared/hooks/pre-compact.js +4 -15
  52. package/studio/dist/assets/BetaReportPanel-BJ9HIAnz.js +1 -0
  53. package/studio/dist/assets/{Capstone-Cv9kH6LY.js → Capstone-CoUU-jP7.js} +1 -1
  54. package/studio/dist/assets/{CodeWorkspace-BwCEINWo.js → CodeWorkspace-BNrL4qvR.js} +2 -2
  55. package/studio/dist/assets/{Course-BJ_hafUP.js → Course-BMGTXus_.js} +1 -1
  56. package/studio/dist/assets/{Editor-CV0mNhlz.js → Editor-Cw9j3cnp.js} +1 -1
  57. package/studio/dist/assets/{Home-C1ry89ak.js → Home-D2woITq5.js} +1 -1
  58. package/studio/dist/assets/{Lesson-2e9TD9yL.js → Lesson-CYQhrDCZ.js} +2 -2
  59. package/studio/dist/assets/{NewCourse-BZeOg2xn.js → NewCourse-CMpwVRQb.js} +1 -1
  60. package/studio/dist/assets/{Progress-CRc_xEWC.js → Progress-2rS19Fur.js} +1 -1
  61. package/studio/dist/assets/{Review-6QEbHEfk.js → Review-SlqK-hjp.js} +1 -1
  62. package/studio/dist/assets/{Settings-NFnqVQui.js → Settings-t42u7n9H.js} +1 -1
  63. package/studio/dist/assets/{TutorPanel-DXQ6Z3BY.js → TutorPanel-DQDWIU7f.js} +3 -3
  64. package/studio/dist/assets/{abnfDiagram-WEYOIA3C-qeSjKlGM.js → abnfDiagram-WEYOIA3C-jTUmGBuB.js} +1 -1
  65. package/studio/dist/assets/{anthropic-D7NiQCUH.js → anthropic-iIm2l85r.js} +3 -3
  66. package/studio/dist/assets/{architecture-WOLXFQ4H-COG-m35l.js → architecture-WOLXFQ4H-Ch9Ld_vv.js} +1 -1
  67. package/studio/dist/assets/{architectureDiagram-ZHVYKT53-VO7uKoeD.js → architectureDiagram-ZHVYKT53-Dy-z6wsy.js} +1 -1
  68. package/studio/dist/assets/{blockDiagram-RJAE7QA3-BGJF_qiL.js → blockDiagram-RJAE7QA3-2fHVrc6N.js} +1 -1
  69. package/studio/dist/assets/{bridge-BTh0AeNX.js → bridge-Cr0q4rLp.js} +1 -1
  70. package/studio/dist/assets/{c4Diagram-XDPPPE54-C-S10RgU.js → c4Diagram-XDPPPE54-BuuKlG4V.js} +1 -1
  71. package/studio/dist/assets/{capstone-Amn6Hztq.js → capstone-DhwBeNqk.js} +1 -1
  72. package/studio/dist/assets/{card-store-BrbrtX9w.js → card-store-CVMBc-Pv.js} +1 -1
  73. package/studio/dist/assets/channel-M_JkdHrL.js +1 -0
  74. package/studio/dist/assets/{chunk-2E7WHVMD-fv-iqTyC.js → chunk-2E7WHVMD-lZdQWttk.js} +1 -1
  75. package/studio/dist/assets/{chunk-4EMNKR2T-CY9IZrgv.js → chunk-4EMNKR2T-C6kbMwke.js} +1 -1
  76. package/studio/dist/assets/{chunk-55XCU76K-DyTZz7v_.js → chunk-55XCU76K-rkBzkZog.js} +1 -1
  77. package/studio/dist/assets/{chunk-7S6XSTFO-BNMzTLRW.js → chunk-7S6XSTFO-Skg347QF.js} +1 -1
  78. package/studio/dist/assets/{chunk-AQDTSKZB-CEYANohH.js → chunk-AQDTSKZB-0pSDBJ23.js} +1 -1
  79. package/studio/dist/assets/{chunk-DSNLSHJZ-CDk5EXjH.js → chunk-DSNLSHJZ-BaeQDl2i.js} +1 -1
  80. package/studio/dist/assets/{chunk-HAGFOTED-hNAi1zh_.js → chunk-HAGFOTED-BEm00juw.js} +1 -1
  81. package/studio/dist/assets/{chunk-HNE4Q36P-COJnSYoZ.js → chunk-HNE4Q36P-DyCR-LvS.js} +1 -1
  82. package/studio/dist/assets/{chunk-NQOKRVIF-BU6KVxRr.js → chunk-NQOKRVIF-BNJ9uMmB.js} +1 -1
  83. package/studio/dist/assets/{chunk-UHW7PFBP-DYvxL9JG.js → chunk-UHW7PFBP-DqJczBLs.js} +1 -1
  84. package/studio/dist/assets/{chunk-VQ5W62QI-CuRfk65j.js → chunk-VQ5W62QI-CVWYSP5Q.js} +1 -1
  85. package/studio/dist/assets/{chunk-WQQL4CDK-KaG7x-Mb.js → chunk-WQQL4CDK-DJf0Dx05.js} +1 -1
  86. package/studio/dist/assets/{chunk-YZO67HFG-DbuqIZmk.js → chunk-YZO67HFG-BFUm_JHA.js} +1 -1
  87. package/studio/dist/assets/{chunk-ZAUX2LTX-bk4ivUmc.js → chunk-ZAUX2LTX-C5ETkkSE.js} +1 -1
  88. package/studio/dist/assets/{chunk-ZCHMQSOR-B_LElfwh.js → chunk-ZCHMQSOR-WVX9r9PZ.js} +1 -1
  89. package/studio/dist/assets/{classDiagram-v2-4MYWR3UA-DtCJ6H_X.js → classDiagram-v2-4MYWR3UA-CI77SpuR.js} +1 -1
  90. package/studio/dist/assets/{course-export-DpaOTT3a.js → course-export-C8jSPuda.js} +1 -1
  91. package/studio/dist/assets/{cynefin-EF2NZ3EQ-D9btHJvU.js → cynefin-EF2NZ3EQ-CLffmM25.js} +1 -1
  92. package/studio/dist/assets/{cynefinDiagram-WF24UDRP-CsFJuv27.js → cynefinDiagram-WF24UDRP-BvLwocOb.js} +1 -1
  93. package/studio/dist/assets/{dagre-NK4GIZVX-Cg1Duec7.js → dagre-NK4GIZVX-C2nMAVdh.js} +1 -1
  94. package/studio/dist/assets/{diagram-CBK3MWTC-_KU2m5gd.js → diagram-CBK3MWTC-Bid-pdax.js} +1 -1
  95. package/studio/dist/assets/{diagram-I5XIIV2D-5RaBrwUA.js → diagram-I5XIIV2D-DYJeAvzl.js} +1 -1
  96. package/studio/dist/assets/{diagram-ODIL2UCW-C0VKxoD3.js → diagram-ODIL2UCW-B06X2r_F.js} +1 -1
  97. package/studio/dist/assets/{diagram-PFBEJUXE-BaHcZEP2.js → diagram-PFBEJUXE-CwY--5Rz.js} +1 -1
  98. package/studio/dist/assets/{diagram-RJA3I4VV-cwSAZ90p.js → diagram-RJA3I4VV-4SqhH8zw.js} +1 -1
  99. package/studio/dist/assets/{diagram-TYUNFSNR-BJImxCEN.js → diagram-TYUNFSNR-CrW4AIM9.js} +1 -1
  100. package/studio/dist/assets/{ebnfDiagram-V4P3TTPT-OQQLRXcm.js → ebnfDiagram-V4P3TTPT-xeoCmH-d.js} +1 -1
  101. package/studio/dist/assets/{elk-QONTBCTQ-BJGhQHxQ.js → elk-QONTBCTQ-Dadmz6iS.js} +1 -1
  102. package/studio/dist/assets/{erDiagram-KYQIGQAA-D91EKSep.js → erDiagram-KYQIGQAA-CSuH0bbF.js} +1 -1
  103. package/studio/dist/assets/{eventmodeling-K75KTNOO-DgdTRgnw.js → eventmodeling-K75KTNOO-CciVfx3I.js} +1 -1
  104. package/studio/dist/assets/flowDiagram-IUGLLWBU-DgNR54qK.js +1 -0
  105. package/studio/dist/assets/{ganttDiagram-R7GPNTJY-CSYLPWEI.js → ganttDiagram-R7GPNTJY-C0wtA-2y.js} +1 -1
  106. package/studio/dist/assets/{gitGraph-VSP46ZUC-D6GWaV9y.js → gitGraph-VSP46ZUC-BXoDzaA3.js} +1 -1
  107. package/studio/dist/assets/{gitGraphDiagram-PDYL7XHY-CaV31bvT.js → gitGraphDiagram-PDYL7XHY-vZBlNRPe.js} +1 -1
  108. package/studio/dist/assets/{index-DioXTZVc.js → index-CS8XPYbB.js} +2 -2
  109. package/studio/dist/assets/{info-OHQRW6UA-BN-x8GoN.js → info-OHQRW6UA-bs2Qpf7P.js} +1 -1
  110. package/studio/dist/assets/{infoDiagram-MVDRKAX5-CIose_cy.js → infoDiagram-MVDRKAX5-rPJio6-1.js} +1 -1
  111. package/studio/dist/assets/{ishikawaDiagram-HPEHV2GE-DCihSNBw.js → ishikawaDiagram-HPEHV2GE-CXf9XFff.js} +1 -1
  112. package/studio/dist/assets/{journeyDiagram-BOSHW7O7-Bz3o3RIX.js → journeyDiagram-BOSHW7O7-C3MSH79o.js} +1 -1
  113. package/studio/dist/assets/{kanban-definition-FNSA4HC5-BUyqvlFE.js → kanban-definition-FNSA4HC5-Bdh7SB4n.js} +1 -1
  114. package/studio/dist/assets/{line-B08T8KlK.js → line-CHkoQXJF.js} +1 -1
  115. package/studio/dist/assets/{mermaid-parser.core-BYwreSUy.js → mermaid-parser.core-Do1oxD1S.js} +3 -3
  116. package/studio/dist/assets/{mermaid.core-DTO1oDmq.js → mermaid.core-DgZUD0sU.js} +4 -4
  117. package/studio/dist/assets/{mindmap-definition-6OY57UG3-BGLwKheY.js → mindmap-definition-6OY57UG3-PUaK6oE_.js} +1 -1
  118. package/studio/dist/assets/{node.browser-BISniYn8.js → node.browser-DkpMze_r.js} +1 -1
  119. package/studio/dist/assets/{ollama-De5w84tG.js → ollama-bJNp3jaD.js} +1 -1
  120. package/studio/dist/assets/{openai-compatible-Joy1oK3L.js → openai-compatible-0tmAyMlN.js} +1 -1
  121. package/studio/dist/assets/{packet-JDAUHWVQ-CDIMjHS_.js → packet-JDAUHWVQ-vf2FtqFr.js} +1 -1
  122. package/studio/dist/assets/{pegDiagram-ECIUJNBX-DWXm4mwS.js → pegDiagram-ECIUJNBX-NEVrgPTY.js} +1 -1
  123. package/studio/dist/assets/{pie-XZMESJXO-CY3QQiKZ.js → pie-XZMESJXO-BIWydVNZ.js} +1 -1
  124. package/studio/dist/assets/{pieDiagram-GNMPY74T-M1aCnI7W.js → pieDiagram-GNMPY74T-BI9_u6rT.js} +1 -1
  125. package/studio/dist/assets/{quadrantDiagram-D57K4MC3-BFFtO7U5.js → quadrantDiagram-D57K4MC3-ryNpoBC5.js} +1 -1
  126. package/studio/dist/assets/{radar-ABXABTNO-DT0W4_Xn.js → radar-ABXABTNO-D8TjnvBB.js} +1 -1
  127. package/studio/dist/assets/{railroad-I3PHUGI6-_VCpgZR5.js → railroad-I3PHUGI6-BmEDV5kf.js} +1 -1
  128. package/studio/dist/assets/{railroad-abnf-LNEFI6M7-DkSpQ5YY.js → railroad-abnf-LNEFI6M7-Cs_sArMc.js} +1 -1
  129. package/studio/dist/assets/{railroad-ebnf-DWYD2UWJ-BqWILdGb.js → railroad-ebnf-DWYD2UWJ-DYuCq46d.js} +1 -1
  130. package/studio/dist/assets/{railroad-peg-JR7BVNR7-BB0bQL-Z.js → railroad-peg-JR7BVNR7-BcXSgdMy.js} +1 -1
  131. package/studio/dist/assets/{railroadDiagram-Y72NRBL7-CjLKjIdJ.js → railroadDiagram-Y72NRBL7-DBcc8b2c.js} +1 -1
  132. package/studio/dist/assets/{rehype-katex-C-sKddsH.js → rehype-katex-BfUIq5As.js} +1 -1
  133. package/studio/dist/assets/{remark-math-C-ox67hE.js → remark-math-XvZOjmDO.js} +1 -1
  134. package/studio/dist/assets/{requirementDiagram-EQYSW5RA-CnwzZqR8.js → requirementDiagram-EQYSW5RA-CVcBgM1L.js} +1 -1
  135. package/studio/dist/assets/{sankeyDiagram-SY24JHO5-CPDugTUl.js → sankeyDiagram-SY24JHO5-DjZ81hDs.js} +1 -1
  136. package/studio/dist/assets/{sequenceDiagram-BLEHNHQU-1dLfeU9Y.js → sequenceDiagram-BLEHNHQU-BNwOa2S7.js} +1 -1
  137. package/studio/dist/assets/{stateDiagram-v2-A6IESKWZ-DR7CmEjj.js → stateDiagram-v2-A6IESKWZ-BFWa5lEx.js} +1 -1
  138. package/studio/dist/assets/{swimlanes-B3ENRKFQ-BAWB9omQ.js → swimlanes-B3ENRKFQ-LfM_Jg6Z.js} +1 -1
  139. package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-BDmpoiGp.js +8 -0
  140. package/studio/dist/assets/{timeline-definition-JXYKGLGB-DNkj8z77.js → timeline-definition-JXYKGLGB-BwGzkWgZ.js} +1 -1
  141. package/studio/dist/assets/{treeView-D4JQ5SDB-BA-ouhMb.js → treeView-D4JQ5SDB-MLk3VuRt.js} +1 -1
  142. package/studio/dist/assets/{treemap-SAJKECNS-BrrGxsAb.js → treemap-SAJKECNS-D8iSjp7L.js} +1 -1
  143. package/studio/dist/assets/{usecaseDiagram-WPOLBNNX-BB3D0Dt_.js → usecaseDiagram-WPOLBNNX-BqxpaNlT.js} +1 -1
  144. package/studio/dist/assets/{vennDiagram-Q3Y3IDCW-BrtqtKTE.js → vennDiagram-Q3Y3IDCW-CpeUDMhQ.js} +1 -1
  145. package/studio/dist/assets/{wardley-7MLQ67FV-BKkemDql.js → wardley-7MLQ67FV-tAMbCZAj.js} +1 -1
  146. package/studio/dist/assets/{wardleyDiagram-IVAIDKWA-DFnI3P5z.js → wardleyDiagram-IVAIDKWA-CDJViWzt.js} +1 -1
  147. package/studio/dist/assets/{xychartDiagram-4URNHDU4-Da0DZG_q.js → xychartDiagram-4URNHDU4-CwaQrd3_.js} +1 -1
  148. package/studio/dist/index.html +1 -1
  149. package/templates/claude/plugin.json +1 -1
  150. package/templates/gemini/GEMINI.md +18 -16
  151. package/web/server.js +3 -3
  152. package/studio/dist/assets/BetaReportPanel-8NrDLiPm.js +0 -1
  153. package/studio/dist/assets/channel-SJiUQu_N.js +0 -1
  154. package/studio/dist/assets/flowDiagram-IUGLLWBU-CVnJYMum.js +0 -1
  155. package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-qeuHru16.js +0 -8
@@ -1,4 +1,4 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{g as n}from"./index-DioXTZVc.js";var r=e(t());function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(null,arguments)}function a(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var o=[],s=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?s:o).push(n+=e[t])})();function c(e){if(e<768)return!1;for(let t=0,n=o.length;;){let r=t+n>>1;if(e<o[r])n=r;else if(e>=s[r])t=r+1;else return!0;if(t==n)return!1}}function l(e){return e>=127462&&e<=127487}var u=8205;function d(e,t,n=!0,r=!0){return(n?f:p)(e,t,r)}function f(e,t,n){if(t==e.length)return t;t&&h(e.charCodeAt(t))&&g(e.charCodeAt(t-1))&&t--;let r=m(e,t);for(t+=_(r);t<e.length;){let i=m(e,t);if(r==u||i==u||n&&c(i))t+=_(i),r=i;else if(l(i)){let n=0,r=t-2;for(;r>=0&&l(m(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function p(e,t,n){for(;t>1;){let r=f(e,t-2,n);if(r<t)return r;t--}return 0}function m(e,t){let n=e.charCodeAt(t);if(!g(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return h(r)?(n-55296<<10)+(r-56320)+65536:n}function h(e){return e>=56320&&e<57344}function g(e){return e>=55296&&e<56320}function _(e){return e<65536?1:2}var v=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=ae(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),b.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=ae(this,e,t);let n=[];return this.decompose(e,t,n,0),b.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new te(this),i=new te(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new te(this,e)}iterRange(e,t=this.length){return new ne(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new re(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new y(t):b.from(y.split(t,[]))}},y=class e extends v{constructor(e,t=x(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new ie(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(ee(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=S(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=ae(this,t,n);let i=S(this.text,S(r.text,ee(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):b.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{g as n}from"./index-CS8XPYbB.js";var r=e(t());function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(null,arguments)}function a(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var o=[],s=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?s:o).push(n+=e[t])})();function c(e){if(e<768)return!1;for(let t=0,n=o.length;;){let r=t+n>>1;if(e<o[r])n=r;else if(e>=s[r])t=r+1;else return!0;if(t==n)return!1}}function l(e){return e>=127462&&e<=127487}var u=8205;function d(e,t,n=!0,r=!0){return(n?f:p)(e,t,r)}function f(e,t,n){if(t==e.length)return t;t&&h(e.charCodeAt(t))&&g(e.charCodeAt(t-1))&&t--;let r=m(e,t);for(t+=_(r);t<e.length;){let i=m(e,t);if(r==u||i==u||n&&c(i))t+=_(i),r=i;else if(l(i)){let n=0,r=t-2;for(;r>=0&&l(m(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function p(e,t,n){for(;t>1;){let r=f(e,t-2,n);if(r<t)return r;t--}return 0}function m(e,t){let n=e.charCodeAt(t);if(!g(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return h(r)?(n-55296<<10)+(r-56320)+65536:n}function h(e){return e>=56320&&e<57344}function g(e){return e>=55296&&e<56320}function _(e){return e<65536?1:2}var v=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=ae(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),b.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=ae(this,e,t);let n=[];return this.decompose(e,t,n,0),b.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new te(this),i=new te(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new te(this,e)}iterRange(e,t=this.length){return new ne(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new re(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new y(t):b.from(y.split(t,[]))}},y=class e extends v{constructor(e,t=x(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new ie(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(ee(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=S(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=ae(this,t,n);let i=S(this.text,S(r.text,ee(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):b.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
2
2
  `){[e,t]=ae(this,e,t);let r=``;for(let i=0,a=0;i<=t&&a<this.text.length;a++){let o=this.text[a],s=i+o.length;i>e&&a&&(r+=n),e<s&&t>i&&(r+=o.slice(Math.max(0,e-i),t-i)),i=s+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(t,n){let r=[],i=-1;for(let a of t)r.push(a),i+=a.length+1,r.length==32&&(n.push(new e(r,i)),r=[],i=-1);return i>-1&&n.push(new e(r,i)),n}},b=class e extends v{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.children[i],o=r+a.length,s=n+a.lines-1;if((t?s:o)>=e)return a.lineInner(e,t,n,r);r=o+1,n=s+1}}decompose(e,t,n,r){for(let i=0,a=0;a<=t&&i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(e<=s&&t>=a){let i=r&(a<=e|(s>=t?2:0));a>=e&&s<=t&&!i?n.push(o):o.decompose(e-a,t-a,n,i)}a=s+1}}replace(t,n,r){if([t,n]=ae(this,t,n),r.lines<this.lines)for(let i=0,a=0;i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(t>=a&&n<=s){let c=o.replace(t-a,n-a,r),l=this.lines-o.lines+c.lines;if(c.lines<l>>4&&c.lines>l>>6){let a=this.children.slice();return a[i]=c,new e(a,this.length-(n-t)+r.length)}return super.replace(a,s,c)}a=s+1}return super.replace(t,n,r)}sliceString(e,t=this.length,n=`
3
3
  `){[e,t]=ae(this,e,t);let r=``;for(let i=0,a=0;i<this.children.length&&a<=t;i++){let o=this.children[i],s=a+o.length;a>e&&i&&(r+=n),e<s&&t>a&&(r+=o.sliceString(e-a,t-a,n)),a=s+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(t,n){if(!(t instanceof e))return 0;let r=0,[i,a,o,s]=n>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;i+=n,a+=n){if(i==o||a==s)return r;let e=this.children[i],c=t.children[a];if(e!=c)return r+e.scanIdentical(c,n);r+=e.length+1}}static from(t,n=t.reduce((e,t)=>e+t.length+1,-1)){let r=0;for(let e of t)r+=e.lines;if(r<32){let e=[];for(let n of t)n.flatten(e);return new y(e,n)}let i=Math.max(32,r>>5),a=i<<1,o=i>>1,s=[],c=0,l=-1,u=[];function d(t){let n;if(t.lines>a&&t instanceof e)for(let e of t.children)d(e);else t.lines>o&&(c>o||!c)?(f(),s.push(t)):t instanceof y&&c&&(n=u[u.length-1])instanceof y&&t.lines+n.lines<=32?(c+=t.lines,l+=t.length+1,u[u.length-1]=new y(n.text.concat(t.text),n.length+1+t.length)):(c+t.lines>i&&f(),c+=t.lines,l+=t.length+1,u.push(t))}function f(){c!=0&&(s.push(u.length==1?u[0]:e.from(u,l)),l=-1,c=u.length=0)}for(let e of t)d(e);return f(),s.length==1?s[0]:new e(s,n)}};v.empty=new y([``],0);function x(e){let t=-1;for(let n of e)t+=n.length+1;return t}function S(e,t,n=0,r=1e9){for(let i=0,a=0,o=!0;a<e.length&&i<=r;a++){let s=e[a],c=i+s.length;c>=n&&(c>r&&(s=s.slice(0,r-i)),i<n&&(s=s.slice(n-i)),o?(t[t.length-1]+=s,o=!1):t.push(s)),i=c+1}return t}function ee(e,t,n){return S(e,[``],t,n)}var te=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value=``,this.nodes=[e],this.offsets=[t>0?1:(e instanceof y?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,r=this.nodes[n],i=this.offsets[n],a=i>>1,o=r instanceof y?r.text.length:r.children.length;if(a==(t>0?o:0)){if(n==0)return this.done=!0,this.value=``,this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((i&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=`
4
4
  `,this;e--}else if(r instanceof y){let i=r.text[a+(t<0?-1:0)];if(this.offsets[n]+=t,i.length>Math.max(0,e))return this.value=e==0?i:t>0?i.slice(e):i.slice(0,i.length-e),this;e-=i.length}else{let i=r.children[a+(t<0?-1:0)];e>i.length?(e-=i.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(i),this.offsets.push(t>0?1:(i instanceof y?i.text.length:i.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},ne=class{constructor(e,t,n){this.value=``,this.done=!1,this.cursor=new te(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value=``,this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=n?r:t<0?r.slice(r.length-n):r.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=``}},re=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value=``,this.done=!1}next(e=0){let{done:t,lineBreak:n,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value=``,this.afterBreak=!1):t?(this.done=!0,this.value=``):n?this.afterBreak?this.value=``:(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<`u`&&(v.prototype[Symbol.iterator]=function(){return this.iter()},te.prototype[Symbol.iterator]=ne.prototype[Symbol.iterator]=re.prototype[Symbol.iterator]=function(){return this});var ie=class{constructor(e,t,n,r){this.from=e,this.to=t,this.number=n,this.text=r}get length(){return this.to-this.from}};function ae(e,t,n){return t=Math.max(0,Math.min(e.length,t)),[t,Math.max(t,Math.min(e.length,n))]}function C(e,t,n=!0,r=!0){return d(e,t,n,r)}function oe(e){return e>=56320&&e<57344}function se(e){return e>=55296&&e<56320}function w(e,t){let n=e.charCodeAt(t);if(!se(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return oe(r)?(n-55296<<10)+(r-56320)+65536:n}function ce(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode((e>>10)+55296,(e&1023)+56320))}function le(e){return e<65536?1:2}var ue=/\r\n?|\n/,T=(function(e){return e[e.Simple=0]=`Simple`,e[e.TrackDel=1]=`TrackDel`,e[e.TrackBefore=2]=`TrackBefore`,e[e.TrackAfter=3]=`TrackAfter`,e})(T||={}),de=class e{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t+1];e+=n<0?this.sections[t]:n}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,n=0,r=0;t<this.sections.length;){let i=this.sections[t++],a=this.sections[t++];a<0?(e(n,r,i),r+=i):r+=a,n+=i}}iterChangedRanges(e,t=!1){D(this,e,t)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let n=this.sections[e++],r=this.sections[e++];r<0?t.push(n,r):t.push(r,n)}return new e(t)}composeDesc(e){return this.empty?e:e.empty?this:he(this,e)}mapDesc(e,t=!1){return e.empty?this:me(this,e,t)}mapPos(e,t=-1,n=T.Simple){let r=0,i=0;for(let a=0;a<this.sections.length;){let o=this.sections[a++],s=this.sections[a++],c=r+o;if(s<0){if(c>e)return i+(e-r);i+=o}else{if(n!=T.Simple&&c>=e&&(n==T.TrackDel&&r<e&&c>e||n==T.TrackBefore&&r<e||n==T.TrackAfter&&c>e))return null;if(c>e||c==e&&t<0&&!o)return e==r||t<0?i:i+s;i+=s}r=c}if(e>r)throw RangeError(`Position ${e} is out of range for changeset of length ${r}`);return i}touchesRange(e,t=e){for(let n=0,r=0;n<this.sections.length&&r<=t;){let i=this.sections[n++],a=this.sections[n++],o=r+i;if(a>=0&&r<=t&&o>=e)return r<e&&o>t?`cover`:!0;r=o}return!1}toString(){let e=``;for(let t=0;t<this.sections.length;){let n=this.sections[t++],r=this.sections[t++];e+=(e?` `:``)+n+(r>=0?`:`+r:``)}return e}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!=`number`))throw RangeError(`Invalid JSON representation of ChangeDesc`);return new e(t)}static create(t){return new e(t)}},fe=class e extends de{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw RangeError(`Applying change set to a document with the wrong length`);return D(this,(t,n,r,i,a)=>e=e.replace(r,r+(n-t),a),!1),e}mapDesc(e,t=!1){return me(this,e,t,!0)}invert(t){let n=this.sections.slice(),r=[];for(let e=0,i=0;e<n.length;e+=2){let a=n[e],o=n[e+1];if(o>=0){n[e]=o,n[e+1]=a;let s=e>>1;for(;r.length<s;)r.push(v.empty);r.push(a?t.slice(i,i+a):v.empty)}i+=a}return new e(n,r)}compose(e){return this.empty?e:e.empty?this:he(this,e,!0)}map(e,t=!1){return e.empty?this:me(this,e,t,!0)}iterChanges(e,t=!1){D(this,e,t)}get desc(){return de.create(this.sections)}filter(t){let n=[],r=[],i=[],a=new ge(this);done:for(let e=0,o=0;;){let s=e==t.length?1e9:t[e++];for(;o<s||o==s&&a.len==0;){if(a.done)break done;let e=Math.min(a.len,s-o);E(i,e,-1);let t=a.ins==-1?-1:a.off==0?a.ins:0;E(n,e,t),t>0&&pe(r,n,a.text),a.forward(e),o+=e}let c=t[e++];for(;o<c;){if(a.done)break done;let e=Math.min(a.len,c-o);E(n,e,-1),E(i,e,a.ins==-1?-1:a.off==0?a.ins:0),a.forward(e),o+=e}}return{changes:new e(n,r),filtered:de.create(i)}}toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t],r=this.sections[t+1];r<0?e.push(n):r==0?e.push([n]):e.push([n].concat(this.inserted[t>>1].toJSON()))}return e}static of(t,n,r){let i=[],a=[],o=0,s=null;function c(t=!1){if(!t&&!i.length)return;o<n&&E(i,n-o,-1);let r=new e(i,a);s=s?s.compose(r.map(s)):r,i=[],a=[],o=0}function l(t){if(Array.isArray(t))for(let e of t)l(e);else if(t instanceof e){if(t.length!=n)throw RangeError(`Mismatched change set length (got ${t.length}, expected ${n})`);c(),s=s?s.compose(t.map(s)):t}else{let{from:e,to:s=e,insert:l}=t;if(e>s||e<0||s>n)throw RangeError(`Invalid change range ${e} to ${s} (in doc of length ${n})`);let u=l?typeof l==`string`?v.of(l.split(r||ue)):l:v.empty,d=u.length;if(e==s&&d==0)return;e<o&&c(),e>o&&E(i,e-o,-1),E(i,s-e,d),pe(a,i,u),o=s}}return l(t),c(!s),s}static empty(t){return new e(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw RangeError(`Invalid JSON representation of ChangeSet`);let n=[],r=[];for(let e=0;e<t.length;e++){let i=t[e];if(typeof i==`number`)n.push(i,-1);else if(!Array.isArray(i)||typeof i[0]!=`number`||i.some((e,t)=>t&&typeof e!=`string`))throw RangeError(`Invalid JSON representation of ChangeSet`);else if(i.length==1)n.push(i[0],0);else{for(;r.length<e;)r.push(v.empty);r[e]=v.of(i.slice(1)),n.push(i[0],r[e].length)}}return new e(n,r)}static createSet(t,n){return new e(t,n)}};function E(e,t,n,r=!1){if(t==0&&n<=0)return;let i=e.length-2;i>=0&&n<=0&&n==e[i+1]?e[i]+=t:i>=0&&t==0&&e[i]==0?e[i+1]+=n:r?(e[i]+=t,e[i+1]+=n):e.push(t,n)}function pe(e,t,n){if(n.length==0)return;let r=t.length-2>>1;if(r<e.length)e[e.length-1]=e[e.length-1].append(n);else{for(;e.length<r;)e.push(v.empty);e.push(n)}}function D(e,t,n){let r=e.inserted;for(let i=0,a=0,o=0;o<e.sections.length;){let s=e.sections[o++],c=e.sections[o++];if(c<0)i+=s,a+=s;else{let l=i,u=a,d=v.empty;for(;l+=s,u+=c,c&&r&&(d=d.append(r[o-2>>1])),!(n||o==e.sections.length||e.sections[o+1]<0);)s=e.sections[o++],c=e.sections[o++];t(i,l,a,u,d),i=l,a=u}}}function me(e,t,n,r=!1){let i=[],a=r?[]:null,o=new ge(e),s=new ge(t);for(let e=-1;;)if(o.done&&s.len||s.done&&o.len)throw Error(`Mismatched change set lengths`);else if(o.ins==-1&&s.ins==-1){let e=Math.min(o.len,s.len);E(i,e,-1),o.forward(e),s.forward(e)}else if(s.ins>=0&&(o.ins<0||e==o.i||o.off==0&&(s.len<o.len||s.len==o.len&&!n))){let t=s.len;for(E(i,s.ins,-1);t;){let n=Math.min(o.len,t);o.ins>=0&&e<o.i&&o.len<=n&&(E(i,0,o.ins),a&&pe(a,i,o.text),e=o.i),o.forward(n),t-=n}s.next()}else if(o.ins>=0){let t=0,n=o.len;for(;n;)if(s.ins==-1){let e=Math.min(n,s.len);t+=e,n-=e,s.forward(e)}else if(s.ins==0&&s.len<n)n-=s.len,s.next();else break;E(i,t,e<o.i?o.ins:0),a&&e<o.i&&pe(a,i,o.text),e=o.i,o.forward(o.len-n)}else if(o.done&&s.done)return a?fe.createSet(i,a):de.create(i);else throw Error(`Mismatched change set lengths`)}function he(e,t,n=!1){let r=[],i=n?[]:null,a=new ge(e),o=new ge(t);for(let e=!1;;)if(a.done&&o.done)return i?fe.createSet(r,i):de.create(r);else if(a.ins==0)E(r,a.len,0,e),a.next();else if(o.len==0&&!o.done)E(r,0,o.ins,e),i&&pe(i,r,o.text),o.next();else if(a.done||o.done)throw Error(`Mismatched change set lengths`);else{let t=Math.min(a.len2,o.len),n=r.length;if(a.ins==-1){let n=o.ins==-1?-1:o.off?0:o.ins;E(r,t,n,e),i&&n&&pe(i,r,o.text)}else o.ins==-1?(E(r,a.off?0:a.len,t,e),i&&pe(i,r,a.textBit(t))):(E(r,a.off?0:a.len,o.off?0:o.ins,e),i&&!o.off&&pe(i,r,o.text));e=(a.ins>t||o.ins>=0&&o.len>t)&&(e||r.length>n),a.forward2(t),o.forward(t)}}var ge=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?v.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?v.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},_e=class e{constructor(e,t,n,r){this.from=e,this.to=t,this.flags=n,this.goalColumn=r}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(t,n=-1){let r,i;return this.empty?r=i=t.mapPos(this.from,n):(r=t.mapPos(this.from,1),i=t.mapPos(this.to,-1)),r==this.from&&i==this.to?this:new e(r,i,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return O.range(e,t,void 0,void 0,n);let r=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return O.range(this.anchor,r,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!=`number`||typeof e.head!=`number`)throw RangeError(`Invalid JSON representation for SelectionRange`);return O.range(e.anchor,e.head)}static create(t,n,r,i){return new e(t,n,r,i)}},O=class e{constructor(e,t){this.ranges=e,this.mainIndex=t}map(t,n=-1){return t.empty?this:e.create(this.ranges.map(e=>e.map(t,n)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;n<this.ranges.length;n++)if(!this.ranges[n].eq(e.ranges[n],t))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new e([this.main],0)}addRange(t,n=!0){return e.create([t].concat(this.ranges),n?0:this.mainIndex+1)}replaceRange(t,n=this.mainIndex){let r=this.ranges.slice();return r[n]=t,e.create(r,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!=`number`||t.main>=t.ranges.length)throw RangeError(`Invalid JSON representation for EditorSelection`);return new e(t.ranges.map(e=>_e.fromJSON(e)),t.main)}static single(t,n=t){return new e([e.range(t,n)],0)}static create(t,n=0){if(t.length==0)throw RangeError(`A selection needs at least one range`);for(let r=0,i=0;i<t.length;i++){let a=t[i];if(a.empty?a.from<=r:a.from<r)return e.normalized(t.slice(),n);r=a.to}return new e(t,n)}static cursor(e,t=0,n,r){return _e.create(e,e,(t==0?0:t<0?8:16)|(n==null?7:Math.min(6,n)),r)}static range(e,t,n,r,i){let a=r==null?7:Math.min(6,r);return!i&&e!=t&&(i=t<e?1:-1),i&&(a|=i<0?8:16),t<e?_e.create(t,e,a|32,n):_e.create(e,t,a,n)}static undirectionalRange(e,t){return _e.create(e,t,64,void 0)}static normalized(t,n=0){let r=t[n];t.sort((e,t)=>e.from-t.from),n=t.indexOf(r);for(let r=1;r<t.length;r++){let i=t[r],a=t[r-1];if(i.empty?i.from<=a.to:i.from<a.to){let o=a.from,s=Math.max(i.to,a.to);r<=n&&n--,t.splice(--r,2,i.anchor>i.head?e.range(s,o):e.range(o,s))}}return new e(t,n)}};function ve(e,t){for(let n of e.ranges)if(n.to>t)throw RangeError(`Selection points outside of document`)}var ye=0,k=class e{constructor(e,t,n,r,i){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=r,this.id=ye++,this.default=e([]),this.extensions=typeof i==`function`?i(this):i}get reader(){return this}static define(t={}){return new e(t.combine||(e=>e),t.compareInput||((e,t)=>e===t),t.compare||(t.combine?(e,t)=>e===t:be),!!t.static,t.enables)}of(e){return new xe([],this,0,e)}compute(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new xe(e,this,1,t)}computeN(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new xe(e,this,2,t)}from(e,t){return t||=e=>e,this.compute([e],n=>t(n.field(e)))}};function be(e,t){return e==t||e.length==t.length&&e.every((e,n)=>e===t[n])}var xe=class{constructor(e,t,n,r){this.dependencies=e,this.facet=t,this.type=n,this.value=r,this.id=ye++}dynamicSlot(e){let t=this.value,n=this.facet.compareInput,r=this.id,i=e[r]>>1,a=this.type==2,o=!1,s=!1,c=[];for(let t of this.dependencies)t==`doc`?o=!0:t==`selection`?s=!0:(e[t.id]??1)&1||c.push(e[t.id]);return{create(e){return e.values[i]=t(e),1},update(e,r){if(o&&r.docChanged||s&&(r.docChanged||r.selection)||Ce(e,c)){let r=t(e);if(a?!Se(r,e.values[i],n):!n(r,e.values[i]))return e.values[i]=r,1}return 0},reconfigure:(e,o)=>{let s,c=o.config.address[r];if(c!=null){let r=Ie(o,c);if(this.dependencies.every(t=>t instanceof k?o.facet(t)===e.facet(t):t instanceof Ee?o.field(t,!1)==e.field(t,!1):!0)||(a?Se(s=t(e),r,n):n(s=t(e),r)))return e.values[i]=r,0}else s=t(e);return e.values[i]=s,1}}}get extension(){return this}};function Se(e,t,n){if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function Ce(e,t){let n=!1;for(let r of t)Fe(e,r)&1&&(n=!0);return n}function we(e,t,n){let r=n.map(t=>e[t.id]),i=n.map(e=>e.type),a=r.filter(e=>!(e&1)),o=e[t.id]>>1;function s(e){let n=[];for(let t=0;t<r.length;t++){let a=Ie(e,r[t]);if(i[t]==2)for(let e of a)n.push(e);else n.push(a)}return t.combine(n)}return{create(e){for(let t of r)Fe(e,t);return e.values[o]=s(e),1},update(e,n){if(!Ce(e,a))return 0;let r=s(e);return t.compare(r,e.values[o])?0:(e.values[o]=r,1)},reconfigure(e,i){let a=Ce(e,r),c=i.config.facets[t.id],l=i.facet(t);if(c&&!a&&be(n,c))return e.values[o]=l,0;let u=s(e);return t.compare(u,l)?(e.values[o]=l,0):(e.values[o]=u,1)}}}var Te=k.define({static:!0}),Ee=class e{constructor(e,t,n,r,i){this.id=e,this.createF=t,this.updateF=n,this.compareF=r,this.spec=i,this.provides=void 0}static define(t){let n=new e(ye++,t.create,t.update,t.compare||((e,t)=>e===t),t);return t.provide&&(n.provides=t.provide(n)),n}create(e){return(e.facet(Te).find(e=>e.field==this)?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,n)=>{let r=e.values[t],i=this.updateF(r,n);return this.compareF(r,i)?0:(e.values[t]=i,1)},reconfigure:(e,n)=>{let r=e.facet(Te),i=n.facet(Te),a;return(a=r.find(e=>e.field==this))&&a!=i.find(e=>e.field==this)?(e.values[t]=a.create(e),1):n.config.address[this.id]==null?(e.values[t]=this.create(e),1):(e.values[t]=n.field(this),0)}}}init(e){return[this,Te.of({field:this,create:e})]}get extension(){return this}},De={lowest:4,low:3,default:2,high:1,highest:0};function Oe(e){return t=>new Ae(t,e)}var ke={highest:Oe(De.highest),high:Oe(De.high),default:Oe(De.default),low:Oe(De.low),lowest:Oe(De.lowest)},Ae=class{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}},je=class e{of(e){return new Me(this,e)}reconfigure(t){return e.reconfigure.of({compartment:this,extension:t})}get(e){return e.config.compartments.get(this)}},Me=class{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}},Ne=class e{constructor(e,t,n,r,i,a){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=r,this.staticValues=i,this.facets=a,this.statusTemplate=[];this.statusTemplate.length<n.length;)this.statusTemplate.push(0)}staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.staticValues[t>>1]}static resolve(t,n,r){let i=[],a=Object.create(null),o=new Map;for(let e of Pe(t,n,o))e instanceof Ee?i.push(e):(a[e.facet.id]||(a[e.facet.id]=[])).push(e);let s=Object.create(null),c=[],l=[];for(let e of i)s[e.id]=l.length<<1,l.push(t=>e.slot(t));let u=r?.config.facets;for(let e in a){let t=a[e],n=t[0].facet,i=u&&u[e]||[];if(t.every(e=>e.type==0)){if(s[n.id]=c.length<<1|1,be(i,t))c.push(r.facet(n));else{let e=n.combine(t.map(e=>e.value));c.push(r&&n.compare(e,r.facet(n))?r.facet(n):e)}}else{for(let e of t)e.type==0?(s[e.id]=c.length<<1|1,c.push(e.value)):(s[e.id]=l.length<<1,l.push(t=>e.dynamicSlot(t)));s[n.id]=l.length<<1,l.push(e=>we(e,n,t))}}let d=l.map(e=>e(s));return new e(t,o,d,s,c,a)}};function Pe(e,t,n){let r=[[],[],[],[],[]],i=new Map;function a(e,o){let s=i.get(e);if(s!=null){if(s<=o)return;let t=r[s].indexOf(e);t>-1&&r[s].splice(t,1),e instanceof Me&&n.delete(e.compartment)}if(i.set(e,o),Array.isArray(e))for(let t of e)a(t,o);else if(e instanceof Me){if(n.has(e.compartment))throw RangeError(`Duplicate use of compartment in extensions`);let r=t.get(e.compartment)||e.inner;n.set(e.compartment,r),a(r,o)}else if(e instanceof Ae)a(e.inner,e.prec);else if(e instanceof Ee)r[o].push(e),e.provides&&a(e.provides,o);else if(e instanceof xe)r[o].push(e),e.facet.extensions&&a(e.facet.extensions,De.default);else{let t=e.extension;if(!t)throw Error(`Unrecognized extension value in extension set (${e}).`);if(t==e)throw Error(`Unrecognized extension value in extension set (${e}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);a(t,o)}}return a(e,De.default),r.reduce((e,t)=>e.concat(t))}function Fe(e,t){if(t&1)return 2;let n=t>>1,r=e.status[n];if(r==4)throw Error(`Cyclic dependency between fields and/or facets`);if(r&2)return r;e.status[n]=4;let i=e.computeSlot(e,e.config.dynamicSlots[n]);return e.status[n]=2|i}function Ie(e,t){return t&1?e.config.staticValues[t>>1]:e.values[t>>1]}var Le=k.define(),Re=k.define({combine:e=>e.some(e=>e),static:!0}),ze=k.define({combine:e=>e.length?e[0]:void 0,static:!0}),Be=k.define(),Ve=k.define(),He=k.define(),Ue=k.define({combine:e=>e.length?e[0]:!1}),We=class{constructor(e,t){this.type=e,this.value=t}static define(){return new Ge}},Ge=class{of(e){return new We(this,e)}},Ke=class{constructor(e){this.map=e}of(e){return new A(this,e)}},A=class e{constructor(e,t){this.type=e,this.value=t}map(t){let n=this.type.map(this.value,t);return n===void 0?void 0:n==this.value?this:new e(this.type,n)}is(e){return this.type==e}static define(e={}){return new Ke(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let r of e){let e=r.map(t);e&&n.push(e)}return n}};A.reconfigure=A.define(),A.appendConfig=A.define();var qe=class e{constructor(t,n,r,i,a,o){this.startState=t,this.changes=n,this.selection=r,this.effects=i,this.annotations=a,this.scrollIntoView=o,this._doc=null,this._state=null,r&&ve(r,n.newLength),a.some(t=>t.type==e.time)||(this.annotations=a.concat(e.time.of(Date.now())))}static create(t,n,r,i,a,o){return new e(t,n,r,i,a,o)}get newDoc(){return this._doc||=this.changes.apply(this.startState.doc)}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let n=this.annotation(e.userEvent);return!!(n&&(n==t||n.length>t.length&&n.slice(0,t.length)==t&&n[t.length]==`.`))}};qe.time=We.define(),qe.userEvent=We.define(),qe.addToHistory=We.define(),qe.remote=We.define();function Je(e,t){let n=[];for(let r=0,i=0;;){let a,o;if(r<e.length&&(i==t.length||t[i]>=e[r]))a=e[r++],o=e[r++];else if(i<t.length)a=t[i++],o=t[i++];else return n;!n.length||n[n.length-1]<a?n.push(a,o):n[n.length-1]<o&&(n[n.length-1]=o)}}function Ye(e,t,n){let r,i,a;return n?(r=t.changes,i=fe.empty(t.changes.length),a=e.changes.compose(t.changes)):(r=t.changes.map(e.changes),i=e.changes.mapDesc(t.changes,!0),a=e.changes.compose(r)),{changes:a,selection:t.selection?t.selection.map(i):e.selection?.map(r),effects:A.mapEffects(e.effects,r).concat(A.mapEffects(t.effects,i)),annotations:e.annotations.length?e.annotations.concat(t.annotations):t.annotations,scrollIntoView:e.scrollIntoView||t.scrollIntoView}}function Xe(e,t,n){let r=t.selection,i=tt(t.annotations);return t.userEvent&&(i=i.concat(qe.userEvent.of(t.userEvent))),{changes:t.changes instanceof fe?t.changes:fe.of(t.changes||[],n,e.facet(ze)),selection:r&&(r instanceof O?r:O.single(r.anchor,r.head)),effects:tt(t.effects),annotations:i,scrollIntoView:!!t.scrollIntoView}}function Ze(e,t,n){let r=Xe(e,t.length?t[0]:{},e.doc.length);t.length&&t[0].filter===!1&&(n=!1);for(let i=1;i<t.length;i++){t[i].filter===!1&&(n=!1);let a=!!t[i].sequential;r=Ye(r,Xe(e,t[i],a?r.changes.newLength:e.doc.length),a)}let i=qe.create(e,r.changes,r.selection,r.effects,r.annotations,r.scrollIntoView);return $e(n?Qe(i):i)}function Qe(e){let t=e.startState,n=!0;for(let r of t.facet(Be)){let t=r(e);if(t===!1){n=!1;break}Array.isArray(t)&&(n=n===!0?t:Je(n,t))}if(n!==!0){let r,i;if(n===!1)i=e.changes.invertedDesc,r=fe.empty(t.doc.length);else{let t=e.changes.filter(n);r=t.changes,i=t.filtered.mapDesc(t.changes).invertedDesc}e=qe.create(t,r,e.selection&&e.selection.map(i),A.mapEffects(e.effects,i),e.annotations,e.scrollIntoView)}let r=t.facet(Ve);for(let n=r.length-1;n>=0;n--){let i=r[n](e);e=i instanceof qe?i:Array.isArray(i)&&i.length==1&&i[0]instanceof qe?i[0]:Ze(t,tt(i),!1)}return e}function $e(e){let t=e.startState,n=t.facet(He),r=e;for(let i=n.length-1;i>=0;i--){let a=n[i](e);a&&Object.keys(a).length&&(r=Ye(r,Xe(t,a,e.changes.newLength),!0))}return r==e?e:qe.create(t,e.changes,e.selection,r.effects,r.annotations,r.scrollIntoView)}var et=[];function tt(e){return e==null?et:Array.isArray(e)?e:[e]}var j=(function(e){return e[e.Word=0]=`Word`,e[e.Space=1]=`Space`,e[e.Other=2]=`Other`,e})(j||={}),nt=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,rt;try{rt=RegExp(`[\\p{Alphabetic}\\p{Number}_]`,`u`)}catch{}function it(e){if(rt)return rt.test(e);for(let t=0;t<e.length;t++){let n=e[t];if(/\w/.test(n)||n>`€`&&(n.toUpperCase()!=n.toLowerCase()||nt.test(n)))return!0}return!1}function at(e){return t=>{if(!/\S/.test(t))return j.Space;if(it(t))return j.Word;for(let n=0;n<e.length;n++)if(t.indexOf(e[n])>-1)return j.Word;return j.Other}}var M=class e{constructor(e,t,n,r,i,a){this.config=e,this.doc=t,this.selection=n,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=i,a&&(a._state=this);for(let e=0;e<this.config.dynamicSlots.length;e++)Fe(this,e<<1);this.computeSlot=null}field(e,t=!0){let n=this.config.address[e.id];if(n==null){if(t)throw RangeError(`Field is not present in this state`)}else return Fe(this,n),Ie(this,n)}update(...e){return Ze(this,e,!0)}applyTransaction(t){let n=this.config,{base:r,compartments:i}=n;for(let e of t.effects)e.is(je.reconfigure)?(n&&=(i=new Map,n.compartments.forEach((e,t)=>i.set(t,e)),null),i.set(e.value.compartment,e.value.extension)):e.is(A.reconfigure)?(n=null,r=e.value):e.is(A.appendConfig)&&(n=null,r=tt(r).concat(e.value));let a;n?a=t.startState.values.slice():(n=Ne.resolve(r,i,this),a=new e(n,this.doc,this.selection,n.dynamicSlots.map(()=>null),(e,t)=>t.reconfigure(e,this),null).values);let o=t.startState.facet(Re)?t.newSelection:t.newSelection.asSingle();new e(n,t.newDoc,o,a,(e,n)=>n.update(e,t),t)}replaceSelection(e){return typeof e==`string`&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:O.cursor(t.from+e.length,-1)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),r=this.changes(n.changes),i=[n.range],a=tt(n.effects);for(let n=1;n<t.ranges.length;n++){let o=e(t.ranges[n]),s=this.changes(o.changes),c=s.map(r);for(let e=0;e<n;e++)i[e]=i[e].map(c);let l=r.mapDesc(s,!0);i.push(o.range.map(l)),r=r.compose(c),a=A.mapEffects(a,c).concat(A.mapEffects(tt(o.effects),l))}return{changes:r,selection:O.create(i,t.mainIndex),effects:a}}changes(t=[]){return t instanceof fe?t:fe.of(t,this.doc.length,this.facet(e.lineSeparator))}toText(t){return v.of(t.split(this.facet(e.lineSeparator)||ue))}sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lineBreak)}facet(e){let t=this.config.address[e.id];return t==null?e.default:(Fe(this,t),Ie(this,t))}toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(e)for(let n in e){let r=e[n];r instanceof Ee&&this.config.address[r.id]!=null&&(t[n]=r.spec.toJSON(this.field(e[n]),this))}return t}static fromJSON(t,n={},r){if(!t||typeof t.doc!=`string`)throw RangeError(`Invalid JSON representation for EditorState`);let i=[];if(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(t,e)){let n=r[e],a=t[e];i.push(n.init(e=>n.spec.fromJSON(a,e)))}}return e.create({doc:t.doc,selection:O.fromJSON(t.selection),extensions:n.extensions?i.concat([n.extensions]):i})}static create(t={}){let n=Ne.resolve(t.extensions||[],new Map),r=t.doc instanceof v?t.doc:v.of((t.doc||``).split(n.staticFacet(e.lineSeparator)||ue)),i=t.selection?t.selection instanceof O?t.selection:O.single(t.selection.anchor,t.selection.head):O.single(0);return ve(i,r.length),n.staticFacet(Re)||(i=i.asSingle()),new e(n,r,i,n.dynamicSlots.map(()=>null),(e,t)=>t.create(e),null)}get tabSize(){return this.facet(e.tabSize)}get lineBreak(){return this.facet(e.lineSeparator)||`
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{At as n,Lt as r,Mt as i,Pt as a,Rt as o,U as s,Y as c,_t as l,f as u,g as d,h as f,jt as p,m,ot as h,p as g,q as _,t as v,tt as y,zt as b}from"./index-DioXTZVc.js";import{t as x}from"./Progress-CRc_xEWC.js";import{a as S,i as C,o as w,r as T,t as E}from"./BetaReportPanel-8NrDLiPm.js";var D=e(t(),1);function O(e=[]){let t={};for(let r of e||[]){let e=r?.day||(r?.created_at?n(r.created_at):null);e&&(t[e]=(t[e]||0)+1)}return t}function k(e){let t=new Date(e);return new Date(t.getFullYear(),t.getMonth(),t.getDate(),12,0,0,0)}function A(e=[],t=new Date){let r=O(e),i=0,a=k(t);for(r[n(a)]||a.setDate(a.getDate()-1);r[n(a)];)i+=1,a.setDate(a.getDate()-1);return i}function j(e=[],t=7,r=new Date){let i=O(e),a=Math.max(1,Math.round(t)||7),o=[],s=k(r);for(let e=0;e<a;e++){let e=n(s);o.unshift({day:e,studied:(i[e]||0)>0,count:i[e]||0}),s.setDate(s.getDate()-1)}return o}async function M(e=new Date){return A(await y(),e)}async function N(e=7,t=new Date){return j(await y(),e,t)}var P=d();function F({className:e=``}){let t=r(),[n,i]=(0,D.useState)(0),[a,o]=(0,D.useState)([]);(0,D.useEffect)(()=>{let e=!0,t=async()=>{try{let[t,n]=await Promise.all([M(),N(7)]);if(!e)return;i(t),o(n)}catch{}};t();let n=l(e=>{(e.table===`activity`||e.table===`*`)&&t()});return()=>{e=!1,n()}},[]);let s=a.some(e=>e.studied);if(!n&&!s)return null;let c=n===0?t(`practice.streak.none`):n===1?t(`practice.streak.one`):t(`practice.streak.many`,{count:n}),u=t(`practice.streak.title`,{studied:a.filter(e=>e.studied).length,total:a.length});return(0,P.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-xs text-neutral-600 dark:text-neutral-300 ${e}`,title:u,"aria-label":c,children:[(0,P.jsx)(`span`,{className:`flex items-end gap-0.5`,"aria-hidden":`true`,children:a.map(e=>(0,P.jsx)(`span`,{className:`h-3 w-1.5 rounded-sm ${e.studied?`bg-indigo-500`:`bg-neutral-200 dark:bg-neutral-700`}`},e.day))}),(0,P.jsx)(`span`,{className:`font-medium`,children:c})]})}function I(){let e=r(),[t,n]=(0,D.useState)(null),[d,y]=(0,D.useState)(null);(0,D.useEffect)(()=>{let e=!0,t=()=>h().then(e=>Promise.all(e.map(e=>c(e.id)))).then(t=>e&&n(t.filter(Boolean))).catch(()=>e&&n([]));t();let r=l(e=>{(e.table===`courses`||e.table===`lessons`||e.table===`*`)&&t()});return()=>{e=!1,r()}},[]),(0,D.useEffect)(()=>{let e=!0;return _().then(t=>{e&&y(C({offset:T(t),...S()}))}).catch(()=>{}),()=>{e=!1}},[]);let O=()=>{w(`dismissed`,d),y(null)},k=async t=>{window.confirm(e(`home.deleteConfirm`,{title:t.title}))&&await s(t.id)},A=t?.find(e=>e.source!==`demo`&&p(e))||t?.find(e=>p(e)),j=A?p(A):null;return(0,P.jsxs)(`div`,{className:`space-y-6`,children:[(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,P.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,P.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`home.title`)}),(0,P.jsx)(F,{}),(0,P.jsx)(m,{})]}),(0,P.jsx)(o,{to:`/new`,children:(0,P.jsx)(u,{children:e(`home.newCourse`)})})]}),d&&(0,P.jsx)(E,{checkpoint:d,onDismiss:O}),t===null&&(0,P.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`home.loading`)}),t?.length===0&&(0,P.jsx)(v,{title:e(`home.empty.title`),description:e(`home.empty.description`),action:(0,P.jsxs)(`div`,{className:`flex flex-wrap justify-center gap-2`,children:[(0,P.jsx)(o,{to:`/new`,children:(0,P.jsx)(u,{children:e(`home.empty.createFirst`)})}),(0,P.jsx)(o,{to:`/course/demo-how-to-learn`,children:(0,P.jsx)(u,{variant:`secondary`,children:e(`home.empty.openDemo`)})})]})}),A&&j&&(0,P.jsx)(g,{className:`border-indigo-200 bg-indigo-50/60 dark:border-indigo-500/30 dark:bg-indigo-500/5`,children:(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,P.jsxs)(`div`,{className:`min-w-0`,children:[(0,P.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-wide text-indigo-600 dark:text-indigo-300`,children:e(`home.continue`)}),(0,P.jsx)(`p`,{className:`mt-1 truncate font-medium`,children:A.title}),(0,P.jsxs)(`p`,{className:`truncate text-sm text-neutral-600 dark:text-neutral-300`,children:[a(j.status),` `,e(`home.lessonOf`,{n:j.position,title:j.title})]})]}),(0,P.jsx)(u,{onClick:()=>b(`/course/${A.id}/lesson/${j.id}`),children:e(`home.continueButton`)})]})}),(0,P.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:t?.map(t=>{let n=i(t);return(0,P.jsxs)(g,{className:`flex flex-col gap-3`,children:[(0,P.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,P.jsx)(o,{to:`/course/${t.id}`,className:`font-medium hover:underline`,children:t.title}),(0,P.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[t.status===`completed`&&(0,P.jsx)(f,{tone:`success`,children:`🎓`}),(0,P.jsx)(f,{tone:`neutral`,children:t.level}),t.source===`demo`&&(0,P.jsx)(f,{tone:`accent`,children:e(`home.demo`)})]})]}),t.description&&(0,P.jsx)(`p`,{className:`line-clamp-2 text-sm text-neutral-600 dark:text-neutral-300`,children:t.description}),(0,P.jsx)(x,{value:n.pct,label:e(`common.lessonsDoneShort`,{done:n.done,total:n.total})}),(0,P.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,P.jsx)(`p`,{className:`text-xs text-neutral-500`,children:e(`common.lessonsDone`,{done:n.done,total:n.total})}),(0,P.jsx)(`button`,{type:`button`,onClick:()=>k(t),className:`text-xs text-neutral-400 underline hover:text-red-600`,children:e(`home.delete`)})]})]},t.id)})})]})}export{I as Home};
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{At as n,Lt as r,Mt as i,Pt as a,Rt as o,U as s,Y as c,_t as l,f as u,g as d,h as f,jt as p,m,ot as h,p as g,q as _,t as v,tt as y,zt as b}from"./index-CS8XPYbB.js";import{t as x}from"./Progress-2rS19Fur.js";import{a as S,i as C,o as w,r as T,t as E}from"./BetaReportPanel-BJ9HIAnz.js";var D=e(t(),1);function O(e=[]){let t={};for(let r of e||[]){let e=r?.day||(r?.created_at?n(r.created_at):null);e&&(t[e]=(t[e]||0)+1)}return t}function k(e){let t=new Date(e);return new Date(t.getFullYear(),t.getMonth(),t.getDate(),12,0,0,0)}function A(e=[],t=new Date){let r=O(e),i=0,a=k(t);for(r[n(a)]||a.setDate(a.getDate()-1);r[n(a)];)i+=1,a.setDate(a.getDate()-1);return i}function j(e=[],t=7,r=new Date){let i=O(e),a=Math.max(1,Math.round(t)||7),o=[],s=k(r);for(let e=0;e<a;e++){let e=n(s);o.unshift({day:e,studied:(i[e]||0)>0,count:i[e]||0}),s.setDate(s.getDate()-1)}return o}async function M(e=new Date){return A(await y(),e)}async function N(e=7,t=new Date){return j(await y(),e,t)}var P=d();function F({className:e=``}){let t=r(),[n,i]=(0,D.useState)(0),[a,o]=(0,D.useState)([]);(0,D.useEffect)(()=>{let e=!0,t=async()=>{try{let[t,n]=await Promise.all([M(),N(7)]);if(!e)return;i(t),o(n)}catch{}};t();let n=l(e=>{(e.table===`activity`||e.table===`*`)&&t()});return()=>{e=!1,n()}},[]);let s=a.some(e=>e.studied);if(!n&&!s)return null;let c=n===0?t(`practice.streak.none`):n===1?t(`practice.streak.one`):t(`practice.streak.many`,{count:n}),u=t(`practice.streak.title`,{studied:a.filter(e=>e.studied).length,total:a.length});return(0,P.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-xs text-neutral-600 dark:text-neutral-300 ${e}`,title:u,"aria-label":c,children:[(0,P.jsx)(`span`,{className:`flex items-end gap-0.5`,"aria-hidden":`true`,children:a.map(e=>(0,P.jsx)(`span`,{className:`h-3 w-1.5 rounded-sm ${e.studied?`bg-indigo-500`:`bg-neutral-200 dark:bg-neutral-700`}`},e.day))}),(0,P.jsx)(`span`,{className:`font-medium`,children:c})]})}function I(){let e=r(),[t,n]=(0,D.useState)(null),[d,y]=(0,D.useState)(null);(0,D.useEffect)(()=>{let e=!0,t=()=>h().then(e=>Promise.all(e.map(e=>c(e.id)))).then(t=>e&&n(t.filter(Boolean))).catch(()=>e&&n([]));t();let r=l(e=>{(e.table===`courses`||e.table===`lessons`||e.table===`*`)&&t()});return()=>{e=!1,r()}},[]),(0,D.useEffect)(()=>{let e=!0;return _().then(t=>{e&&y(C({offset:T(t),...S()}))}).catch(()=>{}),()=>{e=!1}},[]);let O=()=>{w(`dismissed`,d),y(null)},k=async t=>{window.confirm(e(`home.deleteConfirm`,{title:t.title}))&&await s(t.id)},A=t?.find(e=>e.source!==`demo`&&p(e))||t?.find(e=>p(e)),j=A?p(A):null;return(0,P.jsxs)(`div`,{className:`space-y-6`,children:[(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,P.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,P.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`home.title`)}),(0,P.jsx)(F,{}),(0,P.jsx)(m,{})]}),(0,P.jsx)(o,{to:`/new`,children:(0,P.jsx)(u,{children:e(`home.newCourse`)})})]}),d&&(0,P.jsx)(E,{checkpoint:d,onDismiss:O}),t===null&&(0,P.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`home.loading`)}),t?.length===0&&(0,P.jsx)(v,{title:e(`home.empty.title`),description:e(`home.empty.description`),action:(0,P.jsxs)(`div`,{className:`flex flex-wrap justify-center gap-2`,children:[(0,P.jsx)(o,{to:`/new`,children:(0,P.jsx)(u,{children:e(`home.empty.createFirst`)})}),(0,P.jsx)(o,{to:`/course/demo-how-to-learn`,children:(0,P.jsx)(u,{variant:`secondary`,children:e(`home.empty.openDemo`)})})]})}),A&&j&&(0,P.jsx)(g,{className:`border-indigo-200 bg-indigo-50/60 dark:border-indigo-500/30 dark:bg-indigo-500/5`,children:(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,P.jsxs)(`div`,{className:`min-w-0`,children:[(0,P.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-wide text-indigo-600 dark:text-indigo-300`,children:e(`home.continue`)}),(0,P.jsx)(`p`,{className:`mt-1 truncate font-medium`,children:A.title}),(0,P.jsxs)(`p`,{className:`truncate text-sm text-neutral-600 dark:text-neutral-300`,children:[a(j.status),` `,e(`home.lessonOf`,{n:j.position,title:j.title})]})]}),(0,P.jsx)(u,{onClick:()=>b(`/course/${A.id}/lesson/${j.id}`),children:e(`home.continueButton`)})]})}),(0,P.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:t?.map(t=>{let n=i(t);return(0,P.jsxs)(g,{className:`flex flex-col gap-3`,children:[(0,P.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,P.jsx)(o,{to:`/course/${t.id}`,className:`font-medium hover:underline`,children:t.title}),(0,P.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[t.status===`completed`&&(0,P.jsx)(f,{tone:`success`,children:`🎓`}),(0,P.jsx)(f,{tone:`neutral`,children:t.level}),t.source===`demo`&&(0,P.jsx)(f,{tone:`accent`,children:e(`home.demo`)})]})]}),t.description&&(0,P.jsx)(`p`,{className:`line-clamp-2 text-sm text-neutral-600 dark:text-neutral-300`,children:t.description}),(0,P.jsx)(x,{value:n.pct,label:e(`common.lessonsDoneShort`,{done:n.done,total:n.total})}),(0,P.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,P.jsx)(`p`,{className:`text-xs text-neutral-500`,children:e(`common.lessonsDone`,{done:n.done,total:n.total})}),(0,P.jsx)(`button`,{type:`button`,onClick:()=>k(t),className:`text-xs text-neutral-400 underline hover:text-red-600`,children:e(`home.delete`)})]})]},t.id)})})]})}export{I as Home};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CodeWorkspace-BwCEINWo.js","./rolldown-runtime-COiEfhsA.js","./react-B8SKf8RM.js","./settings-DhwuyNPU.js","./errors-BZa_CNHL.js","./index-DioXTZVc.js","./index-CVenTTOY.css","./TutorPanel-DXQ6Z3BY.js","./schemas-BOc2YsOP.js","./capstone-Amn6Hztq.js","./fetch-local-DG3O3hmQ.js","./bridge-BTh0AeNX.js","./useStream-rdsR6A7P.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{a as n,f as r}from"./settings-DhwuyNPU.js";import{l as i,n as a,o,u as s}from"./errors-BZa_CNHL.js";import{I as c,J as l,L as u,Lt as d,O as f,R as p,Rt as m,Tt as h,X as g,Y as _,Z as v,_ as y,_t as b,a as x,bt as S,d as C,dt as w,f as T,ft as E,g as D,gt as O,h as k,i as A,it as j,l as M,lt as N,p as P,t as F,u as I,ut as L,v as R,vt as z,wt as B,yt as ee,zt as V}from"./index-DioXTZVc.js";import{A as te,D as ne,E as H,F as U,M as re,N as ie,O as ae,P as oe,T as se,_ as W,b as ce,d as le,f as ue,g as de,h as fe,j as G,k as K,l as pe,m as me,n as he,p as ge,t as _e,u as ve,v as ye,w as be,y as xe}from"./TutorPanel-DXQ6Z3BY.js";import{o as Se}from"./capstone-Amn6Hztq.js";import{n as Ce,t as we}from"./spec-nAnsSMkw.js";import{t as q}from"./useStream-rdsR6A7P.js";import{n as Te,t as Ee}from"./card-store-BrbrtX9w.js";var J=e(t(),1);function De({kind:e,exercises:t}={}){return(Array.isArray(t)?t:[]).some(we)?`exercise`:e===`programming`?`code`:null}function Oe(e,t){return e===`workspace`&&!t?`practice`:e}var Y=D();function ke(e){if(!e)return``;try{return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}catch{return``}}function Ae(e,t){let n=ke(e.created_at),r=e.model||e.provider||``;return[`v${e.version}`,n&&t(`lesson.generated`,{time:n}),r].filter(Boolean).join(` · `)}function je({lesson:e,course:t}){let a=d(),[c]=r(),[l,p]=(0,J.useState)(null),[m,h]=(0,J.useState)(null),[g,_]=(0,J.useState)(null),[S,C]=(0,J.useState)(!1),E=q(),D=t?.language??c.language;(0,J.useEffect)(()=>{let t=!0,n=()=>Promise.all([w(e.id),v(e.id)]).then(([e,n])=>{t&&(p(e),h(t=>t&&e.some(e=>e.id===t)?t:n?.id||e[e.length-1]?.id||null))}).catch(()=>t&&p([]));n();let r=b(e=>{e.table===`lesson_versions`&&(e.id==null||e.type===`create`)&&n()});return()=>{t=!1,r()}},[e.id]);let O=(0,J.useMemo)(()=>l?.find(e=>e.id===m)||null,[l,m]),k=async n=>{let r=await y(c),{system:i,messages:a}=pe({course:t,lesson:e,level:t?.level,language:D,strict:n});return E.start(({onText:e,signal:t})=>r.streamText({system:i,messages:a,onText:e,signal:t,effort:`high`,maxTokens:R.lesson}))},j=async t=>await u(e.id,{content_md:t,model:n(c),provider:c.provider,language:D}),M=async()=>{_(null),C(!1);try{let e=await k(!1);if(!e||!e.trim())return;let t=await j(e);if(h(t.id),!o(D)&&!f(e,D).ok){C(!0);let e=await k(!0);if(e&&e.trim()){let t=await j(e);h(t.id)}}}catch(e){_(e)}},N=()=>{window.confirm(a(`lesson.regenerateConfirm`))&&M()};if(l===null)return(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:a(`lesson.loading`)});let I=E.status===`streaming`;return!O?.content_md&&!I?(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsx)(F,{title:a(`lesson.noContent.title`),description:a(`lesson.noContent.description`),action:(0,Y.jsx)(T,{onClick:M,children:a(`lesson.noContent.action`)})}),(0,Y.jsx)(A,{error:g||E.error,onDismiss:()=>_(null)})]}):(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-2`,children:l.length>1?(0,Y.jsxs)(`label`,{className:`text-sm`,children:[(0,Y.jsx)(`span`,{className:`sr-only`,children:a(`lesson.version`)}),(0,Y.jsx)(`select`,{value:m||``,onChange:e=>h(e.target.value),className:`rounded-lg border border-neutral-300 bg-white px-2 py-1 text-sm dark:border-neutral-700 dark:bg-neutral-900`,children:[...l].reverse().map(e=>(0,Y.jsx)(`option`,{value:e.id,children:Ae(e,a)},e.id))})]}):O&&(0,Y.jsx)(`span`,{className:`text-xs text-neutral-500`,children:Ae(O,a)})}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[I&&(0,Y.jsx)(x,{}),I?(0,Y.jsx)(T,{variant:`secondary`,onClick:E.stop,children:a(`common.stop`)}):(0,Y.jsx)(T,{variant:`secondary`,size:`sm`,onClick:N,children:O?.language&&s(O.language)!==s(D)?a(`lesson.regenerateIn`,{language:i(D)}):a(`common.regenerate`)})]})]}),(g||E.error)&&(0,Y.jsx)(A,{error:g||E.error,onDismiss:()=>_(null)}),S&&!I&&(0,Y.jsx)(`p`,{className:`rounded-lg bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:bg-amber-500/10 dark:text-amber-200`,children:a(`lesson.languageNotice`,{language:i(D)})}),I?(0,Y.jsxs)(P,{className:`bg-neutral-50 dark:bg-neutral-900/50`,children:[(0,Y.jsx)(`p`,{className:`mb-2 text-xs font-medium uppercase tracking-wide text-neutral-500`,children:a(`lesson.generating`)}),(0,Y.jsx)(`pre`,{className:`whitespace-pre-wrap break-words font-mono text-sm text-neutral-700 dark:text-neutral-200`,children:E.text||`…`})]}):(0,Y.jsx)(he,{children:O.content_md})]})}var Me=[`A`,`B`,`C`,`D`],Ne=6e3;function Pe(e){switch(e.provider){case`anthropic`:return!!e.anthropic?.apiKey;case`openai`:return!!e.openai?.apiKey;case`ollama`:case`bridge`:return!0;default:return!1}}async function Fe({course:e,lesson:t,settings:n,criteria:r,answers:i}){if(!Pe(n))return r;let a=r.filter(e=>e.status!==`met`).map(e=>e.key);if(!a.length)return r;let o=await y(n),{system:s,messages:c}=H({course:e,lesson:t,criteria:r,answers:i,language:e?.language??n.language}),l=new AbortController,u=setTimeout(()=>l.abort(),Ne);try{let e=await o.generateJson({system:s,messages:c,signal:l.signal,validate:e=>U(e,{keys:a})}),t={};for(let n of Array.isArray(e)?e:[])n?.key&&typeof n.question==`string`&&n.question.trim()&&(t[n.key]=n.question);return W(r,t)}finally{clearTimeout(u)}}function Ie(e){if(!e?.quiz_seed)return null;try{let t=JSON.parse(e.quiz_seed),n=te(t);return n.length?n:null}catch{return null}}function Le({lesson:e,course:t,onAttemptSaved:n}){let i=d(),[o]=r(),s=(0,J.useMemo)(()=>Ie(e),[e?.quiz_seed]),[c,l]=(0,J.useReducer)(G,s,e=>e?G(ae,{type:`load`,questions:e,source:`seed`}):{...ae}),[u,f]=(0,J.useState)(null),[m,h]=(0,J.useState)(!1),[g,_]=(0,J.useState)(null),[b,S]=(0,J.useState)([]),[C,w]=(0,J.useState)(0),D=(0,J.useRef)(null),{status:k,error:M,start:N,stop:F}=q();(0,J.useEffect)(()=>{f(null),_(null),l(s?{type:`load`,questions:s,source:`seed`}:{type:`reset`})},[s,e?.id]);let I=(0,J.useCallback)(async()=>{f(null),_(null),l({type:`reset`});let n=await v(e.id).catch(()=>null);if(!n?.content_md){f(new a(`unknown`,i(`practice.quiz.noContent`),i(`practice.quiz.noContentHint`)));return}let r=t?.language??o.language,{system:s,messages:c}=se({course:t,lesson:e,content:n.content_md,language:r});try{let e=await y(o),t=await N(({signal:t})=>e.generateJson({system:s,messages:c,signal:t,validate:oe,language:r})),n=te(t);n.length&&l({type:`load`,questions:n,source:`ai`})}catch{}},[e?.id,t,o,N,i]),L=(0,J.useCallback)(async(r,a)=>{h(!0);try{let s=re(r,a),c=fe(D),l=await ee(e.id,{questions:r,answers:a,score:s,total:r.length,revisionOf:c});await O(`quiz`,e.id),n?.();let u=ge({questions:r,answers:a,questionText:e=>i(`revision.quiz.fallbackQuestion`,{label:e.label})});_({rowId:null,record:me({surface:`quiz`,attemptTable:`quiz_attempts`,attemptId:l.id,criteria:u})});try{let n=await Fe({course:t,lesson:e,settings:o,criteria:u,answers:a}),r=me({surface:`quiz`,attemptTable:`quiz_attempts`,attemptId:l.id,criteria:n}),i=await p(e.id,{role:`assistant`,content:JSON.stringify(r),mode:`review`});_({rowId:i?.id??null,record:r}),w(e=>e+1)}catch{}}catch(e){f(e)}finally{h(!1)}},[t,e,n,o,i]);(0,J.useEffect)(()=>{if(!e?.id)return;let t=!0;return Promise.all([E(e.id),j(e.id)]).then(([e,n])=>{if(!t)return;let r=(Array.isArray(n)?n:[]).filter(e=>e?.role===`assistant`&&e?.mode===`review`).map(e=>ye(e.content)).filter(e=>e?.surface===`quiz`);S((Array.isArray(e)?e:[]).map((e,t)=>{let n=de(e),a=r.find(t=>t.attemptId===e.id);return{id:e.id,label:i(`revision.history.attempt`,{n:t+1}),criteria:a?.criteria??ge({questions:n.questions,answers:n.answers,questionText:e=>i(`revision.quiz.fallbackQuestion`,{label:e.label})})}}))}).catch(()=>{t&&S([])}),()=>{t=!1}},[e?.id,C,i]);let R=ne(c),z=c.questions.length,B=c.current===z-1,V=c.answers[c.current],H=c.stage===`complete`?re(c.questions,c.answers):0,U=g?.record?.criteria??null,ie=xe({score:H,total:z,criteria:U}),W=k===`streaming`,K=(0,J.useCallback)(()=>{ue(D,ce({reviewId:g?.rowId??null,attemptId:g?.record?.attemptId??null})),_(null),l({type:`retake`})},[g]);return(k===`idle`||k===`stopped`)&&c.stage===`idle`?(0,Y.jsxs)(P,{className:`space-y-3`,children:[(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:i(`practice.quiz.intro`)}),(0,Y.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,Y.jsxs)(T,{onClick:I,children:[(0,Y.jsx)(`span`,{className:`sm:hidden`,children:i(`practice.quiz.startShort`)}),(0,Y.jsx)(`span`,{className:`hidden sm:inline`,children:i(`practice.quiz.start`)})]})})]}):W?(0,Y.jsxs)(P,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300`,children:[(0,Y.jsx)(x,{label:i(`practice.quiz.generating`)}),` `,i(`practice.quiz.writing`)]}),(0,Y.jsx)(T,{variant:`danger`,size:`sm`,onClick:F,children:i(`practice.quiz.stop`)})]}):u||M?(0,Y.jsxs)(P,{className:`space-y-3`,children:[(0,Y.jsx)(A,{error:u||M,onDismiss:()=>f(null)}),(0,Y.jsx)(T,{variant:`secondary`,onClick:I,children:i(`practice.quiz.tryAgain`)})]}):c.stage===`complete`?(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`p`,{className:`font-semibold`,children:i(`practice.quiz.youGot`,{score:H,total:z})}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:i(m?`practice.quiz.saving`:`practice.quiz.saved`)})]}),(0,Y.jsx)(le,{criteria:U??[],title:i(`revision.quiz.criteriaTitle`),showRevise:!ie,onRevise:K,reviseHint:i(`revision.quiz.reviseHint`)}),(0,Y.jsx)(`ul`,{className:`space-y-1.5 text-sm`,children:c.questions.map((e,t)=>{let n=c.answers[t]===e.answerIndex;return(0,Y.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,Y.jsx)(`span`,{className:n?`text-green-600 dark:text-green-400`:`text-red-600 dark:text-red-400`,children:n?`✓`:`✗`}),(0,Y.jsx)(`span`,{className:`text-neutral-700 dark:text-neutral-300`,children:e.question})]},t)})}),(0,Y.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:(0,Y.jsx)(T,{variant:`secondary`,onClick:I,children:i(`practice.quiz.newQuiz`)})}),(0,Y.jsx)(ve,{attempts:b,title:i(`revision.history.title`)})]}):R?(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-neutral-500`,children:[(0,Y.jsx)(`span`,{children:i(`practice.quiz.questionOf`,{n:c.current+1,total:z})}),c.source===`seed`&&(0,Y.jsx)(`span`,{children:i(`practice.quiz.demoQuiz`)})]}),(0,Y.jsx)(`p`,{className:`text-sm font-medium text-neutral-900 dark:text-neutral-100`,children:R.question}),(0,Y.jsx)(`div`,{className:`space-y-2`,children:R.options.map((e,t)=>{let n=t===R.answerIndex,r=t===V,i=`border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600`;return c.revealed&&n?i=`border-green-500 bg-green-50 dark:bg-green-500/10`:c.revealed&&r&&!n&&(i=`border-red-500 bg-red-50 dark:bg-red-500/10`),(0,Y.jsxs)(`button`,{type:`button`,disabled:c.revealed,onClick:()=>l({type:`answer`,optionIndex:t}),className:`flex w-full items-start gap-3 rounded-lg border px-3 py-2 text-left text-sm transition-colors disabled:cursor-default ${i}`,children:[(0,Y.jsx)(`span`,{className:`mt-0.5 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-current text-[11px] font-semibold`,children:Me[t]}),(0,Y.jsx)(`span`,{className:`text-neutral-800 dark:text-neutral-100`,children:e})]},t)})}),c.revealed&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium ${V===R.answerIndex?`text-green-700 dark:text-green-400`:`text-red-700 dark:text-red-400`}`,children:V===R.answerIndex?i(`practice.quiz.correct`):i(`practice.quiz.notQuite`,{letter:Me[R.answerIndex]})}),R.explanation&&(0,Y.jsx)(`p`,{className:`rounded-lg bg-neutral-50 p-3 text-sm text-neutral-700 dark:bg-neutral-800/60 dark:text-neutral-300`,children:R.explanation}),(0,Y.jsx)(`div`,{className:`flex justify-end`,children:(0,Y.jsx)(T,{onClick:()=>{let e=c.revealed&&B;l({type:`next`}),e&&L(c.questions,c.answers)},children:i(B?`practice.quiz.seeScore`:`practice.quiz.nextQuestion`)})})]})]}):null}var Re=0;function ze({lesson:e,course:t}){let n=d(),[i]=r(),[o,s]=(0,J.useState)(null),[l,u]=(0,J.useState)(0),[f,p]=(0,J.useState)(null),[m,h]=(0,J.useState)(!1),[g,_]=(0,J.useState)(null),{status:b,error:S,start:C,stop:w}=q(),E=(0,J.useCallback)(async()=>{p(null),_(null),u(0);let r=await v(e.id).catch(()=>null);if(!r?.content_md){p(new a(`unknown`,n(`practice.flashcards.noContent`),n(`practice.flashcards.noContentHint`)));return}let o=await Te(e.id),c=t?.language??i.language,{system:l,messages:d}=be({course:t,lesson:e,content:r.content_md,language:c});try{let e=await y(i),t=await C(({signal:t})=>e.generateJson({system:l,messages:d,signal:t,validate:ie,language:c})),n=K(t),r=Ee(n,o);u(n.length-r.length),s(r.map(e=>({...e,key:Re+=1})))}catch{}},[e?.id,t,i,C,n]),D=(e,t)=>s(n=>n.map(n=>n.key===e?{...n,...t}:n)),k=e=>s(t=>t.filter(t=>t.key!==e)),j=async()=>{let n=Ee(o||[]);if(n.length){h(!0),p(null);try{await c(t.id,e.id,n),await O(`flashcards`,e.id),_(n.length),s(null),u(0)}catch(e){p(e)}finally{h(!1)}}},N=b===`streaming`;return(0,Y.jsxs)(P,{className:`space-y-4`,children:[N&&(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300`,children:[(0,Y.jsx)(x,{label:n(`practice.flashcards.generating`)}),` `,n(`practice.flashcards.writing`)]}),(0,Y.jsx)(T,{variant:`danger`,size:`sm`,onClick:w,children:n(`practice.flashcards.stop`)})]}),(f||S)&&(0,Y.jsx)(A,{error:f||S,onDismiss:()=>p(null)}),g!==null&&!N&&(0,Y.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:n(`practice.flashcards.added`,{count:g,cardWord:n(`common.card`,{count:g})})}),!o&&!N&&(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:n(`practice.flashcards.intro`)}),o&&!N&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[l>0&&(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:n(`practice.flashcards.skipped`,{count:l,cardWord:n(`common.card`,{count:l})})}),o.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.flashcards.alreadyInDeck`)}):o.map(e=>(0,Y.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-neutral-200 p-3 dark:border-neutral-800`,children:[(0,Y.jsx)(M,{label:n(`practice.flashcards.front`),name:`front-${e.key}`,value:e.front,onChange:t=>D(e.key,{front:t.target.value})}),(0,Y.jsx)(M,{label:n(`practice.flashcards.back`),name:`back-${e.key}`,value:e.back,onChange:t=>D(e.key,{back:t.target.value})}),(0,Y.jsx)(`div`,{className:`flex justify-end`,children:(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,onClick:()=>k(e.key),children:n(`practice.flashcards.delete`)})})]},e.key))]}),!N&&(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[o&&o.length>0&&(0,Y.jsx)(T,{onClick:j,disabled:m,children:m?n(`common.saving`):n(`practice.flashcards.save`,{count:o.length,cardWord:n(`common.card`,{count:o.length})})}),(0,Y.jsx)(T,{variant:o?`secondary`:`primary`,onClick:E,children:n(o?`practice.flashcards.generateAgain`:`practice.flashcards.generate`)})]})]})}function Be(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Ve({lesson:e,course:t}){let n=d(),[r,i]=(0,J.useState)([]),a=(0,J.useCallback)(()=>E(e.id).then(i).catch(()=>{}),[e.id]);(0,J.useEffect)(()=>{let t=!0,n=()=>E(e.id).then(e=>t&&i(e)).catch(()=>{});n();let r=b(e=>{(e.table===`quiz_attempts`||e.table===`*`)&&n()});return()=>{t=!1,r()}},[e.id]);let o=[...r].reverse();return(0,Y.jsxs)(`div`,{className:`space-y-6`,children:[(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.quiz.title`)}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.quiz.subtitle`)})]}),(0,Y.jsx)(Le,{lesson:e,course:t,onAttemptSaved:a})]}),(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.flashcards.title`)}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.flashcards.subtitle`)})]}),(0,Y.jsx)(ze,{lesson:e,course:t})]}),(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.past.title`)}),o.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.past.empty`)}):(0,Y.jsx)(P,{className:`divide-y divide-neutral-200 p-0 dark:divide-neutral-800`,children:o.map(e=>(0,Y.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 text-sm`,children:[(0,Y.jsx)(`span`,{className:`text-neutral-500`,children:Be(e.created_at)}),(0,Y.jsxs)(`span`,{className:`font-medium`,children:[e.score??`—`,` / `,e.total??`—`]})]},e.id))})]})]})}var X=[`debit`,`credit`];function Z(){return{account:``,amount:``}}function He(){return{rows:{debit:[Z()],credit:[Z()]},status:`idle`,invalid:[],result:null,hintLevel:0}}function Ue(e,t){let n=Math.max(0,Number(t)||0);return Math.min(n,Math.max(0,Number(e)||0)+1)}function We(e,t){return!X.includes(t)||e[t].length>=6?e:{...e,[t]:[...e[t],Z()]}}function Ge(e,t,n){return!X.includes(t)||e[t].length<=1?e:{...e,[t]:e[t].filter((e,t)=>t!==n)}}function Ke(e,t,n,r){return!X.includes(t)||!e[t]?.[n]?e:{...e,[t]:e[t].map((e,t)=>t===n?{...e,...r}:e)}}function qe(e){let t=String(e??``).trim();if(!/^\d+$/.test(t))return NaN;let n=Number(t);return Number.isSafeInteger(n)?n:NaN}function Je(e){let t=t=>(e[t]||[]).filter(e=>String(e.account??``).trim()!==``||String(e.amount??``).trim()!==``).map(e=>({account:String(e.account??``).trim(),amount:qe(e.amount)}));return{debit:t(`debit`),credit:t(`credit`)}}function Ye(e,t){let n=new Set((e.accounts||[]).map(e=>e.name)),r=[];for(let e of X)(t[e]||[]).forEach((t,i)=>{t.account?n.has(t.account)||r.push({side:e,index:i,code:`unknown_account`}):r.push({side:e,index:i,code:`missing_account`}),(!Number.isInteger(t.amount)||t.amount<=0)&&r.push({side:e,index:i,code:`invalid_amount`})});return X.every(e=>(t[e]||[]).length===0)&&r.length===0&&r.push({side:`debit`,index:-1,code:`nothing_entered`}),r}function Xe(e){let t=new Map;for(let n of e){let e=`${n.side}|${n.account}|${n.amount}`;t.set(e,(t.get(e)||0)+1)}return t}function Ze(e){let t=new Map;for(let n of X)for(let r of e.answer[n]||[]){let e=`${n}|${r.account}`;t.has(e)||t.set(e,new Set),t.get(e).add(r.amount)}return t}function Qe(e,t){let n={debit:(t.debit||[]).reduce((e,t)=>e+t.amount,0),credit:(t.credit||[]).reduce((e,t)=>e+t.amount,0)},r=n.debit===n.credit,i=X.flatMap(e=>(t[e]||[]).map((t,n)=>({...t,side:e,index:n}))),a=Xe(X.flatMap(t=>(e.answer[t]||[]).map(e=>({...e,side:t})))),o=[];for(let e of i){let t=`${e.side}|${e.account}|${e.amount}`,n=a.get(t)||0;n>0?a.set(t,n-1):o.push(e)}let s=[];for(let[e,t]of a)t>0&&s.push(e);let c=Ze(e),l=[];for(let e of o){let t=c.get(`${e.side}|${e.account}`),n=c.get(`${e.side===`debit`?`credit`:`debit`}|${e.account}`),r=`account_not_right`;t?.has(e.amount)?r=`extra_row`:t?.size?r=`amount_wrong`:n?.size&&(r=`wrong_side`),l.push({side:e.side,index:e.index,code:r})}let u={debit:0,credit:0};for(let e of s){let[t]=e.split(`|`);u[t]+=1}let d={debit:null,credit:null};for(let e of X){let n=l.some(t=>t.side===e);u[e]>0&&!n&&(d[e]=(t[e]||[]).length===0?`nothing_entered`:`needs_more_rows`)}let f=[],p=e=>{e&&!f.includes(e)&&f.push(e)};for(let e of l)p(e.code);for(let e of X)p(d[e]);return r||p(`unbalanced`),{correct:r&&o.length===0&&s.length===0,balanced:r,totals:n,issues:l,sideIssues:d,codes:f}}function Q(e,t){let n=Je(t),r=Ye(e,n);return r.length?{submission:n,invalid:r,result:null}:{submission:n,invalid:[],result:Qe(e,n)}}function $e(e,t){switch(t.type){case`set-account`:return{...e,rows:Ke(e.rows,t.side,t.index,{account:t.account}),status:`idle`,invalid:[],result:null};case`set-amount`:return{...e,rows:Ke(e.rows,t.side,t.index,{amount:t.amount}),status:`idle`,invalid:[],result:null};case`add-row`:return{...e,rows:We(e.rows,t.side),status:`idle`,invalid:[],result:null};case`remove-row`:return{...e,rows:Ge(e.rows,t.side,t.index),status:`idle`,invalid:[],result:null};case`check`:{let n=t.outcome||Q(t.spec,e.rows);return n.invalid.length?{...e,status:`invalid`,invalid:n.invalid,result:null}:{...e,status:n.result.correct?`correct`:`incorrect`,invalid:[],result:n.result}}case`hint`:return{...e,hintLevel:Ue(e.hintLevel,t.count)};case`reset`:return{...He(),hintLevel:e.hintLevel};default:return e}}function et(e){let t=String(e||``);return t.length>=16?t.slice(11,16):``}function tt({attempts:e=[]}){let t=d(),n=Array.isArray(e)?e:[],r=n.slice(-5).reverse();return(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:t(`exercises.journal.history.title`)}),r.length===0?(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:t(`exercises.journal.history.empty`)}):(0,Y.jsx)(`ul`,{className:`space-y-1 text-xs text-neutral-600 dark:text-neutral-300`,children:r.map((e,r)=>{let i=n.length-r,a=t(e.correct?`exercises.journal.history.correct`:`exercises.journal.history.incorrect`);return(0,Y.jsx)(`li`,{children:t(`exercises.journal.history.entry`,{n:i,status:a,time:et(e.created_at)})},e.id||i)})})]})}var nt=[`debit`,`credit`],rt=`w-full rounded-lg border border-neutral-300 bg-white px-2 py-1.5 text-sm text-neutral-900 placeholder:text-neutral-400 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100`;function it({side:e,index:t,row:n,accounts:r,disabled:i,t:a,onChange:o,onRemove:s}){let c=`je-${e}-${t}-account`,l=`je-${e}-${t}-amount`;return(0,Y.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Y.jsx)(`label`,{htmlFor:c,className:`sr-only`,children:a(`exercises.journal.account`)}),(0,Y.jsxs)(`select`,{id:c,className:`${rt} min-w-0 flex-1`,value:n.account,disabled:i,onChange:e=>o({account:e.target.value}),children:[(0,Y.jsx)(`option`,{value:``,children:a(`exercises.journal.accountPlaceholder`)}),r.map(e=>(0,Y.jsxs)(`option`,{value:e.name,children:[e.name,` — `,e.gloss]},e.name))]}),(0,Y.jsx)(`label`,{htmlFor:l,className:`sr-only`,children:a(`exercises.journal.amount`)}),(0,Y.jsx)(`input`,{id:l,className:`${rt} w-28`,type:`number`,inputMode:`numeric`,min:`1`,step:`1`,placeholder:a(`exercises.journal.amountPlaceholder`),value:n.amount,disabled:i,onChange:e=>o({amount:e.target.value})}),(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,className:`px-2`,"aria-label":a(`exercises.journal.removeRow`,{n:t+1}),disabled:i,onClick:s,children:`×`})]})}function at(e,t){if(!e)return[];let n=[];for(let r of e.codes||[]){if(r===`unbalanced`){n.push({key:r,text:t(`exercises.journal.issue.unbalanced`)});continue}if(r===`needs_more_rows`||r===`nothing_entered`){let i=nt.find(t=>e.sideIssues?.[t]===r)||`debit`;n.push({key:r,text:t(`exercises.journal.issue.${r}`,{side:t(`exercises.journal.side.${i}`)})});continue}let i=(e.issues||[]).find(e=>e.code===r)||{},a=i.side||`debit`;n.push({key:r,text:t(`exercises.journal.issue.${r}`,{n:(i.index??0)+1,side:t(`exercises.journal.side.${a}`)})})}return n}function ot(e,t){let n=new Set,r=[];for(let i of e||[]){let e=`${i.code}:${i.side}:${i.index}`;n.has(e)||(n.add(e),r.push({key:e,text:t(`exercises.journal.issue.${i.code}`,{n:i.index+1,side:t(`exercises.journal.side.${i.side}`)})}))}return r}function st({exercise:e,lesson:t}){let n=d(),r=(0,J.useMemo)(()=>Ce(e?.spec),[e?.spec]),[i,a]=(0,J.useReducer)($e,void 0,He),[o,s]=(0,J.useState)([]),[c,l]=(0,J.useState)(!1),[u,f]=(0,J.useState)(!1);if((0,J.useEffect)(()=>{if(!e?.id)return;let t=!0;return N(e.id).then(e=>{t&&s(e)}).catch(()=>{}),()=>{t=!1}},[e?.id]),!r)return null;let p=i.status===`correct`||i.status===`incorrect`,m=i.status===`correct`,h=async()=>{if(c||m)return;let n=Q(r,i.rows);if(a({type:`check`,spec:r,outcome:n}),!n.invalid.length){l(!0),f(!1);try{await z(e.id,{courseId:t?.course_id??null,lessonId:t?.id??null,rows:n.submission,result:n.result}),s(await N(e.id))}catch{f(!0)}finally{l(!1)}}},g=p?at(i.result,n):ot(i.invalid,n);return(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(k,{tone:`accent`,children:n(`exercises.journal.badge`)}),(0,Y.jsx)(`p`,{className:`font-medium`,children:r.prompt}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:r.promptGloss})]}),(0,Y.jsx)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:nt.map(e=>(0,Y.jsxs)(`div`,{className:`space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:n(`exercises.journal.${e}`)}),(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,disabled:i.rows[e].length>=6||m,onClick:()=>a({type:`add-row`,side:e}),children:n(`exercises.journal.addRow`)})]}),(0,Y.jsx)(`div`,{className:`space-y-2`,children:i.rows[e].map((t,i)=>(0,Y.jsx)(it,{side:e,index:i,row:t,accounts:r.accounts,disabled:m,t:n,onChange:t=>a({type:t.account===void 0?`set-amount`:`set-account`,side:e,index:i,...t}),onRemove:()=>a({type:`remove-row`,side:e,index:i})},`${e}-${i}`))})]},e))}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Y.jsx)(T,{onClick:h,disabled:c||m,children:n(c?`exercises.journal.checking`:`exercises.journal.check`)}),(0,Y.jsx)(T,{variant:`secondary`,onClick:()=>a({type:`reset`}),disabled:c,children:n(`exercises.journal.reset`)}),(0,Y.jsx)(T,{variant:`ghost`,onClick:()=>a({type:`hint`,count:r.hints.length}),disabled:i.hintLevel>=r.hints.length,children:i.hintLevel>=r.hints.length?n(`exercises.journal.hintExhausted`):n(`exercises.journal.hintNext`,{n:i.hintLevel+1,total:r.hints.length})})]}),i.hintLevel>0&&(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:n(`exercises.journal.hintsTitle`)}),(0,Y.jsx)(`ol`,{className:`space-y-1 text-sm text-neutral-700 dark:text-neutral-300`,children:r.hints.slice(0,i.hintLevel).map((e,t)=>(0,Y.jsxs)(`li`,{children:[t+1,`. `,e]},`hint-${t}`))})]}),i.status===`invalid`&&g.length>0&&(0,Y.jsxs)(`div`,{className:`space-y-1`,role:`status`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium text-amber-700 dark:text-amber-300`,children:n(`exercises.journal.invalid`)}),(0,Y.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm text-neutral-700 dark:text-neutral-300`,children:g.map(e=>(0,Y.jsx)(`li`,{children:e.text},e.key))})]}),i.status===`incorrect`&&(0,Y.jsxs)(`div`,{className:`space-y-1`,role:`status`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium text-neutral-800 dark:text-neutral-100`,children:n(`exercises.journal.incorrect`)}),(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:n(`exercises.journal.totals`,{debit:i.result.totals.debit,credit:i.result.totals.credit})}),(0,Y.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm text-neutral-700 dark:text-neutral-300`,children:g.map(e=>(0,Y.jsx)(`li`,{children:e.text},e.key))})]}),i.status===`correct`&&(0,Y.jsx)(`p`,{className:`text-sm font-medium text-green-700 dark:text-green-300`,role:`status`,children:n(`exercises.journal.correct`)}),u&&(0,Y.jsx)(`p`,{className:`text-sm text-amber-700 dark:text-amber-300`,role:`alert`,children:n(`exercises.journal.saveFailed`)}),(0,Y.jsx)(tt,{attempts:o})]})}var $=Object.freeze({"journal-entry":Object.freeze({Component:st,grade:Qe})});function ct(e){return $[e]||null}Object.freeze(Object.keys($));function lt({provided:e,fetched:t}={}){return(Array.isArray(e)?e:Array.isArray(t)?t:[]).filter(we)}function ut({lesson:e,course:t,exercises:n}){let r=d(),i=Array.isArray(n),[a,o]=(0,J.useState)([]),[s,c]=(0,J.useState)(i);(0,J.useEffect)(()=>{if(i||!e?.id)return;let t=!0;return L(e.id).then(e=>{t&&(o(e),c(!0))}).catch(()=>{t&&(o([]),c(!0))}),()=>{t=!1}},[i,e?.id]);let l=lt({provided:i?n:void 0,fetched:a});return s?l.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:r(`exercises.surface.empty`)}):(0,Y.jsxs)(`div`,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-lg font-semibold`,children:r(`exercises.surface.title`)}),(0,Y.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:r(`exercises.surface.description`)})]}),l.map(n=>{let r=ct(n.type);if(!r)return null;let{Component:i}=r;return(0,Y.jsx)(i,{exercise:n,lesson:e,course:t},n.id)})]}):(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:r(`common.loading`)})}var dt=(0,J.lazy)(()=>h(()=>import(`./CodeWorkspace-BwCEINWo.js`).then(e=>({default:e.CodeWorkspace})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url)),ft={done:`success`,active:`accent`,todo:`neutral`};function pt({lesson:e,onClose:t,onSaved:n}){let r=d(),[i,a]=(0,J.useState)(``),[o,s]=(0,J.useState)(3),[c,l]=(0,J.useState)(!1);return(0,Y.jsx)(`div`,{className:`fixed inset-0 z-30 grid place-items-center bg-black/40 p-4`,role:`dialog`,"aria-modal":`true`,"aria-label":r(`reflection.aria`),children:(0,Y.jsxs)(P,{className:`w-full max-w-md space-y-4`,children:[(0,Y.jsx)(`h2`,{className:`font-semibold`,children:r(`reflection.title`,{title:e.title})}),(0,Y.jsx)(C,{label:r(`reflection.hardest`),name:`hardest`,rows:3,value:i,onChange:e=>a(e.target.value),placeholder:r(`reflection.hardestPlaceholder`)}),(0,Y.jsx)(I,{label:r(`reflection.confidence`),name:`confidence`,value:o,onChange:e=>s(Number(e.target.value)),children:[1,2,3,4,5].map(e=>(0,Y.jsxs)(`option`,{value:e,children:[e,` — `,r(`reflection.confidenceLabels.${e}`)]},e))}),(0,Y.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Y.jsx)(T,{variant:`ghost`,onClick:t,children:r(`reflection.cancel`)}),(0,Y.jsx)(T,{onClick:async()=>{l(!0),await S(e.id,{hardest:i,confidence:o}),await B(e.id,{status:`done`}),await O(`lesson_done`,e.id),l(!1),n()},disabled:c,children:r(c?`reflection.saving`:`reflection.markDone`)})]})]})})}function mt({id:e,lessonId:t}){let n=d(),[r,i]=(0,J.useState)(null),[a,o]=(0,J.useState)(!1),[s,c]=(0,J.useState)(`practice`),[u,f]=(0,J.useState)(!1),[p,h]=(0,J.useState)(!1),[v,y]=(0,J.useState)([]);(0,J.useEffect)(()=>{let t=!0,n=()=>_(e).then(e=>t&&i(e)).finally(()=>t&&o(!0));n();let r=b(e=>{(e.table===`lessons`||e.table===`lesson_versions`||e.table===`*`)&&n()});return()=>{t=!1,r()}},[e]);let x=r?.lessons.find(e=>e.id===t)||null;if((0,J.useEffect)(()=>{let e=!0;if(!x?.id)return y([]),()=>{e=!1};y([]);let t=()=>L(x.id).then(t=>e&&y(t)).catch(()=>e&&y([]));t();let n=b(e=>{(e.table===`exercises`||e.table===`*`)&&t()});return()=>{e=!1,n()}},[x?.id]),(0,J.useEffect)(()=>{x&&x.status===`todo`&&B(x.id,{status:`active`})},[x?.id,x?.status]),(0,J.useEffect)(()=>{let e=!0;return!r||r.status===`completed`||!Se(r)?(h(!1),()=>{e=!1}):((async()=>{let t=await l(r.id).catch(()=>null),n=t?await g(t.id).catch(()=>null):null;e&&h(!!t&&n?.verdict!==`course_complete`)})(),()=>{e=!1})},[r]),!a)return(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`common.loading`)});if(!r||!x)return(0,Y.jsx)(F,{title:n(`lesson.notFound`),action:(0,Y.jsx)(m,{to:`/course/${e}`,children:(0,Y.jsx)(T,{variant:`secondary`,children:n(`lesson.backToCourse`)})})});let S=De({kind:r.kind,exercises:v}),C=Oe(s,S);return(0,Y.jsxs)(`div`,{className:`space-y-5`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`nav`,{className:`text-xs text-neutral-500`,children:[(0,Y.jsx)(m,{to:`/`,className:`hover:underline`,children:n(`lesson.home`)}),` `,`/`,` `,(0,Y.jsx)(m,{to:`/course/${r.id}`,className:`hover:underline`,children:r.title}),` `,`/ `,n(`lesson.breadcrumb`,{n:x.position})]}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`h1`,{className:`text-xl font-semibold`,children:x.title}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(k,{tone:ft[x.status],children:n(`lesson.status.${x.status}`)}),x.status!==`done`&&(0,Y.jsx)(T,{onClick:()=>f(!0),children:n(`lesson.markDone`)}),x.status===`done`&&(0,Y.jsx)(T,{variant:`secondary`,onClick:()=>f(!0),children:n(`lesson.revisit`)})]})]})]}),(0,Y.jsx)(je,{lesson:x,course:r}),(0,Y.jsx)(`div`,{className:`border-b border-neutral-200 dark:border-neutral-800`,children:(0,Y.jsx)(`div`,{className:`flex gap-1`,children:[{id:`practice`,label:n(`lesson.tabs.practice`)},{id:`tutor`,label:n(`lesson.tabs.tutor`)},...S?[{id:`workspace`,label:n(S===`exercise`?`lesson.tabs.exercise`:`lesson.tabs.workspace`)}]:[]].map(e=>(0,Y.jsx)(`button`,{type:`button`,onClick:()=>c(e.id),className:`border-b-2 px-3 py-2 text-sm font-medium ${C===e.id?`border-indigo-500 text-indigo-600 dark:text-indigo-400`:`border-transparent text-neutral-500 hover:text-neutral-800 dark:hover:text-neutral-200`}`,children:e.label},e.id))})}),C===`practice`&&(0,Y.jsx)(Ve,{lesson:x,course:r}),C===`tutor`&&(0,Y.jsx)(_e,{lesson:x,course:r,capstone:p}),C===`workspace`&&S===`exercise`&&(0,Y.jsx)(ut,{lesson:x,course:r,exercises:v}),C===`workspace`&&S===`code`&&(0,Y.jsx)(J.Suspense,{fallback:(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`lesson.loadingWorkspace`)}),children:(0,Y.jsx)(dt,{lesson:x,course:r})}),u&&(0,Y.jsx)(pt,{lesson:x,onClose:()=>f(!1),onSaved:()=>{f(!1),V(`/course/${r.id}`)}})]})}export{mt as Lesson};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CodeWorkspace-BNrL4qvR.js","./rolldown-runtime-COiEfhsA.js","./react-B8SKf8RM.js","./settings-DhwuyNPU.js","./errors-BZa_CNHL.js","./index-CS8XPYbB.js","./index-CVenTTOY.css","./TutorPanel-DQDWIU7f.js","./schemas-BOc2YsOP.js","./capstone-DhwBeNqk.js","./fetch-local-DG3O3hmQ.js","./bridge-Cr0q4rLp.js","./useStream-rdsR6A7P.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{a as n,f as r}from"./settings-DhwuyNPU.js";import{l as i,n as a,o,u as s}from"./errors-BZa_CNHL.js";import{I as c,J as l,L as u,Lt as d,O as f,R as p,Rt as m,Tt as h,X as g,Y as _,Z as v,_ as y,_t as b,a as x,bt as S,d as C,dt as w,f as T,ft as E,g as D,gt as O,h as k,i as A,it as j,l as M,lt as N,p as P,t as F,u as I,ut as L,v as R,vt as z,wt as B,yt as ee,zt as V}from"./index-CS8XPYbB.js";import{A as te,D as ne,E as H,F as U,M as re,N as ie,O as ae,P as oe,T as se,_ as W,b as ce,d as le,f as ue,g as de,h as fe,j as G,k as K,l as pe,m as me,n as he,p as ge,t as _e,u as ve,v as ye,w as be,y as xe}from"./TutorPanel-DQDWIU7f.js";import{o as Se}from"./capstone-DhwBeNqk.js";import{n as Ce,t as we}from"./spec-nAnsSMkw.js";import{t as q}from"./useStream-rdsR6A7P.js";import{n as Te,t as Ee}from"./card-store-CVMBc-Pv.js";var J=e(t(),1);function De({kind:e,exercises:t}={}){return(Array.isArray(t)?t:[]).some(we)?`exercise`:e===`programming`?`code`:null}function Oe(e,t){return e===`workspace`&&!t?`practice`:e}var Y=D();function ke(e){if(!e)return``;try{return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}catch{return``}}function Ae(e,t){let n=ke(e.created_at),r=e.model||e.provider||``;return[`v${e.version}`,n&&t(`lesson.generated`,{time:n}),r].filter(Boolean).join(` · `)}function je({lesson:e,course:t}){let a=d(),[c]=r(),[l,p]=(0,J.useState)(null),[m,h]=(0,J.useState)(null),[g,_]=(0,J.useState)(null),[S,C]=(0,J.useState)(!1),E=q(),D=t?.language??c.language;(0,J.useEffect)(()=>{let t=!0,n=()=>Promise.all([w(e.id),v(e.id)]).then(([e,n])=>{t&&(p(e),h(t=>t&&e.some(e=>e.id===t)?t:n?.id||e[e.length-1]?.id||null))}).catch(()=>t&&p([]));n();let r=b(e=>{e.table===`lesson_versions`&&(e.id==null||e.type===`create`)&&n()});return()=>{t=!1,r()}},[e.id]);let O=(0,J.useMemo)(()=>l?.find(e=>e.id===m)||null,[l,m]),k=async n=>{let r=await y(c),{system:i,messages:a}=pe({course:t,lesson:e,level:t?.level,language:D,strict:n});return E.start(({onText:e,signal:t})=>r.streamText({system:i,messages:a,onText:e,signal:t,effort:`high`,maxTokens:R.lesson}))},j=async t=>await u(e.id,{content_md:t,model:n(c),provider:c.provider,language:D}),M=async()=>{_(null),C(!1);try{let e=await k(!1);if(!e||!e.trim())return;let t=await j(e);if(h(t.id),!o(D)&&!f(e,D).ok){C(!0);let e=await k(!0);if(e&&e.trim()){let t=await j(e);h(t.id)}}}catch(e){_(e)}},N=()=>{window.confirm(a(`lesson.regenerateConfirm`))&&M()};if(l===null)return(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:a(`lesson.loading`)});let I=E.status===`streaming`;return!O?.content_md&&!I?(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsx)(F,{title:a(`lesson.noContent.title`),description:a(`lesson.noContent.description`),action:(0,Y.jsx)(T,{onClick:M,children:a(`lesson.noContent.action`)})}),(0,Y.jsx)(A,{error:g||E.error,onDismiss:()=>_(null)})]}):(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-2`,children:l.length>1?(0,Y.jsxs)(`label`,{className:`text-sm`,children:[(0,Y.jsx)(`span`,{className:`sr-only`,children:a(`lesson.version`)}),(0,Y.jsx)(`select`,{value:m||``,onChange:e=>h(e.target.value),className:`rounded-lg border border-neutral-300 bg-white px-2 py-1 text-sm dark:border-neutral-700 dark:bg-neutral-900`,children:[...l].reverse().map(e=>(0,Y.jsx)(`option`,{value:e.id,children:Ae(e,a)},e.id))})]}):O&&(0,Y.jsx)(`span`,{className:`text-xs text-neutral-500`,children:Ae(O,a)})}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[I&&(0,Y.jsx)(x,{}),I?(0,Y.jsx)(T,{variant:`secondary`,onClick:E.stop,children:a(`common.stop`)}):(0,Y.jsx)(T,{variant:`secondary`,size:`sm`,onClick:N,children:O?.language&&s(O.language)!==s(D)?a(`lesson.regenerateIn`,{language:i(D)}):a(`common.regenerate`)})]})]}),(g||E.error)&&(0,Y.jsx)(A,{error:g||E.error,onDismiss:()=>_(null)}),S&&!I&&(0,Y.jsx)(`p`,{className:`rounded-lg bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:bg-amber-500/10 dark:text-amber-200`,children:a(`lesson.languageNotice`,{language:i(D)})}),I?(0,Y.jsxs)(P,{className:`bg-neutral-50 dark:bg-neutral-900/50`,children:[(0,Y.jsx)(`p`,{className:`mb-2 text-xs font-medium uppercase tracking-wide text-neutral-500`,children:a(`lesson.generating`)}),(0,Y.jsx)(`pre`,{className:`whitespace-pre-wrap break-words font-mono text-sm text-neutral-700 dark:text-neutral-200`,children:E.text||`…`})]}):(0,Y.jsx)(he,{children:O.content_md})]})}var Me=[`A`,`B`,`C`,`D`],Ne=6e3;function Pe(e){switch(e.provider){case`anthropic`:return!!e.anthropic?.apiKey;case`openai`:return!!e.openai?.apiKey;case`ollama`:case`bridge`:return!0;default:return!1}}async function Fe({course:e,lesson:t,settings:n,criteria:r,answers:i}){if(!Pe(n))return r;let a=r.filter(e=>e.status!==`met`).map(e=>e.key);if(!a.length)return r;let o=await y(n),{system:s,messages:c}=H({course:e,lesson:t,criteria:r,answers:i,language:e?.language??n.language}),l=new AbortController,u=setTimeout(()=>l.abort(),Ne);try{let e=await o.generateJson({system:s,messages:c,signal:l.signal,validate:e=>U(e,{keys:a})}),t={};for(let n of Array.isArray(e)?e:[])n?.key&&typeof n.question==`string`&&n.question.trim()&&(t[n.key]=n.question);return W(r,t)}finally{clearTimeout(u)}}function Ie(e){if(!e?.quiz_seed)return null;try{let t=JSON.parse(e.quiz_seed),n=te(t);return n.length?n:null}catch{return null}}function Le({lesson:e,course:t,onAttemptSaved:n}){let i=d(),[o]=r(),s=(0,J.useMemo)(()=>Ie(e),[e?.quiz_seed]),[c,l]=(0,J.useReducer)(G,s,e=>e?G(ae,{type:`load`,questions:e,source:`seed`}):{...ae}),[u,f]=(0,J.useState)(null),[m,h]=(0,J.useState)(!1),[g,_]=(0,J.useState)(null),[b,S]=(0,J.useState)([]),[C,w]=(0,J.useState)(0),D=(0,J.useRef)(null),{status:k,error:M,start:N,stop:F}=q();(0,J.useEffect)(()=>{f(null),_(null),l(s?{type:`load`,questions:s,source:`seed`}:{type:`reset`})},[s,e?.id]);let I=(0,J.useCallback)(async()=>{f(null),_(null),l({type:`reset`});let n=await v(e.id).catch(()=>null);if(!n?.content_md){f(new a(`unknown`,i(`practice.quiz.noContent`),i(`practice.quiz.noContentHint`)));return}let r=t?.language??o.language,{system:s,messages:c}=se({course:t,lesson:e,content:n.content_md,language:r});try{let e=await y(o),t=await N(({signal:t})=>e.generateJson({system:s,messages:c,signal:t,validate:oe,language:r})),n=te(t);n.length&&l({type:`load`,questions:n,source:`ai`})}catch{}},[e?.id,t,o,N,i]),L=(0,J.useCallback)(async(r,a)=>{h(!0);try{let s=re(r,a),c=fe(D),l=await ee(e.id,{questions:r,answers:a,score:s,total:r.length,revisionOf:c});await O(`quiz`,e.id),n?.();let u=ge({questions:r,answers:a,questionText:e=>i(`revision.quiz.fallbackQuestion`,{label:e.label})});_({rowId:null,record:me({surface:`quiz`,attemptTable:`quiz_attempts`,attemptId:l.id,criteria:u})});try{let n=await Fe({course:t,lesson:e,settings:o,criteria:u,answers:a}),r=me({surface:`quiz`,attemptTable:`quiz_attempts`,attemptId:l.id,criteria:n}),i=await p(e.id,{role:`assistant`,content:JSON.stringify(r),mode:`review`});_({rowId:i?.id??null,record:r}),w(e=>e+1)}catch{}}catch(e){f(e)}finally{h(!1)}},[t,e,n,o,i]);(0,J.useEffect)(()=>{if(!e?.id)return;let t=!0;return Promise.all([E(e.id),j(e.id)]).then(([e,n])=>{if(!t)return;let r=(Array.isArray(n)?n:[]).filter(e=>e?.role===`assistant`&&e?.mode===`review`).map(e=>ye(e.content)).filter(e=>e?.surface===`quiz`);S((Array.isArray(e)?e:[]).map((e,t)=>{let n=de(e),a=r.find(t=>t.attemptId===e.id);return{id:e.id,label:i(`revision.history.attempt`,{n:t+1}),criteria:a?.criteria??ge({questions:n.questions,answers:n.answers,questionText:e=>i(`revision.quiz.fallbackQuestion`,{label:e.label})})}}))}).catch(()=>{t&&S([])}),()=>{t=!1}},[e?.id,C,i]);let R=ne(c),z=c.questions.length,B=c.current===z-1,V=c.answers[c.current],H=c.stage===`complete`?re(c.questions,c.answers):0,U=g?.record?.criteria??null,ie=xe({score:H,total:z,criteria:U}),W=k===`streaming`,K=(0,J.useCallback)(()=>{ue(D,ce({reviewId:g?.rowId??null,attemptId:g?.record?.attemptId??null})),_(null),l({type:`retake`})},[g]);return(k===`idle`||k===`stopped`)&&c.stage===`idle`?(0,Y.jsxs)(P,{className:`space-y-3`,children:[(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:i(`practice.quiz.intro`)}),(0,Y.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,Y.jsxs)(T,{onClick:I,children:[(0,Y.jsx)(`span`,{className:`sm:hidden`,children:i(`practice.quiz.startShort`)}),(0,Y.jsx)(`span`,{className:`hidden sm:inline`,children:i(`practice.quiz.start`)})]})})]}):W?(0,Y.jsxs)(P,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300`,children:[(0,Y.jsx)(x,{label:i(`practice.quiz.generating`)}),` `,i(`practice.quiz.writing`)]}),(0,Y.jsx)(T,{variant:`danger`,size:`sm`,onClick:F,children:i(`practice.quiz.stop`)})]}):u||M?(0,Y.jsxs)(P,{className:`space-y-3`,children:[(0,Y.jsx)(A,{error:u||M,onDismiss:()=>f(null)}),(0,Y.jsx)(T,{variant:`secondary`,onClick:I,children:i(`practice.quiz.tryAgain`)})]}):c.stage===`complete`?(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`p`,{className:`font-semibold`,children:i(`practice.quiz.youGot`,{score:H,total:z})}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:i(m?`practice.quiz.saving`:`practice.quiz.saved`)})]}),(0,Y.jsx)(le,{criteria:U??[],title:i(`revision.quiz.criteriaTitle`),showRevise:!ie,onRevise:K,reviseHint:i(`revision.quiz.reviseHint`)}),(0,Y.jsx)(`ul`,{className:`space-y-1.5 text-sm`,children:c.questions.map((e,t)=>{let n=c.answers[t]===e.answerIndex;return(0,Y.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,Y.jsx)(`span`,{className:n?`text-green-600 dark:text-green-400`:`text-red-600 dark:text-red-400`,children:n?`✓`:`✗`}),(0,Y.jsx)(`span`,{className:`text-neutral-700 dark:text-neutral-300`,children:e.question})]},t)})}),(0,Y.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:(0,Y.jsx)(T,{variant:`secondary`,onClick:I,children:i(`practice.quiz.newQuiz`)})}),(0,Y.jsx)(ve,{attempts:b,title:i(`revision.history.title`)})]}):R?(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-neutral-500`,children:[(0,Y.jsx)(`span`,{children:i(`practice.quiz.questionOf`,{n:c.current+1,total:z})}),c.source===`seed`&&(0,Y.jsx)(`span`,{children:i(`practice.quiz.demoQuiz`)})]}),(0,Y.jsx)(`p`,{className:`text-sm font-medium text-neutral-900 dark:text-neutral-100`,children:R.question}),(0,Y.jsx)(`div`,{className:`space-y-2`,children:R.options.map((e,t)=>{let n=t===R.answerIndex,r=t===V,i=`border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600`;return c.revealed&&n?i=`border-green-500 bg-green-50 dark:bg-green-500/10`:c.revealed&&r&&!n&&(i=`border-red-500 bg-red-50 dark:bg-red-500/10`),(0,Y.jsxs)(`button`,{type:`button`,disabled:c.revealed,onClick:()=>l({type:`answer`,optionIndex:t}),className:`flex w-full items-start gap-3 rounded-lg border px-3 py-2 text-left text-sm transition-colors disabled:cursor-default ${i}`,children:[(0,Y.jsx)(`span`,{className:`mt-0.5 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-current text-[11px] font-semibold`,children:Me[t]}),(0,Y.jsx)(`span`,{className:`text-neutral-800 dark:text-neutral-100`,children:e})]},t)})}),c.revealed&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium ${V===R.answerIndex?`text-green-700 dark:text-green-400`:`text-red-700 dark:text-red-400`}`,children:V===R.answerIndex?i(`practice.quiz.correct`):i(`practice.quiz.notQuite`,{letter:Me[R.answerIndex]})}),R.explanation&&(0,Y.jsx)(`p`,{className:`rounded-lg bg-neutral-50 p-3 text-sm text-neutral-700 dark:bg-neutral-800/60 dark:text-neutral-300`,children:R.explanation}),(0,Y.jsx)(`div`,{className:`flex justify-end`,children:(0,Y.jsx)(T,{onClick:()=>{let e=c.revealed&&B;l({type:`next`}),e&&L(c.questions,c.answers)},children:i(B?`practice.quiz.seeScore`:`practice.quiz.nextQuestion`)})})]})]}):null}var Re=0;function ze({lesson:e,course:t}){let n=d(),[i]=r(),[o,s]=(0,J.useState)(null),[l,u]=(0,J.useState)(0),[f,p]=(0,J.useState)(null),[m,h]=(0,J.useState)(!1),[g,_]=(0,J.useState)(null),{status:b,error:S,start:C,stop:w}=q(),E=(0,J.useCallback)(async()=>{p(null),_(null),u(0);let r=await v(e.id).catch(()=>null);if(!r?.content_md){p(new a(`unknown`,n(`practice.flashcards.noContent`),n(`practice.flashcards.noContentHint`)));return}let o=await Te(e.id),c=t?.language??i.language,{system:l,messages:d}=be({course:t,lesson:e,content:r.content_md,language:c});try{let e=await y(i),t=await C(({signal:t})=>e.generateJson({system:l,messages:d,signal:t,validate:ie,language:c})),n=K(t),r=Ee(n,o);u(n.length-r.length),s(r.map(e=>({...e,key:Re+=1})))}catch{}},[e?.id,t,i,C,n]),D=(e,t)=>s(n=>n.map(n=>n.key===e?{...n,...t}:n)),k=e=>s(t=>t.filter(t=>t.key!==e)),j=async()=>{let n=Ee(o||[]);if(n.length){h(!0),p(null);try{await c(t.id,e.id,n),await O(`flashcards`,e.id),_(n.length),s(null),u(0)}catch(e){p(e)}finally{h(!1)}}},N=b===`streaming`;return(0,Y.jsxs)(P,{className:`space-y-4`,children:[N&&(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300`,children:[(0,Y.jsx)(x,{label:n(`practice.flashcards.generating`)}),` `,n(`practice.flashcards.writing`)]}),(0,Y.jsx)(T,{variant:`danger`,size:`sm`,onClick:w,children:n(`practice.flashcards.stop`)})]}),(f||S)&&(0,Y.jsx)(A,{error:f||S,onDismiss:()=>p(null)}),g!==null&&!N&&(0,Y.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:n(`practice.flashcards.added`,{count:g,cardWord:n(`common.card`,{count:g})})}),!o&&!N&&(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:n(`practice.flashcards.intro`)}),o&&!N&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[l>0&&(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:n(`practice.flashcards.skipped`,{count:l,cardWord:n(`common.card`,{count:l})})}),o.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.flashcards.alreadyInDeck`)}):o.map(e=>(0,Y.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-neutral-200 p-3 dark:border-neutral-800`,children:[(0,Y.jsx)(M,{label:n(`practice.flashcards.front`),name:`front-${e.key}`,value:e.front,onChange:t=>D(e.key,{front:t.target.value})}),(0,Y.jsx)(M,{label:n(`practice.flashcards.back`),name:`back-${e.key}`,value:e.back,onChange:t=>D(e.key,{back:t.target.value})}),(0,Y.jsx)(`div`,{className:`flex justify-end`,children:(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,onClick:()=>k(e.key),children:n(`practice.flashcards.delete`)})})]},e.key))]}),!N&&(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[o&&o.length>0&&(0,Y.jsx)(T,{onClick:j,disabled:m,children:m?n(`common.saving`):n(`practice.flashcards.save`,{count:o.length,cardWord:n(`common.card`,{count:o.length})})}),(0,Y.jsx)(T,{variant:o?`secondary`:`primary`,onClick:E,children:n(o?`practice.flashcards.generateAgain`:`practice.flashcards.generate`)})]})]})}function Be(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Ve({lesson:e,course:t}){let n=d(),[r,i]=(0,J.useState)([]),a=(0,J.useCallback)(()=>E(e.id).then(i).catch(()=>{}),[e.id]);(0,J.useEffect)(()=>{let t=!0,n=()=>E(e.id).then(e=>t&&i(e)).catch(()=>{});n();let r=b(e=>{(e.table===`quiz_attempts`||e.table===`*`)&&n()});return()=>{t=!1,r()}},[e.id]);let o=[...r].reverse();return(0,Y.jsxs)(`div`,{className:`space-y-6`,children:[(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.quiz.title`)}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.quiz.subtitle`)})]}),(0,Y.jsx)(Le,{lesson:e,course:t,onAttemptSaved:a})]}),(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.flashcards.title`)}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.flashcards.subtitle`)})]}),(0,Y.jsx)(ze,{lesson:e,course:t})]}),(0,Y.jsxs)(`section`,{className:`space-y-3`,children:[(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:n(`practice.past.title`)}),o.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`practice.past.empty`)}):(0,Y.jsx)(P,{className:`divide-y divide-neutral-200 p-0 dark:divide-neutral-800`,children:o.map(e=>(0,Y.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 text-sm`,children:[(0,Y.jsx)(`span`,{className:`text-neutral-500`,children:Be(e.created_at)}),(0,Y.jsxs)(`span`,{className:`font-medium`,children:[e.score??`—`,` / `,e.total??`—`]})]},e.id))})]})]})}var X=[`debit`,`credit`];function Z(){return{account:``,amount:``}}function He(){return{rows:{debit:[Z()],credit:[Z()]},status:`idle`,invalid:[],result:null,hintLevel:0}}function Ue(e,t){let n=Math.max(0,Number(t)||0);return Math.min(n,Math.max(0,Number(e)||0)+1)}function We(e,t){return!X.includes(t)||e[t].length>=6?e:{...e,[t]:[...e[t],Z()]}}function Ge(e,t,n){return!X.includes(t)||e[t].length<=1?e:{...e,[t]:e[t].filter((e,t)=>t!==n)}}function Ke(e,t,n,r){return!X.includes(t)||!e[t]?.[n]?e:{...e,[t]:e[t].map((e,t)=>t===n?{...e,...r}:e)}}function qe(e){let t=String(e??``).trim();if(!/^\d+$/.test(t))return NaN;let n=Number(t);return Number.isSafeInteger(n)?n:NaN}function Je(e){let t=t=>(e[t]||[]).filter(e=>String(e.account??``).trim()!==``||String(e.amount??``).trim()!==``).map(e=>({account:String(e.account??``).trim(),amount:qe(e.amount)}));return{debit:t(`debit`),credit:t(`credit`)}}function Ye(e,t){let n=new Set((e.accounts||[]).map(e=>e.name)),r=[];for(let e of X)(t[e]||[]).forEach((t,i)=>{t.account?n.has(t.account)||r.push({side:e,index:i,code:`unknown_account`}):r.push({side:e,index:i,code:`missing_account`}),(!Number.isInteger(t.amount)||t.amount<=0)&&r.push({side:e,index:i,code:`invalid_amount`})});return X.every(e=>(t[e]||[]).length===0)&&r.length===0&&r.push({side:`debit`,index:-1,code:`nothing_entered`}),r}function Xe(e){let t=new Map;for(let n of e){let e=`${n.side}|${n.account}|${n.amount}`;t.set(e,(t.get(e)||0)+1)}return t}function Ze(e){let t=new Map;for(let n of X)for(let r of e.answer[n]||[]){let e=`${n}|${r.account}`;t.has(e)||t.set(e,new Set),t.get(e).add(r.amount)}return t}function Qe(e,t){let n={debit:(t.debit||[]).reduce((e,t)=>e+t.amount,0),credit:(t.credit||[]).reduce((e,t)=>e+t.amount,0)},r=n.debit===n.credit,i=X.flatMap(e=>(t[e]||[]).map((t,n)=>({...t,side:e,index:n}))),a=Xe(X.flatMap(t=>(e.answer[t]||[]).map(e=>({...e,side:t})))),o=[];for(let e of i){let t=`${e.side}|${e.account}|${e.amount}`,n=a.get(t)||0;n>0?a.set(t,n-1):o.push(e)}let s=[];for(let[e,t]of a)t>0&&s.push(e);let c=Ze(e),l=[];for(let e of o){let t=c.get(`${e.side}|${e.account}`),n=c.get(`${e.side===`debit`?`credit`:`debit`}|${e.account}`),r=`account_not_right`;t?.has(e.amount)?r=`extra_row`:t?.size?r=`amount_wrong`:n?.size&&(r=`wrong_side`),l.push({side:e.side,index:e.index,code:r})}let u={debit:0,credit:0};for(let e of s){let[t]=e.split(`|`);u[t]+=1}let d={debit:null,credit:null};for(let e of X){let n=l.some(t=>t.side===e);u[e]>0&&!n&&(d[e]=(t[e]||[]).length===0?`nothing_entered`:`needs_more_rows`)}let f=[],p=e=>{e&&!f.includes(e)&&f.push(e)};for(let e of l)p(e.code);for(let e of X)p(d[e]);return r||p(`unbalanced`),{correct:r&&o.length===0&&s.length===0,balanced:r,totals:n,issues:l,sideIssues:d,codes:f}}function Q(e,t){let n=Je(t),r=Ye(e,n);return r.length?{submission:n,invalid:r,result:null}:{submission:n,invalid:[],result:Qe(e,n)}}function $e(e,t){switch(t.type){case`set-account`:return{...e,rows:Ke(e.rows,t.side,t.index,{account:t.account}),status:`idle`,invalid:[],result:null};case`set-amount`:return{...e,rows:Ke(e.rows,t.side,t.index,{amount:t.amount}),status:`idle`,invalid:[],result:null};case`add-row`:return{...e,rows:We(e.rows,t.side),status:`idle`,invalid:[],result:null};case`remove-row`:return{...e,rows:Ge(e.rows,t.side,t.index),status:`idle`,invalid:[],result:null};case`check`:{let n=t.outcome||Q(t.spec,e.rows);return n.invalid.length?{...e,status:`invalid`,invalid:n.invalid,result:null}:{...e,status:n.result.correct?`correct`:`incorrect`,invalid:[],result:n.result}}case`hint`:return{...e,hintLevel:Ue(e.hintLevel,t.count)};case`reset`:return{...He(),hintLevel:e.hintLevel};default:return e}}function et(e){let t=String(e||``);return t.length>=16?t.slice(11,16):``}function tt({attempts:e=[]}){let t=d(),n=Array.isArray(e)?e:[],r=n.slice(-5).reverse();return(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:t(`exercises.journal.history.title`)}),r.length===0?(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:t(`exercises.journal.history.empty`)}):(0,Y.jsx)(`ul`,{className:`space-y-1 text-xs text-neutral-600 dark:text-neutral-300`,children:r.map((e,r)=>{let i=n.length-r,a=t(e.correct?`exercises.journal.history.correct`:`exercises.journal.history.incorrect`);return(0,Y.jsx)(`li`,{children:t(`exercises.journal.history.entry`,{n:i,status:a,time:et(e.created_at)})},e.id||i)})})]})}var nt=[`debit`,`credit`],rt=`w-full rounded-lg border border-neutral-300 bg-white px-2 py-1.5 text-sm text-neutral-900 placeholder:text-neutral-400 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100`;function it({side:e,index:t,row:n,accounts:r,disabled:i,t:a,onChange:o,onRemove:s}){let c=`je-${e}-${t}-account`,l=`je-${e}-${t}-amount`;return(0,Y.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Y.jsx)(`label`,{htmlFor:c,className:`sr-only`,children:a(`exercises.journal.account`)}),(0,Y.jsxs)(`select`,{id:c,className:`${rt} min-w-0 flex-1`,value:n.account,disabled:i,onChange:e=>o({account:e.target.value}),children:[(0,Y.jsx)(`option`,{value:``,children:a(`exercises.journal.accountPlaceholder`)}),r.map(e=>(0,Y.jsxs)(`option`,{value:e.name,children:[e.name,` — `,e.gloss]},e.name))]}),(0,Y.jsx)(`label`,{htmlFor:l,className:`sr-only`,children:a(`exercises.journal.amount`)}),(0,Y.jsx)(`input`,{id:l,className:`${rt} w-28`,type:`number`,inputMode:`numeric`,min:`1`,step:`1`,placeholder:a(`exercises.journal.amountPlaceholder`),value:n.amount,disabled:i,onChange:e=>o({amount:e.target.value})}),(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,className:`px-2`,"aria-label":a(`exercises.journal.removeRow`,{n:t+1}),disabled:i,onClick:s,children:`×`})]})}function at(e,t){if(!e)return[];let n=[];for(let r of e.codes||[]){if(r===`unbalanced`){n.push({key:r,text:t(`exercises.journal.issue.unbalanced`)});continue}if(r===`needs_more_rows`||r===`nothing_entered`){let i=nt.find(t=>e.sideIssues?.[t]===r)||`debit`;n.push({key:r,text:t(`exercises.journal.issue.${r}`,{side:t(`exercises.journal.side.${i}`)})});continue}let i=(e.issues||[]).find(e=>e.code===r)||{},a=i.side||`debit`;n.push({key:r,text:t(`exercises.journal.issue.${r}`,{n:(i.index??0)+1,side:t(`exercises.journal.side.${a}`)})})}return n}function ot(e,t){let n=new Set,r=[];for(let i of e||[]){let e=`${i.code}:${i.side}:${i.index}`;n.has(e)||(n.add(e),r.push({key:e,text:t(`exercises.journal.issue.${i.code}`,{n:i.index+1,side:t(`exercises.journal.side.${i.side}`)})}))}return r}function st({exercise:e,lesson:t}){let n=d(),r=(0,J.useMemo)(()=>Ce(e?.spec),[e?.spec]),[i,a]=(0,J.useReducer)($e,void 0,He),[o,s]=(0,J.useState)([]),[c,l]=(0,J.useState)(!1),[u,f]=(0,J.useState)(!1);if((0,J.useEffect)(()=>{if(!e?.id)return;let t=!0;return N(e.id).then(e=>{t&&s(e)}).catch(()=>{}),()=>{t=!1}},[e?.id]),!r)return null;let p=i.status===`correct`||i.status===`incorrect`,m=i.status===`correct`,h=async()=>{if(c||m)return;let n=Q(r,i.rows);if(a({type:`check`,spec:r,outcome:n}),!n.invalid.length){l(!0),f(!1);try{await z(e.id,{courseId:t?.course_id??null,lessonId:t?.id??null,rows:n.submission,result:n.result}),s(await N(e.id))}catch{f(!0)}finally{l(!1)}}},g=p?at(i.result,n):ot(i.invalid,n);return(0,Y.jsxs)(P,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(k,{tone:`accent`,children:n(`exercises.journal.badge`)}),(0,Y.jsx)(`p`,{className:`font-medium`,children:r.prompt}),(0,Y.jsx)(`p`,{className:`text-sm text-neutral-600 dark:text-neutral-300`,children:r.promptGloss})]}),(0,Y.jsx)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:nt.map(e=>(0,Y.jsxs)(`div`,{className:`space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:n(`exercises.journal.${e}`)}),(0,Y.jsx)(T,{variant:`ghost`,size:`sm`,disabled:i.rows[e].length>=6||m,onClick:()=>a({type:`add-row`,side:e}),children:n(`exercises.journal.addRow`)})]}),(0,Y.jsx)(`div`,{className:`space-y-2`,children:i.rows[e].map((t,i)=>(0,Y.jsx)(it,{side:e,index:i,row:t,accounts:r.accounts,disabled:m,t:n,onChange:t=>a({type:t.account===void 0?`set-amount`:`set-account`,side:e,index:i,...t}),onRemove:()=>a({type:`remove-row`,side:e,index:i})},`${e}-${i}`))})]},e))}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Y.jsx)(T,{onClick:h,disabled:c||m,children:n(c?`exercises.journal.checking`:`exercises.journal.check`)}),(0,Y.jsx)(T,{variant:`secondary`,onClick:()=>a({type:`reset`}),disabled:c,children:n(`exercises.journal.reset`)}),(0,Y.jsx)(T,{variant:`ghost`,onClick:()=>a({type:`hint`,count:r.hints.length}),disabled:i.hintLevel>=r.hints.length,children:i.hintLevel>=r.hints.length?n(`exercises.journal.hintExhausted`):n(`exercises.journal.hintNext`,{n:i.hintLevel+1,total:r.hints.length})})]}),i.hintLevel>0&&(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`h4`,{className:`text-sm font-semibold`,children:n(`exercises.journal.hintsTitle`)}),(0,Y.jsx)(`ol`,{className:`space-y-1 text-sm text-neutral-700 dark:text-neutral-300`,children:r.hints.slice(0,i.hintLevel).map((e,t)=>(0,Y.jsxs)(`li`,{children:[t+1,`. `,e]},`hint-${t}`))})]}),i.status===`invalid`&&g.length>0&&(0,Y.jsxs)(`div`,{className:`space-y-1`,role:`status`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium text-amber-700 dark:text-amber-300`,children:n(`exercises.journal.invalid`)}),(0,Y.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm text-neutral-700 dark:text-neutral-300`,children:g.map(e=>(0,Y.jsx)(`li`,{children:e.text},e.key))})]}),i.status===`incorrect`&&(0,Y.jsxs)(`div`,{className:`space-y-1`,role:`status`,children:[(0,Y.jsx)(`p`,{className:`text-sm font-medium text-neutral-800 dark:text-neutral-100`,children:n(`exercises.journal.incorrect`)}),(0,Y.jsx)(`p`,{className:`text-xs text-neutral-500`,children:n(`exercises.journal.totals`,{debit:i.result.totals.debit,credit:i.result.totals.credit})}),(0,Y.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm text-neutral-700 dark:text-neutral-300`,children:g.map(e=>(0,Y.jsx)(`li`,{children:e.text},e.key))})]}),i.status===`correct`&&(0,Y.jsx)(`p`,{className:`text-sm font-medium text-green-700 dark:text-green-300`,role:`status`,children:n(`exercises.journal.correct`)}),u&&(0,Y.jsx)(`p`,{className:`text-sm text-amber-700 dark:text-amber-300`,role:`alert`,children:n(`exercises.journal.saveFailed`)}),(0,Y.jsx)(tt,{attempts:o})]})}var $=Object.freeze({"journal-entry":Object.freeze({Component:st,grade:Qe})});function ct(e){return $[e]||null}Object.freeze(Object.keys($));function lt({provided:e,fetched:t}={}){return(Array.isArray(e)?e:Array.isArray(t)?t:[]).filter(we)}function ut({lesson:e,course:t,exercises:n}){let r=d(),i=Array.isArray(n),[a,o]=(0,J.useState)([]),[s,c]=(0,J.useState)(i);(0,J.useEffect)(()=>{if(i||!e?.id)return;let t=!0;return L(e.id).then(e=>{t&&(o(e),c(!0))}).catch(()=>{t&&(o([]),c(!0))}),()=>{t=!1}},[i,e?.id]);let l=lt({provided:i?n:void 0,fetched:a});return s?l.length===0?(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:r(`exercises.surface.empty`)}):(0,Y.jsxs)(`div`,{className:`space-y-4`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-lg font-semibold`,children:r(`exercises.surface.title`)}),(0,Y.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:r(`exercises.surface.description`)})]}),l.map(n=>{let r=ct(n.type);if(!r)return null;let{Component:i}=r;return(0,Y.jsx)(i,{exercise:n,lesson:e,course:t},n.id)})]}):(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:r(`common.loading`)})}var dt=(0,J.lazy)(()=>h(()=>import(`./CodeWorkspace-BNrL4qvR.js`).then(e=>({default:e.CodeWorkspace})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url)),ft={done:`success`,active:`accent`,todo:`neutral`};function pt({lesson:e,onClose:t,onSaved:n}){let r=d(),[i,a]=(0,J.useState)(``),[o,s]=(0,J.useState)(3),[c,l]=(0,J.useState)(!1);return(0,Y.jsx)(`div`,{className:`fixed inset-0 z-30 grid place-items-center bg-black/40 p-4`,role:`dialog`,"aria-modal":`true`,"aria-label":r(`reflection.aria`),children:(0,Y.jsxs)(P,{className:`w-full max-w-md space-y-4`,children:[(0,Y.jsx)(`h2`,{className:`font-semibold`,children:r(`reflection.title`,{title:e.title})}),(0,Y.jsx)(C,{label:r(`reflection.hardest`),name:`hardest`,rows:3,value:i,onChange:e=>a(e.target.value),placeholder:r(`reflection.hardestPlaceholder`)}),(0,Y.jsx)(I,{label:r(`reflection.confidence`),name:`confidence`,value:o,onChange:e=>s(Number(e.target.value)),children:[1,2,3,4,5].map(e=>(0,Y.jsxs)(`option`,{value:e,children:[e,` — `,r(`reflection.confidenceLabels.${e}`)]},e))}),(0,Y.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Y.jsx)(T,{variant:`ghost`,onClick:t,children:r(`reflection.cancel`)}),(0,Y.jsx)(T,{onClick:async()=>{l(!0),await S(e.id,{hardest:i,confidence:o}),await B(e.id,{status:`done`}),await O(`lesson_done`,e.id),l(!1),n()},disabled:c,children:r(c?`reflection.saving`:`reflection.markDone`)})]})]})})}function mt({id:e,lessonId:t}){let n=d(),[r,i]=(0,J.useState)(null),[a,o]=(0,J.useState)(!1),[s,c]=(0,J.useState)(`practice`),[u,f]=(0,J.useState)(!1),[p,h]=(0,J.useState)(!1),[v,y]=(0,J.useState)([]);(0,J.useEffect)(()=>{let t=!0,n=()=>_(e).then(e=>t&&i(e)).finally(()=>t&&o(!0));n();let r=b(e=>{(e.table===`lessons`||e.table===`lesson_versions`||e.table===`*`)&&n()});return()=>{t=!1,r()}},[e]);let x=r?.lessons.find(e=>e.id===t)||null;if((0,J.useEffect)(()=>{let e=!0;if(!x?.id)return y([]),()=>{e=!1};y([]);let t=()=>L(x.id).then(t=>e&&y(t)).catch(()=>e&&y([]));t();let n=b(e=>{(e.table===`exercises`||e.table===`*`)&&t()});return()=>{e=!1,n()}},[x?.id]),(0,J.useEffect)(()=>{x&&x.status===`todo`&&B(x.id,{status:`active`})},[x?.id,x?.status]),(0,J.useEffect)(()=>{let e=!0;return!r||r.status===`completed`||!Se(r)?(h(!1),()=>{e=!1}):((async()=>{let t=await l(r.id).catch(()=>null),n=t?await g(t.id).catch(()=>null):null;e&&h(!!t&&n?.verdict!==`course_complete`)})(),()=>{e=!1})},[r]),!a)return(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`common.loading`)});if(!r||!x)return(0,Y.jsx)(F,{title:n(`lesson.notFound`),action:(0,Y.jsx)(m,{to:`/course/${e}`,children:(0,Y.jsx)(T,{variant:`secondary`,children:n(`lesson.backToCourse`)})})});let S=De({kind:r.kind,exercises:v}),C=Oe(s,S);return(0,Y.jsxs)(`div`,{className:`space-y-5`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`nav`,{className:`text-xs text-neutral-500`,children:[(0,Y.jsx)(m,{to:`/`,className:`hover:underline`,children:n(`lesson.home`)}),` `,`/`,` `,(0,Y.jsx)(m,{to:`/course/${r.id}`,className:`hover:underline`,children:r.title}),` `,`/ `,n(`lesson.breadcrumb`,{n:x.position})]}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,Y.jsx)(`h1`,{className:`text-xl font-semibold`,children:x.title}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(k,{tone:ft[x.status],children:n(`lesson.status.${x.status}`)}),x.status!==`done`&&(0,Y.jsx)(T,{onClick:()=>f(!0),children:n(`lesson.markDone`)}),x.status===`done`&&(0,Y.jsx)(T,{variant:`secondary`,onClick:()=>f(!0),children:n(`lesson.revisit`)})]})]})]}),(0,Y.jsx)(je,{lesson:x,course:r}),(0,Y.jsx)(`div`,{className:`border-b border-neutral-200 dark:border-neutral-800`,children:(0,Y.jsx)(`div`,{className:`flex gap-1`,children:[{id:`practice`,label:n(`lesson.tabs.practice`)},{id:`tutor`,label:n(`lesson.tabs.tutor`)},...S?[{id:`workspace`,label:n(S===`exercise`?`lesson.tabs.exercise`:`lesson.tabs.workspace`)}]:[]].map(e=>(0,Y.jsx)(`button`,{type:`button`,onClick:()=>c(e.id),className:`border-b-2 px-3 py-2 text-sm font-medium ${C===e.id?`border-indigo-500 text-indigo-600 dark:text-indigo-400`:`border-transparent text-neutral-500 hover:text-neutral-800 dark:hover:text-neutral-200`}`,children:e.label},e.id))})}),C===`practice`&&(0,Y.jsx)(Ve,{lesson:x,course:r}),C===`tutor`&&(0,Y.jsx)(_e,{lesson:x,course:r,capstone:p}),C===`workspace`&&S===`exercise`&&(0,Y.jsx)(ut,{lesson:x,course:r,exercises:v}),C===`workspace`&&S===`code`&&(0,Y.jsx)(J.Suspense,{fallback:(0,Y.jsx)(`p`,{className:`text-sm text-neutral-500`,children:n(`lesson.loadingWorkspace`)}),children:(0,Y.jsx)(dt,{lesson:x,course:r})}),u&&(0,Y.jsx)(pt,{lesson:x,onClose:()=>f(!1),onSaved:()=>{f(!1),V(`/course/${r.id}`)}})]})}export{mt as Lesson};
@@ -1,4 +1,4 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{f as n}from"./settings-DhwuyNPU.js";import{d as r,u as i}from"./errors-BZa_CNHL.js";import{Dt as a,H as o,J as s,Lt as ee,Ot as te,Rt as ne,V as c,Y as l,_ as re,a as u,d,f,g as p,i as m,kt as ie,l as h,ot as g,p as _,u as v,ut as y,y as ae,z as b,zt as x}from"./index-DioXTZVc.js";import{C as oe,S as se,d as ce,n as le}from"./capstone-Amn6Hztq.js";import{t as ue}from"./useStream-rdsR6A7P.js";var S=e(t(),1),C={title:`Một file kiểm thử E2E Playwright cho quy trình thật của bạn`,deliverable:`Một file spec trong chính dự án của bạn phủ đúng một quy trình người dùng thật, kèm đầu ra của một lần chạy Chromium xanh.`,definitionOfDone:[`Một file spec đã commit trong dự án của bạn.`,`Chạy xanh khi chạy một mình và khi chạy cả bộ.`,`Không có waitForTimeout, force: true hay click theo toạ độ.`,`Có ít nhất một locator ngữ nghĩa và một assertion web-first.`,`Dán kèm đầu ra reporter của một lần chạy Chromium với 0 lỗi.`,`Một đoạn giải thích ngắn về locator, cách chờ và tính cô lập.`]},w={title:`Viết bài kiểm thử E2E Playwright đáng tin đầu tiên cho một quy trình web thật`,description:`Khoá học năm bài để bạn tự viết một file spec trong chính dự án của mình cho một quy trình người dùng thật, và tự chạy nó trên Chromium tới khi xanh.`,level:`Intermediate`,kind:`programming`,goal:`Tự viết và tự chạy một bài kiểm thử E2E Playwright đáng tin cho một quy trình thật trong ứng dụng của bạn.`,topics:[`playwright`,`kiểm thử e2e`,`tự động hoá kiểm thử`],language:`vi`,artifact:C,preflight:[{id:`own_app`,label:`Tôi có một ứng dụng web chạy được trên máy (hoặc một URL đã deploy) với ít nhất một quy trình thật.`},{id:`node`,label:"Node đã cài — chạy `node -v` và thấy một số phiên bản."},{id:`playwright`,label:"Playwright đã cài và chạy được — `npx playwright --version` in ra một phiên bản."},{id:`chromium`,label:"Trình duyệt Chromium đã cài — `npx playwright install chromium`."},{id:`no_execution`,label:`Tôi hiểu Studio không bao giờ chạy Playwright: tôi tự chạy trong terminal của mình và dán kết quả lại.`}],capstone:{kind:`programming`,brief_md:`# 🏗️ Capstone: Bài kiểm thử E2E đầu tiên của bạn
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{f as n}from"./settings-DhwuyNPU.js";import{d as r,u as i}from"./errors-BZa_CNHL.js";import{Dt as a,H as o,J as s,Lt as ee,Ot as te,Rt as ne,V as c,Y as l,_ as re,a as u,d,f,g as p,i as m,kt as ie,l as h,ot as g,p as _,u as v,ut as y,y as ae,z as b,zt as x}from"./index-CS8XPYbB.js";import{C as oe,S as se,d as ce,n as le}from"./capstone-DhwBeNqk.js";import{t as ue}from"./useStream-rdsR6A7P.js";var S=e(t(),1),C={title:`Một file kiểm thử E2E Playwright cho quy trình thật của bạn`,deliverable:`Một file spec trong chính dự án của bạn phủ đúng một quy trình người dùng thật, kèm đầu ra của một lần chạy Chromium xanh.`,definitionOfDone:[`Một file spec đã commit trong dự án của bạn.`,`Chạy xanh khi chạy một mình và khi chạy cả bộ.`,`Không có waitForTimeout, force: true hay click theo toạ độ.`,`Có ít nhất một locator ngữ nghĩa và một assertion web-first.`,`Dán kèm đầu ra reporter của một lần chạy Chromium với 0 lỗi.`,`Một đoạn giải thích ngắn về locator, cách chờ và tính cô lập.`]},w={title:`Viết bài kiểm thử E2E Playwright đáng tin đầu tiên cho một quy trình web thật`,description:`Khoá học năm bài để bạn tự viết một file spec trong chính dự án của mình cho một quy trình người dùng thật, và tự chạy nó trên Chromium tới khi xanh.`,level:`Intermediate`,kind:`programming`,goal:`Tự viết và tự chạy một bài kiểm thử E2E Playwright đáng tin cho một quy trình thật trong ứng dụng của bạn.`,topics:[`playwright`,`kiểm thử e2e`,`tự động hoá kiểm thử`],language:`vi`,artifact:C,preflight:[{id:`own_app`,label:`Tôi có một ứng dụng web chạy được trên máy (hoặc một URL đã deploy) với ít nhất một quy trình thật.`},{id:`node`,label:"Node đã cài — chạy `node -v` và thấy một số phiên bản."},{id:`playwright`,label:"Playwright đã cài và chạy được — `npx playwright --version` in ra một phiên bản."},{id:`chromium`,label:"Trình duyệt Chromium đã cài — `npx playwright install chromium`."},{id:`no_execution`,label:`Tôi hiểu Studio không bao giờ chạy Playwright: tôi tự chạy trong terminal của mình và dán kết quả lại.`}],capstone:{kind:`programming`,brief_md:`# 🏗️ Capstone: Bài kiểm thử E2E đầu tiên của bạn
2
2
 
3
3
  **Nộp sản phẩm của bạn.** Đây không phải bài thi — bạn đang tạo ra một thứ thật, chạy được, dùng
4
4
  được trong chính dự án của mình.
@@ -1 +1 @@
1
- import{g as e}from"./index-DioXTZVc.js";var t=e();function n({value:e=0,className:n=``,label:r}){let i=Math.max(0,Math.min(100,Math.round(e)));return(0,t.jsx)(`div`,{className:n,children:(0,t.jsx)(`div`,{role:`progressbar`,"aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":100,"aria-label":r,className:`h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-800`,children:(0,t.jsx)(`div`,{className:`h-full rounded-full bg-indigo-600 transition-[width] dark:bg-indigo-500`,style:{width:`${i}%`}})})})}export{n as t};
1
+ import{g as e}from"./index-CS8XPYbB.js";var t=e();function n({value:e=0,className:n=``,label:r}){let i=Math.max(0,Math.min(100,Math.round(e)));return(0,t.jsx)(`div`,{className:n,children:(0,t.jsx)(`div`,{role:`progressbar`,"aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":100,"aria-label":r,className:`h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-800`,children:(0,t.jsx)(`div`,{className:`h-full rounded-full bg-indigo-600 transition-[width] dark:bg-indigo-500`,style:{width:`${i}%`}})})})}export{n as t};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{$ as n,Lt as r,Rt as i,f as a,g as o,gt as s,h as c,i as l,p as u,st as d,t as f}from"./index-DioXTZVc.js";import{r as p}from"./card-store-BrbrtX9w.js";var m=e(t(),1),h=o(),g=[{grade:0,key:`again`,labelKey:`practice.review.again`,hint:`1`,tone:`danger`},{grade:1,key:`hard`,labelKey:`practice.review.hard`,hint:`2`,tone:`secondary`},{grade:2,key:`good`,labelKey:`practice.review.good`,hint:`3`,tone:`primary`},{grade:3,key:`easy`,labelKey:`practice.review.easy`,hint:`4`,tone:`secondary`}],_={again:0,hard:0,good:0,easy:0};function v(e){return e?new Date(e).toLocaleString(void 0,{weekday:`short`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}):null}function y(){let e=r(),[t,o]=(0,m.useState)(null),[y,b]=(0,m.useState)(null),[x,S]=(0,m.useState)(0),[C,w]=(0,m.useState)(!1),[T,E]=(0,m.useState)(_),[D,O]=(0,m.useState)(null),[k,A]=(0,m.useState)(!1),j=(0,m.useRef)(!1),M=(0,m.useCallback)(async()=>{O(null);try{let[e,t]=await Promise.all([d(),p()]);o(e),b(t),S(0),w(!1),E(_),j.current=!1}catch(e){O(e),o([])}},[]);(0,m.useEffect)(()=>{M()},[M]);let N=(0,m.useCallback)(async e=>{let r=t?.[x];if(r&&C&&!k){A(!0),O(null);try{await n(r.id,e),j.current||(j.current=!0,await s(`review`,r.id));let t=g.find(t=>t.grade===e).key;E(e=>({...e,[t]:e[t]+1})),w(!1),S(e=>e+1)}catch(e){O(e)}finally{A(!1)}}},[t,x,C,k]);if((0,m.useEffect)(()=>{let e=e=>{if(e.target&&/^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName))return;if(e.key===` `||e.code===`Space`){e.preventDefault(),w(e=>!e);return}let t=g.find(t=>t.hint===e.key);t&&N(t.grade)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[N]),t===null)return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),(0,h.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`practice.review.loading`)})]});let P=t.length,F=t[x],I=x>=P;if(P===0){let t=v(y);return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsx)(f,{title:e(`practice.review.allCaughtUp`),description:t?e(`practice.review.nextCard`,{date:t}):e(`practice.review.noCards`),action:(0,h.jsx)(i,{to:`/`,children:(0,h.jsx)(a,{variant:`secondary`,children:e(`practice.review.backToCourses`)})})})]})}if(I){let t=P;return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsxs)(u,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`p`,{className:`font-semibold`,children:e(`practice.review.sessionComplete`)}),(0,h.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`practice.review.reviewed`,{count:t,cardWord:e(`common.card`,{count:t})})})]}),(0,h.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:g.map(t=>(0,h.jsxs)(c,{tone:T[t.key]?`accent`:`neutral`,children:[e(t.labelKey),`: `,T[t.key]]},t.key))}),(0,h.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,h.jsx)(a,{onClick:M,children:e(`practice.review.checkForMore`)}),(0,h.jsx)(i,{to:`/`,children:(0,h.jsx)(a,{variant:`secondary`,children:e(`practice.review.backToCourses`)})})]})]})]})}return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),(0,h.jsx)(`span`,{className:`text-sm text-neutral-500`,children:e(`practice.review.cardOf`,{n:x+1,total:P})})]}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsxs)(u,{as:`button`,type:`button`,onClick:()=>w(e=>!e),className:`flex min-h-48 w-full cursor-pointer flex-col items-center justify-center gap-4 text-center`,children:[(0,h.jsx)(`p`,{className:`text-xs uppercase tracking-wide text-neutral-400`,children:e(C?`practice.review.answer`:`practice.review.question`)}),(0,h.jsx)(`p`,{className:`text-lg font-medium text-neutral-900 dark:text-neutral-100`,children:F.front}),C?(0,h.jsx)(`p`,{className:`text-base text-neutral-700 dark:text-neutral-300`,children:F.back}):(0,h.jsx)(`p`,{className:`text-sm text-neutral-400`,children:e(`practice.review.tapFlip`)})]}),C?(0,h.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-4`,children:g.map(t=>(0,h.jsxs)(a,{variant:t.tone,onClick:()=>N(t.grade),disabled:k,children:[e(t.labelKey),(0,h.jsx)(`span`,{className:`ml-1 text-xs opacity-60`,children:t.hint})]},t.key))}):(0,h.jsx)(`p`,{className:`text-center text-sm text-neutral-500`,children:e(`practice.review.gradeAfter`)})]})}export{y as Review};
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{$ as n,Lt as r,Rt as i,f as a,g as o,gt as s,h as c,i as l,p as u,st as d,t as f}from"./index-CS8XPYbB.js";import{r as p}from"./card-store-CVMBc-Pv.js";var m=e(t(),1),h=o(),g=[{grade:0,key:`again`,labelKey:`practice.review.again`,hint:`1`,tone:`danger`},{grade:1,key:`hard`,labelKey:`practice.review.hard`,hint:`2`,tone:`secondary`},{grade:2,key:`good`,labelKey:`practice.review.good`,hint:`3`,tone:`primary`},{grade:3,key:`easy`,labelKey:`practice.review.easy`,hint:`4`,tone:`secondary`}],_={again:0,hard:0,good:0,easy:0};function v(e){return e?new Date(e).toLocaleString(void 0,{weekday:`short`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}):null}function y(){let e=r(),[t,o]=(0,m.useState)(null),[y,b]=(0,m.useState)(null),[x,S]=(0,m.useState)(0),[C,w]=(0,m.useState)(!1),[T,E]=(0,m.useState)(_),[D,O]=(0,m.useState)(null),[k,A]=(0,m.useState)(!1),j=(0,m.useRef)(!1),M=(0,m.useCallback)(async()=>{O(null);try{let[e,t]=await Promise.all([d(),p()]);o(e),b(t),S(0),w(!1),E(_),j.current=!1}catch(e){O(e),o([])}},[]);(0,m.useEffect)(()=>{M()},[M]);let N=(0,m.useCallback)(async e=>{let r=t?.[x];if(r&&C&&!k){A(!0),O(null);try{await n(r.id,e),j.current||(j.current=!0,await s(`review`,r.id));let t=g.find(t=>t.grade===e).key;E(e=>({...e,[t]:e[t]+1})),w(!1),S(e=>e+1)}catch(e){O(e)}finally{A(!1)}}},[t,x,C,k]);if((0,m.useEffect)(()=>{let e=e=>{if(e.target&&/^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName))return;if(e.key===` `||e.code===`Space`){e.preventDefault(),w(e=>!e);return}let t=g.find(t=>t.hint===e.key);t&&N(t.grade)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[N]),t===null)return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),(0,h.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`practice.review.loading`)})]});let P=t.length,F=t[x],I=x>=P;if(P===0){let t=v(y);return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsx)(f,{title:e(`practice.review.allCaughtUp`),description:t?e(`practice.review.nextCard`,{date:t}):e(`practice.review.noCards`),action:(0,h.jsx)(i,{to:`/`,children:(0,h.jsx)(a,{variant:`secondary`,children:e(`practice.review.backToCourses`)})})})]})}if(I){let t=P;return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsxs)(u,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`p`,{className:`font-semibold`,children:e(`practice.review.sessionComplete`)}),(0,h.jsx)(`p`,{className:`text-sm text-neutral-500`,children:e(`practice.review.reviewed`,{count:t,cardWord:e(`common.card`,{count:t})})})]}),(0,h.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:g.map(t=>(0,h.jsxs)(c,{tone:T[t.key]?`accent`:`neutral`,children:[e(t.labelKey),`: `,T[t.key]]},t.key))}),(0,h.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,h.jsx)(a,{onClick:M,children:e(`practice.review.checkForMore`)}),(0,h.jsx)(i,{to:`/`,children:(0,h.jsx)(a,{variant:`secondary`,children:e(`practice.review.backToCourses`)})})]})]})]})}return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`practice.review.title`)}),(0,h.jsx)(`span`,{className:`text-sm text-neutral-500`,children:e(`practice.review.cardOf`,{n:x+1,total:P})})]}),D&&(0,h.jsx)(l,{error:D,onDismiss:()=>O(null)}),(0,h.jsxs)(u,{as:`button`,type:`button`,onClick:()=>w(e=>!e),className:`flex min-h-48 w-full cursor-pointer flex-col items-center justify-center gap-4 text-center`,children:[(0,h.jsx)(`p`,{className:`text-xs uppercase tracking-wide text-neutral-400`,children:e(C?`practice.review.answer`:`practice.review.question`)}),(0,h.jsx)(`p`,{className:`text-lg font-medium text-neutral-900 dark:text-neutral-100`,children:F.front}),C?(0,h.jsx)(`p`,{className:`text-base text-neutral-700 dark:text-neutral-300`,children:F.back}):(0,h.jsx)(`p`,{className:`text-sm text-neutral-400`,children:e(`practice.review.tapFlip`)})]}),C?(0,h.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-4`,children:g.map(t=>(0,h.jsxs)(a,{variant:t.tone,onClick:()=>N(t.grade),disabled:k,children:[e(t.labelKey),(0,h.jsx)(`span`,{className:`ml-1 text-xs opacity-60`,children:t.hint})]},t.key))}):(0,h.jsx)(`p`,{className:`text-center text-sm text-neutral-500`,children:e(`practice.review.gradeAfter`)})]})}export{y as Review};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{c as n,f as r}from"./settings-DhwuyNPU.js";import{d as i}from"./errors-BZa_CNHL.js";import{F as a,G as o,It as s,K as c,Lt as l,M as u,N as d,P as f,c as p,et as m,f as h,g,j as _,l as v,n as y,o as b,ot as x,p as S,r as C,s as w,u as T}from"./index-DioXTZVc.js";import{n as E,t as D}from"./course-export-DpaOTT3a.js";import{n as O}from"./BetaReportPanel-8NrDLiPm.js";var k=e(t(),1),A=g();async function j(){if(typeof navigator>`u`||!navigator.storage?.persisted)return{kind:`indexeddb`,persistent:!1};try{return{kind:`indexeddb`,persistent:await navigator.storage.persisted()||!1}}catch{return{kind:`indexeddb`,persistent:!1}}}function M({settings:e,update:t}){let n=l(),[r,i]=(0,k.useState)(null),[o,s]=(0,k.useState)(null),[m,g]=(0,k.useState)(null),[v,x]=(0,k.useState)(null),[C,T]=(0,k.useState)(!1),[E,D]=(0,k.useState)(``),[O,M]=(0,k.useState)(``),[N,P]=(0,k.useState)(null),F=_(e),I=e=>n(e===`sqlite`?`storage.sqlite`:`storage.browser`),L=e=>n(e?`data.kind.${e}`:`data.checking`),R=()=>{if(e.provider!==`bridge`&&t({provider:`bridge`}),typeof document>`u`)return;let n=document.getElementById(`local-agent`);n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({behavior:`smooth`,block:`start`})},z=e=>p(e?.code,n)||e?.message||String(e),B=(0,k.useCallback)(async()=>{let[t,n,r]=await Promise.all([f(e),c().catch(()=>null),j()]);i(t),g(n),s(F===`browser`&&n?.kind===`memory`?{kind:`memory`}:r)},[e,F]);(0,k.useEffect)(()=>{B()},[B]);let V=async t=>{D(``),M(``),T(!0);try{x(await d(t,{settings:e}))}catch(e){M(e?.message||String(e))}finally{T(!1)}};return(0,A.jsxs)(S,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`font-medium`,children:n(`storage.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:n(`storage.subtitle`)})]}),(0,A.jsx)(b,{value:F,onSelect:e=>{e!==F&&V(e)},disabled:C,sqliteStatus:r,browserStatus:o}),r?.reason===`not_paired`&&(0,A.jsxs)(`div`,{className:`rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100`,children:[(0,A.jsx)(`p`,{children:p(`not_paired`,n)}),(0,A.jsx)(`p`,{className:`mt-1`,children:w(`not_paired`,n)}),(0,A.jsx)(`button`,{type:`button`,onClick:R,className:`mt-2 text-xs underline`,children:n(`storage.openLocalAgent`)})]}),(0,A.jsxs)(`div`,{className:`rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800`,children:[(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:n(`storage.activeStore`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:m?L(m.kind):n(`data.checking`)})]}),m?.path&&(0,A.jsx)(`p`,{className:`mt-0.5 break-all text-xs text-neutral-500`,children:m.path}),F===`sqlite`&&r&&!r.available&&(0,A.jsxs)(`p`,{className:`mt-1 text-amber-700 dark:text-amber-300`,children:[n(`storage.serverDown`),` `,(0,A.jsx)(`code`,{children:`npx ronin-skillforce studio`}),n(`storage.serverDownAfter`)]})]}),N&&(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm dark:border-amber-500/30 dark:bg-amber-500/10`,children:[(0,A.jsx)(`span`,{children:n(`storage.oldCopyThere`,{from:I(N.from)})}),(0,A.jsx)(h,{size:`sm`,variant:`secondary`,onClick:async()=>{if(N&&(typeof window>`u`||window.confirm(n(`storage.removeOldConfirm`,{label:I(N.from)})))){T(!0),M(``);try{await a(N.from,{settings:e}),P(null),D(n(`storage.removedMessage`)),await B()}catch(e){M(e?.message||String(e))}finally{T(!1)}}},disabled:C,children:n(`storage.removeOld`)})]}),E&&(0,A.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:E}),O&&(0,A.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:O}),(0,A.jsx)(y,{plan:v,busy:C,error:O,allowWithoutCopy:!0,onConfirm:async()=>{if(!v)return;T(!0),M(``);let{from:r,to:i}=v;try{if(v.sourceUnavailable)t({storage:i});else{let t=await u(i,{settings:e,dump:v.dump});if(!t.switched){M(n(`app.storageBlocked.countMismatch`,{fields:t.mismatches.join(`, `)}));return}P({from:r,to:i}),D(n(`storage.movedMessage`,{count:t.imported,recordWord:n(`common.record`,{count:t.imported}),target:I(i)}))}v.sourceUnavailable&&(P({from:r,to:i}),D(n(`storage.switchedMessage`,{target:I(i)}))),x(null),await B()}catch(e){M(z(e))}finally{T(!1)}},onCancel:()=>x(null)})]})}function N(e){let t=e?.tables||{};return Object.values(t).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0)}function P(e){let t={};for(let[n,r]of Object.entries(e?.tables||{}))t[n]=Array.isArray(r)?r.length:0;return t}function F(){let e=l(),t=t=>e(t?`data.kind.${t}`:`data.checking`),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[u,d]=(0,k.useState)(``),[f,p]=(0,k.useState)(``),[g,_]=(0,k.useState)(``),[v,y]=(0,k.useState)(null),b=(0,k.useRef)(null),C=(0,k.useCallback)(async()=>{try{let e=await c();r(e)}catch{}try{a(await x())}catch{}},[]);(0,k.useEffect)(()=>(C().finally(()=>{}),()=>{}),[C]);let w=e=>{p(e),_(``)},T=e=>{_(e?.message||String(e)),p(``)},j=async()=>{d(`export`);try{let t=await o(),n=new Date().toISOString().slice(0,10);D(`professor-studio-backup-${n}.json`,JSON.stringify(t,null,2)),w(e(`data.backupExported`,{n:N(t)}))}catch(e){T(e)}finally{d(``)}},M=async t=>{let n=t.target.files?.[0];if(t.target.value=``,n){d(`restore`);try{let t=JSON.parse(await n.text()),r=await m(t);await C(),w(e(`data.restored`,{n:r?.imported??N(t),name:n.name}))}catch(e){T(e)}finally{d(``)}}},F=async()=>{d(`import`),y(null);try{let t=await s().exportAll(),n=P(t),r=N(t);if(r===0){w(e(`data.noBrowserData`));return}let i=await m(t),a=P(await o()),c=Object.keys(n).filter(e=>(a[e]||0)<n[e]);y({imported:i?.imported??r,total:r,mismatches:c}),await C(),c.length?T(Error(e(`data.importMismatch`,{fields:c.join(`, `)}))):w(e(`data.importedVerified`,{n:r}))}catch(e){T(e)}finally{d(``)}},I=async()=>{if(typeof window>`u`||window.confirm(e(`data.clearConfirm`)))try{await new Promise((e,t)=>{let n=indexedDB.deleteDatabase(`professor-studio`);n.onsuccess=()=>e(),n.onerror=()=>t(n.error),n.onblocked=()=>e()}),y(null),w(e(`data.cleared`))}catch(e){T(e)}},L=async t=>{d(`course:${t.id}`);try{let n=await E(t);w(e(`data.exported`,{name:n}))}catch(e){T(e)}finally{d(``)}},R=n?.kind===`remote`;return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(S,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`font-medium`,children:e(`data.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:e(`data.subtitle`)})]}),(0,A.jsxs)(`div`,{className:`rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800`,children:[(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:e(`data.storageLabel`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:n?t(n.kind):e(`data.checking`)})]}),n?.path&&(0,A.jsx)(`p`,{className:`mt-0.5 break-all text-xs text-neutral-500`,children:n.path}),(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:e(`data.persistentLabel`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:n?n.persistent?e(`data.granted`):e(`data.bestEffort`):`—`})]})]}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,A.jsx)(h,{onClick:j,disabled:u===`export`,children:e(`data.exportBackup`)}),(0,A.jsx)(h,{variant:`secondary`,onClick:()=>b.current?.click(),disabled:u===`restore`,children:e(`data.restoreBackup`)}),(0,A.jsx)(`input`,{ref:b,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:M})]}),(0,A.jsxs)(`div`,{className:`rounded-lg border border-neutral-200 p-3 dark:border-neutral-800`,children:[(0,A.jsx)(`p`,{className:`text-sm font-medium`,children:e(`data.moveTitle`)}),(0,A.jsx)(`p`,{className:`mt-1 text-xs text-neutral-500`,children:e(R?`data.moveRemote`:`data.moveLocal`)}),(0,A.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,A.jsx)(h,{size:`sm`,variant:`secondary`,onClick:F,disabled:!R||u===`import`,children:e(`data.importBrowser`)}),v&&(0,A.jsx)(h,{size:`sm`,variant:`ghost`,onClick:I,children:e(`data.clearBrowser`)})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`text-sm font-medium`,children:e(`data.exportCourseTitle`)}),(0,A.jsxs)(`p`,{className:`mt-1 text-xs text-neutral-500`,children:[e(`data.exportCourseBody`),` `,(0,A.jsx)(`code`,{children:`professor:*`}),` `,e(`data.exportCourseAfter`)]}),i.length===0?(0,A.jsx)(`p`,{className:`mt-2 text-xs text-neutral-500`,children:e(`data.noCourses`)}):(0,A.jsx)(`ul`,{className:`mt-2 space-y-1`,children:i.map(t=>(0,A.jsxs)(`li`,{className:`flex items-center justify-between gap-2 text-sm`,children:[(0,A.jsx)(`span`,{className:`truncate`,children:t.title}),(0,A.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>L(t),disabled:u===`course:${t.id}`,children:e(`data.exportCourse`)})]},t.id))})]}),f&&(0,A.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:f}),g&&(0,A.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:g})]}),(0,A.jsx)(O,{})]})}function I(e=``){let t=String(e||``).replace(/^#/,``),n=t.indexOf(`?`);return n!==-1&&new URLSearchParams(t.slice(n+1)).get(`report`)===`1`}function L(e=typeof document<`u`?document:null){let t=e?.getElementById?.(`beta-report`);return!t||typeof t.scrollIntoView!=`function`?!1:(t.scrollIntoView({behavior:`smooth`,block:`start`}),!0)}function R(){let e=l(),[t,a]=r();return(0,k.useEffect)(()=>{typeof window<`u`&&I(window.location.hash)&&L()},[]),(0,A.jsxs)(`div`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`settings.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:e(`settings.subtitle`)})]}),(0,A.jsxs)(`section`,{id:`local-agent`,className:`scroll-mt-6 space-y-3`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.aiSource`)}),(0,A.jsx)(C,{settings:t,update:a}),(0,A.jsx)(`div`,{children:(0,A.jsx)(h,{variant:`danger`,size:`sm`,onClick:n,children:e(`settings.clearKeys`)})})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.learner`)}),(0,A.jsxs)(S,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,A.jsx)(v,{label:e(`settings.name`),name:`learnerName`,value:t.learnerName,onChange:e=>a({learnerName:e.target.value}),placeholder:e(`settings.namePlaceholder`)}),(0,A.jsx)(T,{label:e(`settings.learningLanguage`),name:`language`,hint:e(`settings.languageHint`),value:t.language,onChange:e=>a({language:e.target.value}),children:i().map(e=>(0,A.jsx)(`option`,{value:e.code,children:e.name},e.code))})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.storage`)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>L(),className:`text-xs text-neutral-500 underline hover:text-neutral-900 dark:hover:text-white`,children:e(`betaReport.jump`)})]}),(0,A.jsx)(M,{settings:t,update:a}),(0,A.jsx)(F,{})]})]})}export{R as Settings};
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{t}from"./react-B8SKf8RM.js";import{c as n,f as r}from"./settings-DhwuyNPU.js";import{d as i}from"./errors-BZa_CNHL.js";import{F as a,G as o,It as s,K as c,Lt as l,M as u,N as d,P as f,c as p,et as m,f as h,g,j as _,l as v,n as y,o as b,ot as x,p as S,r as C,s as w,u as T}from"./index-CS8XPYbB.js";import{n as E,t as D}from"./course-export-C8jSPuda.js";import{n as O}from"./BetaReportPanel-BJ9HIAnz.js";var k=e(t(),1),A=g();async function j(){if(typeof navigator>`u`||!navigator.storage?.persisted)return{kind:`indexeddb`,persistent:!1};try{return{kind:`indexeddb`,persistent:await navigator.storage.persisted()||!1}}catch{return{kind:`indexeddb`,persistent:!1}}}function M({settings:e,update:t}){let n=l(),[r,i]=(0,k.useState)(null),[o,s]=(0,k.useState)(null),[m,g]=(0,k.useState)(null),[v,x]=(0,k.useState)(null),[C,T]=(0,k.useState)(!1),[E,D]=(0,k.useState)(``),[O,M]=(0,k.useState)(``),[N,P]=(0,k.useState)(null),F=_(e),I=e=>n(e===`sqlite`?`storage.sqlite`:`storage.browser`),L=e=>n(e?`data.kind.${e}`:`data.checking`),R=()=>{if(e.provider!==`bridge`&&t({provider:`bridge`}),typeof document>`u`)return;let n=document.getElementById(`local-agent`);n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({behavior:`smooth`,block:`start`})},z=e=>p(e?.code,n)||e?.message||String(e),B=(0,k.useCallback)(async()=>{let[t,n,r]=await Promise.all([f(e),c().catch(()=>null),j()]);i(t),g(n),s(F===`browser`&&n?.kind===`memory`?{kind:`memory`}:r)},[e,F]);(0,k.useEffect)(()=>{B()},[B]);let V=async t=>{D(``),M(``),T(!0);try{x(await d(t,{settings:e}))}catch(e){M(e?.message||String(e))}finally{T(!1)}};return(0,A.jsxs)(S,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`font-medium`,children:n(`storage.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:n(`storage.subtitle`)})]}),(0,A.jsx)(b,{value:F,onSelect:e=>{e!==F&&V(e)},disabled:C,sqliteStatus:r,browserStatus:o}),r?.reason===`not_paired`&&(0,A.jsxs)(`div`,{className:`rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100`,children:[(0,A.jsx)(`p`,{children:p(`not_paired`,n)}),(0,A.jsx)(`p`,{className:`mt-1`,children:w(`not_paired`,n)}),(0,A.jsx)(`button`,{type:`button`,onClick:R,className:`mt-2 text-xs underline`,children:n(`storage.openLocalAgent`)})]}),(0,A.jsxs)(`div`,{className:`rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800`,children:[(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:n(`storage.activeStore`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:m?L(m.kind):n(`data.checking`)})]}),m?.path&&(0,A.jsx)(`p`,{className:`mt-0.5 break-all text-xs text-neutral-500`,children:m.path}),F===`sqlite`&&r&&!r.available&&(0,A.jsxs)(`p`,{className:`mt-1 text-amber-700 dark:text-amber-300`,children:[n(`storage.serverDown`),` `,(0,A.jsx)(`code`,{children:`npx ronin-skillforce studio`}),n(`storage.serverDownAfter`)]})]}),N&&(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm dark:border-amber-500/30 dark:bg-amber-500/10`,children:[(0,A.jsx)(`span`,{children:n(`storage.oldCopyThere`,{from:I(N.from)})}),(0,A.jsx)(h,{size:`sm`,variant:`secondary`,onClick:async()=>{if(N&&(typeof window>`u`||window.confirm(n(`storage.removeOldConfirm`,{label:I(N.from)})))){T(!0),M(``);try{await a(N.from,{settings:e}),P(null),D(n(`storage.removedMessage`)),await B()}catch(e){M(e?.message||String(e))}finally{T(!1)}}},disabled:C,children:n(`storage.removeOld`)})]}),E&&(0,A.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:E}),O&&(0,A.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:O}),(0,A.jsx)(y,{plan:v,busy:C,error:O,allowWithoutCopy:!0,onConfirm:async()=>{if(!v)return;T(!0),M(``);let{from:r,to:i}=v;try{if(v.sourceUnavailable)t({storage:i});else{let t=await u(i,{settings:e,dump:v.dump});if(!t.switched){M(n(`app.storageBlocked.countMismatch`,{fields:t.mismatches.join(`, `)}));return}P({from:r,to:i}),D(n(`storage.movedMessage`,{count:t.imported,recordWord:n(`common.record`,{count:t.imported}),target:I(i)}))}v.sourceUnavailable&&(P({from:r,to:i}),D(n(`storage.switchedMessage`,{target:I(i)}))),x(null),await B()}catch(e){M(z(e))}finally{T(!1)}},onCancel:()=>x(null)})]})}function N(e){let t=e?.tables||{};return Object.values(t).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0)}function P(e){let t={};for(let[n,r]of Object.entries(e?.tables||{}))t[n]=Array.isArray(r)?r.length:0;return t}function F(){let e=l(),t=t=>e(t?`data.kind.${t}`:`data.checking`),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[u,d]=(0,k.useState)(``),[f,p]=(0,k.useState)(``),[g,_]=(0,k.useState)(``),[v,y]=(0,k.useState)(null),b=(0,k.useRef)(null),C=(0,k.useCallback)(async()=>{try{let e=await c();r(e)}catch{}try{a(await x())}catch{}},[]);(0,k.useEffect)(()=>(C().finally(()=>{}),()=>{}),[C]);let w=e=>{p(e),_(``)},T=e=>{_(e?.message||String(e)),p(``)},j=async()=>{d(`export`);try{let t=await o(),n=new Date().toISOString().slice(0,10);D(`professor-studio-backup-${n}.json`,JSON.stringify(t,null,2)),w(e(`data.backupExported`,{n:N(t)}))}catch(e){T(e)}finally{d(``)}},M=async t=>{let n=t.target.files?.[0];if(t.target.value=``,n){d(`restore`);try{let t=JSON.parse(await n.text()),r=await m(t);await C(),w(e(`data.restored`,{n:r?.imported??N(t),name:n.name}))}catch(e){T(e)}finally{d(``)}}},F=async()=>{d(`import`),y(null);try{let t=await s().exportAll(),n=P(t),r=N(t);if(r===0){w(e(`data.noBrowserData`));return}let i=await m(t),a=P(await o()),c=Object.keys(n).filter(e=>(a[e]||0)<n[e]);y({imported:i?.imported??r,total:r,mismatches:c}),await C(),c.length?T(Error(e(`data.importMismatch`,{fields:c.join(`, `)}))):w(e(`data.importedVerified`,{n:r}))}catch(e){T(e)}finally{d(``)}},I=async()=>{if(typeof window>`u`||window.confirm(e(`data.clearConfirm`)))try{await new Promise((e,t)=>{let n=indexedDB.deleteDatabase(`professor-studio`);n.onsuccess=()=>e(),n.onerror=()=>t(n.error),n.onblocked=()=>e()}),y(null),w(e(`data.cleared`))}catch(e){T(e)}},L=async t=>{d(`course:${t.id}`);try{let n=await E(t);w(e(`data.exported`,{name:n}))}catch(e){T(e)}finally{d(``)}},R=n?.kind===`remote`;return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(S,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`font-medium`,children:e(`data.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:e(`data.subtitle`)})]}),(0,A.jsxs)(`div`,{className:`rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800`,children:[(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:e(`data.storageLabel`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:n?t(n.kind):e(`data.checking`)})]}),n?.path&&(0,A.jsx)(`p`,{className:`mt-0.5 break-all text-xs text-neutral-500`,children:n.path}),(0,A.jsxs)(`p`,{children:[(0,A.jsx)(`span`,{className:`text-neutral-500`,children:e(`data.persistentLabel`)}),` `,(0,A.jsx)(`span`,{className:`font-medium`,children:n?n.persistent?e(`data.granted`):e(`data.bestEffort`):`—`})]})]}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,A.jsx)(h,{onClick:j,disabled:u===`export`,children:e(`data.exportBackup`)}),(0,A.jsx)(h,{variant:`secondary`,onClick:()=>b.current?.click(),disabled:u===`restore`,children:e(`data.restoreBackup`)}),(0,A.jsx)(`input`,{ref:b,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:M})]}),(0,A.jsxs)(`div`,{className:`rounded-lg border border-neutral-200 p-3 dark:border-neutral-800`,children:[(0,A.jsx)(`p`,{className:`text-sm font-medium`,children:e(`data.moveTitle`)}),(0,A.jsx)(`p`,{className:`mt-1 text-xs text-neutral-500`,children:e(R?`data.moveRemote`:`data.moveLocal`)}),(0,A.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,A.jsx)(h,{size:`sm`,variant:`secondary`,onClick:F,disabled:!R||u===`import`,children:e(`data.importBrowser`)}),v&&(0,A.jsx)(h,{size:`sm`,variant:`ghost`,onClick:I,children:e(`data.clearBrowser`)})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`p`,{className:`text-sm font-medium`,children:e(`data.exportCourseTitle`)}),(0,A.jsxs)(`p`,{className:`mt-1 text-xs text-neutral-500`,children:[e(`data.exportCourseBody`),` `,(0,A.jsx)(`code`,{children:`professor:*`}),` `,e(`data.exportCourseAfter`)]}),i.length===0?(0,A.jsx)(`p`,{className:`mt-2 text-xs text-neutral-500`,children:e(`data.noCourses`)}):(0,A.jsx)(`ul`,{className:`mt-2 space-y-1`,children:i.map(t=>(0,A.jsxs)(`li`,{className:`flex items-center justify-between gap-2 text-sm`,children:[(0,A.jsx)(`span`,{className:`truncate`,children:t.title}),(0,A.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>L(t),disabled:u===`course:${t.id}`,children:e(`data.exportCourse`)})]},t.id))})]}),f&&(0,A.jsx)(`p`,{className:`text-sm text-green-700 dark:text-green-400`,children:f}),g&&(0,A.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:g})]}),(0,A.jsx)(O,{})]})}function I(e=``){let t=String(e||``).replace(/^#/,``),n=t.indexOf(`?`);return n!==-1&&new URLSearchParams(t.slice(n+1)).get(`report`)===`1`}function L(e=typeof document<`u`?document:null){let t=e?.getElementById?.(`beta-report`);return!t||typeof t.scrollIntoView!=`function`?!1:(t.scrollIntoView({behavior:`smooth`,block:`start`}),!0)}function R(){let e=l(),[t,a]=r();return(0,k.useEffect)(()=>{typeof window<`u`&&I(window.location.hash)&&L()},[]),(0,A.jsxs)(`div`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h1`,{className:`text-xl font-semibold`,children:e(`settings.title`)}),(0,A.jsx)(`p`,{className:`mt-1 text-sm text-neutral-600 dark:text-neutral-300`,children:e(`settings.subtitle`)})]}),(0,A.jsxs)(`section`,{id:`local-agent`,className:`scroll-mt-6 space-y-3`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.aiSource`)}),(0,A.jsx)(C,{settings:t,update:a}),(0,A.jsx)(`div`,{children:(0,A.jsx)(h,{variant:`danger`,size:`sm`,onClick:n,children:e(`settings.clearKeys`)})})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.learner`)}),(0,A.jsxs)(S,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,A.jsx)(v,{label:e(`settings.name`),name:`learnerName`,value:t.learnerName,onChange:e=>a({learnerName:e.target.value}),placeholder:e(`settings.namePlaceholder`)}),(0,A.jsx)(T,{label:e(`settings.learningLanguage`),name:`language`,hint:e(`settings.languageHint`),value:t.language,onChange:e=>a({language:e.target.value}),children:i().map(e=>(0,A.jsx)(`option`,{value:e.code,children:e.name},e.code))})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,A.jsx)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-neutral-500`,children:e(`settings.storage`)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>L(),className:`text-xs text-neutral-500 underline hover:text-neutral-900 dark:hover:text-white`,children:e(`betaReport.jump`)})]}),(0,A.jsx)(M,{settings:t,update:a}),(0,A.jsx)(F,{})]})]})}export{R as Settings};