lookatstudy-mobile 0.24.0 → 0.26.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 (192) hide show
  1. package/package.json +1 -1
  2. package/web/assets/{CanvasStage-u_7YeGk1.js → CanvasStage-sR8T2IFn.js} +1 -1
  3. package/web/assets/{CommandPalette-Q5j7BQf4.js → CommandPalette-xoHRtFTt.js} +1 -1
  4. package/web/assets/{CourseSearchPanel-BYGHjhnk.js → CourseSearchPanel-Blz5uOZo.js} +2 -2
  5. package/web/assets/{ExamView-DU5X7LyZ.js → ExamView-DcD9-XhK.js} +1 -1
  6. package/web/assets/ReviewPanel-DPX_Gbvn.js +1 -0
  7. package/web/assets/{SettingsView-CD9th6O0.js → SettingsView-DpSiGIUo.js} +3 -3
  8. package/web/assets/Tableau10-CvOaoHrI.js +1 -0
  9. package/web/assets/{VoicePanel-Cvl2BLq2.js → VoicePanel-BFuMIduE.js} +1 -1
  10. package/web/assets/abnfDiagram-N423BO3Z-BRYm-LZF.js +1 -0
  11. package/web/assets/abnfDiagram-VCTEODGH-ODA7YWAP-B--kWzEh.js +1 -0
  12. package/web/assets/arc-DIdxrd7q.js +1 -0
  13. package/web/assets/architectureDiagram-5GKGNRK7-C4PU3XN7-DzOQ5fo_.js +36 -0
  14. package/web/assets/architectureDiagram-T3A2C74G-BhljJtMX.js +36 -0
  15. package/web/assets/{arrow-right-B0QrRNSR.js → arrow-right-DtCWRkvj.js} +1 -1
  16. package/web/assets/{blockDiagram-NRAW4CY4-UMJ6PMQQ-BxiaVwV9.js → blockDiagram-NRAW4CY4-UMJ6PMQQ-D3KXfJhJ.js} +2 -2
  17. package/web/assets/{blockDiagram-VBNYF7ZC-BAnlmDNm.js → blockDiagram-VBNYF7ZC-Dr7ZTeLw.js} +3 -3
  18. package/web/assets/{c4Diagram-5PPSVZJV-MUU8xp1X.js → c4Diagram-5PPSVZJV-CPi9fgO4.js} +2 -2
  19. package/web/assets/{c4Diagram-UCG6FXSJ-75X3U2P3-7rpgYEob.js → c4Diagram-UCG6FXSJ-75X3U2P3-Bj0Dw0IT.js} +2 -2
  20. package/web/assets/channel-aqWuF1WT.js +1 -0
  21. package/web/assets/{chunk-2GRJ4B5K-BZ6Sj0-3.js → chunk-2GRJ4B5K-DeZ82qe7.js} +1 -1
  22. package/web/assets/{chunk-2Q5K7J3B-BkOSQBqV.js → chunk-2Q5K7J3B-B1WwbyzY.js} +1 -1
  23. package/web/assets/{chunk-5RXB4S5H-DgXJvWY0.js → chunk-5RXB4S5H-BX9ZzOwO.js} +1 -1
  24. package/web/assets/{chunk-5VM5RSS4-D-BptZQ9.js → chunk-5VM5RSS4-9-QvfnU2.js} +1 -1
  25. package/web/assets/{chunk-6Q2QTUOP-DIJ0lWTD.js → chunk-6Q2QTUOP-Dkt-zdDg.js} +1 -1
  26. package/web/assets/{chunk-7XDTSPCN-vxuDBi1y.js → chunk-7XDTSPCN-DOxJ22Ws.js} +1 -1
  27. package/web/assets/{chunk-CTNIYPP6-F5ZMIO6O.js → chunk-CTNIYPP6-2D6eMEGx.js} +1 -1
  28. package/web/assets/{chunk-CXNFBKHE-CFr1EfBh.js → chunk-CXNFBKHE-BETxgCVr.js} +1 -1
  29. package/web/assets/{chunk-GF5L2VYU-jqePwawx.js → chunk-GF5L2VYU-JBwf_TWs.js} +1 -1
  30. package/web/assets/{chunk-ISA7TJRJ-DiKuu0wz.js → chunk-ISA7TJRJ-DGTMMKAm.js} +1 -1
  31. package/web/assets/{chunk-JWPE2WC7-CLC3hqKr.js → chunk-JWPE2WC7-B_A1as9r.js} +1 -1
  32. package/web/assets/{chunk-KBJHAD2P-DSEKcYpO.js → chunk-KBJHAD2P-bmR9qwSi.js} +1 -1
  33. package/web/assets/{chunk-LV3HUYFY-P2e0-qZ6.js → chunk-LV3HUYFY-D8UFu3pb.js} +1 -1
  34. package/web/assets/{chunk-M3IUQBOH-Bdt4MjFy.js → chunk-M3IUQBOH-r4ZZKIWR.js} +1 -1
  35. package/web/assets/{chunk-NDIOYS4C-7HlPLAGd.js → chunk-NDIOYS4C-BuC155ii.js} +1 -1
  36. package/web/assets/{chunk-RE4WF27V-D4vIv_G3.js → chunk-RE4WF27V-DJoYieaa.js} +1 -1
  37. package/web/assets/{chunk-RYQCIY6F-tTcuHeqw.js → chunk-RYQCIY6F-DNF6lO1-.js} +1 -1
  38. package/web/assets/{chunk-VII2H2IX-BkXECJ1Z.js → chunk-VII2H2IX-DBudi9Y-.js} +1 -1
  39. package/web/assets/{chunk-X5GNSKZ3-D7yjZGWk.js → chunk-X5GNSKZ3-Dzcgoim8.js} +1 -1
  40. package/web/assets/{chunk-XCWWM2C3-C_es6n6S.js → chunk-XCWWM2C3-3YSDgOL-.js} +1 -1
  41. package/web/assets/{chunk-XXDRQBXY-Bsuow-B8.js → chunk-XXDRQBXY-B5LLJm9i.js} +1 -1
  42. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K-DhFaZ76j.js +1 -0
  43. package/web/assets/classDiagram-JCYQIIEL-CNvSQ-RA.js +1 -0
  44. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2-DhFaZ76j.js +1 -0
  45. package/web/assets/classDiagram-v2-OCEON4UE-CNvSQ-RA.js +1 -0
  46. package/web/assets/{core-Bgf5ngI5.js → core-Cf-iwesp.js} +4 -4
  47. package/web/assets/cose-bilkent-JH36ORCC-DweZYTE6.js +1 -0
  48. package/web/assets/cose-bilkent-JH36ORCC-OB24KH3T-D3S0f4LW.js +1 -0
  49. package/web/assets/{cynefin-OW5HDTMX-GVF3BKWE-DY90g1OE.js → cynefin-OW5HDTMX-GVF3BKWE-DrtBkvjj.js} +1 -1
  50. package/web/assets/{cynefin-VYW2F7L2-DjqH_9VW.js → cynefin-VYW2F7L2-lYm8p8qp.js} +1 -1
  51. package/web/assets/cynefinDiagram-5FMLGOSQ-H3WIRU3N-CGurIKbY.js +62 -0
  52. package/web/assets/cynefinDiagram-MW4NZA55-EMZxCSzT.js +62 -0
  53. package/web/assets/{dagre-3AP2YEHR-DCERTXHT-BwLHkvZV.js → dagre-3AP2YEHR-DCERTXHT-B3xLLC4U.js} +2 -2
  54. package/web/assets/{dagre-VZM6K2ZE-0zjstOys.js → dagre-VZM6K2ZE-lqYJ3WXC.js} +2 -2
  55. package/web/assets/{diagram-7IWD3JNH-CoRwcTua.js → diagram-7IWD3JNH-DXSSf7q4.js} +2 -2
  56. package/web/assets/{diagram-B4RE2ZJO-Cau1H7nm.js → diagram-B4RE2ZJO-ak7sOZ19.js} +2 -2
  57. package/web/assets/diagram-LBJQPF4R-XmQxOAH-.js +24 -0
  58. package/web/assets/diagram-Q27KOJAE-D-yQEvjN.js +24 -0
  59. package/web/assets/{diagram-S7CK7UJ4-MULGZGEL-C7lZT5bQ.js → diagram-S7CK7UJ4-MULGZGEL-D5WNGIG9.js} +2 -2
  60. package/web/assets/diagram-UB23O5K3-CRgze-MQ.js +41 -0
  61. package/web/assets/diagram-UQ7AKVKN-YQBY353J-CSvMx1Fm.js +41 -0
  62. package/web/assets/{diagram-VSXAHHWV-WLNH2ELY-BW8LpgQJ.js → diagram-VSXAHHWV-WLNH2ELY-DMVZ0M5s.js} +2 -2
  63. package/web/assets/diagram-VX7I27RA-XW6YQV5G-NONTq7mV.js +24 -0
  64. package/web/assets/diagram-Z3DM3KII-HG7RF65D-D0VfGCJh.js +24 -0
  65. package/web/assets/ebnfDiagram-BXEA7PRR-D0k0RumW.js +1 -0
  66. package/web/assets/ebnfDiagram-PWID7BFC-OKY4VHYD-By7cMb-m.js +1 -0
  67. package/web/assets/{elk.bundled-DP5Rghza.js → elk.bundled-DCJrDGbL.js} +1 -1
  68. package/web/assets/{erDiagram-JOGREHBK-Dz3-stVV.js → erDiagram-JOGREHBK-DxDlKHXu.js} +4 -4
  69. package/web/assets/{erDiagram-SSCWMZ5O-PIPKOIK7-DoltPq2T.js → erDiagram-SSCWMZ5O-PIPKOIK7-DwWrIKUB.js} +2 -2
  70. package/web/assets/{flowDiagram-A5DVABFB-2Z4AVO5R-EXpUdCkE.js → flowDiagram-A5DVABFB-2Z4AVO5R-eqJKcw9W.js} +1 -1
  71. package/web/assets/{flowDiagram-UKHOOZJN--KUxj2rZ.js → flowDiagram-UKHOOZJN-CC84JD3t.js} +1 -1
  72. package/web/assets/{ganttDiagram-EL5Y4UJY-JZNG7GOG-B3_qeHhv.js → ganttDiagram-EL5Y4UJY-JZNG7GOG-CWOtJ46k.js} +6 -6
  73. package/web/assets/{ganttDiagram-PKOTCBZU-DDw97tpG.js → ganttDiagram-PKOTCBZU-Bw78KC7C.js} +3 -3
  74. package/web/assets/gitGraphDiagram-DS77QQ5N-CywKDUgv.js +106 -0
  75. package/web/assets/gitGraphDiagram-WWUBYQGX-DMWMLL3G-DIUZBjRH.js +106 -0
  76. package/web/assets/{index-CrB9w7Gs.js → index-BLO7CDRf.js} +2 -2
  77. package/web/assets/{index-C-4sKCSr.js → index-BNNZmZ7L.js} +13 -13
  78. package/web/assets/{index-CRlVl931.js → index-CAFnQS2L.js} +1 -1
  79. package/web/assets/index-Coa1vpTG.css +1 -0
  80. package/web/assets/index-WF4B6heO.js +21 -0
  81. package/web/assets/infoDiagram-6WML65LV-DFCB1zK_.js +2 -0
  82. package/web/assets/infoDiagram-RXCK75RN-HANS5KVC-CR0XCzL1.js +2 -0
  83. package/web/assets/{ishikawaDiagram-5VMMS53U-7GCIT7WU-DR-PXM0c.js → ishikawaDiagram-5VMMS53U-7GCIT7WU-BQmMapB0.js} +4 -4
  84. package/web/assets/{ishikawaDiagram-WSZJBQD7-Bf-J9Ov1.js → ishikawaDiagram-WSZJBQD7-CDVYsb8F.js} +6 -6
  85. package/web/assets/{journeyDiagram-EYS64GPL-OAPELBT7-jFQUZit6.js → journeyDiagram-EYS64GPL-OAPELBT7-Bv57BEbI.js} +2 -2
  86. package/web/assets/{journeyDiagram-NVQOT4AX-CWed0L5n.js → journeyDiagram-NVQOT4AX-BUhHhw49.js} +2 -2
  87. package/web/assets/{kanban-definition-27J2QSJJ-DhTIozq4.js → kanban-definition-27J2QSJJ-DJWi_jsV.js} +2 -2
  88. package/web/assets/{kanban-definition-3QL26DDD-I7RKWQQY-MOg0W8Vc.js → kanban-definition-3QL26DDD-I7RKWQQY-DeQuTmff.js} +2 -2
  89. package/web/assets/{katex-N6JRN4PM-DUl1EV3T.js → katex-N6JRN4PM-CsmS8bAu.js} +1 -1
  90. package/web/assets/{linear-BHfMepXe.js → linear-DQOfHiUP.js} +1 -1
  91. package/web/assets/main-Bkgg11ZB.js +462 -0
  92. package/web/assets/mermaid-layout-elk.core-DDX9gcIM.js +2 -0
  93. package/web/assets/{mermaid.core-BVbO1Vp8.js → mermaid.core-D0rh4nEj.js} +13 -13
  94. package/web/assets/{mindmap-definition-FAOFIHXS-UC1xDIuF.js → mindmap-definition-FAOFIHXS-nqKMiE2n.js} +2 -2
  95. package/web/assets/{mindmap-definition-FBJOCRG2-KIYZG64Y-DyTkl7Qq.js → mindmap-definition-FBJOCRG2-KIYZG64Y-CgkstHv4.js} +2 -2
  96. package/web/assets/pegDiagram-VL7TDLO6-Cy8v2veR.js +1 -0
  97. package/web/assets/pegDiagram-XKGWAZYB-OIP57N6J-DHOcOx86.js +1 -0
  98. package/web/assets/{pet-BawFRWlx.js → pet-DaccG5xt.js} +1 -1
  99. package/web/assets/pie-5VdQHRMI.js +1 -0
  100. package/web/assets/{pieDiagram-7S7Q4E2Y-Bggk64R7.js → pieDiagram-7S7Q4E2Y-D2e6HI5F.js} +2 -2
  101. package/web/assets/{pieDiagram-E7YTZNPT-2UOTW327-DbtP5dKZ.js → pieDiagram-E7YTZNPT-2UOTW327-9oqFgJEQ.js} +3 -3
  102. package/web/assets/{quadrantDiagram-AXDQQJYC-SN3ASJJK-CbdnLdcx.js → quadrantDiagram-AXDQQJYC-SN3ASJJK-aRI00491.js} +2 -2
  103. package/web/assets/{quadrantDiagram-CIZ2JOQS-D8oWqljf.js → quadrantDiagram-CIZ2JOQS-BxVU5r4V.js} +2 -2
  104. package/web/assets/railroadDiagram-AXF67PYL-CxcdKdyz.js +1 -0
  105. package/web/assets/railroadDiagram-O6MQD6OU-34742W6X-82y7OitY.js +1 -0
  106. package/web/assets/{render-O7CIS3YK-C5zxvpoJ.js → render-O7CIS3YK-0coM2jiE.js} +15 -15
  107. package/web/assets/{requirementDiagram-EFPCY7ZU-NGAFFSMB-vkMFulyy.js → requirementDiagram-EFPCY7ZU-NGAFFSMB-CiCBt9Q_.js} +2 -2
  108. package/web/assets/{requirementDiagram-LRYGKXZP-4uQ-OIOg.js → requirementDiagram-LRYGKXZP-a-jqBbh4.js} +4 -4
  109. package/web/assets/{rotate-ccw-C3k3pTDh.js → rotate-ccw-DPfbZXyQ.js} +1 -1
  110. package/web/assets/sankeyDiagram-P5KCCOFB-3D3M4XPB-vVOpmIBk.js +40 -0
  111. package/web/assets/{sankeyDiagram-W5VNT64P-CdtMmhMM.js → sankeyDiagram-W5VNT64P-CXBDBsJf.js} +2 -2
  112. package/web/assets/{sequenceDiagram-SI44F4Z6-BTa9vGYr.js → sequenceDiagram-SI44F4Z6-BEzEovun.js} +2 -2
  113. package/web/assets/{sequenceDiagram-WJ2MYXX4-Q2IOPB4R-Du5hMpfL.js → sequenceDiagram-WJ2MYXX4-Q2IOPB4R-BAt30Hjd.js} +2 -2
  114. package/web/assets/sizeCapture-X5ZJPWSS-CqVF9LHS.js +1 -0
  115. package/web/assets/sizeCapture-X5ZJPWSS-PSGVOMYM-DPuPQlRM.js +1 -0
  116. package/web/assets/stateDiagram-HBIQ2CUA-4M2S6MAN-DnF-bmgm.js +1 -0
  117. package/web/assets/stateDiagram-OKZ733FA-CKebmBa5.js +1 -0
  118. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-BLTGkUFQ.js +1 -0
  119. package/web/assets/stateDiagram-v2-UEYNNEHI-BLjk4IRo.js +1 -0
  120. package/web/assets/swimlanes-SLNWSIFB-M10HmJH-.js +2 -0
  121. package/web/assets/swimlanes-XN3QIQJK-N6N2CCQ6-DzcOR4_D.js +1 -0
  122. package/web/assets/swimlanesDiagram-ULZ7WXOC-DCxkAVHU.js +8 -0
  123. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-JLTPHNIv.js +8 -0
  124. package/web/assets/time-BgujFIZT.js +1 -0
  125. package/web/assets/{timeline-definition-24CTP7MA-KN7RSRVM-Cba_QLsv.js → timeline-definition-24CTP7MA-KN7RSRVM-CMhLQnxM.js} +2 -2
  126. package/web/assets/{timeline-definition-Z64GVDOM-nDvkF_F-.js → timeline-definition-Z64GVDOM-LcGdwXI-.js} +2 -2
  127. package/web/assets/transform-B5_amWNh.js +1 -0
  128. package/web/assets/{vennDiagram-4TSXK5OY-AKJ7LXAN-Bjm0zDVN.js → vennDiagram-4TSXK5OY-AKJ7LXAN-CKicd48A.js} +2 -2
  129. package/web/assets/{vennDiagram-T6HMQDX7-KudBxp6e.js → vennDiagram-T6HMQDX7-D7hxv4W7.js} +2 -2
  130. package/web/assets/{wardleyDiagram-T6FBY63Y-d1R0A5mS.js → wardleyDiagram-T6FBY63Y-DnTzvRkP.js} +2 -2
  131. package/web/assets/{wardleyDiagram-VM6X3IG4-3B6A3BN5-BOTe--eD.js → wardleyDiagram-VM6X3IG4-3B6A3BN5-CBmbko0H.js} +2 -2
  132. package/web/assets/{xychartDiagram-ELKLHX3M-ChfX530c.js → xychartDiagram-ELKLHX3M-B1fLmbSX.js} +3 -3
  133. package/web/assets/{xychartDiagram-S5SC5T6Z-OBDNV6WG-DcSRUgks.js → xychartDiagram-S5SC5T6Z-OBDNV6WG-D1kFCVEP.js} +3 -3
  134. package/web/index.html +3 -3
  135. package/web/pet.html +3 -3
  136. package/web/assets/MindmapView-C61d4ddf.js +0 -4
  137. package/web/assets/ReviewPanel-DoLMdlpR.js +0 -1
  138. package/web/assets/Tableau10-Cz3F1amA.js +0 -1
  139. package/web/assets/abnfDiagram-N423BO3Z-BvTcLUtE.js +0 -1
  140. package/web/assets/abnfDiagram-VCTEODGH-ODA7YWAP-NpbseUTF.js +0 -1
  141. package/web/assets/arc-Bb-hQPAI.js +0 -1
  142. package/web/assets/architectureDiagram-5GKGNRK7-C4PU3XN7-DGtDmisd.js +0 -36
  143. package/web/assets/architectureDiagram-T3A2C74G-huu8moy9.js +0 -36
  144. package/web/assets/channel-BJoUn5Z8.js +0 -1
  145. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K-B3DqqoSe.js +0 -1
  146. package/web/assets/classDiagram-JCYQIIEL-C2n-a_rM.js +0 -1
  147. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2-B3DqqoSe.js +0 -1
  148. package/web/assets/classDiagram-v2-OCEON4UE-C2n-a_rM.js +0 -1
  149. package/web/assets/colors-Cc3OSVma.js +0 -1
  150. package/web/assets/cose-bilkent-JH36ORCC-OB24KH3T-DM0H6Gci.js +0 -1
  151. package/web/assets/cose-bilkent-JH36ORCC-x05QuEnY.js +0 -1
  152. package/web/assets/cynefinDiagram-5FMLGOSQ-H3WIRU3N-DoaOZ7iJ.js +0 -62
  153. package/web/assets/cynefinDiagram-MW4NZA55-DI8ePik6.js +0 -62
  154. package/web/assets/diagram-LBJQPF4R-CZIgxCTB.js +0 -24
  155. package/web/assets/diagram-Q27KOJAE-B_LnuCra.js +0 -24
  156. package/web/assets/diagram-UB23O5K3-qTFCSozX.js +0 -41
  157. package/web/assets/diagram-UQ7AKVKN-YQBY353J-CIootVI_.js +0 -41
  158. package/web/assets/diagram-VX7I27RA-XW6YQV5G-DfhGfGMR.js +0 -24
  159. package/web/assets/diagram-Z3DM3KII-HG7RF65D-seunnnEY.js +0 -24
  160. package/web/assets/ebnfDiagram-BXEA7PRR-ksZAvx5f.js +0 -1
  161. package/web/assets/ebnfDiagram-PWID7BFC-OKY4VHYD-Bvj1acAA.js +0 -1
  162. package/web/assets/gitGraphDiagram-DS77QQ5N-DXUcbzn4.js +0 -106
  163. package/web/assets/gitGraphDiagram-WWUBYQGX-DMWMLL3G-BrLu7NzO.js +0 -106
  164. package/web/assets/index-BUFumkqO.js +0 -21
  165. package/web/assets/index-CODVWHV0.js +0 -416
  166. package/web/assets/index-CU6ublfJ.js +0 -1
  167. package/web/assets/index-DjoBjasB.css +0 -1
  168. package/web/assets/index-H1bePBGl.js +0 -3
  169. package/web/assets/infoDiagram-6WML65LV-rLhQ8DQz.js +0 -2
  170. package/web/assets/infoDiagram-RXCK75RN-HANS5KVC-BhbqgWa_.js +0 -2
  171. package/web/assets/main-D3HpSUyK.js +0 -462
  172. package/web/assets/mermaid-layout-elk.core-KBAfwQxu.js +0 -2
  173. package/web/assets/min-tv6RD-6E.js +0 -1
  174. package/web/assets/pegDiagram-VL7TDLO6-D3DtO4SS.js +0 -1
  175. package/web/assets/pegDiagram-XKGWAZYB-OIP57N6J-D6RFGa8P.js +0 -1
  176. package/web/assets/pie-xhYaZtwS.js +0 -1
  177. package/web/assets/railroadDiagram-AXF67PYL-DqYMsbyG.js +0 -1
  178. package/web/assets/railroadDiagram-O6MQD6OU-34742W6X-BxDZ-lKK.js +0 -1
  179. package/web/assets/sankeyDiagram-P5KCCOFB-3D3M4XPB-Ct2_9lW6.js +0 -40
  180. package/web/assets/sizeCapture-X5ZJPWSS-PSGVOMYM-Dv_CbP4j.js +0 -1
  181. package/web/assets/sizeCapture-X5ZJPWSS-xJHPAAZ7.js +0 -1
  182. package/web/assets/stateDiagram-HBIQ2CUA-4M2S6MAN-BhhZM57P.js +0 -1
  183. package/web/assets/stateDiagram-OKZ733FA-CHCQNs83.js +0 -1
  184. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-CNwPFEas.js +0 -1
  185. package/web/assets/stateDiagram-v2-UEYNNEHI-uaaN79rE.js +0 -1
  186. package/web/assets/step-SI6FXFD6.js +0 -1
  187. package/web/assets/swimlanes-SLNWSIFB-Bste-JE-.js +0 -2
  188. package/web/assets/swimlanes-XN3QIQJK-N6N2CCQ6-03elMVxe.js +0 -1
  189. package/web/assets/swimlanesDiagram-ULZ7WXOC-CNw-u2S_.js +0 -8
  190. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-jhFh1EB2.js +0 -8
  191. package/web/assets/time-CLfYygnx.js +0 -1
  192. package/web/assets/transform-CzGDKG_M.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lookatstudy-mobile",
3
- "version": "0.24.0",
3
+ "version": "0.26.0",
4
4
  "description": "LookatStudy Termux portable bundle (server.cjs + web frontend)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,4 +1,4 @@
1
- import{r,j as h}from"./index-C-4sKCSr.js";import{c as T,u as L,P as D}from"./main-D3HpSUyK.js";/**
1
+ import{r,j as h}from"./index-BNNZmZ7L.js";import{c as T,u as L,P as D}from"./main-Bkgg11ZB.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{r as s,j as t}from"./index-C-4sKCSr.js";import{c as y,u as v,b as k,L as j,F as N,M as w,G as C,T as M,d as _}from"./main-D3HpSUyK.js";/**
1
+ import{r as s,j as t}from"./index-BNNZmZ7L.js";import{c as y,u as v,b as k,L as j,F as N,M as w,G as C,T as M,d as _}from"./main-Bkgg11ZB.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,6 +1,6 @@
1
- import{r as u,j as t}from"./index-C-4sKCSr.js";import{c as C,U as I,u as y,a as L,d as S,X as N,g as M,T as E,C as R}from"./main-D3HpSUyK.js";/**
1
+ import{r as u,j as t}from"./index-BNNZmZ7L.js";import{c as C,U as I,u as y,a as L,d as S,X as N,B as M,T as E,C as R}from"./main-Bkgg11ZB.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const T=C("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);function $(e,i,n){return[...e].sort((r,c)=>r.orderIdx-c.orderIdx).map(r=>{const c=i.filter(l=>l.parentId===r.id).sort((l,a)=>l.orderIdx-a.orderIdx),d=c.filter(l=>l.type==="lesson"),h=d.length>0&&d.every(l=>{var a;return(((a=n[l.id])==null?void 0:a.mastery)??0)>=I});return{section:r,lessons:c,chapterLessonsMastered:h}})}function w(e,i,n){var r;return e.type==="exam"?!n:(((r=i[e.id])==null?void 0:r.status)??"locked")==="locked"}function B(e,i){const n=i.trim().toLowerCase().split(/\s+/).filter(Boolean);if(n.length===0)return e;const r=c=>{const d=c.toLowerCase();return n.every(h=>d.includes(h))};return e.map(c=>{if(r(c.section.title))return c;const d=c.lessons.filter(h=>r(h.title));return d.length>0?{...c,lessons:d}:null}).filter(c=>c!==null)}function H(e,i){const n=i.trim().split(/\s+/).filter(Boolean)[0];if(!n)return null;const r=e.toLowerCase().indexOf(n.toLowerCase());return r>=0?[r,r+n.length]:null}function D(e){const i=y(),[n,r]=u.useState(""),[c,d]=u.useState([]),h=u.useRef(null);u.useEffect(()=>{var s;(s=h.current)==null||s.focus()},[]);const l=u.useMemo(()=>$(e.sections,e.tree,e.progressMap),[e.sections,e.tree,e.progressMap]),a=u.useMemo(()=>B(l,n),[l,n]),x=u.useMemo(()=>new Set(e.tree.map(s=>s.id)),[e.tree]),f=u.useMemo(()=>new Set(a.flatMap(s=>s.lessons.map(o=>o.id))),[a]),g=u.useMemo(()=>new Map(e.tree.map(s=>[s.id,s])),[e.tree]),p=u.useMemo(()=>new Map(l.map(s=>[s.section.id,s.chapterLessonsMastered])),[l]);u.useEffect(()=>{const s=n.trim();if(s.length<2){d([]);return}const o=setTimeout(()=>{L.searchContent(s).then(m=>{d(m.filter(k=>x.has(k.nodeId)&&!f.has(k.nodeId)).slice(0,8))}).catch(()=>d([]))},250);return()=>clearTimeout(o)},[n,x,f]);const j=u.useMemo(()=>{for(const s of a){const o=s.lessons.find(m=>!w(m,e.progressMap,s.chapterLessonsMastered));if(o)return o}return null},[a,e.progressMap]),v=a.length>0||c.length>0;return t.jsxs("div",{"data-testid":"course-search-panel",className:"absolute inset-0 z-50 flex flex-col",style:{background:"rgb(var(--surface-rail-rgb) / 0.96)",backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},onKeyDown:s=>{s.key==="Escape"&&e.onClose()},children:[t.jsxs("div",{className:"flex items-center gap-1.5 m-2 p-1.5 rounded-lg bg-black/40 ring-1 ring-white/15 focus-within:ring-brand/60 transition-colors",children:[t.jsx(S,{className:"w-4 h-4 text-white/50 shrink-0"}),t.jsx("input",{ref:h,value:n,onChange:s=>r(s.target.value),onKeyDown:s=>{s.key==="Enter"&&j&&e.onJump(j)},placeholder:i("map.search.placeholder"),"data-testid":"course-search-input",className:"flex-1 bg-transparent text-body text-white placeholder:text-white/35 outline-none min-w-0"}),n&&t.jsx("button",{onClick:()=>{var s;r(""),(s=h.current)==null||s.focus()},"aria-label":i("map.search.clear"),className:"shrink-0 flex items-center justify-center w-5 h-5 rounded-md text-white/50 hover:text-white hover:bg-white/10 transition-colors",children:t.jsx(N,{className:"w-3.5 h-3.5"})}),t.jsx("button",{onClick:e.onClose,"data-testid":"course-search-close","aria-label":i("map.search.close"),className:"shrink-0 flex items-center justify-center w-5 h-5 rounded-md text-white/50 hover:text-white hover:bg-white/10 transition-colors",children:t.jsx(N,{className:"w-3.5 h-3.5"})})]}),t.jsxs("div",{className:"flex-1 overflow-y-auto px-2 pb-3 space-y-2",children:[!v&&t.jsx("div",{"data-testid":"course-search-empty",className:"text-center text-label text-white/60 mt-8 px-4",children:i("map.search.noResults")}),a.map((s,o)=>t.jsx(F,{row:s,sectionIndex:o,query:n,progressMap:e.progressMap,selectedNodeId:e.selectedNodeId,onPick:e.onJump},s.section.id)),c.length>0&&t.jsxs("div",{"data-testid":"course-search-content-group",className:"pt-1",children:[t.jsx("div",{className:"px-1.5 py-1 text-caption font-bold text-white/50 uppercase tracking-wider",children:i("map.search.contentGroup")}),c.map(s=>{const o=g.get(s.nodeId);if(!o)return null;const m=w(o,e.progressMap,p.get(o.parentId??"")??!1);return t.jsxs("button",{disabled:m,"data-testid":`search-content-row-${o.id.slice(0,8)}`,onClick:()=>!m&&e.onJump(o),className:`w-full text-left px-2 py-1.5 rounded-lg transition-colors ${m?"opacity-45 cursor-not-allowed":"hover:bg-white/10 cursor-pointer"} ${o.id===e.selectedNodeId?"bg-accent/15 ring-1 ring-accent/40":""}`,children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(M,{className:"w-3.5 h-3.5 text-white/70 shrink-0"}),t.jsx("span",{className:"flex-1 text-label font-bold text-white truncate",children:t.jsx(b,{text:s.title,query:n})})]}),t.jsx("div",{className:"text-caption text-white/55 line-clamp-2 leading-snug pl-5.5",children:s.snippet})]},s.nodeId)})]})]})]})}function F({row:e,sectionIndex:i,query:n,progressMap:r,selectedNodeId:c,onPick:d}){const h=y(),l=(e.section.world??"study")==="practice";return t.jsxs("div",{"data-testid":`search-section-${e.section.id.slice(0,8)}`,children:[t.jsxs("div",{className:"flex items-center gap-2 px-1.5 py-1",children:[t.jsx("span",{className:"w-5 h-5 rounded-full bg-gold text-neutral-900 text-caption font-extrabold flex items-center justify-center shrink-0 ring-2 ring-gold/40",children:i+1}),t.jsx("span",{className:"text-label font-bold text-white truncate flex-1",children:t.jsx(b,{text:e.section.title,query:n})}),l&&t.jsx("span",{className:"shrink-0 px-1.5 py-0.5 rounded-full bg-accent/20 text-accent text-caption font-bold",children:h("map.world.practice")})]}),e.lessons.map(a=>{var p;const x=w(a,r,e.chapterLessonsMastered),f=((p=r[a.id])==null?void 0:p.status)??"locked",g=a.type==="exam";return t.jsxs("button",{disabled:x,"data-testid":`search-row-${a.id.slice(0,8)}`,onClick:()=>!x&&d(a),className:`w-full flex items-center gap-2 px-2 py-1.5 rounded-lg text-left transition-colors ${x?"opacity-45 cursor-not-allowed":"hover:bg-white/10 cursor-pointer"} ${a.id===c?"bg-accent/15 ring-1 ring-accent/40":""}`,children:[x?t.jsx(T,{className:"w-3.5 h-3.5 text-white/50 shrink-0"}):g?t.jsx(E,{className:"w-3.5 h-3.5 text-accent shrink-0"}):f==="mastered"?t.jsx(R,{className:"w-3.5 h-3.5 text-gold shrink-0"}):t.jsx(M,{className:"w-3.5 h-3.5 text-white/70 shrink-0"}),t.jsx("span",{className:"flex-1 text-label text-white truncate",children:t.jsx(b,{text:a.title,query:n})})]},a.id)})]})}function b({text:e,query:i}){const n=H(e,i);return n?t.jsxs(t.Fragment,{children:[e.slice(0,n[0]),t.jsx("span",{className:"text-brand font-extrabold",children:e.slice(n[0],n[1])}),e.slice(n[1])]}):t.jsx(t.Fragment,{children:e})}export{D as CourseSearchPanel};
6
+ */const T=C("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);function B(e,i,n){return[...e].sort((r,c)=>r.orderIdx-c.orderIdx).map(r=>{const c=i.filter(l=>l.parentId===r.id).sort((l,a)=>l.orderIdx-a.orderIdx),d=c.filter(l=>l.type==="lesson"),h=d.length>0&&d.every(l=>{var a;return(((a=n[l.id])==null?void 0:a.mastery)??0)>=I});return{section:r,lessons:c,chapterLessonsMastered:h}})}function w(e,i,n){var r;return e.type==="exam"?!n:(((r=i[e.id])==null?void 0:r.status)??"locked")==="locked"}function $(e,i){const n=i.trim().toLowerCase().split(/\s+/).filter(Boolean);if(n.length===0)return e;const r=c=>{const d=c.toLowerCase();return n.every(h=>d.includes(h))};return e.map(c=>{if(r(c.section.title))return c;const d=c.lessons.filter(h=>r(h.title));return d.length>0?{...c,lessons:d}:null}).filter(c=>c!==null)}function H(e,i){const n=i.trim().split(/\s+/).filter(Boolean)[0];if(!n)return null;const r=e.toLowerCase().indexOf(n.toLowerCase());return r>=0?[r,r+n.length]:null}function D(e){const i=y(),[n,r]=u.useState(""),[c,d]=u.useState([]),h=u.useRef(null);u.useEffect(()=>{var s;(s=h.current)==null||s.focus()},[]);const l=u.useMemo(()=>B(e.sections,e.tree,e.progressMap),[e.sections,e.tree,e.progressMap]),a=u.useMemo(()=>$(l,n),[l,n]),x=u.useMemo(()=>new Set(e.tree.map(s=>s.id)),[e.tree]),f=u.useMemo(()=>new Set(a.flatMap(s=>s.lessons.map(o=>o.id))),[a]),g=u.useMemo(()=>new Map(e.tree.map(s=>[s.id,s])),[e.tree]),p=u.useMemo(()=>new Map(l.map(s=>[s.section.id,s.chapterLessonsMastered])),[l]);u.useEffect(()=>{const s=n.trim();if(s.length<2){d([]);return}const o=setTimeout(()=>{L.searchContent(s).then(m=>{d(m.filter(k=>x.has(k.nodeId)&&!f.has(k.nodeId)).slice(0,8))}).catch(()=>d([]))},250);return()=>clearTimeout(o)},[n,x,f]);const j=u.useMemo(()=>{for(const s of a){const o=s.lessons.find(m=>!w(m,e.progressMap,s.chapterLessonsMastered));if(o)return o}return null},[a,e.progressMap]),v=a.length>0||c.length>0;return t.jsxs("div",{"data-testid":"course-search-panel",className:"absolute inset-0 z-50 flex flex-col",style:{background:"rgb(var(--surface-rail-rgb) / 0.96)",backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},onKeyDown:s=>{s.key==="Escape"&&e.onClose()},children:[t.jsxs("div",{className:"flex items-center gap-1.5 m-2 p-1.5 rounded-lg bg-black/40 ring-1 ring-white/15 focus-within:ring-brand/60 transition-colors",children:[t.jsx(S,{className:"w-4 h-4 text-white/50 shrink-0"}),t.jsx("input",{ref:h,value:n,onChange:s=>r(s.target.value),onKeyDown:s=>{s.key==="Enter"&&j&&e.onJump(j)},placeholder:i("map.search.placeholder"),"data-testid":"course-search-input",className:"flex-1 bg-transparent text-body text-white placeholder:text-white/35 outline-none min-w-0"}),n&&t.jsx("button",{onClick:()=>{var s;r(""),(s=h.current)==null||s.focus()},"aria-label":i("map.search.clear"),className:"shrink-0 flex items-center justify-center w-5 h-5 rounded-md text-white/50 hover:text-white hover:bg-white/10 transition-colors",children:t.jsx(N,{className:"w-3.5 h-3.5"})}),t.jsx("button",{onClick:e.onClose,"data-testid":"course-search-close","aria-label":i("map.search.close"),className:"shrink-0 flex items-center justify-center w-5 h-5 rounded-md text-white/50 hover:text-white hover:bg-white/10 transition-colors",children:t.jsx(N,{className:"w-3.5 h-3.5"})})]}),t.jsxs("div",{className:"flex-1 overflow-y-auto px-2 pb-3 space-y-2",children:[!v&&t.jsx("div",{"data-testid":"course-search-empty",className:"text-center text-label text-white/60 mt-8 px-4",children:i("map.search.noResults")}),a.map((s,o)=>t.jsx(F,{row:s,sectionIndex:o,query:n,progressMap:e.progressMap,selectedNodeId:e.selectedNodeId,onPick:e.onJump},s.section.id)),c.length>0&&t.jsxs("div",{"data-testid":"course-search-content-group",className:"pt-1",children:[t.jsx("div",{className:"px-1.5 py-1 text-caption font-bold text-white/50 uppercase tracking-wider",children:i("map.search.contentGroup")}),c.map(s=>{const o=g.get(s.nodeId);if(!o)return null;const m=w(o,e.progressMap,p.get(o.parentId??"")??!1);return t.jsxs("button",{disabled:m,"data-testid":`search-content-row-${o.id.slice(0,8)}`,onClick:()=>!m&&e.onJump(o),className:`w-full text-left px-2 py-1.5 rounded-lg transition-colors ${m?"opacity-45 cursor-not-allowed":"hover:bg-white/10 cursor-pointer"} ${o.id===e.selectedNodeId?"bg-accent/15 ring-1 ring-accent/40":""}`,children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(M,{className:"w-3.5 h-3.5 text-white/70 shrink-0"}),t.jsx("span",{className:"flex-1 text-label font-bold text-white truncate",children:t.jsx(b,{text:s.title,query:n})})]}),t.jsx("div",{className:"text-caption text-white/55 line-clamp-2 leading-snug pl-5.5",children:s.snippet})]},s.nodeId)})]})]})]})}function F({row:e,sectionIndex:i,query:n,progressMap:r,selectedNodeId:c,onPick:d}){const h=y(),l=(e.section.world??"study")==="practice";return t.jsxs("div",{"data-testid":`search-section-${e.section.id.slice(0,8)}`,children:[t.jsxs("div",{className:"flex items-center gap-2 px-1.5 py-1",children:[t.jsx("span",{className:"w-5 h-5 rounded-full bg-gold text-neutral-900 text-caption font-extrabold flex items-center justify-center shrink-0 ring-2 ring-gold/40",children:i+1}),t.jsx("span",{className:"text-label font-bold text-white truncate flex-1",children:t.jsx(b,{text:e.section.title,query:n})}),l&&t.jsx("span",{className:"shrink-0 px-1.5 py-0.5 rounded-full bg-accent/20 text-accent text-caption font-bold",children:h("map.world.practice")})]}),e.lessons.map(a=>{var p;const x=w(a,r,e.chapterLessonsMastered),f=((p=r[a.id])==null?void 0:p.status)??"locked",g=a.type==="exam";return t.jsxs("button",{disabled:x,"data-testid":`search-row-${a.id.slice(0,8)}`,onClick:()=>!x&&d(a),className:`w-full flex items-center gap-2 px-2 py-1.5 rounded-lg text-left transition-colors ${x?"opacity-45 cursor-not-allowed":"hover:bg-white/10 cursor-pointer"} ${a.id===c?"bg-accent/15 ring-1 ring-accent/40":""}`,children:[x?t.jsx(T,{className:"w-3.5 h-3.5 text-white/50 shrink-0"}):g?t.jsx(E,{className:"w-3.5 h-3.5 text-accent shrink-0"}):f==="mastered"?t.jsx(R,{className:"w-3.5 h-3.5 text-gold shrink-0"}):t.jsx(M,{className:"w-3.5 h-3.5 text-white/70 shrink-0"}),t.jsx("span",{className:"flex-1 text-label text-white truncate",children:t.jsx(b,{text:a.title,query:n})})]},a.id)})]})}function b({text:e,query:i}){const n=H(e,i);return n?t.jsxs(t.Fragment,{children:[e.slice(0,n[0]),t.jsx("span",{className:"text-brand font-extrabold",children:e.slice(n[0],n[1])}),e.slice(n[1])]}):t.jsx(t.Fragment,{children:e})}export{D as CourseSearchPanel};
@@ -1,4 +1,4 @@
1
- import{r as o,h as U,j as e,c as ie}from"./index-C-4sKCSr.js";import{c as te,u as ce,a as j,h as de,T as z,i as Y,L as V,j as oe,X as xe}from"./main-D3HpSUyK.js";import{R as G}from"./rotate-ccw-C3k3pTDh.js";import{A as q}from"./arrow-right-B0QrRNSR.js";/**
1
+ import{r as o,h as U,j as e,c as ie}from"./index-BNNZmZ7L.js";import{c as te,u as ce,a as j,g as de,T as z,h as Y,L as V,i as oe,X as xe}from"./main-Bkgg11ZB.js";import{R as G}from"./rotate-ccw-DPfbZXyQ.js";import{A as q}from"./arrow-right-DtCWRkvj.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -0,0 +1 @@
1
+ import{r as a,j as e,c as S}from"./index-BNNZmZ7L.js";import{u as j,a as N,S as M}from"./main-Bkgg11ZB.js";function A({tree:c,onReviewNode:d,progressMap:o}){const s=j(),[l,f]=a.useState([]),[b,h]=a.useState(!0),[n,x]=a.useState(null);a.useEffect(()=>{N.getAllSrsItems().then(t=>f(t)).catch(()=>f([])).finally(()=>h(!1))},[]);const p=a.useMemo(()=>new Map(c.map(t=>[t.id,t])),[c]),g=a.useMemo(()=>new Set(l.filter(t=>t.overdue).map(t=>t.nodeId)),[l]),i=a.useMemo(()=>{const t=c.filter(u=>{var y;const m=(y=o[u.id])==null?void 0:y.status;return u.type==="lesson"&&(m==="in_progress"||m==="mastered")}),r=new Map;for(const u of t){const m=u.parentId??"(root)";r.has(m)||r.set(m,[]),r.get(m).push(u)}return r},[c,o]),w=a.useMemo(()=>Array.from(i.values()).flat().filter(t=>g.has(t.id)).length,[i,g]),v=a.useMemo(()=>Array.from(i.values()).flat(),[i]);if(a.useEffect(()=>{if(i.size>0&&(!n||!i.has(n))){const t=i.keys().next().value;t&&x(t)}},[i,n]),b)return e.jsxs("div",{className:"text-center py-12 text-body text-ink-muted flex items-center justify-center gap-2",children:[e.jsx("span",{className:"typing-dot w-1.5 h-1.5 bg-brand rounded-full inline-block"}),s("review.loading")]});if(v.length===0)return e.jsxs("div",{className:"text-center py-16","data-testid":"review-empty",children:[e.jsx("div",{className:"text-4xl mb-3 opacity-30",children:"📖"}),e.jsx("div",{className:"text-body text-ink-muted",children:s("review.empty.title")}),e.jsx("div",{className:"text-label text-ink-faint mt-1",children:s("review.empty.desc")})]});const k=t=>{var r;return((r=p.get(t))==null?void 0:r.title)??t};return e.jsxs("div",{className:"p-5 max-w-2xl mx-auto","data-testid":"review-panel",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h2",{className:"text-title font-extrabold text-ink-strong",children:s("review.title")}),w>0&&e.jsxs("span",{className:"text-label font-bold text-review","data-testid":"review-due-count",children:[w," ",s("review.due.count")]})]}),e.jsxs("button",{onClick:()=>{const t=v[Math.floor(Math.random()*v.length)];t&&d(t.id)},"data-testid":"review-interleave",className:"btn-3d-neutral w-full py-2.5 text-body mb-5 flex items-center justify-center gap-1.5",children:[e.jsx(M,{className:"w-4 h-4"}),s("review.interleave")]}),e.jsx("div",{className:"text-label font-bold text-ink-muted mb-2",children:s("review.selectSection")}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mb-4",children:Array.from(i.entries()).map(([t,r])=>e.jsxs("button",{onClick:()=>x(t),className:`px-2.5 py-1 rounded-full text-label font-bold transition-colors ${n===t?"bg-brand/15 text-brand ring-1 ring-brand/30":"bg-surface-3 text-ink-muted hover:text-ink-strong"}`,children:[k(t),e.jsxs("span",{className:"ml-1 opacity-60",children:["(",r.length,")"]})]},t))}),n&&i.has(n)&&e.jsx("div",{className:"space-y-1.5","data-testid":"review-lesson-list",children:i.get(n).map(t=>{const r=g.has(t.id);return e.jsxs("div",{className:`flex items-center justify-between gap-2 p-2.5 rounded-lg transition-colors ${r?"bg-review/8 ring-1 ring-review/20":"bg-surface-3 hover:bg-surface-3/80"}`,children:[e.jsxs("div",{className:"flex items-center gap-1.5 truncate flex-1",children:[r&&e.jsx("span",{className:"shrink-0 w-1.5 h-1.5 rounded-full bg-review"}),e.jsx("span",{className:"text-body text-ink-strong truncate",children:t.title})]}),e.jsx("button",{onClick:()=>d(t.id),"data-testid":`review-lesson-${t.id.slice(0,8)}`,className:"shrink-0 px-3 py-1 rounded-lg bg-brand/15 text-brand text-label font-bold hover:bg-brand/25 transition-colors",children:s("review.reviewLesson")})]},t.id)})})]})}function E({nodeId:c,onRated:d}){const o=a.useRef(null),s=j(),[l,f]=a.useState(!1),[b,h]=a.useState(!1),n=async x=>{if(!(l||b)){f(!0);try{await N.recordReview(c,x),h(!0),d==null||d(),S(x>=4?"correct":"wrong",{origin:x>=4&&o.current?(()=>{const p=o.current.getBoundingClientRect();return{x:p.right-48,y:p.top+24}})():void 0})}catch{}finally{f(!1)}}};return b?e.jsx("div",{className:"text-center text-body text-brand py-2","data-testid":"self-rated",children:s("review.selfrated")}):e.jsxs("div",{ref:o,className:"border-t border-[var(--border-faint)] pt-3 mt-3","data-testid":"self-rating",children:[e.jsx("div",{className:"text-caption font-bold text-ink-muted uppercase tracking-wider mb-2 text-center",children:s("review.selfrate.title")}),e.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[e.jsxs("button",{onClick:()=>n(1),disabled:l,"data-testid":"rate-again",className:"py-2 rounded-lg border border-warning/40 text-warning hover:bg-warning/10 transition-colors disabled:opacity-40 flex flex-col items-center gap-0.5",children:[e.jsx("span",{className:"text-body font-bold",children:s("review.selfrate.again")}),e.jsx("span",{className:"text-caption opacity-70",children:s("review.selfrate.again.hint")})]}),e.jsxs("button",{onClick:()=>n(4),disabled:l,"data-testid":"rate-remembered",className:"py-2 rounded-lg border border-accent/40 text-accent hover:bg-accent/10 transition-colors disabled:opacity-40 flex flex-col items-center gap-0.5",children:[e.jsx("span",{className:"text-body font-bold",children:s("review.selfrate.remembered")}),e.jsx("span",{className:"text-caption opacity-70",children:s("review.selfrate.remembered.hint")})]}),e.jsxs("button",{onClick:()=>n(5),disabled:l,"data-testid":"rate-mastered",className:"py-2 rounded-lg border border-brand/40 text-brand hover:bg-brand/10 transition-colors disabled:opacity-40 flex flex-col items-center gap-0.5",children:[e.jsx("span",{className:"text-body font-bold",children:s("review.selfrate.mastered")}),e.jsx("span",{className:"text-caption opacity-70",children:s("review.selfrate.mastered.hint")})]})]})]})}export{A as ReviewPanel,E as SelfRatingCard};
@@ -1,7 +1,7 @@
1
- import{r as a,j as e,s as Ze,k as Qe,C as et,M as tt}from"./index-C-4sKCSr.js";import{c as st,u as de,k as ne,l as he,a as i,W as $e,P as nt,m as ze,s as at,j as it,h as lt,n as ot,o as dt,p as rt}from"./main-D3HpSUyK.js";/**
1
+ import{r as a,j as e,s as Ze,k as Qe,C as et,M as tt}from"./index-BNNZmZ7L.js";import{c as st,u as de,j as ne,k as he,a as i,W as $e,P as nt,l as ze,s as at,i as it,g as lt,m as ot,n as dt,o as rt}from"./main-Bkgg11ZB.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const ct=st("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]),xe="bg-ink/[0.04] text-ink-strong text-label rounded-lg border border-transparent focus:border-accent focus:bg-ink/[0.06] transition-colors placeholder:text-ink-faint";function we({kind:t,showProtocol:x=!0,testPrefix:b="custom",titleKey:p="settings.custom.form_title",modelPhKey:c="settings.custom.model_ph",testOverride:d,onSaved:r,onCancel:h}){const m=de(),[j,T]=a.useState(""),[g,S]=a.useState("openai-compatible"),[y,P]=a.useState(""),[o,_]=a.useState(""),[k,W]=a.useState(""),[B,V]=a.useState(!1),[I,D]=a.useState(!1),[A,z]=a.useState(null),L=async()=>{if(!(!y.trim()||!k.trim()||I)){D(!0),z(null);try{const l=d?await d({baseUrl:y.trim(),apiKey:o.trim(),model:k.trim()}):await i.testCustomProvider({label:j||m("settings.custom.test_label"),protocol:g,baseUrl:y.trim(),apiKey:o.trim()||void 0,defaultModel:k.trim()});z({ok:l.ok,detail:l.detail})}catch(l){z({ok:!1,detail:l instanceof Error?l.message:String(l)})}finally{D(!1)}}},N=async()=>{if(!(!j.trim()||!y.trim()||!k.trim()))try{const l=await i.createCustomProvider({label:j.trim(),kind:t,protocol:x?g:"openai-compatible",baseUrl:y.trim(),apiKey:o.trim()||void 0,defaultModel:k.trim(),vision:t==="llm"?B:void 0});r(l)}catch{}};return e.jsxs("div",{className:"space-y-2.5","data-testid":`${b}-provider-form`,children:[e.jsx("div",{className:"text-label font-bold text-ink-strong",children:m(p)}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:j,onChange:l=>T(l.target.value),placeholder:m("settings.custom.label_ph"),"data-testid":`${b}-label`,className:`${xe} flex-1 px-2.5 py-1.5`}),x&&e.jsxs("select",{value:g,onChange:l=>S(l.target.value),"data-testid":`${b}-protocol`,className:`${xe} px-2 py-1.5`,children:[e.jsx("option",{value:"openai-compatible",children:m("settings.proto.openai")}),e.jsx("option",{value:"anthropic",children:"Anthropic"}),e.jsx("option",{value:"google",children:"Google"})]})]}),e.jsx("input",{type:"text",value:y,onChange:l=>P(l.target.value),placeholder:m("settings.custom.baseurl_ph"),"data-testid":`${b}-baseurl`,className:`${xe} w-full px-2.5 py-1.5 font-mono`}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:k,onChange:l=>W(l.target.value),placeholder:m(c),"data-testid":`${b}-model`,className:`${xe} flex-1 px-2.5 py-1.5 font-mono`}),e.jsx("input",{type:"password",value:o,onChange:l=>_(l.target.value),placeholder:m("settings.custom.apikey_ph"),"data-testid":`${b}-apikey`,className:`${xe} flex-1 px-2.5 py-1.5`})]}),t==="llm"&&e.jsxs("label",{className:"inline-flex items-center gap-2 text-label cursor-pointer select-none","data-testid":`${b}-vision`,children:[e.jsx("input",{type:"checkbox",checked:B,onChange:l=>V(l.target.checked),className:"w-4 h-4 rounded accent-brand"}),e.jsx("span",{className:"text-ink-strong",children:m("settings.custom.vision")}),e.jsx("span",{className:"text-ink-faint",children:m("settings.custom.visionHint")})]}),A&&e.jsxs("div",{className:`text-label rounded p-2 inline-flex items-start gap-1.5 ${A.ok?"bg-brand/10 text-brand":"bg-warning/10 text-warning"}`,children:[A.ok?e.jsx(ne,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"break-words",children:A.detail})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:()=>void L(),disabled:!y.trim()||!k.trim()||I,"data-testid":`${b}-test`,className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:m(I?"settings.testing":"settings.test")}),e.jsx("button",{onClick:()=>void N(),disabled:!j.trim()||!y.trim()||!k.trim(),"data-testid":`${b}-save`,className:"btn-3d-brand px-3 py-1.5 text-label disabled:opacity-40",children:m("settings.custom.save")}),h&&e.jsx("button",{onClick:h,className:"text-label text-ink-muted hover:text-ink-strong px-3 py-1.5 transition-colors",children:m("action.cancel")})]})]})}const We="lookatstudy-theme",Ke="auto",Ue="(prefers-color-scheme: dark)";function _e(){return typeof window>"u"||window.matchMedia(Ue).matches?"dark":"light"}function mt(){if(typeof localStorage>"u")return Ke;const t=localStorage.getItem(We);return t==="auto"||t==="light"||t==="dark"?t:Ke}function Ce(t){const x=document.documentElement;x.classList.remove("dark","light"),x.classList.add(t),window.dispatchEvent(new CustomEvent("theme-changed",{detail:{resolved:t}}))}function ut(){const[t,x]=a.useState(()=>mt()),[b,p]=a.useState(()=>t==="auto"?_e():t),c=a.useCallback(d=>{x(d),localStorage.setItem(We,d);const r=d==="auto"?_e():d;p(r),Ce(r)},[]);return a.useEffect(()=>{if(t!=="auto")return;const d=window.matchMedia(Ue),r=h=>{const m=h.matches?"dark":"light";p(m),Ce(m)};return d.addEventListener("change",r),()=>d.removeEventListener("change",r)},[t]),a.useEffect(()=>{const d=t==="auto"?_e():t;p(d),Ce(d)},[t]),{mode:t,resolved:b,setMode:c}}const xt="0.24.0",ht={version:xt};function ke(){window.dispatchEvent(new Event(rt))}const G="bg-surface-1 text-ink text-body rounded-lg border border-[var(--border)] focus:border-brand focus:outline-none transition-colors placeholder:text-ink-faint",F="bg-surface-3 text-ink-muted hover:bg-surface-3 hover:bg-surface-3 hover:text-ink-strong",R="bg-brand text-white shadow-sm";function v(t){return t?"px-4 py-3.5 border-t border-[var(--border-faint)]":"px-4 py-3.5"}function wt(){const t=de(),[x,b]=a.useState([]),[p,c]=a.useState([]),[d,r]=a.useState("glm"),[h,m]=a.useState(""),[j,T]=a.useState(""),[g,S]=a.useState(null),[y,P]=a.useState(!1),[o,_]=a.useState(null),[k,W]=a.useState(!1),[B,V]=a.useState(!1),[I,D]=a.useState([]),[A,z]=a.useState(!1),[L,N]=a.useState(null),[l,H]=a.useState(null),[Q,re]=a.useState(""),[ge,ce]=a.useState(!1),ee=ut(),ie=async n=>{if($)try{await i.updateCustomProvider($.id,{vision:n}),await U()}catch{}},le=async()=>{z(!0),N(null);try{const n=await i.discoverModels();n.ok&&n.models?D(n.models):N(n.error||t("settings.discover_failed"))}catch(n){N(n instanceof Error?n.message:String(n))}finally{z(!1)}},U=a.useCallback(async()=>{try{const[n,f,E,J]=await Promise.all([i.getProviderPresets(),i.listCustomProviders(),i.getSetting("active_provider"),i.getSetting("active_model")]);b(n),c(f);const M=E??"glm";if(r(M),M.startsWith("custom-")){const w=f.find(C=>C.id===M);S(w!=null&&w.hasApiKey?t("settings.key.configured"):null)}else{const w=n.find(C=>C.id===M);if(w){const C=await i.getSetting(w.apiKeySetting);S(C?`${C.slice(0,4)}…${C.slice(-4)}`:null)}}if(M.startsWith("custom-")){const w=f.find(C=>C.id===M);m(J??(w==null?void 0:w.defaultModel)??"")}else{const w=n.find(C=>C.id===M);m(J??(w==null?void 0:w.defaultModel)??"")}}catch(n){console.error("[SettingsView] load() failed:",n)}},[t]);a.useEffect(()=>{U()},[U]);const me=async n=>{r(n),_(null),T("");const f=x.find(E=>E.id===n);if(f){const E=await i.getSetting(f.apiKeySetting);S(E?`${E.slice(0,4)}…${E.slice(-4)}`:null),m(h||f.defaultModel)}},pe=async()=>{W(!1);try{if(await i.setSetting("active_provider",d),await i.setSetting("active_model",h),j.trim()){const n=x.find(f=>f.id===d);n&&(await i.setSetting(n.apiKeySetting,j.trim()),S(`${j.trim().slice(0,4)}…${j.trim().slice(-4)}`),T(""))}W(!0),setTimeout(()=>W(!1),2e3),window.dispatchEvent(new Event("llm-config-changed"))}catch{}},O=async()=>{P(!0),_(null);try{const n=await i.testLlmConnection();_(n)}catch(n){_({ok:!1,detail:n instanceof Error?n.message:String(n),errorKind:"unknown"})}finally{P(!1)}},fe=async n=>{await i.setSetting("active_provider",n.id),await i.setSetting("active_model",n.defaultModel),r(n.id),m(n.defaultModel),V(!1),await U(),window.dispatchEvent(new Event("llm-config-changed"))},te=async n=>{try{await i.deleteCustomProvider(n),d===n&&(await i.setSetting("active_provider","glm"),r("glm")),await U()}catch{}},$=d.startsWith("custom-")?p.find(n=>n.id===d):null;a.useEffect(()=>{if(!$)return;const n=$.models.find(f=>f.id===h);re(n!=null&&n.contextWindow?String(n.contextWindow):"")},[$,h]);const be=async()=>{var M,w;if(!$)return;const n=Q.trim().replace(/[,\s_]/g,""),f=/^(\d+)([km]?)$/i.exec(n);if(n!==""&&!f)return;const E=((M=f==null?void 0:f[2])==null?void 0:M.toLowerCase())==="k"?1e3:((w=f==null?void 0:f[2])==null?void 0:w.toLowerCase())==="m"?1e6:1,J=n===""||!f?null:Math.max(1,Math.round(parseInt(f[1],10)*E));ce(!0);try{const C=$.models.map(q=>q.id===h?{...q,contextWindow:J}:q);await i.updateCustomProvider($.id,{models:C}),await U(),window.dispatchEvent(new Event("llm-config-changed"))}catch{}finally{ce(!1)}},Y=d.startsWith("custom-")?null:x.find(n=>n.id===d);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-5 pt-5 space-y-6",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.ai")}),e.jsxs("div",{className:"surface-card overflow-hidden",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.provider")}),e.jsxs("div",{className:"flex flex-wrap gap-1.5","data-testid":"provider-grid",children:[x.map(n=>e.jsx("button",{onClick:()=>me(n.id),"data-testid":`provider-card-${n.id}`,"aria-pressed":d===n.id,className:`px-3 py-1.5 rounded-lg text-label font-medium whitespace-nowrap transition-colors ${d===n.id?R:F}`,children:n.label},n.id)),p.filter(n=>n.kind==="llm").map(n=>e.jsxs("button",{onClick:()=>me(n.id),"data-testid":`provider-card-${n.id}`,"aria-pressed":d===n.id,className:`px-3 py-1.5 rounded-lg text-label font-medium whitespace-nowrap transition-colors inline-flex items-center gap-1 ${d===n.id?R:F}`,children:[e.jsx($e,{className:"w-3.5 h-3.5","aria-hidden":"true"}),n.label]},n.id)),e.jsxs("button",{onClick:()=>V(n=>!n),"data-testid":"add-custom-provider",className:"px-3 py-1.5 rounded-lg text-label whitespace-nowrap inline-flex items-center gap-1 border border-dashed border-[var(--border)] text-ink-muted hover:border-ink-muted hover:text-ink-strong transition-colors",children:[e.jsx(nt,{className:"w-3.5 h-3.5","aria-hidden":"true"}),t("settings.add_custom")]})]})]}),B&&e.jsx("div",{className:"px-4 py-3.5 bg-surface-1 border-t border-[var(--border-faint)]",children:e.jsx(we,{kind:"llm",testPrefix:"custom",onSaved:n=>void fe(n),onCancel:()=>V(!1)})}),p.length>0&&d.startsWith("custom-")&&e.jsx("div",{className:v(!0),children:e.jsx("button",{onClick:n=>{const f=n.currentTarget.getBoundingClientRect(),E=p.find(J=>J.id===d);E&&H({id:E.id,label:E.label,rect:f})},className:"text-label text-warning hover:underline",children:t("settings.delete_custom")})}),Y&&e.jsxs(e.Fragment,{children:[Y.baseUrl&&e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:"Base URL"}),e.jsx("code",{className:"text-label text-ink-faint font-mono break-all",children:Y.baseUrl})]}),e.jsxs("div",{className:v(!0),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.model")}),e.jsxs("div",{className:"flex-1 flex items-center gap-2",children:[e.jsxs("select",{value:h,onChange:n=>m(n.target.value),"data-testid":"model-select",className:`${G} flex-1 px-2.5 py-1.5`,children:[Y.models.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id)),d==="openrouter"&&I.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id))]}),d==="openrouter"&&e.jsxs("button",{onClick:le,disabled:A,"data-testid":"discover-models-btn",className:"text-label text-accent hover:underline disabled:opacity-40 whitespace-nowrap inline-flex items-center gap-1",children:[e.jsx(ct,{className:`w-3.5 h-3.5 ${A?"animate-spin":""}`,"aria-hidden":"true"}),t(A?"settings.discovering":"settings.refresh")]})]})]}),L&&e.jsx("div",{className:"text-label text-warning mt-1.5 ml-[68px]",children:L})]}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.apikey")}),e.jsxs("div",{className:"flex-1 flex items-center gap-2",children:[g&&e.jsxs("span",{className:"text-label text-brand shrink-0 inline-flex items-center gap-1",children:[e.jsx(ne,{className:"w-3.5 h-3.5","aria-hidden":"true"}),g]}),e.jsx("input",{type:"password",value:j,onChange:n=>T(n.target.value),placeholder:t(g?"settings.key.overwrite_ph":"settings.key.paste_ph"),"data-testid":"settings-key-input",className:`${G} flex-1 px-2.5 py-1.5`}),e.jsx("a",{href:Y.keyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-label text-brand hover:underline whitespace-nowrap",children:t("settings.key.get")})]})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:O,disabled:y,"data-testid":"test-connection-btn",className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:t(y?"settings.testing":"settings.test")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),o.detail]})]})})]}),$&&!Y&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:"Base URL"}),e.jsx("code",{className:"text-label text-ink-faint font-mono break-all",children:$.baseUrl})]}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.model")}),$.models.length>1?e.jsx("select",{value:h,onChange:n=>m(n.target.value),"data-testid":"model-select-custom",className:`${G} flex-1 px-2.5 py-1.5`,children:$.models.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id))}):e.jsx("input",{type:"text",value:h,onChange:n=>m(n.target.value),placeholder:t("settings.custom.model_ph"),"data-testid":"model-input-custom",className:`${G} flex-1 px-2.5 py-1.5 font-mono`})]})}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.custom.windowLabel")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",inputMode:"numeric",value:Q,onChange:n=>re(n.target.value),placeholder:t("settings.custom.windowPh"),"data-testid":"context-window-input",className:`${G} flex-1 px-2.5 py-1.5 font-mono tabular-nums`}),e.jsx("button",{onClick:be,disabled:ge,"data-testid":"context-window-save",className:"btn-3d-neutral px-3 py-1.5 text-label shrink-0 disabled:opacity-40",children:t("settings.custom.save")})]}),e.jsx("div",{className:"text-caption text-ink-faint mt-1",children:t("settings.custom.windowHint")})]}),e.jsx("div",{className:v(!0),children:e.jsxs("label",{className:"inline-flex items-center gap-2 text-label cursor-pointer select-none","data-testid":"custom-vision-toggle",children:[e.jsx("input",{type:"checkbox",checked:$.vision,onChange:n=>void ie(n.target.checked),className:"w-4 h-4 rounded accent-brand"}),e.jsx("span",{className:"text-ink-strong",children:t("settings.custom.vision")}),e.jsx("span",{className:"text-ink-faint",children:t("settings.custom.visionHint")})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:O,disabled:y,"data-testid":"test-connection-btn",className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:t(y?"settings.testing":"settings.test")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),o.detail]})]})})]})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.vision")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(pt,{activeProvider:d,activeModel:h,presets:x,customProviders:p})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.speech")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(Nt,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.memory")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(ft,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.companion")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(bt,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.appearance")}),e.jsxs("div",{className:"surface-card overflow-hidden",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.theme")}),e.jsx("div",{className:"flex gap-2",children:[{mode:"auto",label:t("settings.theme.auto")},{mode:"light",label:t("settings.theme.light")},{mode:"dark",label:t("settings.theme.dark")}].map(({mode:n,label:f})=>e.jsx("button",{onClick:()=>ee.setMode(n),"data-testid":`theme-${n}`,"aria-pressed":ee.mode===n,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${ee.mode===n?R:F}`,children:f},n))}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:ee.mode==="auto"?t("settings.theme.following",{mode:t(`settings.theme.${ee.resolved}`)}):null})]}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.interface_lang")}),e.jsx("div",{className:"flex gap-2",children:["zh-CN","en"].map(n=>e.jsx("button",{onClick:()=>at(n),"data-testid":`lang-${n}`,"aria-pressed":ze()===n,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${ze()===n?R:F}`,children:n==="zh-CN"?"中文":"English"},n))})]}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.import_lang")}),e.jsx(gt,{})]})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.about")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsxs("div",{className:v(!1),children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong",children:t("settings.row.version")}),e.jsxs("a",{href:"https://github.com/Kaiji-Z/LookatStudy/releases",target:"_blank",rel:"noopener noreferrer",className:"text-label font-mono text-brand hover:underline","data-testid":"settings-version",children:["v",ht.version]})]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.version.hint")})]})})]})]}),e.jsxs("div",{className:"sticky bottom-0 px-5 py-3 bg-surface-0 border-t border-[var(--border)] flex items-center justify-between gap-3",children:[e.jsx("span",{className:"text-label text-ink-muted",children:t("settings.footer.hint")}),e.jsxs("button",{onClick:pe,"data-testid":"settings-save",className:"btn-3d-brand px-5 py-2 text-body inline-flex items-center gap-1.5",children:[k&&e.jsx(it,{className:"w-4 h-4","aria-hidden":"true"}),t(k?"settings.saved_text":"settings.footer.save")]})]}),l&&e.jsx(lt,{anchorRect:l.rect,message:t("settings.delete_custom_confirm",{name:l.label}),danger:!0,confirmLabel:t("action.delete"),testid:"custom-provider-delete-confirm",onConfirm:()=>{te(l.id),H(null)},onCancel:()=>H(null)})]})}function gt(){const[t,x]=a.useState("en"),[b,p]=a.useState(!1);a.useEffect(()=>{i.getSetting("pref_lang").then(r=>{r&&x(r),p(!0)})},[]);const c=async r=>{x(r),await i.setSetting("pref_lang",r)},d=[{code:"en",label:"English"},{code:"zh-CN",label:"简体中文"},{code:"zh-TW",label:"繁體中文"}];return b?e.jsx("div",{className:"flex gap-2","data-testid":"pref-lang-options",children:d.map(r=>e.jsx("button",{onClick:()=>c(r.code),"data-testid":`pref-lang-${r.code}`,"aria-pressed":t===r.code,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${t===r.code?R:F}`,children:r.label},r.code))}):null}function pt({activeProvider:t,activeModel:x,presets:b,customProviders:p}){const c=de(),[d,r]=a.useState(!1),[h,m]=a.useState(!1),[j,T]=a.useState(""),[g,S]=a.useState(!1),[y,P]=a.useState(!1),[o,_]=a.useState(null),[k,W]=a.useState(!1);a.useEffect(()=>{Promise.all([i.getSetting("flag_multimodal_import"),i.getSetting("vision_provider_override"),i.getSetting("vision_model_override"),i.getSetting("flag_math_vision")]).then(([l,H,Q])=>{r(l==="true"),T(H??""),W(Q==="true"),m(!0)})},[]);const B=async()=>{const l=!d;r(l),await i.setSetting("flag_multimodal_import",String(l))},V=async()=>{const l=!k;W(l),await i.setSetting("flag_math_vision",String(l))},I=async l=>{await i.setSetting("vision_provider_override",l.id),await i.setSetting("vision_model_override",l.defaultModel),T(l.id),S(!1)},D=async()=>{await i.setSetting("vision_provider_override",""),await i.setSetting("vision_model_override",""),T(""),S(!1)},A=async()=>{if(!y){P(!0),_(null);try{const l=await i.testLlmConnection({vision:!0});_({ok:l.ok,detail:l.detail})}catch(l){_({ok:!1,detail:l instanceof Error?l.message:String(l)})}finally{P(!1)}}},z=p.filter(l=>l.kind==="vision"),L=j.startsWith("custom-")?p.find(l=>l.id===j):null,N=j&&!j.startsWith("custom-")?b.find(l=>l.id===j):null;return h?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-4 py-3.5 flex items-center gap-3",children:[e.jsx(ae,{checked:d,onChange:B,label:c("settings.multimodal.toggle"),testid:"multimodal-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:c("settings.multimodal.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:c("settings.multimodal.toggle.desc")})]})]}),e.jsxs("div",{className:"px-4 py-3.5 border-t border-[var(--border-faint)] space-y-3",children:[e.jsxs("div",{className:"text-label text-ink-muted bg-ink/5 rounded-lg p-3",children:[e.jsx("div",{className:"font-medium mb-1",children:c("settings.multimodal.current_model",{model:x||c("settings.multimodal.not_selected")})}),e.jsx("div",{children:t.startsWith("custom-")?c("settings.multimodal.hint_custom"):c("settings.multimodal.hint_preset")})]}),e.jsxs("div",{className:"bg-ink/5 rounded-lg p-3",children:[e.jsx("div",{className:"text-label font-medium text-ink-muted mb-2",children:c("settings.multimodal.override_title")}),e.jsx("div",{className:"text-caption text-ink-muted mb-2",children:c("settings.multimodal.override_bridge_hint")}),e.jsxs("div",{className:"space-y-3 mt-1",children:[L&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx($e,{className:"w-3.5 h-3.5 text-ink-faint shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium text-ink-strong",children:L.label}),e.jsx("code",{className:"text-ink-faint font-mono break-all",children:L.defaultModel}),e.jsx("span",{className:"text-ink-faint break-all min-w-0",children:L.baseUrl})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{onClick:()=>void A(),disabled:y,"data-testid":"vision-override-test",className:"btn-3d-neutral px-4 py-1.5 text-label disabled:opacity-50",children:c(y?"settings.testing":"settings.multimodal.test_override")}),e.jsx("button",{onClick:()=>S(l=>!l),className:"text-label text-accent hover:underline",children:c("settings.multimodal.replace_custom")}),e.jsx("button",{onClick:()=>void D(),className:"text-label text-ink-muted hover:text-ink-strong",children:c("settings.multimodal.stop_override")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),o.detail]})]})]}),N&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx("span",{className:"text-ink-muted",children:c("settings.multimodal.legacy_preset",{label:N.label})}),e.jsx("button",{onClick:()=>void D(),className:"text-label text-ink-muted hover:text-ink-strong underline",children:c("settings.multimodal.stop_override")})]}),!L&&!N&&e.jsxs(e.Fragment,{children:[z.map(l=>e.jsxs("button",{onClick:()=>void I(l),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`vision-pick-${l.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:l.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:l.defaultModel})]},l.id)),(g||z.length===0)&&e.jsx(we,{kind:"vision",testPrefix:"vision-custom",titleKey:"settings.custom.form_title_vision",modelPhKey:"settings.custom.model_ph_vision",onSaved:l=>void I(l),onCancel:()=>S(!1)}),z.length>0&&e.jsx("button",{onClick:()=>S(l=>!l),className:"text-label text-accent hover:underline",children:c(g?"action.cancel":"settings.custom.new")})]})]})]}),e.jsxs("div",{className:"bg-ink/5 rounded-lg p-3 flex items-center gap-3",children:[e.jsx(ae,{checked:k,onChange:V,label:c("settings.mathvision.toggle"),testid:"math-vision-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong",children:c("settings.mathvision.toggle")}),e.jsx("div",{className:"text-caption text-ink-muted",children:c("settings.mathvision.desc")})]})]})]})]}):null}function ft(){const t=de(),[x,b]=a.useState(!1),[p,c]=a.useState(!1);a.useEffect(()=>{i.getSetting("flag_memory_system").then(r=>{b(r==="true"),c(!0)})},[]);const d=async()=>{const r=!x;b(r),await i.setSetting("flag_memory_system",String(r))};return p?e.jsxs("div",{className:"px-4 py-3.5 flex items-center gap-3",children:[e.jsx(ae,{checked:x,onChange:d,label:t("settings.memory.toggle"),testid:"memory-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.memory.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.memory.toggle.desc")})]})]}):null}function bt(){const t=de(),[x,b]=a.useState(!0),[p,c]=a.useState(!1),d=a.useSyncExternalStore(Ze,Qe),[r,h]=a.useState(!0),[m,j]=a.useState(!1),T=typeof window<"u"&&!!window.__lookatstudyWeb;a.useEffect(()=>{i.getSetting("companion_enabled").then(o=>{b(o!=="false"&&o!=="0"),c(!0)}),i.getSetting("companion_sfx").then(o=>{h(o!=="false"&&o!=="0")}),i.getSetting("companion_pet_mode").then(o=>{j(o==="1")})},[]);const g=async()=>{const o=!x;b(o),await i.setSetting("companion_enabled",String(o)),window.dispatchEvent(new Event("companion-config-changed"))},S=async()=>{const o=!r;h(o),await i.setSetting("companion_sfx",String(o)),window.dispatchEvent(new Event("companion-config-changed"))},y=async()=>{const o=!m;j(o),await i.setSetting("companion_pet_mode",o?"1":"0"),window.dispatchEvent(new Event("companion-config-changed"))},P=async o=>{o!==d.form&&(await i.setSetting("companion_form",o),window.dispatchEvent(new Event("companion-config-changed")))};return p?e.jsxs("div",{className:"px-4 py-3.5 flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:x,onChange:g,label:t("settings.companion.toggle"),testid:"companion-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.toggle.desc")})]})]}),x&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:r,onChange:S,label:t("settings.companion.sfx"),testid:"companion-sfx-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.sfx")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.sfx.desc")})]})]}),!T&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:m,onChange:y,label:t("settings.companion.pet"),testid:"companion-pet-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.pet")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.pet.desc")})]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-label text-ink-muted mb-2",children:t("settings.companion.form")}),e.jsx("div",{className:"grid grid-cols-5 gap-2",role:"radiogroup","aria-label":t("settings.companion.form"),children:et.map(o=>{const _=d.form===o;return e.jsxs("button",{type:"button",role:"radio","aria-checked":_,"data-testid":`companion-form-${o}`,onClick:()=>{P(o)},className:`flex flex-col items-center gap-0.5 rounded-xl p-1.5 border motion-safe:transition-colors
7
- ${_?"border-[var(--accent)] bg-surface-2 shadow-card":"border-[var(--border-faint)] hover:bg-surface-2"}`,title:t(`companion.form.${o}.desc`),children:[e.jsx(tt,{form:o,expression:"happy",pose:"float",size:64}),e.jsx("span",{className:`text-label ${_?"text-ink-strong font-medium":"text-ink-muted"}`,children:t(`companion.form.${o}.name`)})]},o)})})]})]})]}):null}function ae({checked:t,onChange:x,label:b,testid:p}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":b,onClick:x,"data-testid":p,className:`relative w-12 h-6 rounded-full transition-colors shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand/60 focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-2)] ${t?"bg-brand":"bg-ink/20 hover:bg-ink/25"}`,children:e.jsx("span",{className:`absolute left-0.5 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full bg-white shadow transition-transform ${t?"translate-x-6":""}`})})}const vt=[{id:"zh-CN-XiaoxiaoNeural",label:"zh-CN · 晓晓(女)"},{id:"zh-CN-XiaoyiNeural",label:"zh-CN · 晓伊(女)"},{id:"zh-CN-YunxiNeural",label:"zh-CN · 云希(男)"},{id:"zh-CN-YunyangNeural",label:"zh-CN · 云扬(男·新闻)"},{id:"zh-CN-liaoning-XiaobeiNeural",label:"zh-CN · 晓北(女·东北)"},{id:"zh-CN-shaanxi-XiaoniNeural",label:"zh-CN · 晓妮(女·陕西)"},{id:"en-US-AriaNeural",label:"en-US · Aria(女)"},{id:"en-US-GuyNeural",label:"en-US · Guy(男)"},{id:"en-US-JennyNeural",label:"en-US · Jenny(女)"}],jt=[{sid:"45",label:"zf_xiaobei(女)"},{sid:"46",label:"zf_xiaoni(女)"},{sid:"47",label:"zf_xiaoxiao(女)"},{sid:"48",label:"zf_xiaoyi(女·默认)"},{sid:"49",label:"zm_yunjian(男)"},{sid:"50",label:"zm_yunxi(男)"},{sid:"51",label:"zm_yunxia(男)"},{sid:"52",label:"zm_yunyang(男)"}];function Nt(){const t=de(),[x,b]=a.useState([]),[p,c]=a.useState(null),[d,r]=a.useState(null),[h,m]=a.useState(null),[j,T]=a.useState(null),[g,S]=a.useState("edge"),[y,P]=a.useState("zh-CN-XiaoxiaoNeural"),[o,_]=a.useState("48"),[k,W]=a.useState("1.0"),[B,V]=a.useState(""),[I,D]=a.useState(""),[A,z]=a.useState([]),L=typeof window<"u"&&"speechSynthesis"in window,[N,l]=a.useState("local"),[H,Q]=a.useState("asr-whisper-turbo"),[re,ge]=a.useState(!0),[ce,ee]=a.useState([]),[ie,le]=a.useState(!1),[U,me]=a.useState(!1),[pe,O]=a.useState(!1),[fe,te]=a.useState(!1),[$,be]=a.useState(!1),[Y,n]=a.useState(null),[f,E]=a.useState(!1),[J,M]=a.useState(null),[w,C]=a.useState(null),q=a.useCallback(()=>{i.listCustomProviders().then(s=>ee(s.filter(u=>u.kind==="tts"||u.kind==="asr"))).catch(()=>{})},[]);a.useEffect(()=>{Promise.all([i.getSetting("tts_engine"),i.getSetting("tts_voice_edge"),i.getSetting("tts_sid_local"),i.getSetting("tts_speed"),i.getSetting("tts_custom_voice"),i.getSetting("tts_system_voice"),i.getSetting("asr_engine"),i.getSetting("asr_local_model"),i.getSetting("asr_auto_stop")]).then(([s,u,K,X,ye,Pe,Ae,Se,Je])=>{s&&S(s),u&&P(u),K&&_(K),X&&W(X),ye&&V(ye),Pe&&D(Pe),Ae&&l(Ae),(Se==="asr-whisper-turbo"||Se==="asr-whisper-small")&&Q(Se),ge(Je!=="0")}),q()},[q]),a.useEffect(()=>{if(typeof window>"u"||!("speechSynthesis"in window))return;const s=()=>z(dt(window.speechSynthesis.getVoices()));return s(),window.speechSynthesis.addEventListener("voiceschanged",s),()=>window.speechSynthesis.removeEventListener("voiceschanged",s)},[]);const ue=a.useCallback(()=>{window.api.getSpeechModelStatus().then(s=>b(s)).catch(()=>{})},[]);a.useEffect(()=>(ue(),window.api.on("speech:modelProgress",u=>{m({id:u.id,pct:Math.floor(u.progress*100),label:u.currentFile?u.currentFile.split("/").pop()??"":""})})),[ue]);const Fe=s=>{r(null),c(s),m({id:s,pct:0,label:""}),window.api.ensureSpeechModel(s).then(()=>{c(null),m(null),ue()}).catch(u=>{c(null),m(null),r(u instanceof Error?u.message:String(u)),ue()})},Re=s=>{c(s),T(null),window.api.deleteSpeechModel(s).then(ue).catch(u=>r(u instanceof Error?u.message:String(u))).finally(()=>c(null))},Ve=s=>t(s==="tts-kokoro"?"settings.speech.model.tts":s==="asr-whisper-turbo"?"settings.speech.model.asr_turbo":"settings.speech.model.asr_small"),Ie=s=>t(s==="asr-whisper-turbo"?"settings.speech.model.turbo_short":"settings.speech.model.small_short"),De=s=>s.startsWith("asr-whisper")?t("settings.speech.license_mit"):t("settings.speech.license"),Ee=s=>t(s==="ready"?"settings.speech.state.ready":s==="error"?"settings.speech.state.error":"settings.speech.state.absent"),Te=s=>{var u;return((u=x.find(K=>K.id===s))==null?void 0:u.state)??"absent"},oe=s=>{S(s),n(null),i.setSetting("tts_engine",s),ke()},Oe=s=>{D(s),i.setSetting("tts_system_voice",s),ke()},ve=s=>{l(s),M(null),i.setSetting("asr_engine",s)},je=ce.filter(s=>s.kind==="tts"),Ne=ce.filter(s=>s.kind==="asr"),Z=g.startsWith("custom-")?je.find(s=>s.id===g)??null:null,se=N.startsWith("custom-")?Ne.find(s=>s.id===N)??null:null,Ge=g==="azure",Be=N==="groq",qe=N==="azure",Xe=async()=>{if(!(!Z||$)){be(!0),n(null);try{n(await i.testCustomTts({providerId:Z.id}))}catch(s){n({ok:!1,detail:s instanceof Error?s.message:String(s)})}finally{be(!1)}}},He=async()=>{if(!(!se||f)){E(!0),M(null);try{M(await i.testCustomAsr({providerId:se.id}))}catch(s){M({ok:!1,detail:s instanceof Error?s.message:String(s)})}finally{E(!1)}}},Ye=async(s,u)=>{C(null);try{await i.deleteCustomProvider(s),u==="tts"&&g===s&&oe("edge"),u==="asr"&&N===s&&ve("local"),q()}catch{}},Me=s=>{const u=x.find(X=>X.id===s),K=(u==null?void 0:u.state)??"absent";return e.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong truncate",children:Ve(s)}),e.jsxs("div",{className:"text-caption text-ink-muted",children:[Ee(K)," · ",De(s)]}),p===s&&(h==null?void 0:h.id)===s&&e.jsx("div",{className:"mt-1.5 h-1.5 rounded-full bg-ink/[0.08] overflow-hidden","data-testid":`speech-dl-bar-${s}`,children:e.jsx("div",{className:"h-full bg-brand transition-all",style:{width:`${h.pct}%`}})}),p===s&&(h==null?void 0:h.id)===s&&e.jsxs("div",{className:"text-caption text-ink-faint mt-0.5","data-testid":`speech-dl-pct-${s}`,children:[h.pct,"%",h.label?` · ${h.label}`:""]})]}),K==="ready"?j===s?e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-caption text-warning",children:t("settings.speech.confirm_del")}),e.jsx("button",{onClick:()=>Re(s),className:"text-label text-warning hover:underline","data-testid":`speech-del-confirm-${s}`,children:t("settings.speech.delete")}),e.jsx("button",{onClick:()=>T(null),className:"text-label text-ink-muted hover:text-ink-strong",children:t("action.cancel")})]}):e.jsx("button",{onClick:()=>T(s),disabled:p===s,className:"text-label text-ink-muted hover:text-warning disabled:opacity-40","data-testid":`speech-del-${s}`,children:t("settings.speech.delete")}):e.jsx("button",{onClick:()=>Fe(s),disabled:p!=null||K==="downloading",className:"btn-3d-brand px-3 py-1 text-label disabled:opacity-40","data-testid":`speech-dl-${s}`,children:t(p===s||K==="downloading"?"settings.speech.downloading":"settings.speech.download")})]},s)},Le=(s,u,K,X,ye)=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx($e,{className:"w-3.5 h-3.5 text-ink-faint shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium text-ink-strong",children:s.label}),e.jsx("code",{className:"text-ink-faint font-mono break-all",children:s.defaultModel}),e.jsx("span",{className:"text-ink-faint break-all min-w-0",children:s.baseUrl}),s.hasApiKey&&e.jsxs("span",{className:"text-brand shrink-0 inline-flex items-center gap-0.5",children:[e.jsx(ne,{className:"w-3.5 h-3.5","aria-hidden":"true"}),t("settings.speech.key_saved")]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("button",{onClick:()=>void ye(),disabled:K,className:"btn-3d-neutral px-3 py-1 text-label disabled:opacity-40","data-testid":`${u}-custom-test`,children:t(K?"settings.testing":"settings.test")}),w===s.id?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-caption text-warning",children:t("settings.speech.confirm_del_custom")}),e.jsx("button",{onClick:()=>void Ye(s.id,u),className:"text-label text-warning hover:underline","data-testid":`${u}-custom-del-confirm`,children:t("settings.speech.delete")}),e.jsx("button",{onClick:()=>C(null),className:"text-label text-ink-muted hover:text-ink-strong",children:t("action.cancel")})]}):e.jsx("button",{onClick:()=>C(s.id),className:"text-label text-ink-muted hover:text-warning","data-testid":`${u}-custom-del`,children:t("settings.speech.delete")}),X&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${X.ok?"text-brand":"text-warning"}`,children:[X.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),X.detail]})]})]});return e.jsxs("div",{"data-testid":"settings-speech",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.speech.tts_title")}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsx("button",{onClick:()=>{oe("edge"),le(!1),O(!1)},"data-testid":"tts-engine-edge","aria-pressed":g==="edge",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="edge"?R:F}`,children:t("settings.speech.engine.edge")}),e.jsxs("button",{onClick:()=>{oe("local"),le(!1),O(!1)},"data-testid":"tts-engine-local","aria-pressed":g==="local",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="local"?R:F}`,children:[t("settings.speech.engine.local"),Te("tts-kokoro")!=="ready"?` · ${t("settings.speech.state.absent")}`:""]}),e.jsx("button",{onClick:()=>{oe("system"),le(!1),O(!1)},disabled:!L,"data-testid":"tts-engine-system","aria-pressed":g==="system",title:L?void 0:t("settings.speech.engine.system_unavailable"),className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="system"?R:F} ${L?"":"opacity-40 cursor-not-allowed"}`,children:t("settings.speech.engine.system")}),e.jsx("button",{onClick:()=>{le(s=>!s),ie||O(!1)},"data-testid":"tts-engine-custom","aria-pressed":g.startsWith("custom-")||ie,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g.startsWith("custom-")||ie?R:F}`,children:t("settings.speech.engine.custom")}),Ge&&e.jsxs("button",{disabled:!0,"data-testid":"tts-engine-azure",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Azure · ",t("settings.speech.legacy")]})]}),g==="edge"&&e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.engine.edge_note")})]}),g==="edge"&&e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("select",{value:y,onChange:s=>{P(s.target.value),i.setSetting("tts_voice_edge",s.target.value)},"data-testid":"tts-voice-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:vt.map(s=>e.jsx("option",{value:s.id,children:s.label},s.id))})]}),g==="local"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("select",{value:o,onChange:s=>{_(s.target.value),i.setSetting("tts_sid_local",s.target.value)},"data-testid":"tts-sid-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:jt.map(s=>e.jsx("option",{value:s.sid,children:s.label},s.sid))})]}),e.jsx("div",{className:v(!1),children:Me("tts-kokoro")})]}),g==="system"&&e.jsx(e.Fragment,{children:e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsxs("select",{value:I,onChange:s=>Oe(s.target.value),"data-testid":"tts-system-voice-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:[e.jsx("option",{value:"",children:t("settings.speech.voice_auto")}),A.map(s=>e.jsx("option",{value:s.name,children:ot(s)},s.voiceURI))]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.engine.system_note")})]})}),ie&&e.jsx("div",{className:v(!1),children:e.jsxs("div",{className:"space-y-3",children:[Z&&Le(Z,"tts",$,Y,Xe),Z&&e.jsxs("div",{children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("input",{type:"text",value:B,onChange:s=>V(s.target.value),onBlur:()=>void i.setSetting("tts_custom_voice",B.trim()),placeholder:t("settings.speech.custom_voice_ph"),"data-testid":"tts-custom-voice",className:`${G} w-full min-w-0 px-2.5 py-1.5 font-mono`})]}),!Z&&je.map(s=>e.jsxs("button",{onClick:()=>oe(s.id),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`tts-pick-${s.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:s.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:s.defaultModel})]},s.id)),(pe||!Z&&je.length===0)&&e.jsx(we,{kind:"tts",showProtocol:!1,testPrefix:"tts-custom",titleKey:"settings.custom.form_title_tts",modelPhKey:"settings.custom.model_ph_tts",testOverride:s=>i.testCustomTts({baseUrl:s.baseUrl,apiKey:s.apiKey||void 0,model:s.model}),onSaved:s=>{oe(s.id),O(!1),q()},onCancel:()=>O(!1)}),(Z||je.length>0)&&e.jsx("button",{onClick:()=>O(s=>!s),className:"text-label text-accent hover:underline",children:t(pe?"action.cancel":"settings.custom.new")})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.speech.speed")}),e.jsx("input",{type:"range",min:"0.5",max:"2",step:"0.05",value:k,onChange:s=>W(s.target.value),onPointerUp:()=>{i.setSetting("tts_speed",k),ke()},onKeyUp:()=>{i.setSetting("tts_speed",k),ke()},"data-testid":"tts-speed-range",className:"flex-1 min-w-0 accent-[var(--brand)]"}),e.jsxs("span",{className:"text-label text-ink-muted tabular-nums w-10 text-right","data-testid":"tts-speed-value",children:[Number(k).toFixed(2),"x"]})]})}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.speech.asr_title")}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsx("button",{onClick:()=>{ve("local"),me(!1),te(!1)},"data-testid":"asr-engine-local","aria-pressed":N==="local",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${N==="local"?R:F}`,children:t("settings.speech.asr_engine.local")}),e.jsx("button",{onClick:()=>{me(s=>!s),U||te(!1)},"data-testid":"asr-engine-custom","aria-pressed":N.startsWith("custom-")||U,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${N.startsWith("custom-")||U?R:F}`,children:t("settings.speech.engine.custom")}),Be&&e.jsxs("button",{disabled:!0,"data-testid":"asr-engine-groq",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Groq · ",t("settings.speech.legacy")]}),qe&&e.jsxs("button",{disabled:!0,"data-testid":"asr-engine-azure",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Azure · ",t("settings.speech.legacy")]})]}),N==="local"?e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_engine.local_note")}):N.startsWith("custom-")&&e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_engine.custom_note")})]}),N==="local"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.model")}),e.jsx("select",{value:H,onChange:s=>{Q(s.target.value),i.setSetting("asr_local_model",s.target.value)},"data-testid":"asr-model-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:["asr-whisper-turbo","asr-whisper-small"].map(s=>e.jsxs("option",{value:s,children:[Ie(s)," · ",Ee(Te(s))]},s))})]}),e.jsx("div",{className:v(!1),children:Me(H)})]}),U&&e.jsx("div",{className:v(!1),children:e.jsxs("div",{className:"space-y-3",children:[se&&Le(se,"asr",f,J,He),!se&&Ne.map(s=>e.jsxs("button",{onClick:()=>ve(s.id),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`asr-pick-${s.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:s.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:s.defaultModel})]},s.id)),(fe||!se&&Ne.length===0)&&e.jsx(we,{kind:"asr",showProtocol:!1,testPrefix:"asr-custom",titleKey:"settings.custom.form_title_asr",modelPhKey:"settings.custom.model_ph_asr",testOverride:s=>i.testCustomAsr({baseUrl:s.baseUrl,apiKey:s.apiKey||void 0,model:s.model}),onSaved:s=>{ve(s.id),te(!1),q()},onCancel:()=>te(!1)}),(se||Ne.length>0)&&e.jsx("button",{onClick:()=>te(s=>!s),className:"text-label text-accent hover:underline",children:t(fe?"action.cancel":"settings.custom.new")})]})}),e.jsxs("div",{className:v(!0),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:re,onChange:()=>{const s=!re;ge(s),i.setSetting("asr_auto_stop",s?"1":"0")},label:t("settings.speech.asr_auto_stop"),testid:"asr-auto-stop-toggle"}),e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.speech.asr_auto_stop")})]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_ux_note")})]}),d&&e.jsx("div",{className:"px-4 py-3 text-label text-warning break-all",role:"alert",children:d==="engine-unavailable"?t("chat.speech.engine_unavailable"):d})]})}export{wt as SettingsView};
6
+ */const ct=st("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]),xe="bg-ink/[0.04] text-ink-strong text-label rounded-lg border border-transparent focus:border-accent focus:bg-ink/[0.06] transition-colors placeholder:text-ink-faint";function ye({kind:t,showProtocol:x=!0,testPrefix:b="custom",titleKey:p="settings.custom.form_title",modelPhKey:c="settings.custom.model_ph",testOverride:d,onSaved:r,onCancel:h}){const m=de(),[j,T]=a.useState(""),[g,S]=a.useState("openai-compatible"),[k,P]=a.useState(""),[o,_]=a.useState(""),[w,W]=a.useState(""),[B,V]=a.useState(!1),[I,D]=a.useState(!1),[A,z]=a.useState(null),L=async()=>{if(!(!k.trim()||!w.trim()||I)){D(!0),z(null);try{const l=d?await d({baseUrl:k.trim(),apiKey:o.trim(),model:w.trim()}):await i.testCustomProvider({label:j||m("settings.custom.test_label"),protocol:g,baseUrl:k.trim(),apiKey:o.trim()||void 0,defaultModel:w.trim()});z({ok:l.ok,detail:l.detail})}catch(l){z({ok:!1,detail:l instanceof Error?l.message:String(l)})}finally{D(!1)}}},N=async()=>{if(!(!j.trim()||!k.trim()||!w.trim()))try{const l=await i.createCustomProvider({label:j.trim(),kind:t,protocol:x?g:"openai-compatible",baseUrl:k.trim(),apiKey:o.trim()||void 0,defaultModel:w.trim(),vision:t==="llm"?B:void 0});r(l)}catch{}};return e.jsxs("div",{className:"space-y-2.5","data-testid":`${b}-provider-form`,children:[e.jsx("div",{className:"text-label font-bold text-ink-strong",children:m(p)}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:j,onChange:l=>T(l.target.value),placeholder:m("settings.custom.label_ph"),"data-testid":`${b}-label`,className:`${xe} flex-1 px-2.5 py-1.5`}),x&&e.jsxs("select",{value:g,onChange:l=>S(l.target.value),"data-testid":`${b}-protocol`,className:`${xe} px-2 py-1.5`,children:[e.jsx("option",{value:"openai-compatible",children:m("settings.proto.openai")}),e.jsx("option",{value:"anthropic",children:"Anthropic"}),e.jsx("option",{value:"google",children:"Google"})]})]}),e.jsx("input",{type:"text",value:k,onChange:l=>P(l.target.value),placeholder:m("settings.custom.baseurl_ph"),"data-testid":`${b}-baseurl`,className:`${xe} w-full px-2.5 py-1.5 font-mono`}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:w,onChange:l=>W(l.target.value),placeholder:m(c),"data-testid":`${b}-model`,className:`${xe} flex-1 px-2.5 py-1.5 font-mono`}),e.jsx("input",{type:"password",value:o,onChange:l=>_(l.target.value),placeholder:m("settings.custom.apikey_ph"),"data-testid":`${b}-apikey`,className:`${xe} flex-1 px-2.5 py-1.5`})]}),t==="llm"&&e.jsxs("label",{className:"inline-flex items-center gap-2 text-label cursor-pointer select-none","data-testid":`${b}-vision`,children:[e.jsx("input",{type:"checkbox",checked:B,onChange:l=>V(l.target.checked),className:"w-4 h-4 rounded accent-brand"}),e.jsx("span",{className:"text-ink-strong",children:m("settings.custom.vision")}),e.jsx("span",{className:"text-ink-faint",children:m("settings.custom.visionHint")})]}),A&&e.jsxs("div",{className:`text-label rounded p-2 inline-flex items-start gap-1.5 ${A.ok?"bg-brand/10 text-brand":"bg-warning/10 text-warning"}`,children:[A.ok?e.jsx(ne,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"break-words",children:A.detail})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:()=>void L(),disabled:!k.trim()||!w.trim()||I,"data-testid":`${b}-test`,className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:m(I?"settings.testing":"settings.test")}),e.jsx("button",{onClick:()=>void N(),disabled:!j.trim()||!k.trim()||!w.trim(),"data-testid":`${b}-save`,className:"btn-3d-brand px-3 py-1.5 text-label disabled:opacity-40",children:m("settings.custom.save")}),h&&e.jsx("button",{onClick:h,className:"text-label text-ink-muted hover:text-ink-strong px-3 py-1.5 transition-colors",children:m("action.cancel")})]})]})}const We="lookatstudy-theme",Ke="auto",Ue="(prefers-color-scheme: dark)";function _e(){return typeof window>"u"||window.matchMedia(Ue).matches?"dark":"light"}function mt(){if(typeof localStorage>"u")return Ke;const t=localStorage.getItem(We);return t==="auto"||t==="light"||t==="dark"?t:Ke}function Ce(t){const x=document.documentElement;x.classList.remove("dark","light"),x.classList.add(t),window.dispatchEvent(new CustomEvent("theme-changed",{detail:{resolved:t}}))}function ut(){const[t,x]=a.useState(()=>mt()),[b,p]=a.useState(()=>t==="auto"?_e():t),c=a.useCallback(d=>{x(d),localStorage.setItem(We,d);const r=d==="auto"?_e():d;p(r),Ce(r)},[]);return a.useEffect(()=>{if(t!=="auto")return;const d=window.matchMedia(Ue),r=h=>{const m=h.matches?"dark":"light";p(m),Ce(m)};return d.addEventListener("change",r),()=>d.removeEventListener("change",r)},[t]),a.useEffect(()=>{const d=t==="auto"?_e():t;p(d),Ce(d)},[t]),{mode:t,resolved:b,setMode:c}}const xt="0.26.0",ht={version:xt};function we(){window.dispatchEvent(new Event(rt))}const G="bg-surface-1 text-ink text-body rounded-lg border border-[var(--border)] focus:border-brand focus:outline-none transition-colors placeholder:text-ink-faint",F="bg-surface-3 text-ink-muted hover:bg-surface-3 hover:bg-surface-3 hover:text-ink-strong",R="bg-brand text-white shadow-sm";function v(t){return t?"px-4 py-3.5 border-t border-[var(--border-faint)]":"px-4 py-3.5"}function yt(){const t=de(),[x,b]=a.useState([]),[p,c]=a.useState([]),[d,r]=a.useState("glm"),[h,m]=a.useState(""),[j,T]=a.useState(""),[g,S]=a.useState(null),[k,P]=a.useState(!1),[o,_]=a.useState(null),[w,W]=a.useState(!1),[B,V]=a.useState(!1),[I,D]=a.useState([]),[A,z]=a.useState(!1),[L,N]=a.useState(null),[l,H]=a.useState(null),[Q,re]=a.useState(""),[ge,ce]=a.useState(!1),ee=ut(),ie=async n=>{if($)try{await i.updateCustomProvider($.id,{vision:n}),await U()}catch{}},le=async()=>{z(!0),N(null);try{const n=await i.discoverModels();n.ok&&n.models?D(n.models):N(n.error||t("settings.discover_failed"))}catch(n){N(n instanceof Error?n.message:String(n))}finally{z(!1)}},U=a.useCallback(async()=>{try{const[n,f,E,J]=await Promise.all([i.getProviderPresets(),i.listCustomProviders(),i.getSetting("active_provider"),i.getSetting("active_model")]);b(n),c(f);const M=E??"glm";if(r(M),M.startsWith("custom-")){const y=f.find(C=>C.id===M);S(y!=null&&y.hasApiKey?t("settings.key.configured"):null)}else{const y=n.find(C=>C.id===M);if(y){const C=await i.getSetting(y.apiKeySetting);S(C?`${C.slice(0,4)}…${C.slice(-4)}`:null)}}if(M.startsWith("custom-")){const y=f.find(C=>C.id===M);m(J??(y==null?void 0:y.defaultModel)??"")}else{const y=n.find(C=>C.id===M);m(J??(y==null?void 0:y.defaultModel)??"")}}catch(n){console.error("[SettingsView] load() failed:",n)}},[t]);a.useEffect(()=>{U()},[U]);const me=async n=>{r(n),_(null),T("");const f=x.find(E=>E.id===n);if(f){const E=await i.getSetting(f.apiKeySetting);S(E?`${E.slice(0,4)}…${E.slice(-4)}`:null),m(h||f.defaultModel)}},pe=async()=>{W(!1);try{if(await i.setSetting("active_provider",d),await i.setSetting("active_model",h),j.trim()){const n=x.find(f=>f.id===d);n&&(await i.setSetting(n.apiKeySetting,j.trim()),S(`${j.trim().slice(0,4)}…${j.trim().slice(-4)}`),T(""))}W(!0),setTimeout(()=>W(!1),2e3),window.dispatchEvent(new Event("llm-config-changed"))}catch{}},O=async()=>{P(!0),_(null);try{const n=await i.testLlmConnection();_(n)}catch(n){_({ok:!1,detail:n instanceof Error?n.message:String(n),errorKind:"unknown"})}finally{P(!1)}},fe=async n=>{await i.setSetting("active_provider",n.id),await i.setSetting("active_model",n.defaultModel),r(n.id),m(n.defaultModel),V(!1),await U(),window.dispatchEvent(new Event("llm-config-changed"))},te=async n=>{try{await i.deleteCustomProvider(n),d===n&&(await i.setSetting("active_provider","glm"),r("glm")),await U()}catch{}},$=d.startsWith("custom-")?p.find(n=>n.id===d):null;a.useEffect(()=>{if(!$)return;const n=$.models.find(f=>f.id===h);re(n!=null&&n.contextWindow?String(n.contextWindow):"")},[$,h]);const be=async()=>{var M,y;if(!$)return;const n=Q.trim().replace(/[,\s_]/g,""),f=/^(\d+)([km]?)$/i.exec(n);if(n!==""&&!f)return;const E=((M=f==null?void 0:f[2])==null?void 0:M.toLowerCase())==="k"?1e3:((y=f==null?void 0:f[2])==null?void 0:y.toLowerCase())==="m"?1e6:1,J=n===""||!f?null:Math.max(1,Math.round(parseInt(f[1],10)*E));ce(!0);try{const C=$.models.map(q=>q.id===h?{...q,contextWindow:J}:q);await i.updateCustomProvider($.id,{models:C}),await U(),window.dispatchEvent(new Event("llm-config-changed"))}catch{}finally{ce(!1)}},Y=d.startsWith("custom-")?null:x.find(n=>n.id===d);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-5 pt-5 space-y-6",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.ai")}),e.jsxs("div",{className:"surface-card overflow-hidden",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.provider")}),e.jsxs("div",{className:"flex flex-wrap gap-1.5","data-testid":"provider-grid",children:[x.map(n=>e.jsx("button",{onClick:()=>me(n.id),"data-testid":`provider-card-${n.id}`,"aria-pressed":d===n.id,className:`px-3 py-1.5 rounded-lg text-label font-medium whitespace-nowrap transition-colors ${d===n.id?R:F}`,children:n.label},n.id)),p.filter(n=>n.kind==="llm").map(n=>e.jsxs("button",{onClick:()=>me(n.id),"data-testid":`provider-card-${n.id}`,"aria-pressed":d===n.id,className:`px-3 py-1.5 rounded-lg text-label font-medium whitespace-nowrap transition-colors inline-flex items-center gap-1 ${d===n.id?R:F}`,children:[e.jsx($e,{className:"w-3.5 h-3.5","aria-hidden":"true"}),n.label]},n.id)),e.jsxs("button",{onClick:()=>V(n=>!n),"data-testid":"add-custom-provider",className:"px-3 py-1.5 rounded-lg text-label whitespace-nowrap inline-flex items-center gap-1 border border-dashed border-[var(--border)] text-ink-muted hover:border-ink-muted hover:text-ink-strong transition-colors",children:[e.jsx(nt,{className:"w-3.5 h-3.5","aria-hidden":"true"}),t("settings.add_custom")]})]})]}),B&&e.jsx("div",{className:"px-4 py-3.5 bg-surface-1 border-t border-[var(--border-faint)]",children:e.jsx(ye,{kind:"llm",testPrefix:"custom",onSaved:n=>void fe(n),onCancel:()=>V(!1)})}),p.length>0&&d.startsWith("custom-")&&e.jsx("div",{className:v(!0),children:e.jsx("button",{onClick:n=>{const f=n.currentTarget.getBoundingClientRect(),E=p.find(J=>J.id===d);E&&H({id:E.id,label:E.label,rect:f})},className:"text-label text-warning hover:underline",children:t("settings.delete_custom")})}),Y&&e.jsxs(e.Fragment,{children:[Y.baseUrl&&e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:"Base URL"}),e.jsx("code",{className:"text-label text-ink-faint font-mono break-all",children:Y.baseUrl})]}),e.jsxs("div",{className:v(!0),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.model")}),e.jsxs("div",{className:"flex-1 flex items-center gap-2",children:[e.jsxs("select",{value:h,onChange:n=>m(n.target.value),"data-testid":"model-select",className:`${G} flex-1 px-2.5 py-1.5`,children:[Y.models.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id)),d==="openrouter"&&I.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id))]}),d==="openrouter"&&e.jsxs("button",{onClick:le,disabled:A,"data-testid":"discover-models-btn",className:"text-label text-accent hover:underline disabled:opacity-40 whitespace-nowrap inline-flex items-center gap-1",children:[e.jsx(ct,{className:`w-3.5 h-3.5 ${A?"animate-spin":""}`,"aria-hidden":"true"}),t(A?"settings.discovering":"settings.refresh")]})]})]}),L&&e.jsx("div",{className:"text-label text-warning mt-1.5 ml-[68px]",children:L})]}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.apikey")}),e.jsxs("div",{className:"flex-1 flex items-center gap-2",children:[g&&e.jsxs("span",{className:"text-label text-brand shrink-0 inline-flex items-center gap-1",children:[e.jsx(ne,{className:"w-3.5 h-3.5","aria-hidden":"true"}),g]}),e.jsx("input",{type:"password",value:j,onChange:n=>T(n.target.value),placeholder:t(g?"settings.key.overwrite_ph":"settings.key.paste_ph"),"data-testid":"settings-key-input",className:`${G} flex-1 px-2.5 py-1.5`}),e.jsx("a",{href:Y.keyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-label text-brand hover:underline whitespace-nowrap",children:t("settings.key.get")})]})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 min-w-0",children:[e.jsx("button",{onClick:O,disabled:k,"data-testid":"test-connection-btn",className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:t(k?"settings.testing":"settings.test")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 min-w-0 break-words ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4 shrink-0","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4 shrink-0","aria-hidden":"true"}),o.detail]})]})})]}),$&&!Y&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:"Base URL"}),e.jsx("code",{className:"text-label text-ink-faint font-mono break-all",children:$.baseUrl})]}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.model")}),$.models.length>1?e.jsx("select",{value:h,onChange:n=>m(n.target.value),"data-testid":"model-select-custom",className:`${G} flex-1 px-2.5 py-1.5`,children:$.models.map(n=>e.jsx("option",{value:n.id,children:n.id},n.id))}):e.jsx("input",{type:"text",value:h,onChange:n=>m(n.target.value),placeholder:t("settings.custom.model_ph"),"data-testid":"model-input-custom",className:`${G} flex-1 px-2.5 py-1.5 font-mono`})]})}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.custom.windowLabel")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",inputMode:"numeric",value:Q,onChange:n=>re(n.target.value),placeholder:t("settings.custom.windowPh"),"data-testid":"context-window-input",className:`${G} flex-1 px-2.5 py-1.5 font-mono tabular-nums`}),e.jsx("button",{onClick:be,disabled:ge,"data-testid":"context-window-save",className:"btn-3d-neutral px-3 py-1.5 text-label shrink-0 disabled:opacity-40",children:t("settings.custom.save")})]}),e.jsx("div",{className:"text-caption text-ink-faint mt-1",children:t("settings.custom.windowHint")})]}),e.jsx("div",{className:v(!0),children:e.jsxs("label",{className:"inline-flex items-center gap-2 text-label cursor-pointer select-none","data-testid":"custom-vision-toggle",children:[e.jsx("input",{type:"checkbox",checked:$.vision,onChange:n=>void ie(n.target.checked),className:"w-4 h-4 rounded accent-brand"}),e.jsx("span",{className:"text-ink-strong",children:t("settings.custom.vision")}),e.jsx("span",{className:"text-ink-faint",children:t("settings.custom.visionHint")})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 min-w-0",children:[e.jsx("button",{onClick:O,disabled:k,"data-testid":"test-connection-btn",className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:t(k?"settings.testing":"settings.test")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 min-w-0 break-words ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4 shrink-0","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4 shrink-0","aria-hidden":"true"}),o.detail]})]})})]})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.vision")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(pt,{activeProvider:d,activeModel:h,presets:x,customProviders:p})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.speech")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(Nt,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.memory")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(ft,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.companion")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsx(bt,{})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.appearance")}),e.jsxs("div",{className:"surface-card overflow-hidden",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.theme")}),e.jsx("div",{className:"flex gap-2",children:[{mode:"auto",label:t("settings.theme.auto")},{mode:"light",label:t("settings.theme.light")},{mode:"dark",label:t("settings.theme.dark")}].map(({mode:n,label:f})=>e.jsx("button",{onClick:()=>ee.setMode(n),"data-testid":`theme-${n}`,"aria-pressed":ee.mode===n,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${ee.mode===n?R:F}`,children:f},n))}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:ee.mode==="auto"?t("settings.theme.following",{mode:t(`settings.theme.${ee.resolved}`)}):null})]}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.interface_lang")}),e.jsx("div",{className:"flex gap-2",children:["zh-CN","en"].map(n=>e.jsx("button",{onClick:()=>at(n),"data-testid":`lang-${n}`,"aria-pressed":ze()===n,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${ze()===n?R:F}`,children:n==="zh-CN"?"中文":"English"},n))})]}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.row.import_lang")}),e.jsx(gt,{})]})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-label font-bold text-ink-muted mb-2 px-1",children:t("settings.group.about")}),e.jsx("div",{className:"surface-card overflow-hidden",children:e.jsxs("div",{className:v(!1),children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong",children:t("settings.row.version")}),e.jsxs("a",{href:"https://github.com/Kaiji-Z/LookatStudy/releases",target:"_blank",rel:"noopener noreferrer",className:"text-label font-mono text-brand hover:underline","data-testid":"settings-version",children:["v",ht.version]})]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.version.hint")})]})})]})]}),e.jsxs("div",{className:"sticky bottom-0 px-5 py-3 bg-surface-0 border-t border-[var(--border)] flex items-center justify-between gap-3",children:[e.jsx("span",{className:"text-label text-ink-muted",children:t("settings.footer.hint")}),e.jsxs("button",{onClick:pe,"data-testid":"settings-save",className:"btn-3d-brand px-5 py-2 text-body inline-flex items-center gap-1.5",children:[w&&e.jsx(it,{className:"w-4 h-4","aria-hidden":"true"}),t(w?"settings.saved_text":"settings.footer.save")]})]}),l&&e.jsx(lt,{anchorRect:l.rect,message:t("settings.delete_custom_confirm",{name:l.label}),danger:!0,confirmLabel:t("action.delete"),testid:"custom-provider-delete-confirm",onConfirm:()=>{te(l.id),H(null)},onCancel:()=>H(null)})]})}function gt(){const[t,x]=a.useState("en"),[b,p]=a.useState(!1);a.useEffect(()=>{i.getSetting("pref_lang").then(r=>{r&&x(r),p(!0)})},[]);const c=async r=>{x(r),await i.setSetting("pref_lang",r)},d=[{code:"en",label:"English"},{code:"zh-CN",label:"简体中文"},{code:"zh-TW",label:"繁體中文"}];return b?e.jsx("div",{className:"flex gap-2","data-testid":"pref-lang-options",children:d.map(r=>e.jsx("button",{onClick:()=>c(r.code),"data-testid":`pref-lang-${r.code}`,"aria-pressed":t===r.code,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${t===r.code?R:F}`,children:r.label},r.code))}):null}function pt({activeProvider:t,activeModel:x,presets:b,customProviders:p}){const c=de(),[d,r]=a.useState(!1),[h,m]=a.useState(!1),[j,T]=a.useState(""),[g,S]=a.useState(!1),[k,P]=a.useState(!1),[o,_]=a.useState(null),[w,W]=a.useState(!1);a.useEffect(()=>{Promise.all([i.getSetting("flag_multimodal_import"),i.getSetting("vision_provider_override"),i.getSetting("vision_model_override"),i.getSetting("flag_math_vision")]).then(([l,H,Q])=>{r(l==="true"),T(H??""),W(Q==="true"),m(!0)})},[]);const B=async()=>{const l=!d;r(l),await i.setSetting("flag_multimodal_import",String(l))},V=async()=>{const l=!w;W(l),await i.setSetting("flag_math_vision",String(l))},I=async l=>{await i.setSetting("vision_provider_override",l.id),await i.setSetting("vision_model_override",l.defaultModel),T(l.id),S(!1)},D=async()=>{await i.setSetting("vision_provider_override",""),await i.setSetting("vision_model_override",""),T(""),S(!1)},A=async()=>{if(!k){P(!0),_(null);try{const l=await i.testLlmConnection({vision:!0});_({ok:l.ok,detail:l.detail})}catch(l){_({ok:!1,detail:l instanceof Error?l.message:String(l)})}finally{P(!1)}}},z=p.filter(l=>l.kind==="vision"),L=j.startsWith("custom-")?p.find(l=>l.id===j):null,N=j&&!j.startsWith("custom-")?b.find(l=>l.id===j):null;return h?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-4 py-3.5 flex items-center gap-3",children:[e.jsx(ae,{checked:d,onChange:B,label:c("settings.multimodal.toggle"),testid:"multimodal-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:c("settings.multimodal.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:c("settings.multimodal.toggle.desc")})]})]}),e.jsxs("div",{className:"px-4 py-3.5 border-t border-[var(--border-faint)] space-y-3",children:[e.jsxs("div",{className:"text-label text-ink-muted bg-ink/5 rounded-lg p-3",children:[e.jsx("div",{className:"font-medium mb-1",children:c("settings.multimodal.current_model",{model:x||c("settings.multimodal.not_selected")})}),e.jsx("div",{children:t.startsWith("custom-")?c("settings.multimodal.hint_custom"):c("settings.multimodal.hint_preset")})]}),e.jsxs("div",{className:"bg-ink/5 rounded-lg p-3",children:[e.jsx("div",{className:"text-label font-medium text-ink-muted mb-2",children:c("settings.multimodal.override_title")}),e.jsx("div",{className:"text-caption text-ink-muted mb-2",children:c("settings.multimodal.override_bridge_hint")}),e.jsxs("div",{className:"space-y-3 mt-1",children:[L&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx($e,{className:"w-3.5 h-3.5 text-ink-faint shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium text-ink-strong",children:L.label}),e.jsx("code",{className:"text-ink-faint font-mono break-all",children:L.defaultModel}),e.jsx("span",{className:"text-ink-faint break-all min-w-0",children:L.baseUrl})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{onClick:()=>void A(),disabled:k,"data-testid":"vision-override-test",className:"btn-3d-neutral px-4 py-1.5 text-label disabled:opacity-50",children:c(k?"settings.testing":"settings.multimodal.test_override")}),e.jsx("button",{onClick:()=>S(l=>!l),className:"text-label text-accent hover:underline",children:c("settings.multimodal.replace_custom")}),e.jsx("button",{onClick:()=>void D(),className:"text-label text-ink-muted hover:text-ink-strong",children:c("settings.multimodal.stop_override")}),o&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${o.ok?"text-brand":"text-warning"}`,children:[o.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),o.detail]})]})]}),N&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx("span",{className:"text-ink-muted",children:c("settings.multimodal.legacy_preset",{label:N.label})}),e.jsx("button",{onClick:()=>void D(),className:"text-label text-ink-muted hover:text-ink-strong underline",children:c("settings.multimodal.stop_override")})]}),!L&&!N&&e.jsxs(e.Fragment,{children:[z.map(l=>e.jsxs("button",{onClick:()=>void I(l),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`vision-pick-${l.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:l.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:l.defaultModel})]},l.id)),(g||z.length===0)&&e.jsx(ye,{kind:"vision",testPrefix:"vision-custom",titleKey:"settings.custom.form_title_vision",modelPhKey:"settings.custom.model_ph_vision",onSaved:l=>void I(l),onCancel:()=>S(!1)}),z.length>0&&e.jsx("button",{onClick:()=>S(l=>!l),className:"text-label text-accent hover:underline",children:c(g?"action.cancel":"settings.custom.new")})]})]})]}),e.jsxs("div",{className:"bg-ink/5 rounded-lg p-3 flex items-center gap-3",children:[e.jsx(ae,{checked:w,onChange:V,label:c("settings.mathvision.toggle"),testid:"math-vision-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong",children:c("settings.mathvision.toggle")}),e.jsx("div",{className:"text-caption text-ink-muted",children:c("settings.mathvision.desc")})]})]})]})]}):null}function ft(){const t=de(),[x,b]=a.useState(!1),[p,c]=a.useState(!1);a.useEffect(()=>{i.getSetting("flag_memory_system").then(r=>{b(r==="true"),c(!0)})},[]);const d=async()=>{const r=!x;b(r),await i.setSetting("flag_memory_system",String(r))};return p?e.jsxs("div",{className:"px-4 py-3.5 flex items-center gap-3",children:[e.jsx(ae,{checked:x,onChange:d,label:t("settings.memory.toggle"),testid:"memory-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.memory.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.memory.toggle.desc")})]})]}):null}function bt(){const t=de(),[x,b]=a.useState(!0),[p,c]=a.useState(!1),d=a.useSyncExternalStore(Ze,Qe),[r,h]=a.useState(!0),[m,j]=a.useState(!1),T=typeof window<"u"&&!!window.__lookatstudyWeb;a.useEffect(()=>{i.getSetting("companion_enabled").then(o=>{b(o!=="false"&&o!=="0"),c(!0)}),i.getSetting("companion_sfx").then(o=>{h(o!=="false"&&o!=="0")}),i.getSetting("companion_pet_mode").then(o=>{j(o==="1")})},[]);const g=async()=>{const o=!x;b(o),await i.setSetting("companion_enabled",String(o)),window.dispatchEvent(new Event("companion-config-changed"))},S=async()=>{const o=!r;h(o),await i.setSetting("companion_sfx",String(o)),window.dispatchEvent(new Event("companion-config-changed"))},k=async()=>{const o=!m;j(o),await i.setSetting("companion_pet_mode",o?"1":"0"),window.dispatchEvent(new Event("companion-config-changed"))},P=async o=>{o!==d.form&&(await i.setSetting("companion_form",o),window.dispatchEvent(new Event("companion-config-changed")))};return p?e.jsxs("div",{className:"px-4 py-3.5 flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:x,onChange:g,label:t("settings.companion.toggle"),testid:"companion-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.toggle")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.toggle.desc")})]})]}),x&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:r,onChange:S,label:t("settings.companion.sfx"),testid:"companion-sfx-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.sfx")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.sfx.desc")})]})]}),!T&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:m,onChange:k,label:t("settings.companion.pet"),testid:"companion-pet-toggle"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.companion.pet")}),e.jsx("div",{className:"text-label text-ink-muted",children:t("settings.companion.pet.desc")})]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-label text-ink-muted mb-2",children:t("settings.companion.form")}),e.jsx("div",{className:"flex flex-wrap gap-2",role:"radiogroup","aria-label":t("settings.companion.form"),children:et.map(o=>{const _=d.form===o;return e.jsxs("button",{type:"button",role:"radio","aria-checked":_,"data-testid":`companion-form-${o}`,onClick:()=>{P(o)},className:`flex flex-col items-center gap-0.5 rounded-xl p-1.5 border motion-safe:transition-colors
7
+ ${_?"border-[var(--accent)] bg-surface-2 shadow-card":"border-[var(--border-faint)] hover:bg-surface-2"}`,title:t(`companion.form.${o}.desc`),children:[e.jsx(tt,{form:o,expression:"happy",pose:"float",size:64}),e.jsx("span",{className:`text-label ${_?"text-ink-strong font-medium":"text-ink-muted"}`,children:t(`companion.form.${o}.name`)})]},o)})})]})]})]}):null}function ae({checked:t,onChange:x,label:b,testid:p}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":b,onClick:x,"data-testid":p,className:`relative w-12 h-6 rounded-full transition-colors shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand/60 focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-2)] ${t?"bg-brand":"bg-ink/20 hover:bg-ink/25"}`,children:e.jsx("span",{className:`absolute left-0.5 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full bg-white shadow transition-transform ${t?"translate-x-6":""}`})})}const vt=[{id:"zh-CN-XiaoxiaoNeural",label:"zh-CN · 晓晓(女)"},{id:"zh-CN-XiaoyiNeural",label:"zh-CN · 晓伊(女)"},{id:"zh-CN-YunxiNeural",label:"zh-CN · 云希(男)"},{id:"zh-CN-YunyangNeural",label:"zh-CN · 云扬(男·新闻)"},{id:"zh-CN-liaoning-XiaobeiNeural",label:"zh-CN · 晓北(女·东北)"},{id:"zh-CN-shaanxi-XiaoniNeural",label:"zh-CN · 晓妮(女·陕西)"},{id:"en-US-AriaNeural",label:"en-US · Aria(女)"},{id:"en-US-GuyNeural",label:"en-US · Guy(男)"},{id:"en-US-JennyNeural",label:"en-US · Jenny(女)"}],jt=[{sid:"45",label:"zf_xiaobei(女)"},{sid:"46",label:"zf_xiaoni(女)"},{sid:"47",label:"zf_xiaoxiao(女)"},{sid:"48",label:"zf_xiaoyi(女·默认)"},{sid:"49",label:"zm_yunjian(男)"},{sid:"50",label:"zm_yunxi(男)"},{sid:"51",label:"zm_yunxia(男)"},{sid:"52",label:"zm_yunyang(男)"}];function Nt(){const t=de(),[x,b]=a.useState([]),[p,c]=a.useState(null),[d,r]=a.useState(null),[h,m]=a.useState(null),[j,T]=a.useState(null),[g,S]=a.useState("edge"),[k,P]=a.useState("zh-CN-XiaoxiaoNeural"),[o,_]=a.useState("48"),[w,W]=a.useState("1.0"),[B,V]=a.useState(""),[I,D]=a.useState(""),[A,z]=a.useState([]),L=typeof window<"u"&&"speechSynthesis"in window,[N,l]=a.useState("local"),[H,Q]=a.useState("asr-whisper-turbo"),[re,ge]=a.useState(!0),[ce,ee]=a.useState([]),[ie,le]=a.useState(!1),[U,me]=a.useState(!1),[pe,O]=a.useState(!1),[fe,te]=a.useState(!1),[$,be]=a.useState(!1),[Y,n]=a.useState(null),[f,E]=a.useState(!1),[J,M]=a.useState(null),[y,C]=a.useState(null),q=a.useCallback(()=>{i.listCustomProviders().then(s=>ee(s.filter(u=>u.kind==="tts"||u.kind==="asr"))).catch(()=>{})},[]);a.useEffect(()=>{Promise.all([i.getSetting("tts_engine"),i.getSetting("tts_voice_edge"),i.getSetting("tts_sid_local"),i.getSetting("tts_speed"),i.getSetting("tts_custom_voice"),i.getSetting("tts_system_voice"),i.getSetting("asr_engine"),i.getSetting("asr_local_model"),i.getSetting("asr_auto_stop")]).then(([s,u,K,X,ke,Pe,Ae,Se,Je])=>{s&&S(s),u&&P(u),K&&_(K),X&&W(X),ke&&V(ke),Pe&&D(Pe),Ae&&l(Ae),(Se==="asr-whisper-turbo"||Se==="asr-whisper-small")&&Q(Se),ge(Je!=="0")}),q()},[q]),a.useEffect(()=>{if(typeof window>"u"||!("speechSynthesis"in window))return;const s=()=>z(dt(window.speechSynthesis.getVoices()));return s(),window.speechSynthesis.addEventListener("voiceschanged",s),()=>window.speechSynthesis.removeEventListener("voiceschanged",s)},[]);const ue=a.useCallback(()=>{window.api.getSpeechModelStatus().then(s=>b(s)).catch(()=>{})},[]);a.useEffect(()=>(ue(),window.api.on("speech:modelProgress",u=>{m({id:u.id,pct:Math.floor(u.progress*100),label:u.currentFile?u.currentFile.split("/").pop()??"":""})})),[ue]);const Fe=s=>{r(null),c(s),m({id:s,pct:0,label:""}),window.api.ensureSpeechModel(s).then(()=>{c(null),m(null),ue()}).catch(u=>{c(null),m(null),r(u instanceof Error?u.message:String(u)),ue()})},Re=s=>{c(s),T(null),window.api.deleteSpeechModel(s).then(ue).catch(u=>r(u instanceof Error?u.message:String(u))).finally(()=>c(null))},Ve=s=>t(s==="tts-kokoro"?"settings.speech.model.tts":s==="asr-whisper-turbo"?"settings.speech.model.asr_turbo":"settings.speech.model.asr_small"),Ie=s=>t(s==="asr-whisper-turbo"?"settings.speech.model.turbo_short":"settings.speech.model.small_short"),De=s=>s.startsWith("asr-whisper")?t("settings.speech.license_mit"):t("settings.speech.license"),Ee=s=>t(s==="ready"?"settings.speech.state.ready":s==="error"?"settings.speech.state.error":"settings.speech.state.absent"),Te=s=>{var u;return((u=x.find(K=>K.id===s))==null?void 0:u.state)??"absent"},oe=s=>{S(s),n(null),i.setSetting("tts_engine",s),we()},Oe=s=>{D(s),i.setSetting("tts_system_voice",s),we()},ve=s=>{l(s),M(null),i.setSetting("asr_engine",s)},je=ce.filter(s=>s.kind==="tts"),Ne=ce.filter(s=>s.kind==="asr"),Z=g.startsWith("custom-")?je.find(s=>s.id===g)??null:null,se=N.startsWith("custom-")?Ne.find(s=>s.id===N)??null:null,Ge=g==="azure",Be=N==="groq",qe=N==="azure",Xe=async()=>{if(!(!Z||$)){be(!0),n(null);try{n(await i.testCustomTts({providerId:Z.id}))}catch(s){n({ok:!1,detail:s instanceof Error?s.message:String(s)})}finally{be(!1)}}},He=async()=>{if(!(!se||f)){E(!0),M(null);try{M(await i.testCustomAsr({providerId:se.id}))}catch(s){M({ok:!1,detail:s instanceof Error?s.message:String(s)})}finally{E(!1)}}},Ye=async(s,u)=>{C(null);try{await i.deleteCustomProvider(s),u==="tts"&&g===s&&oe("edge"),u==="asr"&&N===s&&ve("local"),q()}catch{}},Me=s=>{const u=x.find(X=>X.id===s),K=(u==null?void 0:u.state)??"absent";return e.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-label font-medium text-ink-strong truncate",children:Ve(s)}),e.jsxs("div",{className:"text-caption text-ink-muted",children:[Ee(K)," · ",De(s)]}),p===s&&(h==null?void 0:h.id)===s&&e.jsx("div",{className:"mt-1.5 h-1.5 rounded-full bg-ink/[0.08] overflow-hidden","data-testid":`speech-dl-bar-${s}`,children:e.jsx("div",{className:"h-full bg-brand transition-all",style:{width:`${h.pct}%`}})}),p===s&&(h==null?void 0:h.id)===s&&e.jsxs("div",{className:"text-caption text-ink-faint mt-0.5","data-testid":`speech-dl-pct-${s}`,children:[h.pct,"%",h.label?` · ${h.label}`:""]})]}),K==="ready"?j===s?e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-caption text-warning",children:t("settings.speech.confirm_del")}),e.jsx("button",{onClick:()=>Re(s),className:"text-label text-warning hover:underline","data-testid":`speech-del-confirm-${s}`,children:t("settings.speech.delete")}),e.jsx("button",{onClick:()=>T(null),className:"text-label text-ink-muted hover:text-ink-strong",children:t("action.cancel")})]}):e.jsx("button",{onClick:()=>T(s),disabled:p===s,className:"text-label text-ink-muted hover:text-warning disabled:opacity-40","data-testid":`speech-del-${s}`,children:t("settings.speech.delete")}):e.jsx("button",{onClick:()=>Fe(s),disabled:p!=null||K==="downloading",className:"btn-3d-brand px-3 py-1 text-label disabled:opacity-40","data-testid":`speech-dl-${s}`,children:t(p===s||K==="downloading"?"settings.speech.downloading":"settings.speech.download")})]},s)},Le=(s,u,K,X,ke)=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-label",children:[e.jsx($e,{className:"w-3.5 h-3.5 text-ink-faint shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium text-ink-strong",children:s.label}),e.jsx("code",{className:"text-ink-faint font-mono break-all",children:s.defaultModel}),e.jsx("span",{className:"text-ink-faint break-all min-w-0",children:s.baseUrl}),s.hasApiKey&&e.jsxs("span",{className:"text-brand shrink-0 inline-flex items-center gap-0.5",children:[e.jsx(ne,{className:"w-3.5 h-3.5","aria-hidden":"true"}),t("settings.speech.key_saved")]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("button",{onClick:()=>void ke(),disabled:K,className:"btn-3d-neutral px-3 py-1 text-label disabled:opacity-40","data-testid":`${u}-custom-test`,children:t(K?"settings.testing":"settings.test")}),y===s.id?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-caption text-warning",children:t("settings.speech.confirm_del_custom")}),e.jsx("button",{onClick:()=>void Ye(s.id,u),className:"text-label text-warning hover:underline","data-testid":`${u}-custom-del-confirm`,children:t("settings.speech.delete")}),e.jsx("button",{onClick:()=>C(null),className:"text-label text-ink-muted hover:text-ink-strong",children:t("action.cancel")})]}):e.jsx("button",{onClick:()=>C(s.id),className:"text-label text-ink-muted hover:text-warning","data-testid":`${u}-custom-del`,children:t("settings.speech.delete")}),X&&e.jsxs("span",{className:`text-label inline-flex items-center gap-1 ${X.ok?"text-brand":"text-warning"}`,children:[X.ok?e.jsx(ne,{className:"w-4 h-4","aria-hidden":"true"}):e.jsx(he,{className:"w-4 h-4","aria-hidden":"true"}),X.detail]})]})]});return e.jsxs("div",{"data-testid":"settings-speech",children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.speech.tts_title")}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsx("button",{onClick:()=>{oe("edge"),le(!1),O(!1)},"data-testid":"tts-engine-edge","aria-pressed":g==="edge",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="edge"?R:F}`,children:t("settings.speech.engine.edge")}),e.jsxs("button",{onClick:()=>{oe("local"),le(!1),O(!1)},"data-testid":"tts-engine-local","aria-pressed":g==="local",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="local"?R:F}`,children:[t("settings.speech.engine.local"),Te("tts-kokoro")!=="ready"?` · ${t("settings.speech.state.absent")}`:""]}),e.jsx("button",{onClick:()=>{oe("system"),le(!1),O(!1)},disabled:!L,"data-testid":"tts-engine-system","aria-pressed":g==="system",title:L?void 0:t("settings.speech.engine.system_unavailable"),className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g==="system"?R:F} ${L?"":"opacity-40 cursor-not-allowed"}`,children:t("settings.speech.engine.system")}),e.jsx("button",{onClick:()=>{le(s=>!s),ie||O(!1)},"data-testid":"tts-engine-custom","aria-pressed":g.startsWith("custom-")||ie,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${g.startsWith("custom-")||ie?R:F}`,children:t("settings.speech.engine.custom")}),Ge&&e.jsxs("button",{disabled:!0,"data-testid":"tts-engine-azure",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Azure · ",t("settings.speech.legacy")]})]}),g==="edge"&&e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.engine.edge_note")})]}),g==="edge"&&e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("select",{value:k,onChange:s=>{P(s.target.value),i.setSetting("tts_voice_edge",s.target.value)},"data-testid":"tts-voice-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:vt.map(s=>e.jsx("option",{value:s.id,children:s.label},s.id))})]}),g==="local"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("select",{value:o,onChange:s=>{_(s.target.value),i.setSetting("tts_sid_local",s.target.value)},"data-testid":"tts-sid-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:jt.map(s=>e.jsx("option",{value:s.sid,children:s.label},s.sid))})]}),e.jsx("div",{className:v(!1),children:Me("tts-kokoro")})]}),g==="system"&&e.jsx(e.Fragment,{children:e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsxs("select",{value:I,onChange:s=>Oe(s.target.value),"data-testid":"tts-system-voice-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:[e.jsx("option",{value:"",children:t("settings.speech.voice_auto")}),A.map(s=>e.jsx("option",{value:s.name,children:ot(s)},s.voiceURI))]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.engine.system_note")})]})}),ie&&e.jsx("div",{className:v(!1),children:e.jsxs("div",{className:"space-y-3",children:[Z&&Le(Z,"tts",$,Y,Xe),Z&&e.jsxs("div",{children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.speech.voice")}),e.jsx("input",{type:"text",value:B,onChange:s=>V(s.target.value),onBlur:()=>void i.setSetting("tts_custom_voice",B.trim()),placeholder:t("settings.speech.custom_voice_ph"),"data-testid":"tts-custom-voice",className:`${G} w-full min-w-0 px-2.5 py-1.5 font-mono`})]}),!Z&&je.map(s=>e.jsxs("button",{onClick:()=>oe(s.id),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`tts-pick-${s.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:s.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:s.defaultModel})]},s.id)),(pe||!Z&&je.length===0)&&e.jsx(ye,{kind:"tts",showProtocol:!1,testPrefix:"tts-custom",titleKey:"settings.custom.form_title_tts",modelPhKey:"settings.custom.model_ph_tts",testOverride:s=>i.testCustomTts({baseUrl:s.baseUrl,apiKey:s.apiKey||void 0,model:s.model}),onSaved:s=>{oe(s.id),O(!1),q()},onCancel:()=>O(!1)}),(Z||je.length>0)&&e.jsx("button",{onClick:()=>O(s=>!s),className:"text-label text-accent hover:underline",children:t(pe?"action.cancel":"settings.custom.new")})]})}),e.jsx("div",{className:v(!0),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-label font-medium text-ink-strong shrink-0 w-14",children:t("settings.speech.speed")}),e.jsx("input",{type:"range",min:"0.5",max:"2",step:"0.05",value:w,onChange:s=>W(s.target.value),onPointerUp:()=>{i.setSetting("tts_speed",w),we()},onKeyUp:()=>{i.setSetting("tts_speed",w),we()},"data-testid":"tts-speed-range",className:"flex-1 min-w-0 accent-[var(--brand)]"}),e.jsxs("span",{className:"text-label text-ink-muted tabular-nums w-10 text-right","data-testid":"tts-speed-value",children:[Number(w).toFixed(2),"x"]})]})}),e.jsxs("div",{className:v(!0),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-2",children:t("settings.speech.asr_title")}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsx("button",{onClick:()=>{ve("local"),me(!1),te(!1)},"data-testid":"asr-engine-local","aria-pressed":N==="local",className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${N==="local"?R:F}`,children:t("settings.speech.asr_engine.local")}),e.jsx("button",{onClick:()=>{me(s=>!s),U||te(!1)},"data-testid":"asr-engine-custom","aria-pressed":N.startsWith("custom-")||U,className:`px-4 py-2 rounded-xl text-body font-bold transition-all ${N.startsWith("custom-")||U?R:F}`,children:t("settings.speech.engine.custom")}),Be&&e.jsxs("button",{disabled:!0,"data-testid":"asr-engine-groq",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Groq · ",t("settings.speech.legacy")]}),qe&&e.jsxs("button",{disabled:!0,"data-testid":"asr-engine-azure",className:"px-4 py-2 rounded-xl text-body font-bold opacity-50 cursor-not-allowed",children:["Azure · ",t("settings.speech.legacy")]})]}),N==="local"?e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_engine.local_note")}):N.startsWith("custom-")&&e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_engine.custom_note")})]}),N==="local"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:v(!1),children:[e.jsx("div",{className:"text-label font-medium text-ink-strong mb-1.5",children:t("settings.model")}),e.jsx("select",{value:H,onChange:s=>{Q(s.target.value),i.setSetting("asr_local_model",s.target.value)},"data-testid":"asr-model-select",className:`${G} w-full min-w-0 px-2.5 py-1.5`,children:["asr-whisper-turbo","asr-whisper-small"].map(s=>e.jsxs("option",{value:s,children:[Ie(s)," · ",Ee(Te(s))]},s))})]}),e.jsx("div",{className:v(!1),children:Me(H)})]}),U&&e.jsx("div",{className:v(!1),children:e.jsxs("div",{className:"space-y-3",children:[se&&Le(se,"asr",f,J,He),!se&&Ne.map(s=>e.jsxs("button",{onClick:()=>ve(s.id),className:"w-full text-left px-3 py-2 rounded-lg bg-surface-1 hover:bg-surface-3 transition-colors","data-testid":`asr-pick-${s.id}`,children:[e.jsx("span",{className:"text-label font-medium text-ink-strong",children:s.label}),e.jsx("span",{className:"text-label text-ink-faint font-mono break-all ml-2",children:s.defaultModel})]},s.id)),(fe||!se&&Ne.length===0)&&e.jsx(ye,{kind:"asr",showProtocol:!1,testPrefix:"asr-custom",titleKey:"settings.custom.form_title_asr",modelPhKey:"settings.custom.model_ph_asr",testOverride:s=>i.testCustomAsr({baseUrl:s.baseUrl,apiKey:s.apiKey||void 0,model:s.model}),onSaved:s=>{ve(s.id),te(!1),q()},onCancel:()=>te(!1)}),(se||Ne.length>0)&&e.jsx("button",{onClick:()=>te(s=>!s),className:"text-label text-accent hover:underline",children:t(fe?"action.cancel":"settings.custom.new")})]})}),e.jsxs("div",{className:v(!0),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ae,{checked:re,onChange:()=>{const s=!re;ge(s),i.setSetting("asr_auto_stop",s?"1":"0")},label:t("settings.speech.asr_auto_stop"),testid:"asr-auto-stop-toggle"}),e.jsx("div",{className:"text-body font-medium text-ink-strong",children:t("settings.speech.asr_auto_stop")})]}),e.jsx("p",{className:"text-label text-ink-muted mt-2",children:t("settings.speech.asr_ux_note")})]}),d&&e.jsx("div",{className:"px-4 py-3 text-label text-warning break-all",role:"alert",children:d==="engine-unavailable"?t("chat.speech.engine_unavailable"):d})]})}export{yt as SettingsView};
@@ -0,0 +1 @@
1
+ function o(e){for(var c=e.length/6|0,n=new Array(c),a=0;a<c;)n[a]="#"+e.slice(a*6,++a*6);return n}const r=o("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab");export{r as d};
@@ -1,4 +1,4 @@
1
- import{r as n,j as e}from"./index-C-4sKCSr.js";import{c as f,u as h,e as b,f as g}from"./main-D3HpSUyK.js";import{R as j}from"./rotate-ccw-C3k3pTDh.js";/**
1
+ import{r as n,j as e}from"./index-BNNZmZ7L.js";import{c as f,u as h,e as b,f as g}from"./main-Bkgg11ZB.js";import{R as j}from"./rotate-ccw-DPfbZXyQ.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -0,0 +1 @@
1
+ import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Dkt-zdDg.js";import{p as f}from"./chunk-JWPE2WC7-B_A1as9r.js";import{_ as n,l as o}from"./mermaid.core-D0rh4nEj.js";import"./transform-B5_amWNh.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-lYm8p8qp.js";import"./main-Bkgg11ZB.js";import"./index-BNNZmZ7L.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},I={parser:R,db:a,renderer:u,styles:p};export{I as diagram};
@@ -0,0 +1 @@
1
+ import{g as p,r as u,d as a}from"./chunk-XCWWM2C3-3YSDgOL-.js";import{p as f}from"./chunk-VII2H2IX-DBudi9Y-.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-GVF3BKWE-DrtBkvjj.js";import{_ as n,l as o}from"./render-O7CIS3YK-0coM2jiE.js";import"./transform-B5_amWNh.js";import"./mermaid-layout-elk.core-DDX9gcIM.js";import"./main-Bkgg11ZB.js";import"./index-BNNZmZ7L.js";import"./_commonjs-dynamic-modules-TDtrdbi3.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},D={parser:R,db:a,renderer:u,styles:p};export{D as diagram};
@@ -0,0 +1 @@
1
+ import{w as ln,p as an,c as G,a as j,b as z,h as un,e as g,t as tn,d as K,m as _,f as rn,g as o,i as on,j as sn,k as fn}from"./transform-B5_amWNh.js";function cn(l){return l.innerRadius}function gn(l){return l.outerRadius}function yn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,E,q,v,A,B,a){var I=E-l,i=q-h,n=B-v,d=a-A,u=d*I-n*i;if(!(u*u<g))return u=(n*(h-A)-d*(l-v))/u,[l+u*I,h+u*i]}function V(l,h,E,q,v,A,B){var a=l-E,I=h-q,i=(B?A:-A)/K(a*a+I*I),n=i*I,d=-i*a,u=l+n,s=h+d,f=E+n,c=q+d,C=(u+f)/2,t=(s+c)/2,m=f-u,y=c-s,R=m*m+y*y,T=v-A,P=u*c-f*s,O=(y<0?-1:1)*K(on(0,T*T*R-P*P)),S=(P*y-m*O)/R,k=(-P*m-y*O)/R,w=(P*y+m*O)/R,p=(-P*m+y*O)/R,x=S-C,e=k-t,r=w-C,F=p-t;return x*x+e*e>r*r+F*F&&(S=w,k=p),{cx:S,cy:k,x01:-n,y01:-d,x11:S*(v/T-1),y11:k*(v/T-1)}}function hn(){var l=cn,h=gn,E=z(0),q=null,v=yn,A=dn,B=mn,a=null,I=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,C=rn(c-f),t=c>f;if(a||(a=n=I()),s<u&&(d=s,s=u,u=d),!(s>g))a.moveTo(0,0);else if(C>tn-g)a.moveTo(s*G(f),s*j(f)),a.arc(0,0,s,f,c,!t),u>g&&(a.moveTo(u*G(c),u*j(c)),a.arc(0,0,u,c,f,t));else{var m=f,y=c,R=f,T=c,P=C,O=C,S=B.apply(this,arguments)/2,k=S>g&&(q?+q.apply(this,arguments):K(u*u+s*s)),w=_(rn(s-u)/2,+E.apply(this,arguments)),p=w,x=w,e,r;if(k>g){var F=sn(k/u*j(S)),L=sn(k/s*j(S));(P-=F*2)>g?(F*=t?1:-1,R+=F,T-=F):(P=0,R=T=(f+c)/2),(O-=L*2)>g?(L*=t?1:-1,m+=L,y-=L):(O=0,m=y=(f+c)/2)}var H=s*G(m),J=s*j(m),M=u*G(T),N=u*j(T);if(w>g){var Q=s*G(y),U=s*j(y),W=u*G(R),X=u*j(R),D;if(C<an)if(D=pn(H,J,W,X,Q,U,M,N)){var Y=H-D[0],Z=J-D[1],$=Q-D[0],b=U-D[1],nn=1/j(fn((Y*$+Z*b)/(K(Y*Y+Z*Z)*K($*$+b*b)))/2),en=K(D[0]*D[0]+D[1]*D[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}O>g?x>g?(e=V(W,X,H,J,s,x,t),r=V(Q,U,M,N,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(H,J),a.arc(0,0,s,m,y,!t)):a.moveTo(H,J),!(u>g)||!(P>g)?a.lineTo(M,N):p>g?(e=V(M,N,Q,U,u,-p,t),r=V(H,J,W,X,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[G(d)*n,j(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:z(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:z(+n),i):h},i.cornerRadius=function(n){return arguments.length?(E=typeof n=="function"?n:z(+n),i):E},i.padRadius=function(n){return arguments.length?(q=n==null?null:typeof n=="function"?n:z(+n),i):q},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:z(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:z(+n),i):A},i.padAngle=function(n){return arguments.length?(B=typeof n=="function"?n:z(+n),i):B},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};