@hienlh/ppm 0.22.5 → 0.22.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{accounts-settings-section-BoTvueNs.js → accounts-settings-section-D0_yfkaF.js} +1 -1
- package/dist/web/assets/accounts-settings-section-D0_yfkaF.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-D0_yfkaF.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-BZz447ab.js → ai-resource-editor-C9v1LE44.js} +1 -1
- package/dist/web/assets/ai-resource-editor-C9v1LE44.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-C9v1LE44.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-DR6ZplH4.js → ai-settings-section-DXdhCjIc.js} +1 -1
- package/dist/web/assets/ai-settings-section-DXdhCjIc.js.br +0 -0
- package/dist/web/assets/ai-settings-section-DXdhCjIc.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-DaBrO2Ce.js → ai-settings-section-DsErcc2X.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-JSk2rrSM.js → appearance-settings-section-D2aDjjkv.js} +1 -1
- package/dist/web/assets/appearance-settings-section-D2aDjjkv.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-D2aDjjkv.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-BTobiTaa.js → branch-review-tab-CVj_KmG-.js} +1 -1
- package/dist/web/assets/branch-review-tab-CVj_KmG-.js.br +0 -0
- package/dist/web/assets/branch-review-tab-CVj_KmG-.js.gz +0 -0
- package/dist/web/assets/{chat-tab-XT-23JtV.js → chat-tab-DiIM2Z8w.js} +3 -3
- package/dist/web/assets/chat-tab-DiIM2Z8w.js.br +0 -0
- package/dist/web/assets/chat-tab-DiIM2Z8w.js.gz +0 -0
- package/dist/web/assets/{code-editor-Jmst2xot.js → code-editor-7uhKbtxw.js} +3 -3
- package/dist/web/assets/code-editor-7uhKbtxw.js.br +0 -0
- package/dist/web/assets/code-editor-7uhKbtxw.js.gz +0 -0
- package/dist/web/assets/{codex-daily-guard-C3m_OZs9.js → codex-daily-guard-BwLzw3gJ.js} +1 -1
- package/dist/web/assets/codex-daily-guard-BwLzw3gJ.js.br +0 -0
- package/dist/web/assets/codex-daily-guard-BwLzw3gJ.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-BYRCRGXw.js → conflict-editor-Fa0i5rwa.js} +1 -1
- package/dist/web/assets/conflict-editor-Fa0i5rwa.js.br +0 -0
- package/dist/web/assets/conflict-editor-Fa0i5rwa.js.gz +0 -0
- package/dist/web/assets/{csv-preview-D7OFzZJY.js → csv-preview-Ba8cMI_C.js} +1 -1
- package/dist/web/assets/csv-preview-Ba8cMI_C.js.br +0 -0
- package/dist/web/assets/csv-preview-Ba8cMI_C.js.gz +0 -0
- package/dist/web/assets/{database-viewer-SSbCY87C.js → database-viewer-B7xBZwAY.js} +1 -1
- package/dist/web/assets/database-viewer-B7xBZwAY.js.br +0 -0
- package/dist/web/assets/database-viewer-B7xBZwAY.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-CdYarQJB.js → diff-viewer-CBo-I2n7.js} +1 -1
- package/dist/web/assets/diff-viewer-CBo-I2n7.js.br +0 -0
- package/dist/web/assets/diff-viewer-CBo-I2n7.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-DfbGcR8Z.js → editor-language-service-DKluViya.js} +1 -1
- package/dist/web/assets/editor-language-service-DKluViya.js.br +0 -0
- package/dist/web/assets/editor-language-service-DKluViya.js.gz +0 -0
- package/dist/web/assets/{explorer-body-wFbIJgNp.js → explorer-body-RTRXIniK.js} +1 -1
- package/dist/web/assets/explorer-body-RTRXIniK.js.br +0 -0
- package/dist/web/assets/{explorer-body-wFbIJgNp.js.gz → explorer-body-RTRXIniK.js.gz} +0 -0
- package/dist/web/assets/{explorer-window-content-DYq7KGcO.js → explorer-window-content-BBk4J0pd.js} +1 -1
- package/dist/web/assets/explorer-window-content-BBk4J0pd.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BBk4J0pd.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-CCefvD3E.js → extension-manager-section-CGTiQ03R.js} +1 -1
- package/dist/web/assets/extension-manager-section-CGTiQ03R.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CGTiQ03R.js.gz +0 -0
- package/dist/web/assets/{extension-webview-FTboocO5.js → extension-webview-B0Gn1J0z.js} +1 -1
- package/dist/web/assets/extension-webview-B0Gn1J0z.js.br +0 -0
- package/dist/web/assets/extension-webview-B0Gn1J0z.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-UVl8GQsn.js → files-settings-section-CvuSM0-8.js} +1 -1
- package/dist/web/assets/files-settings-section-CvuSM0-8.js.br +0 -0
- package/dist/web/assets/files-settings-section-CvuSM0-8.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-xGc2e0nY.js → general-settings-section-CjlbiBLs.js} +1 -1
- package/dist/web/assets/general-settings-section-CjlbiBLs.js.br +0 -0
- package/dist/web/assets/general-settings-section-CjlbiBLs.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-CssMDe8Y.js → git-log-panel-DLEfShbT.js} +1 -1
- package/dist/web/assets/git-log-panel-DLEfShbT.js.br +0 -0
- package/dist/web/assets/git-log-panel-DLEfShbT.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-Bhwst_aN.js → glide-data-grid-DvojIuqH.js} +1 -1
- package/dist/web/assets/glide-data-grid-DvojIuqH.js.br +0 -0
- package/dist/web/assets/glide-data-grid-DvojIuqH.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-BwKqWjpw.js → group-chat-tab-DeTRoA9c.js} +1 -1
- package/dist/web/assets/group-chat-tab-DeTRoA9c.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DeTRoA9c.js.gz +0 -0
- package/dist/web/assets/{index-CFa7UeZs.js → index-BnH1J2Pm.js} +4 -4
- package/dist/web/assets/index-BnH1J2Pm.js.br +0 -0
- package/dist/web/assets/index-BnH1J2Pm.js.gz +0 -0
- package/dist/web/assets/index-C3lfHthr.css +1 -0
- package/dist/web/assets/index-C3lfHthr.css.br +0 -0
- package/dist/web/assets/index-C3lfHthr.css.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-twnJI1tr.js → jira-watcher-section-achV6oEy.js} +1 -1
- package/dist/web/assets/jira-watcher-section-achV6oEy.js.br +3 -0
- package/dist/web/assets/jira-watcher-section-achV6oEy.js.gz +0 -0
- package/dist/web/assets/{keybindings-store-BRiD4H8E.js → keybindings-store-C6XvoJN3.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-3C51ZVVe.js → keyboard-shortcuts-section-UJUsOlks.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-UJUsOlks.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-UJUsOlks.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-Bkd3ia2Q.js → markdown-renderer-D04mW6Ct.js} +1 -1
- package/dist/web/assets/{markdown-renderer-Cqs7nUrs.js → markdown-renderer-DFV8qf0b.js} +1 -1
- package/dist/web/assets/markdown-renderer-DFV8qf0b.js.br +0 -0
- package/dist/web/assets/markdown-renderer-DFV8qf0b.js.gz +0 -0
- package/dist/web/assets/{mobile-explorer-sheet-BTNZ26Fd.js → mobile-explorer-sheet-tb0C8TkU.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-tb0C8TkU.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-tb0C8TkU.js.gz +0 -0
- package/dist/web/assets/{notification-store-B7U7DTsB.js → notification-store-Dp-4MQ7j.js} +1 -1
- package/dist/web/assets/onboarding-entry-C81awoR5.js +1 -0
- package/dist/web/assets/onboarding-entry-C81awoR5.js.br +0 -0
- package/dist/web/assets/onboarding-entry-C81awoR5.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-nZNoD6vx.js → ppmbot-settings-section-CcuxvSTb.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-CcuxvSTb.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-CcuxvSTb.js.gz +0 -0
- package/dist/web/assets/{problems-panel-oY4-2MDR.js → problems-panel-DYnneKde.js} +1 -1
- package/dist/web/assets/problems-panel-DYnneKde.js.br +0 -0
- package/dist/web/assets/problems-panel-DYnneKde.js.gz +0 -0
- package/dist/web/assets/{process-table-BH-ID142.js → process-table-CPL5WqCw.js} +1 -1
- package/dist/web/assets/process-table-CPL5WqCw.js.br +0 -0
- package/dist/web/assets/process-table-CPL5WqCw.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-DECsg44g.js +1 -0
- package/dist/web/assets/proxy-settings-section-DECsg44g.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-DECsg44g.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-CTI13Chq.js → remote-desktop-clipboard-notice-DsaoVJd9.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-DsaoVJd9.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DsaoVJd9.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-Dwx3wwZ2.js → remote-desktop-mobile-sheet-D8Elyy-R.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-D8Elyy-R.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-D8Elyy-R.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-BCTHG_gw.js → remote-desktop-mobile-view-DsWsVesK.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-DsWsVesK.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DsWsVesK.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-BfLXj0rs.js → remote-desktop-readiness-gate-D3JXnNKi.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-D3JXnNKi.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-D3JXnNKi.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-DifWxLaW.js → remote-desktop-window-content-6kwgSTNH.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-6kwgSTNH.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-6kwgSTNH.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-B5ub8-6k.js → schedules-settings-section-BTl_vB-5.js} +1 -1
- package/dist/web/assets/schedules-settings-section-BTl_vB-5.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BTl_vB-5.js.gz +0 -0
- package/dist/web/assets/{settings-body-pB2eNvZs.js → settings-body-BLOJ0NCv.js} +2 -2
- package/dist/web/assets/settings-body-BLOJ0NCv.js.br +0 -0
- package/dist/web/assets/settings-body-BLOJ0NCv.js.gz +0 -0
- package/dist/web/assets/{settings-tab-CKzSb8CD.js → settings-tab-CS8dGl16.js} +1 -1
- package/dist/web/assets/{settings-window-content-CMrJh0P1.js → settings-window-content-Bq5gTCpo.js} +1 -1
- package/dist/web/assets/{sql-query-editor-CpGE7sKJ.js → sql-query-editor-BgLCJabc.js} +1 -1
- package/dist/web/assets/sql-query-editor-BgLCJabc.js.br +0 -0
- package/dist/web/assets/sql-query-editor-BgLCJabc.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-BTfTkzaU.js → sqlite-viewer-CQIQcFjS.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CQIQcFjS.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CQIQcFjS.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-D4N-0ePl.js → system-monitor-body-p0hOErnb.js} +2 -2
- package/dist/web/assets/system-monitor-body-p0hOErnb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-p0hOErnb.js.gz +0 -0
- package/dist/web/assets/{system-monitor-tab-CbqRdflk.js → system-monitor-tab-CBBTTyzP.js} +1 -1
- package/dist/web/assets/{system-monitor-window-content-C4QqmYwM.js → system-monitor-window-content-3LFpj97e.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-By_8oxwV.js → tab-host-window-content-DVdOHg7r.js} +1 -1
- package/dist/web/assets/tab-host-window-content-DVdOHg7r.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-DVdOHg7r.js.gz +0 -0
- package/dist/web/assets/{team-member-sheet-pTyGJL8v.js → team-member-sheet-BBuKfjts.js} +2 -2
- package/dist/web/assets/team-member-sheet-BBuKfjts.js.br +0 -0
- package/dist/web/assets/team-member-sheet-BBuKfjts.js.gz +0 -0
- package/dist/web/assets/{team-member-window-content-Dxy7ualQ.js → team-member-window-content-3Zys-VyF.js} +1 -1
- package/dist/web/assets/team-member-window-content-3Zys-VyF.js.br +0 -0
- package/dist/web/assets/team-member-window-content-3Zys-VyF.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-DZ-DBHmv.js → terminal-tab-Dy-qrTQW.js} +1 -1
- package/dist/web/assets/terminal-tab-Dy-qrTQW.js.br +0 -0
- package/dist/web/assets/terminal-tab-Dy-qrTQW.js.gz +0 -0
- package/dist/web/assets/{tool-cards-CPf7WLQy.js → tool-cards-DP78zyGK.js} +2 -2
- package/dist/web/assets/tool-cards-DP78zyGK.js.br +0 -0
- package/dist/web/assets/tool-cards-DP78zyGK.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-vXJpe0ON.js → use-inline-blame-BFblg3CO.js} +1 -1
- package/dist/web/assets/use-inline-blame-BFblg3CO.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BFblg3CO.js.gz +0 -0
- package/dist/web/assets/{use-lsp-BVZ0d9td.js → use-lsp-BKTJSEL2.js} +1 -1
- package/dist/web/assets/use-lsp-BKTJSEL2.js.br +0 -0
- package/dist/web/assets/use-lsp-BKTJSEL2.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-D69h-y-X.js → use-monaco-theme-DFaNmksV.js} +1 -1
- package/dist/web/assets/{use-websocket-DMoom-pE.js → use-websocket-CUFk4qWs.js} +1 -1
- package/dist/web/assets/{video-preview-DoeqTKYG.js → video-preview-DCxuJvbT.js} +1 -1
- package/dist/web/assets/video-preview-DCxuJvbT.js.br +0 -0
- package/dist/web/assets/video-preview-DCxuJvbT.js.gz +0 -0
- package/dist/web/index.html +2 -2
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/package.json +1 -1
- package/src/cli/commands/init.ts +2 -2
- package/src/types/claude-models.ts +2 -1
- package/src/types/config.ts +6 -5
- package/src/web/components/chat/chat-welcome.tsx +1 -1
- package/src/web/components/layout/mobile-drawer.tsx +42 -21
- package/src/web/components/onboarding/onboarding-entry.tsx +13 -4
- package/src/web/components/settings/proxy-test-section.tsx +1 -1
- package/dist/web/assets/accounts-settings-section-BoTvueNs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-BoTvueNs.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-BZz447ab.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-BZz447ab.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-DR6ZplH4.js.br +0 -0
- package/dist/web/assets/ai-settings-section-DR6ZplH4.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-JSk2rrSM.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-JSk2rrSM.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-BTobiTaa.js.br +0 -0
- package/dist/web/assets/branch-review-tab-BTobiTaa.js.gz +0 -0
- package/dist/web/assets/chat-tab-XT-23JtV.js.br +0 -0
- package/dist/web/assets/chat-tab-XT-23JtV.js.gz +0 -0
- package/dist/web/assets/code-editor-Jmst2xot.js.br +0 -0
- package/dist/web/assets/code-editor-Jmst2xot.js.gz +0 -0
- package/dist/web/assets/codex-daily-guard-C3m_OZs9.js.br +0 -0
- package/dist/web/assets/codex-daily-guard-C3m_OZs9.js.gz +0 -0
- package/dist/web/assets/conflict-editor-BYRCRGXw.js.br +0 -0
- package/dist/web/assets/conflict-editor-BYRCRGXw.js.gz +0 -0
- package/dist/web/assets/csv-preview-D7OFzZJY.js.br +0 -0
- package/dist/web/assets/csv-preview-D7OFzZJY.js.gz +0 -0
- package/dist/web/assets/database-viewer-SSbCY87C.js.br +0 -0
- package/dist/web/assets/database-viewer-SSbCY87C.js.gz +0 -0
- package/dist/web/assets/diff-viewer-CdYarQJB.js.br +0 -0
- package/dist/web/assets/diff-viewer-CdYarQJB.js.gz +0 -0
- package/dist/web/assets/editor-language-service-DfbGcR8Z.js.br +0 -0
- package/dist/web/assets/editor-language-service-DfbGcR8Z.js.gz +0 -0
- package/dist/web/assets/explorer-body-wFbIJgNp.js.br +0 -0
- package/dist/web/assets/explorer-window-content-DYq7KGcO.js.br +0 -0
- package/dist/web/assets/explorer-window-content-DYq7KGcO.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-CCefvD3E.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CCefvD3E.js.gz +0 -0
- package/dist/web/assets/extension-webview-FTboocO5.js.br +0 -0
- package/dist/web/assets/extension-webview-FTboocO5.js.gz +0 -0
- package/dist/web/assets/files-settings-section-UVl8GQsn.js.br +0 -0
- package/dist/web/assets/files-settings-section-UVl8GQsn.js.gz +0 -0
- package/dist/web/assets/general-settings-section-xGc2e0nY.js.br +0 -0
- package/dist/web/assets/general-settings-section-xGc2e0nY.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CssMDe8Y.js.br +0 -0
- package/dist/web/assets/git-log-panel-CssMDe8Y.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-Bhwst_aN.js.br +0 -0
- package/dist/web/assets/glide-data-grid-Bhwst_aN.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-BwKqWjpw.js.br +0 -0
- package/dist/web/assets/group-chat-tab-BwKqWjpw.js.gz +0 -0
- package/dist/web/assets/index-CFa7UeZs.js.br +0 -0
- package/dist/web/assets/index-CFa7UeZs.js.gz +0 -0
- package/dist/web/assets/index-CWL5emyr.css +0 -1
- package/dist/web/assets/index-CWL5emyr.css.br +0 -0
- package/dist/web/assets/index-CWL5emyr.css.gz +0 -0
- package/dist/web/assets/jira-watcher-section-twnJI1tr.js.br +0 -0
- package/dist/web/assets/jira-watcher-section-twnJI1tr.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-3C51ZVVe.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-3C51ZVVe.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-Cqs7nUrs.js.br +0 -0
- package/dist/web/assets/markdown-renderer-Cqs7nUrs.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BTNZ26Fd.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BTNZ26Fd.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-BpvMFO1h.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-nZNoD6vx.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-nZNoD6vx.js.gz +0 -0
- package/dist/web/assets/problems-panel-oY4-2MDR.js.br +0 -0
- package/dist/web/assets/problems-panel-oY4-2MDR.js.gz +0 -0
- package/dist/web/assets/process-table-BH-ID142.js.br +0 -0
- package/dist/web/assets/process-table-BH-ID142.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Dh-NGom9.js +0 -1
- package/dist/web/assets/proxy-settings-section-Dh-NGom9.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Dh-NGom9.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CTI13Chq.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CTI13Chq.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-Dwx3wwZ2.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-Dwx3wwZ2.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-BCTHG_gw.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-BCTHG_gw.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BfLXj0rs.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BfLXj0rs.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DifWxLaW.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DifWxLaW.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-B5ub8-6k.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-B5ub8-6k.js.gz +0 -0
- package/dist/web/assets/settings-body-pB2eNvZs.js.br +0 -0
- package/dist/web/assets/settings-body-pB2eNvZs.js.gz +0 -0
- package/dist/web/assets/sql-query-editor-CpGE7sKJ.js.br +0 -0
- package/dist/web/assets/sql-query-editor-CpGE7sKJ.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BTfTkzaU.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BTfTkzaU.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-D4N-0ePl.js.br +0 -0
- package/dist/web/assets/system-monitor-body-D4N-0ePl.js.gz +0 -0
- package/dist/web/assets/tab-host-window-content-By_8oxwV.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-By_8oxwV.js.gz +0 -0
- package/dist/web/assets/team-member-sheet-pTyGJL8v.js.br +0 -0
- package/dist/web/assets/team-member-sheet-pTyGJL8v.js.gz +0 -0
- package/dist/web/assets/team-member-window-content-Dxy7ualQ.js.br +0 -0
- package/dist/web/assets/team-member-window-content-Dxy7ualQ.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DZ-DBHmv.js.br +0 -0
- package/dist/web/assets/terminal-tab-DZ-DBHmv.js.gz +0 -0
- package/dist/web/assets/tool-cards-CPf7WLQy.js.br +0 -0
- package/dist/web/assets/tool-cards-CPf7WLQy.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-vXJpe0ON.js.br +0 -0
- package/dist/web/assets/use-inline-blame-vXJpe0ON.js.gz +0 -0
- package/dist/web/assets/use-lsp-BVZ0d9td.js.br +0 -0
- package/dist/web/assets/use-lsp-BVZ0d9td.js.gz +0 -0
- package/dist/web/assets/video-preview-DoeqTKYG.js.br +0 -0
- package/dist/web/assets/video-preview-DoeqTKYG.js.gz +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{n,s as r}from"./api-client-Jn3njtNw.js";import{i}from"./project-store-hNvwfqX3.js";import{At as a,rn as o}from"./index-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{n,s as r}from"./api-client-Jn3njtNw.js";import{i}from"./project-store-hNvwfqX3.js";import{At as a,rn as o}from"./index-BnH1J2Pm.js";`0`.repeat(40);function s(e){return/^0+$/.test(e)}function c(e,t=Date.now()){if(!e)return``;if(s(e.hash))return`You, uncommitted changes`;let n=e.author||`Unknown`,r=e.authorTime>0?l(e.authorTime*1e3,t):``,i=r?`${n}, ${r}`:n;return e.summary?`${i} • ${e.summary}`:i}function l(e,t=Date.now()){let n=Math.max(0,Math.round((t-e)/1e3));if(n<60)return`just now`;for(let[e,t,r]of[[3600,60,`minute`],[86400,3600,`hour`],[2592e3,86400,`day`],[31536e3,2592e3,`month`],[1/0,31536e3,`year`]])if(n<e){let e=Math.floor(n/t);return`${e} ${r}${e===1?``:`s`} ago`}return`just now`}function u(e){let t=new Date(e),n=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],r=t.getDate(),i=t.getHours()%12||12,a=String(t.getMinutes()).padStart(2,`0`),o=t.getHours()<12?`AM`:`PM`;return`${n[t.getMonth()]} ${r}${d(r)}, ${t.getFullYear()} ${i}:${a} ${o}`}function d(e){return e%100>=11&&e%100<=13?`th`:[`th`,`st`,`nd`,`rd`][e%10]??`th`}var f=[`ppm.blame.copySha`,`ppm.blame.fileHistory`,`ppm.blame.blameFile`,`ppm.blame.showInGraph`],p=7;function m(e){return e.replace(/[\\`*_{}[\]()#+\-!<>]/g,e=>`\\${e}`)}function h(e){let t=e.trim().split(/\s+/).filter(Boolean);return t.length===0?`?`:(t[0][0]+(t.length>1?t[t.length-1][0]:``)).toUpperCase()}var g=[`4E79A7`,`F28E2B`,`E15759`,`76B7B2`,`59A14F`,`AF7AA1`,`9C755F`,`B07AA1`];function _(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return g[Math.abs(t)%g.length]}function v(e){let t=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><circle cx="8" cy="8" r="8" fill="#${_(e)}"/><text x="8" y="11.5" font-family="sans-serif" font-size="7" font-weight="700" fill="#ffffff" text-anchor="middle">${y(h(e))}</text></svg>`;return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(t)}`}function y(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function b(e,t){return`command:${e}?${encodeURIComponent(JSON.stringify(t))}`}function x(e){let{commit:t,detail:n,filePath:r,projectPath:i,now:a=Date.now()}=e;if(s(t.hash))return null;let o=t.author||`Unknown`,c=t.hash.slice(0,p),d=[],h=t.authorTime>0?`${l(t.authorTime*1e3,a)} (${u(t.authorTime*1e3)})`:``;d.push(`}) **${m(o)}**${h?` $(history) ${m(h)}`:``}`);let g=n?.message||t.summary;g&&(d.push(``),d.push(m(g).split(`
|
|
2
2
|
`).join(`
|
|
3
3
|
`)));let _=[``,`---`,``],y=[`[$(git-commit) ${c}](${b(`ppm.blame.copySha`,[t.hash])} "Copy commit hash")`];i&&y.push(`[$(history) File History](${b(`ppm.blame.fileHistory`,[i,r])} "Open the file's history")`,`[$(users) Blame](${b(`ppm.blame.blameFile`,[i,r])} "Open the blame view")`,`[$(git-branch) Graph](${b(`ppm.blame.showInGraph`,[i])} "Open the commit graph")`),d.push(..._),d.push(y.join(` `));let x=[...(n?.removed??[]).map(e=>`-${e}`),...(n?.added??[]).map(e=>`+${e}`)];if(x.length>0){d.push(..._),d.push("```diff"),d.push(...x),d.push("```"),d.push(``);let e=(n?.removed.length??0)===0?`added in`:`in`;d.push(`Changes ${e} \`${c}\``)}return{value:d.join(`
|
|
4
4
|
`),isTrusted:{enabledCommands:[...f]},supportThemeIcons:!0}}var S=!1;function C(e,t){window.dispatchEvent(new CustomEvent(`ext:command:execute`,{detail:{command:e,args:t}}))}function w(e){return typeof e==`string`&&/^[0-9a-f]{7,40}$/.test(e)?e:null}function T(e){return typeof e==`string`&&e.length>0?e:null}function E(e,t,n){let r=T(t),i=T(n);!r||!i||C(e,[r,i])}function D(e){S||(S=!0,e.editor.registerCommand(`ppm.blame.copySha`,(e,t)=>{let n=w(t);n&&o(n).then(e=>{r[e?`success`:`error`](e?`Copied ${n.slice(0,7)}`:`Could not copy`)})}),e.editor.registerCommand(`ppm.blame.fileHistory`,(e,t,n)=>{E(`git-graph.fileHistory`,t,n)}),e.editor.registerCommand(`ppm.blame.blameFile`,(e,t,n)=>{E(`git-graph.blame`,t,n)}),e.editor.registerCommand(`ppm.blame.showInGraph`,(e,t)=>{let n=T(t);n&&C(`git-graph.view`,[n])}))}var O=`diff`,k=!1;function A(e){if(!k){if(e.languages.getLanguages().some(e=>e.id===`diff`)){k=!0;return}e.languages.register({id:O,aliases:[`Diff`,`patch`],extensions:[`.diff`,`.patch`]}),e.languages.setMonarchTokensProvider(O,{tokenizer:{root:[[/^diff .*$/,`meta.diff.header`],[/^(index|similarity index|rename from|rename to|new file mode|deleted file mode|old mode|new mode) .*$/,`meta.diff.header`],[/^(\+\+\+|---) .*$/,`meta.diff.header`],[/^@@.*$/,`meta.diff.range`],[/^\+.*$/,`inserted`],[/^-.*$/,`deleted`],[/^\\ .*$/,`meta.diff.header`],[/^.*$/,``]]}}),k=!0}}var j=e(t(),1),M=`inline-blame-styles`,N=`
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{i as n,n as r}from"./api-client-Jn3njtNw.js";import"./ws-auth-CaxV807E.js";import{s as i,w as a}from"./index-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{i as n,n as r}from"./api-client-Jn3njtNw.js";import"./ws-auth-CaxV807E.js";import{s as i,w as a}from"./index-BnH1J2Pm.js";var o=e(t(),1),s=15e3;function c(e){clearTimeout(e.timer),e.detach?.()}var l=class{ws;docs=new Map;pending=new Map;notificationListeners=new Set;statusListeners=new Set;nextId=1;constructor(e){this.projectName=e,this.ws=new i(`/ws/project/${encodeURIComponent(e)}/lsp`),this.ws.onMessage(e=>this.receive(e)),this.ws.connect()}open(e,t){this.docs.set(e,{source:t,status:{state:`opening`}}),this.setStatus(e,{state:`opening`}),this.sendOpen(e)}sendOpen(e){let t=this.docs.get(e);t&&this.send({t:`open`,path:e,version:t.source.getVersion(),text:t.source.getText(),clientUri:t.source.clientUri})}close(e){this.docs.delete(e)&&this.send({t:`close`,path:e})}change(e,t,n){this.docs.has(e)&&this.send({t:`change`,path:e,version:t,changes:n})}save(e,t){this.docs.has(e)&&this.send({t:`save`,path:e,text:t})}statusOf(e){return this.docs.get(e)?.status}request(e,t,n,r={}){let i=this.docs.get(e);if(!i||i.status.state!==`ready`)return Promise.reject(Error(`No language server is ready for ${e}`));let{timeoutMs:a=s,signal:o}=r;if(o?.aborted)return Promise.reject(Error(`${t} was cancelled`));let c=this.nextId++;return new Promise((r,i)=>{let s=setTimeout(()=>{this.pending.delete(c),this.send({t:`cancel`,id:c}),i(Error(`${t} timed out`))},a),l=()=>{this.pending.delete(c)&&(clearTimeout(s),this.send({t:`cancel`,id:c}),i(Error(`${t} was cancelled`)))};o?.addEventListener(`abort`,l,{once:!0}),this.pending.set(c,{resolve:r,reject:i,timer:s,detach:o?()=>o.removeEventListener(`abort`,l):void 0}),this.send({t:`request`,id:c,path:e,method:t,params:n})})}onNotification(e){return this.notificationListeners.add(e),()=>this.notificationListeners.delete(e)}onStatus(e){return this.statusListeners.add(e),()=>this.statusListeners.delete(e)}send(e){this.ws.send(JSON.stringify(e))}receive(e){let t;try{t=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}switch(t.t){case`hello`:for(let e of this.docs.keys())this.sendOpen(e);break;case`ready`:this.setStatus(String(t.path),{state:`ready`,languageId:String(t.languageId),server:t.server,projectPath:String(t.projectPath??``),capabilities:t.capabilities??{}});break;case`unavailable`:this.setStatus(String(t.path),{state:`unavailable`,reason:String(t.reason),server:t.server??null,message:String(t.message)});break;case`resync`:{let e=String(t.path),n=this.docs.get(e);n&&this.send({t:`change`,path:e,version:n.source.getVersion(),text:n.source.getText()});break}case`response`:{let e=this.pending.get(Number(t.id));if(!e)return;c(e),this.pending.delete(Number(t.id)),e.resolve(t.result);break}case`error`:{let e=this.pending.get(Number(t.id));if(!e)return;c(e),this.pending.delete(Number(t.id)),e.reject(Error(String(t.message)));break}case`notification`:for(let e of this.notificationListeners)e(String(t.method),t.params);break}}setStatus(e,t){let n=this.docs.get(e);n&&(n.status=t);for(let n of this.statusListeners)n(e,t)}dispose(){for(let e of this.pending.values())c(e),e.reject(Error(`The language server connection was closed`));this.pending.clear(),this.docs.clear(),this.notificationListeners.clear(),this.statusListeners.clear(),this.ws.disconnect()}},u=new Map;function d(e){let t=u.get(e);if(t)return t.holders++,t.connection;let n=new l(e);return u.set(e,{connection:n,holders:1}),n}function f(e){let t=u.get(e);return!t||(t.holders--,t.holders>0)?!1:(u.delete(e),t.connection.dispose(),!0)}var p=new Map;function ee(e,t){p.set(e.uri.toString(),t)}function m(e){p.delete(e.uri.toString())}function h(e){return p.get(e.uri.toString())}function g(e){if(!e.startsWith(`file:`))return null;let t=e.slice(5),n=``;if(t.startsWith(`//`)){t=t.slice(2);let e=t.indexOf(`/`);n=e<0?t:t.slice(0,e),t=e<0?``:t.slice(e)}let r=t.split(`/`).map(_).join(`/`);return/^\/[A-Za-z]:/.test(r)?r.slice(1):n?`//${_(n)}${r}`:r}function _(e){try{return decodeURIComponent(e)}catch{return e}}var te=40,v=500,y=3,ne=6,b=new Map,x=new Map;function re(e){return(x.get(e)??0)>=y}function S(e){w(e,(x.get(e)??0)+1)}function C(e){w(e,y)}function w(e,t){for(x.delete(e),x.set(e,t);x.size>v;){let e=x.keys().next().value;if(e===void 0)return;x.delete(e)}}function T(e){x.delete(e)}async function ie(e,t,n){let r=0,i=Array.from({length:Math.min(t,e.length)},async()=>{for(;;){let t=r++;if(t>=e.length)return;await n(e[t])}});await Promise.all(i)}function ae(e,t){let n=e.replace(/\\/g,`/`).replace(/\/+$/,``),r=t.replace(/\\/g,`/`),i=n+`/`,a=/^[A-Za-z]:\//.test(i),o=r.slice(0,i.length);return(a?o.toLowerCase()!==i.toLowerCase():o!==i)?null:r.slice(i.length)}async function oe(e,t,i,a){if(!i)return;let o=new Set,s=[...new Set(a)].filter(t=>{if(re(t))return!1;let n=b.get(t);return n&&(b.delete(t),!n.isDisposed())?(b.set(t,n),o.add(t),!1):t.startsWith(`file:`)&&!e.editor.getModel(e.Uri.parse(t))});s.length!==0&&(await ie(s,ne,async a=>{try{let s=g(a),c=s?ae(i,s):null;if(!c){C(a);return}let l=(await r.get(`${n(t)}/files/read?path=${encodeURIComponent(c)}`))?.content;if(typeof l!=`string`){S(a);return}T(a);let u=e.Uri.parse(a);if(e.editor.getModel(u)){o.add(a);return}b.set(a,e.editor.createModel(l,void 0,u)),o.add(a)}catch{S(a)}}),se(o))}function se(e){for(let t of[...b.keys()]){if(b.size<=te)return;if(e.has(t))continue;let n=b.get(t);b.delete(t);try{n?.dispose()}catch{}}}function ce(){for(let e of b.values())try{e.dispose()}catch{}b.clear(),x.clear()}function E(e){if(!e)return;let t=new AbortController;return e.isCancellationRequested?t.abort():e.onCancellationRequested(()=>t.abort()),t.signal}function D(e){return{line:e.lineNumber-1,character:e.column-1}}function le(e){return{lineNumber:e.line+1,column:e.character+1}}function O(e){return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function k(e){return{startLineNumber:e.start.line+1,startColumn:e.start.character+1,endLineNumber:e.end.line+1,endColumn:e.end.character+1}}var ue={1:`Text`,2:`Method`,3:`Function`,4:`Constructor`,5:`Field`,6:`Variable`,7:`Class`,8:`Interface`,9:`Module`,10:`Property`,11:`Unit`,12:`Value`,13:`Enum`,14:`Keyword`,15:`Snippet`,16:`Color`,17:`File`,18:`Reference`,19:`Folder`,20:`EnumMember`,21:`Constant`,22:`Struct`,23:`Event`,24:`Operator`,25:`TypeParameter`},A={1:`File`,2:`Module`,3:`Namespace`,4:`Package`,5:`Class`,6:`Method`,7:`Property`,8:`Field`,9:`Constructor`,10:`Enum`,11:`Interface`,12:`Function`,13:`Variable`,14:`Constant`,15:`String`,16:`Number`,17:`Boolean`,18:`Array`,19:`Object`,20:`Key`,21:`Null`,22:`EnumMember`,23:`Struct`,24:`Event`,25:`Operator`,26:`TypeParameter`},j={1:`Error`,2:`Warning`,3:`Info`,4:`Hint`},M={1:`Text`,2:`Read`,3:`Write`};function N(e,t){let n=ue[t??0];return e.languages.CompletionItemKind[n??`Text`]}function P(e,t){let n=A[t??0];return e.languages.SymbolKind[n??`Variable`]}function F(e,t){let n=j[t??0];return e.MarkerSeverity[n??`Warning`]}function I(e,t){let n=M[t??0];return e.languages.DocumentHighlightKind[n??`Text`]}function L(e){if(e!=null){if(Array.isArray(e)){let t=e.map(L).filter(e=>!!e?.value);return t.length===0?void 0:{value:t.map(e=>e.value).join(`
|
|
2
2
|
|
|
3
3
|
---
|
|
4
4
|
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{t as n}from"./settings-store-tWrnlyEW.js";import{r,t as i}from"./apply-theme-CbR31K6I.js";import{t as a}from"./resolve-theme-BNubecVz.js";import{l as o}from"./index-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{t as n}from"./settings-store-tWrnlyEW.js";import{r,t as i}from"./apply-theme-CbR31K6I.js";import{t as a}from"./resolve-theme-BNubecVz.js";import{l as o}from"./index-BnH1J2Pm.js";var s=e(t(),1);function c(){let e=n(e=>e.themeStyle),t=n(e=>e.themeMode),c=n(e=>e.customThemeId),l=n(e=>e.customThemes),u=()=>o(r()??a(e,t,l,c)),[d,f]=(0,s.useState)(u);return(0,s.useEffect)(()=>{f(u());let e=()=>f(u());return window.addEventListener(i,e),()=>window.removeEventListener(i,e)},[e,t,c,l]),d}export{c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{s as n}from"./index-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t}from"./vendor-markdown-CuWCHIVb.js";import{s as n}from"./index-BnH1J2Pm.js";var r=e(t(),1);function i({url:e,onMessage:t,autoConnect:i=!0,idleTimeoutMs:a,onConnectionChange:o}){let s=(0,r.useRef)(null),c=(0,r.useRef)(t),l=(0,r.useRef)(o);return c.current=t,l.current=o,(0,r.useEffect)(()=>{let t=!0,r=new n(e,{idleTimeoutMs:a,onConnectionChange:e=>{t&&l.current?.(e)}});return s.current=r,r.onMessage(e=>c.current?.(e)),i&&r.connect(),()=>{t=!1,r.disconnect(),s.current=null}},[e,i,a]),{send:(0,r.useCallback)(e=>{s.current?.send(e)},[]),connect:(0,r.useCallback)(()=>{s.current?.connect()},[]),disconnect:(0,r.useCallback)(()=>{s.current?.disconnect()},[])}}export{i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{$n as r,Ct as i,Dr as a,Fr as o,Gn as s,Ir as c,Pr as l,Tt as u,er as d,ln as f,mn as p,or as m,st as h,xn as g,yt as _,zn as v}from"./icons-DQjqk0lJ.js";import"./api-client-Jn3njtNw.js";import"./portal-container-context-BarKmT4S.js";import{t as y}from"./button-B9CTrsEf.js";import{Gt as b,Jt as x,Kt as S,Ut as C,Xt as w,Yt as T,en as E,qt as D}from"./index-CFa7UeZs.js";import{o as O}from"./can-open-in-ppm-CUW3vVJg.js";import{a as k,i as ee,n as A,r as j,t as M}from"./media-url-CVO4m4zr.js";var N=e(t(),1),P={rotation:0,flipH:!1,flipV:!1};function F(e){return{...e,rotation:(e.rotation+90)%360}}function I(e){return{...e,rotation:(e.rotation+270)%360}}function L(e){return e.rotation===0&&!e.flipH&&!e.flipV}function te(e){let t=[];return e.rotation&&t.push(`rotate(${e.rotation}deg)`),e.flipH&&t.push(`scaleX(-1)`),e.flipV&&t.push(`scaleY(-1)`),t.length?t.join(` `):`none`}function ne(e,t){return e.rotation===90||e.rotation===270?{maxWidth:t.height,maxHeight:t.width}:{maxWidth:t.width,maxHeight:t.height}}var R=[[`Space / K`,`Play / pause`],[`← / →`,`Seek 5s`],[`J / L or Shift+← / →`,`Seek 10s`],[`↑ / ↓`,`Volume`],[`M`,`Mute`],[`F`,`Fullscreen`],[`< / >`,`Speed`],[`R / Shift+R`,`Rotate`]];function re(e){return(0,N.useCallback)(t=>{let n=t.target;if(n.tagName===`INPUT`||n.tagName===`TEXTAREA`||n.isContentEditable||t.ctrlKey||t.metaKey||t.altKey)return;let r=!0;switch(t.key){case` `:case`k`:case`K`:e.togglePlay();break;case`ArrowLeft`:e.seekBy(t.shiftKey?-10:-5);break;case`ArrowRight`:e.seekBy(t.shiftKey?10:5);break;case`j`:case`J`:e.seekBy(-10);break;case`l`:case`L`:e.seekBy(10);break;case`ArrowUp`:e.volumeBy(.1);break;case`ArrowDown`:e.volumeBy(-.1);break;case`m`:case`M`:e.toggleMute();break;case`f`:case`F`:e.toggleFullscreen();break;case`<`:case`,`:e.speedStep(-1);break;case`>`:case`.`:e.speedStep(1);break;case`r`:e.rotate(1);break;case`R`:e.rotate(-1);break;default:r=!1}r&&t.preventDefault()},[e])}var z=n(),B=[.25,.5,.75,1,1.25,1.5,2,3];function V({speed:e,onSpeed:t,transform:n,onRotate:o,onFlipH:s,onFlipV:c,onResetTransform:l}){return(0,z.jsxs)(C,{children:[(0,z.jsx)(E,{asChild:!0,children:(0,z.jsxs)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0 relative`,"aria-label":`Playback settings`,children:[(0,z.jsx)(m,{className:`size-5`}),e!==1&&(0,z.jsxs)(`span`,{className:`absolute -top-0.5 -right-0.5 text-[10px] leading-none px-1 rounded bg-primary text-primary-foreground tabular-nums`,children:[e,`x`]})]})}),(0,z.jsxs)(b,{align:`end`,className:`w-60 max-h-[70vh] overflow-y-auto`,children:[(0,z.jsx)(D,{children:`Speed`}),(0,z.jsx)(x,{value:String(e),onValueChange:e=>t(Number(e)),children:(0,z.jsx)(`div`,{className:`grid grid-cols-4 gap-1 px-1 pb-1`,children:B.map(e=>(0,z.jsxs)(T,{value:String(e),className:`justify-center pl-2 min-h-11 text-xs tabular-nums data-[state=checked]:bg-accent [&>span:first-child]:hidden`,children:[e,`x`]},e))})}),(0,z.jsx)(w,{}),(0,z.jsx)(D,{children:`Orientation`}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),o(1)},children:[(0,z.jsx)(d,{className:`size-4`}),` Rotate right `,(0,z.jsx)(`span`,{className:`ml-auto text-xs text-text-subtle`,children:`R`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),o(-1)},children:[(0,z.jsx)(r,{className:`size-4`}),` Rotate left `,(0,z.jsx)(`span`,{className:`ml-auto text-xs text-text-subtle`,children:`⇧R`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),s()},children:[(0,z.jsx)(i,{className:`size-4`}),` Flip horizontal `,n.flipH&&(0,z.jsx)(`span`,{className:`ml-auto text-xs`,children:`✓`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),c()},children:[(0,z.jsx)(u,{className:`size-4`}),` Flip vertical `,n.flipV&&(0,z.jsx)(`span`,{className:`ml-auto text-xs`,children:`✓`})]}),!L(n)&&(0,z.jsxs)(S,{className:`min-h-11`,onSelect:l,children:[(0,z.jsx)(a,{className:`size-4`}),` Reset orientation`]}),(0,z.jsx)(w,{}),(0,z.jsx)(D,{children:`Keyboard`}),(0,z.jsx)(`div`,{className:`px-2 pb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-xs text-text-secondary`,children:R.map(([e,t])=>(0,z.jsxs)(`div`,{className:`contents`,children:[(0,z.jsx)(`kbd`,{className:`font-mono text-text-subtle whitespace-nowrap`,children:e}),(0,z.jsx)(`span`,{children:t})]},e))})]})]})}function H(e){let t=e.muted||e.volume===0?c:e.volume<.5?l:o,n=t=>e.onSeek(Number(t.target.value));return(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1 bg-surface border-t border-border`,children:[(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0`,onClick:e.onTogglePlay,"aria-label":e.playing?`Pause`:`Play`,children:e.playing?(0,z.jsx)(v,{className:`size-5`}):(0,z.jsx)(s,{className:`size-5`})}),(0,z.jsxs)(`span`,{className:`text-xs tabular-nums text-text-secondary shrink-0 min-w-[4.5rem] text-center`,children:[U(e.position),e.duration?` / ${U(e.duration)}`:``]}),e.duration?(0,z.jsx)(`input`,{type:`range`,min:0,max:e.duration,step:.1,value:Math.min(e.position,e.duration),"aria-label":`Seek`,className:`flex-1 h-11 accent-primary cursor-pointer min-w-0`,onChange:t=>e.onScrub(Number(t.target.value)),onPointerUp:n,onKeyUp:n,onTouchEnd:n}):(0,z.jsx)(`div`,{className:`flex-1`}),(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11`,onClick:e.onToggleMute,"aria-label":e.muted?`Unmute`:`Mute`,children:(0,z.jsx)(t,{className:`size-5`})}),(0,z.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:e.muted?0:e.volume,"aria-label":`Volume`,className:`hidden sm:block w-20 h-11 accent-primary cursor-pointer`,onChange:t=>e.onVolume(Number(t.target.value))})]}),(0,z.jsx)(V,{speed:e.speed,onSpeed:e.onSpeed,transform:e.transform,onRotate:e.onRotate,onFlipH:e.onFlipH,onFlipV:e.onFlipV,onResetTransform:e.onResetTransform}),(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0`,onClick:e.onToggleFullscreen,"aria-label":e.fullscreen?`Exit fullscreen`:`Fullscreen`,children:e.fullscreen?(0,z.jsx)(g,{className:`size-5`}):(0,z.jsx)(p,{className:`size-5`})})]})}function U(e){let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=n?String(r).padStart(2,`0`):String(r);return`${n?`${n}:`:``}${a}:${String(i).padStart(2,`0`)}`}function W({filePath:e,projectName:t,mode:n,probeDuration:r=null,onNativeError:i}){let a=(0,N.useRef)(null),o=(0,N.useRef)(null),s=(0,N.useRef)(null),c=(0,N.useRef)(!0),[l]=(0,N.useState)(M),[u,d]=(0,N.useState)(0),[p,m]=(0,N.useState)(0),[h,g]=(0,N.useState)(null),[_,v]=(0,N.useState)(!1),[b,x]=(0,N.useState)(!0),[S,C]=(0,N.useState)(null),[w,T]=(0,N.useState)(1),[E,D]=(0,N.useState)(!1),[O,A]=(0,N.useState)(1),[L,R]=(0,N.useState)(P),[V,U]=(0,N.useState)(!1),[W,G]=(0,N.useState)({width:0,height:0}),[K,q]=(0,N.useState)(null),J=n===`transcode`,Y=J?k(e,t,u,l):j(e,t),X=J?r:h,ie=S??(J?u+p:p);(0,N.useEffect)(()=>{m(0),x(!0),q(null)},[Y]),(0,N.useEffect)(()=>{d(0),g(null),R(P)},[e,n]),(0,N.useEffect)(()=>{let e=s.current;e&&(e.volume=w,e.muted=E)},[w,E]),(0,N.useEffect)(()=>{let e=s.current;e&&(e.playbackRate=O)},[O,Y]),(0,N.useEffect)(()=>{let n=s.current,r=()=>{J&&ee(e,t,l)};return window.addEventListener(`pagehide`,r),()=>{window.removeEventListener(`pagehide`,r),n&&!n.isConnected&&(n.pause(),n.removeAttribute(`src`),n.load(),r())}},[e,t,J,l]),(0,N.useEffect)(()=>{let e=()=>U(document.fullscreenElement===a.current);return document.addEventListener(`fullscreenchange`,e),()=>document.removeEventListener(`fullscreenchange`,e)},[]),(0,N.useEffect)(()=>{let e=o.current;if(!e)return;let t=new ResizeObserver(()=>G({width:e.clientWidth,height:e.clientHeight}));return t.observe(e),()=>t.disconnect()},[]);let Z=(0,N.useCallback)(e=>{let t=s.current,n=Math.max(0,X?Math.min(e,X-.5):e);if(C(null),!J){t&&(t.currentTime=n);return}Math.abs(n-(u+(t?.currentTime??0)))<.5||d(n)},[X,J,u]),Q=(0,N.useMemo)(()=>({togglePlay:()=>{let e=s.current;e&&(c.current=e.paused,e.paused?e.play().catch(()=>{}):e.pause())},seekBy:e=>Z((J?u:0)+(s.current?.currentTime??0)+e),toggleFullscreen:()=>{document.fullscreenElement?document.exitFullscreen():a.current?.requestFullscreen?.()},toggleMute:()=>D(e=>!e),volumeBy:e=>{D(!1),T(t=>Math.min(1,Math.max(0,Math.round((t+e)*100)/100)))},speedStep:e=>A(t=>{let n=B.indexOf(t);return B[Math.min(B.length-1,Math.max(0,(n===-1?3:n)+e))]??1}),rotate:e=>R(t=>e===1?F(t):I(t))}),[Z,J,u]),ae=re(Q),$=ne(L,W),oe=()=>{q(null),d(e=>e+.001)};return(0,z.jsxs)(`div`,{ref:a,"data-testid":`video-player`,tabIndex:0,onKeyDown:ae,className:`flex flex-col h-full bg-black outline-none focus-visible:ring-1 focus-visible:ring-primary/60`,children:[(0,z.jsxs)(`div`,{ref:o,className:`relative flex-1 min-h-0 flex items-center justify-center overflow-hidden`,onClick:e=>{a.current?.focus(),e.detail===1&&Q.togglePlay()},onDoubleClick:Q.toggleFullscreen,children:[(0,z.jsx)(`video`,{ref:s,src:Y,autoPlay:!0,playsInline:!0,preload:J?`auto`:`metadata`,style:{transform:te(L),maxWidth:$.maxWidth||void 0,maxHeight:$.maxHeight||void 0},onLoadedMetadata:e=>{let t=e.currentTarget;t.playbackRate=O,t.volume=w,t.muted=E,!J&&Number.isFinite(t.duration)&&g(t.duration),J&&!c.current&&t.pause()},onPlay:()=>v(!0),onPause:()=>v(!1),onWaiting:()=>x(!0),onPlaying:()=>x(!1),onCanPlay:()=>x(!1),onTimeUpdate:e=>m(e.currentTarget.currentTime),onEnded:()=>{v(!1),c.current=!1},onError:()=>{J?q(`Transcoding failed. ffmpeg may have stopped or the file is corrupt.`):i?.()}}),b&&!K&&(0,z.jsx)(f,{className:`absolute size-8 animate-spin text-white/80 pointer-events-none`}),K&&(0,z.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/85 text-text-secondary p-4 text-center`,onClick:e=>e.stopPropagation(),onDoubleClick:e=>e.stopPropagation(),children:[(0,z.jsx)(`p`,{className:`text-sm`,children:K}),(0,z.jsx)(y,{variant:`outline`,size:`sm`,className:`h-11 px-4`,onClick:oe,children:`Retry`})]})]}),(0,z.jsx)(H,{playing:_,position:ie,duration:X,volume:w,muted:E,speed:O,transform:L,fullscreen:V,onTogglePlay:Q.togglePlay,onScrub:C,onSeek:Z,onVolume:e=>{T(e),D(e===0)},onToggleMute:Q.toggleMute,onSpeed:A,onRotate:Q.rotate,onFlipH:()=>R(e=>({...e,flipH:!e.flipH})),onFlipV:()=>R(e=>({...e,flipV:!e.flipV})),onResetTransform:()=>R(P),onToggleFullscreen:Q.toggleFullscreen})]})}var G=new Set([`mp4`,`m4v`,`webm`,`ogg`,`ogv`,`mov`]);function K({filePath:e,projectName:t}){let n=O(e),[r,i]=(0,N.useState)(()=>G.has(n)?{kind:`native`}:{kind:`probing`});return(0,N.useEffect)(()=>{i(G.has(O(e))?{kind:`native`}:{kind:`probing`})},[e]),(0,N.useEffect)(()=>{if(r.kind!==`probing`)return;let n=!1;return A(e,t).then(e=>{n||i(e.transcodable?{kind:`transcode`,probe:e}:{kind:`unsupported`,probe:e})}).catch(()=>{n||i({kind:`unsupported`,probe:null})}),()=>{n=!0}},[r.kind,e,t]),r.kind===`probing`?(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(f,{className:`size-5 animate-spin text-text-subtle`})}):r.kind===`transcode`?(0,z.jsx)(W,{filePath:e,projectName:t,mode:`transcode`,probeDuration:r.probe.duration}):r.kind===`unsupported`?(0,z.jsx)(q,{filePath:e,projectName:t,probe:r.probe}):(0,z.jsx)(W,{filePath:e,projectName:t,mode:`native`,onNativeError:()=>i({kind:`probing`})})}function q({filePath:e,projectName:t,probe:n}){let r=[n?.video?.codec,n?.audio?.codec].filter(Boolean).join(` + `);return(0,z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary p-6 text-center`,children:[(0,z.jsx)(_,{className:`size-10 text-text-subtle`}),(0,z.jsxs)(`p`,{className:`text-sm`,children:[`This video cannot be played in the browser`,r?` (${r})`:``,`.`]}),(0,z.jsxs)(`p`,{className:`text-xs text-text-subtle max-w-sm`,children:[`Install `,(0,z.jsx)(`code`,{children:`ffmpeg`}),` on the PPM server (e.g. `,(0,z.jsx)(`code`,{children:`winget install ffmpeg`}),`, `,(0,z.jsx)(`code`,{children:`brew install ffmpeg`}),`,`,` `,(0,z.jsx)(`code`,{children:`apt install ffmpeg`}),`) and restart PPM to transcode it on the fly.`]}),(0,z.jsx)(y,{asChild:!0,variant:`outline`,size:`sm`,className:`h-11 px-4`,children:(0,z.jsxs)(`a`,{href:`${j(e,t)}&download=true`,download:!0,children:[(0,z.jsx)(h,{className:`size-4 mr-2`}),` Download file`]})})]})}export{K as VideoPreview};
|
|
1
|
+
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{$n as r,Ct as i,Dr as a,Fr as o,Gn as s,Ir as c,Pr as l,Tt as u,er as d,ln as f,mn as p,or as m,st as h,xn as g,yt as _,zn as v}from"./icons-DQjqk0lJ.js";import"./api-client-Jn3njtNw.js";import"./portal-container-context-BarKmT4S.js";import{t as y}from"./button-B9CTrsEf.js";import{Gt as b,Jt as x,Kt as S,Ut as C,Xt as w,Yt as T,en as E,qt as D}from"./index-BnH1J2Pm.js";import{o as O}from"./can-open-in-ppm-CUW3vVJg.js";import{a as k,i as ee,n as A,r as j,t as M}from"./media-url-CVO4m4zr.js";var N=e(t(),1),P={rotation:0,flipH:!1,flipV:!1};function F(e){return{...e,rotation:(e.rotation+90)%360}}function I(e){return{...e,rotation:(e.rotation+270)%360}}function L(e){return e.rotation===0&&!e.flipH&&!e.flipV}function te(e){let t=[];return e.rotation&&t.push(`rotate(${e.rotation}deg)`),e.flipH&&t.push(`scaleX(-1)`),e.flipV&&t.push(`scaleY(-1)`),t.length?t.join(` `):`none`}function ne(e,t){return e.rotation===90||e.rotation===270?{maxWidth:t.height,maxHeight:t.width}:{maxWidth:t.width,maxHeight:t.height}}var R=[[`Space / K`,`Play / pause`],[`← / →`,`Seek 5s`],[`J / L or Shift+← / →`,`Seek 10s`],[`↑ / ↓`,`Volume`],[`M`,`Mute`],[`F`,`Fullscreen`],[`< / >`,`Speed`],[`R / Shift+R`,`Rotate`]];function re(e){return(0,N.useCallback)(t=>{let n=t.target;if(n.tagName===`INPUT`||n.tagName===`TEXTAREA`||n.isContentEditable||t.ctrlKey||t.metaKey||t.altKey)return;let r=!0;switch(t.key){case` `:case`k`:case`K`:e.togglePlay();break;case`ArrowLeft`:e.seekBy(t.shiftKey?-10:-5);break;case`ArrowRight`:e.seekBy(t.shiftKey?10:5);break;case`j`:case`J`:e.seekBy(-10);break;case`l`:case`L`:e.seekBy(10);break;case`ArrowUp`:e.volumeBy(.1);break;case`ArrowDown`:e.volumeBy(-.1);break;case`m`:case`M`:e.toggleMute();break;case`f`:case`F`:e.toggleFullscreen();break;case`<`:case`,`:e.speedStep(-1);break;case`>`:case`.`:e.speedStep(1);break;case`r`:e.rotate(1);break;case`R`:e.rotate(-1);break;default:r=!1}r&&t.preventDefault()},[e])}var z=n(),B=[.25,.5,.75,1,1.25,1.5,2,3];function V({speed:e,onSpeed:t,transform:n,onRotate:o,onFlipH:s,onFlipV:c,onResetTransform:l}){return(0,z.jsxs)(C,{children:[(0,z.jsx)(E,{asChild:!0,children:(0,z.jsxs)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0 relative`,"aria-label":`Playback settings`,children:[(0,z.jsx)(m,{className:`size-5`}),e!==1&&(0,z.jsxs)(`span`,{className:`absolute -top-0.5 -right-0.5 text-[10px] leading-none px-1 rounded bg-primary text-primary-foreground tabular-nums`,children:[e,`x`]})]})}),(0,z.jsxs)(b,{align:`end`,className:`w-60 max-h-[70vh] overflow-y-auto`,children:[(0,z.jsx)(D,{children:`Speed`}),(0,z.jsx)(x,{value:String(e),onValueChange:e=>t(Number(e)),children:(0,z.jsx)(`div`,{className:`grid grid-cols-4 gap-1 px-1 pb-1`,children:B.map(e=>(0,z.jsxs)(T,{value:String(e),className:`justify-center pl-2 min-h-11 text-xs tabular-nums data-[state=checked]:bg-accent [&>span:first-child]:hidden`,children:[e,`x`]},e))})}),(0,z.jsx)(w,{}),(0,z.jsx)(D,{children:`Orientation`}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),o(1)},children:[(0,z.jsx)(d,{className:`size-4`}),` Rotate right `,(0,z.jsx)(`span`,{className:`ml-auto text-xs text-text-subtle`,children:`R`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),o(-1)},children:[(0,z.jsx)(r,{className:`size-4`}),` Rotate left `,(0,z.jsx)(`span`,{className:`ml-auto text-xs text-text-subtle`,children:`⇧R`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),s()},children:[(0,z.jsx)(i,{className:`size-4`}),` Flip horizontal `,n.flipH&&(0,z.jsx)(`span`,{className:`ml-auto text-xs`,children:`✓`})]}),(0,z.jsxs)(S,{className:`min-h-11`,onSelect:e=>{e.preventDefault(),c()},children:[(0,z.jsx)(u,{className:`size-4`}),` Flip vertical `,n.flipV&&(0,z.jsx)(`span`,{className:`ml-auto text-xs`,children:`✓`})]}),!L(n)&&(0,z.jsxs)(S,{className:`min-h-11`,onSelect:l,children:[(0,z.jsx)(a,{className:`size-4`}),` Reset orientation`]}),(0,z.jsx)(w,{}),(0,z.jsx)(D,{children:`Keyboard`}),(0,z.jsx)(`div`,{className:`px-2 pb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-xs text-text-secondary`,children:R.map(([e,t])=>(0,z.jsxs)(`div`,{className:`contents`,children:[(0,z.jsx)(`kbd`,{className:`font-mono text-text-subtle whitespace-nowrap`,children:e}),(0,z.jsx)(`span`,{children:t})]},e))})]})]})}function H(e){let t=e.muted||e.volume===0?c:e.volume<.5?l:o,n=t=>e.onSeek(Number(t.target.value));return(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1 bg-surface border-t border-border`,children:[(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0`,onClick:e.onTogglePlay,"aria-label":e.playing?`Pause`:`Play`,children:e.playing?(0,z.jsx)(v,{className:`size-5`}):(0,z.jsx)(s,{className:`size-5`})}),(0,z.jsxs)(`span`,{className:`text-xs tabular-nums text-text-secondary shrink-0 min-w-[4.5rem] text-center`,children:[U(e.position),e.duration?` / ${U(e.duration)}`:``]}),e.duration?(0,z.jsx)(`input`,{type:`range`,min:0,max:e.duration,step:.1,value:Math.min(e.position,e.duration),"aria-label":`Seek`,className:`flex-1 h-11 accent-primary cursor-pointer min-w-0`,onChange:t=>e.onScrub(Number(t.target.value)),onPointerUp:n,onKeyUp:n,onTouchEnd:n}):(0,z.jsx)(`div`,{className:`flex-1`}),(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11`,onClick:e.onToggleMute,"aria-label":e.muted?`Unmute`:`Mute`,children:(0,z.jsx)(t,{className:`size-5`})}),(0,z.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:e.muted?0:e.volume,"aria-label":`Volume`,className:`hidden sm:block w-20 h-11 accent-primary cursor-pointer`,onChange:t=>e.onVolume(Number(t.target.value))})]}),(0,z.jsx)(V,{speed:e.speed,onSpeed:e.onSpeed,transform:e.transform,onRotate:e.onRotate,onFlipH:e.onFlipH,onFlipV:e.onFlipV,onResetTransform:e.onResetTransform}),(0,z.jsx)(y,{variant:`ghost`,size:`icon`,className:`size-11 shrink-0`,onClick:e.onToggleFullscreen,"aria-label":e.fullscreen?`Exit fullscreen`:`Fullscreen`,children:e.fullscreen?(0,z.jsx)(g,{className:`size-5`}):(0,z.jsx)(p,{className:`size-5`})})]})}function U(e){let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=n?String(r).padStart(2,`0`):String(r);return`${n?`${n}:`:``}${a}:${String(i).padStart(2,`0`)}`}function W({filePath:e,projectName:t,mode:n,probeDuration:r=null,onNativeError:i}){let a=(0,N.useRef)(null),o=(0,N.useRef)(null),s=(0,N.useRef)(null),c=(0,N.useRef)(!0),[l]=(0,N.useState)(M),[u,d]=(0,N.useState)(0),[p,m]=(0,N.useState)(0),[h,g]=(0,N.useState)(null),[_,v]=(0,N.useState)(!1),[b,x]=(0,N.useState)(!0),[S,C]=(0,N.useState)(null),[w,T]=(0,N.useState)(1),[E,D]=(0,N.useState)(!1),[O,A]=(0,N.useState)(1),[L,R]=(0,N.useState)(P),[V,U]=(0,N.useState)(!1),[W,G]=(0,N.useState)({width:0,height:0}),[K,q]=(0,N.useState)(null),J=n===`transcode`,Y=J?k(e,t,u,l):j(e,t),X=J?r:h,ie=S??(J?u+p:p);(0,N.useEffect)(()=>{m(0),x(!0),q(null)},[Y]),(0,N.useEffect)(()=>{d(0),g(null),R(P)},[e,n]),(0,N.useEffect)(()=>{let e=s.current;e&&(e.volume=w,e.muted=E)},[w,E]),(0,N.useEffect)(()=>{let e=s.current;e&&(e.playbackRate=O)},[O,Y]),(0,N.useEffect)(()=>{let n=s.current,r=()=>{J&&ee(e,t,l)};return window.addEventListener(`pagehide`,r),()=>{window.removeEventListener(`pagehide`,r),n&&!n.isConnected&&(n.pause(),n.removeAttribute(`src`),n.load(),r())}},[e,t,J,l]),(0,N.useEffect)(()=>{let e=()=>U(document.fullscreenElement===a.current);return document.addEventListener(`fullscreenchange`,e),()=>document.removeEventListener(`fullscreenchange`,e)},[]),(0,N.useEffect)(()=>{let e=o.current;if(!e)return;let t=new ResizeObserver(()=>G({width:e.clientWidth,height:e.clientHeight}));return t.observe(e),()=>t.disconnect()},[]);let Z=(0,N.useCallback)(e=>{let t=s.current,n=Math.max(0,X?Math.min(e,X-.5):e);if(C(null),!J){t&&(t.currentTime=n);return}Math.abs(n-(u+(t?.currentTime??0)))<.5||d(n)},[X,J,u]),Q=(0,N.useMemo)(()=>({togglePlay:()=>{let e=s.current;e&&(c.current=e.paused,e.paused?e.play().catch(()=>{}):e.pause())},seekBy:e=>Z((J?u:0)+(s.current?.currentTime??0)+e),toggleFullscreen:()=>{document.fullscreenElement?document.exitFullscreen():a.current?.requestFullscreen?.()},toggleMute:()=>D(e=>!e),volumeBy:e=>{D(!1),T(t=>Math.min(1,Math.max(0,Math.round((t+e)*100)/100)))},speedStep:e=>A(t=>{let n=B.indexOf(t);return B[Math.min(B.length-1,Math.max(0,(n===-1?3:n)+e))]??1}),rotate:e=>R(t=>e===1?F(t):I(t))}),[Z,J,u]),ae=re(Q),$=ne(L,W),oe=()=>{q(null),d(e=>e+.001)};return(0,z.jsxs)(`div`,{ref:a,"data-testid":`video-player`,tabIndex:0,onKeyDown:ae,className:`flex flex-col h-full bg-black outline-none focus-visible:ring-1 focus-visible:ring-primary/60`,children:[(0,z.jsxs)(`div`,{ref:o,className:`relative flex-1 min-h-0 flex items-center justify-center overflow-hidden`,onClick:e=>{a.current?.focus(),e.detail===1&&Q.togglePlay()},onDoubleClick:Q.toggleFullscreen,children:[(0,z.jsx)(`video`,{ref:s,src:Y,autoPlay:!0,playsInline:!0,preload:J?`auto`:`metadata`,style:{transform:te(L),maxWidth:$.maxWidth||void 0,maxHeight:$.maxHeight||void 0},onLoadedMetadata:e=>{let t=e.currentTarget;t.playbackRate=O,t.volume=w,t.muted=E,!J&&Number.isFinite(t.duration)&&g(t.duration),J&&!c.current&&t.pause()},onPlay:()=>v(!0),onPause:()=>v(!1),onWaiting:()=>x(!0),onPlaying:()=>x(!1),onCanPlay:()=>x(!1),onTimeUpdate:e=>m(e.currentTarget.currentTime),onEnded:()=>{v(!1),c.current=!1},onError:()=>{J?q(`Transcoding failed. ffmpeg may have stopped or the file is corrupt.`):i?.()}}),b&&!K&&(0,z.jsx)(f,{className:`absolute size-8 animate-spin text-white/80 pointer-events-none`}),K&&(0,z.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/85 text-text-secondary p-4 text-center`,onClick:e=>e.stopPropagation(),onDoubleClick:e=>e.stopPropagation(),children:[(0,z.jsx)(`p`,{className:`text-sm`,children:K}),(0,z.jsx)(y,{variant:`outline`,size:`sm`,className:`h-11 px-4`,onClick:oe,children:`Retry`})]})]}),(0,z.jsx)(H,{playing:_,position:ie,duration:X,volume:w,muted:E,speed:O,transform:L,fullscreen:V,onTogglePlay:Q.togglePlay,onScrub:C,onSeek:Z,onVolume:e=>{T(e),D(e===0)},onToggleMute:Q.toggleMute,onSpeed:A,onRotate:Q.rotate,onFlipH:()=>R(e=>({...e,flipH:!e.flipH})),onFlipV:()=>R(e=>({...e,flipV:!e.flipV})),onResetTransform:()=>R(P),onToggleFullscreen:Q.toggleFullscreen})]})}var G=new Set([`mp4`,`m4v`,`webm`,`ogg`,`ogv`,`mov`]);function K({filePath:e,projectName:t}){let n=O(e),[r,i]=(0,N.useState)(()=>G.has(n)?{kind:`native`}:{kind:`probing`});return(0,N.useEffect)(()=>{i(G.has(O(e))?{kind:`native`}:{kind:`probing`})},[e]),(0,N.useEffect)(()=>{if(r.kind!==`probing`)return;let n=!1;return A(e,t).then(e=>{n||i(e.transcodable?{kind:`transcode`,probe:e}:{kind:`unsupported`,probe:e})}).catch(()=>{n||i({kind:`unsupported`,probe:null})}),()=>{n=!0}},[r.kind,e,t]),r.kind===`probing`?(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(f,{className:`size-5 animate-spin text-text-subtle`})}):r.kind===`transcode`?(0,z.jsx)(W,{filePath:e,projectName:t,mode:`transcode`,probeDuration:r.probe.duration}):r.kind===`unsupported`?(0,z.jsx)(q,{filePath:e,projectName:t,probe:r.probe}):(0,z.jsx)(W,{filePath:e,projectName:t,mode:`native`,onNativeError:()=>i({kind:`probing`})})}function q({filePath:e,projectName:t,probe:n}){let r=[n?.video?.codec,n?.audio?.codec].filter(Boolean).join(` + `);return(0,z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary p-6 text-center`,children:[(0,z.jsx)(_,{className:`size-10 text-text-subtle`}),(0,z.jsxs)(`p`,{className:`text-sm`,children:[`This video cannot be played in the browser`,r?` (${r})`:``,`.`]}),(0,z.jsxs)(`p`,{className:`text-xs text-text-subtle max-w-sm`,children:[`Install `,(0,z.jsx)(`code`,{children:`ffmpeg`}),` on the PPM server (e.g. `,(0,z.jsx)(`code`,{children:`winget install ffmpeg`}),`, `,(0,z.jsx)(`code`,{children:`brew install ffmpeg`}),`,`,` `,(0,z.jsx)(`code`,{children:`apt install ffmpeg`}),`) and restart PPM to transcode it on the fly.`]}),(0,z.jsx)(y,{asChild:!0,variant:`outline`,size:`sm`,className:`h-11 px-4`,children:(0,z.jsxs)(`a`,{href:`${j(e,t)}&download=true`,download:!0,children:[(0,z.jsx)(h,{className:`size-4 mr-2`}),` Download file`]})})]})}export{K as VideoPreview};
|
|
Binary file
|
|
Binary file
|
package/dist/web/index.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
11
11
|
<link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&family=Geist:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-BnH1J2Pm.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-FhOqtrmT.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-D6lgjvVE.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/vendor-markdown-CuWCHIVb.js">
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/tab-store-krAuHQ6_.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/apply-theme-CbR31K6I.js">
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/resolve-theme-BNubecVz.js">
|
|
47
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
47
|
+
<link rel="stylesheet" crossorigin href="/assets/index-C3lfHthr.css">
|
|
48
48
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
|
49
49
|
<body class="text-text font-sans antialiased" style="background: var(--bg)">
|
|
50
50
|
<!-- FOUC guard: apply the persisted theme mode before first paint.
|
package/dist/web/index.html.br
CHANGED
|
Binary file
|
package/dist/web/index.html.gz
CHANGED
|
Binary file
|
package/dist/web/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}var B=`-precache-`,V=async(e,t=B)=>{let n=(await self.caches.keys()).filter(n=>n.includes(t)&&n.includes(self.registration.scope)&&n!==e);return await Promise.all(n.map(e=>self.caches.delete(e))),n};function H(){self.addEventListener(`activate`,(e=>{let t=a.getPrecacheName();e.waitUntil(V(t).then(e=>{}))}))}function U(e){O().precache(e)}function W(e,t){U(e),z(t)}var G=class extends w{async _handle(e,n){let r=await n.cacheMatch(e),i;if(!r)try{r=await n.fetchAndCachePut(e)}catch(e){e instanceof Error&&(i=e)}if(!r)throw new t(`no-response`,{url:e.url,error:i});return r}};W([{"revision":"ff459c1dd5510671964f0c5d42b7b1a0","url":"index.html"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":null,"url":"assets/index-CWL5emyr.css"},{"revision":null,"url":"assets/index-CFa7UeZs.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]),H();var K=e=>(e.headers.get(`content-type`)??``).startsWith(`text/html`);F(({url:e})=>e.pathname.startsWith(`/assets/`),new G({cacheName:`ppm-assets`,plugins:[{cacheWillUpdate:async({response:e})=>K(e)?null:e,cachedResponseWillBeUsed:async({cachedResponse:e})=>e&&K(e)?null:e}]})),self.skipWaiting(),self.addEventListener(`activate`,()=>{self.clients.claim()});
|
|
1
|
+
try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}var B=`-precache-`,V=async(e,t=B)=>{let n=(await self.caches.keys()).filter(n=>n.includes(t)&&n.includes(self.registration.scope)&&n!==e);return await Promise.all(n.map(e=>self.caches.delete(e))),n};function H(){self.addEventListener(`activate`,(e=>{let t=a.getPrecacheName();e.waitUntil(V(t).then(e=>{}))}))}function U(e){O().precache(e)}function W(e,t){U(e),z(t)}var G=class extends w{async _handle(e,n){let r=await n.cacheMatch(e),i;if(!r)try{r=await n.fetchAndCachePut(e)}catch(e){e instanceof Error&&(i=e)}if(!r)throw new t(`no-response`,{url:e.url,error:i});return r}};W([{"revision":"740abeadf4cf2750918424ffda622498","url":"index.html"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":null,"url":"assets/index-C3lfHthr.css"},{"revision":null,"url":"assets/index-BnH1J2Pm.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]),H();var K=e=>(e.headers.get(`content-type`)??``).startsWith(`text/html`);F(({url:e})=>e.pathname.startsWith(`/assets/`),new G({cacheName:`ppm-assets`,plugins:[{cacheWillUpdate:async({response:e})=>K(e)?null:e,cachedResponseWillBeUsed:async({cachedResponse:e})=>e&&K(e)?null:e}]})),self.skipWaiting(),self.addEventListener(`activate`,()=>{self.clients.claim()});
|
package/dist/web/sw.js.br
CHANGED
|
Binary file
|
package/dist/web/sw.js.gz
CHANGED
|
Binary file
|
package/package.json
CHANGED
package/src/cli/commands/init.ts
CHANGED
|
@@ -105,7 +105,7 @@ export async function initProject(options: InitOptions = {}) {
|
|
|
105
105
|
}));
|
|
106
106
|
|
|
107
107
|
// 6. Advanced settings
|
|
108
|
-
let aiModel = "claude-opus-5";
|
|
108
|
+
let aiModel = "claude-opus-5-5";
|
|
109
109
|
let aiEffort: "low" | "medium" | "high" | "xhigh" | "max" = "high";
|
|
110
110
|
let aiMaxTurns = 100;
|
|
111
111
|
let aiApiKeyEnv = "ANTHROPIC_API_KEY";
|
|
@@ -120,7 +120,7 @@ export async function initProject(options: InitOptions = {}) {
|
|
|
120
120
|
aiModel = await select({
|
|
121
121
|
message: "AI model:",
|
|
122
122
|
choices: CLAUDE_MODELS.map((m) => ({ value: m.value, name: claudeModelInitName(m) })),
|
|
123
|
-
default: "claude-opus-5",
|
|
123
|
+
default: "claude-opus-5-5",
|
|
124
124
|
});
|
|
125
125
|
|
|
126
126
|
aiEffort = await select({
|
|
@@ -21,8 +21,9 @@ export interface ClaudeModelOption {
|
|
|
21
21
|
|
|
22
22
|
/** Ordered newest/most-capable first; the first entry is not automatically the default. */
|
|
23
23
|
export const CLAUDE_MODELS: readonly ClaudeModelOption[] = [
|
|
24
|
-
{ value: "claude-opus-5", label: "Claude Opus 5", hint: "
|
|
24
|
+
{ value: "claude-opus-5-5", label: "Claude Opus 5.5", hint: "balanced, recommended" },
|
|
25
25
|
{ value: "claude-fable-5-1", label: "Claude Fable 5.1", hint: "flagship" },
|
|
26
|
+
{ value: "claude-opus-5", label: "Claude Opus 5", hint: "most powerful" },
|
|
26
27
|
{ value: "claude-fable-5", label: "Claude Fable 5", hint: "flagship" },
|
|
27
28
|
{ value: "claude-opus-4-8", label: "Claude Opus 4.8", hint: "powerful" },
|
|
28
29
|
{ value: "claude-opus-4-7", label: "Claude Opus 4.7", hint: "powerful" },
|
package/src/types/config.ts
CHANGED
|
@@ -129,11 +129,12 @@ export interface AIProviderConfig {
|
|
|
129
129
|
* Claude's, instead of being invisible inside the registration code.
|
|
130
130
|
*
|
|
131
131
|
* Deliberately not codex's own default, which is its most capable model and
|
|
132
|
-
* bills accordingly; codex describes this one as its
|
|
133
|
-
*
|
|
134
|
-
* it in Settings, or per session in the chat's model picker, overrides
|
|
132
|
+
* bills accordingly; codex describes this one as its "workhorse model for
|
|
133
|
+
* coding and everyday work", which is what a chat in an IDE mostly does.
|
|
134
|
+
* Changing it in Settings, or per session in the chat's model picker, overrides
|
|
135
|
+
* this.
|
|
135
136
|
*/
|
|
136
|
-
export const CODEX_DEFAULT_MODEL = "gpt-
|
|
137
|
+
export const CODEX_DEFAULT_MODEL = "gpt-6-sol";
|
|
137
138
|
|
|
138
139
|
export const DEFAULT_CONFIG: PpmConfig = {
|
|
139
140
|
device_name: "",
|
|
@@ -150,7 +151,7 @@ export const DEFAULT_CONFIG: PpmConfig = {
|
|
|
150
151
|
claude: {
|
|
151
152
|
type: "agent-sdk",
|
|
152
153
|
api_key_env: "ANTHROPIC_API_KEY",
|
|
153
|
-
model: "claude-opus-5",
|
|
154
|
+
model: "claude-opus-5-5",
|
|
154
155
|
effort: "high",
|
|
155
156
|
max_turns: 1000,
|
|
156
157
|
permission_mode: "bypassPermissions",
|
|
@@ -11,7 +11,7 @@ interface ChatWelcomeProps {
|
|
|
11
11
|
export function ChatWelcome({ projectName, onSelectSession }: ChatWelcomeProps) {
|
|
12
12
|
return (
|
|
13
13
|
<div className="flex flex-col items-center justify-center h-full gap-6 text-text-secondary overflow-y-auto">
|
|
14
|
-
<div className="flex flex-col items-center gap-3">
|
|
14
|
+
<div className="flex flex-col items-center gap-3 px-4 w-full">
|
|
15
15
|
<Bot className="size-10 text-text-subtle" />
|
|
16
16
|
<p className="text-sm">Send a message to start a new conversation</p>
|
|
17
17
|
<OnboardingEntry compact />
|
|
@@ -37,20 +37,29 @@ const MOBILE_SUPPORTED = new Set<string>([
|
|
|
37
37
|
]);
|
|
38
38
|
const isMobileSupported = (id: SidebarActiveTab) => MOBILE_SUPPORTED.has(id) || id.startsWith("ext:");
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
40
|
+
interface FooterTileDef {
|
|
41
|
+
icon: React.ElementType;
|
|
42
|
+
label: string;
|
|
43
|
+
badge?: FeatureBadgeId;
|
|
44
|
+
onClick: () => void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** One utility tile in the drawer footer row — icon over a short single-line label, with an
|
|
48
|
+
* optional feature badge. Uniform size, and short labels ("Cloud", not "Cloud & Share") so
|
|
49
|
+
* every tile stays on one line at the narrowest phone width. */
|
|
50
|
+
function FooterTile({ icon: Icon, label, badge, onClick }: FooterTileDef) {
|
|
46
51
|
return (
|
|
47
52
|
<button
|
|
48
53
|
onClick={onClick}
|
|
49
|
-
className="group
|
|
54
|
+
className="group flex flex-col items-center justify-center gap-1 rounded-lg py-2.5 text-text-subtle hover:bg-surface-elevated hover:text-text-secondary transition-colors"
|
|
50
55
|
>
|
|
51
|
-
|
|
56
|
+
{/* The badge hangs off the icon, not the tile: a tile is a whole column wide, so a
|
|
57
|
+
tile-corner badge floats away from the thing it is labelling. */}
|
|
58
|
+
<span className="relative flex items-center justify-center">
|
|
59
|
+
<Icon className="size-4" />
|
|
60
|
+
<FeatureBadge id={badge} variant="corner" className="-top-2 -right-3" />
|
|
61
|
+
</span>
|
|
52
62
|
<span className="text-[10px] leading-none">{label}</span>
|
|
53
|
-
<FeatureBadge id={badge} variant="corner" />
|
|
54
63
|
</button>
|
|
55
64
|
);
|
|
56
65
|
}
|
|
@@ -100,6 +109,21 @@ export function MobileDrawer({ isOpen, onClose, initialTab }: MobileDrawerProps)
|
|
|
100
109
|
|
|
101
110
|
const handleReportBug = useCallback(() => openBugReportPopup(version), [version]);
|
|
102
111
|
|
|
112
|
+
// Built as a list so the row's column count can follow the tile count. With a fixed column
|
|
113
|
+
// count an optional tile (Remote, only on a capable host) pushes the last tile onto a second
|
|
114
|
+
// line by itself — one lonely icon under four, which is what a "grid" costs here.
|
|
115
|
+
const footerTiles: FooterTileDef[] = [
|
|
116
|
+
// Not a sidebar tab — the explorer opens as its own full-screen sheet.
|
|
117
|
+
{ icon: FolderTree, label: "Files", badge: "os-explorer", onClick: () => { onClose(); void openExplorer(); } },
|
|
118
|
+
...(remoteDesktopAvailable
|
|
119
|
+
? [{ icon: MonitorSmartphone, label: "Remote", badge: "remote-desktop", onClick: () => { onClose(); openRemoteDesktop(); } } satisfies FooterTileDef]
|
|
120
|
+
: []),
|
|
121
|
+
{ icon: Cloud, label: "Cloud", onClick: () => setCloudOpen(true) },
|
|
122
|
+
// Also not a sidebar tab — settings open as their own tab here, window on desktop.
|
|
123
|
+
{ icon: Settings, label: "Settings", onClick: () => { onClose(); openSettings(); } },
|
|
124
|
+
{ icon: BugIcon, label: "Bug", onClick: handleReportBug },
|
|
125
|
+
];
|
|
126
|
+
|
|
103
127
|
const noProject = (
|
|
104
128
|
<p className="px-4 py-6 text-xs text-text-secondary text-center">
|
|
105
129
|
Select a project from the bottom nav bar
|
|
@@ -162,19 +186,16 @@ export function MobileDrawer({ isOpen, onClose, initialTab }: MobileDrawerProps)
|
|
|
162
186
|
onReorder={setSidebarTabOrder}
|
|
163
187
|
/>
|
|
164
188
|
|
|
165
|
-
{/* Footer:
|
|
166
|
-
|
|
189
|
+
{/* Footer: one row of utility tiles (opens explorer/remote/cloud/settings, report bug),
|
|
190
|
+
then version/upgrade on its own line under a divider. */}
|
|
167
191
|
<div className="border-t border-border px-3 py-2">
|
|
168
|
-
<div
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
{/* Also not a sidebar tab — settings open as their own tab here, window on desktop. */}
|
|
176
|
-
<FooterTile icon={Settings} label="Settings" onClick={() => { onClose(); openSettings(); }} />
|
|
177
|
-
<FooterTile icon={BugIcon} label="Bug" onClick={handleReportBug} />
|
|
192
|
+
<div
|
|
193
|
+
className="grid gap-1"
|
|
194
|
+
style={{ gridTemplateColumns: `repeat(${footerTiles.length}, minmax(0, 1fr))` }}
|
|
195
|
+
>
|
|
196
|
+
{footerTiles.map((tile) => (
|
|
197
|
+
<FooterTile key={tile.label} {...tile} />
|
|
198
|
+
))}
|
|
178
199
|
</div>
|
|
179
200
|
{/* Version / upgrade pinned at the very bottom, under a divider. */}
|
|
180
201
|
<div className="mt-2 pt-2 border-t border-border px-1 text-[11px]">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Sparkles } from "@/lib/icons";
|
|
1
|
+
import { Sparkles, Info } from "@/lib/icons";
|
|
2
2
|
import { Button } from "@/components/ui/button";
|
|
3
3
|
import { useOnboardingStore } from "@/stores/onboarding-store";
|
|
4
4
|
import { useProjectStore } from "@/stores/project-store";
|
|
@@ -9,7 +9,16 @@ export function OnboardingEntry({ compact = false }: { compact?: boolean }) {
|
|
|
9
9
|
const state = useOnboardingStore();
|
|
10
10
|
const projectName = useProjectStore((s) => s.activeProject?.name);
|
|
11
11
|
const canResume = state.goal && state.familiarity && state.status !== "finished";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<Button variant="
|
|
12
|
+
const buttonClass = "h-11 can-hover:h-7 min-w-0 gap-1.5 rounded px-2 py-0 text-xs font-normal text-text-secondary shadow-none hover:bg-surface-elevated/60 hover:text-foreground active:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-primary/50 motion-reduce:transition-none whitespace-nowrap";
|
|
13
|
+
return <div role="group" aria-label="Learn PPM" className={`${compact ? "justify-center" : "justify-start"} max-w-full inline-flex flex-wrap items-center gap-x-1 gap-y-0`}>
|
|
14
|
+
<Button variant="ghost" className={buttonClass}
|
|
15
|
+
onClick={() => canResume ? state.resume(projectName) : state.status === "finished" ? state.replay() : state.begin()}>
|
|
16
|
+
<Sparkles aria-hidden className="size-3 shrink-0" />
|
|
17
|
+
<span>{canResume ? "Resume guided tour" : state.status === "unseen" ? "Get started with PPM" : "Open guided tour"}</span>
|
|
18
|
+
</Button>
|
|
19
|
+
<span aria-hidden className="h-3 w-px shrink-0 bg-border" />
|
|
20
|
+
<Button variant="ghost" className={buttonClass} onClick={openQuickOrientation}>
|
|
21
|
+
<Info aria-hidden className="size-3 shrink-0" /><span>Quick orientation</span>
|
|
22
|
+
</Button>
|
|
23
|
+
</div>;
|
|
15
24
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|