claude-code-workflow 7.2.19 → 7.2.20

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 (196) hide show
  1. package/.claude/commands/workflow/analyze-with-file.md +33 -8
  2. package/.codex/skills/analyze-with-file/SKILL.md +55 -8
  3. package/ccw/frontend/dist/assets/{AlertDialog-zDuLRyN3.js → AlertDialog-Cukb0xv2.js} +2 -2
  4. package/ccw/frontend/dist/assets/{AlertDialog-zDuLRyN3.js.map → AlertDialog-Cukb0xv2.js.map} +1 -1
  5. package/ccw/frontend/dist/assets/{AnalysisPage-DGCGwIZY.js → AnalysisPage-Ddmv0J4x.js} +2 -2
  6. package/ccw/frontend/dist/assets/{AnalysisPage-DGCGwIZY.js.map → AnalysisPage-Ddmv0J4x.js.map} +1 -1
  7. package/ccw/frontend/dist/assets/{ApiSettingsPage-CgclCqmv.js → ApiSettingsPage-DMkrTZDX.js} +2 -2
  8. package/ccw/frontend/dist/assets/{ApiSettingsPage-CgclCqmv.js.map → ApiSettingsPage-DMkrTZDX.js.map} +1 -1
  9. package/ccw/frontend/dist/assets/{CliModeToggle-CbGH7qO4.js → CliModeToggle-DXenjpbe.js} +2 -2
  10. package/ccw/frontend/dist/assets/{CliModeToggle-CbGH7qO4.js.map → CliModeToggle-DXenjpbe.js.map} +1 -1
  11. package/ccw/frontend/dist/assets/{CliSessionSharePage-CJGlwyDw.js → CliSessionSharePage-B-ZIMqmX.js} +2 -2
  12. package/ccw/frontend/dist/assets/{CliSessionSharePage-CJGlwyDw.js.map → CliSessionSharePage-B-ZIMqmX.js.map} +1 -1
  13. package/ccw/frontend/dist/assets/{CliViewerPage-D-MHYyDt.js → CliViewerPage-9YxGyLxh.js} +2 -2
  14. package/ccw/frontend/dist/assets/{CliViewerPage-D-MHYyDt.js.map → CliViewerPage-9YxGyLxh.js.map} +1 -1
  15. package/ccw/frontend/dist/assets/{CodexLensPage-z6miX68P.js → CodexLensPage-B_uv5wdn.js} +2 -2
  16. package/ccw/frontend/dist/assets/{CodexLensPage-z6miX68P.js.map → CodexLensPage-B_uv5wdn.js.map} +1 -1
  17. package/ccw/frontend/dist/assets/{Collapsible-D5zS2wef.js → Collapsible-C2qk3yV0.js} +2 -2
  18. package/ccw/frontend/dist/assets/{Collapsible-D5zS2wef.js.map → Collapsible-C2qk3yV0.js.map} +1 -1
  19. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChcTwmAn.js → CommandsManagerPage-DBtaWxLB.js} +2 -2
  20. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChcTwmAn.js.map → CommandsManagerPage-DBtaWxLB.js.map} +1 -1
  21. package/ccw/frontend/dist/assets/{DeepWikiPage-Cv5LifSi.js → DeepWikiPage-d9K4_TgG.js} +2 -2
  22. package/ccw/frontend/dist/assets/{DeepWikiPage-Cv5LifSi.js.map → DeepWikiPage-d9K4_TgG.js.map} +1 -1
  23. package/ccw/frontend/dist/assets/{EndpointsPage-BcyNmqIa.js → EndpointsPage-DhW6hYrI.js} +2 -2
  24. package/ccw/frontend/dist/assets/{EndpointsPage-BcyNmqIa.js.map → EndpointsPage-DhW6hYrI.js.map} +1 -1
  25. package/ccw/frontend/dist/assets/{ExplorerPage-DfHtqeQM.js → ExplorerPage-DYYpCvtB.js} +2 -2
  26. package/ccw/frontend/dist/assets/{ExplorerPage-DfHtqeQM.js.map → ExplorerPage-DYYpCvtB.js.map} +1 -1
  27. package/ccw/frontend/dist/assets/{FixSessionPage-CbvZApeF.js → FixSessionPage-CSmiT5SE.js} +2 -2
  28. package/ccw/frontend/dist/assets/{FixSessionPage-CbvZApeF.js.map → FixSessionPage-CSmiT5SE.js.map} +1 -1
  29. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DLz85cw9.js → FloatingFileBrowser-DvMsXLdP.js} +2 -2
  30. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DLz85cw9.js.map → FloatingFileBrowser-DvMsXLdP.js.map} +1 -1
  31. package/ccw/frontend/dist/assets/{FloatingPanel-DrUTmgtV.js → FloatingPanel-sqezhSI8.js} +2 -2
  32. package/ccw/frontend/dist/assets/{FloatingPanel-DrUTmgtV.js.map → FloatingPanel-sqezhSI8.js.map} +1 -1
  33. package/ccw/frontend/dist/assets/{GraphExplorerPage-C439yLvH.js → GraphExplorerPage-DS8ghMFM.js} +2 -2
  34. package/ccw/frontend/dist/assets/{GraphExplorerPage-C439yLvH.js.map → GraphExplorerPage-DS8ghMFM.js.map} +1 -1
  35. package/ccw/frontend/dist/assets/{HistoryPage-BClJJMEy.js → HistoryPage-B-x1RyHu.js} +2 -2
  36. package/ccw/frontend/dist/assets/{HistoryPage-BClJJMEy.js.map → HistoryPage-B-x1RyHu.js.map} +1 -1
  37. package/ccw/frontend/dist/assets/{HookManagerPage-DI-2QDLJ.js → HookManagerPage-BbxpDb68.js} +2 -2
  38. package/ccw/frontend/dist/assets/{HookManagerPage-DI-2QDLJ.js.map → HookManagerPage-BbxpDb68.js.map} +1 -1
  39. package/ccw/frontend/dist/assets/{InstallationsPage-DKlz1ypL.js → InstallationsPage-3bShz_Ai.js} +2 -2
  40. package/ccw/frontend/dist/assets/{InstallationsPage-DKlz1ypL.js.map → InstallationsPage-3bShz_Ai.js.map} +1 -1
  41. package/ccw/frontend/dist/assets/{IssueHubPage--6DduN4j.js → IssueHubPage-BQY_Hh3e.js} +2 -2
  42. package/ccw/frontend/dist/assets/{IssueHubPage--6DduN4j.js.map → IssueHubPage-BQY_Hh3e.js.map} +1 -1
  43. package/ccw/frontend/dist/assets/{LiteTasksPage-39j6xEeL.js → LiteTasksPage-vD_8fQcR.js} +2 -2
  44. package/ccw/frontend/dist/assets/{LiteTasksPage-39j6xEeL.js.map → LiteTasksPage-vD_8fQcR.js.map} +1 -1
  45. package/ccw/frontend/dist/assets/{McpManagerPage-D00C9RVN.js → McpManagerPage-CI5ZzB8A.js} +2 -2
  46. package/ccw/frontend/dist/assets/{McpManagerPage-D00C9RVN.js.map → McpManagerPage-CI5ZzB8A.js.map} +1 -1
  47. package/ccw/frontend/dist/assets/{MemoryPage-BXWKdTyM.js → MemoryPage-CNuj2eNg.js} +2 -2
  48. package/ccw/frontend/dist/assets/{MemoryPage-BXWKdTyM.js.map → MemoryPage-CNuj2eNg.js.map} +1 -1
  49. package/ccw/frontend/dist/assets/{NotFoundPage-h5o3I7cF.js → NotFoundPage-BrnAXkb1.js} +2 -2
  50. package/ccw/frontend/dist/assets/{NotFoundPage-h5o3I7cF.js.map → NotFoundPage-BrnAXkb1.js.map} +1 -1
  51. package/ccw/frontend/dist/assets/{OrchestratorPage-jkyjmiI1.js → OrchestratorPage-CH81PGt4.js} +2 -2
  52. package/ccw/frontend/dist/assets/{OrchestratorPage-jkyjmiI1.js.map → OrchestratorPage-CH81PGt4.js.map} +1 -1
  53. package/ccw/frontend/dist/assets/{ProjectOverviewPage-C2bE5eb2.js → ProjectOverviewPage-dwiEXl2O.js} +2 -2
  54. package/ccw/frontend/dist/assets/{ProjectOverviewPage-C2bE5eb2.js.map → ProjectOverviewPage-dwiEXl2O.js.map} +1 -1
  55. package/ccw/frontend/dist/assets/{PromptHistoryPage-DzmPK4GZ.js → PromptHistoryPage-CabgLjJU.js} +2 -2
  56. package/ccw/frontend/dist/assets/{PromptHistoryPage-DzmPK4GZ.js.map → PromptHistoryPage-CabgLjJU.js.map} +1 -1
  57. package/ccw/frontend/dist/assets/{ReviewSessionPage-CVMH1K6G.js → ReviewSessionPage-DAMrNFn8.js} +2 -2
  58. package/ccw/frontend/dist/assets/{ReviewSessionPage-CVMH1K6G.js.map → ReviewSessionPage-DAMrNFn8.js.map} +1 -1
  59. package/ccw/frontend/dist/assets/{RulesManagerPage-BDZco-r2.js → RulesManagerPage-4jzmxPn0.js} +2 -2
  60. package/ccw/frontend/dist/assets/{RulesManagerPage-BDZco-r2.js.map → RulesManagerPage-4jzmxPn0.js.map} +1 -1
  61. package/ccw/frontend/dist/assets/{SessionDetailPage-D5cM-8Kk.js → SessionDetailPage-C5Btktmp.js} +2 -2
  62. package/ccw/frontend/dist/assets/{SessionDetailPage-D5cM-8Kk.js.map → SessionDetailPage-C5Btktmp.js.map} +1 -1
  63. package/ccw/frontend/dist/assets/{SessionsPage-BFy74ye3.js → SessionsPage-CQIB4E8m.js} +2 -2
  64. package/ccw/frontend/dist/assets/{SessionsPage-BFy74ye3.js.map → SessionsPage-CQIB4E8m.js.map} +1 -1
  65. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js +150 -0
  66. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js.map +1 -0
  67. package/ccw/frontend/dist/assets/{SkillsManagerPage-8Dsq4AUD.js → SkillsManagerPage-BqfvYSkT.js} +2 -2
  68. package/ccw/frontend/dist/assets/{SkillsManagerPage-8Dsq4AUD.js.map → SkillsManagerPage-BqfvYSkT.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CG77iAYQ.js → SpecsSettingsPage-BdVPM5R6.js} +2 -2
  70. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CG77iAYQ.js.map → SpecsSettingsPage-BdVPM5R6.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{Switch-BbuvVsX-.js → Switch-BG929kV0.js} +2 -2
  72. package/ccw/frontend/dist/assets/{Switch-BbuvVsX-.js.map → Switch-BG929kV0.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{TabsNavigation-SGJhC8-P.js → TabsNavigation-Bol1y09b.js} +2 -2
  74. package/ccw/frontend/dist/assets/{TabsNavigation-SGJhC8-P.js.map → TabsNavigation-Bol1y09b.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{TaskDrawer-p51jeScU.js → TaskDrawer-Dwutrn8_.js} +2 -2
  76. package/ccw/frontend/dist/assets/{TaskDrawer-p51jeScU.js.map → TaskDrawer-Dwutrn8_.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/{TeamPage-CvZBThbr.js → TeamPage-CpCSwpxD.js} +2 -2
  78. package/ccw/frontend/dist/assets/{TeamPage-CvZBThbr.js.map → TeamPage-CpCSwpxD.js.map} +1 -1
  79. package/ccw/frontend/dist/assets/{TerminalDashboardPage-uhM7kGKI.js → TerminalDashboardPage-DODKjOeK.js} +2 -2
  80. package/ccw/frontend/dist/assets/{TerminalDashboardPage-uhM7kGKI.js.map → TerminalDashboardPage-DODKjOeK.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{archive-D6ySrtHC.js → archive-CQw634kD.js} +2 -2
  82. package/ccw/frontend/dist/assets/{archive-D6ySrtHC.js.map → archive-CQw634kD.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/{archive-restore-C1uI-5TY.js → archive-restore-B-_EG6wE.js} +2 -2
  84. package/ccw/frontend/dist/assets/{archive-restore-C1uI-5TY.js.map → archive-restore-B-_EG6wE.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{arrow-right-qE5-FMG8.js → arrow-right-CcQtxBrU.js} +2 -2
  86. package/ccw/frontend/dist/assets/{arrow-right-qE5-FMG8.js.map → arrow-right-CcQtxBrU.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{bookmark-plus-DL4iL38T.js → bookmark-plus-Cl-BbcpR.js} +2 -2
  88. package/ccw/frontend/dist/assets/{bookmark-plus-DL4iL38T.js.map → bookmark-plus-Cl-BbcpR.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{bot-CZzIeEkg.js → bot-CLSNSkW_.js} +2 -2
  90. package/ccw/frontend/dist/assets/{bot-CZzIeEkg.js.map → bot-CLSNSkW_.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{braces-MEPRT2LN.js → braces-DWwkaDS6.js} +2 -2
  92. package/ccw/frontend/dist/assets/{braces-MEPRT2LN.js.map → braces-DWwkaDS6.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{circle-stop-GQcecSUg.js → circle-stop-DiS7e6ma.js} +2 -2
  94. package/ccw/frontend/dist/assets/{circle-stop-GQcecSUg.js.map → circle-stop-DiS7e6ma.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{cpu-CzxYMs1Y.js → cpu-CuvHUVXO.js} +2 -2
  96. package/ccw/frontend/dist/assets/{cpu-CzxYMs1Y.js.map → cpu-CuvHUVXO.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{ellipsis-vertical-DZMfiFKo.js → ellipsis-vertical-BoVlINSw.js} +2 -2
  98. package/ccw/frontend/dist/assets/{ellipsis-vertical-DZMfiFKo.js.map → ellipsis-vertical-BoVlINSw.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{eye-BXfPoClW.js → eye-BEMOdcAN.js} +2 -2
  100. package/ccw/frontend/dist/assets/{eye-BXfPoClW.js.map → eye-BEMOdcAN.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{eye-off-CyaKXmAk.js → eye-off-C5HS4Ytm.js} +2 -2
  102. package/ccw/frontend/dist/assets/{eye-off-CyaKXmAk.js.map → eye-off-C5HS4Ytm.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{file-json-B4LbFfTU.js → file-json-DQ9XLq0B.js} +2 -2
  104. package/ccw/frontend/dist/assets/{file-json-B4LbFfTU.js.map → file-json-DQ9XLq0B.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{file-text-CIWG7Xgj.js → file-text-TGs_qCbw.js} +2 -2
  106. package/ccw/frontend/dist/assets/{file-text-CIWG7Xgj.js.map → file-text-TGs_qCbw.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{filter-CNBjjvBX.js → filter-CIuCqnDB.js} +2 -2
  108. package/ccw/frontend/dist/assets/{filter-CNBjjvBX.js.map → filter-CIuCqnDB.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{folder-DT_XOYw9.js → folder-BkivHBwn.js} +2 -2
  110. package/ccw/frontend/dist/assets/{folder-DT_XOYw9.js.map → folder-BkivHBwn.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{gauge-mvQWOG3S.js → gauge-CtM68fVY.js} +2 -2
  112. package/ccw/frontend/dist/assets/{gauge-mvQWOG3S.js.map → gauge-CtM68fVY.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{globe-B25jraBz.js → globe-DpnrINqP.js} +2 -2
  114. package/ccw/frontend/dist/assets/{globe-B25jraBz.js.map → globe-DpnrINqP.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{grid-3x3-CptugI_Z.js → grid-3x3-SjX0a5JH.js} +2 -2
  116. package/ccw/frontend/dist/assets/{grid-3x3-CptugI_Z.js.map → grid-3x3-SjX0a5JH.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{hard-drive-BUK9Wcoz.js → hard-drive-ByAmnoEg.js} +2 -2
  118. package/ccw/frontend/dist/assets/{hard-drive-BUK9Wcoz.js.map → hard-drive-ByAmnoEg.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{hash-dddMDYK7.js → hash-DbLc3VOZ.js} +2 -2
  120. package/ccw/frontend/dist/assets/{hash-dddMDYK7.js.map → hash-DbLc3VOZ.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{history-BdDj8MtC.js → history-Botz5Z5d.js} +2 -2
  122. package/ccw/frontend/dist/assets/{history-BdDj8MtC.js.map → history-Botz5Z5d.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{index-CcxBnbbQ.js → index-BGvyf4-9.js} +2 -2
  124. package/ccw/frontend/dist/assets/{index-CcxBnbbQ.js.map → index-BGvyf4-9.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/index-BoqylFO4.css +39 -0
  126. package/ccw/frontend/dist/assets/{index-DZGHdspr.js → index-DP_mTJI8.js} +3 -3
  127. package/ccw/frontend/dist/assets/{index-DZGHdspr.js.map → index-DP_mTJI8.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/{index-B6UfIzhR.js → index-MkgdhX7a.js} +2 -2
  129. package/ccw/frontend/dist/assets/{index-B6UfIzhR.js.map → index-MkgdhX7a.js.map} +1 -1
  130. package/ccw/frontend/dist/assets/{index-EFcT7h67.js → index-ni-tG9rm.js} +2 -2
  131. package/ccw/frontend/dist/assets/{index-EFcT7h67.js.map → index-ni-tG9rm.js.map} +1 -1
  132. package/ccw/frontend/dist/assets/{layout-grid-BVlT1oI7.js → layout-grid-11E4bGJz.js} +2 -2
  133. package/ccw/frontend/dist/assets/{layout-grid-BVlT1oI7.js.map → layout-grid-11E4bGJz.js.map} +1 -1
  134. package/ccw/frontend/dist/assets/{lightbulb-Mt3Tlwh4.js → lightbulb-8KrKY82b.js} +2 -2
  135. package/ccw/frontend/dist/assets/{lightbulb-Mt3Tlwh4.js.map → lightbulb-8KrKY82b.js.map} +1 -1
  136. package/ccw/frontend/dist/assets/{link-2-DXqT64qo.js → link-2-BUn6RILb.js} +2 -2
  137. package/ccw/frontend/dist/assets/{link-2-DXqT64qo.js.map → link-2-BUn6RILb.js.map} +1 -1
  138. package/ccw/frontend/dist/assets/{link-CBMtrpcI.js → link-CmP254Ai.js} +2 -2
  139. package/ccw/frontend/dist/assets/{link-CBMtrpcI.js.map → link-CmP254Ai.js.map} +1 -1
  140. package/ccw/frontend/dist/assets/{list-DDyEM4AO.js → list-BAwzl4a2.js} +2 -2
  141. package/ccw/frontend/dist/assets/{list-DDyEM4AO.js.map → list-BAwzl4a2.js.map} +1 -1
  142. package/ccw/frontend/dist/assets/{map-pin-B2FxBKfk.js → map-pin-gi342rqk.js} +2 -2
  143. package/ccw/frontend/dist/assets/{map-pin-B2FxBKfk.js.map → map-pin-gi342rqk.js.map} +1 -1
  144. package/ccw/frontend/dist/assets/{messages-square-zJfTY9pq.js → messages-square-C1Lh8q8b.js} +2 -2
  145. package/ccw/frontend/dist/assets/{messages-square-zJfTY9pq.js.map → messages-square-C1Lh8q8b.js.map} +1 -1
  146. package/ccw/frontend/dist/assets/{minimize-2-DnhGZj79.js → minimize-2-OgWNLKdq.js} +2 -2
  147. package/ccw/frontend/dist/assets/{minimize-2-DnhGZj79.js.map → minimize-2-OgWNLKdq.js.map} +1 -1
  148. package/ccw/frontend/dist/assets/{package-DYzAybhU.js → package-Djsvs5qp.js} +2 -2
  149. package/ccw/frontend/dist/assets/{package-DYzAybhU.js.map → package-Djsvs5qp.js.map} +1 -1
  150. package/ccw/frontend/dist/assets/{plug-B3kKHsu1.js → plug-DvSZP2cp.js} +2 -2
  151. package/ccw/frontend/dist/assets/{plug-B3kKHsu1.js.map → plug-DvSZP2cp.js.map} +1 -1
  152. package/ccw/frontend/dist/assets/{power-BPNNZgLy.js → power-BY7vTLmU.js} +2 -2
  153. package/ccw/frontend/dist/assets/{power-BPNNZgLy.js.map → power-BY7vTLmU.js.map} +1 -1
  154. package/ccw/frontend/dist/assets/{save-Cwry93p-.js → save-DXfqv84T.js} +2 -2
  155. package/ccw/frontend/dist/assets/{save-Cwry93p-.js.map → save-DXfqv84T.js.map} +1 -1
  156. package/ccw/frontend/dist/assets/{send-DuWWy2J8.js → send-E2o2LZSX.js} +2 -2
  157. package/ccw/frontend/dist/assets/{send-DuWWy2J8.js.map → send-E2o2LZSX.js.map} +1 -1
  158. package/ccw/frontend/dist/assets/{settings-2-C3U1eSK6.js → settings-2-ChD1LFHH.js} +2 -2
  159. package/ccw/frontend/dist/assets/{settings-2-C3U1eSK6.js.map → settings-2-ChD1LFHH.js.map} +1 -1
  160. package/ccw/frontend/dist/assets/{square-check-big-CrG1ejFB.js → square-check-big-CBymuqmD.js} +2 -2
  161. package/ccw/frontend/dist/assets/{square-check-big-CrG1ejFB.js.map → square-check-big-CBymuqmD.js.map} +1 -1
  162. package/ccw/frontend/dist/assets/{square-pen-eLWlCgZ5.js → square-pen-BfaiJgOX.js} +2 -2
  163. package/ccw/frontend/dist/assets/{square-pen-eLWlCgZ5.js.map → square-pen-BfaiJgOX.js.map} +1 -1
  164. package/ccw/frontend/dist/assets/{star-sveo4KRn.js → star-DHMWqZ09.js} +2 -2
  165. package/ccw/frontend/dist/assets/{star-sveo4KRn.js.map → star-DHMWqZ09.js.map} +1 -1
  166. package/ccw/frontend/dist/assets/{style-CRdAX7Cu.js → style-wvcOEAiM.js} +2 -2
  167. package/ccw/frontend/dist/assets/{style-CRdAX7Cu.js.map → style-wvcOEAiM.js.map} +1 -1
  168. package/ccw/frontend/dist/assets/{target-Oz1-z8Zu.js → target-B8AMmf_N.js} +2 -2
  169. package/ccw/frontend/dist/assets/{target-Oz1-z8Zu.js.map → target-B8AMmf_N.js.map} +1 -1
  170. package/ccw/frontend/dist/assets/{test-tube-BozkZKD6.js → test-tube-BpDeTJi1.js} +2 -2
  171. package/ccw/frontend/dist/assets/{test-tube-BozkZKD6.js.map → test-tube-BpDeTJi1.js.map} +1 -1
  172. package/ccw/frontend/dist/assets/{upload-CTlUsxyh.js → upload-pflkdIDG.js} +2 -2
  173. package/ccw/frontend/dist/assets/{upload-CTlUsxyh.js.map → upload-pflkdIDG.js.map} +1 -1
  174. package/ccw/frontend/dist/assets/{useApiSettings-D6WfgFYj.js → useApiSettings-BPx4DyKT.js} +2 -2
  175. package/ccw/frontend/dist/assets/{useApiSettings-D6WfgFYj.js.map → useApiSettings-BPx4DyKT.js.map} +1 -1
  176. package/ccw/frontend/dist/assets/{useCli-CgGVNN5I.js → useCli-D1jfH3XA.js} +2 -2
  177. package/ccw/frontend/dist/assets/{useCli-CgGVNN5I.js.map → useCli-D1jfH3XA.js.map} +1 -1
  178. package/ccw/frontend/dist/assets/{useCommands-o5CKv-10.js → useCommands-DhR71vpa.js} +2 -2
  179. package/ccw/frontend/dist/assets/{useCommands-o5CKv-10.js.map → useCommands-DhR71vpa.js.map} +1 -1
  180. package/ccw/frontend/dist/assets/{useDebounce-rKo_bCBK.js → useDebounce-a6Yyer3m.js} +2 -2
  181. package/ccw/frontend/dist/assets/{useDebounce-rKo_bCBK.js.map → useDebounce-a6Yyer3m.js.map} +1 -1
  182. package/ccw/frontend/dist/assets/{useFileExplorer-WeE4t9Hg.js → useFileExplorer-B8W2JTj2.js} +2 -2
  183. package/ccw/frontend/dist/assets/{useFileExplorer-WeE4t9Hg.js.map → useFileExplorer-B8W2JTj2.js.map} +1 -1
  184. package/ccw/frontend/dist/assets/{useLocale-BS0tTC-_.js → useLocale-aMHdQIL_.js} +2 -2
  185. package/ccw/frontend/dist/assets/{useLocale-BS0tTC-_.js.map → useLocale-aMHdQIL_.js.map} +1 -1
  186. package/ccw/frontend/dist/assets/{useSkills-BUgAhw6r.js → useSkills-BHpc2LtN.js} +3 -3
  187. package/ccw/frontend/dist/assets/{useSkills-BUgAhw6r.js.map → useSkills-BHpc2LtN.js.map} +1 -1
  188. package/ccw/frontend/dist/assets/{useSystemSettings-CLhmINg1.js → useSystemSettings-BFD0SvEF.js} +2 -2
  189. package/ccw/frontend/dist/assets/{useSystemSettings-CLhmINg1.js.map → useSystemSettings-BFD0SvEF.js.map} +1 -1
  190. package/ccw/frontend/dist/assets/{wand-sparkles-BUHKJH1X.js → wand-sparkles-dYtI2IKM.js} +2 -2
  191. package/ccw/frontend/dist/assets/{wand-sparkles-BUHKJH1X.js.map → wand-sparkles-dYtI2IKM.js.map} +1 -1
  192. package/ccw/frontend/dist/index.html +2 -2
  193. package/package.json +1 -1
  194. package/ccw/frontend/dist/assets/SettingsPage-Qj0fFDjX.js +0 -150
  195. package/ccw/frontend/dist/assets/SettingsPage-Qj0fFDjX.js.map +0 -1
  196. package/ccw/frontend/dist/assets/index-nU0QYi1y.css +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"index-CcxBnbbQ.js","sources":["../../src/components/shared/LogBlock/jsonUtils.ts","../../src/components/shared/LogBlock/JsonFormatter.tsx","../../src/components/shared/CliStreamMonitor/MessageRenderer/index.tsx"],"sourcesContent":["// ========================================\r\n// LogBlock JSON Utilities\r\n// ========================================\r\n// JSON content detection and formatting utilities\r\n\r\n/**\r\n * JSON content type detection result\r\n */\r\nexport interface JsonDetectionResult {\r\n isJson: boolean;\r\n parsed?: unknown;\r\n error?: string;\r\n format: 'object' | 'array' | 'primitive' | 'invalid';\r\n}\r\n\r\n/**\r\n * Display mode for JSON content\r\n */\r\nexport type JsonDisplayMode = 'text' | 'card' | 'inline';\r\n\r\n/**\r\n * Detect if content is valid JSON\r\n *\r\n * @param content - Content string to check\r\n * @returns Detection result with parsed data if valid\r\n */\r\nexport function detectJson(content: string): JsonDetectionResult {\r\n const trimmed = content.trim();\r\n\r\n // Quick check for JSON patterns\r\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\r\n return { isJson: false, format: 'invalid' };\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n\r\n // Determine format type\r\n let format: JsonDetectionResult['format'] = 'primitive';\r\n if (Array.isArray(parsed)) {\r\n format = 'array';\r\n } else if (parsed !== null && typeof parsed === 'object') {\r\n format = 'object';\r\n }\r\n\r\n return { isJson: true, parsed, format };\r\n } catch (error) {\r\n return {\r\n isJson: false,\r\n format: 'invalid',\r\n error: error instanceof Error ? error.message : 'Unknown parse error'\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Extract JSON from mixed content\r\n * Handles cases where JSON is embedded in text output\r\n *\r\n * @param content - Content that may contain JSON\r\n * @returns Extracted JSON string or null if not found\r\n */\r\nexport function extractJson(content: string): string | null {\r\n const trimmed = content.trim();\r\n\r\n // Direct JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n // Find the matching bracket\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n let end = -1;\r\n\r\n for (let i = 0; i < trimmed.length; i++) {\r\n const char = trimmed[i];\r\n\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (!inString) {\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n if (depth === 0) {\r\n end = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (end > 0) {\r\n return trimmed.substring(0, end);\r\n }\r\n }\r\n\r\n // Try to find JSON in code blocks\r\n const codeBlockMatch = content.match(/```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (codeBlockMatch) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect if content should be displayed as JSON\r\n * Combines extraction and validation\r\n *\r\n * @param content - Content to check\r\n * @returns Detection result\r\n */\r\nexport function detectJsonContent(content: string): JsonDetectionResult & { extracted: string | null } {\r\n const extracted = extractJson(content);\r\n\r\n if (!extracted) {\r\n return { isJson: false, format: 'invalid', extracted: null };\r\n }\r\n\r\n const result = detectJson(extracted);\r\n return { ...result, extracted };\r\n}\r\n\r\n/**\r\n * Format JSON for display\r\n *\r\n * @param data - Parsed JSON data\r\n * @param indent - Indentation spaces (default: 2)\r\n * @returns Formatted JSON string\r\n */\r\nexport function formatJson(data: unknown, indent: number = 2): string {\r\n return JSON.stringify(data, null, indent);\r\n}\r\n\r\n/**\r\n * Get a summary string for JSON data\r\n *\r\n * @param data - Parsed JSON data\r\n * @returns Summary description\r\n */\r\nexport function getJsonSummary(data: unknown): string {\r\n if (data === null) return 'null';\r\n if (typeof data === 'boolean') return data ? 'true' : 'false';\r\n if (typeof data === 'number') return String(data);\r\n if (typeof data === 'string') return `\"${data.length > 30 ? data.substring(0, 30) + '...' : data}\"`;\r\n\r\n if (Array.isArray(data)) {\r\n const length = data.length;\r\n return `Array[${length}]${length > 0 ? ` (${getJsonSummary(data[0])}, ...)` : ''}`;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const keys = Object.keys(data);\r\n return `Object{${keys.length}}${keys.length > 0 ? ` (${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', ...' : ''})` : ''}`;\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\n/**\r\n * Get color class for JSON value type\r\n *\r\n * @param value - JSON value\r\n * @returns Tailwind color class\r\n */\r\nexport function getJsonValueTypeColor(value: unknown): string {\r\n if (value === null) return 'text-muted-foreground';\r\n if (typeof value === 'boolean') return 'text-purple-400';\r\n if (typeof value === 'number') return 'text-orange-400';\r\n if (typeof value === 'string') return 'text-green-400';\r\n if (Array.isArray(value)) return 'text-blue-400';\r\n if (typeof value === 'object') return 'text-yellow-400';\r\n return 'text-foreground';\r\n}\r\n","// ========================================\r\n// JsonFormatter Component\r\n// ========================================\r\n// Displays JSON content in formatted text or card view\r\n\r\nimport { useState, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, ChevronRight, Copy, Check, Braces } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n detectJsonContent,\r\n formatJson,\r\n getJsonSummary,\r\n getJsonValueTypeColor,\r\n type JsonDisplayMode,\r\n} from './jsonUtils';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonFormatterProps {\r\n /** Content to format */\r\n content: string;\r\n /** Display mode */\r\n displayMode?: JsonDisplayMode;\r\n /** CSS className */\r\n className?: string;\r\n /** Maximum lines for text mode (default: 20) */\r\n maxLines?: number;\r\n /** Whether to show type labels in card mode (default: true) */\r\n showTypeLabels?: boolean;\r\n}\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Copy button with feedback\r\n */\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = useCallback(async () => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }, [text]);\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-6 px-2 text-xs opacity-0 group-hover:opacity-100 transition-opacity\"\r\n >\r\n {copied ? (\r\n <>\r\n <Check className=\"h-3 w-3 mr-1\" />\r\n Copied\r\n </>\r\n ) : (\r\n <>\r\n <Copy className=\"h-3 w-3 mr-1\" />\r\n Copy\r\n </>\r\n )}\r\n </Button>\r\n );\r\n}\r\n\r\n/**\r\n * JSON value renderer with syntax highlighting\r\n */\r\nfunction JsonValue({ value, depth = 0 }: { value: unknown; depth?: number }) {\r\n const indent = ' '.repeat(depth);\r\n const colorClass = getJsonValueTypeColor(value);\r\n\r\n if (value === null) {\r\n return <span className={colorClass}>null</span>;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return <span className={colorClass}>\"{value}\"</span>;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) {\r\n return <span className=\"text-blue-400\">[]</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-blue-400\">\r\n <span>[</span>\r\n <div className=\"pl-4\">\r\n {value.map((item, index) => (\r\n <div key={index} className=\"hover:bg-muted/50 rounded px-1\">\r\n <JsonValue value={item} depth={depth + 1} />\r\n {index < value.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}]</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value as Record<string, unknown>);\r\n if (entries.length === 0) {\r\n return <span className=\"text-yellow-400\">{`{}`}</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-yellow-400\">\r\n <span>{`{`}</span>\r\n <div className=\"pl-4\">\r\n {entries.map(([key, val], index) => (\r\n <div key={key} className=\"hover:bg-muted/50 rounded px-1\">\r\n <span className=\"text-cyan-400\">\"{key}\"</span>\r\n <span className=\"text-foreground\">: </span>\r\n <JsonValue value={val} depth={depth + 1} />\r\n {index < entries.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}{`}`}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\n/**\r\n * Compact JSON view for inline display\r\n */\r\nfunction JsonCompact({ data }: { data: unknown }) {\r\n return (\r\n <code className=\"text-xs font-mono\">\r\n <JsonValue value={data} />\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Card view for structured JSON display\r\n */\r\nfunction JsonCard({ data, showTypeLabels = true }: { data: unknown; showTypeLabels?: boolean }) {\r\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\r\n\r\n const toggleKey = useCallback((key: string) => {\r\n setExpandedKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n // Primitive or array - use inline view\r\n return (\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCompact data={data} />\r\n </div>\r\n );\r\n }\r\n\r\n const entries = Object.entries(data as Record<string, unknown>);\r\n\r\n return (\r\n <div className=\"border border-border rounded-lg overflow-hidden bg-card\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted/50 border-b border-border\">\r\n <Braces className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">JSON Data</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({entries.length} {entries.length === 1 ? 'property' : 'properties'})\r\n </span>\r\n </div>\r\n\r\n {/* Properties */}\r\n <div className=\"divide-y divide-border\">\r\n {entries.map(([key, value]) => {\r\n const isObject = value !== null && typeof value === 'object';\r\n const isExpanded = expandedKeys.has(key);\r\n const isArray = Array.isArray(value);\r\n const summary = getJsonSummary(value);\r\n\r\n return (\r\n <div key={key} className=\"group\">\r\n <div\r\n className={cn(\r\n 'flex items-start gap-2 px-3 py-2 hover:bg-muted/30 transition-colors',\r\n isObject && 'cursor-pointer'\r\n )}\r\n onClick={() => isObject && toggleKey(key)}\r\n >\r\n {/* Expand/collapse icon */}\r\n {isObject && (\r\n <div className=\"shrink-0 mt-0.5\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Key */}\r\n <span className=\"font-mono text-sm text-cyan-400 shrink-0\">\"{key}\"</span>\r\n <span className=\"text-muted-foreground shrink-0\">:</span>\r\n\r\n {/* Value summary or full value */}\r\n <div className={cn('flex-1 min-w-0', getJsonValueTypeColor(value))}>\r\n {showTypeLabels && (\r\n <span className=\"text-xs text-muted-foreground mr-1\">\r\n {isArray ? 'array' : isObject ? 'object' : typeof value}\r\n </span>\r\n )}\r\n {!isObject ? (\r\n <span className=\"text-sm font-mono break-all\">{summary}</span>\r\n ) : (\r\n <span className=\"text-sm\">{summary}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded nested object */}\r\n {isObject && isExpanded && (\r\n <div className=\"pl-8 pr-3 pb-2\">\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCard data={value} showTypeLabels={showTypeLabels} />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Text view for formatted JSON\r\n */\r\nfunction JsonText({ data, maxLines = 20 }: { data: unknown; maxLines?: number }) {\r\n const formatted = useMemo(() => formatJson(data), [data]);\r\n const lines = formatted.split('\\n');\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n const displayLines = showTruncated ? lines.slice(0, maxLines) : lines;\r\n\r\n return (\r\n <div className=\"relative group\">\r\n <pre className=\"text-xs font-mono bg-muted/30 p-3 rounded border border-border overflow-x-auto\">\r\n <code className=\"text-foreground\">\r\n {displayLines.map((line, i) => (\r\n <div key={i} className=\"hover:bg-muted/50 px-1 -mx-1\">\r\n {line}\r\n </div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </code>\r\n </pre>\r\n\r\n {/* Copy button */}\r\n <div className=\"absolute top-2 right-2\">\r\n <CopyButton text={formatted} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * JsonFormatter Component\r\n *\r\n * Displays JSON content in various formats:\r\n * - `text`: Formatted JSON text with syntax highlighting\r\n * - `card`: Structured card view with collapsible properties\r\n * - `inline`: Compact inline display\r\n *\r\n * Auto-detects JSON from mixed content and validates it.\r\n */\r\nexport function JsonFormatter({\r\n content,\r\n displayMode = 'text',\r\n className,\r\n maxLines = 20,\r\n showTypeLabels = true,\r\n}: JsonFormatterProps) {\r\n // Detect JSON content\r\n const detection = useMemo(() => detectJsonContent(content), [content]);\r\n\r\n // Not JSON or invalid - show as plain text\r\n if (!detection.isJson) {\r\n return (\r\n <div className={cn('text-xs font-mono text-foreground', className)}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n // Valid JSON - render based on display mode\r\n switch (displayMode) {\r\n case 'card':\r\n return (\r\n <div className={className}>\r\n <JsonCard data={detection.parsed} showTypeLabels={showTypeLabels} />\r\n </div>\r\n );\r\n\r\n case 'inline':\r\n return (\r\n <div className={cn('inline-flex items-center gap-1 px-2 py-1 bg-muted/50 rounded border border-border', className)}>\r\n <Braces className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n <span className=\"text-xs font-mono\">\r\n <JsonCompact data={detection.parsed} />\r\n </span>\r\n </div>\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <JsonText data={detection.parsed} maxLines={maxLines} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default JsonFormatter;\r\n","// ========================================\r\n// MessageRenderer Component\r\n// ========================================\r\n// Renders message content with Markdown support, JSON formatting,\r\n// and escape sequence handling\r\n\r\nimport { useMemo } from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { cn } from '@/lib/utils';\r\nimport { JsonFormatter } from '../../LogBlock/JsonFormatter';\r\nimport { detectJsonContent } from '../../LogBlock/jsonUtils';\r\n\r\n// Import highlight.js styles for code syntax highlighting\r\n// Using a base style that works with both light and dark themes\r\nimport 'highlight.js/styles/base16/atelier-forest.css';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface MessageRendererProps {\r\n /** Content to render */\r\n content: string;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Format hint (auto-detect if not specified) */\r\n format?: 'markdown' | 'text' | 'json';\r\n /** Maximum lines to display (for text mode) */\r\n maxLines?: number;\r\n}\r\n\r\n// ========== Markdown Component Styles ==========\r\n\r\nconst markdownComponents: Record<string, string> = {\r\n h1: 'text-xl font-bold mt-4 mb-2 text-foreground',\r\n h2: 'text-lg font-semibold mt-3 mb-2 text-foreground',\r\n h3: 'text-base font-semibold mt-2 mb-1 text-foreground',\r\n p: 'text-sm leading-relaxed mb-2 text-foreground',\r\n ul: 'list-disc list-inside mb-2 text-sm space-y-1',\r\n ol: 'list-decimal list-inside mb-2 text-sm space-y-1',\r\n li: 'text-sm text-foreground',\r\n code: 'font-mono text-xs bg-muted px-1.5 py-0.5 rounded text-amber-600 dark:text-amber-400',\r\n pre: 'bg-muted/80 dark:bg-muted/30 p-3 rounded-lg overflow-x-auto my-2 border border-border/50',\r\n blockquote: 'border-l-4 border-muted-foreground pl-4 italic text-muted-foreground my-2',\r\n strong: 'font-semibold text-foreground',\r\n a: 'text-blue-600 dark:text-blue-400 hover:underline',\r\n};\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Inline code renderer for Markdown\r\n */\r\nfunction MarkdownCode({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <code\r\n className={cn(markdownComponents.code, className)}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Code block renderer for Markdown with syntax highlighting\r\n */\r\nfunction MarkdownPre({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <pre\r\n className={cn(markdownComponents.pre, className)}\r\n {...props}\r\n >\r\n {children}\r\n </pre>\r\n );\r\n}\r\n\r\n/**\r\n * Paragraph renderer for Markdown\r\n */\r\nfunction MarkdownParagraph({ className, children, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p\r\n className={cn(markdownComponents.p, className)}\r\n {...props}\r\n >\r\n {children}\r\n </p>\r\n );\r\n}\r\n\r\n/**\r\n * Heading renderers for Markdown\r\n */\r\nfunction MarkdownH1({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h1\r\n className={cn(markdownComponents.h1, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h1>\r\n );\r\n}\r\n\r\nfunction MarkdownH2({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h2\r\n className={cn(markdownComponents.h2, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h2>\r\n );\r\n}\r\n\r\nfunction MarkdownH3({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h3\r\n className={cn(markdownComponents.h3, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h3>\r\n );\r\n}\r\n\r\n/**\r\n * List renderers for Markdown\r\n */\r\nfunction MarkdownUl({ className, children, ...props }: React.HTMLAttributes<HTMLUListElement>) {\r\n return (\r\n <ul\r\n className={cn(markdownComponents.ul, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction MarkdownOl({ className, children, ...props }: React.HTMLAttributes<HTMLOListElement>) {\r\n return (\r\n <ol\r\n className={cn(markdownComponents.ol, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ol>\r\n );\r\n}\r\n\r\nfunction MarkdownLi({ className, children, ...props }: React.HTMLAttributes<HTMLLIElement>) {\r\n return (\r\n <li\r\n className={cn(markdownComponents.li, className)}\r\n {...props}\r\n >\r\n {children}\r\n </li>\r\n );\r\n}\r\n\r\n/**\r\n * Blockquote renderer for Markdown\r\n */\r\nfunction MarkdownBlockquote({ className, children, ...props }: React.HTMLAttributes<HTMLQuoteElement>) {\r\n return (\r\n <blockquote\r\n className={cn(markdownComponents.blockquote, className)}\r\n {...props}\r\n >\r\n {children}\r\n </blockquote>\r\n );\r\n}\r\n\r\n/**\r\n * Anchor renderer for Markdown\r\n */\r\nfunction MarkdownA({ className, children, href, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\r\n return (\r\n <a\r\n className={cn(markdownComponents.a, className)}\r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n\r\n/**\r\n * Strong/Bold renderer for Markdown\r\n */\r\nfunction MarkdownStrong({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <strong\r\n className={cn(markdownComponents.strong, className)}\r\n {...props}\r\n >\r\n {children}\r\n </strong>\r\n );\r\n}\r\n\r\n// ========== Markdown Renderer ==========\r\n\r\n/**\r\n * Markdown content renderer with syntax highlighting\r\n */\r\nfunction MarkdownRenderer({ content, className }: { content: string; className?: string }) {\r\n return (\r\n <div className={cn('prose prose-sm dark:prose-invert max-w-none', className)}>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n components={{\r\n h1: MarkdownH1,\r\n h2: MarkdownH2,\r\n h3: MarkdownH3,\r\n p: MarkdownParagraph,\r\n ul: MarkdownUl,\r\n ol: MarkdownOl,\r\n li: MarkdownLi,\r\n code: MarkdownCode,\r\n pre: MarkdownPre,\r\n blockquote: MarkdownBlockquote,\r\n a: MarkdownA,\r\n strong: MarkdownStrong,\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Text Renderer ==========\r\n\r\n/**\r\n * Plain text renderer with escape sequence handling\r\n */\r\nfunction TextRenderer({ content, maxLines }: { content: string; maxLines?: number }) {\r\n const lines = useMemo(() => {\r\n return content.split('\\n');\r\n }, [content]);\r\n\r\n const displayLines = useMemo(() => {\r\n if (maxLines && lines.length > maxLines) {\r\n return lines.slice(0, maxLines);\r\n }\r\n return lines;\r\n }, [lines, maxLines]);\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n\r\n return (\r\n <div className=\"text-sm text-foreground whitespace-pre-wrap break-words font-mono\">\r\n {displayLines.map((line, index) => (\r\n <div key={index}>{line || '\\u00A0'}</div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic text-xs mt-2\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Content Detection ==========\r\n\r\n/**\r\n * Auto-detect content format\r\n */\r\nfunction detectContentFormat(content: string): 'markdown' | 'json' | 'text' {\r\n const trimmed = content.trim();\r\n\r\n // Check for JSON first\r\n const jsonDetection = detectJsonContent(trimmed);\r\n if (jsonDetection.isJson) {\r\n return 'json';\r\n }\r\n\r\n // Check for Markdown patterns\r\n const markdownPatterns = [\r\n /^#{1,6}\\s+/m, // Headings\r\n /^\\*{3,}$/m, // Horizontal rule\r\n /^\\s*[-*+]\\s+/m, // Unordered lists\r\n /^\\s*\\d+\\.\\s+/m, // Ordered lists\r\n /\\[.*?\\]\\(.*?\\)/, // Links\r\n /`{3,}[\\s\\S]*?`{3,}/, // Code blocks\r\n /\\*\\*.*?\\*\\*/, // Bold\r\n /_.*?_/, // Italic\r\n /^\\s*>\\s+/m, // Blockquotes\r\n ];\r\n\r\n for (const pattern of markdownPatterns) {\r\n if (pattern.test(trimmed)) {\r\n return 'markdown';\r\n }\r\n }\r\n\r\n // Default to text\r\n return 'text';\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * MessageRenderer Component\r\n *\r\n * Renders message content with automatic format detection:\r\n * - JSON: Structured display with JsonFormatter\r\n * - Markdown: Rich text with syntax highlighting\r\n * - Text: Plain text with escape sequence handling\r\n *\r\n * Supports escape sequence handling (e.g., \\n → newline)\r\n */\r\nexport function MessageRenderer({\r\n content,\r\n className,\r\n format,\r\n maxLines,\r\n}: MessageRendererProps) {\r\n // Process escape sequences\r\n const processedContent = useMemo(() => {\r\n // Replace common escape sequences\r\n return content\r\n .replace(/\\\\n/g, '\\n')\r\n .replace(/\\\\t/g, ' ')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\'/g, \"'\")\r\n .replace(/\\\\\\\\/g, '\\\\');\r\n }, [content]);\r\n\r\n // Auto-detect format if not specified\r\n const detectedFormat = useMemo(() => {\r\n if (format) {\r\n return format;\r\n }\r\n return detectContentFormat(processedContent);\r\n }, [processedContent, format]);\r\n\r\n // Render based on format\r\n switch (detectedFormat) {\r\n case 'json':\r\n return (\r\n <div className={className}>\r\n <JsonFormatter\r\n content={processedContent}\r\n displayMode=\"text\"\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n\r\n case 'markdown':\r\n return (\r\n <MarkdownRenderer\r\n content={processedContent}\r\n className={className}\r\n />\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <TextRenderer\r\n content={processedContent}\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default MessageRenderer;\r\n"],"names":["detectJson","content","trimmed","parsed","format","error","extractJson","depth","inString","escape","end","i","char","codeBlockMatch","detectJsonContent","extracted","formatJson","data","indent","getJsonSummary","length","keys","getJsonValueTypeColor","value","CopyButton","text","copied","setCopied","useState","handleCopy","useCallback","err","jsx","Button","jsxs","Fragment","Check","Copy","JsonValue","colorClass","item","index","entries","key","val","JsonCompact","JsonCard","showTypeLabels","expandedKeys","setExpandedKeys","toggleKey","prev","next","Braces","isObject","isExpanded","isArray","summary","cn","ChevronDown","ChevronRight","JsonText","maxLines","formatted","useMemo","lines","showTruncated","displayLines","line","JsonFormatter","displayMode","className","detection","markdownComponents","MarkdownCode","children","props","MarkdownPre","MarkdownParagraph","MarkdownH1","MarkdownH2","MarkdownH3","MarkdownUl","MarkdownOl","MarkdownLi","MarkdownBlockquote","MarkdownA","href","MarkdownStrong","MarkdownRenderer","ReactMarkdown","remarkGfm","rehypeHighlight","TextRenderer","detectContentFormat","markdownPatterns","pattern","MessageRenderer","processedContent"],"mappings":"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"}
1
+ {"version":3,"file":"index-BGvyf4-9.js","sources":["../../src/components/shared/LogBlock/jsonUtils.ts","../../src/components/shared/LogBlock/JsonFormatter.tsx","../../src/components/shared/CliStreamMonitor/MessageRenderer/index.tsx"],"sourcesContent":["// ========================================\r\n// LogBlock JSON Utilities\r\n// ========================================\r\n// JSON content detection and formatting utilities\r\n\r\n/**\r\n * JSON content type detection result\r\n */\r\nexport interface JsonDetectionResult {\r\n isJson: boolean;\r\n parsed?: unknown;\r\n error?: string;\r\n format: 'object' | 'array' | 'primitive' | 'invalid';\r\n}\r\n\r\n/**\r\n * Display mode for JSON content\r\n */\r\nexport type JsonDisplayMode = 'text' | 'card' | 'inline';\r\n\r\n/**\r\n * Detect if content is valid JSON\r\n *\r\n * @param content - Content string to check\r\n * @returns Detection result with parsed data if valid\r\n */\r\nexport function detectJson(content: string): JsonDetectionResult {\r\n const trimmed = content.trim();\r\n\r\n // Quick check for JSON patterns\r\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\r\n return { isJson: false, format: 'invalid' };\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n\r\n // Determine format type\r\n let format: JsonDetectionResult['format'] = 'primitive';\r\n if (Array.isArray(parsed)) {\r\n format = 'array';\r\n } else if (parsed !== null && typeof parsed === 'object') {\r\n format = 'object';\r\n }\r\n\r\n return { isJson: true, parsed, format };\r\n } catch (error) {\r\n return {\r\n isJson: false,\r\n format: 'invalid',\r\n error: error instanceof Error ? error.message : 'Unknown parse error'\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Extract JSON from mixed content\r\n * Handles cases where JSON is embedded in text output\r\n *\r\n * @param content - Content that may contain JSON\r\n * @returns Extracted JSON string or null if not found\r\n */\r\nexport function extractJson(content: string): string | null {\r\n const trimmed = content.trim();\r\n\r\n // Direct JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n // Find the matching bracket\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n let end = -1;\r\n\r\n for (let i = 0; i < trimmed.length; i++) {\r\n const char = trimmed[i];\r\n\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (!inString) {\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n if (depth === 0) {\r\n end = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (end > 0) {\r\n return trimmed.substring(0, end);\r\n }\r\n }\r\n\r\n // Try to find JSON in code blocks\r\n const codeBlockMatch = content.match(/```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (codeBlockMatch) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect if content should be displayed as JSON\r\n * Combines extraction and validation\r\n *\r\n * @param content - Content to check\r\n * @returns Detection result\r\n */\r\nexport function detectJsonContent(content: string): JsonDetectionResult & { extracted: string | null } {\r\n const extracted = extractJson(content);\r\n\r\n if (!extracted) {\r\n return { isJson: false, format: 'invalid', extracted: null };\r\n }\r\n\r\n const result = detectJson(extracted);\r\n return { ...result, extracted };\r\n}\r\n\r\n/**\r\n * Format JSON for display\r\n *\r\n * @param data - Parsed JSON data\r\n * @param indent - Indentation spaces (default: 2)\r\n * @returns Formatted JSON string\r\n */\r\nexport function formatJson(data: unknown, indent: number = 2): string {\r\n return JSON.stringify(data, null, indent);\r\n}\r\n\r\n/**\r\n * Get a summary string for JSON data\r\n *\r\n * @param data - Parsed JSON data\r\n * @returns Summary description\r\n */\r\nexport function getJsonSummary(data: unknown): string {\r\n if (data === null) return 'null';\r\n if (typeof data === 'boolean') return data ? 'true' : 'false';\r\n if (typeof data === 'number') return String(data);\r\n if (typeof data === 'string') return `\"${data.length > 30 ? data.substring(0, 30) + '...' : data}\"`;\r\n\r\n if (Array.isArray(data)) {\r\n const length = data.length;\r\n return `Array[${length}]${length > 0 ? ` (${getJsonSummary(data[0])}, ...)` : ''}`;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const keys = Object.keys(data);\r\n return `Object{${keys.length}}${keys.length > 0 ? ` (${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', ...' : ''})` : ''}`;\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\n/**\r\n * Get color class for JSON value type\r\n *\r\n * @param value - JSON value\r\n * @returns Tailwind color class\r\n */\r\nexport function getJsonValueTypeColor(value: unknown): string {\r\n if (value === null) return 'text-muted-foreground';\r\n if (typeof value === 'boolean') return 'text-purple-400';\r\n if (typeof value === 'number') return 'text-orange-400';\r\n if (typeof value === 'string') return 'text-green-400';\r\n if (Array.isArray(value)) return 'text-blue-400';\r\n if (typeof value === 'object') return 'text-yellow-400';\r\n return 'text-foreground';\r\n}\r\n","// ========================================\r\n// JsonFormatter Component\r\n// ========================================\r\n// Displays JSON content in formatted text or card view\r\n\r\nimport { useState, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, ChevronRight, Copy, Check, Braces } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n detectJsonContent,\r\n formatJson,\r\n getJsonSummary,\r\n getJsonValueTypeColor,\r\n type JsonDisplayMode,\r\n} from './jsonUtils';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonFormatterProps {\r\n /** Content to format */\r\n content: string;\r\n /** Display mode */\r\n displayMode?: JsonDisplayMode;\r\n /** CSS className */\r\n className?: string;\r\n /** Maximum lines for text mode (default: 20) */\r\n maxLines?: number;\r\n /** Whether to show type labels in card mode (default: true) */\r\n showTypeLabels?: boolean;\r\n}\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Copy button with feedback\r\n */\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = useCallback(async () => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }, [text]);\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-6 px-2 text-xs opacity-0 group-hover:opacity-100 transition-opacity\"\r\n >\r\n {copied ? (\r\n <>\r\n <Check className=\"h-3 w-3 mr-1\" />\r\n Copied\r\n </>\r\n ) : (\r\n <>\r\n <Copy className=\"h-3 w-3 mr-1\" />\r\n Copy\r\n </>\r\n )}\r\n </Button>\r\n );\r\n}\r\n\r\n/**\r\n * JSON value renderer with syntax highlighting\r\n */\r\nfunction JsonValue({ value, depth = 0 }: { value: unknown; depth?: number }) {\r\n const indent = ' '.repeat(depth);\r\n const colorClass = getJsonValueTypeColor(value);\r\n\r\n if (value === null) {\r\n return <span className={colorClass}>null</span>;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return <span className={colorClass}>\"{value}\"</span>;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) {\r\n return <span className=\"text-blue-400\">[]</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-blue-400\">\r\n <span>[</span>\r\n <div className=\"pl-4\">\r\n {value.map((item, index) => (\r\n <div key={index} className=\"hover:bg-muted/50 rounded px-1\">\r\n <JsonValue value={item} depth={depth + 1} />\r\n {index < value.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}]</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value as Record<string, unknown>);\r\n if (entries.length === 0) {\r\n return <span className=\"text-yellow-400\">{`{}`}</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-yellow-400\">\r\n <span>{`{`}</span>\r\n <div className=\"pl-4\">\r\n {entries.map(([key, val], index) => (\r\n <div key={key} className=\"hover:bg-muted/50 rounded px-1\">\r\n <span className=\"text-cyan-400\">\"{key}\"</span>\r\n <span className=\"text-foreground\">: </span>\r\n <JsonValue value={val} depth={depth + 1} />\r\n {index < entries.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}{`}`}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\n/**\r\n * Compact JSON view for inline display\r\n */\r\nfunction JsonCompact({ data }: { data: unknown }) {\r\n return (\r\n <code className=\"text-xs font-mono\">\r\n <JsonValue value={data} />\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Card view for structured JSON display\r\n */\r\nfunction JsonCard({ data, showTypeLabels = true }: { data: unknown; showTypeLabels?: boolean }) {\r\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\r\n\r\n const toggleKey = useCallback((key: string) => {\r\n setExpandedKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n // Primitive or array - use inline view\r\n return (\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCompact data={data} />\r\n </div>\r\n );\r\n }\r\n\r\n const entries = Object.entries(data as Record<string, unknown>);\r\n\r\n return (\r\n <div className=\"border border-border rounded-lg overflow-hidden bg-card\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted/50 border-b border-border\">\r\n <Braces className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">JSON Data</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({entries.length} {entries.length === 1 ? 'property' : 'properties'})\r\n </span>\r\n </div>\r\n\r\n {/* Properties */}\r\n <div className=\"divide-y divide-border\">\r\n {entries.map(([key, value]) => {\r\n const isObject = value !== null && typeof value === 'object';\r\n const isExpanded = expandedKeys.has(key);\r\n const isArray = Array.isArray(value);\r\n const summary = getJsonSummary(value);\r\n\r\n return (\r\n <div key={key} className=\"group\">\r\n <div\r\n className={cn(\r\n 'flex items-start gap-2 px-3 py-2 hover:bg-muted/30 transition-colors',\r\n isObject && 'cursor-pointer'\r\n )}\r\n onClick={() => isObject && toggleKey(key)}\r\n >\r\n {/* Expand/collapse icon */}\r\n {isObject && (\r\n <div className=\"shrink-0 mt-0.5\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Key */}\r\n <span className=\"font-mono text-sm text-cyan-400 shrink-0\">\"{key}\"</span>\r\n <span className=\"text-muted-foreground shrink-0\">:</span>\r\n\r\n {/* Value summary or full value */}\r\n <div className={cn('flex-1 min-w-0', getJsonValueTypeColor(value))}>\r\n {showTypeLabels && (\r\n <span className=\"text-xs text-muted-foreground mr-1\">\r\n {isArray ? 'array' : isObject ? 'object' : typeof value}\r\n </span>\r\n )}\r\n {!isObject ? (\r\n <span className=\"text-sm font-mono break-all\">{summary}</span>\r\n ) : (\r\n <span className=\"text-sm\">{summary}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded nested object */}\r\n {isObject && isExpanded && (\r\n <div className=\"pl-8 pr-3 pb-2\">\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCard data={value} showTypeLabels={showTypeLabels} />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Text view for formatted JSON\r\n */\r\nfunction JsonText({ data, maxLines = 20 }: { data: unknown; maxLines?: number }) {\r\n const formatted = useMemo(() => formatJson(data), [data]);\r\n const lines = formatted.split('\\n');\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n const displayLines = showTruncated ? lines.slice(0, maxLines) : lines;\r\n\r\n return (\r\n <div className=\"relative group\">\r\n <pre className=\"text-xs font-mono bg-muted/30 p-3 rounded border border-border overflow-x-auto\">\r\n <code className=\"text-foreground\">\r\n {displayLines.map((line, i) => (\r\n <div key={i} className=\"hover:bg-muted/50 px-1 -mx-1\">\r\n {line}\r\n </div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </code>\r\n </pre>\r\n\r\n {/* Copy button */}\r\n <div className=\"absolute top-2 right-2\">\r\n <CopyButton text={formatted} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * JsonFormatter Component\r\n *\r\n * Displays JSON content in various formats:\r\n * - `text`: Formatted JSON text with syntax highlighting\r\n * - `card`: Structured card view with collapsible properties\r\n * - `inline`: Compact inline display\r\n *\r\n * Auto-detects JSON from mixed content and validates it.\r\n */\r\nexport function JsonFormatter({\r\n content,\r\n displayMode = 'text',\r\n className,\r\n maxLines = 20,\r\n showTypeLabels = true,\r\n}: JsonFormatterProps) {\r\n // Detect JSON content\r\n const detection = useMemo(() => detectJsonContent(content), [content]);\r\n\r\n // Not JSON or invalid - show as plain text\r\n if (!detection.isJson) {\r\n return (\r\n <div className={cn('text-xs font-mono text-foreground', className)}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n // Valid JSON - render based on display mode\r\n switch (displayMode) {\r\n case 'card':\r\n return (\r\n <div className={className}>\r\n <JsonCard data={detection.parsed} showTypeLabels={showTypeLabels} />\r\n </div>\r\n );\r\n\r\n case 'inline':\r\n return (\r\n <div className={cn('inline-flex items-center gap-1 px-2 py-1 bg-muted/50 rounded border border-border', className)}>\r\n <Braces className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n <span className=\"text-xs font-mono\">\r\n <JsonCompact data={detection.parsed} />\r\n </span>\r\n </div>\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <JsonText data={detection.parsed} maxLines={maxLines} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default JsonFormatter;\r\n","// ========================================\r\n// MessageRenderer Component\r\n// ========================================\r\n// Renders message content with Markdown support, JSON formatting,\r\n// and escape sequence handling\r\n\r\nimport { useMemo } from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { cn } from '@/lib/utils';\r\nimport { JsonFormatter } from '../../LogBlock/JsonFormatter';\r\nimport { detectJsonContent } from '../../LogBlock/jsonUtils';\r\n\r\n// Import highlight.js styles for code syntax highlighting\r\n// Using a base style that works with both light and dark themes\r\nimport 'highlight.js/styles/base16/atelier-forest.css';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface MessageRendererProps {\r\n /** Content to render */\r\n content: string;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Format hint (auto-detect if not specified) */\r\n format?: 'markdown' | 'text' | 'json';\r\n /** Maximum lines to display (for text mode) */\r\n maxLines?: number;\r\n}\r\n\r\n// ========== Markdown Component Styles ==========\r\n\r\nconst markdownComponents: Record<string, string> = {\r\n h1: 'text-xl font-bold mt-4 mb-2 text-foreground',\r\n h2: 'text-lg font-semibold mt-3 mb-2 text-foreground',\r\n h3: 'text-base font-semibold mt-2 mb-1 text-foreground',\r\n p: 'text-sm leading-relaxed mb-2 text-foreground',\r\n ul: 'list-disc list-inside mb-2 text-sm space-y-1',\r\n ol: 'list-decimal list-inside mb-2 text-sm space-y-1',\r\n li: 'text-sm text-foreground',\r\n code: 'font-mono text-xs bg-muted px-1.5 py-0.5 rounded text-amber-600 dark:text-amber-400',\r\n pre: 'bg-muted/80 dark:bg-muted/30 p-3 rounded-lg overflow-x-auto my-2 border border-border/50',\r\n blockquote: 'border-l-4 border-muted-foreground pl-4 italic text-muted-foreground my-2',\r\n strong: 'font-semibold text-foreground',\r\n a: 'text-blue-600 dark:text-blue-400 hover:underline',\r\n};\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Inline code renderer for Markdown\r\n */\r\nfunction MarkdownCode({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <code\r\n className={cn(markdownComponents.code, className)}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Code block renderer for Markdown with syntax highlighting\r\n */\r\nfunction MarkdownPre({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <pre\r\n className={cn(markdownComponents.pre, className)}\r\n {...props}\r\n >\r\n {children}\r\n </pre>\r\n );\r\n}\r\n\r\n/**\r\n * Paragraph renderer for Markdown\r\n */\r\nfunction MarkdownParagraph({ className, children, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p\r\n className={cn(markdownComponents.p, className)}\r\n {...props}\r\n >\r\n {children}\r\n </p>\r\n );\r\n}\r\n\r\n/**\r\n * Heading renderers for Markdown\r\n */\r\nfunction MarkdownH1({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h1\r\n className={cn(markdownComponents.h1, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h1>\r\n );\r\n}\r\n\r\nfunction MarkdownH2({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h2\r\n className={cn(markdownComponents.h2, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h2>\r\n );\r\n}\r\n\r\nfunction MarkdownH3({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h3\r\n className={cn(markdownComponents.h3, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h3>\r\n );\r\n}\r\n\r\n/**\r\n * List renderers for Markdown\r\n */\r\nfunction MarkdownUl({ className, children, ...props }: React.HTMLAttributes<HTMLUListElement>) {\r\n return (\r\n <ul\r\n className={cn(markdownComponents.ul, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction MarkdownOl({ className, children, ...props }: React.HTMLAttributes<HTMLOListElement>) {\r\n return (\r\n <ol\r\n className={cn(markdownComponents.ol, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ol>\r\n );\r\n}\r\n\r\nfunction MarkdownLi({ className, children, ...props }: React.HTMLAttributes<HTMLLIElement>) {\r\n return (\r\n <li\r\n className={cn(markdownComponents.li, className)}\r\n {...props}\r\n >\r\n {children}\r\n </li>\r\n );\r\n}\r\n\r\n/**\r\n * Blockquote renderer for Markdown\r\n */\r\nfunction MarkdownBlockquote({ className, children, ...props }: React.HTMLAttributes<HTMLQuoteElement>) {\r\n return (\r\n <blockquote\r\n className={cn(markdownComponents.blockquote, className)}\r\n {...props}\r\n >\r\n {children}\r\n </blockquote>\r\n );\r\n}\r\n\r\n/**\r\n * Anchor renderer for Markdown\r\n */\r\nfunction MarkdownA({ className, children, href, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\r\n return (\r\n <a\r\n className={cn(markdownComponents.a, className)}\r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n\r\n/**\r\n * Strong/Bold renderer for Markdown\r\n */\r\nfunction MarkdownStrong({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <strong\r\n className={cn(markdownComponents.strong, className)}\r\n {...props}\r\n >\r\n {children}\r\n </strong>\r\n );\r\n}\r\n\r\n// ========== Markdown Renderer ==========\r\n\r\n/**\r\n * Markdown content renderer with syntax highlighting\r\n */\r\nfunction MarkdownRenderer({ content, className }: { content: string; className?: string }) {\r\n return (\r\n <div className={cn('prose prose-sm dark:prose-invert max-w-none', className)}>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n components={{\r\n h1: MarkdownH1,\r\n h2: MarkdownH2,\r\n h3: MarkdownH3,\r\n p: MarkdownParagraph,\r\n ul: MarkdownUl,\r\n ol: MarkdownOl,\r\n li: MarkdownLi,\r\n code: MarkdownCode,\r\n pre: MarkdownPre,\r\n blockquote: MarkdownBlockquote,\r\n a: MarkdownA,\r\n strong: MarkdownStrong,\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Text Renderer ==========\r\n\r\n/**\r\n * Plain text renderer with escape sequence handling\r\n */\r\nfunction TextRenderer({ content, maxLines }: { content: string; maxLines?: number }) {\r\n const lines = useMemo(() => {\r\n return content.split('\\n');\r\n }, [content]);\r\n\r\n const displayLines = useMemo(() => {\r\n if (maxLines && lines.length > maxLines) {\r\n return lines.slice(0, maxLines);\r\n }\r\n return lines;\r\n }, [lines, maxLines]);\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n\r\n return (\r\n <div className=\"text-sm text-foreground whitespace-pre-wrap break-words font-mono\">\r\n {displayLines.map((line, index) => (\r\n <div key={index}>{line || '\\u00A0'}</div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic text-xs mt-2\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Content Detection ==========\r\n\r\n/**\r\n * Auto-detect content format\r\n */\r\nfunction detectContentFormat(content: string): 'markdown' | 'json' | 'text' {\r\n const trimmed = content.trim();\r\n\r\n // Check for JSON first\r\n const jsonDetection = detectJsonContent(trimmed);\r\n if (jsonDetection.isJson) {\r\n return 'json';\r\n }\r\n\r\n // Check for Markdown patterns\r\n const markdownPatterns = [\r\n /^#{1,6}\\s+/m, // Headings\r\n /^\\*{3,}$/m, // Horizontal rule\r\n /^\\s*[-*+]\\s+/m, // Unordered lists\r\n /^\\s*\\d+\\.\\s+/m, // Ordered lists\r\n /\\[.*?\\]\\(.*?\\)/, // Links\r\n /`{3,}[\\s\\S]*?`{3,}/, // Code blocks\r\n /\\*\\*.*?\\*\\*/, // Bold\r\n /_.*?_/, // Italic\r\n /^\\s*>\\s+/m, // Blockquotes\r\n ];\r\n\r\n for (const pattern of markdownPatterns) {\r\n if (pattern.test(trimmed)) {\r\n return 'markdown';\r\n }\r\n }\r\n\r\n // Default to text\r\n return 'text';\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * MessageRenderer Component\r\n *\r\n * Renders message content with automatic format detection:\r\n * - JSON: Structured display with JsonFormatter\r\n * - Markdown: Rich text with syntax highlighting\r\n * - Text: Plain text with escape sequence handling\r\n *\r\n * Supports escape sequence handling (e.g., \\n → newline)\r\n */\r\nexport function MessageRenderer({\r\n content,\r\n className,\r\n format,\r\n maxLines,\r\n}: MessageRendererProps) {\r\n // Process escape sequences\r\n const processedContent = useMemo(() => {\r\n // Replace common escape sequences\r\n return content\r\n .replace(/\\\\n/g, '\\n')\r\n .replace(/\\\\t/g, ' ')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\'/g, \"'\")\r\n .replace(/\\\\\\\\/g, '\\\\');\r\n }, [content]);\r\n\r\n // Auto-detect format if not specified\r\n const detectedFormat = useMemo(() => {\r\n if (format) {\r\n return format;\r\n }\r\n return detectContentFormat(processedContent);\r\n }, [processedContent, format]);\r\n\r\n // Render based on format\r\n switch (detectedFormat) {\r\n case 'json':\r\n return (\r\n <div className={className}>\r\n <JsonFormatter\r\n content={processedContent}\r\n displayMode=\"text\"\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n\r\n case 'markdown':\r\n return (\r\n <MarkdownRenderer\r\n content={processedContent}\r\n className={className}\r\n />\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <TextRenderer\r\n content={processedContent}\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default MessageRenderer;\r\n"],"names":["detectJson","content","trimmed","parsed","format","error","extractJson","depth","inString","escape","end","i","char","codeBlockMatch","detectJsonContent","extracted","formatJson","data","indent","getJsonSummary","length","keys","getJsonValueTypeColor","value","CopyButton","text","copied","setCopied","useState","handleCopy","useCallback","err","jsx","Button","jsxs","Fragment","Check","Copy","JsonValue","colorClass","item","index","entries","key","val","JsonCompact","JsonCard","showTypeLabels","expandedKeys","setExpandedKeys","toggleKey","prev","next","Braces","isObject","isExpanded","isArray","summary","cn","ChevronDown","ChevronRight","JsonText","maxLines","formatted","useMemo","lines","showTruncated","displayLines","line","JsonFormatter","displayMode","className","detection","markdownComponents","MarkdownCode","children","props","MarkdownPre","MarkdownParagraph","MarkdownH1","MarkdownH2","MarkdownH3","MarkdownUl","MarkdownOl","MarkdownLi","MarkdownBlockquote","MarkdownA","href","MarkdownStrong","MarkdownRenderer","ReactMarkdown","remarkGfm","rehypeHighlight","TextRenderer","detectContentFormat","markdownPatterns","pattern","MessageRenderer","processedContent"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";/*!
2
+ Theme: Atelier Forest
3
+ Author: Bram de Haan (http://atelierbramdehaan.nl)
4
+ License: ~ MIT (or more permissive) [via base16-schemes-source]
5
+ Maintainer: @highlightjs/core-team
6
+ Version: 2021.09.0
7
+ */pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#a8a19f;background:#1b1918}.hljs::-moz-selection,.hljs ::-moz-selection{background-color:#68615e;color:#a8a19f}.hljs::selection,.hljs ::selection{background-color:#68615e;color:#a8a19f}.hljs-comment{color:#766e6b}.hljs-tag{color:#9c9491}.hljs-subst,.hljs-punctuation,.hljs-operator{color:#a8a19f}.hljs-operator{opacity:.7}.hljs-bullet,.hljs-variable,.hljs-template-variable,.hljs-selector-tag,.hljs-name,.hljs-deletion{color:#f22c40}.hljs-symbol,.hljs-number,.hljs-link,.hljs-attr,.hljs-variable.constant_,.hljs-literal{color:#df5320}.hljs-title,.hljs-class .hljs-title,.hljs-title.class_{color:#c38418}.hljs-strong{font-weight:700;color:#c38418}.hljs-code,.hljs-addition,.hljs-title.class_.inherited__,.hljs-string{color:#7b9726}.hljs-built_in,.hljs-doctag,.hljs-quote,.hljs-keyword.hljs-atrule,.hljs-regexp{color:#3d97b8}.hljs-function .hljs-title,.hljs-attribute,.ruby .hljs-property,.hljs-title.function_,.hljs-section{color:#407ee7}.hljs-type,.hljs-template-tag,.diff .hljs-meta,.hljs-keyword{color:#6666ea}.hljs-emphasis{color:#6666ea;font-style:italic}.hljs-meta,.hljs-meta .hljs-keyword,.hljs-meta .hljs-string{color:#c33ff3}.hljs-meta .hljs-keyword,.hljs-meta-keyword{font-weight:700}.font-mono{font-family:JetBrains Mono,Monaco,Menlo,Ubuntu Mono,monospace}.tabular-nums{font-variant-numeric:tabular-nums}.diagonal-nums{font-variant-numeric:diagonal-nums}.stacked-fractions{font-variant-numeric:stacked-fractions}.font-mono-tabular{font-family:JetBrains Mono,Monaco,Menlo,Ubuntu Mono,monospace;font-variant-numeric:tabular-nums}.font-light{font-weight:300}.leading-loose{line-height:2}.tracking-normal{letter-spacing:0}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
8
+ */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Consolas,Monaco,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}*{border-color:hsl(var(--border, 220 20% 88%))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code,kbd,pre{font-family:Consolas,Monaco,Courier New,monospace;font-family:JetBrains Mono,Monaco,Menlo,Ubuntu Mono,monospace}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.border-gradient-brand{position:relative;z-index:0}.border-gradient-brand:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:inherit;padding:1px;background:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\!-bottom-1\.5{bottom:-.375rem!important}.\!-top-1\.5{top:-.375rem!important}.-bottom-1{bottom:-.25rem}.-right-1{right:-.25rem}.-right-2{right:-.5rem}.-top-1{top:-.25rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.bottom-0\.5{bottom:.125rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-4{left:1rem}.left-\[50\%\]{left:50%}.left-full{left:100%}.right-0{right:0}.right-0\.5{right:.125rem}.right-1{right:.25rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[-3\]{z-index:-3}.z-\[100\]{z-index:100}.col-span-1{grid-column:span 1 / span 1}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.-m-4{margin:-1rem}.m-0{margin:0}.m-2{margin:.5rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-mb-px{margin-bottom:-1px}.-mt-2{margin-top:-.5rem}.-mt-4{margin-top:-1rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-0{margin-left:0}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\!h-0{height:0px!important}.\!h-3{height:.75rem!important}.h-0{height:0px}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[40px\]{height:40px}.h-\[420px\]{height:420px}.h-\[50vh\]{height:50vh}.h-\[600px\]{height:600px}.h-\[70vh\]{height:70vh}.h-\[8px\]{height:8px}.h-\[90vh\]{height:90vh}.h-\[calc\(100\%\+2rem\)\]{height:calc(100% + 2rem)}.h-\[calc\(100vh-180px\)\]{height:calc(100vh - 180px)}.h-\[calc\(100vh-56px\)\]{height:calc(100vh - 56px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:0px}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[200px\]{max-height:200px}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[600px\]{max-height:600px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-4{min-height:1rem}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[150px\]{min-height:150px}.min-h-\[200px\]{min-height:200px}.min-h-\[300px\]{min-height:300px}.min-h-\[38px\]{min-height:38px}.min-h-\[400px\]{min-height:400px}.min-h-\[40px\]{min-height:40px}.min-h-\[500px\]{min-height:500px}.min-h-\[50px\]{min-height:50px}.min-h-\[60px\]{min-height:60px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.min-h-\[90px\]{min-height:90px}.min-h-screen{min-height:100vh}.\!w-0{width:0px!important}.\!w-3{width:.75rem!important}.w-0{width:0px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[1568px\]{width:1568px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[22\%\]{width:22%}.w-\[240px\]{width:240px}.w-\[260px\]{width:260px}.w-\[28\%\]{width:28%}.w-\[50\%\]{width:50%}.w-\[540px\]{width:540px}.w-\[600px\]{width:600px}.w-\[60px\]{width:60px}.w-\[720px\]{width:720px}.w-\[8px\]{width:8px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-40{min-width:10rem}.min-w-5{min-width:1.25rem}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[240px\]{min-width:240px}.min-w-\[280px\]{min-width:280px}.min-w-\[3rem\]{min-width:3rem}.min-w-\[45px\]{min-width:45px}.min-w-\[70px\]{min-width:70px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[90px\]{min-width:90px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-32{max-width:8rem}.max-w-3xl{max-width:48rem}.max-w-48{max-width:12rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[240px\]{max-width:240px}.max-w-\[250px\]{max-width:250px}.max-w-\[300px\]{max-width:300px}.max-w-\[400px\]{max-width:400px}.max-w-\[80px\]{max-width:80px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.animate-marquee{animation:marquee 30s linear infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.scroll-mt-4{scroll-margin-top:1rem}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[3fr_2fr\]{grid-template-columns:3fr 2fr}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-\[2px\]{gap:2px}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--border, 220 20% 88%))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded{border-radius:.25rem!important}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-tr-md{border-top-right-radius:.375rem}.\!border-0{border-width:0px!important}.\!border-2{border-width:2px!important}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-b-\[4px\]{border-bottom-width:4px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-l-\[6px\]{border-left-width:6px}.border-r{border-right-width:1px}.border-r-0{border-right-width:0px}.border-t{border-top-width:1px}.border-t-\[4px\]{border-top-width:4px}.border-dashed{border-style:dashed}.border-none{border-style:none}.\!border-background{border-color:hsl(var(--background))!important}.\!border-border{border-color:hsl(var(--border, 220 20% 88%))!important}.border-accent{border-color:hsl(var(--accent, 220 90% 56%))}.border-accent-foreground\/30{border-color:hsl(var(--accent-foreground) / .3)}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-amber-500\/30{border-color:#f59e0b4d}.border-amber-500\/50{border-color:#f59e0b80}.border-background{border-color:hsl(var(--background))}.border-bg{border-color:hsl(var(--bg, 0 0% 98%))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-border{border-color:hsl(var(--border, 220 20% 88%))}.border-current{border-color:currentColor}.border-cyan-200{--tw-border-opacity: 1;border-color:rgb(165 243 252 / var(--tw-border-opacity, 1))}.border-cyan-500{--tw-border-opacity: 1;border-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.border-cyan-500\/30{border-color:#06b6d44d}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-gray-500\/20{border-color:#6b728033}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-green-500\/50{border-color:#22c55e80}.border-green-600{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-indigo-500{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.border-info{border-color:hsl(var(--info))}.border-info\/20{border-color:hsl(var(--info) / .2)}.border-info\/30{border-color:hsl(var(--info) / .3)}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-muted-foreground{border-color:hsl(var(--muted-foreground))}.border-muted-foreground\/30{border-color:hsl(var(--muted-foreground) / .3)}.border-muted-foreground\/50{border-color:hsl(var(--muted-foreground) / .5)}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-orange-300{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1))}.border-orange-500{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-orange-500\/30{border-color:#f973164d}.border-orange-500\/50{border-color:#f9731680}.border-pink-200{--tw-border-opacity: 1;border-color:rgb(251 207 232 / var(--tw-border-opacity, 1))}.border-primary{border-color:hsl(var(--primary))}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/40{border-color:hsl(var(--primary) / .4)}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-purple-500{--tw-border-opacity: 1;border-color:rgb(168 85 247 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-purple-500\/30{border-color:#a855f74d}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-rose-500{--tw-border-opacity: 1;border-color:rgb(244 63 94 / var(--tw-border-opacity, 1))}.border-rose-500\/30{border-color:#f43f5e4d}.border-sky-200\/40{border-color:#bae6fd66}.border-sky-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-slate-200\/30{border-color:#e2e8f04d}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-400{--tw-border-opacity: 1;border-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.border-slate-400\/30{border-color:#94a3b84d}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.border-success{border-color:hsl(var(--success))}.border-success\/20{border-color:hsl(var(--success) / .2)}.border-success\/30{border-color:hsl(var(--success) / .3)}.border-teal-500{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-violet-200\/40{border-color:#ddd6fe66}.border-violet-400{--tw-border-opacity: 1;border-color:rgb(167 139 250 / var(--tw-border-opacity, 1))}.border-violet-500\/30{border-color:#8b5cf64d}.border-warning{border-color:hsl(var(--warning))}.border-warning\/20{border-color:hsl(var(--warning) / .2)}.border-warning\/30{border-color:hsl(var(--warning) / .3)}.border-warning\/50{border-color:hsl(var(--warning) / .5)}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-500{--tw-border-opacity: 1;border-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.border-yellow-500\/20{border-color:#eab30833}.border-yellow-500\/30{border-color:#eab3084d}.border-yellow-500\/50{border-color:#eab30880}.border-b-transparent{border-bottom-color:transparent}.border-l-amber-500{--tw-border-opacity: 1;border-left-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-l-blue-500{--tw-border-opacity: 1;border-left-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-l-border{border-left-color:hsl(var(--border, 220 20% 88%))}.border-l-cyan-500{--tw-border-opacity: 1;border-left-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.border-l-destructive{border-left-color:hsl(var(--destructive))}.border-l-emerald-500{--tw-border-opacity: 1;border-left-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-l-gray-500{--tw-border-opacity: 1;border-left-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-l-green-500{--tw-border-opacity: 1;border-left-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-l-indigo-500{--tw-border-opacity: 1;border-left-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.border-l-muted-foreground{border-left-color:hsl(var(--muted-foreground))}.border-l-muted-foreground\/50{border-left-color:hsl(var(--muted-foreground) / .5)}.border-l-primary{border-left-color:hsl(var(--primary))}.border-l-primary\/50{border-left-color:hsl(var(--primary) / .5)}.border-l-red-500{--tw-border-opacity: 1;border-left-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-l-rose-500{--tw-border-opacity: 1;border-left-color:rgb(244 63 94 / var(--tw-border-opacity, 1))}.border-l-slate-400{--tw-border-opacity: 1;border-left-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.border-l-teal-500{--tw-border-opacity: 1;border-left-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.border-l-violet-500{--tw-border-opacity: 1;border-left-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-l-warning{border-left-color:hsl(var(--warning))}.border-l-yellow-500{--tw-border-opacity: 1;border-left-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.border-l-yellow-500\/50{border-left-color:#eab30880}.border-t-accent{border-top-color:hsl(var(--accent, 220 90% 56%))}.border-t-transparent{border-top-color:transparent}.\!bg-amber-500{--tw-bg-opacity: 1 !important;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))!important}.\!bg-blue-500{--tw-bg-opacity: 1 !important;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))!important}.\!bg-card{background-color:hsl(var(--card))!important}.\!bg-cyan-500{--tw-bg-opacity: 1 !important;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))!important}.\!bg-gray-400{--tw-bg-opacity: 1 !important;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))!important}.\!bg-green-500{--tw-bg-opacity: 1 !important;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))!important}.\!bg-orange-500{--tw-bg-opacity: 1 !important;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))!important}.\!bg-purple-500{--tw-bg-opacity: 1 !important;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))!important}.\!bg-sky-500{--tw-bg-opacity: 1 !important;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))!important}.\!bg-teal-500{--tw-bg-opacity: 1 !important;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))!important}.\!bg-transparent{background-color:transparent!important}.bg-accent{background-color:hsl(var(--accent, 220 90% 56%))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-amber-500\/80{background-color:#f59e0bcc}.bg-background{background-color:hsl(var(--background))}.bg-background\/50{background-color:hsl(var(--background) / .5)}.bg-background\/60{background-color:hsl(var(--background) / .6)}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/90{background-color:hsl(var(--background) / .9)}.bg-bg{background-color:hsl(var(--bg, 0 0% 98%))}.bg-black\/20{background-color:#0003}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/80{background-color:#000c}.bg-black\/90{background-color:#000000e6}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-blue-500\/5{background-color:#3b82f60d}.bg-blue-500\/80{background-color:#3b82f6cc}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-border{background-color:hsl(var(--border, 220 20% 88%))}.bg-card{background-color:hsl(var(--card))}.bg-card\/50{background-color:hsl(var(--card) / .5)}.bg-card\/90{background-color:hsl(var(--card) / .9)}.bg-card\/95{background-color:hsl(var(--card) / .95)}.bg-current{background-color:currentColor}.bg-cyan-100{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.bg-cyan-500{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-cyan-500\/15{background-color:#06b6d426}.bg-cyan-500\/5{background-color:#06b6d40d}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/20{background-color:hsl(var(--destructive) / .2)}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/5{background-color:#10b9810d}.bg-foreground{background-color:hsl(var(--foreground))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-500\/10{background-color:#6b72801a}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-green-500\/5{background-color:#22c55e0d}.bg-green-500\/80{background-color:#22c55ecc}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-indigo-500{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.bg-indigo-500\/10{background-color:#6366f11a}.bg-indigo\/10{background-color:hsl(var(--indigo) / .1)}.bg-info{background-color:hsl(var(--info))}.bg-info-light{background-color:hsl(var(--info-light))}.bg-info\/10{background-color:hsl(var(--info) / .1)}.bg-info\/20{background-color:hsl(var(--info) / .2)}.bg-info\/5{background-color:hsl(var(--info) / .05)}.bg-input{background-color:hsl(var(--input))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground{background-color:hsl(var(--muted-foreground))}.bg-muted-foreground\/20{background-color:hsl(var(--muted-foreground) / .2)}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground) / .3)}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground) / .4)}.bg-muted\/10{background-color:hsl(var(--muted) / .1)}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-muted\/80{background-color:hsl(var(--muted) / .8)}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/10{background-color:#f973161a}.bg-orange-500\/15{background-color:#f9731626}.bg-orange-500\/5{background-color:#f973160d}.bg-pink-100{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.bg-pink-500{--tw-bg-opacity: 1;background-color:rgb(236 72 153 / var(--tw-bg-opacity, 1))}.bg-pink-500\/10{background-color:#ec48991a}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-foreground{background-color:hsl(var(--primary-foreground))}.bg-primary-light{background-color:hsl(var(--primary-light))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/15{background-color:hsl(var(--primary) / .15)}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/40{background-color:hsl(var(--primary) / .4)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/50{background-color:hsl(var(--primary) / .5)}.bg-primary\/60{background-color:hsl(var(--primary) / .6)}.bg-primary\/90{background-color:hsl(var(--primary) / .9)}.bg-primary\/\[0\.02\]{background-color:hsl(var(--primary) / .02)}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-purple-500\/15{background-color:#a855f726}.bg-purple-500\/20{background-color:#a855f733}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-rose-400{--tw-bg-opacity: 1;background-color:rgb(251 113 133 / var(--tw-bg-opacity, 1))}.bg-rose-50\/40{background-color:#fff1f266}.bg-rose-50\/60{background-color:#fff1f299}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/5{background-color:#f43f5e0d}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/30{background-color:hsl(var(--secondary) / .3)}.bg-secondary\/50{background-color:hsl(var(--secondary) / .5)}.bg-sidebar-background{background-color:hsl(var(--sidebar-background))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-50\/40{background-color:#f0f9ff66}.bg-sky-50\/60{background-color:#f0f9ff99}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-sky-500\/10{background-color:#0ea5e91a}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-slate-300\/20{background-color:#cbd5e133}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-400\/20{background-color:#94a3b833}.bg-slate-50\/40{background-color:#f8fafc66}.bg-slate-50\/60{background-color:#f8fafc99}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-success{background-color:hsl(var(--success))}.bg-success-light{background-color:hsl(var(--success-light))}.bg-success\/10{background-color:hsl(var(--success) / .1)}.bg-success\/20{background-color:hsl(var(--success) / .2)}.bg-success\/5{background-color:hsl(var(--success) / .05)}.bg-surface{background-color:hsl(var(--surface, 220 60% 99%))}.bg-teal-500{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.bg-teal-500\/10{background-color:#14b8a61a}.bg-transparent{background-color:transparent}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.bg-violet-200\/50{background-color:#ddd6fe80}.bg-violet-50\/40{background-color:#f5f3ff66}.bg-violet-50\/60{background-color:#f5f3ff99}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-violet-500\/10{background-color:#8b5cf61a}.bg-violet-500\/20{background-color:#8b5cf633}.bg-violet-500\/5{background-color:#8b5cf60d}.bg-warning{background-color:hsl(var(--warning))}.bg-warning-light{background-color:hsl(var(--warning-light))}.bg-warning\/10{background-color:hsl(var(--warning) / .1)}.bg-warning\/20{background-color:hsl(var(--warning) / .2)}.bg-warning\/5{background-color:hsl(var(--warning) / .05)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/60{background-color:#fff9}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.bg-yellow-500\/15{background-color:#eab30826}.bg-yellow-500\/5{background-color:#eab3080d}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-500{--tw-gradient-from: #f59e0b var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-muted\/30{--tw-gradient-from: hsl(var(--muted) / .3) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--muted) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-muted\/10{--tw-gradient-to: hsl(var(--muted) / .1) var(--tw-gradient-to-position)}.to-orange-600{--tw-gradient-to: #ea580c var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.stroke-gray-500{stroke:#6b7280}.stroke-green-500{stroke:#22c55e}.stroke-purple-500{stroke:#a855f7}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-1{padding-left:.25rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9,.pl-\[calc\(1\.5rem\+0\.75rem\)\]{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-baseline{vertical-align:baseline}.align-middle{vertical-align:middle}.font-mono{font-family:Consolas,Monaco,Courier New,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{color:hsl(var(--accent, 220 90% 56%))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-600\/80{color:#d97706cc}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-background{color:hsl(var(--background))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-600\/80{color:#2563ebcc}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-border{color:hsl(var(--border, 220 20% 88%))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-cyan-500{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-cyan-800{--tw-text-opacity: 1;color:rgb(21 94 117 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-destructive\/50{color:hsl(var(--destructive) / .5)}.text-destructive\/80{color:hsl(var(--destructive) / .8)}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-600\/80{color:#059669cc}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo{color:hsl(var(--indigo))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-info{color:hsl(var(--info))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/30{color:hsl(var(--muted-foreground) / .3)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-500\/80{color:#f97316cc}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-pink-500{--tw-text-opacity: 1;color:rgb(236 72 153 / var(--tw-text-opacity, 1))}.text-pink-600{--tw-text-opacity: 1;color:rgb(219 39 119 / var(--tw-text-opacity, 1))}.text-pink-800{--tw-text-opacity: 1;color:rgb(157 23 77 / var(--tw-text-opacity, 1))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/50{color:hsl(var(--primary) / .5)}.text-primary\/60{color:hsl(var(--primary) / .6)}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-rose-900{--tw-text-opacity: 1;color:rgb(136 19 55 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sky-500{--tw-text-opacity: 1;color:rgb(14 165 233 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-sky-900{--tw-text-opacity: 1;color:rgb(12 74 110 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-50{--tw-text-opacity: 1;color:rgb(248 250 252 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-success{color:hsl(var(--success))}.text-teal-500{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-teal-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.text-text{color:hsl(var(--text, 220 30% 15%))}.text-text-secondary{color:hsl(var(--text-secondary, 220 15% 45%))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-violet-600{--tw-text-opacity: 1;color:rgb(124 58 237 / var(--tw-text-opacity, 1))}.text-violet-600\/80{color:#7c3aedcc}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-violet-900{--tw-text-opacity: 1;color:rgb(76 29 149 / var(--tw-text-opacity, 1))}.text-warning{color:hsl(var(--warning))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-600\/80{color:#ca8a04cc}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-\[hsl\(var\(--accent\)\)\]{accent-color:hsl(var(--accent))}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.\!shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 2px 8px rgb(0 0 0 / .08);--tw-shadow-colored: 0 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(34\,197\,94\,0\.5\)\]{--tw-shadow: 0 0 6px rgba(34,197,94,.5);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(99\,102\,241\,0\.4\)\]{--tw-shadow: 0 0 6px rgba(99,102,241,.4);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 8px 24px rgb(0 0 0 / .12);--tw-shadow-colored: 0 8px 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 12px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-primary\/20{--tw-shadow-color: hsl(var(--primary) / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-color: hsl(var(--accent, 220 90% 56%))}.ring-amber-500\/20{--tw-ring-color: rgb(245 158 11 / .2)}.ring-blue-500\/20{--tw-ring-color: rgb(59 130 246 / .2)}.ring-blue-500\/50{--tw-ring-color: rgb(59 130 246 / .5)}.ring-cyan-500\/20{--tw-ring-color: rgb(6 182 212 / .2)}.ring-green-500\/20{--tw-ring-color: rgb(34 197 94 / .2)}.ring-indigo-500\/20{--tw-ring-color: rgb(99 102 241 / .2)}.ring-orange-500\/20{--tw-ring-color: rgb(249 115 22 / .2)}.ring-primary{--tw-ring-color: hsl(var(--primary))}.ring-primary\/20{--tw-ring-color: hsl(var(--primary) / .2)}.ring-primary\/30{--tw-ring-color: hsl(var(--primary) / .3)}.ring-primary\/40{--tw-ring-color: hsl(var(--primary) / .4)}.ring-primary\/50{--tw-ring-color: hsl(var(--primary) / .5)}.ring-purple-500\/20{--tw-ring-color: rgb(168 85 247 / .2)}.ring-sky-500\/20{--tw-ring-color: rgb(14 165 233 / .2)}.ring-teal-500\/20{--tw-ring-color: rgb(20 184 166 / .2)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-2{--tw-ring-offset-width: 2px}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale-\[0\.5\]{--tw-grayscale: grayscale(.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-150{transition-delay:.15s}.delay-75{transition-delay:75ms}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.contain-content{contain:content}.contain-strict{contain:strict}.contain-layout{--tw-contain-layout: layout;contain:var(--tw-contain-size) var(--tw-contain-layout) var(--tw-contain-paint) var(--tw-contain-style)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in,.fade-in-0{--tw-enter-opacity: 0}.zoom-in{--tw-enter-scale: 0}.zoom-in-95{--tw-enter-scale: .95}.slide-in-from-right{--tw-enter-translate-x: 100%}.slide-in-from-top-1{--tw-enter-translate-y: -.25rem}.slide-in-from-top-2{--tw-enter-translate-y: -.5rem}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.delay-150{animation-delay:.15s}.delay-75{animation-delay:75ms}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.running{animation-play-state:running}.paused{animation-play-state:paused}.bg-gradient-primary{background-image:radial-gradient(circle,hsl(var(--accent)) 0%,transparent 70%)}.bg-gradient-brand{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.hover-glow{transition:box-shadow .3s ease-in-out}.hover-glow:hover{box-shadow:0 0 40px 10px hsl(var(--accent) / .7)}.hover-glow-primary{transition:box-shadow .3s ease-in-out}.hover-glow-primary:hover{box-shadow:0 0 40px 10px hsl(var(--primary) / .5)}:root,[data-theme=light-blue]{--bg: 0 0% 98%;--surface: 220 60% 99%;--border: 220 20% 88%;--text: 220 30% 15%;--text-secondary: 220 15% 45%;--accent: 220 60% 65%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 0 0% 100%;--primary-light: 220 60% 92%;--secondary: 220 60% 65%;--secondary-foreground: 0 0% 100%;--accent-foreground: 0 0% 100%;--destructive: 8 75% 55%;--destructive-foreground: 0 0% 100%;--muted: 220 20% 96%;--muted-foreground: var(--text-secondary);--sidebar-background: 220 40% 97%;--sidebar-foreground: var(--text);--hover: 220 20% 93%;--input: var(--border);--ring: var(--accent);--success: 142 71% 45%;--success-light: 142 76% 90%;--warning: 38 92% 50%;--warning-light: 48 96% 89%;--info: 220 60% 60%;--info-light: 210 80% 92%;--indigo: 239 65% 60%;--indigo-light: 239 65% 92%;--orange: 25 90% 55%;--orange-light: 25 90% 92%}[data-theme=dark-blue]{--bg: 220 30% 10%;--surface: 220 25% 14%;--border: 220 20% 22%;--text: 220 20% 90%;--text-secondary: 220 15% 60%;--accent: 220 60% 65%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 220 30% 10%;--primary-light: 220 60% 30%;--secondary: 220 60% 60%;--secondary-foreground: 0 0% 100%;--accent-foreground: 220 30% 10%;--destructive: 8 70% 50%;--destructive-foreground: 0 0% 100%;--muted: 220 25% 18%;--muted-foreground: var(--text-secondary);--sidebar-background: 220 30% 12%;--sidebar-foreground: var(--text);--hover: 220 20% 24%;--input: var(--border);--ring: var(--accent);--success: 142 71% 40%;--success-light: 142 50% 20%;--warning: 38 85% 45%;--warning-light: 40 50% 20%;--info: 220 60% 55%;--info-light: 210 50% 20%;--indigo: 239 60% 55%;--indigo-light: 239 40% 20%;--orange: 25 85% 50%;--orange-light: 25 50% 20%}[data-theme=light-green]{--bg: 0 0% 98%;--surface: 150 50% 99%;--border: 150 20% 88%;--text: 150 30% 15%;--text-secondary: 150 15% 45%;--accent: 150 75% 42%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 0 0% 100%;--primary-light: 150 75% 95%;--secondary: 150 60% 55%;--secondary-foreground: 0 0% 100%;--accent-foreground: 0 0% 100%;--destructive: 8 75% 55%;--destructive-foreground: 0 0% 100%;--muted: 150 20% 96%;--muted-foreground: var(--text-secondary);--sidebar-background: 150 30% 97%;--sidebar-foreground: var(--text);--hover: 150 20% 93%;--input: var(--border);--ring: var(--accent);--success: 142 71% 45%;--success-light: 142 76% 90%;--warning: 38 92% 50%;--warning-light: 48 96% 89%;--info: 210 80% 55%;--info-light: 210 80% 92%;--indigo: 239 65% 60%;--indigo-light: 239 65% 92%;--orange: 25 90% 55%;--orange-light: 25 90% 92%}[data-theme=dark-green]{--bg: 150 30% 10%;--surface: 150 25% 14%;--border: 150 20% 22%;--text: 150 15% 90%;--text-secondary: 150 12% 60%;--accent: 150 75% 45%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 150 30% 10%;--primary-light: 150 60% 25%;--secondary: 150 55% 50%;--secondary-foreground: 0 0% 100%;--accent-foreground: 150 30% 10%;--destructive: 8 70% 50%;--destructive-foreground: 0 0% 100%;--muted: 150 25% 18%;--muted-foreground: var(--text-secondary);--sidebar-background: 150 30% 12%;--sidebar-foreground: var(--text);--hover: 150 20% 24%;--input: var(--border);--ring: var(--accent);--success: 142 71% 40%;--success-light: 142 50% 20%;--warning: 38 85% 45%;--warning-light: 40 50% 20%;--info: 210 75% 50%;--info-light: 210 50% 20%;--indigo: 239 60% 55%;--indigo-light: 239 40% 20%;--orange: 25 85% 50%;--orange-light: 25 50% 20%}[data-theme=light-orange]{--bg: 0 0% 98%;--surface: 25 70% 99%;--border: 25 30% 88%;--text: 25 30% 15%;--text-secondary: 25 15% 45%;--accent: 25 95% 53%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 0 0% 100%;--primary-light: 25 95% 95%;--secondary: 25 80% 60%;--secondary-foreground: 0 0% 100%;--accent-foreground: 0 0% 100%;--destructive: 8 75% 55%;--destructive-foreground: 0 0% 100%;--muted: 25 20% 96%;--muted-foreground: var(--text-secondary);--sidebar-background: 25 40% 97%;--sidebar-foreground: var(--text);--hover: 25 30% 93%;--input: var(--border);--ring: var(--accent);--success: 142 71% 45%;--success-light: 142 76% 90%;--warning: 38 92% 50%;--warning-light: 48 96% 89%;--info: 210 80% 55%;--info-light: 210 80% 92%;--indigo: 239 65% 60%;--indigo-light: 239 65% 92%;--orange: 25 90% 55%;--orange-light: 25 90% 92%}[data-theme=dark-orange]{--bg: 25 30% 10%;--surface: 25 25% 14%;--border: 25 20% 22%;--text: 25 15% 90%;--text-secondary: 25 12% 60%;--accent: 25 95% 55%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 25 30% 10%;--primary-light: 25 80% 30%;--secondary: 25 75% 55%;--secondary-foreground: 0 0% 100%;--accent-foreground: 25 30% 10%;--destructive: 8 70% 50%;--destructive-foreground: 0 0% 100%;--muted: 25 25% 18%;--muted-foreground: var(--text-secondary);--sidebar-background: 25 30% 12%;--sidebar-foreground: var(--text);--hover: 25 20% 24%;--input: var(--border);--ring: var(--accent);--success: 142 71% 40%;--success-light: 142 50% 20%;--warning: 38 85% 45%;--warning-light: 40 50% 20%;--info: 210 75% 50%;--info-light: 210 50% 20%;--indigo: 239 60% 55%;--indigo-light: 239 40% 20%;--orange: 25 85% 50%;--orange-light: 25 50% 20%}[data-theme=light-purple]{--bg: 0 0% 98%;--surface: 270 60% 99%;--border: 270 20% 88%;--text: 270 30% 15%;--text-secondary: 270 15% 45%;--accent: 270 75% 60%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 0 0% 100%;--primary-light: 270 75% 95%;--secondary: 270 65% 65%;--secondary-foreground: 0 0% 100%;--accent-foreground: 0 0% 100%;--destructive: 8 75% 55%;--destructive-foreground: 0 0% 100%;--muted: 270 20% 96%;--muted-foreground: var(--text-secondary);--sidebar-background: 270 35% 97%;--sidebar-foreground: var(--text);--hover: 270 20% 93%;--input: var(--border);--ring: var(--accent);--success: 142 71% 45%;--success-light: 142 76% 90%;--warning: 38 92% 50%;--warning-light: 48 96% 89%;--info: 210 80% 55%;--info-light: 210 80% 92%;--indigo: 239 65% 60%;--indigo-light: 239 65% 92%;--orange: 25 90% 55%;--orange-light: 25 90% 92%}[data-theme=dark-purple]{--bg: 270 30% 10%;--surface: 270 25% 14%;--border: 270 20% 22%;--text: 270 15% 90%;--text-secondary: 270 12% 60%;--accent: 270 75% 62%;--background: var(--bg);--foreground: var(--text);--card: var(--surface);--card-foreground: var(--text);--primary: var(--accent);--primary-foreground: 270 30% 10%;--primary-light: 270 60% 30%;--secondary: 270 60% 58%;--secondary-foreground: 0 0% 100%;--accent-foreground: 270 30% 10%;--destructive: 8 70% 50%;--destructive-foreground: 0 0% 100%;--muted: 270 25% 18%;--muted-foreground: var(--text-secondary);--sidebar-background: 270 30% 12%;--sidebar-foreground: var(--text);--hover: 270 20% 24%;--input: var(--border);--ring: var(--accent);--success: 142 71% 40%;--success-light: 142 50% 20%;--warning: 38 85% 45%;--warning-light: 40 50% 20%;--info: 210 75% 50%;--info-light: 210 50% 20%;--indigo: 239 60% 55%;--indigo-light: 239 40% 20%;--orange: 25 85% 50%;--orange-light: 25 50% 20%}[data-theme=dark]{--bg: var(--bg, 220 30% 10%);--surface: var(--surface, 220 25% 14%);--border: var(--border, 220 20% 22%);--text: var(--text, 220 20% 90%);--text-secondary: var(--text-secondary, 220 15% 60%);--accent: var(--accent, 220 60% 65%);--background: 220 30% 10%;--foreground: 220 20% 90%;--card: 220 25% 14%;--card-foreground: 220 20% 90%;--border: 220 20% 22%;--input: 220 20% 22%;--ring: 220 60% 65%;--primary: 220 60% 65%;--primary-foreground: 220 30% 10%;--primary-light: 220 60% 30%;--secondary: 220 60% 60%;--secondary-foreground: 0 0% 100%;--accent: 220 60% 65%;--accent-foreground: 220 30% 10%;--destructive: 8 70% 50%;--destructive-foreground: 0 0% 100%;--muted: 220 25% 18%;--muted-foreground: 220 15% 60%;--sidebar-background: 220 30% 12%;--sidebar-foreground: 220 20% 90%;--hover: 220 20% 24%;--success: 142 71% 40%;--success-light: 142 50% 20%;--warning: 38 85% 45%;--warning-light: 40 50% 20%;--info: 220 60% 55%;--info-light: 210 50% 20%;--indigo: 239 60% 55%;--indigo-light: 239 40% 20%;--orange: 25 85% 50%;--orange-light: 25 50% 20%}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}[data-gradient=off] .bg-gradient-primary,[data-gradient=off] .bg-gradient-brand,[data-gradient=off] .bg-gradient-accent{background-image:none!important;background:inherit}[data-gradient=off] .gradient-text{background-image:none!important;-webkit-background-clip:unset;background-clip:unset;-webkit-text-fill-color:inherit}[data-gradient=off] .border-gradient-brand:before{display:none}[data-gradient=standard] .bg-gradient-primary{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--accent)))}[data-gradient=standard] .bg-gradient-brand{background:linear-gradient(135deg,hsl(var(--accent)),hsl(var(--primary)))}[data-gradient=standard] .bg-gradient-accent{background:linear-gradient(90deg,hsl(var(--accent)),hsl(var(--primary)))}[data-gradient=standard] .gradient-text{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--accent)));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}[data-gradient=enhanced] .bg-gradient-primary{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--accent)),hsl(var(--secondary)))}[data-gradient=enhanced] .bg-gradient-brand{background:linear-gradient(135deg,hsl(var(--accent)),hsl(var(--primary)) 40%,hsl(var(--secondary)))}[data-gradient=enhanced] .bg-gradient-accent{background:linear-gradient(90deg,hsl(var(--accent)),hsl(var(--primary)),hsl(var(--accent)))}[data-gradient=enhanced] .gradient-text{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--accent)),hsl(var(--secondary)));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.hover-glow,.hover-glow-primary{transition:box-shadow .3s ease}.hover-glow:hover{box-shadow:0 0 20px hsla(var(--accent),.4)}.hover-glow-primary:hover{box-shadow:0 0 20px hsla(var(--primary),.4)}[data-hover-glow=false] .hover-glow:hover,[data-hover-glow=false] .hover-glow-primary:hover{box-shadow:none}@keyframes slow-gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}.animate-slow-gradient{background-size:200% 200%;animation:slow-gradient 15s ease infinite}[data-bg-animation=false] .animate-slow-gradient{animation:none;background-size:100% 100%}[data-gradient=standard] body:before{content:"";position:fixed;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle at 30% 30%,hsla(var(--accent),.03) 0%,transparent 50%),radial-gradient(circle at 70% 70%,hsla(var(--primary),.03) 0%,transparent 50%);pointer-events:none;z-index:-1}[data-gradient=enhanced] body:before{content:"";position:fixed;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle at 20% 20%,hsla(var(--accent),.08) 0%,transparent 40%),radial-gradient(circle at 80% 80%,hsla(var(--primary),.08) 0%,transparent 40%),radial-gradient(circle at 50% 50%,hsla(var(--secondary),.05) 0%,transparent 50%);pointer-events:none;z-index:-1;animation:ambient-shift 20s ease-in-out infinite}[data-gradient=off] body:before{display:none}@keyframes ambient-shift{0%,to{transform:translate(0)}50%{transform:translate(-2%,-2%)}}[data-reduced-motion=true]::view-transition-old(*),[data-reduced-motion=true]::view-transition-new(*),[data-reduced-motion=true]::view-transition-group(*){animation-duration:0s!important}[data-reduced-motion=true] .animate-slow-gradient{animation:none;background-size:100% 100%}[data-reduced-motion=true] .hover-glow:hover,[data-reduced-motion=true] .hover-glow-primary:hover{box-shadow:none}[data-reduced-motion=true] body:before{animation:none!important}[data-reduced-motion=true][data-gradient=enhanced] body:before{opacity:.5}@media(prefers-reduced-motion:reduce){::view-transition-old(*),::view-transition-new(*),::view-transition-group(*){animation-duration:0s!important}.animate-slow-gradient{animation:none;background-size:100% 100%}.hover-glow:hover,.hover-glow-primary:hover{box-shadow:none}body:before{animation:none!important}[data-gradient=enhanced] body:before{opacity:.5}}[data-bg-mode=image-only] body:before{display:none}[data-bg-mode=image-gradient] body:before{opacity:.6}.bg-image-layer{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-3;overflow:hidden;transition:opacity .5s ease}.bg-image-layer img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.bg-darken-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-2;pointer-events:none}.bg-grain-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-2;pointer-events:none;opacity:0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");background-repeat:repeat;background-size:256px 256px}[data-bg-grain=true] .bg-grain-overlay{opacity:.08}.bg-vignette-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-2;pointer-events:none;opacity:0;background:radial-gradient(ellipse at center,transparent 50%,rgba(0,0,0,.5) 100%)}[data-bg-vignette=true] .bg-vignette-overlay{opacity:1}[data-bg-frosted=true] .app-shell-content{backdrop-filter:blur(12px) saturate(1.2);-webkit-backdrop-filter:blur(12px) saturate(1.2);background-color:hsla(var(--bg),.75)}[data-reduced-motion=true] .bg-image-layer{transition:none!important}.markdown-preview{padding:1rem}.markdown-preview .prose{color:hsl(var(--text));max-width:none}.markdown-preview .prose h1,.markdown-preview .prose h2,.markdown-preview .prose h3,.markdown-preview .prose h4{color:hsl(var(--text));margin-top:1.5em;margin-bottom:.5em;font-weight:600}.markdown-preview .prose h1{font-size:1.5em}.markdown-preview .prose h2{font-size:1.25em}.markdown-preview .prose h3{font-size:1.125em}.markdown-preview .prose h4{font-size:1em}.markdown-preview .prose p{margin-top:.75em;margin-bottom:.75em}.markdown-preview .prose ul,.markdown-preview .prose ol{margin-top:.75em;margin-bottom:.75em;padding-left:1.5em}.markdown-preview .prose li{margin-top:.25em;margin-bottom:.25em}.markdown-preview .prose code{background-color:hsl(var(--muted));padding:.125em .375em;border-radius:.25em;font-size:.875em}.markdown-preview .prose pre{background-color:hsl(var(--muted));padding:1em;border-radius:.5em;overflow-x:auto;margin-top:.75em;margin-bottom:.75em}.markdown-preview .prose pre code{background-color:transparent;padding:0;font-size:.875em}.markdown-preview .prose blockquote{border-left:3px solid hsl(var(--accent));padding-left:1em;margin-left:0;color:hsl(var(--text-secondary));font-style:italic}.markdown-preview .prose a{color:hsl(var(--accent));text-decoration:underline}.markdown-preview .prose a:hover{opacity:.8}.markdown-preview .prose table{width:100%;border-collapse:collapse;margin-top:.75em;margin-bottom:.75em}.markdown-preview .prose th,.markdown-preview .prose td{border:1px solid hsl(var(--border));padding:.5em .75em;text-align:left}.markdown-preview .prose th{background-color:hsl(var(--muted));font-weight:600}.markdown-preview .prose hr{border:none;border-top:1px solid hsl(var(--border));margin-top:1.5em;margin-bottom:1.5em}.markdown-preview .hljs{background:transparent!important}[data-theme^=dark] .markdown-preview .prose pre{background-color:#171c26}[data-theme^=dark] .markdown-preview .prose code{background-color:#222a39}.ccw-logo,svg.ccw-logo,header .ccw-logo{color:hsl(var(--accent))!important}.ccw-logo circle,svg.ccw-logo circle{fill:currentColor}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:left-0:before{content:var(--tw-content);left:0}.before\:top-0:before{content:var(--tw-content);top:0}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-1:before{content:var(--tw-content);width:.25rem}.before\:rounded-l-md:before{content:var(--tw-content);border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.before\:bg-primary:before{content:var(--tw-content);background-color:hsl(var(--primary))}.before\:content-\[\'\'\]:before{--tw-content: "";content:var(--tw-content)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:ml-0\.5:after{content:var(--tw-content);margin-left:.125rem}.after\:h-4:after{content:var(--tw-content);height:1rem}.after\:w-4:after{content:var(--tw-content);width:1rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-background:after{content:var(--tw-content);background-color:hsl(var(--background))}.after\:text-destructive:after{content:var(--tw-content);color:hsl(var(--destructive))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\"\"\]:after{--tw-content: "";content:var(--tw-content)}.after\:content-\[\'\*\'\]:after{--tw-content: "*";content:var(--tw-content)}.last\:mb-0:last-child{margin-bottom:0}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-destructive\/50:focus-within{--tw-ring-color: hsl(var(--destructive) / .5)}.focus-within\:ring-ring:focus-within{--tw-ring-color: hsl(var(--ring))}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width: 2px}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent:hover{border-color:hsl(var(--accent, 220 90% 56%))}.hover\:border-accent-foreground\/20:hover{border-color:hsl(var(--accent-foreground) / .2)}.hover\:border-border:hover{border-color:hsl(var(--border, 220 20% 88%))}.hover\:border-foreground:hover{border-color:hsl(var(--foreground))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary) / .3)}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary) / .4)}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:bg-accent:hover{background-color:hsl(var(--accent, 220 90% 56%))}.hover\:bg-amber-200:hover{--tw-bg-opacity: 1;background-color:rgb(253 230 138 / var(--tw-bg-opacity, 1))}.hover\:bg-background:hover{background-color:hsl(var(--background))}.hover\:bg-background\/50:hover{background-color:hsl(var(--background) / .5)}.hover\:bg-black\/80:hover{background-color:#000c}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-200:hover{--tw-bg-opacity: 1;background-color:rgb(165 243 252 / var(--tw-bg-opacity, 1))}.hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-emerald-200:hover{--tw-bg-opacity: 1;background-color:rgb(167 243 208 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-hover:hover{background-color:hsl(var(--hover))}.hover\:bg-hover\/50:hover{background-color:hsl(var(--hover) / .5)}.hover\:bg-indigo-200:hover{--tw-bg-opacity: 1;background-color:rgb(199 210 254 / var(--tw-bg-opacity, 1))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted-foreground\/30:hover{background-color:hsl(var(--muted-foreground) / .3)}.hover\:bg-muted-foreground\/50:hover{background-color:hsl(var(--muted-foreground) / .5)}.hover\:bg-muted\/20:hover{background-color:hsl(var(--muted) / .2)}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted) / .4)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted) / .6)}.hover\:bg-muted\/70:hover{background-color:hsl(var(--muted) / .7)}.hover\:bg-muted\/80:hover{background-color:hsl(var(--muted) / .8)}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary-foreground\/20:hover{background-color:hsl(var(--primary-foreground) / .2)}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary) / .1)}.hover\:bg-primary\/15:hover{background-color:hsl(var(--primary) / .15)}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary) / .2)}.hover\:bg-primary\/50:hover{background-color:hsl(var(--primary) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-rose-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 205 211 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-500\/10:hover{background-color:#f43f5e1a}.hover\:bg-rose-500\/20:hover{background-color:#f43f5e33}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-sky-100\/40:hover{background-color:#e0f2fe66}.hover\:bg-sky-200:hover{--tw-bg-opacity: 1;background-color:rgb(186 230 253 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100\/40:hover{background-color:#f1f5f966}.hover\:bg-slate-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-surface:hover{background-color:hsl(var(--surface, 220 60% 99%))}.hover\:bg-violet-100\/40:hover{background-color:#ede9fe66}.hover\:bg-violet-200:hover{--tw-bg-opacity: 1;background-color:rgb(221 214 254 / var(--tw-bg-opacity, 1))}.hover\:text-accent:hover{color:hsl(var(--accent, 220 90% 56%))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-amber-500:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-green-500:hover{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:text-text:hover{color:hsl(var(--text, 220 30% 15%))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-yellow-600:hover{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-md:hover{--tw-shadow: 0 4px 12px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-accent:focus{border-color:hsl(var(--accent, 220 90% 56%))}.focus\:border-primary:focus{border-color:hsl(var(--primary))}.focus\:border-transparent:focus{border-color:transparent}.focus\:bg-accent:focus{background-color:hsl(var(--accent, 220 90% 56%))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent:focus{--tw-ring-color: hsl(var(--accent, 220 90% 56%))}.focus\:ring-primary:focus{--tw-ring-color: hsl(var(--primary))}.focus\:ring-primary\/30:focus{--tw-ring-color: hsl(var(--primary) / .3)}.focus\:ring-primary\/40:focus{--tw-ring-color: hsl(var(--primary) / .4)}.focus\:ring-primary\/50:focus{--tw-ring-color: hsl(var(--primary) / .5)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-1:focus{--tw-ring-offset-width: 1px}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-destructive:focus-visible{--tw-ring-color: hsl(var(--destructive))}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-muted:active{background-color:hsl(var(--muted))}.active\:opacity-100:active{opacity:1}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:flex{display:flex}.group:hover .group-hover\:text-primary{color:hsl(var(--primary))}.group\/path-item:hover .group-hover\/path-item\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:opacity-50{opacity:.5}.group:hover .group-hover\:opacity-70{opacity:.7}.group:hover .group-hover\:\[animation-play-state\:paused\]{animation-play-state:paused}.group.error .group-\[\.error\]\:border-white\/20,.group.success .group-\[\.success\]\:border-white\/20,.group.warning .group-\[\.warning\]\:border-white\/20{border-color:#fff3}.group.error .group-\[\.error\]\:text-white\/50,.group.success .group-\[\.success\]\:text-white\/50,.group.warning .group-\[\.warning\]\:text-white\/50{color:#ffffff80}.group.error .group-\[\.error\]\:hover\:bg-white\/20:hover,.group.success .group-\[\.success\]\:hover\:bg-white\/20:hover,.group.warning .group-\[\.warning\]\:hover\:bg-white\/20:hover{background-color:#fff3}.group.error .group-\[\.error\]\:hover\:text-white:hover,.group.success .group-\[\.success\]\:hover\:text-white:hover,.group.warning .group-\[\.warning\]\:hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.peer:checked~.peer-checked\:bg-primary{background-color:hsl(var(--primary))}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.peer:focus~.peer-focus\:ring-ring{--tw-ring-color: hsl(var(--ring))}.peer:focus~.peer-focus\:ring-offset-2{--tw-ring-offset-width: 2px}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=closed\]\:rotate-\[-90deg\][data-state=closed]{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=open\]\:rotate-90[data-state=open]{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up .2s ease-out}@keyframes collapsible-slide-up{0%{width:var(--radix-collapsible-content-width);opacity:1}to{width:0;opacity:0}}.data-\[state\=closed\]\:animate-collapsible-slide-up[data-state=closed]{animation:collapsible-slide-up .15s ease-out}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down .2s ease-out}@keyframes collapsible-slide-down{0%{width:0;opacity:0}to{width:var(--radix-collapsible-content-width);opacity:1}}.data-\[state\=open\]\:animate-collapsible-slide-down[data-state=open]{animation:collapsible-slide-down .15s ease-out}.data-\[state\=closed\]\:overflow-hidden[data-state=closed]{overflow:hidden}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=checked\]\:bg-success[data-state=checked]{background-color:hsl(var(--success))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent, 220 90% 56%))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=closed\]\:duration-200[data-state=closed]{transition-duration:.2s}.data-\[state\=closed\]\:duration-300[data-state=closed],.data-\[state\=open\]\:duration-300[data-state=open]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed],.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=closed\]\:duration-200[data-state=closed]{animation-duration:.2s}.data-\[state\=closed\]\:duration-300[data-state=closed],.data-\[state\=open\]\:duration-300[data-state=open]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.dark\:border-amber-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(146 64 14 / var(--tw-border-opacity, 1))}.dark\:border-blue-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(30 64 175 / var(--tw-border-opacity, 1))}.dark\:border-cyan-600:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(8 145 178 / var(--tw-border-opacity, 1))}.dark\:border-cyan-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(21 94 117 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-gray-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:border-green-600:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.dark\:border-green-700:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(21 128 61 / var(--tw-border-opacity, 1))}.dark\:border-green-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-orange-600:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(234 88 12 / var(--tw-border-opacity, 1))}.dark\:border-orange-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(154 52 18 / var(--tw-border-opacity, 1))}.dark\:border-pink-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(157 23 77 / var(--tw-border-opacity, 1))}.dark\:border-purple-700:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(126 34 206 / var(--tw-border-opacity, 1))}.dark\:border-purple-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(107 33 168 / var(--tw-border-opacity, 1))}.dark\:border-red-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-rose-400:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(251 113 133 / var(--tw-border-opacity, 1))}.dark\:border-sky-400:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(56 189 248 / var(--tw-border-opacity, 1))}.dark\:border-sky-800\/30:is([data-theme=dark] *){border-color:#0759854d}.dark\:border-slate-500:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity, 1))}.dark\:border-slate-600:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.dark\:border-slate-800\/30:is([data-theme=dark] *){border-color:#1e293b4d}.dark\:border-violet-500:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.dark\:border-violet-800\/30:is([data-theme=dark] *){border-color:#5b21b64d}.dark\:border-yellow-800:is([data-theme=dark] *){--tw-border-opacity: 1;border-color:rgb(133 77 14 / var(--tw-border-opacity, 1))}.dark\:bg-amber-900\/20:is([data-theme=dark] *){background-color:#78350f33}.dark\:bg-amber-900\/30:is([data-theme=dark] *){background-color:#78350f4d}.dark\:bg-amber-900\/50:is([data-theme=dark] *){background-color:#78350f80}.dark\:bg-amber-950\/30:is([data-theme=dark] *){background-color:#451a034d}.dark\:bg-black\/30:is([data-theme=dark] *){background-color:#0000004d}.dark\:bg-blue-500\/10:is([data-theme=dark] *){background-color:#3b82f61a}.dark\:bg-blue-900\/20:is([data-theme=dark] *){background-color:#1e3a8a33}.dark\:bg-blue-900\/30:is([data-theme=dark] *){background-color:#1e3a8a4d}.dark\:bg-blue-950\/20:is([data-theme=dark] *){background-color:#17255433}.dark\:bg-blue-950\/30:is([data-theme=dark] *){background-color:#1725544d}.dark\:bg-cyan-900\/30:is([data-theme=dark] *){background-color:#164e634d}.dark\:bg-cyan-900\/50:is([data-theme=dark] *){background-color:#164e6380}.dark\:bg-emerald-900\/30:is([data-theme=dark] *){background-color:#064e3b4d}.dark\:bg-emerald-900\/50:is([data-theme=dark] *){background-color:#064e3b80}.dark\:bg-gray-600:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-700:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900\/20:is([data-theme=dark] *){background-color:#11182733}.dark\:bg-gray-900\/30:is([data-theme=dark] *){background-color:#1118274d}.dark\:bg-green-900\/20:is([data-theme=dark] *){background-color:#14532d33}.dark\:bg-green-900\/30:is([data-theme=dark] *){background-color:#14532d4d}.dark\:bg-green-950\/30:is([data-theme=dark] *){background-color:#052e164d}.dark\:bg-indigo-900\/50:is([data-theme=dark] *){background-color:#312e8180}.dark\:bg-muted\/30:is([data-theme=dark] *){background-color:hsl(var(--muted) / .3)}.dark\:bg-orange-900\/20:is([data-theme=dark] *){background-color:#7c2d1233}.dark\:bg-orange-900\/30:is([data-theme=dark] *){background-color:#7c2d124d}.dark\:bg-orange-950\/30:is([data-theme=dark] *){background-color:#4314074d}.dark\:bg-pink-900\/30:is([data-theme=dark] *){background-color:#8318434d}.dark\:bg-purple-900\/20:is([data-theme=dark] *){background-color:#581c8733}.dark\:bg-purple-900\/30:is([data-theme=dark] *){background-color:#581c874d}.dark\:bg-red-900\/20:is([data-theme=dark] *){background-color:#7f1d1d33}.dark\:bg-red-900\/30:is([data-theme=dark] *){background-color:#7f1d1d4d}.dark\:bg-red-950\/30:is([data-theme=dark] *){background-color:#450a0a4d}.dark\:bg-rose-900\/30:is([data-theme=dark] *){background-color:#8813374d}.dark\:bg-rose-900\/50:is([data-theme=dark] *){background-color:#88133780}.dark\:bg-rose-950\/30:is([data-theme=dark] *){background-color:#4c05194d}.dark\:bg-rose-950\/40:is([data-theme=dark] *){background-color:#4c051966}.dark\:bg-sky-400:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.dark\:bg-sky-900\/50:is([data-theme=dark] *){background-color:#0c4a6e80}.dark\:bg-sky-950\/30:is([data-theme=dark] *){background-color:#082f494d}.dark\:bg-sky-950\/40:is([data-theme=dark] *){background-color:#082f4966}.dark\:bg-slate-500:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-800:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-900\/50:is([data-theme=dark] *){background-color:#0f172a80}.dark\:bg-slate-950\/30:is([data-theme=dark] *){background-color:#0206174d}.dark\:bg-slate-950\/40:is([data-theme=dark] *){background-color:#02061766}.dark\:bg-violet-800\/50:is([data-theme=dark] *){background-color:#5b21b680}.dark\:bg-violet-900\/30:is([data-theme=dark] *){background-color:#4c1d954d}.dark\:bg-violet-900\/50:is([data-theme=dark] *){background-color:#4c1d9580}.dark\:bg-violet-950\/30:is([data-theme=dark] *){background-color:#2e10654d}.dark\:bg-violet-950\/40:is([data-theme=dark] *){background-color:#2e106566}.dark\:bg-yellow-900\/20:is([data-theme=dark] *){background-color:#713f1233}.dark\:bg-yellow-900\/30:is([data-theme=dark] *){background-color:#713f124d}.dark\:bg-yellow-950\/30:is([data-theme=dark] *){background-color:#4220064d}.dark\:text-amber-200:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.dark\:text-amber-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-amber-500:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.dark\:text-blue-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-cyan-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.dark\:text-cyan-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.dark\:text-emerald-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.dark\:text-emerald-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-green-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-indigo-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.dark\:text-indigo-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.dark\:text-orange-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-orange-400\/80:is([data-theme=dark] *){color:#fb923ccc}.dark\:text-pink-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(249 168 212 / var(--tw-text-opacity, 1))}.dark\:text-purple-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.dark\:text-purple-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:text-red-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-rose-100:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(255 228 230 / var(--tw-text-opacity, 1))}.dark\:text-rose-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.dark\:text-rose-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.dark\:text-sky-100:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(224 242 254 / var(--tw-text-opacity, 1))}.dark\:text-sky-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:text-sky-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-slate-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.dark\:text-slate-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.dark\:text-teal-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.dark\:text-violet-100:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(237 233 254 / var(--tw-text-opacity, 1))}.dark\:text-violet-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.dark\:text-violet-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.dark\:text-yellow-300:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.dark\:text-yellow-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.dark\:text-yellow-500:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-emerald-900\/70:hover:is([data-theme=dark] *){background-color:#064e3bb3}.dark\:hover\:bg-sky-900\/30:hover:is([data-theme=dark] *){background-color:#0c4a6e4d}.dark\:hover\:bg-slate-900\/30:hover:is([data-theme=dark] *){background-color:#0f172a4d}.dark\:hover\:bg-violet-900\/30:hover:is([data-theme=dark] *){background-color:#4c1d954d}@media(min-width:640px){.sm\:bottom-0{bottom:0}.sm\:right-0{right:0}.sm\:top-auto{top:auto}.sm\:mt-0{margin-top:0}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:w-\[480px\]{width:480px}.sm\:w-auto{width:auto}.sm\:max-w-\[420px\]{max-width:420px}.sm\:max-w-\[480px\]{max-width:480px}.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-\[600px\]{max-width:600px}.sm\:max-w-\[720px\]{max-width:720px}.sm\:max-w-\[800px\]{max-width:800px}.sm\:max-w-md{max-width:28rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:.5rem}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media(min-width:768px){.md\:col-span-1{grid-column:span 1 / span 1}.md\:col-span-2{grid-column:span 2 / span 2}.md\:-m-6{margin:-1.5rem}.md\:ml-16{margin-left:4rem}.md\:ml-64{margin-left:16rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-\[calc\(100\%\+3rem\)\]{height:calc(100% + 3rem)}.md\:w-\[480px\]{width:480px}.md\:w-\[560px\]{width:560px}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,45fr\)_minmax\(0\,55fr\)\]{grid-template-columns:minmax(0,45fr) minmax(0,55fr)}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-4{gap:1rem}.md\:p-6{padding:1.5rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}}@media(min-width:1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:block{display:block}.lg\:w-\[640px\]{width:640px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.\[\&\:empty\]\:before\:text-muted-foreground:empty:before{content:var(--tw-content);color:hsl(var(--muted-foreground))}.\[\&\:empty\]\:before\:content-\[attr\(data-placeholder\)\]:empty:before{--tw-content: attr(data-placeholder);content:var(--tw-content)}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\]\:transition-transform>svg{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[\&\>svg\]\:duration-200>svg{transition-duration:.2s;animation-duration:.2s}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_\:\:selection\]\:bg-primary\/20 ::-moz-selection{background-color:hsl(var(--primary) / .2)}.\[\&_\:\:selection\]\:bg-primary\/20 ::selection{background-color:hsl(var(--primary) / .2)}.\[\&_\:\:selection\]\:text-primary ::-moz-selection{color:hsl(var(--primary))}.\[\&_\:\:selection\]\:text-primary ::selection{color:hsl(var(--primary))}.react-grid-layout{position:relative;transition:height .2s ease}.react-grid-item{transition:all .2s ease;transition-property:left,top,width,height}.react-grid-item img{pointer-events:none;-webkit-user-select:none;user-select:none}.react-grid-item.cssTransforms{transition-property:transform,width,height}.react-grid-item.resizing{transition:none;z-index:1;will-change:width,height}.react-grid-item.react-draggable-dragging{transition:none;z-index:3;will-change:transform}.react-grid-item.dropping{visibility:hidden}.react-grid-item.react-grid-placeholder{background:red;opacity:.2;transition-duration:.1s;z-index:2;-webkit-user-select:none;-o-user-select:none;user-select:none}.react-grid-item.react-grid-placeholder.placeholder-resizing{transition:none}.react-grid-item>.react-resizable-handle{position:absolute;width:20px;height:20px}.react-grid-item>.react-resizable-handle:after{content:"";position:absolute;right:3px;bottom:3px;width:5px;height:5px;border-right:2px solid rgba(0,0,0,.4);border-bottom:2px solid rgba(0,0,0,.4)}.react-resizable-hide>.react-resizable-handle{display:none}.react-grid-item>.react-resizable-handle.react-resizable-handle-sw{bottom:0;left:0;cursor:sw-resize;transform:rotate(90deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-se{bottom:0;right:0;cursor:se-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-nw{top:0;left:0;cursor:nw-resize;transform:rotate(180deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-ne{top:0;right:0;cursor:ne-resize;transform:rotate(270deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-w,.react-grid-item>.react-resizable-handle.react-resizable-handle-e{top:50%;margin-top:-10px;cursor:ew-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-n,.react-grid-item>.react-resizable-handle.react-resizable-handle-s{left:50%;margin-left:-10px;cursor:ns-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}.react-resizable{position:relative}.react-resizable-handle{position:absolute;width:20px;height:20px;background-repeat:no-repeat;background-origin:content-box;box-sizing:border-box;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2IDYiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYwMCIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI2cHgiIGhlaWdodD0iNnB4Ij48ZyBvcGFjaXR5PSIwLjMwMiI+PHBhdGggZD0iTSA2IDYgTCAwIDYgTCAwIDQuMiBMIDQgNC4yIEwgNC4yIDQuMiBMIDQuMiAwIEwgNiAwIEwgNiA2IEwgNiA2IFoiIGZpbGw9IiMwMDAwMDAiLz48L2c+PC9zdmc+);background-position:bottom right;padding:0 3px 3px 0}.react-resizable-handle-sw{bottom:0;left:0;cursor:sw-resize;transform:rotate(90deg)}.react-resizable-handle-se{bottom:0;right:0;cursor:se-resize}.react-resizable-handle-nw{top:0;left:0;cursor:nw-resize;transform:rotate(180deg)}.react-resizable-handle-ne{top:0;right:0;cursor:ne-resize;transform:rotate(270deg)}.react-resizable-handle-w,.react-resizable-handle-e{top:50%;margin-top:-10px;cursor:ew-resize}.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-resizable-handle-n,.react-resizable-handle-s{left:50%;margin-left:-10px;cursor:ns-resize}.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}/**
9
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
10
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
11
+ * https://github.com/chjj/term.js
12
+ * @license MIT
13
+ *
14
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ * of this software and associated documentation files (the "Software"), to deal
16
+ * in the Software without restriction, including without limitation the rights
17
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ * copies of the Software, and to permit persons to whom the Software is
19
+ * furnished to do so, subject to the following conditions:
20
+ *
21
+ * The above copyright notice and this permission notice shall be included in
22
+ * all copies or substantial portions of the Software.
23
+ *
24
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30
+ * THE SOFTWARE.
31
+ *
32
+ * Originally forked from (with the author's permission):
33
+ * Fabrice Bellard's javascript vt100 for jslinux:
34
+ * http://bellard.org/jslinux/
35
+ * Copyright (c) 2011 Fabrice Bellard
36
+ * The original design remains. The terminal itself
37
+ * has been extended to include xterm CSI codes, among
38
+ * other features.
39
+ */.xterm{cursor:text;position:relative;-moz-user-select:none;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:double underline;text-decoration:double underline}.xterm-underline-3{-webkit-text-decoration:wavy underline;text-decoration:wavy underline}.xterm-underline-4{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.xterm-underline-5{-webkit-text-decoration:dashed underline;text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}