@maudecode/kanvil 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/server/.env.example +19 -0
- package/apps/server/dist/auth-JcS53IcO.mjs +12424 -0
- package/apps/server/dist/{config-CbNqtJEj.mjs → config-D3cAABi7.mjs} +27 -2
- package/apps/server/dist/index.mjs +2504 -295
- package/apps/server/dist/migrate.mjs +1 -1
- package/apps/server/dist/recover.mjs +4 -4
- package/apps/server/drizzle/0014_inbox_dismissal.sql +1 -0
- package/apps/server/drizzle/0015_notification_categories.sql +14 -0
- package/apps/server/drizzle/0016_ticket_resources.sql +19 -0
- package/apps/server/drizzle/0017_project_backgrounds.sql +3 -0
- package/apps/server/drizzle/0018_delivery_outbox.sql +65 -0
- package/apps/server/drizzle/0019_retire_push_deliveries.sql +1 -0
- package/apps/server/drizzle/0020_calendar_feeds.sql +16 -0
- package/apps/server/drizzle/0021_staged_uploads.sql +14 -0
- package/apps/server/drizzle/0022_manual_order.sql +6 -0
- package/apps/server/drizzle/0023_workspace_invitations.sql +22 -0
- package/apps/server/drizzle/0024_workflow_states.sql +39 -0
- package/apps/server/drizzle/0025_workspace_labels.sql +10 -0
- package/apps/server/drizzle/0026_public_read.sql +1 -0
- package/apps/server/drizzle/0027_custom_fields.sql +16 -0
- package/apps/server/drizzle/0028_project_lifecycle.sql +11 -0
- package/apps/server/drizzle/0029_ticket_relocation.sql +16 -0
- package/apps/server/drizzle/0030_repository_connections.sql +39 -0
- package/apps/server/drizzle/0031_repository_providers.sql +3 -0
- package/apps/server/drizzle/0032_workspace_ownership.sql +11 -0
- package/apps/server/drizzle/0033_import_runs.sql +38 -0
- package/apps/server/drizzle/0034_issue_sync.sql +38 -0
- package/apps/server/drizzle/0035_account_deletion.sql +9 -0
- package/apps/server/drizzle/0036_workspace_roles.sql +16 -0
- package/apps/server/drizzle/0037_email_code_owner.sql +14 -0
- package/apps/server/drizzle/meta/0014_snapshot.json +4246 -0
- package/apps/server/drizzle/meta/0015_snapshot.json +4297 -0
- package/apps/server/drizzle/meta/0016_snapshot.json +4443 -0
- package/apps/server/drizzle/meta/0017_snapshot.json +4468 -0
- package/apps/server/drizzle/meta/0018_snapshot.json +4948 -0
- package/apps/server/drizzle/meta/0019_snapshot.json +4826 -0
- package/apps/server/drizzle/meta/0020_snapshot.json +4947 -0
- package/apps/server/drizzle/meta/0021_snapshot.json +5059 -0
- package/apps/server/drizzle/meta/0022_snapshot.json +5094 -0
- package/apps/server/drizzle/meta/0023_snapshot.json +5267 -0
- package/apps/server/drizzle/meta/0024_snapshot.json +5405 -0
- package/apps/server/drizzle/meta/0025_snapshot.json +5474 -0
- package/apps/server/drizzle/meta/0026_snapshot.json +5481 -0
- package/apps/server/drizzle/meta/0027_snapshot.json +5605 -0
- package/apps/server/drizzle/meta/0028_snapshot.json +5699 -0
- package/apps/server/drizzle/meta/0029_snapshot.json +5809 -0
- package/apps/server/drizzle/meta/0030_snapshot.json +6066 -0
- package/apps/server/drizzle/meta/0031_snapshot.json +6074 -0
- package/apps/server/drizzle/meta/0032_snapshot.json +6100 -0
- package/apps/server/drizzle/meta/0033_snapshot.json +6406 -0
- package/apps/server/drizzle/meta/0034_snapshot.json +6698 -0
- package/apps/server/drizzle/meta/0035_snapshot.json +6704 -0
- package/apps/server/drizzle/meta/0036_snapshot.json +6825 -0
- package/apps/server/drizzle/meta/0037_snapshot.json +6825 -0
- package/apps/server/drizzle/meta/_journal.json +168 -0
- package/apps/web/dist/assets/CompositeItem-BbuEp99X.js +1 -0
- package/apps/web/dist/assets/Trans-DJGH63s1.js +1 -0
- package/apps/web/dist/assets/abnfDiagram-WEYOIA3C-DTOx8N4B.js +1 -0
- package/apps/web/dist/assets/admin-settings-CJG9PMKR.js +1 -0
- package/apps/web/dist/assets/arc-Y1ARJVZ4.js +1 -0
- package/apps/web/dist/assets/architecture-WOLXFQ4H-DlC3p5z3.js +1 -0
- package/apps/web/dist/assets/architectureDiagram-ZHVYKT53-DooN3Z58.js +36 -0
- package/apps/web/dist/assets/archive-restore-B6_SsOIP.js +1 -0
- package/apps/web/dist/assets/array-BifhSqXX.js +1 -0
- package/apps/web/dist/assets/az-AZ-BtrlbgjS.js +1 -0
- package/apps/web/dist/assets/az-D-kj4lmf.js +1 -0
- package/apps/web/dist/assets/az-DqY__MpS.js +1 -0
- package/apps/web/dist/assets/blockDiagram-RJAE7QA3-CD5AgY4U.js +140 -0
- package/apps/web/dist/assets/c4Diagram-XDPPPE54-CTDOcLuN.js +38 -0
- package/apps/web/dist/assets/channel-BhHvU4I-.js +1 -0
- package/apps/web/dist/assets/chunk-2E7WHVMD-D9qnBqTV.js +88 -0
- package/apps/web/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/apps/web/dist/assets/chunk-4EMNKR2T-Kz5JiJ85.js +1 -0
- package/apps/web/dist/assets/chunk-55XCU76K-DnKiFpYM.js +1 -0
- package/apps/web/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/apps/web/dist/assets/chunk-7S6XSTFO-CpdNd6Ke.js +2 -0
- package/apps/web/dist/assets/chunk-AQDTSKZB-CpyuSWt8.js +72 -0
- package/apps/web/dist/assets/chunk-DSNLSHJZ-DTC3y9rb.js +129 -0
- package/apps/web/dist/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/apps/web/dist/assets/chunk-HAGFOTED-Bv8PrMYK.js +62 -0
- package/apps/web/dist/assets/chunk-HNE4Q36P-CDDJ_yRa.js +1 -0
- package/apps/web/dist/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/apps/web/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/apps/web/dist/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/apps/web/dist/assets/chunk-NQOKRVIF-lNtnsWHS.js +213 -0
- package/apps/web/dist/assets/chunk-UHW7PFBP-D79ptlTN.js +1 -0
- package/apps/web/dist/assets/chunk-VQ5W62QI-B8hWFCiM.js +1 -0
- package/apps/web/dist/assets/chunk-WQQL4CDK-DAGuWzS3.js +10 -0
- package/apps/web/dist/assets/chunk-XXDRQBXY-CnbRkih_.js +1 -0
- package/apps/web/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/apps/web/dist/assets/chunk-YZO67HFG-C0ptzlKO.js +1 -0
- package/apps/web/dist/assets/chunk-ZAUX2LTX-ah8U5xoJ.js +1 -0
- package/apps/web/dist/assets/chunk-ZCHMQSOR-DYqATOIZ.js +2 -0
- package/apps/web/dist/assets/classDiagram-v2-4MYWR3UA-DYytA-ua.js +217 -0
- package/apps/web/dist/assets/core-jXc03Sty.js +1 -0
- package/apps/web/dist/assets/corner-left-up-DA7MG5uX.js +1 -0
- package/apps/web/dist/assets/cose-bilkent-JH36ORCC-lWVj4msc.js +1 -0
- package/apps/web/dist/assets/cynefin-EF2NZ3EQ-Xy6e6m1E.js +1 -0
- package/apps/web/dist/assets/cynefinDiagram-WF24UDRP-BYarZJSm.js +62 -0
- package/apps/web/dist/assets/cytoscape.esm-BegBNzOV.js +321 -0
- package/apps/web/dist/assets/dagre-NK4GIZVX-WLvvUY1o.js +4 -0
- package/apps/web/dist/assets/de-DAv77-wP.js +1 -0
- package/apps/web/dist/assets/de-DE-Bu_Ko2QA.js +1 -0
- package/apps/web/dist/assets/de-UHreLwyV.js +1 -0
- package/apps/web/dist/assets/default-D5TdIZQS.js +56 -0
- package/apps/web/dist/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/apps/web/dist/assets/delivery-settings-BE5MW8U0.js +1 -0
- package/apps/web/dist/assets/diagram-CBK3MWTC-D6PtxkLg.js +24 -0
- package/apps/web/dist/assets/diagram-I5XIIV2D-DTOKQwIY.js +24 -0
- package/apps/web/dist/assets/diagram-ODIL2UCW-BmERt0Xu.js +30 -0
- package/apps/web/dist/assets/diagram-PFBEJUXE-WDUe08eD.js +3 -0
- package/apps/web/dist/assets/diagram-RJA3I4VV-B2K-NLGG.js +41 -0
- package/apps/web/dist/assets/diagram-TYUNFSNR-BLf7PpV7.js +200 -0
- package/apps/web/dist/assets/dist-CumnGVmJ.js +1 -0
- package/apps/web/dist/assets/ebnfDiagram-V4P3TTPT-DwBUQs9p.js +1 -0
- package/apps/web/dist/assets/el-D2ypddWn.js +1 -0
- package/apps/web/dist/assets/el-EJnrsyVr.js +1 -0
- package/apps/web/dist/assets/el-GR-CpKEps47.js +1 -0
- package/apps/web/dist/assets/elk-QONTBCTQ-AuT8PinL.js +27 -0
- package/apps/web/dist/assets/ellipsis-D6154JKs.js +1 -0
- package/apps/web/dist/assets/en-EnSRisMz.js +1 -0
- package/apps/web/dist/assets/en-US-DKYSujv3.js +1 -0
- package/apps/web/dist/assets/erDiagram-KYQIGQAA-h--u4Eo6.js +99 -0
- package/apps/web/dist/assets/es-B_49BMhR.js +1 -0
- package/apps/web/dist/assets/es-D2ScuV-5.js +1 -0
- package/apps/web/dist/assets/es-ES-DVkfi7H-.js +1 -0
- package/apps/web/dist/assets/eventmodeling-K75KTNOO-CW4hDt1j.js +1 -0
- package/apps/web/dist/assets/flowDiagram-IUGLLWBU-BGUscnNP.js +1 -0
- package/apps/web/dist/assets/forms-BcD6Wwyv.js +1 -0
- package/apps/web/dist/assets/fr-B-WmPGZD.js +1 -0
- package/apps/web/dist/assets/fr-C_VpS8u6.js +1 -0
- package/apps/web/dist/assets/fr-FR-DkHaEHqi.js +1 -0
- package/apps/web/dist/assets/ganttDiagram-R7GPNTJY-CB3lsQvj.js +292 -0
- package/apps/web/dist/assets/gitGraph-VSP46ZUC-Hu-kvdCR.js +1 -0
- package/apps/web/dist/assets/gitGraphDiagram-PDYL7XHY-DCuY3C1Q.js +106 -0
- package/apps/web/dist/assets/graphlib-DS17s2tU.js +1 -0
- package/apps/web/dist/assets/hi-CW4rdp_m.js +1 -0
- package/apps/web/dist/assets/hi-DvoDcUpL.js +1 -0
- package/apps/web/dist/assets/hi-IN-CbUDNSTK.js +1 -0
- package/apps/web/dist/assets/highlight-CMydIf9M.js +5 -0
- package/apps/web/dist/assets/id-CPASBZ2r.js +1 -0
- package/apps/web/dist/assets/id-CvL3yBVr.js +1 -0
- package/apps/web/dist/assets/id-ID-DLTkxt2j.js +1 -0
- package/apps/web/dist/assets/index-DoqlyejP.js +17 -0
- package/apps/web/dist/assets/index-DyQNFS69.css +2 -0
- package/apps/web/dist/assets/info-OHQRW6UA-Cc8VwTsk.js +1 -0
- package/apps/web/dist/assets/infoDiagram-MVDRKAX5-KIMOx55J.js +2 -0
- package/apps/web/dist/assets/init-C-OQMol4.js +1 -0
- package/apps/web/dist/assets/invitations-BmpelTJu.js +1 -0
- package/apps/web/dist/assets/isSameWeek-2ftYGvBT.js +1 -0
- package/apps/web/dist/assets/ishikawaDiagram-HPEHV2GE-CAou726L.js +70 -0
- package/apps/web/dist/assets/it-Cd7u97Jd.js +1 -0
- package/apps/web/dist/assets/it-DOLotXOj.js +1 -0
- package/apps/web/dist/assets/it-IT-CIzq0YwC.js +1 -0
- package/apps/web/dist/assets/item-Cq_ZbivE.js +1 -0
- package/apps/web/dist/assets/ja-B1iJt9qB.js +1 -0
- package/apps/web/dist/assets/ja-JP-CIE4-D-v.js +1 -0
- package/apps/web/dist/assets/ja-LkOrjegp.js +1 -0
- package/apps/web/dist/assets/journeyDiagram-BOSHW7O7-YbJuPYDH.js +139 -0
- package/apps/web/dist/assets/kanban-definition-FNSA4HC5-nuRnm9y8.js +89 -0
- package/apps/web/dist/assets/katex-B_JcIwqj.js +257 -0
- package/apps/web/dist/assets/ko-DPpXw683.js +1 -0
- package/apps/web/dist/assets/ko-KR-DYP5Zae6.js +1 -0
- package/apps/web/dist/assets/ko-fmUq1-8W.js +1 -0
- package/apps/web/dist/assets/label-settings-B3LsJxhk.js +1 -0
- package/apps/web/dist/assets/line-WsxZYwZr.js +1 -0
- package/apps/web/dist/assets/linear-C9iwaMOi.js +1 -0
- package/apps/web/dist/assets/lucide-DIlszs-T.js +1 -0
- package/apps/web/dist/assets/markdown-blocks-Bw26pRKB.js +2 -0
- package/apps/web/dist/assets/member-directory-CHKUw0u4.js +1 -0
- package/apps/web/dist/assets/mermaid-parser.core-B5c-1CnP.js +7 -0
- package/apps/web/dist/assets/mermaid.core-vGVkgzA3.js +44 -0
- package/apps/web/dist/assets/mindmap-definition-6OY57UG3-uooJyUak.js +98 -0
- package/apps/web/dist/assets/mk-CkaQRpqe.js +1 -0
- package/apps/web/dist/assets/mk-LWVrR-T-.js +1 -0
- package/apps/web/dist/assets/mk-MK-CpOo5Bd8.js +1 -0
- package/apps/web/dist/assets/nl-DiEjqOA8.js +1 -0
- package/apps/web/dist/assets/nl-NL-Mu8G8RON.js +1 -0
- package/apps/web/dist/assets/nl-ro6hbqo5.js +1 -0
- package/apps/web/dist/assets/ordinal-BDEzSJ7C.js +1 -0
- package/apps/web/dist/assets/packet-JDAUHWVQ-WJpqlH1d.js +1 -0
- package/apps/web/dist/assets/path-fybaL0A-.js +1 -0
- package/apps/web/dist/assets/pegDiagram-ECIUJNBX-CUvajD93.js +1 -0
- package/apps/web/dist/assets/pie-XZMESJXO-DvandPby.js +1 -0
- package/apps/web/dist/assets/pieDiagram-GNMPY74T-CqxeyIaP.js +39 -0
- package/apps/web/dist/assets/pl-Bx_fYLKY.js +1 -0
- package/apps/web/dist/assets/pl-CauoMfkf.js +1 -0
- package/apps/web/dist/assets/pl-PL-DGuxe2Aq.js +1 -0
- package/apps/web/dist/assets/preload-helper-BLdHbfdN.js +1 -0
- package/apps/web/dist/assets/project-lifecycle-Ba7iRF3u.js +1 -0
- package/apps/web/dist/assets/project-settings-CtOWgEam.js +1 -0
- package/apps/web/dist/assets/pt-BR-BpOhwoDW.js +1 -0
- package/apps/web/dist/assets/pt-BR-D-a7F5zJ.js +1 -0
- package/apps/web/dist/assets/pt-BR-DwkMPgq1.js +1 -0
- package/apps/web/dist/assets/public-project-CHRjhFIn.js +1 -0
- package/apps/web/dist/assets/quadrantDiagram-D57K4MC3-DFjNmaZc.js +7 -0
- package/apps/web/dist/assets/radar-ABXABTNO-CJhZF9j2.js +1 -0
- package/apps/web/dist/assets/railroad-I3PHUGI6-DZC10oBD.js +1 -0
- package/apps/web/dist/assets/railroad-abnf-LNEFI6M7-BUJF2n6u.js +1 -0
- package/apps/web/dist/assets/railroad-ebnf-DWYD2UWJ-CG7oB02K.js +1 -0
- package/apps/web/dist/assets/railroad-peg-JR7BVNR7-DBCZuZJY.js +1 -0
- package/apps/web/dist/assets/railroadDiagram-Y72NRBL7-CvN3poBq.js +1 -0
- package/apps/web/dist/assets/requirementDiagram-EQYSW5RA-BEItNirc.js +84 -0
- package/apps/web/dist/assets/rolldown-runtime-COiEfhsA.js +1 -0
- package/apps/web/dist/assets/rotate-ccw-Bm0ESNH_.js +1 -0
- package/apps/web/dist/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/apps/web/dist/assets/ru-D-WIMI5_.js +1 -0
- package/apps/web/dist/assets/ru-DOaRp00B.js +1 -0
- package/apps/web/dist/assets/ru-RU-DrXnqZbV.js +1 -0
- package/apps/web/dist/assets/sankeyDiagram-SY24JHO5-DluLIjax.js +40 -0
- package/apps/web/dist/assets/search-D94SZwrC.js +85 -0
- package/apps/web/dist/assets/send-D9TETK3s.js +1 -0
- package/apps/web/dist/assets/sequenceDiagram-BLEHNHQU-ZcwnsNxK.js +169 -0
- package/apps/web/dist/assets/settings-Dd9EVxua.js +1 -0
- package/apps/web/dist/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/apps/web/dist/assets/sliders-horizontal-CiZZFL1o.js +1 -0
- package/apps/web/dist/assets/src-BWF7jMDv.js +1 -0
- package/apps/web/dist/assets/stateDiagram-v2-A6IESKWZ-DD6vH3rM.js +291 -0
- package/apps/web/dist/assets/swimlanes-B3ENRKFQ-pX_qyO4X.js +1 -0
- package/apps/web/dist/assets/swimlanesDiagram-AYQRV4AK-CeVsLUsg.js +8 -0
- package/apps/web/dist/assets/switch-B_u8n1o6.js +1 -0
- package/apps/web/dist/assets/table-DcCLC7fi.js +1 -0
- package/apps/web/dist/assets/ticket-detail-C9egaVSf.js +2 -0
- package/apps/web/dist/assets/ticket-editor-UlSZgpWF.js +2 -0
- package/apps/web/dist/assets/ticket-list-controls-BidzkMOD.js +1 -0
- package/apps/web/dist/assets/ticket-list-vNBO8mkk.js +5 -0
- package/apps/web/dist/assets/timeline-definition-JXYKGLGB-DLBjAxKq.js +120 -0
- package/apps/web/dist/assets/toDate-B3HYxwtT.js +1 -0
- package/apps/web/dist/assets/tr-BZEJyY-F.js +1 -0
- package/apps/web/dist/assets/tr-DeYojjLx.js +1 -0
- package/apps/web/dist/assets/tr-TR-B92YeFW5.js +1 -0
- package/apps/web/dist/assets/treeView-D4JQ5SDB-DsJ44q_q.js +1 -0
- package/apps/web/dist/assets/treemap-SAJKECNS-BmXoBpVL.js +1 -0
- package/apps/web/dist/assets/uk-DACrfgCP.js +1 -0
- package/apps/web/dist/assets/uk-UA-DmcDs-MU.js +1 -0
- package/apps/web/dist/assets/uk-f8X5q5C_.js +1 -0
- package/apps/web/dist/assets/upload-CGpna3R2.js +1 -0
- package/apps/web/dist/assets/useQueries-BihXYrAP.js +1 -0
- package/apps/web/dist/assets/usecaseDiagram-WPOLBNNX-eU2tr2si.js +328 -0
- package/apps/web/dist/assets/vennDiagram-Q3Y3IDCW-CoVTWGNg.js +34 -0
- package/apps/web/dist/assets/vi-CSGaJFlR.js +1 -0
- package/apps/web/dist/assets/vi-CkqUo4w_.js +1 -0
- package/apps/web/dist/assets/vi-VN-DM5JYNuP.js +1 -0
- package/apps/web/dist/assets/visual-editor-B6HiiLMg.js +208 -0
- package/apps/web/dist/assets/wardley-7MLQ67FV-C6mVVk98.js +1 -0
- package/apps/web/dist/assets/wardleyDiagram-IVAIDKWA-m3CeJc7a.js +78 -0
- package/apps/web/dist/assets/workspace-settings-CSvVqaL6.js +1 -0
- package/apps/web/dist/assets/xychartDiagram-4URNHDU4-Dw6fLaip.js +7 -0
- package/apps/web/dist/assets/zh-CN-BdRcimyZ.js +1 -0
- package/apps/web/dist/assets/zh-CN-CC7ghLLr.js +1 -0
- package/apps/web/dist/assets/zh-CN-CiUOkQXe.js +1 -0
- package/apps/web/dist/assets/zh-TW-BH1L9tOt.js +1 -0
- package/apps/web/dist/assets/zh-TW-BlIRMi1C.js +1 -0
- package/apps/web/dist/assets/zh-TW-Co4UBSfi.js +1 -0
- package/apps/web/dist/index.html +14 -8
- package/compose.yml +12 -0
- package/docs/api.md +285 -10
- package/docs/infrastructure.md +2 -2
- package/docs/localization.md +25 -0
- package/docs/plan.md +28 -10
- package/docs/releasing.md +1 -1
- package/docs/self-hosting.md +44 -5
- package/docs/themes.md +1 -1
- package/docs/verification.md +1 -1
- package/docs/workspaces.md +18 -2
- package/package.json +12 -8
- package/apps/server/dist/auth-I1XEr0d4.mjs +0 -2931
- package/apps/web/dist/assets/CompositeItem-BWPJ5Mol.js +0 -1
- package/apps/web/dist/assets/admin-settings-DZqkC6ju.js +0 -1
- package/apps/web/dist/assets/date-picker-6H_iwP6t.js +0 -1
- package/apps/web/dist/assets/ellipsis-BT172Uvu.js +0 -1
- package/apps/web/dist/assets/forms-B4Vg3CPz.js +0 -92
- package/apps/web/dist/assets/image-edit-trigger-DGmVtWLC.js +0 -1
- package/apps/web/dist/assets/index-C_a21taR.js +0 -50
- package/apps/web/dist/assets/index-DM-D_3Sv.css +0 -2
- package/apps/web/dist/assets/kbd-tTQGZxaK.js +0 -1
- package/apps/web/dist/assets/link-DoIP9KJ6.js +0 -2
- package/apps/web/dist/assets/list-order-Bzsrihyr.js +0 -1
- package/apps/web/dist/assets/lucide-U995NW8E.js +0 -1
- package/apps/web/dist/assets/member-directory-BiCE8DRq.js +0 -1
- package/apps/web/dist/assets/popover-BhzZ0U1d.js +0 -1
- package/apps/web/dist/assets/project-label-provider-9L7Uts3_.js +0 -1
- package/apps/web/dist/assets/project-settings-Q7Q9Reec.js +0 -1
- package/apps/web/dist/assets/rotate-ccw-sjyLwLLy.js +0 -1
- package/apps/web/dist/assets/settings-B6qD6q1J.js +0 -1
- package/apps/web/dist/assets/settings-layout-B-AwUIMu.js +0 -1
- package/apps/web/dist/assets/switch-D0nFHj6l.js +0 -1
- package/apps/web/dist/assets/table-CYZiwo9g.js +0 -1
- package/apps/web/dist/assets/ticket-detail-B-3vbHSB.js +0 -2
- package/apps/web/dist/assets/ticket-editor-C3d8TZIT.js +0 -1
- package/apps/web/dist/assets/ticket-list-LtGGOnwN.js +0 -5
- package/apps/web/dist/assets/ticket-tags-2rdmkcJV.js +0 -1
- package/apps/web/dist/assets/upload-DXPRzAaa.js +0 -1
- package/apps/web/dist/assets/useNavigate-DFohfUD3.js +0 -1
- package/apps/web/dist/assets/workspace-settings-D3tCm1vH.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-NGNAAXSQ-C2Wy9Xmz.js";export{i as createWardleyServices}from"./mermaid-parser.core-B5c-1CnP.js";
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import{n as e}from"./mermaid-parser.core-B5c-1CnP.js";import{n as t}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as n}from"./src-BWF7jMDv.js";import{C as r,E as i,H as a,U as o,_ as s,a as c,b as l,c as u,q as d,v as f,y as p}from"./chunk-DSNLSHJZ-DTC3y9rb.js";import{i as m}from"./chunk-7S6XSTFO-CpdNd6Ke.js";import{t as h}from"./chunk-JWPE2WC7-DVXcaiue.js";import{a as g}from"./mermaid.core-vGVkgzA3.js";var _=t((e,t)=>{let n=e<=1?e*100:e;if(n<0||n>100)throw Error(`${t} must be between 0-1 (decimal) or 0-100 (percentage). Received: ${e}`);return n},`toPercent`),v=t((e,t,n)=>({x:_(t,`${n} evolution`),y:_(e,`${n} visibility`)}),`toCoordinates`),y=t(e=>{if(e){if(e===`+<>`)return`bidirectional`;if(e===`+<`)return`backward`;if(e===`+>`)return`forward`}},`getFlowFromPort`),b=t(e=>{if(!e?.startsWith(`+`))return{};let t=/^\+'([^']*)'/.exec(e)?.[1];return e.includes(`<>`)?{flow:`bidirectional`,label:t}:e.includes(`<`)?{flow:`backward`,label:t}:e.includes(`>`)?{flow:`forward`,label:t}:{label:t}},`extractFlowFromArrow`),x=t((e,t)=>{if(h(e,t),e.size&&t.setSize(e.size.width,e.size.height),e.evolution){let n=e.evolution.stages.map(e=>e.secondName?`${e.name.trim()} / ${e.secondName.trim()}`:e.name.trim()),r=e.evolution.stages.filter(e=>e.boundary!==void 0).map(e=>e.boundary);t.updateAxes({stages:n,stageBoundaries:r})}if(e.anchors.forEach(e=>{let n=v(e.visibility,e.evolution,`Anchor "${e.name}"`);t.addNode(e.name,e.name,n.x,n.y,`anchor`)}),e.components.forEach(e=>{let n=v(e.visibility,e.evolution,`Component "${e.name}"`),r=e.label?(e.label.negX?-1:1)*e.label.offsetX:void 0,i=e.label?(e.label.negY?-1:1)*e.label.offsetY:void 0,a=e.decorator?.strategy;t.addNode(e.name,e.name,n.x,n.y,`component`,r,i,e.inertia,a)}),e.notes.forEach(e=>{let n=v(e.visibility,e.evolution,`Note "${e.text}"`);t.addNote(e.text,n.x,n.y)}),e.pipelines.forEach(e=>{let n=t.getNode(e.parent);if(!n||typeof n.y!=`number`)throw Error(`Pipeline "${e.parent}" must reference an existing component with coordinates.`);let r=n.y;t.startPipeline(e.parent),e.components.forEach(n=>{let i=`${e.parent}_${n.name}`,a=n.label?(n.label.negX?-1:1)*n.label.offsetX:void 0,o=n.label?(n.label.negY?-1:1)*n.label.offsetY:void 0,s=_(n.evolution,`Pipeline component "${n.name}" evolution`);t.addNode(i,n.name,s,r,`pipeline-component`,a,o),t.addPipelineComponent(e.parent,i)})}),e.links.forEach(e=>{let n=!!e.arrow&&(e.arrow.includes(`-.->`)||e.arrow.includes(`.-.`)),r=y(e.fromPort)??y(e.toPort),{flow:i,label:a}=b(e.arrow);!r&&i&&(r=i);let o=e.linkLabel,s=a??o;t.addLink(t.resolveNodeId(e.from),t.resolveNodeId(e.to),n,s,r)}),e.evolves.forEach(e=>{let n=t.getNode(e.component);if(n?.y!==void 0){let r=_(e.target,`Evolve target for "${e.component}"`);t.addTrend(e.component,r,n.y)}}),e.annotations.length>0){let n=e.annotations[0],r=v(n.x,n.y,`Annotations box`);t.setAnnotationsBox(r.x,r.y)}e.annotation.forEach(e=>{let n=v(e.x,e.y,`Annotation ${e.number}`);t.addAnnotation(e.number,[{x:n.x,y:n.y}],e.text)}),e.accelerators.forEach(e=>{let n=v(e.x,e.y,`Accelerator "${e.name}"`);t.addAccelerator(e.name,n.x,n.y)}),e.deaccelerators.forEach(e=>{let n=v(e.x,e.y,`Deaccelerator "${e.name}"`);t.addDeaccelerator(e.name,n.x,n.y)})},`populateDb`),S={parser:{yy:void 0},parse:t(async t=>{let r=await e(`wardley`,t);n.debug(r);let i=S.parser?.yy;if(!i||typeof i.addNode!=`function`)throw Error(`parser.parser?.yy was not a WardleyDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.`);x(r,i)},`parse`)},C=new class{constructor(){this.nodes=new Map,this.links=[],this.trends=new Map,this.pipelines=new Map,this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.axes={}}static{t(this,`WardleyBuilder`)}addNode(e){let t=this.nodes.get(e.id)??{id:e.id,label:e.label},n={...t,...e,className:e.className??t.className,labelOffsetX:e.labelOffsetX??t.labelOffsetX,labelOffsetY:e.labelOffsetY??t.labelOffsetY};this.nodes.set(e.id,n)}addLink(e){this.links.push(e)}addTrend(e){this.trends.set(e.nodeId,e)}startPipeline(e){this.pipelines.set(e,{nodeId:e,componentIds:[]});let t=this.nodes.get(e);t&&(t.isPipelineParent=!0)}addPipelineComponent(e,t){let n=this.pipelines.get(e);n&&n.componentIds.push(t);let r=this.nodes.get(t);r&&(r.inPipeline=!0)}addAnnotation(e){this.annotations.push(e)}addNote(e){this.notes.push(e)}addAccelerator(e){this.accelerators.push(e)}addDeaccelerator(e){this.deaccelerators.push(e)}setAnnotationsBox(e,t){this.annotationsBox={x:e,y:t}}setAxes(e){this.axes={...this.axes,...e}}setSize(e,t){this.size={width:e,height:t}}getNode(e){return this.nodes.get(e)}resolveNodeId(e){if(this.nodes.has(e))return e;for(let[t,n]of this.nodes)if(n.label===e)return t;return e}build(){let e=[];for(let t of this.nodes.values()){if(typeof t.x!=`number`||typeof t.y!=`number`)throw Error(`Node "${t.label}" is missing coordinates`);e.push(t)}return{nodes:e,links:[...this.links],trends:[...this.trends.values()],pipelines:[...this.pipelines.values()],annotations:[...this.annotations],notes:[...this.notes],accelerators:[...this.accelerators],deaccelerators:[...this.deaccelerators],annotationsBox:this.annotationsBox,axes:{...this.axes},size:this.size}}clear(){this.nodes.clear(),this.links=[],this.trends.clear(),this.pipelines.clear(),this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.annotationsBox=void 0,this.axes={},this.size=void 0}};function w(){return l()[`wardley-beta`]}t(w,`getConfig`);function T(e,t,n,r,i,a,o,s,c){C.addNode({id:e,label:t,x:n,y:r,className:i,labelOffsetX:a,labelOffsetY:o,inertia:s,sourceStrategy:c})}t(T,`addNode`);function E(e,t,n=!1,r,i){C.addLink({source:e,target:t,dashed:n,label:r,flow:i})}t(E,`addLink`);function D(e,t,n){C.addTrend({nodeId:e,targetX:t,targetY:n})}t(D,`addTrend`);function O(e,t,n){C.addAnnotation({number:e,coordinates:t,text:n})}t(O,`addAnnotation`);function k(e,t,n){C.addNote({text:e,x:t,y:n})}t(k,`addNote`);function A(e,t,n){C.addAccelerator({name:e,x:t,y:n})}t(A,`addAccelerator`);function j(e,t,n){C.addDeaccelerator({name:e,x:t,y:n})}t(j,`addDeaccelerator`);function M(e,t){C.setAnnotationsBox(e,t)}t(M,`setAnnotationsBox`);function N(e,t){C.setSize(e,t)}t(N,`setSize`);function P(e){C.startPipeline(e)}t(P,`startPipeline`);function F(e,t){C.addPipelineComponent(e,t)}t(F,`addPipelineComponent`);function I(e){C.setAxes(e)}t(I,`updateAxes`);function L(e){return C.getNode(e)}t(L,`getNode`);function R(e){return C.resolveNodeId(e)}t(R,`resolveNodeId`);function z(){return C.build()}t(z,`getWardleyData`);function B(){C.clear(),c()}t(B,`clear`);var V={getConfig:w,addNode:T,addLink:E,addTrend:D,addAnnotation:O,addNote:k,addAccelerator:A,addDeaccelerator:j,setAnnotationsBox:M,setSize:N,startPipeline:P,addPipelineComponent:F,updateAxes:I,getNode:L,resolveNodeId:R,getWardleyData:z,clear:B,setAccTitle:o,getAccTitle:f,setDiagramTitle:d,getDiagramTitle:r,getAccDescription:s,setAccDescription:a},H=[`Genesis`,`Custom Built`,`Product`,`Commodity`],U=t(()=>{let{themeVariables:e}=l();return{backgroundColor:e.wardley?.backgroundColor??e.background??`#fff`,axisColor:e.wardley?.axisColor??`#000`,axisTextColor:e.wardley?.axisTextColor??e.primaryTextColor??`#222`,gridColor:e.wardley?.gridColor??`rgba(100, 100, 100, 0.2)`,componentFill:e.wardley?.componentFill??`#fff`,componentStroke:e.wardley?.componentStroke??`#000`,componentLabelColor:e.wardley?.componentLabelColor??e.primaryTextColor??`#222`,linkStroke:e.wardley?.linkStroke??`#000`,evolutionStroke:e.wardley?.evolutionStroke??`#dc3545`,annotationStroke:e.wardley?.annotationStroke??`#000`,annotationTextColor:e.wardley?.annotationTextColor??e.primaryTextColor??`#222`,annotationFill:e.wardley?.annotationFill??e.background??`#fff`}},`getTheme`),W=t(()=>{let e=l()[`wardley-beta`];return{width:e?.width??900,height:e?.height??600,padding:e?.padding??48,nodeRadius:e?.nodeRadius??6,nodeLabelOffset:e?.nodeLabelOffset??8,axisFontSize:e?.axisFontSize??12,labelFontSize:e?.labelFontSize??10,showGrid:e?.showGrid??!1,useMaxWidth:e?.useMaxWidth??!0}},`getConfigValues`),G={parser:S,db:V,renderer:{draw:t((e,r,i,a)=>{n.debug(`Rendering Wardley map
|
|
2
|
+
`+e);let o=W(),s=U(),c=o.nodeRadius*1.6,l=a.db,d=l.getWardleyData(),f=l.getDiagramTitle(),p=d.size?.width??o.width,m=d.size?.height??o.height,h=g(r);h.selectAll(`*`).remove(),u(h,m,p,o.useMaxWidth),h.attr(`viewBox`,`0 0 ${p} ${m}`);let _=h.append(`g`).attr(`class`,`wardley-map`),v=h.append(`defs`);v.append(`marker`).attr(`id`,`arrow-${r}`).attr(`viewBox`,`0 0 10 10`).attr(`refX`,9).attr(`refY`,5).attr(`markerWidth`,6).attr(`markerHeight`,6).attr(`orient`,`auto-start-reverse`).append(`path`).attr(`d`,`M 0 0 L 10 5 L 0 10 z`).attr(`fill`,s.evolutionStroke).attr(`stroke`,`none`),v.append(`marker`).attr(`id`,`link-arrow-end-${r}`).attr(`viewBox`,`0 0 10 10`).attr(`refX`,9).attr(`refY`,5).attr(`markerWidth`,5).attr(`markerHeight`,5).attr(`orient`,`auto`).append(`path`).attr(`d`,`M 0 0 L 10 5 L 0 10 z`).attr(`fill`,s.linkStroke).attr(`stroke`,`none`),v.append(`marker`).attr(`id`,`link-arrow-start-${r}`).attr(`viewBox`,`0 0 10 10`).attr(`refX`,1).attr(`refY`,5).attr(`markerWidth`,5).attr(`markerHeight`,5).attr(`orient`,`auto`).append(`path`).attr(`d`,`M 10 0 L 0 5 L 10 10 z`).attr(`fill`,s.linkStroke).attr(`stroke`,`none`),_.append(`rect`).attr(`class`,`wardley-background`).attr(`width`,p).attr(`height`,m).attr(`fill`,s.backgroundColor);let y=p-o.padding*2,b=m-o.padding*2;f&&_.append(`text`).attr(`class`,`wardley-title`).attr(`x`,p/2).attr(`y`,o.padding/2).attr(`fill`,s.axisTextColor).attr(`font-size`,o.axisFontSize*1.05).attr(`font-weight`,`bold`).attr(`text-anchor`,`middle`).attr(`dominant-baseline`,`middle`).text(f);let x=t(e=>o.padding+e/100*y,`projectX`),S=t(e=>m-o.padding-e/100*b,`projectY`),C=_.append(`g`).attr(`class`,`wardley-axes`);C.append(`line`).attr(`x1`,o.padding).attr(`x2`,p-o.padding).attr(`y1`,m-o.padding).attr(`y2`,m-o.padding).attr(`stroke`,s.axisColor).attr(`stroke-width`,1),C.append(`line`).attr(`x1`,o.padding).attr(`x2`,o.padding).attr(`y1`,o.padding).attr(`y2`,m-o.padding).attr(`stroke`,s.axisColor).attr(`stroke-width`,1);let w=d.axes.xLabel??`Evolution`,T=d.axes.yLabel??`Visibility`;C.append(`text`).attr(`class`,`wardley-axis-label wardley-axis-label-x`).attr(`x`,o.padding+y/2).attr(`y`,m-o.padding/4).attr(`fill`,s.axisTextColor).attr(`font-size`,o.axisFontSize).attr(`font-weight`,`bold`).attr(`text-anchor`,`middle`).text(w),C.append(`text`).attr(`class`,`wardley-axis-label wardley-axis-label-y`).attr(`x`,o.padding/3).attr(`y`,o.padding+b/2).attr(`fill`,s.axisTextColor).attr(`font-size`,o.axisFontSize).attr(`font-weight`,`bold`).attr(`text-anchor`,`middle`).attr(`transform`,`rotate(-90 ${o.padding/3} ${o.padding+b/2})`).text(T);let E=d.axes.stages&&d.axes.stages.length>0?d.axes.stages:H;if(E.length>0){let e=_.append(`g`).attr(`class`,`wardley-stages`),t=d.axes.stageBoundaries,n=[];if(t&&t.length===E.length){let e=0;t.forEach(t=>{n.push({start:e,end:t}),e=t})}else{let e=1/E.length;E.forEach((t,r)=>{n.push({start:r*e,end:(r+1)*e})})}E.forEach((t,r)=>{let i=n[r],a=o.padding+i.start*y,c=(a+(o.padding+i.end*y))/2;r>0&&e.append(`line`).attr(`x1`,a).attr(`x2`,a).attr(`y1`,o.padding).attr(`y2`,m-o.padding).attr(`stroke`,`#000`).attr(`stroke-width`,1).attr(`stroke-dasharray`,`5 5`).attr(`opacity`,.8),e.append(`text`).attr(`class`,`wardley-stage-label`).attr(`x`,c).attr(`y`,m-o.padding/1.5).attr(`fill`,s.axisTextColor).attr(`font-size`,o.axisFontSize-2).attr(`text-anchor`,`middle`).text(t)})}if(o.showGrid){let e=_.append(`g`).attr(`class`,`wardley-grid`);for(let t=1;t<4;t++){let n=t/4,r=o.padding+y*n;e.append(`line`).attr(`x1`,r).attr(`x2`,r).attr(`y1`,o.padding).attr(`y2`,m-o.padding).attr(`stroke`,s.gridColor).attr(`stroke-dasharray`,`2 6`),e.append(`line`).attr(`x1`,o.padding).attr(`x2`,p-o.padding).attr(`y1`,m-o.padding-b*n).attr(`y2`,m-o.padding-b*n).attr(`stroke`,s.gridColor).attr(`stroke-dasharray`,`2 6`)}}let D=new Map;if(d.nodes.forEach(e=>{D.set(e.id,{x:x(e.x),y:S(e.y),node:e})}),d.pipelines.length>0){let e=_.append(`g`).attr(`class`,`wardley-pipelines`),t=_.append(`g`).attr(`class`,`wardley-pipeline-links`);d.pipelines.forEach(n=>{if(n.componentIds.length===0)return;let r=n.componentIds.map(e=>({id:e,pos:D.get(e),node:d.nodes.find(t=>t.id===e)})).filter(e=>e.pos&&e.node).sort((e,t)=>e.node.x-t.node.x);for(let e=0;e<r.length-1;e++){let n=r[e],i=r[e+1];t.append(`line`).attr(`class`,`wardley-pipeline-evolution-link`).attr(`x1`,n.pos.x).attr(`y1`,n.pos.y).attr(`x2`,i.pos.x).attr(`y2`,i.pos.y).attr(`stroke`,s.linkStroke).attr(`stroke-width`,1).attr(`stroke-dasharray`,`4 4`)}let i=1/0,a=-1/0,l=0;if(n.componentIds.forEach(e=>{let t=D.get(e);t&&(i=Math.min(i,t.x),a=Math.max(a,t.x),l=t.y)}),i!==1/0&&a!==-1/0){let t=o.nodeRadius*4,r=l-t/2,u=D.get(n.nodeId);u&&(u.x=(i+a)/2,u.y=r-c/6),e.append(`rect`).attr(`class`,`wardley-pipeline-box`).attr(`x`,i-15).attr(`y`,r).attr(`width`,a-i+30).attr(`height`,t).attr(`fill`,`none`).attr(`stroke`,s.axisColor).attr(`stroke-width`,1.5).attr(`rx`,4).attr(`ry`,4)}})}let O=_.append(`g`).attr(`class`,`wardley-links`),k=new Map;d.pipelines.forEach(e=>{k.set(e.nodeId,new Set(e.componentIds))});let A=d.links.filter(e=>!(!D.has(e.source)||!D.has(e.target)||k.get(e.target)?.has(e.source)));O.selectAll(`line`).data(A).enter().append(`line`).attr(`class`,e=>`wardley-link${e.dashed?` wardley-link--dashed`:``}`).attr(`x1`,e=>{let t=D.get(e.source),n=D.get(e.target),r=d.nodes.find(t=>t.id===e.source).isPipelineParent?c/Math.sqrt(2):o.nodeRadius,i=n.x-t.x,a=n.y-t.y,s=Math.sqrt(i*i+a*a);return t.x+i/s*r}).attr(`y1`,e=>{let t=D.get(e.source),n=D.get(e.target),r=d.nodes.find(t=>t.id===e.source).isPipelineParent?c/Math.sqrt(2):o.nodeRadius,i=n.x-t.x,a=n.y-t.y,s=Math.sqrt(i*i+a*a);return t.y+a/s*r}).attr(`x2`,e=>{let t=D.get(e.source),n=D.get(e.target),r=d.nodes.find(t=>t.id===e.target).isPipelineParent?c/Math.sqrt(2):o.nodeRadius,i=t.x-n.x,a=t.y-n.y,s=Math.sqrt(i*i+a*a);return n.x+i/s*r}).attr(`y2`,e=>{let t=D.get(e.source),n=D.get(e.target),r=d.nodes.find(t=>t.id===e.target).isPipelineParent?c/Math.sqrt(2):o.nodeRadius,i=t.x-n.x,a=t.y-n.y,s=Math.sqrt(i*i+a*a);return n.y+a/s*r}).attr(`stroke`,s.linkStroke).attr(`stroke-width`,1).attr(`stroke-dasharray`,e=>e.dashed?`6 6`:null).attr(`marker-end`,e=>e.flow===`forward`||e.flow===`bidirectional`?`url(#link-arrow-end-${r})`:null).attr(`marker-start`,e=>e.flow===`backward`||e.flow===`bidirectional`?`url(#link-arrow-start-${r})`:null),O.selectAll(`text`).data(A.filter(e=>e.label)).enter().append(`text`).attr(`class`,`wardley-link-label`).attr(`x`,e=>{let t=D.get(e.source),n=D.get(e.target),r=(t.x+n.x)/2,i=n.y-t.y,a=n.x-t.x;return r+i/Math.sqrt(a*a+i*i)*8}).attr(`y`,e=>{let t=D.get(e.source),n=D.get(e.target),r=(t.y+n.y)/2,i=n.x-t.x,a=n.y-t.y,o=Math.sqrt(i*i+a*a);return r+-i/o*8}).attr(`fill`,s.axisTextColor).attr(`font-size`,o.labelFontSize).attr(`text-anchor`,`middle`).attr(`dominant-baseline`,`middle`).attr(`transform`,e=>{let t=D.get(e.source),n=D.get(e.target),r=(t.x+n.x)/2,i=(t.y+n.y)/2,a=n.x-t.x,o=n.y-t.y,s=Math.sqrt(a*a+o*o),c=o/s,l=-a/s,u=r+c*8,d=i+l*8,f=Math.atan2(o,a)*180/Math.PI;return(f>90||f<-90)&&(f+=180),`rotate(${f} ${u} ${d})`}).text(e=>e.label);let j=_.append(`g`).attr(`class`,`wardley-trends`),M=d.trends.map(e=>{let t=D.get(e.nodeId);if(!t)return null;let n=x(e.targetX),r=S(e.targetY),i=n-t.x,a=r-t.y,s=Math.sqrt(i*i+a*a),c=o.nodeRadius+2;return{origin:t,targetX:n,targetY:r,adjustedX2:s>c?n-i/s*c:n,adjustedY2:s>c?r-a/s*c:r}}).filter(e=>e!==null);j.selectAll(`line`).data(M).enter().append(`line`).attr(`class`,`wardley-trend`).attr(`x1`,e=>e.origin.x).attr(`y1`,e=>e.origin.y).attr(`x2`,e=>e.adjustedX2).attr(`y2`,e=>e.adjustedY2).attr(`stroke`,s.evolutionStroke).attr(`stroke-width`,1).attr(`stroke-dasharray`,`4 4`).attr(`marker-end`,`url(#arrow-${r})`);let N=_.append(`g`).attr(`class`,`wardley-nodes`).selectAll(`g`).data(d.nodes).enter().append(`g`).attr(`class`,e=>[`wardley-node`,e.className?`wardley-node--${e.className}`:``].filter(Boolean).join(` `));N.filter(e=>e.sourceStrategy===`outsource`).append(`circle`).attr(`class`,`wardley-outsource-overlay`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y).attr(`r`,o.nodeRadius*2).attr(`fill`,`#666`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),N.filter(e=>e.sourceStrategy===`buy`).append(`circle`).attr(`class`,`wardley-buy-overlay`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y).attr(`r`,o.nodeRadius*2).attr(`fill`,`#ccc`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),N.filter(e=>e.sourceStrategy===`build`).append(`circle`).attr(`class`,`wardley-build-overlay`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y).attr(`r`,o.nodeRadius*2).attr(`fill`,`#eee`).attr(`stroke`,`#000`).attr(`stroke-width`,1);let P=N.filter(e=>e.sourceStrategy===`market`);P.append(`circle`).attr(`class`,`wardley-market-overlay`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y).attr(`r`,o.nodeRadius*2).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),N.filter(e=>!e.isPipelineParent&&e.sourceStrategy!==`market`&&e.className!==`anchor`).append(`circle`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y).attr(`r`,o.nodeRadius).attr(`fill`,s.componentFill).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1);let F=o.nodeRadius*.7,I=o.nodeRadius*1.2;if(P.append(`line`).attr(`class`,`wardley-market-line`).attr(`x1`,e=>D.get(e.id).x).attr(`y1`,e=>D.get(e.id).y-I).attr(`x2`,e=>D.get(e.id).x-I*Math.cos(Math.PI/6)).attr(`y2`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),P.append(`line`).attr(`class`,`wardley-market-line`).attr(`x1`,e=>D.get(e.id).x-I*Math.cos(Math.PI/6)).attr(`y1`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`x2`,e=>D.get(e.id).x+I*Math.cos(Math.PI/6)).attr(`y2`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),P.append(`line`).attr(`class`,`wardley-market-line`).attr(`x1`,e=>D.get(e.id).x+I*Math.cos(Math.PI/6)).attr(`y1`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`x2`,e=>D.get(e.id).x).attr(`y2`,e=>D.get(e.id).y-I).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),P.append(`circle`).attr(`class`,`wardley-market-dot`).attr(`cx`,e=>D.get(e.id).x).attr(`cy`,e=>D.get(e.id).y-I).attr(`r`,F).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,2),P.append(`circle`).attr(`class`,`wardley-market-dot`).attr(`cx`,e=>D.get(e.id).x-I*Math.cos(Math.PI/6)).attr(`cy`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`r`,F).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,2),P.append(`circle`).attr(`class`,`wardley-market-dot`).attr(`cx`,e=>D.get(e.id).x+I*Math.cos(Math.PI/6)).attr(`cy`,e=>D.get(e.id).y+I*Math.sin(Math.PI/6)).attr(`r`,F).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,2),N.filter(e=>e.isPipelineParent===!0).append(`rect`).attr(`x`,e=>D.get(e.id).x-c/2).attr(`y`,e=>D.get(e.id).y-c/2).attr(`width`,c).attr(`height`,c).attr(`fill`,s.componentFill).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),N.filter(e=>e.inertia===!0).append(`line`).attr(`class`,`wardley-inertia`).attr(`x1`,e=>{let t=D.get(e.id),n=e.isPipelineParent?c/2+15:o.nodeRadius+15;return e.sourceStrategy&&(n+=o.nodeRadius+10),t.x+n}).attr(`y1`,e=>{let t=D.get(e.id),n=e.isPipelineParent?c:o.nodeRadius*2;return t.y-n/2}).attr(`x2`,e=>{let t=D.get(e.id),n=e.isPipelineParent?c/2+15:o.nodeRadius+15;return e.sourceStrategy&&(n+=o.nodeRadius+10),t.x+n}).attr(`y2`,e=>{let t=D.get(e.id),n=e.isPipelineParent?c:o.nodeRadius*2;return t.y+n/2}).attr(`stroke`,s.componentStroke).attr(`stroke-width`,6),N.append(`text`).attr(`x`,e=>{let t=D.get(e.id);if(e.className===`anchor`)return e.labelOffsetX===void 0?t.x:t.x+e.labelOffsetX;let n=o.nodeLabelOffset;e.sourceStrategy&&e.labelOffsetX===void 0&&(n+=10);let r=e.labelOffsetX??n;return t.x+r}).attr(`y`,e=>{let t=D.get(e.id);if(e.className===`anchor`)return e.labelOffsetY===void 0?t.y-3:t.y+e.labelOffsetY;let n=-o.nodeLabelOffset;e.sourceStrategy&&e.labelOffsetY===void 0&&(n-=10);let r=e.labelOffsetY??n;return t.y+r}).attr(`class`,`wardley-node-label`).attr(`fill`,e=>e.className===`evolved`?s.evolutionStroke:e.className===`anchor`?`#000`:s.componentLabelColor).attr(`font-size`,o.labelFontSize).attr(`font-weight`,e=>e.className===`anchor`?`bold`:`normal`).attr(`text-anchor`,e=>e.className===`anchor`?`middle`:`start`).attr(`dominant-baseline`,e=>e.className===`anchor`?`middle`:`auto`).text(e=>e.label),d.annotations.length>0){let e=_.append(`g`).attr(`class`,`wardley-annotations`);if(d.annotations.forEach(t=>{let n=t.coordinates.map(e=>({x:x(e.x),y:S(e.y)}));if(n.length>1)for(let t=0;t<n.length-1;t++)e.append(`line`).attr(`class`,`wardley-annotation-line`).attr(`x1`,n[t].x).attr(`y1`,n[t].y).attr(`x2`,n[t+1].x).attr(`y2`,n[t+1].y).attr(`stroke`,s.axisColor).attr(`stroke-width`,1.5).attr(`stroke-dasharray`,`4 4`);n.forEach(n=>{let r=e.append(`g`).attr(`class`,`wardley-annotation`);r.append(`circle`).attr(`cx`,n.x).attr(`cy`,n.y).attr(`r`,10).attr(`fill`,`white`).attr(`stroke`,s.axisColor).attr(`stroke-width`,1.5),r.append(`text`).attr(`x`,n.x).attr(`y`,n.y).attr(`text-anchor`,`middle`).attr(`dominant-baseline`,`central`).attr(`font-size`,10).attr(`fill`,s.axisTextColor).attr(`font-weight`,`bold`).text(t.number)})}),d.annotationsBox){let t=x(d.annotationsBox.x),n=S(d.annotationsBox.y),r=e.append(`g`).attr(`class`,`wardley-annotations-box`),i=[...d.annotations].filter(e=>e.text).sort((e,t)=>e.number-t.number),a=[];if(i.forEach((e,i)=>{let o=r.append(`text`).attr(`x`,t+10).attr(`y`,n+10+(i+1)*16).attr(`font-size`,11).attr(`fill`,s.axisTextColor).attr(`text-anchor`,`start`).attr(`dominant-baseline`,`middle`).text(`${e.number}. ${e.text}`);a.push(o)}),a.length>0){let e=0,c=0;a.forEach(t=>{let n=t.node(),r=n.getComputedTextLength();e=Math.max(e,r);let i=n.getBBox();c=Math.max(c,i.height)});let l=e+20+105,u=i.length*16+20+c/2,d=o.padding,f=p-o.padding-l,h=o.padding,g=m-o.padding-u;t=Math.max(d,Math.min(t,f)),n=Math.max(h,Math.min(n,g)),a.forEach((e,r)=>{e.attr(`x`,t+10).attr(`y`,n+10+(r+1)*16)}),r.insert(`rect`,`text`).attr(`x`,t).attr(`y`,n).attr(`width`,l).attr(`height`,u).attr(`fill`,`white`).attr(`stroke`,s.axisColor).attr(`stroke-width`,1.5).attr(`rx`,4).attr(`ry`,4)}}}if(d.notes.length>0){let e=_.append(`g`).attr(`class`,`wardley-notes`);d.notes.forEach(t=>{let n=x(t.x),r=S(t.y);e.append(`text`).attr(`x`,n).attr(`y`,r).attr(`text-anchor`,`start`).attr(`font-size`,11).attr(`fill`,s.axisTextColor).attr(`font-weight`,`bold`).text(t.text)})}if(d.accelerators.length>0){let e=_.append(`g`).attr(`class`,`wardley-accelerators`);d.accelerators.forEach(t=>{let n=x(t.x),r=S(t.y),i=`
|
|
3
|
+
M ${n} ${r-15}
|
|
4
|
+
L ${n+60-20} ${r-15}
|
|
5
|
+
L ${n+60-20} ${r-15-8}
|
|
6
|
+
L ${n+60} ${r}
|
|
7
|
+
L ${n+60-20} ${r+15+8}
|
|
8
|
+
L ${n+60-20} ${r+15}
|
|
9
|
+
L ${n} ${r+15}
|
|
10
|
+
Z
|
|
11
|
+
`;e.append(`path`).attr(`d`,i).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),e.append(`text`).attr(`x`,n+30).attr(`y`,r+15+15).attr(`text-anchor`,`middle`).attr(`font-size`,10).attr(`fill`,s.axisTextColor).attr(`font-weight`,`bold`).text(t.name)})}if(d.deaccelerators.length>0){let e=_.append(`g`).attr(`class`,`wardley-deaccelerators`);d.deaccelerators.forEach(t=>{let n=x(t.x),r=S(t.y),i=`
|
|
12
|
+
M ${n+60} ${r-15}
|
|
13
|
+
L ${n+20} ${r-15}
|
|
14
|
+
L ${n+20} ${r-15-8}
|
|
15
|
+
L ${n} ${r}
|
|
16
|
+
L ${n+20} ${r+15+8}
|
|
17
|
+
L ${n+20} ${r+15}
|
|
18
|
+
L ${n+60} ${r+15}
|
|
19
|
+
Z
|
|
20
|
+
`;e.append(`path`).attr(`d`,i).attr(`fill`,`white`).attr(`stroke`,s.componentStroke).attr(`stroke-width`,1),e.append(`text`).attr(`x`,n+30).attr(`y`,r+15+15).attr(`text-anchor`,`middle`).attr(`font-size`,10).attr(`fill`,s.axisTextColor).attr(`font-weight`,`bold`).text(t.name)})}},`draw`)},styles:t(({wardley:e}={})=>{let t=i(),n=p(),r=m(t,n.themeVariables),a=m(r.wardley,e);return`
|
|
21
|
+
.wardley-background {
|
|
22
|
+
fill: ${a.backgroundColor};
|
|
23
|
+
}
|
|
24
|
+
.wardley-axes line, .wardley-axes path {
|
|
25
|
+
stroke: ${a.axisColor};
|
|
26
|
+
}
|
|
27
|
+
.wardley-axis-label {
|
|
28
|
+
fill: ${a.axisTextColor};
|
|
29
|
+
}
|
|
30
|
+
.wardley-stage-label {
|
|
31
|
+
fill: ${a.axisTextColor};
|
|
32
|
+
}
|
|
33
|
+
.wardley-grid line {
|
|
34
|
+
stroke: ${a.gridColor};
|
|
35
|
+
}
|
|
36
|
+
.wardley-node circle {
|
|
37
|
+
fill: ${a.componentFill};
|
|
38
|
+
stroke: ${a.componentStroke};
|
|
39
|
+
}
|
|
40
|
+
.wardley-node-label {
|
|
41
|
+
fill: ${a.componentLabelColor};
|
|
42
|
+
}
|
|
43
|
+
.wardley-link {
|
|
44
|
+
stroke: ${a.linkStroke};
|
|
45
|
+
}
|
|
46
|
+
.wardley-link--dashed {
|
|
47
|
+
stroke-dasharray: 4 4;
|
|
48
|
+
}
|
|
49
|
+
.wardley-link-label {
|
|
50
|
+
fill: ${a.axisTextColor};
|
|
51
|
+
}
|
|
52
|
+
.wardley-trend line {
|
|
53
|
+
stroke: ${a.evolutionStroke};
|
|
54
|
+
}
|
|
55
|
+
.wardley-annotation-line {
|
|
56
|
+
stroke: ${a.annotationStroke};
|
|
57
|
+
}
|
|
58
|
+
.wardley-annotation circle {
|
|
59
|
+
fill: ${a.annotationFill};
|
|
60
|
+
stroke: ${a.annotationStroke};
|
|
61
|
+
}
|
|
62
|
+
.wardley-annotation text {
|
|
63
|
+
fill: ${a.annotationTextColor};
|
|
64
|
+
}
|
|
65
|
+
.wardley-annotations-box rect {
|
|
66
|
+
fill: ${a.annotationFill};
|
|
67
|
+
stroke: ${a.annotationStroke};
|
|
68
|
+
}
|
|
69
|
+
.wardley-annotations-box text {
|
|
70
|
+
fill: ${a.annotationTextColor};
|
|
71
|
+
}
|
|
72
|
+
.wardley-pipeline-box {
|
|
73
|
+
stroke: ${a.componentStroke};
|
|
74
|
+
}
|
|
75
|
+
.wardley-notes text {
|
|
76
|
+
fill: ${a.axisTextColor};
|
|
77
|
+
}
|
|
78
|
+
`},`styles`)};export{G as diagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{$ as t,G as n,J as r,Jt as i,K as a,Mn as o,Zt as s,bt as c,c as l,in as u,pn as d,q as f,r as p,vt as m,yt as h}from"./default-D5TdIZQS.js";import{$ as g,B as ee,G as te,H as _,Hi as v,J as y,Ji as b,K as x,Oa as S,Pt as C,Q as w,V as T,X as E,Y as D,Zi as O,at as k,di as A,it as j,nt as M,q as N,qa as P,qi as F,ra as I,vt as L}from"./search-D94SZwrC.js";import{g as R}from"./item-Cq_ZbivE.js";import{a as ne,c as z}from"./project-lifecycle-Ba7iRF3u.js";import{n as B,r as V}from"./CompositeItem-BbuEp99X.js";import{t as H}from"./invitations-BmpelTJu.js";import{t as re}from"./upload-CGpna3R2.js";import{Vt as U,c as ie,i as W,n as G,o as ae,r as K,s as oe,t as se}from"./index-DoqlyejP.js";import{n as q,r as J,t as Y}from"./member-directory-CHKUw0u4.js";import{t as ce}from"./label-settings-B3LsJxhk.js";var X=e(o(),1),Z=p();function Q({workspaceId:e,canEdit:t,authority:n}){let r=P(v.query(`list_workspace_roles`,{workspaceId:e})),i=O(`create_workspace_role`),a=O(`update_workspace_role`),o=O(`delete_workspace_role`),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),f=r.data??[],p=i.isPending||a.isPending,g=e=>n.capabilities.includes(e),_=e=>(e.id!==`admin`||n.admin)&&e.permissions.every(g);function b(e){i.reset(),a.reset(),c({role:e,name:e?.name??``,permissions:e?[...e.permissions]:[]})}function A(t,n,r){return t?a.mutateAsync({workspaceId:e,roleId:t.id,expectedVersion:t.version,name:n,permissions:r}):i.mutateAsync({workspaceId:e,name:n,permissions:r})}async function M(t,n){await o.mutateAsync({workspaceId:e,roleId:t.id,expectedVersion:t.version,...n?{reassignTo:n}:{}}),u(null),S.success(d(`settings.roles.deleted`))}let F=l?f.filter(e=>e.id!==l.role.id&&_(e)):[];return(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(j,{title:d(`settings.roles.title`),action:t&&(0,Z.jsx)(y,{label:d(`settings.roles.new`),variant:`default`,onClick:()=>b(null),children:(0,Z.jsx)(R,{})})}),(0,Z.jsx)(x,{error:r.error}),r.isPending?(0,Z.jsx)(E,{}):f.length?f.map(e=>{let n=t&&!e.seeded&&_(e);return(0,Z.jsxs)(G,{compact:!0,title:(0,Z.jsxs)(`span`,{className:`flex min-w-0 items-baseline gap-2`,children:[(0,Z.jsx)(`span`,{dir:`auto`,className:`min-w-0`,children:q(e)}),e.seeded&&(0,Z.jsx)(`span`,{className:`shrink-0 text-xs font-normal text-muted-foreground`,children:d(`settings.roles.builtIn`)})]}),description:e.permissions.length?e.permissions.map(e=>m[e].label).join(` · `):d(`settings.roles.readOnly`),children:[(0,Z.jsx)(`span`,{className:`text-xs whitespace-nowrap text-muted-foreground tabular-nums`,children:d(`settings.roles.memberships`,{count:e.assigned})}),n&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(y,{label:d(`settings.roles.editNamed`,{name:q(e)}),onClick:()=>b(e),children:(0,Z.jsx)(V,{})}),e.assigned?(0,Z.jsx)(y,{label:d(`settings.roles.deleteNamed`,{name:q(e)}),onClick:()=>{o.reset(),u({role:e,reassignTo:`reader`})},children:(0,Z.jsx)(B,{})}):(0,Z.jsx)(T,{label:d(`settings.roles.deleteNamed`,{name:q(e)}),icon:(0,Z.jsx)(B,{}),danger:!0,description:d(`settings.roles.deleteUnused`,{name:q(e)}),onConfirm:()=>M(e)})]})]},e.id)}):!r.error&&(0,Z.jsx)(te,{title:d(`settings.roles.empty`)}),(0,Z.jsx)(w,{title:s?.role?d(`settings.roles.edit`):d(`settings.roles.new`),open:!!s,onOpenChange:e=>{e||c(null)},busy:p,children:s&&(0,Z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),A(s.role,s.name.trim(),s.permissions).then(()=>{c(null),S.success(d(`settings.roles.saved`))}).catch(()=>{})},children:[(0,Z.jsx)(D,{label:d(`settings.roles.name`),value:s.name,onChange:e=>c({...s,name:e.target.value}),maxLength:40,required:!0,autoFocus:!0}),(0,Z.jsxs)(`fieldset`,{className:`mb-4`,children:[(0,Z.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:d(`settings.roles.actions`)}),(0,Z.jsx)(`p`,{className:`mt-0 mb-1 text-xs text-muted-foreground`,children:d(`settings.roles.everyoneReads`)}),h.map(e=>(0,Z.jsx)(ee,{label:m[e].label,description:m[e].description,checked:s.permissions.includes(e),disabled:p||!g(e),onCheckedChange:t=>c({...s,permissions:t?[...s.permissions,e]:s.permissions.filter(t=>t!==e)})},e))]}),s.role&&s.role.assigned>0&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:d(`settings.roles.changesApply`,{count:s.role.assigned})}),(0,Z.jsx)(N,{error:i.error??a.error,pending:p,submitLabel:d(`settings.roles.save`),submitDisabled:!s.name.trim(),onCancel:()=>c(null)})]})}),(0,Z.jsx)(w,{title:d(`settings.roles.delete`),open:!!l,onOpenChange:e=>{e||u(null)},busy:o.isPending,children:l&&(0,Z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),M(l.role,l.reassignTo).catch(()=>{})},children:[(0,Z.jsx)(`p`,{className:`mt-0 text-sm text-muted-foreground`,children:d(`settings.roles.reassignDescription`,{count:l.role.assigned,name:q(l.role)})}),(0,Z.jsx)(k,{label:d(`settings.roles.moveTo`),value:l.reassignTo,onValueChange:e=>e&&u({...l,reassignTo:e}),children:F.map(e=>(0,Z.jsx)(C,{value:e.id,children:q(e)},e.id))}),(0,Z.jsx)(N,{error:o.error,pending:o.isPending,danger:!0,submitLabel:d(`settings.roles.delete`),pendingLabel:d(`settings.lifecycle.deleting`),onCancel:()=>u(null)})]})})]})}var le=[`tickets`,`workflow`,`fields`,`labels`,`relations`,`comments`,`evidence`,`links`],ue=()=>d(`admin.import.notExport`),de=e=>e?.status===`running`,fe=e=>e.issues.some(e=>e.severity===`error`);function pe(e){let{done:t,failed:n,total:i}=e.progress,a={status:r[e.status],done:t,failed:n,count:i};return d(n?`admin.import.progressFailed`:`admin.import.progress`,a)}function me({workspaceId:e}){let[t,n]=(0,X.useState)(!1),[r,i]=(0,X.useState)(null),a=P({...v.query(`list_imports`,{workspaceId:e}),refetchInterval:e=>e.state.data?.some(de)?2e3:!1}),o=e=>{i(e),n(!0)};return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(G,{title:d(`admin.import.title`),description:d(`admin.import.description`),children:(0,Z.jsxs)(A,{onClick:()=>o(null),children:[(0,Z.jsx)(re,{}),d(`admin.import.action`)]})}),a.data?.map(e=>(0,Z.jsx)(G,{compact:!0,title:(0,Z.jsxs)(Z.Fragment,{children:[e.name,` `,(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:e.key})]}),description:(0,Z.jsxs)(Z.Fragment,{children:[pe(e),` · `,(0,Z.jsx)(M,{value:e.updatedAt})]}),children:(0,Z.jsx)(A,{size:`sm`,variant:`ghost`,"aria-label":d(`admin.import.detailsOf`,{name:e.name}),onClick:()=>o(e.id),children:d(`admin.import.details`)})},e.id)),(0,Z.jsx)(w,{title:d(`admin.import.action`),open:t,onOpenChange:n,children:r?(0,Z.jsx)(Se,{workspaceId:e,runId:r,onClose:()=>n(!1)}):(0,Z.jsx)(be,{workspaceId:e,onStarted:i,onCancel:()=>n(!1)})})]})}var he=[`file`,...a],ge=e=>e===`file`?d(`admin.import.exportFile`):n[e].label,_e={edition:`cloud`,signIn:`password`,baseUrl:``,workspace:``,email:``,username:``,password:``,apiKey:``,token:``},$=e=>({name:`baseUrl`,label:d(`admin.import.siteUrl`),type:`url`,placeholder:e}),ve={linear:()=>[{name:`token`,label:d(`admin.import.apiKey`),type:`password`}],jira:({edition:e})=>[{name:`edition`,label:d(`admin.import.jiraEdition`),choices:t},$(e===`cloud`?`https://example.atlassian.net`:`https://jira.example.com`),...e===`cloud`?[{name:`email`,label:d(`admin.import.accountEmail`),type:`email`},{name:`token`,label:d(`admin.import.apiToken`),type:`password`}]:[{name:`token`,label:d(`admin.import.personalToken`),type:`password`}]],trello:()=>[{name:`apiKey`,label:d(`admin.import.apiKey`),type:`password`},{name:`token`,label:d(`admin.import.token`),type:`password`}],plane:()=>[{...$(`https://api.plane.so`),label:d(`admin.import.apiUrl`)},{name:`workspace`,label:d(`admin.import.workspaceSlug`),placeholder:`my-team`},{name:`token`,label:d(`admin.import.apiToken`),type:`password`}],planka:({signIn:e})=>[$(`https://planka.example.com`),{name:`signIn`,label:d(`admin.import.signInWith`),choices:c},...e===`password`?[{name:`username`,label:d(`admin.import.username`)},{name:`password`,label:d(`admin.import.password`),type:`password`}]:[{name:`token`,label:d(`admin.import.apiKey`),type:`password`}]],kaneo:()=>[$(`https://kaneo.example.com`),{name:`token`,label:d(`admin.import.apiKey`),type:`password`}]},ye=(e,t)=>/^[A-Z][A-Z0-9]{1,9}$/.test(e)?e:ie(t);function be({workspaceId:e,onStarted:t,onCancel:r}){let[a,o]=(0,X.useState)(`file`),[c,l]=(0,X.useState)(_e),[u,p]=(0,X.useState)(),[m,h]=(0,X.useState)(``),[g,te]=(0,X.useState)(!0),[_,v]=(0,X.useState)(),[y,b]=(0,X.useState)(),[S,w]=(0,X.useState)(),[T,E]=(0,X.useState)(``),[A,j]=(0,X.useState)(``),[M,P]=(0,X.useState)(`workspace`),[F,I]=(0,X.useState)(),L=O(`list_import_source_projects`),R=O(`preview_import`),ne=O(`preview_source_import`),z=O(`start_import`),B=(0,X.useRef)(0),V=()=>{B.current+=1,I(void 0),R.reset(),ne.reset()},H=e=>t=>{e(t),V()},re=()=>{V(),p(void 0),h(``),L.reset()},U=e=>{e&&(h(e.ref),E(e.name),j(ye(e.key,e.name)),V())},ie=e=>t=>{l(n=>({...n,[e]:t})),w(void 0),re()},W=a===`file`?[]:ve[a](c),G=a===`file`?void 0:f.safeParse({provider:a,...Object.fromEntries(W.map(e=>[e.name,c[e.name]]))}),K=G?.success?G.data:void 0,se=a===`file`?!!_:!!m,q=!!F&&!fe(F),J=a!==`file`&&!u,Y=e=>B.current===e,ce=a===`file`?R:ne,Q=a===`file`?void 0:n[a];return(0,Z.jsxs)(`form`,{onSubmit:n=>{n.preventDefault();let r=B.current;q?z.mutateAsync({workspaceId:e,importId:F.id,expectedVersion:F.version}).then(e=>t(e.id)).catch(()=>{}):J&&!K?w(Error(G?.error?.issues[0]?.message??d(`admin.import.checkConnection`))):K&&J?L.mutateAsync({workspaceId:e,source:K}).then(e=>{Y(r)&&(p(e),U(e[0]))}).catch(()=>{}):K?ne.mutateAsync({workspaceId:e,key:A,name:T,visibility:M,source:K,sourceProject:m,includeComments:g}).then(e=>{Y(r)&&I(e)}).catch(()=>{}):_&&R.mutateAsync({workspaceId:e,key:A,name:T,visibility:M,bundle:_}).then(e=>{Y(r)&&I(e)}).catch(()=>{})},children:[(0,Z.jsx)(k,{label:d(`admin.import.source`),value:a,onValueChange:e=>{let t=he.find(t=>t===e);t&&(o(t),v(void 0),b(void 0),l(_e),w(void 0),re())},children:he.map(e=>(0,Z.jsx)(C,{value:e,children:ge(e)},e))}),a===`file`?(0,Z.jsx)(D,{label:d(`admin.import.file`),type:`file`,accept:`application/json,.json`,required:!0,onChange:e=>{let t=e.currentTarget.files?.[0];if(v(void 0),V(),b(void 0),!t)return;let n=B.current;t.text().then(e=>{let t=JSON.parse(e);if(!i.pick({format:!0}).safeParse(t).success)throw Error(ue());let r=s.parse(t);B.current===n&&(v(r),E(r.project.name),j(ye(r.project.key,r.project.name)))}).catch(e=>{B.current===n&&b(e instanceof SyntaxError?Error(ue()):e)})}}):(0,Z.jsxs)(Z.Fragment,{children:[W.map(e=>e.choices?(0,Z.jsx)(k,{label:e.label,value:c[e.name],onValueChange:t=>{t!==null&&ie(e.name)(t)},children:Object.entries(e.choices).map(([e,t])=>(0,Z.jsx)(C,{value:e,children:t},e))},e.name):(0,Z.jsx)(D,{label:e.label,type:e.type??`text`,required:!0,autoComplete:`off`,placeholder:e.placeholder,value:c[e.name],onChange:t=>ie(e.name)(t.target.value)},e.name)),(0,Z.jsx)(`p`,{className:`-mt-2 mb-4 text-xs text-muted-foreground`,children:Q?.setup}),(0,Z.jsx)(x,{error:S??L.error}),u&&Q&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(k,{label:Q.project,value:m,onValueChange:e=>U(u.find(t=>t.ref===e)),children:u.map(e=>(0,Z.jsxs)(C,{value:e.ref,children:[e.group&&(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.group,` /`]}),` `,e.name,` `,(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:e.key})]},e.ref))}),u.length===0&&(0,Z.jsx)(`p`,{className:`-mt-2 mb-4 text-sm text-muted-foreground`,children:d(`admin.import.noProjects`,{label:Q.project})}),(0,Z.jsx)(ee,{label:d(`admin.import.includeComments`),checked:g,onCheckedChange:H(te)})]})]}),(0,Z.jsx)(x,{error:y}),se&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(D,{label:d(`admin.import.projectName`),value:T,onChange:e=>H(E)(e.target.value),required:!0,maxLength:120}),(0,Z.jsx)(ae,{value:A,onChange:H(j)}),(0,Z.jsx)(oe,{value:M,onChange:H(P)})]}),F&&(0,Z.jsx)(xe,{run:F}),(0,Z.jsx)(N,{error:ce.error??z.error,pending:L.isPending||ce.isPending||z.isPending,submitLabel:d(q?`admin.import.start`:J?`admin.import.connect`:`admin.import.preview`),pendingLabel:d(q?`admin.import.starting`:J?`admin.import.connecting`:`admin.import.checking`),submitDisabled:J?!1:!se||!!F&&!q,onCancel:r})]})}function xe({run:e}){let t=e.members.filter(e=>e.userId),n=e.members.filter(e=>!e.userId),r=[...le.map(t=>[d(`admin.import.count.${t}`),e.counts[t]?String(e.counts[t]):``]),[d(`admin.import.matched`),u(t.map(e=>e.name))],[d(`admin.import.unmatched`),u(n.map(e=>e.name))]];return(0,Z.jsxs)(`section`,{"aria-label":d(`admin.import.previewLabel`),className:`mt-2 border-t pt-3`,children:[(0,Z.jsx)(z,{rows:r}),e.issues.length>0&&(0,Z.jsx)(`ul`,{className:`m-0 list-none space-y-1.5 p-0 text-sm`,children:e.issues.map(e=>(0,Z.jsxs)(`li`,{className:e.severity===`error`?`text-destructive`:`text-muted-foreground`,children:[(0,Z.jsx)(`span`,{className:`sr-only`,children:e.severity===`error`?d(`admin.import.errorPrefix`):d(`admin.import.notePrefix`)}),e.message]},e.message))})]})}function Se({workspaceId:e,runId:t,onClose:n}){let r=P({...v.query(`get_import`,{workspaceId:e,importId:t}),refetchInterval:e=>de(e.state.data)?1e3:!1}),i=O(`cancel_import`);if(r.error)return(0,Z.jsx)(x,{error:r.error});let a=r.data;if(!a)return(0,Z.jsx)(E,{});let{done:o,failed:s,total:c}=a.progress,l=c?Math.round((o+s)/c*100):0;return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`p`,{className:`mt-0 mb-2 text-sm`,children:[a.name,` `,(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:a.key})]}),(0,Z.jsxs)(`div`,{className:`my-3`,children:[(0,Z.jsx)(`div`,{role:`progressbar`,"aria-label":d(`admin.import.progressLabel`),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":l,className:`h-1.5 overflow-hidden rounded-full bg-border`,children:(0,Z.jsx)(`div`,{className:`h-full bg-primary transition-[width] duration-300`,style:{width:`${l}%`}})}),(0,Z.jsx)(`p`,{role:`status`,className:`mt-2 mb-0 text-sm text-muted-foreground tabular-nums`,children:pe(a)})]}),a.errors.length>0&&(0,Z.jsx)(`ul`,{"aria-label":d(`admin.import.notImported`),className:`m-0 list-none space-y-1 p-0 text-sm`,children:a.errors.map((e,t)=>(0,Z.jsxs)(`li`,{className:`text-destructive`,children:[e.label,`: `,e.message]},t))}),(0,Z.jsx)(x,{error:i.error}),(0,Z.jsxs)(g,{children:[a.status===`running`&&(0,Z.jsx)(A,{disabled:i.isPending,onClick:()=>void i.mutateAsync({workspaceId:e,importId:a.id,expectedVersion:a.version}).catch(()=>{}),children:d(`admin.import.stop`)}),a.projectId&&a.status!==`running`&&(0,Z.jsx)(A,{variant:`default`,render:(0,Z.jsx)(U,{to:`/projects/$projectId`,params:{projectId:a.projectId}}),onClick:n,children:d(`admin.import.openProject`)})]})]})}function Ce({workspace:e,people:t,canTransfer:n}){let[r,i]=(0,X.useState)(!1),[a,o]=(0,X.useState)(``),s=O(`transfer_workspace`),c=t.find(t=>t.userId===e.ownerId),l=t.filter(t=>t.role===`admin`&&!t.disabled&&t.userId!==e.ownerId),u=l.find(e=>e.email===a);return(0,Z.jsx)(G,{title:d(`settings.workspace.owner`),description:c?`${c.name} · ${c.email}`:e.ownerId?void 0:d(`settings.workspace.noOwner`),children:n&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(A,{onClick:()=>{o(``),i(!0)},children:d(`settings.workspace.transfer`)}),(0,Z.jsx)(w,{title:d(`settings.workspace.transfer`),open:r,onOpenChange:e=>{i(e),e||s.reset()},busy:s.isPending,children:(0,Z.jsxs)(`form`,{onSubmit:t=>{t.preventDefault(),u&&s.mutateAsync({workspaceId:e.id,expectedVersion:e.version,userId:u.userId}).then(()=>{i(!1),S.success(d(`settings.workspace.transferred`,{name:u.name,workspace:e.name}))}).catch(()=>{})},children:[l.length?(0,Z.jsx)(J,{people:l,value:a,onChange:o,disabled:s.isPending,label:d(`settings.workspace.newOwner`),anyAccount:!1}):(0,Z.jsx)(`p`,{className:`mt-0 text-sm text-muted-foreground`,children:d(`settings.workspace.noEligible`)}),(0,Z.jsxs)(`p`,{className:`mt-0 text-sm text-muted-foreground`,children:[u?d(`settings.workspace.chosenCan`,{name:u.name}):d(`settings.workspace.newOwnerCan`),` `,c?d(`settings.workspace.ownerStays`,{name:c.name}):``]}),(0,Z.jsx)(N,{error:s.error,pending:s.isPending,submitLabel:d(`settings.workspace.transfer`),pendingLabel:d(`settings.workspace.transferring`),submitDisabled:!u,onCancel:()=>i(!1)})]})})]})})}function we({workspaceId:e,section:t}){let n=b(),r=I(),i=F(),a=r.data?.find(t=>t.id===e),o=P({...v.query(`list_workspace_members`,{workspaceId:e}),enabled:!!a?.role}),s=P({...v.query(`list_workspace_roles`,{workspaceId:e}),enabled:!!a?.role}),c=O(`update_workspace`),u=O(`set_workspace_member`);if(r.isPending)return(0,Z.jsx)(E,{});if(!a?.role)return(0,Z.jsxs)(te,{title:d(`settings.workspace.unavailable`),children:[(0,Z.jsx)(x,{error:r.error}),(0,Z.jsx)(A,{render:(0,Z.jsx)(U,{to:`/`}),children:d(`settings.workspace.backToProjects`)})]});let f=l(a),p={admin:a.role===`admin`,capabilities:f},m=f.includes(`workspace.manage`),h=a.ownerId===n.id||n.admin,g=i.data?.filter(e=>e.workspaceId===a.id).length??0;return(0,Z.jsx)(Z.Fragment,{children:(0,Z.jsxs)(K,{title:d(`settings.workspace.title`),section:t,children:[(0,Z.jsxs)(W,{value:`general`,children:[(0,Z.jsx)(`section`,{children:(0,Z.jsx)(se,{name:a.name,description:a.description,nameLabel:d(`settings.workspace.name`),canEdit:m,version:a.version,pending:c.isPending,error:c.error,editLabel:d(`settings.workspace.edit`),badges:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(L,{variant:`secondary`,className:`ml-0.5 font-mono text-[10px] font-normal`,children:a.slug}),(0,Z.jsx)(_,{label:d(`settings.workspace.copyKey`),value:a.slug,size:`icon-xs`})]}),onSave:t=>c.mutateAsync({workspaceId:e,expectedVersion:a.version,name:t.name,description:t.description}).then(()=>S.success(d(`settings.workspace.saved`)))})}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(G,{title:d(`settings.workspace.projects`),description:d(`settings.workspace.projectCount`,{count:g}),children:(0,Z.jsx)(A,{render:(0,Z.jsx)(U,{to:`/`}),children:d(`settings.workspace.viewProjects`)})}),(0,Z.jsx)(Ce,{workspace:a,people:o.data??[],canTransfer:h}),(0,Z.jsx)(G,{title:d(`settings.workspace.members`),description:d(`settings.workspace.membersDescription`),children:(0,Z.jsx)(A,{render:(0,Z.jsx)(U,{to:`/workspaces/$workspaceId/settings`,params:{workspaceId:e},search:{section:`members`}}),children:d(`settings.workspace.manageMembers`)})}),f.includes(`ticket.write`)&&(0,Z.jsx)(me,{workspaceId:e}),h&&(0,Z.jsx)(ne,{workspace:a})]})]}),(0,Z.jsxs)(W,{value:`members`,children:[(0,Z.jsx)(Y,{people:o.data??[],pending:u.isPending,loading:o.isPending,error:o.error,canAdmin:f.includes(`member.manage`),ownerId:a.ownerId,scope:`workspace`,roles:s.data,authority:p,onChange:(t,n)=>u.mutateAsync({workspaceId:e,email:t,role:n})}),f.includes(`invitation.manage`)&&(0,Z.jsx)(H,{workspaceId:e})]}),(0,Z.jsx)(W,{value:`roles`,children:(0,Z.jsx)(Q,{workspaceId:e,canEdit:m,authority:p})}),(0,Z.jsx)(W,{value:`labels`,children:(0,Z.jsx)(ce,{owner:{workspaceId:e},canAdmin:m})})]})})}export{we as WorkspaceSettings};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as t}from"./src-BWF7jMDv.js";import{C as n,E as r,H as i,U as a,_ as o,a as s,c,f as l,q as u,v as d,y as f,z as p}from"./chunk-DSNLSHJZ-DTC3y9rb.js";import{t as m}from"./linear-C9iwaMOi.js";import{t as h}from"./ordinal-BDEzSJ7C.js";import{t as g}from"./init-C-OQMol4.js";import{i as _}from"./chunk-7S6XSTFO-CpdNd6Ke.js";import{t as v}from"./line-WsxZYwZr.js";import"./chunk-YZO67HFG-C0ptzlKO.js";import{t as y}from"./chunk-AQDTSKZB-CpyuSWt8.js";import{a as b}from"./mermaid.core-vGVkgzA3.js";function x(e,t,n){e=+e,t=+t,n=(i=arguments.length)<2?(t=e,e=0,1):i<3?1:+n;for(var r=-1,i=Math.max(0,Math.ceil((t-e)/n))|0,a=Array(i);++r<i;)a[r]=e+r*n;return a}function S(){var e=h().unknown(void 0),t=e.domain,n=e.range,r=0,i=1,a,o,s=!1,c=0,l=0,u=.5;delete e.unknown;function d(){var e=t().length,d=i<r,f=d?i:r,p=d?r:i;a=(p-f)/Math.max(1,e-c+l*2),s&&(a=Math.floor(a)),f+=(p-f-a*(e-c))*u,o=a*(1-c),s&&(f=Math.round(f),o=Math.round(o));var m=x(e).map(function(e){return f+a*e});return n(d?m.reverse():m)}return e.domain=function(e){return arguments.length?(t(e),d()):t()},e.range=function(e){return arguments.length?([r,i]=e,r=+r,i=+i,d()):[r,i]},e.rangeRound=function(e){return[r,i]=e,r=+r,i=+i,s=!0,d()},e.bandwidth=function(){return o},e.step=function(){return a},e.round=function(e){return arguments.length?(s=!!e,d()):s},e.padding=function(e){return arguments.length?(c=Math.min(1,l=+e),d()):c},e.paddingInner=function(e){return arguments.length?(c=Math.min(1,e),d()):c},e.paddingOuter=function(e){return arguments.length?(l=+e,d()):l},e.align=function(e){return arguments.length?(u=Math.max(0,Math.min(1,e)),d()):u},e.copy=function(){return S(t(),[r,i]).round(s).paddingInner(c).paddingOuter(l).align(u)},g.apply(d(),arguments)}var C=(function(){var t=e(function(e,t,n,r){for(n||={},r=e.length;r--;n[e[r]]=t);return n},`o`),n=[1,10,12,14,16,18,19,21,23],r=[2,6],i=[1,3],a=[1,5],o=[1,6],s=[1,7],c=[1,5,10,12,14,16,18,19,21,23,36,37,38],l=[1,25],u=[1,26],d=[1,28],f=[1,29],p=[1,30],m=[1,31],h=[1,32],g=[1,33],_=[1,34],v=[1,35],y=[1,36],b=[1,37],x=[1,43],S=[1,42],C=[1,47],w=[1,50],T=[1,10,12,14,16,18,19,21,23,36,37,38],E=[1,10,12,14,16,18,19,21,23,24,26,28,29,36,37,38],D=[1,10,12,14,16,18,19,21,23,24,26,28,29,36,37,38,42,43,44,45,46,47,48,49,50,51],O=[1,65],k=[26,28],A={trace:e(function(){},`trace`),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,dataPoints:25,SQUARE_BRACES_END:26,dataPoint:27,COMMA:28,NUMBER_WITH_DECIMAL:29,STR:30,xAxisData:31,bandData:32,ARROW_DELIMITER:33,commaSeparatedTexts:34,yAxisData:35,NEWLINE:36,SEMI:37,EOF:38,alphaNum:39,MD_STR:40,alphaNumToken:41,AMP:42,NUM:43,ALPHA:44,PLUS:45,EQUALS:46,MULT:47,DOT:48,BRKT:49,MINUS:50,UNDERSCORE:51,$accept:0,$end:1},terminals_:{2:`error`,5:`XYCHART`,8:`CHART_ORIENTATION`,10:`title`,12:`X_AXIS`,14:`Y_AXIS`,16:`LINE`,18:`BAR`,19:`acc_title`,20:`acc_title_value`,21:`acc_descr`,22:`acc_descr_value`,23:`acc_descr_multiline_value`,24:`SQUARE_BRACES_START`,26:`SQUARE_BRACES_END`,28:`COMMA`,29:`NUMBER_WITH_DECIMAL`,30:`STR`,33:`ARROW_DELIMITER`,36:`NEWLINE`,37:`SEMI`,38:`EOF`,40:`MD_STR`,42:`AMP`,43:`NUM`,44:`ALPHA`,45:`PLUS`,46:`EQUALS`,47:`MULT`,48:`DOT`,49:`BRKT`,50:`MINUS`,51:`UNDERSCORE`},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[27,2],[27,1],[13,1],[13,2],[13,1],[31,1],[31,3],[32,3],[34,3],[34,1],[15,1],[15,2],[15,1],[35,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[39,1],[39,2],[41,1],[41,1],[41,1],[41,1],[41,1],[41,1],[41,1],[41,1],[41,1],[41,1]],performAction:e(function(e,t,n,r,i,a,o){var s=a.length-1;switch(i){case 5:r.setOrientation(a[s]);break;case 9:r.setDiagramTitle(a[s].text.trim());break;case 12:r.setLineData({text:``,type:`text`},a[s]);break;case 13:r.setLineData(a[s-1],a[s]);break;case 14:r.setBarData({text:``,type:`text`},a[s]);break;case 15:r.setBarData(a[s-1],a[s]);break;case 16:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 17:case 18:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 19:this.$=a[s-1];break;case 20:case 30:this.$=[a[s-2],...a[s]];break;case 21:case 31:this.$=[a[s]];break;case 22:this.$={value:Number(a[s-1]),label:a[s]};break;case 23:this.$={value:Number(a[s]),label:``};break;case 24:r.setXAxisTitle(a[s]);break;case 25:r.setXAxisTitle(a[s-1]);break;case 26:r.setXAxisTitle({type:`text`,text:``});break;case 27:r.setXAxisBand(a[s]);break;case 28:r.setXAxisRangeData(Number(a[s-2]),Number(a[s]));break;case 29:this.$=a[s-1];break;case 32:r.setYAxisTitle(a[s]);break;case 33:r.setYAxisTitle(a[s-1]);break;case 34:r.setYAxisTitle({type:`text`,text:``});break;case 35:r.setYAxisRangeData(Number(a[s-2]),Number(a[s]));break;case 39:this.$={text:a[s],type:`text`};break;case 40:this.$={text:a[s],type:`text`};break;case 41:this.$={text:a[s],type:`markdown`};break;case 42:this.$=a[s];break;case 43:this.$=a[s-1]+``+a[s]}},`anonymous`),table:[t(n,r,{3:1,4:2,7:4,5:i,36:a,37:o,38:s}),{1:[3]},t(n,r,{4:2,7:4,3:8,5:i,36:a,37:o,38:s}),t(n,r,{4:2,7:4,6:9,3:10,5:i,8:[1,11],36:a,37:o,38:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(c,[2,36]),t(c,[2,37]),t(c,[2,38]),{1:[2,1]},t(n,r,{4:2,7:4,3:21,5:i,36:a,37:o,38:s}),{1:[2,3]},t(c,[2,5]),t(n,[2,7],{4:22,36:a,37:o,38:s}),{11:23,30:l,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},{11:39,13:38,24:x,29:S,30:l,31:40,32:41,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},{11:45,15:44,29:C,30:l,35:46,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},{11:49,17:48,24:w,30:l,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},{11:52,17:51,24:w,30:l,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},{20:[1,53]},{22:[1,54]},t(T,[2,18]),{1:[2,2]},t(T,[2,8]),t(T,[2,9]),t(E,[2,39],{41:55,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b}),t(E,[2,40]),t(E,[2,41]),t(D,[2,42]),t(D,[2,44]),t(D,[2,45]),t(D,[2,46]),t(D,[2,47]),t(D,[2,48]),t(D,[2,49]),t(D,[2,50]),t(D,[2,51]),t(D,[2,52]),t(D,[2,53]),t(T,[2,10]),t(T,[2,24],{32:41,31:56,24:x,29:S}),t(T,[2,26]),t(T,[2,27]),{33:[1,57]},{11:59,30:l,34:58,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},t(T,[2,11]),t(T,[2,32],{35:60,29:C}),t(T,[2,34]),{33:[1,61]},t(T,[2,12]),{17:62,24:w},{25:63,27:64,29:O},t(T,[2,14]),{17:66,24:w},t(T,[2,16]),t(T,[2,17]),t(D,[2,43]),t(T,[2,25]),{29:[1,67]},{26:[1,68]},{26:[2,31],28:[1,69]},t(T,[2,33]),{29:[1,70]},t(T,[2,13]),{26:[1,71]},{26:[2,21],28:[1,72]},t(k,[2,23],{30:[1,73]}),t(T,[2,15]),t(T,[2,28]),t(T,[2,29]),{11:59,30:l,34:74,39:24,40:u,41:27,42:d,43:f,44:p,45:m,46:h,47:g,48:_,49:v,50:y,51:b},t(T,[2,35]),t(T,[2,19]),{25:75,27:64,29:O},t(k,[2,22]),{26:[2,30]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],74:[2,30],75:[2,20]},parseError:e(function(e,t){if(t.recoverable)this.trace(e);else{var n=Error(e);throw n.hash=t,n}},`parseError`),parse:e(function(t){var n=this,r=[0],i=[],a=[null],o=[],s=this.table,c=``,l=0,u=0,d=0,f=2,p=1,m=o.slice.call(arguments,1),h=Object.create(this.lexer),g={yy:{}};for(var _ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_)&&(g.yy[_]=this.yy[_]);h.setInput(t,g.yy),g.yy.lexer=h,g.yy.parser=this,h.yylloc===void 0&&(h.yylloc={});var v=h.yylloc;o.push(v);var y=h.options&&h.options.ranges;this.parseError=typeof g.yy.parseError==`function`?g.yy.parseError:Object.getPrototypeOf(this).parseError;function b(e){r.length-=2*e,a.length-=e,o.length-=e}e(b,`popStack`);function x(){var e=i.pop()||h.lex()||p;return typeof e!=`number`&&(e instanceof Array&&(i=e,e=i.pop()),e=n.symbols_[e]||e),e}e(x,`lex`);for(var S,C,w,T,E,D={},O,k,A,j;;){if(w=r[r.length-1],this.defaultActions[w]?T=this.defaultActions[w]:(S??=x(),T=s[w]&&s[w][S]),T===void 0||!T.length||!T[0]){var M=``;for(O in j=[],s[w])this.terminals_[O]&&O>f&&j.push(`'`+this.terminals_[O]+`'`);M=h.showPosition?`Parse error on line `+(l+1)+`:
|
|
2
|
+
`+h.showPosition()+`
|
|
3
|
+
Expecting `+j.join(`, `)+`, got '`+(this.terminals_[S]||S)+`'`:`Parse error on line `+(l+1)+`: Unexpected `+(S==p?`end of input`:`'`+(this.terminals_[S]||S)+`'`),this.parseError(M,{text:h.match,token:this.terminals_[S]||S,line:h.yylineno,loc:v,expected:j})}if(T[0]instanceof Array&&T.length>1)throw Error(`Parse Error: multiple actions possible at state: `+w+`, token: `+S);switch(T[0]){case 1:r.push(S),a.push(h.yytext),o.push(h.yylloc),r.push(T[1]),S=null,C?(S=C,C=null):(u=h.yyleng,c=h.yytext,l=h.yylineno,v=h.yylloc,d>0&&d--);break;case 2:if(k=this.productions_[T[1]][1],D.$=a[a.length-k],D._$={first_line:o[o.length-(k||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(k||1)].first_column,last_column:o[o.length-1].last_column},y&&(D._$.range=[o[o.length-(k||1)].range[0],o[o.length-1].range[1]]),E=this.performAction.apply(D,[c,u,l,g.yy,T[1],a,o].concat(m)),E!==void 0)return E;k&&(r=r.slice(0,-1*k*2),a=a.slice(0,-1*k),o=o.slice(0,-1*k)),r.push(this.productions_[T[1]][0]),a.push(D.$),o.push(D._$),A=s[r[r.length-2]][r[r.length-1]],r.push(A);break;case 3:return!0}}return!0},`parse`)};A.lexer=(function(){return{EOF:1,parseError:e(function(e,t){if(this.yy.parser)this.yy.parser.parseError(e,t);else throw Error(e)},`parseError`),setInput:e(function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match=``,this.conditionStack=[`INITIAL`],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},`setInput`),input:e(function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},`input`),unput:e(function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},`unput`),more:e(function(){return this._more=!0,this},`more`),reject:e(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError(`Lexical error on line `+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
|
+
`+this.showPosition(),{text:``,token:null,line:this.yylineno});return this},`reject`),less:e(function(e){this.unput(this.match.slice(e))},`less`),pastInput:e(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?`...`:``)+e.substr(-20).replace(/\n/g,``)},`pastInput`),upcomingInput:e(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?`...`:``)).replace(/\n/g,``)},`upcomingInput`),showPosition:e(function(){var e=this.pastInput(),t=Array(e.length+1).join(`-`);return e+this.upcomingInput()+`
|
|
5
|
+
`+t+`^`},`showPosition`),test_match:e(function(e,t){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),r=e[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},`test_match`),next:e(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,n,r;this._more||(this.yytext=``,this.match=``);for(var i=this._currentRules(),a=0;a<i.length;a++)if(n=this._input.match(this.rules[i[a]]),n&&(!t||n[0].length>t[0].length)){if(t=n,r=a,this.options.backtrack_lexer){if(e=this.test_match(n,i[a]),e!==!1)return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?(e=this.test_match(t,i[r]),e!==!1&&e):this._input===``?this.EOF:this.parseError(`Lexical error on line `+(this.yylineno+1)+`. Unrecognized text.
|
|
6
|
+
`+this.showPosition(),{text:``,token:null,line:this.yylineno})},`next`),lex:e(function(){return this.next()||this.lex()},`lex`),begin:e(function(e){this.conditionStack.push(e)},`begin`),popState:e(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},`popState`),_currentRules:e(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},`_currentRules`),topState:e(function(e){return e=this.conditionStack.length-1-Math.abs(e||0),e>=0?this.conditionStack[e]:`INITIAL`},`topState`),pushState:e(function(e){this.begin(e)},`pushState`),stateStackSize:e(function(){return this.conditionStack.length},`stateStackSize`),options:{"case-insensitive":!0},performAction:e(function(e,t,n,r){switch(n){case 0:break;case 1:break;case 2:return this.popState(),36;case 3:return this.popState(),36;case 4:return 36;case 5:break;case 6:return 10;case 7:return this.pushState(`acc_title`),19;case 8:return this.popState(),`acc_title_value`;case 9:return this.pushState(`acc_descr`),21;case 10:return this.popState(),`acc_descr_value`;case 11:this.pushState(`acc_descr_multiline`);break;case 12:this.popState();break;case 13:return`acc_descr_multiline_value`;case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState(`axis_data`),`X_AXIS`;case 18:return this.pushState(`axis_data`),`Y_AXIS`;case 19:return this.pushState(`axis_band_data`),24;case 20:return 33;case 21:return this.pushState(`data`),16;case 22:return this.pushState(`data`),18;case 23:return this.pushState(`data_inner`),24;case 24:return 29;case 25:return this.popState(),26;case 26:this.popState();break;case 27:this.pushState(`string`);break;case 28:this.popState();break;case 29:return`STR`;case 30:return 24;case 31:return 26;case 32:return 44;case 33:return`COLON`;case 34:return 45;case 35:return 28;case 36:return 46;case 37:return 47;case 38:return 49;case 39:return 51;case 40:return 48;case 41:return 42;case 42:return 50;case 43:return 43;case 44:break;case 45:return 37;case 46:return 38}},`anonymous`),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\})/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n<md_string>\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n<md_string>\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}}})();function j(){this.yy={}}return e(j,`Parser`),j.prototype=A,A.Parser=j,new j})();C.parser=C;var w=C;function T(e){return e.type===`bar`}e(T,`isBarPlot`);function E(e){return e.type===`band`}e(E,`isBandAxisData`);function D(e){return e.type===`linear`}e(D,`isLinearAxisData`);var O=class{constructor(e){this.parentGroup=e}static{e(this,`TextDimensionCalculatorWithFont`)}getMaxDimension(t,n){if(!this.parentGroup)return{width:t.reduce((e,t)=>Math.max(t.length,e),0)*n,height:n};let r={width:0,height:0},i=this.parentGroup.append(`g`).attr(`visibility`,`hidden`).attr(`font-size`,n),a=i.node()?.getScreenCTM?.(),o=e(e=>e&&e>0?e:1,`toScale`),s=o(a?.a),c=o(a?.d);for(let e of t){let t=y(i,1,e),a=t?t.width/s:e.length*n,o=t?t.height/c:n;r.width=Math.max(r.width,a),r.height=Math.max(r.height,o)}return i.remove(),r}},k=.7,A=.2,j=class{constructor(e,t,n,r){this.axisConfig=e,this.title=t,this.textDimensionCalculator=n,this.axisThemeConfig=r,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition=`left`,this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.normalizedLabelRotationInRad=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition=`left`,this.normalizedLabelRotationInRad=this.axisConfig.labelRotation>=-90&&this.axisConfig.labelRotation<=90?this.axisConfig.labelRotation*Math.PI/180:0}static{e(this,`BaseAxis`)}setRange(e){this.range=e,this.axisPosition===`left`||this.axisPosition===`right`?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){k*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(k*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let t=e.height;if(this.axisConfig.showAxisLine&&t>this.axisConfig.axisLineWidth&&(t-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),r=A*e.width;this.outerPadding=Math.min(n.width/2,r);let i=n.height;this.axisPosition===`bottom`&&this.normalizedLabelRotationInRad!==0&&(i=Math.max(i,Math.abs(Math.sin(this.normalizedLabelRotationInRad)*n.width)+Math.abs(Math.cos(this.normalizedLabelRotationInRad)*n.height))),i+=this.axisConfig.labelPadding*2,this.labelTextHeight=n.height,i<=t&&(t-=i,this.showLabel=!0)}if(this.axisConfig.showTick&&t>=this.axisConfig.tickLength&&(this.showTick=!0,t-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),n=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,n<=t&&(t-=n,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-t}calculateSpaceIfDrawnVertical(e){let t=e.width;if(this.axisConfig.showAxisLine&&t>this.axisConfig.axisLineWidth&&(t-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),r=A*e.height;this.outerPadding=Math.min(n.height/2,r);let i=n.width+this.axisConfig.labelPadding*2;i<=t&&(t-=i,this.showLabel=!0)}if(this.axisConfig.showTick&&t>=this.axisConfig.tickLength&&(this.showTick=!0,t-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),n=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,n<=t&&(t-=n,this.showTitle=!0)}this.boundingRect.width=e.width-t,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition===`left`||this.axisPosition===`right`?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateOffsetByRotation(e){let t=this.normalizedLabelRotationInRad;return t===0?0:Math.sin(t)*this.getLabelDimension()[e]/2}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let t=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:`path`,groupTexts:[`left-axis`,`axisl-line`],data:[{path:`M ${t},${this.boundingRect.y} L ${t},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:`text`,groupTexts:[`left-axis`,`label`],data:this.getTickValues().map(e=>({text:e.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(e),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:`middle`,horizontalPos:`right`}))}),this.showTick){let t=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:`path`,groupTexts:[`left-axis`,`ticks`],data:this.getTickValues().map(e=>({path:`M ${t},${this.getScaleValue(e)} L ${t-this.axisConfig.tickLength},${this.getScaleValue(e)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:`text`,groupTexts:[`left-axis`,`title`],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:`top`,horizontalPos:`center`}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let t=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:`path`,groupTexts:[`bottom-axis`,`axis-line`],data:[{path:`M ${this.boundingRect.x},${t} L ${this.boundingRect.x+this.boundingRect.width},${t}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:`text`,groupTexts:[`bottom-axis`,`label`],data:this.getTickValues().map(e=>({text:e.toString(),x:this.getScaleValue(e)+this.calculateOffsetByRotation(`height`),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0)+Math.abs(this.calculateOffsetByRotation(`width`)),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:this.normalizedLabelRotationInRad*180/Math.PI,verticalPos:`top`,horizontalPos:`center`}))}),this.showTick){let t=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:`path`,groupTexts:[`bottom-axis`,`ticks`],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${t} L ${this.getScaleValue(e)},${t+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:`text`,groupTexts:[`bottom-axis`,`title`],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:`top`,horizontalPos:`center`}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let t=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:`path`,groupTexts:[`top-axis`,`axis-line`],data:[{path:`M ${this.boundingRect.x},${t} L ${this.boundingRect.x+this.boundingRect.width},${t}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:`text`,groupTexts:[`top-axis`,`label`],data:this.getTickValues().map(e=>({text:e.toString(),x:this.getScaleValue(e),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:`top`,horizontalPos:`center`}))}),this.showTick){let t=this.boundingRect.y;e.push({type:`path`,groupTexts:[`top-axis`,`ticks`],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${t+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(e)},${t+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:`text`,groupTexts:[`top-axis`,`title`],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:`top`,horizontalPos:`center`}]}),e}getDrawableElements(){if(this.axisPosition===`left`)return this.getDrawableElementsForLeftAxis();if(this.axisPosition===`right`)throw Error(`Drawing of right axis is not implemented`);return this.axisPosition===`bottom`?this.getDrawableElementsForBottomAxis():this.axisPosition===`top`?this.getDrawableElementsForTopAxis():[]}},M=class extends j{static{e(this,`BandAxis`)}constructor(e,t,n,r,i){super(e,r,i,t),this.categories=n,this.scale=S().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=S().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),t.trace(`BandAxis axis final categories, range: `,this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}},ee=class extends j{static{e(this,`LinearAxis`)}constructor(e,t,n,r,i){super(e,r,i,t),this.domain=n,this.scale=m().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition===`left`&&e.reverse(),this.scale=m().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}};function N(e,t,n,r){let i=new O(r);return E(e)?new M(t,n,e.categories,e.title,i):new ee(t,n,[e.min,e.max],e.title,i)}e(N,`getAxis`);var te=class{constructor(e,t,n,r){this.textDimensionCalculator=e,this.chartConfig=t,this.chartData=n,this.chartThemeConfig=r,this.titleWidth=0,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{e(this,`ChartTitle`)}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let t=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(t.width,e.width),r=t.height+2*this.chartConfig.titlePadding;return r<=e.height&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=r,this.titleWidth=t.width,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}alignTo(e,t){let n=Math.min(this.titleWidth,this.chartConfig.width)/2,r=Math.min(Math.max((e+t)/2,n),this.chartConfig.width-n);this.boundingRect.x=r-n,this.boundingRect.width=n*2}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:[`chart-title`],type:`text`,data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:`middle`,horizontalPos:`center`,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};function P(e,t,n,r){return new te(new O(r),e,t,n)}e(P,`getChartTitleComponent`);var ne=.75,re=.5,ie=.35;function F(e){return{fontSize:e,markerSize:e*ne,markerSpacing:e*ie,itemSpacing:e*re}}e(F,`getLegendLayout`);var ae=class{constructor(e,t,n,r){this.textDimensionCalculator=e,this.chartConfig=t,this.chartData=n,this.chartThemeConfig=r,this.boundingRect={x:0,y:0,width:0,height:0},this.visiblePlots=[]}static{e(this,`ChartLegend`)}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){if(this.visiblePlots=this.chartConfig.showLegend?this.chartData.plots.filter(e=>e.title):[],this.visiblePlots.length===0)return this.boundingRect.width=0,this.boundingRect.height=0,{width:0,height:0};let{fontSize:t,markerSize:n,markerSpacing:r,itemSpacing:i}=F(this.chartConfig.legendFontSize),a=this.textDimensionCalculator.getMaxDimension(this.visiblePlots.map(e=>e.title),t),o=this.chartConfig.legendPadding*2+n+r+a.width,s=this.chartConfig.legendPadding*2+this.visiblePlots.length*t+(this.visiblePlots.length-1)*i;return o<=e.width&&s<=e.height?(this.boundingRect.width=o,this.boundingRect.height=s):(this.visiblePlots=[],this.boundingRect.width=0,this.boundingRect.height=0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(this.visiblePlots.length===0)return[];let{fontSize:e,markerSize:t,markerSpacing:n,itemSpacing:r}=F(this.chartConfig.legendFontSize),i=e+r,a=this.boundingRect.x+this.chartConfig.legendPadding,o=this.boundingRect.y+this.chartConfig.legendPadding,s=[],c=[];for(let[e,n]of this.visiblePlots.entries())if(T(n))s.push({x:a,y:o+e*i,width:t,height:t,fill:n.fill,strokeFill:n.fill,strokeWidth:0});else{let r=o+e*i+t/2;c.push({path:`M ${a},${r} L ${a+t},${r}`,strokeFill:n.strokeFill,strokeWidth:n.strokeWidth})}return[{groupTexts:[`legend`,`markers`],type:`rect`,data:s},{groupTexts:[`legend`,`markers`],type:`path`,data:c},{groupTexts:[`legend`,`label`],type:`text`,data:this.visiblePlots.map((r,s)=>({text:r.title,x:a+t+n,y:o+s*i+t/2,fill:this.chartThemeConfig.legendTextColor,fontSize:e,rotation:0,verticalPos:`middle`,horizontalPos:`left`}))}]}};function I(e,t,n,r){return new ae(new O(r),e,t,n)}e(I,`getChartLegendComponent`);var oe=class{constructor(e,t,n,r,i){this.plotData=e,this.xAxis=t,this.yAxis=n,this.orientation=r,this.plotIndex=i}static{e(this,`LinePlot`)}getDrawableElement(){let e=this.plotData.data.map(e=>[this.xAxis.getScaleValue(e[0]),this.yAxis.getScaleValue(e[1])]),t;if(t=this.orientation===`horizontal`?v().y(e=>e[0]).x(e=>e[1])(e):v().x(e=>e[0]).y(e=>e[1])(e),!t)return[];let n=[{groupTexts:[`plot`,`line-plot-${this.plotIndex}`],type:`path`,data:[{path:t,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}];if(this.plotData.pointLabels&&this.plotData.pointLabels.length>0){let t=[];for(let[n,[r,i]]of e.entries()){let e=this.plotData.pointLabels[n];e&&(this.orientation===`horizontal`?t.push({x:i+10,y:r,text:e,fill:this.plotData.strokeFill,verticalPos:`middle`,horizontalPos:`left`,fontSize:12,rotation:0}):t.push({x:r,y:i-10,text:e,fill:this.plotData.strokeFill,verticalPos:`middle`,horizontalPos:`center`,fontSize:12,rotation:0}))}t.length>0&&n.push({groupTexts:[`plot`,`line-plot-${this.plotIndex}`,`labels`],type:`text`,data:t})}return n}},se=class{constructor(e,t,n,r,i,a){this.barData=e,this.boundingRect=t,this.xAxis=n,this.yAxis=r,this.orientation=i,this.plotIndex=a}static{e(this,`BarPlot`)}getDrawableElement(){let e=this.barData.data.map(e=>[this.xAxis.getScaleValue(e[0]),this.yAxis.getScaleValue(e[1])]),t=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*.95,n=t/2;return this.orientation===`horizontal`?[{groupTexts:[`plot`,`bar-plot-${this.plotIndex}`],type:`rect`,data:e.map(e=>({x:this.boundingRect.x,y:e[0]-n,height:t,width:e[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:[`plot`,`bar-plot-${this.plotIndex}`],type:`rect`,data:e.map(e=>({x:e[0]-n,y:e[1],width:t,height:this.boundingRect.y+this.boundingRect.height-e[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}},ce=class{constructor(e,t,n){this.chartConfig=e,this.chartData=t,this.chartThemeConfig=n,this.boundingRect={x:0,y:0,width:0,height:0}}static{e(this,`BasePlot`)}setAxes(e,t){this.xAxis=e,this.yAxis=t}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error(`Axes must be passed to render Plots`);let e=[];for(let[t,n]of this.chartData.plots.entries())switch(n.type){case`line`:{let r=new oe(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,t);e.push(...r.getDrawableElement())}break;case`bar`:{let r=new se(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,t);e.push(...r.getDrawableElement())}}return e}};function le(e,t,n){return new ce(e,t,n)}e(le,`getPlotComponent`);var ue=class{constructor(e,t,n,r){this.chartConfig=e,this.chartData=t,this.componentStore={title:P(e,t,n,r),plot:le(e,t,n),legend:I(e,t,n,r),xAxis:N(t.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},r),yAxis:N(t.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},r)}}static{e(this,`Orchestrator`)}calculateVerticalSpace(){let e=this.chartConfig.width,t=this.chartConfig.height,n=0,r=0,i={width:0,height:0},a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),o=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),s=this.componentStore.plot.calculateSpace({width:a,height:o});e-=s.width,t-=s.height,s=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:t}),r=s.height,t-=s.height,this.componentStore.xAxis.setAxisPosition(`bottom`),s=this.componentStore.xAxis.calculateSpace({width:e,height:t}),t-=s.height,this.componentStore.yAxis.setAxisPosition(`left`),s=this.componentStore.yAxis.calculateSpace({width:e,height:t}),n=s.width,e-=s.width,i=this.componentStore.legend.calculateSpace({width:e,height:o}),e-=i.width,e>0&&(a+=e,e=0),t>0&&(o+=t,t=0),this.componentStore.plot.calculateSpace({width:a,height:o}),this.componentStore.plot.setBoundingBoxXY({x:n,y:r}),this.componentStore.title.alignTo(n,n+a),this.componentStore.legend.setBoundingBoxXY({x:n+a,y:r+Math.max((o-i.height)/2,0)}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:r+o}),this.componentStore.yAxis.setRange([r,r+o]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:r}),this.chartData.plots.some(e=>T(e))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,t=this.chartConfig.height,n=0,r=0,i=0,a={width:0,height:0},o=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),c=this.componentStore.plot.calculateSpace({width:o,height:s});e-=c.width,t-=c.height,c=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:t}),n=c.height,t-=c.height,this.componentStore.xAxis.setAxisPosition(`left`),c=this.componentStore.xAxis.calculateSpace({width:e,height:t}),e-=c.width,r=c.width,this.componentStore.yAxis.setAxisPosition(`top`),c=this.componentStore.yAxis.calculateSpace({width:e,height:t}),t-=c.height,i=n+c.height,a=this.componentStore.legend.calculateSpace({width:e,height:s}),e-=a.width,e>0&&(o+=e,e=0),t>0&&(s+=t,t=0),this.componentStore.plot.calculateSpace({width:o,height:s}),this.componentStore.plot.setBoundingBoxXY({x:r,y:i}),this.componentStore.title.alignTo(r,r+o),this.componentStore.legend.setBoundingBoxXY({x:r+o,y:i+Math.max((s-a.height)/2,0)}),this.componentStore.yAxis.setRange([r,r+o]),this.componentStore.yAxis.setBoundingBoxXY({x:r,y:n}),this.componentStore.xAxis.setRange([i,i+s]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(e=>T(e))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation===`horizontal`?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let t of Object.values(this.componentStore))e.push(...t.getDrawableElements());return e}},de=class{static{e(this,`XYChartBuilder`)}static build(e,t,n,r){return new ue(e,t,n,r).getDrawableElement()}},L=0,R,z=K(),B=G(),V=q(),H=B.plotColorPalette.split(`,`).map(e=>e.trim()),U=!1,W=!1;function G(){let e=r(),t=f();return _(e.xyChart,t.themeVariables.xyChart)}e(G,`getChartDefaultThemeConfig`);function K(){let e=f();return _(l.xyChart,e.xyChart)}e(K,`getChartDefaultConfig`);function q(){return{yAxis:{type:`linear`,title:``,min:1/0,max:-1/0},xAxis:{type:`band`,title:``,categories:[]},title:``,plots:[]}}e(q,`getChartDefaultData`);function J(e){let t=f();return p(e.trim(),t)}e(J,`textSanitizer`);function Y(e){R=e}e(Y,`setTmpSVGG`);function fe(e){e===`horizontal`?z.chartOrientation=`horizontal`:z.chartOrientation=`vertical`}e(fe,`setOrientation`);function pe(e){V.xAxis.title=J(e.text)}e(pe,`setXAxisTitle`);function X(e,t){V.xAxis={type:`linear`,title:V.xAxis.title,min:e,max:t},U=!0}e(X,`setXAxisRangeData`);function me(e){V.xAxis={type:`band`,title:V.xAxis.title,categories:e.map(e=>J(e.text))},U=!0}e(me,`setXAxisBand`);function he(e){V.yAxis.title=J(e.text)}e(he,`setYAxisTitle`);function Z(e,t){V.yAxis={type:`linear`,title:V.yAxis.title,min:e,max:t},W=!0}e(Z,`setYAxisRangeData`);function ge(e){let t=Math.min(...e),n=Math.max(...e),r=D(V.yAxis)?V.yAxis.min:1/0,i=D(V.yAxis)?V.yAxis.max:-1/0;V.yAxis={type:`linear`,title:V.yAxis.title,min:Math.min(r,t),max:Math.max(i,n)}}e(ge,`setYAxisRangeFromPlotData`);function Q(e){let t=[];if(e.length===0)return t;if(!U){let t=D(V.xAxis)?V.xAxis.min:1/0,n=D(V.xAxis)?V.xAxis.max:-1/0;X(Math.min(t,1),Math.max(n,e.length))}if(E(V.xAxis)&&e.length>V.xAxis.categories.length&&(e=e.slice(0,V.xAxis.categories.length)),W||ge(e),E(V.xAxis)&&(t=V.xAxis.categories.map((t,n)=>[t,e[n]])),D(V.xAxis)){let n=V.xAxis.min,r=V.xAxis.max;if(e.length===1)t=[[`${n}`,e[0]]];else{let i=(r-n)/(e.length-1);t=e.map((e,t)=>[`${n+t*i}`,e])}}return t}e(Q,`transformDataWithoutCategory`);function $(e){return H[e===0?0:e%H.length]}e($,`getPlotColorFromPalette`);function _e(e,t){let n=t.map(e=>e.value),r=t.map(e=>e.label?J(e.label):``),i=Q(n),a=r.some(e=>e!==``);V.plots.push({type:`line`,title:J(e.text),strokeFill:$(L),strokeWidth:2,data:i,...a?{pointLabels:r}:{}}),L++}e(_e,`setLineData`);function ve(e,t){let n=Q(t.map(e=>e.value));V.plots.push({type:`bar`,title:J(e.text),fill:$(L),data:n}),L++}e(ve,`setBarData`);function ye(){if(V.plots.length===0)throw Error(`No Plot to render, please provide a plot with some data`);return V.title=n(),de.build(z,V,B,R)}e(ye,`getDrawableElem`);function be(){return B}e(be,`getChartThemeConfig`);function xe(){return z}e(xe,`getChartConfig`);function Se(){return V}e(Se,`getXYChartData`);var Ce={parser:w,db:{getDrawableElem:ye,clear:e(function(){s(),L=0,z=K(),V=q(),B=G(),H=B.plotColorPalette.split(`,`).map(e=>e.trim()),U=!1,W=!1},`clear`),setAccTitle:a,getAccTitle:d,setDiagramTitle:u,getDiagramTitle:n,getAccDescription:o,setAccDescription:i,setOrientation:fe,setXAxisTitle:pe,setXAxisRangeData:X,setXAxisBand:me,setYAxisTitle:he,setYAxisRangeData:Z,setLineData:_e,setBarData:ve,setTmpSVGG:Y,getChartThemeConfig:be,getChartConfig:xe,getXYChartData:Se},renderer:{draw:e((n,r,i,a)=>{let o=a.db,s=o.getChartThemeConfig(),l=o.getChartConfig(),u=o.getXYChartData().plots[0].data.map(e=>e[1]);function d(e){return e===`top`?`text-before-edge`:`middle`}e(d,`getDominantBaseLine`);function f(e){return e===`left`?`start`:e===`right`?`end`:`middle`}e(f,`getTextAnchor`);function p(e){return`translate(${e.x}, ${e.y}) rotate(${e.rotation||0})`}e(p,`getTextTransformation`),t.debug(`Rendering xychart chart
|
|
7
|
+
`+n);let m=b(r),h=m.append(`g`).attr(`class`,`main`),g=h.append(`rect`).attr(`width`,l.width).attr(`height`,l.height).attr(`class`,`background`);c(m,l.height,l.width,!0),m.attr(`viewBox`,`0 0 ${l.width} ${l.height}`),g.attr(`fill`,s.backgroundColor),o.setTmpSVGG(m.append(`g`).attr(`class`,`mermaid-tmp-group`));let _=o.getDrawableElem(),v={};function y(e){let t=h,n=``;for(let[r]of e.entries()){let i=h;r>0&&v[n]&&(i=v[n]),n+=e[r],t=v[n],t||=v[n]=i.append(`g`).attr(`class`,e[r])}return t}e(y,`getGroup`);for(let t of _){if(t.data.length===0)continue;let n=y(t.groupTexts);switch(t.type){case`rect`:if(n.selectAll(`rect`).data(t.data).enter().append(`rect`).attr(`x`,e=>e.x).attr(`y`,e=>e.y).attr(`width`,e=>e.width).attr(`height`,e=>e.height).attr(`fill`,e=>e.fill).attr(`stroke`,e=>e.strokeFill).attr(`stroke-width`,e=>e.strokeWidth),l.showDataLabel){let r=l.showDataLabelOutsideBar;if(l.chartOrientation===`horizontal`){let i=function(e,t){let{data:n,label:r}=e;return t*r.length*a<=n.width-o};e(i,`fitsHorizontally`);let a=.7,o=10,c=t.data.map((e,t)=>({data:e,label:u[t].toString()})).filter(e=>e.data.width>0&&e.data.height>0),l=c.map(e=>{let{data:t}=e,n=t.height*.7;for(;!i(e,n)&&n>0;)--n;return n}),d=Math.floor(Math.min(...l)),f=e(e=>r?e.data.x+e.data.width+10:e.data.x+e.data.width-10,`determineLabelXPosition`);n.selectAll(`text`).data(c).enter().append(`text`).attr(`x`,f).attr(`y`,e=>e.data.y+e.data.height/2).attr(`text-anchor`,r?`start`:`end`).attr(`dominant-baseline`,`middle`).attr(`fill`,s.dataLabelColor).attr(`font-size`,`${d}px`).text(e=>e.label)}else{let i=function(e,t,n){let{data:r,label:i}=e,a=t*i.length*.7,o=r.x+r.width/2,s=o-a/2,c=o+a/2,l=s>=r.x&&c<=r.x+r.width,u=r.y+n+t<=r.y+r.height;return l&&u};e(i,`fitsInBar`);let a=t.data.map((e,t)=>({data:e,label:u[t].toString()})).filter(e=>e.data.width>0&&e.data.height>0),o=a.map(e=>{let{data:t,label:n}=e,r=t.width/(n.length*.7);for(;!i(e,r,10)&&r>0;)--r;return r}),c=Math.floor(Math.min(...o)),l=e(e=>r?e.data.y-10:e.data.y+10,`determineLabelYPosition`);n.selectAll(`text`).data(a).enter().append(`text`).attr(`x`,e=>e.data.x+e.data.width/2).attr(`y`,l).attr(`text-anchor`,`middle`).attr(`dominant-baseline`,r?`auto`:`hanging`).attr(`fill`,s.dataLabelColor).attr(`font-size`,`${c}px`).text(e=>e.label)}}break;case`text`:n.selectAll(`text`).data(t.data).enter().append(`text`).attr(`x`,0).attr(`y`,0).attr(`fill`,e=>e.fill).attr(`font-size`,e=>e.fontSize).attr(`dominant-baseline`,e=>d(e.verticalPos)).attr(`text-anchor`,e=>f(e.horizontalPos)).attr(`transform`,e=>p(e)).text(e=>e.text);break;case`path`:n.selectAll(`path`).data(t.data).enter().append(`path`).attr(`d`,e=>e.path).attr(`fill`,e=>e.fill?e.fill:`none`).attr(`stroke`,e=>e.strokeFill).attr(`stroke-width`,e=>e.strokeWidth)}}},`draw`)}};export{Ce as diagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{t as i}from"./isSameWeek-2ftYGvBT.js";import{Et as a}from"./index-DoqlyejP.js";var o={lessThanXSeconds:{one:`不到 1 秒`,other:`不到 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分钟`,lessThanXMinutes:{one:`不到 1 分钟`,other:`不到 {{count}} 分钟`},xMinutes:{one:`1 分钟`,other:`{{count}} 分钟`},xHours:{one:`1 小时`,other:`{{count}} 小时`},aboutXHours:{one:`大约 1 小时`,other:`大约 {{count}} 小时`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大约 1 个星期`,other:`大约 {{count}} 个星期`},xWeeks:{one:`1 个星期`,other:`{{count}} 个星期`},aboutXMonths:{one:`大约 1 个月`,other:`大约 {{count}} 个月`},xMonths:{one:`1 个月`,other:`{{count}} 个月`},aboutXYears:{one:`大约 1 年`,other:`大约 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超过 1 年`,other:`超过 {{count}} 年`},almostXYears:{one:`将近 1 年`,other:`将近 {{count}} 年`}},s=(e,t,n)=>{let r,i=o[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`内`:r+`前`:r},c={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})};function l(e,t,n){return i(e,t,n)?`eeee p`:e.getTime()>t.getTime()?`'下个'eeee p`:`'上个'eeee p`}var u={lastWeek:l,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:l,other:`PP p`},d={code:`zh-CN`,formatDistance:s,formatLong:c,formatRelative:(e,t,n,r)=>{let i=u[e];return typeof i==`function`?i(t,n,r):i},localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n.toString()+`日`;case`hour`:return n.toString()+`时`;case`minute`:return n.toString()+`分`;case`second`:return n.toString()+`秒`;default:return`第 `+n.toString()}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一季`,`第二季`,`第三季`,`第四季`],wide:[`第一季度`,`第二季度`,`第三季度`,`第四季度`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`周日`,`周一`,`周二`,`周三`,`周四`,`周五`,`周六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|时|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t.today&&(i=`今天,${i}`),t.selected&&(i=`${i},已选择`),i},labelMonthDropdown:`选择月份`,labelNext:`前往下个月`,labelPrevious:`前往上个月`,labelWeekNumber:e=>`第 ${e} 周`,labelYearDropdown:`选择年份`,labelGrid:(e,t,n)=>(n??new a(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t?.today&&(i=`今天,${i}`),i},labelNav:`导航栏`,labelWeekNumberHeader:`周数`,labelWeekday:(e,t,n)=>(n??new a(t)).format(e,`cccc`)}};export{d as zhCN};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,H as t,N as n}from"./core-jXc03Sty.js";var r=()=>{let r={string:{unit:`字符`,verb:`包含`},file:{unit:`字节`,verb:`包含`},array:{unit:`项`,verb:`包含`},set:{unit:`项`,verb:`包含`},map:{unit:`项`,verb:`包含`}};function i(e){return r[e]??null}let a={regex:`输入`,email:`电子邮件`,url:`URL`,emoji:`表情符号`,uuid:`UUID`,uuidv4:`UUIDv4`,uuidv6:`UUIDv6`,nanoid:`nanoid`,guid:`GUID`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ULID`,xid:`XID`,ksuid:`KSUID`,datetime:`ISO日期时间`,date:`ISO日期`,time:`ISO时间`,duration:`ISO时长`,ipv4:`IPv4地址`,ipv6:`IPv6地址`,mac:`MAC地址`,cidrv4:`IPv4网段`,cidrv6:`IPv6网段`,base64:`base64编码字符串`,base64url:`base64url编码字符串`,json_string:`JSON字符串`,e164:`E.164号码`,credit_card:`信用卡号`,currency_code:`货币代码`,iban:`IBAN`,jwt:`JWT`,template_literal:`输入`},o={nan:`NaN`,number:`数字`,array:`数组`,null:`空值(null)`};return r=>{switch(r.code){case`invalid_type`:{let e=o[r.expected]??r.expected,n=t(r.input),i=o[n]??n;return/^[A-Z]/.test(r.expected)?`无效输入:期望 instanceof ${r.expected},实际接收 ${i}`:`无效输入:期望 ${e},实际接收 ${i}`}case`invalid_value`:return r.values.length===1?`无效输入:期望 ${e(r.values[0])}`:`无效选项:期望以下之一 ${n(r.values,`|`)}`;case`too_big`:{let e=r.inclusive?`<=`:`<`,t=i(r.origin);return t?`数值过大:期望 ${r.origin??`值`} ${e}${r.maximum.toString()} ${t.unit??`个元素`}`:`数值过大:期望 ${r.origin??`值`} ${e}${r.maximum.toString()}`}case`too_small`:{let e=r.inclusive?`>=`:`>`,t=i(r.origin);return t?`数值过小:期望 ${r.origin} ${e}${r.minimum.toString()} ${t.unit}`:`数值过小:期望 ${r.origin} ${e}${r.minimum.toString()}`}case`invalid_format`:{let e=r;return e.format===`starts_with`?`无效字符串:必须以 "${e.prefix}" 开头`:e.format===`ends_with`?`无效字符串:必须以 "${e.suffix}" 结尾`:e.format===`includes`?`无效字符串:必须包含 "${e.includes}"`:e.format===`regex`?`无效字符串:必须满足正则表达式 ${e.pattern}`:`无效${a[e.format]??r.format}`}case`not_multiple_of`:return`无效数字:必须是 ${r.divisor} 的倍数`;case`unrecognized_keys`:return`出现未知的键(key): ${n(r.keys,`, `)}`;case`invalid_key`:return`${r.origin} 中的键(key)无效`;case`invalid_union`:return`无效输入`;case`invalid_element`:return`${r.origin} 中包含无效值(value)`;default:return`无效输入`}}};function i(){return{localeError:r()}}export{i as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={common:{status:{backlog:`待规划`,todo:`待处理`,in_progress:`进行中`,in_review:`审核中`,done:`已完成`,cancelled:`已取消`},priority:{urgent:`紧急`,high:`高`,medium:`中`,low:`低`,none:`无优先级`},kind:{feature:`功能`,bug:`缺陷`,chore:`杂项`,research:`调研`,documentation:`文档`},difficulty:{low:`低`,med:`中`,high:`高`,none:`无难度`},role:{reader:`只读`,writer:`可编辑`,admin:`管理员`},permission:{ticket:{write:{label:`编辑工单`,description:`创建、编辑、移动、认领和评论工单;创建项目`},delete:{label:`删除工单`,description:`永久删除工单`}},project:{manage:{label:`管理项目`,description:`项目详情、工作流、标签、字段、集成和生命周期`}},member:{manage:{label:`管理成员`,description:`添加、更改和移除成员`}},invitation:{manage:{label:`管理邀请`,description:`通过邮箱邀请成员`}},sharing:{manage:{label:`管理共享`,description:`公开只读链接和日历订阅源`}},workspace:{manage:{label:`管理工作区`,description:`工作区详情、共享标签和角色`}}},customFieldType:{text:`文本`,number:`数字`,date:`日期`,checkbox:`复选框`,select:`单选`,multiselect:`多选`},customField:{removedOption:`已移除的选项`,checked:`是`},filterField:{status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,label:`标签`,assigneeId:`负责人`,customField:`字段`},sort:{priority:`优先级`,updated:`最近更新`,created:`最近创建`,title:`标题`,labels:`标签`,due:`截止日期`,start:`开始日期`,number:`工单编号`,status:`状态`,difficulty:`难度`,kind:`类型`,assignee:`负责人`,manual:`手动`},due:{overdue:`已逾期`,today:`今天截止`,week:`本周截止`,scheduled:`有截止日期`,none:`无截止日期`},relation:{blocks:{outgoing:`阻塞`,incoming:`被阻塞于`},related:{outgoing:`相关`,incoming:`相关`},duplicate:{outgoing:`重复于`,incoming:`被重复于`},causes:{outgoing:`导致`,incoming:`由其导致`},clones:{outgoing:`克隆自`,incoming:`被克隆为`},implements:{outgoing:`实现`,incoming:`由其实现`},reviews:{outgoing:`审核`,incoming:`由其审核`}},remoteKind:{branch:`分支`,pull_request:`拉取请求`,issue:`议题`},notificationCategory:{assignment:`分配`,status:`状态变更`,comment:`评论`,mention:`提及`,update:`其他更新`,due_soon:`即将截止`,overdue:`已逾期`},destinationEvent:{created:`新工单`},deliveryKind:{email:`电子邮件`,webhook:`Webhook`},change:{pull_request:{name:`拉取请求`,opened:`拉取请求已打开`,draft:`草稿拉取请求`,merged:`拉取请求已合并`,closed:`拉取请求未合并即关闭`},merge_request:{name:`合并请求`,opened:`合并请求已打开`,draft:`草稿合并请求`,merged:`合并请求已合并`,closed:`合并请求未合并即关闭`},branchCreated:`分支已创建`},issueLinkState:{active:`同步中`,paused:`已暂停`,review:`需要审核`,creating:`正在创建议题`,unknown:`创建未确认`},importStatus:{previewed:`可以导入`,running:`导入中`,completed:`已导入`,failed:`失败`,cancelled:`已取消`},importProvider:{linear:{project:`团队`,setup:`在 Linear 的 Settings › Security & access 中创建个人 API 密钥,只读权限即可。`},jira:{project:`项目`,setup:`Jira Cloud 使用账户邮箱和在 id.atlassian.com 创建的 API 令牌登录;Data Center 和 Server 使用个人访问令牌。拥有项目的浏览权限即可。`},trello:{project:`看板`,setup:`使用你在 trello.com/power-ups/admin 管理的 Power-Up 的 API 密钥及为其生成的令牌,只读权限即可。`},plane:{project:`项目`,setup:`在 Plane 的 Profile settings › Personal access tokens 中创建个人访问令牌。Plane Cloud 的 API 地址为 https://api.plane.so;工作区 URL 标识是其网址的第一部分。`},planka:{project:`看板`,setup:`使用可以打开该看板的 PLANKA 账户登录;Kanvil 打开的会话在读取结束后即关闭。PLANKA 2 管理员也可以改为签发 API 密钥。`},kaneo:{project:`项目`,setup:`在 Kaneo 的 Settings › Account › Developer 中创建 API 密钥。`}},plankaSignIn:{password:`用户名和密码`,api_key:`API 密钥`},jiraEdition:{cloud:`Cloud`,data_center:`Data Center 或 Server`},event:{label:{created:`标签已创建`,updated:`标签已更新`,deleted:`标签已删除`},workflow:{created:`工作流状态已添加`,updated:`工作流状态已更改`,deleted:`工作流状态已移除`},custom_field:{created:`字段已创建`,updated:`字段已更新`,deleted:`字段已删除`},ticket:{created:`工单已创建`,updated:`工单已更新`,deleted:`工单已删除`,moved:`从其他项目移入`,moved_away:`已移至其他项目`,due_soon:`即将截止`,overdue:`已逾期`,claimed:`工作已认领`},claim:{renewed:`认领已续期`,released:`认领已释放`,recovered:`认领已收回`},comment:{created:`已添加评论`,updated:`评论已编辑`,deleted:`评论已删除`},relation:{added:`已添加关联`,removed:`已移除关联`},attachment:{created:`已附加文件`,deleted:`已移除文件`},evidence:{added:`已附加证据`},resource:{added:`已添加链接`,updated:`链接已编辑`,removed:`已移除链接`},calendar_feed:{created:`日历订阅源已创建`,revoked:`日历订阅源已撤销`},project:{created:`项目已创建`,updated:`项目已更新`,archived:`项目已归档`,restored:`项目已恢复`,transferred:`项目已移至其他工作区`,deleted:`项目已删除`},membership:{updated:`项目访问权限已更改`},workspace:{owner_changed:`工作区所有者已更改`},role:{created:`角色已创建`,updated:`角色已更改`,deleted:`角色已删除`},invitation:{updated:`邀请已更改`},destination:{created:`已添加目标`,updated:`目标已更改`,deleted:`已移除目标`},repository:{connected:`仓库已连接`,updated:`仓库连接已更改`,disconnected:`仓库已断开连接`,received:`已收到仓库 Webhook`},issue_link:{updated:`议题同步已更改`}},error:{network:`无法连接到 Kanvil。请检查网络连接后重试。`,fallback:`无法完成请求`,input:`输入`,code:{unauthorized:`请登录以继续。`,session_required:`此操作需要使用已登录的账户。`,account_disabled:`此账户已停用。`,forbidden:`你没有执行此操作的权限。`,insufficient_scope:`此凭据不允许执行此操作。`,workspace_scope_required:`此操作需要使用拥有工作区访问权限的账户。`,invalid_origin:`不允许此来源。`,not_found:`未找到此项,或你无权查看。`,version_conflict:`加载后此内容已被更改。请重新加载后重试。`,claim_conflict:`另一个执行者已认领此工单。`,idempotency_conflict:`此请求已用于另一项更改。`,project_archived:`请先恢复已归档的项目再进行更改。`,rate_limited:`短时间内更改过多。请稍后重试。`,snapshot_required:`实时数据流已落后。请重新加载以继续。`,request_failed:`无法完成请求`}},action:{add:`添加`,apply:`应用`,back:`返回`,cancel:`取消`,clear:`清除`,close:`关闭`,confirm:`确认`,continue:`继续`,copy:`复制`,create:`创建`,delete:`删除`,done:`完成`,edit:`编辑`,open:`打开`,remove:`移除`,rename:`重命名`,reset:`重置`,retry:`重试`,save:`保存`,search:`搜索`},state:{copied:`已复制`,loading:`加载中…`,saved:`已保存`,saving:`保存中…`,none:`无`,unassigned:`未分配`},evidenceKind:{pull_request:`拉取请求`,test:`测试`,review:`审核`,deployment:`部署`,device:`设备`,other:`其他`},evidenceOutcome:{reported:`已报告`,pending:`待定`,passed:`通过`,failed:`失败`},readinessReason:{project_archived:`项目已归档`,not_open:`工单必须处于待处理状态且未归档`,not_enabled:`尚未启用智能体工作`,missing_description:`添加描述`,missing_acceptance_criteria:`添加验收标准`,missing_difficulty:`选择难度`,duplicate:`此工单已标记为重复`,claim_recovery_required:`收回所有权前,请确认之前的执行者已停止`,claimed:`已被 {{worker}} 认领`,dependency:`{{key}} 尚未完成`},person:{deleted:`已删除的账户`,former:`前成员`},signIn:{codeTitle:`使用验证码登录`,resetTitle:`重置密码`,codeSent:`如果 {{email}} 有账户,验证码已在发送途中。验证码 10 分钟后过期。`,code:`验证码`,newPassword:`新密码`,sendCode:`通过邮件发送验证码`,back:`返回登录`,resend:`重新发送验证码`,resent:`已重新发送验证码`,emailCode:`通过邮件发送登录验证码`,forgot:`忘记密码?`,resetDone:`密码已重置。请使用新密码登录。`,resetDoneTitle:`密码已重置`,resetDoneBody:`请使用新密码登录。`,invalidCode:`该验证码错误、已使用或已过期。请重新发送以获取有效的验证码。`,localPassword:`本地密码`},language:{label:`语言`,system:`系统默认`}},shell:{ui:{showValue:`显示{{label}}`,hideValue:`隐藏{{label}}`,previousPage:`上一页{{noun}}`,nextPage:`下一页{{noun}}`,pageRange:`第 {{from}}–{{to}} 项,共 {{total}} 项`,priority:`{{label}}优先级`,working:`处理中…`,searchPlaceholder:`搜索…`,clearValue:`清除{{label}}`,copyValue:`复制{{label}}`,copied:`已复制{{value}}`},documentTitle:`{{name}} · Kanvil`,openKanvil:`打开 Kanvil`,page:{home:`首页`,myWork:`我的工作`,inbox:`收件箱`,search:`搜索`,settings:`设置`,planning:`规划`,ticket:`工单`,tickets:`工单`,projects:`项目`},connection:{restored:`连接已恢复`,lost:`连接已断开`,reconnecting:`正在重新连接…`,reload:`重新加载`,signIn:`登录以重新连接`},app:{skipToContent:`跳到内容`,assigned:`分配给你的`,openCount_other:`{{count, number}} 个未完成`,noAssigned:`没有分配给你的未完成工单`,allInMyWork_other:`在“我的工作”中查看全部 {{count, number}} 个`,openMyWork:`打开“我的工作”`,recentActivity:`最近动态`,noActivity:`暂无动态`,searchProjects:`搜索项目`,projectCount_other:`{{count, number}} 个项目`,noMatchingProjects:`没有匹配的项目`,clearSearch:`清除搜索`,noWorkspaces:`暂无工作区`,noActiveProjects:`没有活跃的项目`,noProjects:`暂无项目`,archivedProjects:`已归档的项目`,archived:`已归档`,noOpenTickets:`没有未完成的工单`,overdueCount_other:`{{count, number}} 个已逾期`,percentDone:`已完成 {{percent}}`,nextDue:`下次截止 <time/>`,projectSettingsFor:`{{name}} 的项目设置`,pageNotFound:`页面不存在`,openHome:`打开首页`,tryAgain:`重试`,adminRequired:`需要实例管理员权限`,projectNotFound:`项目不存在`,noWorkspaceSelected:`未选择工作区`},auth:{signIn:`登录`,createOwner:`创建所有者账户`,ownerHint:`第一个账户负责管理此实例。`,invitedHint:`请使用受邀的邮箱地址登录以接受邀请。`,signInWith:`使用 {{provider}} 登录`,useEmail:`使用邮箱和密码`,or:`或`,name:`名称`,setupToken:`设置令牌`,setupTokenHint:`使用实例配置中的 KANVIL_SETUP_TOKEN。`,email:`邮箱`,password:`密码`,signingIn:`正在登录…`,createAccount:`创建账户`,consent:{expired:`授权请求已过期。请重新连接客户端。`,title:`授权 {{client}}`,titleUnnamed:`授权客户端`,subtitle:`此客户端请求以你的账户身份访问。项目权限依然适用。`,deny:`拒绝`,allow:`允许访问`},invitation:{unavailable:`邀请不可用`,join:`加入 {{workspace}}`,invited:`受邀账户`,from:`邀请人`,access:`访问权限`,removedProjects:`已移除的项目`,wholeWorkspace:`整个工作区`,expires:`过期时间`,expired:`此邀请已过期。请向工作区管理员索取新的邀请。`,revoked:`此邀请已被撤销。请向工作区管理员索取新的邀请。`,accepted:`此邀请已被接受。请向工作区管理员索取新的邀请。`,wrongAccount:`你当前以 <account>{{current}}</account> 的身份登录。请以 {{invited}} 的身份登录以接受邀请。`,signOut:`退出登录`,joined:`已加入 {{workspace}}`,accept:`接受邀请`},callback:{cancelled:`登录已取消。准备好后请重试。`,linkedElsewhere:`此身份已关联到另一个 Kanvil 账户。请使用其他身份或联系管理员。`,notLinked:`此身份未关联到 Kanvil 账户。请使用本地账户登录,并在设置中关联。`,expired:`登录请求已过期或无法验证。请在此页面重试。`,emailMismatch:`无法关联身份提供方的邮箱。请联系管理员。`,failed:`无法完成登录。请重试或联系管理员。`}},you:`你`,inbox:{markAllRead:`全部标记为已读`,clearRead:`清除已读`,cleared_other:`已清除 {{count, number}} 条已读通知`,unread:`未读`,mentions:`提及`,all:`全部通知`,noUnread:`没有未读通知`,noMentions:`没有提及`,noNotifications:`没有通知`,markUnread:`标记为未读`,markRead:`标记为已读`,dismiss:`移除`},search:{field:`搜索工作区`,placeholder:`搜索工单、项目、评论、动态…`,tab:{all:`全部`,project:`项目`,ticket:`工单`,comment:`评论`,activity:`动态`},indexing:`外部搜索正在同步,工单结果暂时来自 PostgreSQL。`,empty:`搜索工单、项目、评论和动态`,noResults:`没有“{{query}}”的结果`,results:`搜索结果`,pages:`搜索结果分页`,previous:`上一页`,next:`下一页`,type:{project:`项目`,ticket:`工单`,comment:`评论`,activity:`动态`}},column:{key:`工单`,labels:`标签`,scopes:`范围`,status:`状态`,priority:`优先级`,difficulty:`难度`,kind:`类型`,assigneeId:`负责人`,startAt:`开始`,dueAt:`截止`,createdAt:`创建时间`,updatedAt:`更新时间`},public:{notShared:`此项目未共享`,notSharedHint:`该链接已关闭或从未存在。成员可登录后查看。`,noTickets:`没有工单`,ticketUnavailable:`工单不可用`,backToTickets:`返回工单`,description:`描述`,noDescription:`_暂无描述_`,acceptanceCriteria:`验收标准`,noAcceptanceCriteria:`_暂无验收标准_`,ticketProperties:`工单属性`,properties:`属性`,status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,startDate:`开始日期`,dueDate:`截止日期`,labels:`标签`,scopes:`范围`,created:`创建时间`,updated:`更新时间`,relationships:`关联`,parent:`父工单`,child:`子工单`},sidebar:{workspace:`工作区`,unread_other:`{{count, number}} 条未读`,userSettings:`用户设置`,administration:`管理`,signOut:`退出登录`,projectSettings:`项目设置`},workspace:{new:`新建工作区`,name:`工作区名称`,key:`工作区标识`,create:`创建工作区`,workspaces:`工作区`,switch:`切换工作区`,settings:`工作区设置`},palette:{open:`前往…`,title:`前往`,description:`查找项目、工单、页面或操作`,placeholder:`搜索工单、项目、页面、操作…`,searching:`搜索中…`,noResults:`没有结果`,jumpTo:`跳转到`,openKey:`在 {{project}} 中打开 {{key}}`,resultsIn:`{{workspace}} 中的结果`,results:`结果`,seeAll_other:`查看全部 {{count, number}} 个结果`,actions:`操作`,pages:`页面`,newTicketIn:`在 {{project}} 中新建工单`,myTicketsIn:`我在 {{project}} 中的工单`,lightMode:`切换到浅色模式`,darkMode:`切换到深色模式`,keywords:{jump:`{{query}} 跳转 打开`,allResults:`全部结果 {{query}}`,newTicket:`新建工单 创建`,myTickets:`我的工单 分配给我`,lightMode:`切换 浅色模式 主题 外观`,darkMode:`切换 深色模式 主题 外观`,help:`键盘快捷键 帮助`,home:`首页 概览 全部项目`,myWork:`我的工作 分配的工单`,search:`搜索 评论 动态 项目 工单`,inbox:`收件箱 通知`,settings:`设置 {{scope}} {{label}}`}},actionCategory:{general:`通用`,ticketList:`工单列表`,inbox:`收件箱`,ticket:`工单`,search:`搜索`,markdown:`Markdown`},action:{palette:`前往任意位置`,help:`键盘快捷键`,sidebar:`切换侧边栏`,newTicket:`新建工单`,search:`搜索工单`,highlight:`高亮下一个或上一个工单`,open:`打开高亮的工单`,preview:`在列表旁预览高亮的工单`,select:`选择高亮的工单`,properties:`设置高亮工单的状态、优先级或负责人`,inboxHighlight:`高亮下一条或上一条通知`,inboxOpen:`在收件箱旁查看高亮通知的工单`,inboxRead:`将高亮的通知标记为已读或未读`,inboxDismiss:`移除高亮的通知`,step:`打开下一个或上一个工单`,edit:`编辑工单`,save:`保存工单或评论`,results:`在搜索结果间移动`,insertBlock:`在可视化编辑器中插入表格、图表、文件或其他块`},move:{top:{label:`将高亮的工单移到顶部`,menu:`移到顶部`},up:{label:`将高亮的工单上移`,menu:`上移`},down:{label:`将高亮的工单下移`,menu:`下移`},bottom:{label:`将高亮的工单移到底部`,menu:`移到底部`},previous:{label:`将高亮的工单移到上一个状态`,menu:`移到上一个状态`},next:{label:`将高亮的工单移到下一个状态`,menu:`移到下一个状态`}},copy:{link:{label:`复制链接`,copied:`工单链接`},keyAndTitle:{label:`复制编号和标题`,copied:`工单`},title:{label:`复制标题`,copied:`标题`},markdown:{label:`复制为 Markdown`,copied:`Markdown`},branch:{label:`复制分支名称`,copied:`分支名称`}},settingsNav:{account:`账户`,settings:`设置`,workspace:`工作区`,workspaceSettings:`工作区设置`,projects:`项目`,projectSettings:`项目设置`,administration:`管理`,section:{profile:`个人资料与安全`,appearance:`外观`,preferences:`偏好设置`,credentials:`API 密钥`,notifications:`通知`,general:`常规`,members:`成员`,roles:`角色`,labels:`标签`,workflow:`工作流`,fields:`字段`,integrations:`集成`,calendar:`日历订阅源`,storage:`文件存储`,search:`搜索`,events:`事件投递`,users:`用户`,workspaces:`工作区`,authentication:`身份验证`}},browser:{copyFailed:`复制失败。请选中文本后手动复制。`,readFailed:`无法读取文件`,encodeFailed:`无法编码文件`,imageTooBig:`请选择小于 10 MB 的图片。`,cannotResize:`此浏览器无法调整图片尺寸。`,prepareFailed:`无法处理图片。`,stillTooLarge:`调整尺寸后图片仍然过大。请选择更简单的图片。`},primitive:{close:`关闭`,more:`更多`,breadcrumb:`面包屑导航`,sidebar:`侧边栏`,sidebarDescription:`显示移动端侧边栏。`,toggleSidebar:`切换侧边栏`,resizeSidebar:`调整侧边栏宽度`,expandSidebar:`展开侧边栏`,commandTitle:`命令面板`,commandDescription:`搜索要运行的命令…`}},ticket:{list:{selectSection:`选择{{section}}工单`,expandSection:`展开{{section}}工单`,collapseSection:`收起{{section}}工单`,sectionTickets:`{{section}}工单`,later:`以后`,selectAll:`选择所有显示的工单`,selectTicket:`选择 {{key}}`,title:`标题`,all:`全部`,planned:`已规划`,archived:`已归档`,allTickets:`全部工单`,customView:`自定义视图`,sectionCount:`{{n, number}} 个{{section}}`,planning:`{{project}} 规划`,collection:`{{source}}({{sections}})`,moved:`{{key}} 已移动`,movedTo:`{{key}} 已移到{{status}}`,movedAbove:`{{key}} 已移到 {{neighbor}} 上方`,movedBelow:`{{key}} 已移到 {{neighbor}} 下方`,movedToAbove:`{{key}} 已移到{{status}},位于 {{neighbor}} 上方`,movedToBelow:`{{key}} 已移到{{status}},位于 {{neighbor}} 下方`,emptyFiltered:`没有匹配的工单`,emptyPlanning:`没有已规划或已归档的工单`,emptyProject:`暂无工单`,emptyWork:`没有分配给你的未完成工单`,createFirst:`创建第一个工单`,activeWork:`进行中的工作`,views:`工单视图`,saveCurrentView:`保存当前视图`,deleteView:`删除视图 {{name}}`,deleteViewConfirm:`要从已保存的视图中移除 {{name}} 吗?工单不受影响。`,planningLink:`规划`,newTicketShortcut:`新建工单({{shortcut}})`,saveView:`保存视图`,viewSaved:`视图已保存`,viewName:`视图名称`,retry:`重新加载工单`,board:`工单看板`,tickets:`工单`,resizeColumn:`调整“{{column}}”列宽`,count_other:`{{count, number}} 个工单`,scheduledCount_other:`{{count, number}} 个已排期工单`},move:{destination:`目标`,projectPlaceholder:`移到项目…`,blockers:`移动前请先解决`,submit:`移动工单`,pending:`移动中…`},picker:{placeholder:`选择工单`,loading:`正在加载工单…`,searchLabel:`搜索{{label}}`,searchPlaceholder:`按标题或编号搜索…`,noParent:`无父工单`,searching:`搜索中…`,empty:`未找到工单`},property:{status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,assignee:`负责人`,you:`{{name}}(你)`,assignTo:`分配给…`,set:`设置{{label}}…`,search:`搜索{{label}}`,noMatches:`没有匹配项`},field:{mixed:`混合`,unchecked:`否`,noValue:`无值`},project:{label:`项目`,placeholder:`在项目中创建…`,search:`搜索项目`},tags:{labels:`标签`,scopes:`范围`,summary:`{{label}}:{{tags}}`,edit:`编辑{{label}}`,editValues:`编辑{{label}}:{{tags}}`,editMixed:`编辑{{label}}:混合`,mixed:`混合{{label}}`,none:`无{{label}}`,mixedNote:`所选工单的{{label}}各不相同。`,clear:`清除{{label}}`,replace:`替换{{label}}`},tagInput:{remove:`移除{{label}} {{tag}}`,addAnother:`再添加一个…`,add:`添加{{label}}…`,choose:`选择{{label}}`,chooseLabels:`选择标签`,searchPlaceholder:`搜索标签…`,searchLabel:`搜索项目标签`,empty:`没有匹配的标签`},link:{previewUnavailable:`无法预览`},userPicker:{label:`账户`,placeholder:`选择账户`,searchPlaceholder:`搜索名称或邮箱…`,searchLabel:`搜索账户`,useEmail:`使用 {{email}}`,emptyAnyAccount:`搜索成员,或输入现有账户的邮箱。`,empty:`没有匹配的成员`},date:{placeholder:`选择日期`,clear:`清除{{label}}`,start:`开始日期`,startShort:`开始`,noStart:`无开始日期`,due:`截止日期`,dueShort:`截止`,noDue:`无截止日期`},filter:{me:`我`,searchTickets:`搜索工单`,searchTicketsPlaceholder:`搜索工单…`,filters:`筛选`,filtersActive:`筛选({{active, number}})`,due:`截止`,anyDue:`任意截止日期`,archived:`已归档`,hideArchived:`隐藏已归档`,includeArchived:`包含已归档`,archivedOnly:`仅已归档`,includingArchived:`包含已归档`,reset:`重置筛选`,clear:`清除筛选`,active:`当前工单筛选`,searchChip:`搜索:{{query}}`,chipAny:`{{field}}:`,chipNone:`{{field}}不是:`,notValues:`不是 {{values}}`,match:`{{label}}匹配方式`,is:`是`,isNot:`不是`,searchPlaceholder:`{{search}}…`,anyValue:{status:`所有状态`,priority:`所有优先级`,kind:`所有类型`,difficulty:`所有难度`,label:`所有标签`,assigneeId:`任何人`,customField:`任意字段值`},searchValues:{status:`搜索状态`,priority:`搜索优先级`,kind:`搜索类型`,difficulty:`搜索难度`,label:`搜索标签`,assigneeId:`搜索人员`,customField:`搜索字段`}},display:{title:`显示`,orderBy:`排序方式`,direction:`方向`,ascending:`升序`,descending:`降序`,reset:`重置显示`,groupBy:`分组方式`,dueDate:`截止日期`,layout:`布局`,list:`列表`,board:`看板`,backgrounds:`项目背景`,show:`显示`,hide:`隐藏`,rowSpacing:`行间距`,compact:`紧凑`,comfortable:`宽松`,labelDisplay:`标签显示`,compactPreview:`紧凑预览`,allLabels:`全部标签`,properties:`属性`},selection:{region:`已选工单`,clear:`清除选择`,selected_other:`已选 {{count, number}} 个`,selectedOf_other:`{{count, number}} / {{total}}<wide> 已选</wide>`,applied_other:`已将{{label}}应用到 {{count, number}} 个工单`,partlyApplied_other:`已应用到 {{done, number}} / {{count, number}} 个工单`,mixedDue:`截止日期各不相同`,fields:`字段`,more:`更多操作`,moveTo:`移到{{status}}`,restoreChange:`恢复`,restore:`恢复所选`,archive:`归档所选`,delete:`删除所选`,deleteLimit:`一次最多删除 {{limit, number}} 个`,archiveConfirm_other:`要归档 {{collection}} 中的 {{count, number}} 个工单吗?`,deleteConfirm_other:`要永久删除 {{collection}} 中的 {{count, number}} 个工单及其评论、关联和附件吗?未选中的子工单将失去父工单。`,deleted_other:`已删除 {{count, number}} 个工单`},menu:{copied:`已复制{{label}}`,open:`打开工单`,preview:`预览`,newTab:`在新标签页中打开`,edit:`编辑工单`,editTitle:`编辑 {{key}}`,duplicate:`复制工单`,created:`已创建 {{key}}`,move:`移动`,moveToProject:`移到项目…`,moveTitle:`移动 {{key}}`,moved:`已移为 {{key}}`,follow:`关注工单`,unfollow:`取消关注工单`,archive:`归档工单`,unarchive:`取消归档工单`,delete:`删除工单`,deleteConfirm:`要永久删除 {{key}} 及其评论、关联和附件吗?`,openProject:`打开项目`,projectLink:`项目链接`,copyLink:`复制链接`,newTicket:`新建工单`,projectSettings:`项目设置`,manageAccount:`管理账户`,email:`邮箱`,copyEmail:`复制邮箱`},schedule:{range:`{{from}} – {{to}}`,calendar:`日历`,timeline:`时间线`,today:`今天`,previousMonth:`上个月`,nextMonth:`下个月`,previousWeeks:`前两周`,nextWeeks:`后两周`,emptyWeeks:`这几周没有排期`,monthTickets:`{{title}}的工单`,showDay_other:`显示 {{day}} 的全部 {{count, number}} 个工单`,more_other:`还有 {{count, number}} 个`,ticketColumn:`工单`,scheduledTickets:`已排期工单`},copy:{description:`描述`,acceptanceCriteria:`验收标准`}},detail:{field:{title:`标题`,description:`描述`,acceptanceCriteria:`验收标准`,parent:`父工单`,parentTicket:`父工单`,labels:`标签`,scopes:`范围`,holdReason:`搁置原因`,url:`URL`},page:{preview:`工单预览`,unavailable:`工单不可用`,noProject:`此链接未指明工单所属的项目。`,gone:`此工单已被删除,或你已无访问权限。`,closePreview:`关闭预览`,openFullPage:`在完整页面中打开`,backToTickets:`返回工单`,tickets:`工单`,previousTicket:`上一个工单`,previousTicketShortcut:`上一个工单(K)`,nextTicket:`下一个工单`,nextTicketShortcut:`下一个工单(J)`,position:`{{position, number}} / {{total, number}}`,subscribe:`订阅`,unsubscribe:`取消订阅`,subscribed:`已订阅更新`,unsubscribed:`已取消订阅`,archive:`归档工单`,unarchive:`取消归档工单`,archivedToast:`工单已归档`,unarchivedToast:`工单已取消归档`,archived:`已归档`,edit:`编辑工单`,editShortcut:`编辑工单(E)`,editTitle:`编辑 {{key}}`,actions:`工单操作`,copyKey:`复制工单编号`,keyCopied:`已复制 {{key}}`,noDescription:`_暂无描述_`,noAcceptanceCriteria:`_暂无验收标准_`,coordination:`工单协作`,properties:`属性`,created:`创建时间`,updated:`更新时间`},section:{discussion:`讨论`,evidence:`证据`,activity:`动态`},readiness:{heading:`智能体就绪状态`,ready:`可以认领`,notReady:`尚不可认领`,hold:`搁置:{{reason}}`,claimedUntil:`已被 <strong>{{worker}}</strong> 认领,直到 {{date}}。`},claim:{release:`释放我的认领`,releaseDescription:`确认执行者已停止写入后释放所有权?`,recover:`收回已过期的认领`,recoverHelp:`收回认领需要项目管理员权限,且认领已过期。请先停止执行者。`,reason:`收回原因`,confirmed:`我已确认执行者已停止`,submit:`收回所有权`},editor:{storageUnavailable:`此浏览器无法保存草稿。保存前请保持编辑器打开。`,saved:`{{key}} 已保存`,created:`{{key}} 已创建`,properties:`工单属性`,readyForAgents:`可供智能体处理`,readyForAgentsHelp:`在需求、阻塞项和所有权允许时,智能体可以认领此工单`,agents:`智能体`,notReady:`未就绪`,moreProperties:`更多属性`,holdPlaceholder:`为什么要暂缓工作?`,claimsNote:`认领仍取决于需求、阻塞项和当前所有权。`,restoreSize:`恢复编辑器大小`,expand:`展开编辑器`,staleTitle:`此工单已被更改。`,staleDescription:`你的草稿仍基于版本 {{version}};保存时需要使用当前版本。`,discardAndReload:`放弃草稿并重新加载`,titlePlaceholder:`工单标题`,descriptionPlaceholder:`添加背景、需求或复现步骤…`,criteriaPlaceholder:`- [ ] 如何确认已完成?`,removeCriteria:`移除验收标准`,addCriteria:`添加验收标准`,savedLocally:`草稿已保存在此设备上`,notSavedLocally:`无法保存草稿`,discardDraft:`放弃草稿`,createMore:`继续创建`,save:`保存工单`,create:`创建工单`},resource:{removeConfirm:`要移除 {{name}} 吗?`,uploading:`上传中…`},attachment:{heading:`附件`,tooLarge:`每个文件不能超过 10 MB。`,attached_other:`已附加 {{count, number}} 个文件`,attach:`附加文件`,emptyWritable:`暂无附件。将文件拖放到此处。`,empty:`暂无附件`,remove:`移除附件`,fileInput:`文件(最大 10 MB)`},evidence:{description:`处理此工单的人员和集成所报告的链接和结果。`,add:`添加证据`,empty:`暂无证据`,added:`证据已添加`,kindLabel:`类型`,outcomeLabel:`报告的结果`,commit:`提交(完整哈希)`,note:`备注`},link:{heading:`链接`,add:`添加链接`,edit:`编辑链接`,save:`保存链接`,remove:`移除链接`,empty:`暂无链接`,stateUnknown:`状态未知`,remote:`{{kind}} · {{state}}`,remoteState:{open:`打开`,closed:`已关闭`,merged:`已合并`,draft:`草稿`,active:`活跃`,deleted:`已删除`}},activity:{previous:`较早的动态`,next:`较新的动态`},relations:{heading:`关联`,add:`添加关联`,linkExisting:`关联现有工单`,newChild:`新建子工单`,newChildTitle:`{{key}} 的新子工单`,children:`子工单 <count>{{done, number}}/{{total, number}}</count>`,previousChildren:`上一组子工单`,nextChildren:`下一组子工单`,empty:`暂无关联`,type:`关联类型`,ticket:`工单`,statusOf:`{{key}} 的状态`,assigneeOf:`{{key}} 的负责人`,remove:{blocks:`移除阻塞关联`,related:`移除相关关联`,duplicate:`移除重复关联`,causes:`移除导致关联`,clones:`移除克隆关联`,implements:`移除实现关联`,reviews:`移除审核关联`}},discussion:{empty:`暂无评论`,previous:`较早的评论`,next:`较新的评论`,comment:`评论`,placeholder:`撰写评论…`,posting:`发布中…`,edited:`已编辑`,edit:`编辑评论`,delete:`删除评论`,deleteConfirm:`要永久删除此评论吗?`},markdown:{format:{heading:`标题`,bold:`粗体`,italic:`斜体`,link:`链接`,linkHelp:`为所选文本添加链接`,bullets:`无序列表`,numbers:`有序列表`,tasks:`任务列表`,code:`代码块`},formatting:`{{label}}格式`,editor:`{{label}}编辑器`,insertFile:`插入文件`,insertFileInto:`将文件插入{{label}}`,write:`编写`,visual:`可视化`,preview:`预览`,unsupported:`此文本使用了可视化编辑器无法保留的 Markdown,例如 HTML 或脚注。`,nothingToPreview:`没有可预览的内容`,mention:`提及成员`,insertBlock:`插入块`,block:{quote:`引用`,table:`表格`,diagram:`图表`,divider:`分隔线`,file:`文件`},table:{addRow:`添加行`,addColumn:`添加列`,deleteRow:`删除行`,deleteColumn:`删除列`,deleteTable:`删除表格`},linkAddress:`链接地址`,diagram:`图表`,diagramFailed:`无法绘制此图表:{{error}}`,diagramSource:`图表源代码`}},settings:{account:{title:`设置`,security:`登录与安全`,localPassword:`本地密码`,localPasswordDescription:`更改密码会让你的其他会话退出登录。`,changePassword:`更改密码`,oidcLinked:`可使用此身份提供方登录同一账户。`,oidcUnlinked:`通过此提供方登录前,请先关联你的账户。`,linked:`已关联`,link:`关联 {{name}}`,currentPassword:`当前密码`,newPassword:`新密码`,confirmPassword:`确认新密码`,passwordMismatch:`两次输入的新密码不一致。`,passwordUpdated:`密码已更新,其他会话已退出登录。`},preferences:{behavior:`行为`,languageDescription:`适用于此浏览器,包括登录页面。`,weekStart:`每周起始日`,weekStartDescription:`适用于所有日期选择器。`,weekStartLanguage:`跟随语言`,sidebar:`启动时的侧边栏`,sidebarDescription:`下次打开 Kanvil 时生效。`,sidebarLast:`保持上次状态`,sidebarExpanded:`展开`,sidebarCollapsed:`收起`,ticketLists:`工单列表`,reset:`重置偏好设置`,resetDescription:`将此浏览器中的这些选项恢复为默认值。`,resetDone:`偏好设置已重置`},notifications:{title:`通知`,inbox:`收件箱`,inboxDescription:`你关注的工单的更新会显示在 Kanvil 中。`,inboxSwitch:`在收件箱中接收已订阅工单的更新`,push:`推送通知`,pushDescription:`将更新发送到你已注册的设备。`,pushUnavailable:`此实例未启用推送。`,pushSwitch:`在已注册设备上接收推送通知`,categories:`类别`,categorySwitch:`{{label}}通知`,reminder:`即将截止提醒`,reminderDescription:`在关注的工单截止前多久提醒。`,reminderUnit:`提醒单位`,reminderAmount:`提醒数值`,unit:{minutes:`分钟`,hours:`小时`,days:`天`,weeks:`周`}},layout:{nav:`设置`,section:`设置分区`,nested:`{{parent}} · {{child}}`,name:`名称`,description:`描述`,descriptionPlaceholder:`添加描述`,noDescription:`暂无描述`,stale:`此内容已在其他地方被更改。请取消后重新开始。`},profile:{title:`个人资料`,displayName:`显示名称`,edit:`编辑个人资料`,changePhoto:`更换照片`,removePhoto:`移除照片`,photoFile:`头像文件`,photoUpdated:`照片已更新`,photoRemoved:`照片已移除`,saved:`个人资料已保存`},credentials:{title:`API 密钥`,description:`为脚本、集成和智能体提供可随时撤销的访问权限。`,create:`创建 API 密钥`,creating:`创建中…`,created:`API 密钥已创建`,name:`名称`,access:`访问权限`,projects:`项目`,expires:`过期时间`,actions:`操作`,unavailableProject:`不可用的项目`,untitled:`未命名密钥`,expired:`已过期`,disabled:`已停用`,custom:`自定义`,noProjects:`无项目访问权限`,never:`永不`,revoke:`撤销 API 密钥`,revokeNamed:`要撤销 {{name}} 吗?使用它的连接将立即失去访问权限。`,revokeUnnamed:`要撤销此 API 密钥吗?使用它的连接将立即失去访问权限。`,empty:`暂无 API 密钥`,emptyDescription:`当脚本、集成或智能体需要访问你的项目时,可创建密钥。`,copyNow:`请立即复制此密钥。之后将无法再次查看。`,newKey:`新 API 密钥`,copy:`复制 API 密钥`,noProjectTitle:`请先选择项目`,noProjectDescription:`API 密钥至少需要访问一个项目。`,goToProjects:`前往项目`,keyName:`密钥名称`,keyNamePlaceholder:`例如:发布自动化`,projectAccess:`项目访问权限`,findProject:`查找项目`,projectDescription:`{{key}} · {{workspace}}`,workspace:`工作区`,noMatches:`没有匹配的项目`,roleLimit:`此密钥的权限仍受你现有项目角色的限制。`,accessLevel:`访问级别`,preset:{read:`只读`,write:`读写`,automation:`读写及认领工作`,custom:`自定义权限`},permission:{read:{name:`读取工单`,description:`查看项目、工单、评论和附件。`},write:{name:`编辑工单`,description:`创建和更新工单、评论和附件。`},claim:{name:`认领工作`,description:`认领、续期和释放工单所有权。`},admin:{name:`管理项目`,description:`在角色允许的范围内更改项目设置和成员。`}},expiry:{7:`7 天`,30:`30 天`,90:`90 天`,365:`1 年`,custom:`自定义日期`,never:`永不过期`},expiresOn:`过期日期`,neverDescription:`密钥在你删除之前一直有效。`},calendarFeeds:{title:`日历订阅源`,new:`新建日历订阅源`,created:`日历订阅源已创建`,create:`创建订阅源`,adminOnly:`由项目管理员共享和撤销日历订阅源。`,labels:`标签`,everyLabel:`所有标签`,stopped:`· 已停止:创建者已失去访问权限`,revoke:`撤销 {{name}}`,revokeDescription:`订阅了 {{name}} 的日历将立即停止更新。工单不受影响。`,revoked:`日历订阅源已撤销`,empty:`暂无日历订阅源`,copyNow:`请立即将此链接复制到日历应用中。它只显示一次,任何拥有该链接的人都能查看共享的工单。`,link:`订阅源链接`,name:`订阅源名称`,onlyLabels:`仅包含带这些标签的工单`,explanation:`订阅源会将设有开始或截止日期的未完成、未归档工单列为 {{zone}} 时区的全天事件。任何拥有链接的人都能看到其编号、标题、状态、优先级和日期。`},project:{title:`项目设置`,edit:`编辑项目`,copyPrefix:`复制工单前缀`,saved:`项目已保存`,noOpenTickets:`没有未完成的工单`,openTickets_other:`{{count, number}} 个未完成工单`,overdueTickets_other:`· {{count, number}} 个已逾期`,created:`· 创建于 <time/>`,access:`项目访问权限`,accessWorkspace:`工作区成员根据其工作区角色获得访问权限。`,accessPrivate:`只有你添加的成员和工作区管理员可以查看此项目。`,accessUpdated:`项目访问权限已更新`,visibility:{workspace:`工作区内所有人`,private:`仅项目成员`},workspace:`工作区`,workspaceSettings:`工作区设置`,prefix:`工单前缀`,prefixDescription:`更改后,以前的前缀和工单编号仍然有效。`,changePrefix:`更改前缀`,changePrefixTitle:`更改工单前缀`,changePrefixDescription:`{{name}} 中的所有工单都将使用新前缀,并保留原编号。`,changing:`更改中…`,prefixChanged:`工单现在使用 {{key}}`,publicLink:`公开链接`,publicDisclosure:`任何拥有链接的人都能查看此项目中所有未归档工单的标题、描述、验收标准、状态、优先级、类型、难度、标签、范围、日期以及指向其他工单的链接。人员、评论、动态、附件、证据和认领保持私密。`,publicOn:`公开链接已开启`,publicOff:`公开链接已关闭`,off:`关闭`,copyPublicLink:`复制公开链接`,openPublic:`打开公开视图`,stopSharing:`停止共享`,share:`公开共享`,background:`背景`,backgroundDescription:`显示在此项目的工单列表和看板后面。`,backgroundUpdated:`背景已更新`,backgroundRemoved:`背景已移除`,currentBackground:`当前背景`,uploading:`上传中…`,replace:`替换`,upload:`上传图片`,backgroundFile:`项目背景文件`},tickets_other:`{{count, number}} 个工单`,moveUp:`上移 {{name}}`,moveDown:`下移 {{name}}`,workflow:{title:`工作流`,new:`新建状态`,edit:`编辑状态`,editNamed:`编辑状态 {{name}}`,deleteNamed:`删除状态 {{name}}`,onlyState:`{{name}} 是唯一的{{category}}状态`,saved:`状态已保存`,name:`状态名称`,category:`类别`,color:`状态颜色`,categoryChange:`其工单的状态将变为{{status}}。`,save:`保存状态`,delete:`删除状态`,deleteTitle:`删除 {{name}}`,deleted:`状态已删除`,reassign_other:`将 {{count, number}} 个工单移到`},labels:{title:`标签`,search:`搜索标签`,new:`新建标签`,edit:`编辑标签`,workspace:`工作区`,editNamed:`编辑标签 {{name}}`,deleteNamed:`删除标签 {{name}}`,deleteUsed_other:`要从 {{count, number}} 个工单(包括已归档工单)中移除 {{name}} 吗?使用此标签的已保存视图将移除其标签筛选。`,deleteUsedShared_other:`要从所有项目的 {{count, number}} 个工单(包括已归档工单)中移除 {{name}} 吗?使用此标签的已保存视图将移除其标签筛选。`,deleteUnused:`要删除未使用的标签 {{name}} 吗?使用它的已保存视图将移除其标签筛选。`,deleted:`标签已删除`,noMatches:`没有匹配的标签`,empty:`暂无标签`,saved:`标签已保存`,name:`标签名称`,color:`标签颜色`,rename:`重命名会同步更新工单和已保存视图中的此标签。`,renameShared:`重命名会同步更新所有项目中工单和已保存视图里的此标签。`,adopt:`采用项目标签`,adoptDescription:`已在 {{projects}} 中定义。其工单将保留此标签并采用此颜色。`,save:`保存标签`},fields:{title:`字段`,new:`新建字段`,edit:`编辑字段`,editNamed:`编辑字段 {{name}}`,deleteNamed:`删除字段 {{name}}`,deleteUsed_other:`要删除 {{name}} 并从 {{count, number}} 个工单(包括已归档工单)中移除其值吗?已保存视图将失去基于它的筛选。`,deleteUnused:`要删除未使用的字段 {{name}} 吗?已保存视图将失去基于它的筛选。`,deleted:`字段已删除`,empty:`暂无字段`,saved:`字段已保存`,required:`必填`,requiredDescription:`新工单必须填写此值。`,defaultValue:`默认值 {{value}}`,default:`默认值`,name:`字段名称`,type:`类型`,options:`选项`,option:`选项 {{number}}`,optionInline:`选项 {{number}}`,optionColor:`{{name}} 的颜色`,removeOption:`移除 {{name}}`,addOption:`添加选项`,reassign:`包含 {{name}} 的工单`,clearValue:`清除值`,moveTo:`移到 {{name}}`,save:`保存字段`},lifecycle:{archivedToast:`项目已归档`,restoredToast:`项目已恢复`,archivedNotice:`归档于 <time/> · 只读`,restore:`恢复`,archive:`归档`,archivedDescription:`归档于 <time/>。其工单为只读,且不会出现在列表、搜索、我的工作、日历订阅源和智能体队列中。`,archiveDescription:`将项目从列表、搜索、我的工作、日历订阅源和智能体队列中隐藏,并将其工单设为只读。历史记录会保留。`,archiveProject:`归档项目`,archiveConfirm:`在恢复之前,{{name}} 将从项目列表和智能体队列中移除。需先释放已认领的工单。`,blocker:`{{message}}:{{tickets}}`,row:{tickets:`工单`,losesAccess:`失去访问权限`,gainsAccess:`获得访问权限`,labelsCopied:`已复制的标签`,labelsMerged:`已合并的标签`,followsRemoved:`已移除的关注`,invitations:`邀请`,comments:`评论`,files:`文件`,kept:`保留`,projects:`项目`,members:`成员`,sharedLabels:`共享标签`,signIn:`登录`,sessions:`会话`,credentials:`凭据`,devices:`设备`,access:`访问权限`,claims:`认领`,imports:`导入`,profile:`个人资料`},transferTickets_other:`{{count, number}} 个,保留其编号和链接`,noOne:`无人`,transferInvitations_other:`{{count, number}} 个待处理邀请将不再包含此项目`,files_other:`{{count, number}} 个 · {{size}}`,keptProject_other:`{{count, number}} 条动态记录和 {{key}} 前缀`,keptWorkspace_other:`{{count, number}} 条动态记录和 {{slug}} URL 标识`,archivedProject:`已归档`,membersLoseAccess_other:`{{count, number}} 人失去访问权限;其账户保留`,pendingInvitations_other:`{{count, number}} 个待处理`,move:`移动`,moveTitle:`移动 {{name}}`,moved:`已移到 {{name}}`,movedUnnamed:`已移到该工作区`,destination:`目标工作区`,moveProject:`移动项目`,moving:`移动中…`,export:`导出`,exportDescription:`将工单及其工作流、字段、标签、关联、评论、证据和链接导出为带版本的 JSON。附件和动态历史保留在此处。`,exporting:`导出中…`,exportJson:`导出 JSON`,delete:`删除`,deleteTitle:`删除 {{name}}`,deleted:`{{name}} 已删除`,typeToConfirm:`输入 {{value}} 以确认`,deleting:`删除中…`,deleteProject:`删除项目`,deleteProjectDescription:`永久移除工单、评论和文件。动态历史会保留,且 {{key}} 不会再被使用。`,signInAgain:`重新登录`,deleteWorkspace:`删除工作区`,deleteWorkspaceDescription:`永久删除工作区中的所有项目及其工单、评论和文件,并移除其成员。账户和动态历史会保留。`,noSignInMethods:`没有已关联的登录方式`,sessions_other:`{{count, number}} 个会话已退出登录`,credentials_other:`{{count, number}} 个 API 密钥或应用连接已撤销`,devices_other:`{{count, number}} 个设备或通知渠道已移除`,workspaceCount_other:`{{count, number}} 个工作区`,directProjectCount_other:`{{count, number}} 个直接项目`,accessWorkspaces:`已移除 {{workspaces}}`,accessBoth:`已移除 {{workspaces}}和 {{projects}}`,claims_other:`{{count, number}} 个认领已释放`,imports_other:`{{count, number}} 个导入已取消`,profileErased:`名称、邮箱和照片已清除`,commentCount_other:`{{count, number}} 条评论`,activityCount_other:`{{count, number}} 条动态记录`,keptAccount:`{{tickets}}、{{comments}}和 {{events}}将显示为“{{name}}”`,deleteAccount:`删除账户`,deleteOwnAccount:`永久移除你的登录方式、会话、密钥、设备、成员资格和个人信息。工单、评论和动态会保留,并显示为“{{name}}”。`,deleteOtherAccount:`永久移除此账户的登录方式、会话、密钥、设备、成员资格和个人信息。工单、评论和动态会保留,并显示为“{{name}}”。`},icon:{change:`更换图标`,title:`项目图标`,library:`图标库`,upload:`上传图片`,search:`搜索图标`,searchPlaceholder:`搜索图标…`,color:`图标颜色`,choose:`选择 {{name}}`,noMatches:`没有匹配的图标`,showMore:`显示更多图标`,uploading:`上传中…`,chooseImage:`选择图片`,formats:`PNG、JPEG 或 WebP · 最大 10 MB`,file:`项目图标文件`,reset:`重置图标`},createProject:{title:`新建项目`,inWorkspace:`位于 {{name}}`,everyoneLabel:`此工作区中的所有人`,name:`项目名称`,namePlaceholder:`移动应用`,create:`创建项目`},workspace:{title:`工作区设置`,owner:`所有者`,noOwner:`没有所有者。实例管理员可以指定一位。`,transfer:`转让所有权`,transferring:`转让中…`,transferred:`{{name}} 现在拥有 {{workspace}}`,newOwner:`新所有者`,noEligible:`所有权只能转让给活跃的工作区管理员。请先将另一位成员设为管理员。`,chosenCan:`之后 {{name}} 可以转让或删除此工作区。`,newOwnerCan:`新所有者可以转让或删除此工作区。`,ownerStays:`{{name}} 仍为管理员。`,unavailable:`工作区不可用`,backToProjects:`返回项目`,name:`工作区名称`,edit:`编辑工作区`,copyKey:`复制工作区标识`,saved:`工作区已保存`,projects:`项目`,projectCount_other:`你在此工作区中可以访问 {{count, number}} 个项目。`,viewProjects:`查看项目`,members:`成员`,membersDescription:`工作区角色适用于使用工作区访问权限的项目。`,manageMembers:`管理成员`},members:{title:`成员`,customRole:`自定义角色`,search:`搜索成员`,searchPlaceholder:`名称或邮箱…`,add:`添加成员`,added:`成员已添加`,workspaceAccess:`工作区访问权限`,owner:`所有者`,roleFor:`{{name}} 的角色`,useWorkspaceAccess:`使用工作区访问权限`,remove:`移除成员`,removeFromWorkspace:`要将 {{name}} 从此工作区及其所有项目中移除吗?`,restoreAccess:`要为 {{name}} 恢复{{role}}工作区访问权限吗?`,removeFromProject:`要移除 {{name}} 的项目访问权限吗?`,noMatches:`没有匹配的成员`,empty:`暂无成员`,projectRole:`项目角色`,workspaceRole:`工作区角色`},invitations:{title:`邀请`,invite:`通过邮箱邀请`,removedProjects:`已移除的项目`,wholeWorkspace:`整个工作区`,selectedProjects:`所选项目`,expired:`已过期`,expires:`<time/>过期`,resend:`重新向 {{email}} 发送邀请`,revoke:`撤销邀请`,revokeDescription:`发送到 {{email}} 的链接将失效。`,revoked:`邀请已撤销`,empty:`没有待处理的邀请`,email:`邮箱`,role:`角色`,access:`访问权限`,projects:`项目`,noProjects:`此工作区没有项目。`,linkExpires:`链接有效期`,inDays_other:`{{count, number}} 天`,submit:`邀请`,link:`邀请链接`,copyLink:`复制邀请链接`,emailed:`已发送邮件至 {{email}}。该链接仅可用于该地址,且只能使用一次。`,notEmailed:`此实例未配置邮件。请将此链接发送给 {{email}};它仅可用于该地址,且只能使用一次。`,notEmailedUnknown:`此实例未配置邮件。请将此链接发送给收件人;它仅可用于该地址,且只能使用一次。`},workspaces:{title:`工作区`,search:`搜索工作区`,searchPlaceholder:`名称或 URL 标识…`,noMatches:`没有匹配的工作区`,empty:`暂无工作区`,workspace:`工作区`,administrators:`管理员`,members:`成员`,projects:`项目`,created:`创建时间`,actions:`操作`,noAdministrator:`没有管理员`,manage:`管理 {{name}}`,pagerNoun:`工作区`,private:`私有`,noProjects:`没有项目`},roles:{title:`角色`,new:`新建角色`,edit:`编辑角色`,builtIn:`内置`,readOnly:`仅可读取`,memberships_other:`{{count, number}} 个成员资格`,editNamed:`编辑角色 {{name}}`,deleteNamed:`删除角色 {{name}}`,deleteUnused:`要删除未使用的角色 {{name}} 吗?`,deleted:`角色已删除`,empty:`暂无角色`,saved:`角色已保存`,name:`角色名称`,actions:`操作`,everyoneReads:`所有成员都可以读取其可访问的项目。`,changesApply_other:`更改将立即应用到持有此角色的 {{count, number}} 个成员资格。`,save:`保存角色`,delete:`删除角色`,reassignDescription_other:`有 {{count, number}} 个成员资格持有 {{name}}。请选择要将其改为的角色。`,moveTo:`将成员改为`},theme:{mode:{light:`浅色`,dark:`深色`,system:`跟随系统`},aligned:`已对齐`,hexColor:`请使用六位十六进制颜色值`,contrast:{light:`请将浅色主题的文本对比度提高到至少 4.5:1。`,dark:`请将深色主题的文本对比度提高到至少 4.5:1。`},fileTooLarge:`主题文件必须小于 100 KB。`,tooMany:`最多保留 50 个自定义主题。`},appearance:{colorScheme:`配色方案`,theme:`主题`,themes:`主题`,colorTheme:`颜色主题`,search:`搜索主题`,searchPlaceholder:`搜索主题…`,create:`创建主题`,add:`添加主题`,importFile:`导入主题文件`,useMode:{light:`在浅色模式下使用 {{name}}`,dark:`在深色模式下使用 {{name}}`},modeOnly:{light:`仅用于浅色模式`,dark:`仅用于深色模式`},copyName:`{{name}} 副本`,duplicate:`复制 {{name}}`,edit:`编辑 {{name}}`,export:`导出 {{name}}`,delete:`删除 {{name}}`,deleteDescription:`要从此浏览器中移除 {{name}} 吗?使用它的浅色或深色外观将回退到你的基础主题。`,noMatches:`没有匹配的主题`,customTheme:`自定义主题`,name:`主题名称`,paletteColor:`{{mode}}{{color}}`,color:{background:`背景`,foreground:`文本`,sidebar:`侧边栏`,primary:`强调色`,primaryForeground:`强调色文本`},save:`保存主题`},color:{swatch:`{{color}}{{label}}`,removeCustom:`从自定义颜色中移除 {{hex}}`,custom:`自定义颜色`,default:`默认`,red:`红色`,orange:`橙色`,amber:`琥珀色`,yellow:`黄色`,lime:`青柠色`,green:`绿色`,emerald:`翠绿色`,teal:`蓝绿色`,cyan:`青色`,sky:`天蓝色`,blue:`蓝色`,indigo:`靛蓝色`,violet:`紫罗兰色`,purple:`紫色`,fuchsia:`紫红色`,pink:`粉色`,rose:`玫瑰色`,gray:`灰色`}},admin:{instance:{title:`管理`,heading:`实例`,edit:`编辑实例`,name:`名称`,description:`描述`,noDescription:`暂无描述`,version:`应用版本`,publicUrl:`公开 URL`,provider:{local:`本地 PostgreSQL 存储`,s3:`S3 兼容对象存储`,postgres:`内置 PostgreSQL`,elasticsearch:`Elasticsearch 兼容搜索`},section:{storage:`文件存储`,search:`工单搜索`,events:`事件投递`},viewConfiguration:`查看配置`,configure:{storage:`配置存储`,search:`配置搜索`,events:`配置事件投递`},providerTitle:`提供方`,deploymentManaged:`由部署管理`,instanceManaged:`由实例管理`,transfers:`传输`,indexStatus:`索引状态`,connection:`连接`,transfersS3:`文件在本地保存后会转移到对象存储。`,transfersLocal:`新文件存储在 PostgreSQL 中。`,searchBuiltIn:`搜索直接在 PostgreSQL 中运行。`,searchIndexed:`工单更改会在后台建立索引。`,eventsConnection:`通知用于唤醒消费者;PostgreSQL 保存重放历史。`,builtIn:`内置`,connected:`已连接`,upToDate:`已是最新`,status:{ready:`就绪`,transferring:`传输中`,indexing:`索引中`,connecting:`连接中`,unavailable:`不可用`},pendingTransfers:`待传输`,pendingRemain:`传输完成前,这些文件仍可从 PostgreSQL 读取。`,noPending:`没有等待传输的文件。`,bucket:`存储桶`,storageEndpoint:`存储端点`,backup:`备份`,backupBuckets:`请备份 PostgreSQL 以及所有被引用的对象存储桶。`,backupDatabase:`文件内容包含在 PostgreSQL 备份中。`,fallback:`回退`,fallbackDescription:`外部索引落后或离线时,可使用 PostgreSQL 搜索。`,searchEndpoint:`搜索端点`,index:`索引`,delivery:`投递`,deliveryDescription:`持久事件和重放保存在 PostgreSQL 中。可选的消息代理负责分发唤醒信号。`,brokerEndpoint:`消息代理端点`,exchange:`交换机`},configure:{storageTitle:`配置文件存储`,searchTitle:`配置工单搜索`,eventsTitle:`配置事件投递`,saved:`实例设置已保存`,instanceName:`实例名称`,instanceDescription:`实例描述`,publicUrlSource:`公开 URL 由部署中的 KANVIL_URL 设置。`,storageIntro:`附件和头像使用此提供方。现有文件保留在原存储位置。`,storageProvider:`存储提供方`,localDescription:`文件内容存储在本地数据库中,并包含在 PostgreSQL 备份内。`,s3Endpoint:`S3 端点`,s3EndpointHint:`使用 Amazon S3 时请将端点留空。`,region:`区域`,prefix:`对象键前缀`,accessKeyId:`访问密钥 ID`,secretAccessKey:`秘密访问密钥`,savedSecret:`已保存。留空则保持不变。`,deploymentCredentials:`省略时使用部署凭据`,pathStyle:`使用路径样式的存储桶 URL`,storageVerified:`存储连接已验证`,testStorage:`测试存储连接`,filesWaiting_other:`{{count, number}} 个文件等待传输。待传输文件仍可从 PostgreSQL 读取。`,transfersComplete:`所有文件传输已完成。`,storageDeployment:`存储由 KANVIL_STORAGE_PROVIDER 和 S3_* 部署变量配置。`,locations:`现有存储位置`,locationFiles_other:`{{count, number}} 个文件`,cleanUp:`清理未使用的文件`,cleanUpConfirm:`要移除未被引用的文件和超过一天的失败上传吗?附加到工单或个人资料的文件会保留。`,cleanUpNote:`清理也会自动运行。S3 对象需要在备份数据库的同时备份存储桶。`,searchProvider:`搜索提供方`,searchBuiltIn:`内置 PostgreSQL 搜索`,indexName:`Kanvil 索引名称`,searchAuthentication:`搜索身份验证`,noAuthentication:`无身份验证`,apiKey:`API 密钥`,basic:`用户名和密码`,searchApiKey:`搜索 API 密钥`,optional:`可选`,searchUsername:`搜索用户名`,searchPassword:`搜索密码`,searchVerified:`搜索连接已验证`,testSearch:`测试搜索连接`,rebuildQueued:`搜索重建已加入队列`,rebuild:`重建索引`,searchNote:`权限和筛选始终以 PostgreSQL 为准。外部索引同步中或不可用时,搜索会回退到 PostgreSQL。`,brokerProvider:`事件投递提供方`,brokerBuiltIn:`内置 PostgreSQL 通知`,rabbitUrl:`RabbitMQ 连接 URL`,savedBrokerEndpoint:`已保存的消息代理端点`,rabbitExchange:`RabbitMQ 交换机`,brokerVerified:`RabbitMQ 投递已验证`,testBroker:`测试消息代理连接`,brokerNote:`RabbitMQ 将已提交事件的唤醒信号分发给各 Kanvil 实例,并唤醒后台任务。PostgreSQL 保存持久事件和待处理任务,并在消息代理不可用时投递唤醒信号。`,brokerDeployment:`事件投递由 KANVIL_BROKER_PROVIDER 和 RABBITMQ_* 部署变量配置。`,save:`保存实例设置`},authentication:{title:`身份验证`,saved:`身份验证设置已保存`,emailPassword:`邮箱和密码登录`,emailPasswordDescription:`包括邮件登录验证码和密码重置。`,ssoProvision:`通过 SSO 自动创建用户`,ssoProvisionDescription:`新的 SSO 用户在受邀前没有任何工作区或项目访问权限。`,registration:`公开邮箱注册`,registrationClosed:`已关闭`,identityProvider:`身份提供方`,notConfigured:`未配置`,linkedProviders:`关联账户提供方`,linkedProvidersDescription:`仅允许已关联它们的账户登录;从不创建账户。`,save:`保存身份验证设置`,discoveryUrl:`OIDC 发现 URL`,clientId:`OIDC 客户端 ID`,oidcSetup:`在部署中配置 OIDC_DISCOVERY_URL、OIDC_CLIENT_ID、OIDC_CLIENT_SECRET 和 OIDC_NAME,或 GITHUB_、GOOGLE_ 或 DISCORD_ 的 CLIENT_ID 与 CLIENT_SECRET 组合,然后重启 Kanvil。提供方密钥永远不会返回给浏览器。`,consumers:`消费者接口`,mcpEndpoint:`MCP 端点`,eventFeed:`实时事件流`,openApi:`OpenAPI 规范`},users:{title:`用户`,search:`搜索用户`,searchPlaceholder:`名称或邮箱…`,new:`新建用户`,roleFilter:`实例角色筛选`,allRoles:`所有角色`,administrators:`管理员`,users:`用户`,statusFilter:`账户状态筛选`,allAccounts:`所有账户`,active:`活跃`,disabled:`已停用`,noMatches:`没有匹配的用户`,empty:`暂无用户`,user:`用户`,role:`角色`,status:`状态`,joined:`加入时间`,actions:`操作`,administrator:`管理员`,manage:`管理 {{name}}`,pagerNoun:`用户`,create:`创建账户`,creating:`创建中…`,created:`已创建 {{email}}`,name:`名称`,email:`邮箱`,initialPassword:`初始密码`,instanceRole:`实例角色`},account:{details:`账户详情`,joined:`加入于 {{date}}`,edit:`编辑账户`,instanceRole:`实例角色`,adminDescription:`可以管理所有工作区、账户和部署设置。`,userDescription:`访问权限由工作区和项目角色决定。`,changeRole:`更改角色`,changeRoleTitle:`更改实例角色`,signInMethods:`登录方式`,setPassword:`设置本地密码`,activeSessions:`活跃会话`,sessions_other:`{{count, number}} 个会话`,revokeSessions:`撤销会话`,revokeConfirm:`要让 {{name}} 在所有设备上退出登录吗?API 密钥仍然有效。`,sessionsRevoked:`会话已撤销`,access:`账户访问`,accessDisabled:`登录和 API 访问已停用。`,accessPreserved:`停用账户会保留工单和动态历史。`,enable:`启用账户`,disable:`停用账户`,enableConfirm:`要恢复 {{name}} 的登录吗?`,disableConfirm:`要停用 {{name}} 的登录和 API 访问,并撤销其会话吗?`,enabled:`账户已启用`,disabledToast:`账户已停用`,updateFailed:`无法更新账户`,workspaces:`工作区`,addToWorkspace:`添加到工作区`,noWorkspaces:`没有工作区成员资格`,projectAccess:`直接项目访问权限`,updated:`账户已更新`,roleUpdated:`实例角色已更新`,workspaceAdded:`已添加工作区访问权限`,passwordMismatch:`两次输入的新密码不一致。`,passwordSet:`已设置本地密码并撤销会话`,name:`名称`,email:`邮箱`,user:`用户`,administrator:`管理员`,adminsNote:`管理员可以管理所有工作区、用户和实例设置。`,workspace:`工作区`,workspaceRole:`工作区角色`,newPassword:`新密码`,confirmPassword:`确认新密码`,passwordNote:`这会设置本地密码,并让该用户在所有设备上退出登录。`,save:`保存更改`},delivery:{field:{address:`邮箱地址`,server:`服务器`,topic:`主题`,accessToken:`访问令牌`,applicationToken:`应用令牌`,endpointUrl:`端点 URL`,signingSecret:`签名密钥`,incomingWebhookUrl:`传入 Webhook URL`,webhookUrl:`Webhook URL`,channel:`频道`,botToken:`机器人令牌`,chatId:`聊天 ID`,chatIdPlaceholder:`-1001234567890 或 @channel`,topicId:`话题 ID`,optional:`{{label}}(可选)`,removeSaved:`移除已保存的{{label}}`,savedSecret:`已保存 · 留空则保持不变`},failure:{blockedAddress:`不允许使用此地址`,redirectBlocked:`端点进行了重定向`,dnsError:`找不到主机`,networkError:`无法连接`,timeout:`超时`,invalidEndpoint:`无效的端点`,emailUnavailable:`此服务器未配置邮件`,smtpError:`邮件服务器不可用`,accessRevoked:`连接它的管理员已失去访问权限;请重新连接`,repositoryMismatch:`收到了来自其他仓库的投递`,http:`被拒绝,HTTP {{status}}`,smtp:`邮件服务器返回 {{code}}`},health:{delivery:{done:`<time/>已投递`,pending:`发送中…`,none:`尚未发送`,failed:`{{reason}}`},access:{done:`<time/>已检查访问权限`,pending:`正在检查访问权限…`,none:`尚未检查访问权限`,failed:`访问检查:{{reason}}`},retrying:`重试中`},paused:`已暂停`,failing:`失败中`,sendTest:`向 {{name}} 发送测试`,testQueued:`测试已加入队列`,resume:`恢复 {{name}}`,pause:`暂停 {{name}}`,edit:`编辑 {{name}}`,disconnect:`断开 {{name}}`,disconnected:`{{name}} 已断开连接`,name:`名称`,type:`类型`,channels:`渠道`,addChannel:`添加渠道`,noChannels:`暂无渠道`,editChannel:`编辑渠道`,channelSaved:`渠道已保存`,channelRemoval:`要断开 {{name}} 吗?其设置和排队中的通知将被丢弃。`,sendFrom:`发送通知的来源`,routeOff:`无`,routeAll:`所有项目`,routeSelected:`所选项目`,saveChannel:`保存渠道`,adminsOnly:`由项目管理员管理集成`,destinations:`目标`,addDestination:`添加目标`,noDestinations:`暂无目标`,editDestination:`编辑目标`,destinationSaved:`目标已保存`,destinationRemoval:`要断开 {{name}} 吗?其设置和排队中的消息将被丢弃。`,send:`发送`,saveDestination:`保存目标`},repository:{setup:{github:`令牌需要仓库读取权限;如需评论或同步议题,还需要议题和拉取请求的写入权限。添加一个 GitHub Webhook:URL 从此仓库所在行复制,内容类型为 application/json,使用此密钥,并勾选 Branch or tag creation、Branch or tag deletion、Issues、Issue comments 和 Pull requests 事件。`,gitea:`令牌需要 read:repository 范围;如需评论或同步议题,还需要 write:issue。添加一个 Gitea Webhook:URL 从此仓库所在行复制,内容类型为 application/json,使用此密钥,并勾选 Create、Delete、Issues、Issue Label、Issue Comment 和 Pull Request 事件。`,gitlab:`令牌需要 read_api 范围;如需评论或同步议题,还需要 api。添加一个 GitLab Webhook:URL 从此仓库所在行复制,使用此密钥令牌,并勾选 Push、Issues、Comments 和 Merge request 事件。`},noWebhook:`尚未收到 Webhook`,webhookReceived:`<time/>收到 Webhook`,saved:`仓库已保存`,title:`仓库`,connect:`连接仓库`,empty:`暂无仓库`,checkAccess:`检查对 {{repository}} 的访问权限`,accessQueued:`访问检查已加入队列`,copyWebhook:`复制 {{repository}} 的 Webhook URL`,issueSync:`{{repository}} 的议题同步`,removal:`要断开 {{repository}} 吗?其 Webhook 将立即失效。它添加的链接会保留在工单上。`,edit:`编辑仓库`,host:`托管平台`,serverUrl:`服务器 URL`,serverUrlOptional:`服务器 URL(可选)`,repository:`{{host}} 仓库`,nestedPlaceholder:`group/project`,placeholder:`owner/repository`,accessToken:`访问令牌`,webhookSecret:`Webhook 密钥`,savedSecret:`已保存 · 留空则保持不变`,commentOnLink:{pull_request:`在新关联的议题和拉取请求上发表评论`,merge_request:`在新关联的议题和合并请求上发表评论`},moveTickets:`移动关联的工单`,noMove:`不移动`,save:`保存仓库`},issueSync:{reason:{labels:`其同步标签已更改`,conflict:`两边都有更改`,changedWhilePaused:`仓库暂停期间议题发生了更改`,unverified:`托管平台的响应未确认此更改`,claimConflict:`工单已被认领`,invalidContent:`议题超出了工单允许的长度`},issuesSyncing_other:`{{count, number}} 个议题同步中`,linksStopped_other:`{{count, number}} 个链接已停止`,match:`匹配`,matchAny:`包含任一标签`,matchAll:`包含所有标签`,preview:{matching:`继续同步`,export:`待创建的新议题`,pause:`待暂停的链接`,review:`待审核的链接`},applied:`议题同步已应用`,title:`议题同步 · {{repository}}`,outbound:`Kanvil 到 {{host}}`,exportTickets:`将工单导出为议题`,exportDescription:`未完成的工单会生成新议题;标题、描述、状态和新评论保持同步。`,ticketLabels:`仅包含带这些标签的工单`,everyTicket:`所有未完成的工单`,inbound:`{{host}} 到 Kanvil`,importIssues:`将议题导入为工单`,importDescription:`未关闭的议题会在 {{host}} 下次报告时导入。`,issueLabels:`仅包含带这些标签的议题`,everyIssue:`所有未关闭的议题`,previewLabel:`预览`,previewAction:`预览`,stopped:`已停止的链接 · {{repository}}`,review:`审核`,linkRemoved:`链接已移除`,resumed:`同步已恢复`,open:`打开`,closed:`已关闭`,reviewTitle:`审核 {{key}}`,mayExist:`{{host}} 上可能已存在此议题;再次创建前请先确认。`,comparison:`对比`,field:{title:`标题`,description:`描述`,state:`状态`},notReported:`未报告`,unlink:`取消关联`,keepHost:`保留 {{host}} 的版本`,keepKanvil:`保留 Kanvil 的版本`,createAgain:`重新创建议题`,unlinkTicket:`取消关联 {{key}}`,unlinkConfirm:`要停止同步 {{key}} 吗?工单和议题都会保留。`},import:{count:{tickets:`工单`,workflow:`工作流状态`,fields:`自定义字段`,labels:`标签`,relations:`关联`,comments:`评论`,evidence:`证据`,links:`链接`},notExport:`此文件不是 Kanvil 工单导出文件。`,progress_other:`{{status}} · {{done, number}} / {{count, number}} 条记录`,progressFailed_other:`{{status}} · {{done, number}} / {{count, number}} 条记录 · {{failed, number}} 条失败`,title:`导入`,description:`从 Kanvil 工单导出文件或其他跟踪工具(Linear、Jira、Trello、Plane、PLANKA 或 Kaneo)创建项目。`,action:`导入项目`,detailsOf:`{{name}} 的详情`,details:`详情`,exportFile:`Kanvil 导出文件`,source:`来源`,file:`导出文件`,jiraEdition:`Jira 版本`,siteUrl:`站点 URL`,accountEmail:`账户邮箱`,apiKey:`API 密钥`,apiToken:`API 令牌`,personalToken:`个人访问令牌`,token:`令牌`,apiUrl:`API URL`,workspaceSlug:`工作区 URL 标识`,signInWith:`登录方式`,username:`用户名或邮箱`,password:`密码`,checkConnection:`请检查连接信息`,noProjects:`这些凭据无法读取任何{{label}}。`,includeComments:`包含评论`,projectName:`项目名称`,start:`导入`,connect:`连接`,preview:`预览`,starting:`启动中…`,connecting:`连接中…`,checking:`检查中…`,matched:`已匹配的人员`,unmatched:`未匹配的人员`,previewLabel:`导入预览`,errorPrefix:`错误:`,notePrefix:`注意:`,progressLabel:`导入进度`,notImported:`未导入的记录`,stop:`停止导入`,openProject:`打开项目`}},native:{labelValue:`{{label}}:{{value}}`,ui:{dismiss:`关闭`,loading:`加载中`},server:{url:`服务器 URL`,connect:`连接`,change:`更换服务器`,invalidOrigin:`请使用 Kanvil 服务器的 HTTP 或 HTTPS 源地址,不要包含路径或凭据。`,httpsRequired:`请使用 HTTPS 连接到 Kanvil 服务器。`},login:{setupTitle:`创建所有者账户`,signIn:`登录`,signingIn:`正在登录…`,createAccount:`创建账户`,signInWith:`使用 {{provider}} 登录`,name:`名称`,setupToken:`设置令牌`,email:`邮箱`,password:`密码`},connection:{connecting:`连接中`,connected:`● 实时`,offline:`离线 · 缓存数据`,closed:`已关闭`,signedOut:`登录以重新连接`},screen:{projects:`项目`,inbox:`收件箱`,settings:`设置`,tickets:`工单`,ticket:`工单`,newTicket:`新建工单`,editTicket:`编辑工单`},projects:{empty:`暂无项目`,new:`新建项目`,name:`项目名称`,prefix:`工单前缀`,description:`描述`,create:`创建项目`},tickets:{search:`搜索工单`,searchPlaceholder:`标题、描述或编号`,allStatuses:`所有状态`,empty:`没有匹配的工单`,count:`{{shown}} / {{total}}`},ticket:{priority:`{{priority}}优先级`,noDifficulty:`未指定难度`,version:`v{{version}}`,starts:`{{date}} 开始`,due:`{{date}} 截止`},editor:{stale:`此工单已被更改。你保存的草稿仍基于版本 {{version}}。`,discardDraft:`放弃草稿并重新加载`,title:`标题`,noDifficulty:`未指定`,labels:`标签(以逗号分隔)`,scopes:`范围(以逗号分隔)`,editMarkdown:`编辑 Markdown`,previewMarkdown:`预览 Markdown`,description:`描述(Markdown)`,acceptanceCriteria:`验收标准(Markdown)`,parent:`父工单 ID`,automationReady:`在需求和依赖允许时可供智能体处理`,holdReason:`搁置原因`,draftSaved:`草稿已保存在此设备上`,save:`保存工单`},detail:{archived:`已归档`,subscribe:`订阅`,unsubscribe:`取消订阅`,share:`分享`,description:`描述`,noDescription:`_暂无描述_`,acceptanceCriteria:`验收标准`,noAcceptanceCriteria:`_暂无验收标准_`,fields:`字段`,archive:{action:`归档工单`,title:`要归档工单吗?`,message:`要将此工单从活跃列表中移除,并取消智能体处理资格吗?`},unarchive:{action:`取消归档工单`,title:`要取消归档工单吗?`,message:`要将此工单恢复到活跃列表吗?`}},readiness:{title:`智能体就绪状态`,ready:`可以认领`,notReady:`尚不可认领`,hold:`搁置:{{reason}}`,claimed:`已被 {{worker}} 认领,直到 {{time}}。`,release:{action:`释放我的认领`,title:`要释放认领吗?`,message:`释放所有权前,请先停止你的执行者。`,confirm:`释放`},recover:{action:`收回已过期的认领`,explanation:`只有项目管理员可以收回已过期的认领。请先确认执行者已停止。`,reason:`收回原因`,confirm:`执行者已停止 · 收回`}},relations:{title:`关联`,parent:`父工单 · {{key}} · {{title}}`,openParent:`打开父工单`,children:`子工单`,previousChildren:`上一组子工单`,nextChildren:`下一组子工单`,remove:`移除关联`,removeTitle:`要移除关联吗?`,add:`添加关联`,find:`查找工单`,type:`关联类型`,ticket:`工单`,choose:`选择工单`},discussion:{title:`讨论`,previous:`较早的评论`,next:`较新的评论`,field:`评论(Markdown)`,submit:`评论`,you:`你`,edit:`编辑评论`,editField:`评论`,delete:`删除评论`,deleteTitle:`要删除评论吗?`,deleteMessage:`要永久移除此评论吗?`,save:`保存评论`},attachments:{title:`附件`,item:`{{name}} · {{size}} kB`,remove:`移除 {{name}}`,removeTitle:`要移除附件吗?`,working:`处理中…`,add:`添加附件`,tooLarge:`请选择不超过 10 MB 的文件。`,sharingUnavailable:`此设备无法分享文件。`},evidence:{title:`证据`,explanation:`结果由提交它们的账户报告。`,add:`添加证据`,name:`标题`,url:`URL`,outcome:`报告的结果`,commit:`提交(完整哈希)`,note:`备注`,save:`保存证据`},activity:{title:`动态`,previous:`较早的动态`,next:`较新的动态`},inbox:{markAllRead:`全部标记为已读`,empty:`没有通知`},notifications:{title:`通知`,inApp:`在收件箱中接收已订阅工单的更新`,push:`推送通知`,enableDevice:`在此设备上启用推送`,disableDevice:`在此设备上停用推送`,unconfigured:`此版本需要 Expo 项目 ID 和签名配置才能推送。`,noProjectId:`此版本需要 Expo 项目 ID 才能接收推送通知。`,permissionDenied:`请在设备设置中允许通知以启用推送。`,channel:`工单更新`},settings:{password:{title:`本地密码`,current:`当前密码`,new:`新密码`,change:`更改密码`,updated:`密码已更新;其他会话已撤销`},oidc:{linked:`账户已关联`,explanation:`使用此提供方登录前,请先关联此账户。`,link:`关联 {{provider}}`},signOut:{action:`退出登录`,title:`要退出登录吗?`,message:`此账户的缓存工单和草稿将从此设备中移除。`},changeServer:{title:`要更换服务器吗?`,message:`要退出登录并清除此账户的本地缓存和草稿吗?`}}}};export{e as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{Et as i}from"./index-DoqlyejP.js";var a={lessThanXSeconds:{one:`少於 1 秒`,other:`少於 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分鐘`,lessThanXMinutes:{one:`少於 1 分鐘`,other:`少於 {{count}} 分鐘`},xMinutes:{one:`1 分鐘`,other:`{{count}} 分鐘`},xHours:{one:`1 小時`,other:`{{count}} 小時`},aboutXHours:{one:`大約 1 小時`,other:`大約 {{count}} 小時`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大約 1 個星期`,other:`大約 {{count}} 個星期`},xWeeks:{one:`1 個星期`,other:`{{count}} 個星期`},aboutXMonths:{one:`大約 1 個月`,other:`大約 {{count}} 個月`},xMonths:{one:`1 個月`,other:`{{count}} 個月`},aboutXYears:{one:`大約 1 年`,other:`大約 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超過 1 年`,other:`超過 {{count}} 年`},almostXYears:{one:`將近 1 年`,other:`將近 {{count}} 年`}},o=(e,t,n)=>{let r,i=a[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`內`:r+`前`:r},s={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})},c={lastWeek:`'上個'eeee p`,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:`'下個'eeee p`,other:`P`},l={code:`zh-TW`,formatDistance:o,formatLong:s,formatRelative:(e,t,n,r)=>c[e],localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n+`日`;case`hour`:return n+`時`;case`minute`:return n+`分`;case`second`:return n+`秒`;default:return`第 `+n}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一刻`,`第二刻`,`第三刻`,`第四刻`],wide:[`第一刻鐘`,`第二刻鐘`,`第三刻鐘`,`第四刻鐘`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`週日`,`週一`,`週二`,`週三`,`週四`,`週五`,`週六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|時|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻鐘/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^週[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t.today&&(a=`今天,${a}`),t.selected&&(a=`${a},已選取`),a},labelMonthDropdown:`選擇月份`,labelNext:`前往下個月`,labelPrevious:`前往上個月`,labelWeekNumber:e=>`第 ${e} 週`,labelYearDropdown:`選擇年份`,labelGrid:(e,t,n)=>(n??new i(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t?.today&&(a=`今天,${a}`),a},labelNav:`導覽列`,labelWeekNumberHeader:`週數`,labelWeekday:(e,t,n)=>(n??new i(t)).format(e,`cccc`)}};export{l as zhTW};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,H as t,N as n}from"./core-jXc03Sty.js";var r=()=>{let r={string:{unit:`字元`,verb:`擁有`},file:{unit:`位元組`,verb:`擁有`},array:{unit:`項目`,verb:`擁有`},set:{unit:`項目`,verb:`擁有`},map:{unit:`項目`,verb:`擁有`}};function i(e){return r[e]??null}let a={regex:`輸入`,email:`郵件地址`,url:`URL`,emoji:`emoji`,uuid:`UUID`,uuidv4:`UUIDv4`,uuidv6:`UUIDv6`,nanoid:`nanoid`,guid:`GUID`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ULID`,xid:`XID`,ksuid:`KSUID`,datetime:`ISO 日期時間`,date:`ISO 日期`,time:`ISO 時間`,duration:`ISO 期間`,ipv4:`IPv4 位址`,ipv6:`IPv6 位址`,mac:`MAC 位址`,cidrv4:`IPv4 範圍`,cidrv6:`IPv6 範圍`,base64:`base64 編碼字串`,base64url:`base64url 編碼字串`,json_string:`JSON 字串`,e164:`E.164 數值`,credit_card:`信用卡號`,currency_code:`貨幣代碼`,iban:`IBAN`,jwt:`JWT`,template_literal:`輸入`},o={nan:`NaN`};return r=>{switch(r.code){case`invalid_type`:{let e=o[r.expected]??r.expected,n=t(r.input),i=o[n]??n;return/^[A-Z]/.test(r.expected)?`無效的輸入值:預期為 instanceof ${r.expected},但收到 ${i}`:`無效的輸入值:預期為 ${e},但收到 ${i}`}case`invalid_value`:return r.values.length===1?`無效的輸入值:預期為 ${e(r.values[0])}`:`無效的選項:預期為以下其中之一 ${n(r.values,`|`)}`;case`too_big`:{let e=r.inclusive?`<=`:`<`,t=i(r.origin);return t?`數值過大:預期 ${r.origin??`值`} 應為 ${e}${r.maximum.toString()} ${t.unit??`個元素`}`:`數值過大:預期 ${r.origin??`值`} 應為 ${e}${r.maximum.toString()}`}case`too_small`:{let e=r.inclusive?`>=`:`>`,t=i(r.origin);return t?`數值過小:預期 ${r.origin} 應為 ${e}${r.minimum.toString()} ${t.unit}`:`數值過小:預期 ${r.origin} 應為 ${e}${r.minimum.toString()}`}case`invalid_format`:{let e=r;return e.format===`starts_with`?`無效的字串:必須以 "${e.prefix}" 開頭`:e.format===`ends_with`?`無效的字串:必須以 "${e.suffix}" 結尾`:e.format===`includes`?`無效的字串:必須包含 "${e.includes}"`:e.format===`regex`?`無效的字串:必須符合格式 ${e.pattern}`:`無效的 ${a[e.format]??r.format}`}case`not_multiple_of`:return`無效的數字:必須為 ${r.divisor} 的倍數`;case`unrecognized_keys`:return`無法識別的鍵值${r.keys.length>1?`們`:``}:${n(r.keys,`、`)}`;case`invalid_key`:return`${r.origin} 中有無效的鍵值`;case`invalid_union`:return`無效的輸入值`;case`invalid_element`:return`${r.origin} 中有無效的值`;default:return`無效的輸入值`}}};function i(){return{localeError:r()}}export{i as default};
|